From 4c5db5b95a5aed67a5bf33f04f6a0ec94926750b Mon Sep 17 00:00:00 2001 From: Sergio Oliveira Date: Tue, 30 Sep 2014 14:38:12 -0300 Subject: [PATCH] Renamed src directory to colab --- colab/__init__.py | 0 colab/accounts/__init__.py | 0 colab/accounts/admin.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/accounts/auth.py | 6 ++++++ colab/accounts/errors.py | 2 ++ colab/accounts/forms.py | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/accounts/management/__init__.py | 0 colab/accounts/management/commands/__init__.py | 0 colab/accounts/management/commands/delete_invalid.py | 42 ++++++++++++++++++++++++++++++++++++++++++ colab/accounts/migrations/0001_initial.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ colab/accounts/migrations/__init__.py | 0 colab/accounts/models.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/accounts/search_indexes.py | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/accounts/templates/accounts/change_password.html | 21 +++++++++++++++++++++ colab/accounts/templates/accounts/manage_subscriptions.html | 45 +++++++++++++++++++++++++++++++++++++++++++++ colab/accounts/templates/accounts/user_create_form.html | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/accounts/templates/accounts/user_detail.html | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/accounts/templates/accounts/user_update_form.html | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/accounts/templates/search/indexes/accounts/user_text.txt | 7 +++++++ colab/accounts/templatetags/__init__.py | 0 colab/accounts/templatetags/gravatar.py | 20 ++++++++++++++++++++ colab/accounts/tests.py | 16 ++++++++++++++++ colab/accounts/urls.py | 25 +++++++++++++++++++++++++ colab/accounts/utils/__init__.py | 0 colab/accounts/utils/mailman.py | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/accounts/utils/validators.py | 26 ++++++++++++++++++++++++++ colab/accounts/views.py | 251 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/api/__init__.py | 0 colab/api/resources.py | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/api/urls.py | 22 ++++++++++++++++++++++ colab/api/views.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ colab/badger/__init__.py | 0 colab/badger/admin.py | 21 +++++++++++++++++++++ colab/badger/forms.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ colab/badger/management/__init__.py | 0 colab/badger/management/commands/__init__.py | 0 colab/badger/management/commands/rebuild_badges.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ colab/badger/management/commands/update_badges.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ colab/badger/migrations/0001_initial.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/badger/migrations/__init__.py | 0 colab/badger/models.py | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/badger/tests.py | 3 +++ colab/badger/utils.py | 41 +++++++++++++++++++++++++++++++++++++++++ colab/badger/views.py | 3 +++ colab/colab/__init__.py | 0 colab/colab/colab.template.yaml | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/colab/settings.py | 315 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/colab/urls.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ colab/colab/utils/__init__.py | 0 colab/colab/utils/conf.py | 32 ++++++++++++++++++++++++++++++++ colab/colab/utils/highlighting.py | 38 ++++++++++++++++++++++++++++++++++++++ colab/colab/wsgi.py | 14 ++++++++++++++ colab/home/__init__.py | 0 colab/home/admin.py | 3 +++ colab/home/context_processors.py | 4 ++++ colab/home/models.py | 3 +++ colab/home/tests.py | 3 +++ colab/home/views.py | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/locale/pt_BR/LC_MESSAGES/django.mo | Bin 0 -> 16189 bytes colab/locale/pt_BR/LC_MESSAGES/django.po | 1540 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/manage.py | 10 ++++++++++ colab/planet/__init__.py | 0 colab/planet/admin.py | 3 +++ colab/planet/locale/es/LC_MESSAGES/django.po | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/planet/locale/pt_BR/LC_MESSAGES/django.mo | Bin 0 -> 1070 bytes colab/planet/locale/pt_BR/LC_MESSAGES/django.po | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/planet/models.py | 3 +++ colab/planet/templates/common/pagination.html | 34 ++++++++++++++++++++++++++++++++++ colab/planet/templates/feedzilla/_post_template.html | 23 +++++++++++++++++++++++ colab/planet/templates/feedzilla/base.html | 32 ++++++++++++++++++++++++++++++++ colab/planet/templates/feedzilla/index.html | 20 ++++++++++++++++++++ colab/planet/templates/feedzilla/submit_blog.html | 37 +++++++++++++++++++++++++++++++++++++ colab/planet/templates/feedzilla/tag.html | 19 +++++++++++++++++++ colab/planet/tests.py | 3 +++ colab/planet/views.py | 3 +++ colab/proxy/__init__.py | 0 colab/proxy/context_processors.py | 12 ++++++++++++ colab/proxy/gitlab/__init__.py | 3 +++ colab/proxy/gitlab/admin.py | 3 +++ colab/proxy/gitlab/apps.py | 7 +++++++ colab/proxy/gitlab/diazo.xml | 17 +++++++++++++++++ colab/proxy/gitlab/models.py | 3 +++ colab/proxy/gitlab/templates/proxy/gitlab.html | 47 +++++++++++++++++++++++++++++++++++++++++++++++ colab/proxy/gitlab/tests.py | 3 +++ colab/proxy/gitlab/urls.py | 10 ++++++++++ colab/proxy/gitlab/views.py | 9 +++++++++ colab/proxy/jenkins/__init__.py | 3 +++ colab/proxy/jenkins/admin.py | 3 +++ colab/proxy/jenkins/apps.py | 7 +++++++ colab/proxy/jenkins/diazo.xml | 27 +++++++++++++++++++++++++++ colab/proxy/jenkins/models.py | 3 +++ colab/proxy/jenkins/tests.py | 3 +++ colab/proxy/jenkins/urls.py | 10 ++++++++++ colab/proxy/jenkins/views.py | 8 ++++++++ colab/proxy/redmine/__init__.py | 3 +++ colab/proxy/redmine/admin.py | 3 +++ colab/proxy/redmine/apps.py | 7 +++++++ colab/proxy/redmine/diazo.xml | 11 +++++++++++ colab/proxy/redmine/models.py | 3 +++ colab/proxy/redmine/tests.py | 3 +++ colab/proxy/redmine/urls.py | 10 ++++++++++ colab/proxy/redmine/views.py | 9 +++++++++ colab/proxy/trac/__init__.py | 3 +++ colab/proxy/trac/admin.py | 3 +++ colab/proxy/trac/apps.py | 7 +++++++ colab/proxy/trac/diazo.xml | 45 +++++++++++++++++++++++++++++++++++++++++++++ colab/proxy/trac/migrations/0001_initial.py | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/proxy/trac/migrations/__init__.py | 0 colab/proxy/trac/models.py | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/proxy/trac/routers.py | 23 +++++++++++++++++++++++ colab/proxy/trac/search_indexes.py | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/proxy/trac/signals.py | 33 +++++++++++++++++++++++++++++++++ colab/proxy/trac/templates/proxy/trac.html | 7 +++++++ colab/proxy/trac/templates/search/indexes/proxy/attachment_text.txt | 15 +++++++++++++++ colab/proxy/trac/templates/search/indexes/proxy/revision_text.txt | 8 ++++++++ colab/proxy/trac/templates/search/indexes/proxy/ticket_text.txt | 20 ++++++++++++++++++++ colab/proxy/trac/templates/search/indexes/proxy/wiki_text.txt | 9 +++++++++ colab/proxy/trac/tests.py | 3 +++ colab/proxy/trac/urls.py | 10 ++++++++++ colab/proxy/trac/views.py | 42 ++++++++++++++++++++++++++++++++++++++++++ colab/proxy/utils/__init__.py | 0 colab/proxy/utils/apps.py | 6 ++++++ colab/proxy/utils/views.py | 10 ++++++++++ colab/rss/__init__.py | 0 colab/rss/feeds.py | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/rss/urls.py | 9 +++++++++ colab/search/__init__.py | 0 colab/search/admin.py | 3 +++ colab/search/base_indexes.py | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/search/forms.py | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/search/models.py | 3 +++ colab/search/templates/search/includes/search_filters.html | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/search/templates/search/search-message-preview.html | 18 ++++++++++++++++++ colab/search/templates/search/search-revision-preview.html | 9 +++++++++ colab/search/templates/search/search-ticket-preview.html | 16 ++++++++++++++++ colab/search/templates/search/search-user-preview.html | 9 +++++++++ colab/search/templates/search/search-wiki-preview.html | 9 +++++++++ colab/search/templates/search/search.html | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/search/tests.py | 3 +++ colab/search/urls.py | 14 ++++++++++++++ colab/search/utils.py | 14 ++++++++++++++ colab/search/views.py | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/static/css/screen.css | 451 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/static/dpaste/css/theme.css | 212 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/static/img/COPYRIGHT | 11 +++++++++++ colab/static/img/cc_by_sa.png | Bin 0 -> 728 bytes colab/static/img/changeset.png | Bin 0 -> 158 bytes colab/static/img/fav.ico | Bin 0 -> 3262 bytes colab/static/img/logo.svg | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/static/img/opendata3.png | Bin 0 -> 296 bytes colab/static/img/plus.png | Bin 0 -> 397 bytes colab/static/img/rss.png | Bin 0 -> 405 bytes colab/static/img/thread.png | Bin 0 -> 208 bytes colab/static/img/ticket.png | Bin 0 -> 270 bytes colab/static/img/user.png | Bin 0 -> 442 bytes colab/static/img/wiki.png | Bin 0 -> 202 bytes colab/static/img/x.png | Bin 0 -> 274 bytes colab/static/third-party/bootstrap-datetimepicker/README | 7 +++++++ colab/static/third-party/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css | 9 +++++++++ colab/static/third-party/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js | 28 ++++++++++++++++++++++++++++ colab/static/third-party/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.es.js | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/static/third-party/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.pt-BR.js | 14 ++++++++++++++ colab/static/third-party/bootstrap/css/bootstrap-theme.min.css | 1 + colab/static/third-party/bootstrap/css/bootstrap.min.css | 9 +++++++++ colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.eot | Bin 0 -> 14079 bytes colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.svg | 228 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 29512 bytes colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.woff | Bin 0 -> 16448 bytes colab/static/third-party/bootstrap/js/bootstrap.min.js | 6 ++++++ colab/static/third-party/chartjs/js/Chart.min.js | 11 +++++++++++ colab/static/third-party/chroma/js/chroma.min.js | 21 +++++++++++++++++++++ colab/static/third-party/font-awesome/css/font-awesome-ie7.min.css | 384 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/static/third-party/font-awesome/css/font-awesome.min.css | 403 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/static/third-party/font-awesome/font/FontAwesome.otf | Bin 0 -> 61896 bytes colab/static/third-party/font-awesome/font/fontawesome-webfont.eot | Bin 0 -> 37405 bytes colab/static/third-party/font-awesome/font/fontawesome-webfont.svg | 399 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/static/third-party/font-awesome/font/fontawesome-webfont.ttf | Bin 0 -> 79076 bytes colab/static/third-party/font-awesome/font/fontawesome-webfont.woff | Bin 0 -> 43572 bytes colab/static/third-party/highcharts/js/highcharts.js | 285 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/static/third-party/jquery-2.0.3.min.js | 6 ++++++ colab/static/third-party/jquery.cookie.js | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/static/third-party/jquery.debouncedresize.js | 47 +++++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/__init__.py | 3 +++ colab/super_archives/admin.py | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/apps.py | 10 ++++++++++ colab/super_archives/context_processors.py | 12 ++++++++++++ colab/super_archives/fixtures/initial_data.json | 10 ++++++++++ colab/super_archives/locale/es/LC_MESSAGES/django.po | 224 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/locale/pt_BR/LC_MESSAGES/django.mo | Bin 0 -> 2754 bytes colab/super_archives/locale/pt_BR/LC_MESSAGES/django.po | 225 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/management/__init__.py | 0 colab/super_archives/management/commands/__init__.py | 0 colab/super_archives/management/commands/import_emails.py | 290 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/management/commands/message.py | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/management/commands/update_blocks.py | 12 ++++++++++++ colab/super_archives/management/commands/update_keywords.py | 12 ++++++++++++ colab/super_archives/managers.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/migrations/0001_initial.py | 187 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/migrations/__init__.py | 0 colab/super_archives/models.py | 390 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/search_indexes.py | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/signals.py | 23 +++++++++++++++++++++++ colab/super_archives/templates/message-preview.html | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/templates/message-thread.html | 193 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/templates/search/indexes/super_archives/thread_collaborators.txt | 5 +++++ colab/super_archives/templates/search/indexes/super_archives/thread_description.txt | 3 +++ colab/super_archives/templates/search/indexes/super_archives/thread_text.txt | 5 +++++ colab/super_archives/templates/superarchives/emails/email_blank_subject.txt | 11 +++++++++++ colab/super_archives/templates/superarchives/emails/email_verification.txt | 6 ++++++ colab/super_archives/templates/superarchives/includes/message.html | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/templates/superarchives/tags/display_message.html | 5 +++++ colab/super_archives/templates/superarchives/thread-dashboard.html | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/templatetags/__init__.py | 0 colab/super_archives/templatetags/superarchives.py | 35 +++++++++++++++++++++++++++++++++++ colab/super_archives/tests.py | 16 ++++++++++++++++ colab/super_archives/urls.py | 15 +++++++++++++++ colab/super_archives/utils/__init__.py | 0 colab/super_archives/utils/blocks.py | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/super_archives/utils/email.py | 19 +++++++++++++++++++ colab/super_archives/utils/etiquetador.py | 5 +++++ colab/super_archives/utils/url.py | 25 +++++++++++++++++++++++++ colab/super_archives/views.py | 269 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/templates/404.html | 8 ++++++++ colab/templates/500.html | 3 +++ colab/templates/base.html | 236 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/templates/doughnut-chart.html | 44 ++++++++++++++++++++++++++++++++++++++++++++ colab/templates/dpaste/base.html | 16 ++++++++++++++++ colab/templates/dpaste/snippet_details.html | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/templates/dpaste/snippet_diff.html | 14 ++++++++++++++ colab/templates/dpaste/snippet_form.html | 33 +++++++++++++++++++++++++++++++++ colab/templates/dpaste/snippet_new.html | 7 +++++++ colab/templates/home.html | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/templates/open-data.html | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab/templates/pizza-chart.html | 43 +++++++++++++++++++++++++++++++++++++++++++ colab/tz/__init__.py | 0 colab/tz/middleware.py | 20 ++++++++++++++++++++ colab/tz/templates/tz/set_utc_offset.html | 4 ++++ src/accounts/__init__.py | 0 src/accounts/admin.py | 56 -------------------------------------------------------- src/accounts/auth.py | 6 ------ src/accounts/errors.py | 2 -- src/accounts/forms.py | 114 ------------------------------------------------------------------------------------------------------------------ src/accounts/management/__init__.py | 0 src/accounts/management/commands/__init__.py | 0 src/accounts/management/commands/delete_invalid.py | 42 ------------------------------------------ src/accounts/migrations/0001_initial.py | 50 -------------------------------------------------- src/accounts/migrations/__init__.py | 0 src/accounts/models.py | 66 ------------------------------------------------------------------ src/accounts/search_indexes.py | 79 ------------------------------------------------------------------------------- src/accounts/templates/accounts/change_password.html | 21 --------------------- src/accounts/templates/accounts/manage_subscriptions.html | 45 --------------------------------------------- src/accounts/templates/accounts/user_create_form.html | 66 ------------------------------------------------------------------ src/accounts/templates/accounts/user_detail.html | 182 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/accounts/templates/accounts/user_update_form.html | 207 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/accounts/templates/search/indexes/accounts/user_text.txt | 7 ------- src/accounts/templatetags/__init__.py | 0 src/accounts/templatetags/gravatar.py | 20 -------------------- src/accounts/tests.py | 16 ---------------- src/accounts/urls.py | 25 ------------------------- src/accounts/utils/__init__.py | 0 src/accounts/utils/mailman.py | 97 ------------------------------------------------------------------------------------------------- src/accounts/utils/validators.py | 26 -------------------------- src/accounts/views.py | 251 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/api/__init__.py | 0 src/api/resources.py | 120 ------------------------------------------------------------------------------------------------------------------------ src/api/urls.py | 22 ---------------------- src/api/views.py | 45 --------------------------------------------- src/badger/__init__.py | 0 src/badger/admin.py | 21 --------------------- src/badger/forms.py | 48 ------------------------------------------------ src/badger/management/__init__.py | 0 src/badger/management/commands/__init__.py | 0 src/badger/management/commands/rebuild_badges.py | 44 -------------------------------------------- src/badger/management/commands/update_badges.py | 44 -------------------------------------------- src/badger/migrations/0001_initial.py | 53 ----------------------------------------------------- src/badger/migrations/__init__.py | 0 src/badger/models.py | 83 ----------------------------------------------------------------------------------- src/badger/tests.py | 3 --- src/badger/utils.py | 41 ----------------------------------------- src/badger/views.py | 3 --- src/colab/__init__.py | 0 src/colab/colab.template.yaml | 53 ----------------------------------------------------- src/colab/settings.py | 315 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/colab/urls.py | 45 --------------------------------------------- src/colab/utils/__init__.py | 0 src/colab/utils/conf.py | 32 -------------------------------- src/colab/utils/highlighting.py | 38 -------------------------------------- src/colab/wsgi.py | 14 -------------- src/home/__init__.py | 0 src/home/admin.py | 3 --- src/home/context_processors.py | 4 ---- src/home/models.py | 3 --- src/home/tests.py | 3 --- src/home/views.py | 65 ----------------------------------------------------------------- src/locale/pt_BR/LC_MESSAGES/django.mo | Bin 16189 -> 0 bytes src/locale/pt_BR/LC_MESSAGES/django.po | 1540 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/manage.py | 10 ---------- src/planet/__init__.py | 0 src/planet/admin.py | 3 --- src/planet/locale/es/LC_MESSAGES/django.po | 103 ------------------------------------------------------------------------------------------------------- src/planet/locale/pt_BR/LC_MESSAGES/django.mo | Bin 1070 -> 0 bytes src/planet/locale/pt_BR/LC_MESSAGES/django.po | 119 ----------------------------------------------------------------------------------------------------------------------- src/planet/models.py | 3 --- src/planet/templates/common/pagination.html | 34 ---------------------------------- src/planet/templates/feedzilla/_post_template.html | 23 ----------------------- src/planet/templates/feedzilla/base.html | 32 -------------------------------- src/planet/templates/feedzilla/index.html | 20 -------------------- src/planet/templates/feedzilla/submit_blog.html | 37 ------------------------------------- src/planet/templates/feedzilla/tag.html | 19 ------------------- src/planet/tests.py | 3 --- src/planet/views.py | 3 --- src/proxy/__init__.py | 0 src/proxy/context_processors.py | 12 ------------ src/proxy/gitlab/__init__.py | 3 --- src/proxy/gitlab/admin.py | 3 --- src/proxy/gitlab/apps.py | 7 ------- src/proxy/gitlab/diazo.xml | 17 ----------------- src/proxy/gitlab/models.py | 3 --- src/proxy/gitlab/templates/proxy/gitlab.html | 47 ----------------------------------------------- src/proxy/gitlab/tests.py | 3 --- src/proxy/gitlab/urls.py | 10 ---------- src/proxy/gitlab/views.py | 9 --------- src/proxy/jenkins/__init__.py | 3 --- src/proxy/jenkins/admin.py | 3 --- src/proxy/jenkins/apps.py | 7 ------- src/proxy/jenkins/diazo.xml | 27 --------------------------- src/proxy/jenkins/models.py | 3 --- src/proxy/jenkins/tests.py | 3 --- src/proxy/jenkins/urls.py | 10 ---------- src/proxy/jenkins/views.py | 8 -------- src/proxy/redmine/__init__.py | 3 --- src/proxy/redmine/admin.py | 3 --- src/proxy/redmine/apps.py | 7 ------- src/proxy/redmine/diazo.xml | 11 ----------- src/proxy/redmine/models.py | 3 --- src/proxy/redmine/tests.py | 3 --- src/proxy/redmine/urls.py | 10 ---------- src/proxy/redmine/views.py | 9 --------- src/proxy/trac/__init__.py | 3 --- src/proxy/trac/admin.py | 3 --- src/proxy/trac/apps.py | 7 ------- src/proxy/trac/diazo.xml | 45 --------------------------------------------- src/proxy/trac/migrations/0001_initial.py | 141 --------------------------------------------------------------------------------------------------------------------------------------------- src/proxy/trac/migrations/__init__.py | 0 src/proxy/trac/models.py | 149 ----------------------------------------------------------------------------------------------------------------------------------------------------- src/proxy/trac/routers.py | 23 ----------------------- src/proxy/trac/search_indexes.py | 157 ------------------------------------------------------------------------------------------------------------------------------------------------------------- src/proxy/trac/signals.py | 33 --------------------------------- src/proxy/trac/templates/proxy/trac.html | 7 ------- src/proxy/trac/templates/search/indexes/proxy/attachment_text.txt | 15 --------------- src/proxy/trac/templates/search/indexes/proxy/revision_text.txt | 8 -------- src/proxy/trac/templates/search/indexes/proxy/ticket_text.txt | 20 -------------------- src/proxy/trac/templates/search/indexes/proxy/wiki_text.txt | 9 --------- src/proxy/trac/tests.py | 3 --- src/proxy/trac/urls.py | 10 ---------- src/proxy/trac/views.py | 42 ------------------------------------------ src/proxy/utils/__init__.py | 0 src/proxy/utils/apps.py | 6 ------ src/proxy/utils/views.py | 10 ---------- src/rss/__init__.py | 0 src/rss/feeds.py | 73 ------------------------------------------------------------------------- src/rss/urls.py | 9 --------- src/search/__init__.py | 0 src/search/admin.py | 3 --- src/search/base_indexes.py | 94 ---------------------------------------------------------------------------------------------- src/search/forms.py | 169 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/search/models.py | 3 --- src/search/templates/search/includes/search_filters.html | 201 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/search/templates/search/search-message-preview.html | 18 ------------------ src/search/templates/search/search-revision-preview.html | 9 --------- src/search/templates/search/search-ticket-preview.html | 16 ---------------- src/search/templates/search/search-user-preview.html | 9 --------- src/search/templates/search/search-wiki-preview.html | 9 --------- src/search/templates/search/search.html | 159 --------------------------------------------------------------------------------------------------------------------------------------------------------------- src/search/tests.py | 3 --- src/search/urls.py | 14 -------------- src/search/utils.py | 14 -------------- src/search/views.py | 176 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/static/css/screen.css | 451 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/static/dpaste/css/theme.css | 212 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/static/img/COPYRIGHT | 11 ----------- src/static/img/cc_by_sa.png | Bin 728 -> 0 bytes src/static/img/changeset.png | Bin 158 -> 0 bytes src/static/img/fav.ico | Bin 3262 -> 0 bytes src/static/img/logo.svg | 64 ---------------------------------------------------------------- src/static/img/opendata3.png | Bin 296 -> 0 bytes src/static/img/plus.png | Bin 397 -> 0 bytes src/static/img/rss.png | Bin 405 -> 0 bytes src/static/img/thread.png | Bin 208 -> 0 bytes src/static/img/ticket.png | Bin 270 -> 0 bytes src/static/img/user.png | Bin 442 -> 0 bytes src/static/img/wiki.png | Bin 202 -> 0 bytes src/static/img/x.png | Bin 274 -> 0 bytes src/static/third-party/bootstrap-datetimepicker/README | 7 ------- src/static/third-party/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css | 9 --------- src/static/third-party/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js | 28 ---------------------------- src/static/third-party/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.es.js | 66 ------------------------------------------------------------------ src/static/third-party/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.pt-BR.js | 14 -------------- src/static/third-party/bootstrap/css/bootstrap-theme.min.css | 1 - src/static/third-party/bootstrap/css/bootstrap.min.css | 9 --------- src/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.eot | Bin 14079 -> 0 bytes src/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.svg | 228 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ src/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.ttf | Bin 29512 -> 0 bytes src/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.woff | Bin 16448 -> 0 bytes src/static/third-party/bootstrap/js/bootstrap.min.js | 6 ------ src/static/third-party/chartjs/js/Chart.min.js | 11 ----------- src/static/third-party/chroma/js/chroma.min.js | 21 --------------------- src/static/third-party/font-awesome/css/font-awesome-ie7.min.css | 384 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ src/static/third-party/font-awesome/css/font-awesome.min.css | 403 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/static/third-party/font-awesome/font/FontAwesome.otf | Bin 61896 -> 0 bytes src/static/third-party/font-awesome/font/fontawesome-webfont.eot | Bin 37405 -> 0 bytes src/static/third-party/font-awesome/font/fontawesome-webfont.svg | 399 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/static/third-party/font-awesome/font/fontawesome-webfont.ttf | Bin 79076 -> 0 bytes src/static/third-party/font-awesome/font/fontawesome-webfont.woff | Bin 43572 -> 0 bytes src/static/third-party/highcharts/js/highcharts.js | 285 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/static/third-party/jquery-2.0.3.min.js | 6 ------ src/static/third-party/jquery.cookie.js | 90 ------------------------------------------------------------------------------------------ src/static/third-party/jquery.debouncedresize.js | 47 ----------------------------------------------- src/super_archives/__init__.py | 3 --- src/super_archives/admin.py | 64 ---------------------------------------------------------------- src/super_archives/apps.py | 10 ---------- src/super_archives/context_processors.py | 12 ------------ src/super_archives/fixtures/initial_data.json | 10 ---------- src/super_archives/locale/es/LC_MESSAGES/django.po | 224 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/super_archives/locale/pt_BR/LC_MESSAGES/django.mo | Bin 2754 -> 0 bytes src/super_archives/locale/pt_BR/LC_MESSAGES/django.po | 225 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/super_archives/management/__init__.py | 0 src/super_archives/management/commands/__init__.py | 0 src/super_archives/management/commands/import_emails.py | 290 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/super_archives/management/commands/message.py | 103 ------------------------------------------------------------------------------------------------------- src/super_archives/management/commands/update_blocks.py | 12 ------------ src/super_archives/management/commands/update_keywords.py | 12 ------------ src/super_archives/managers.py | 44 -------------------------------------------- src/super_archives/migrations/0001_initial.py | 187 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/super_archives/migrations/__init__.py | 0 src/super_archives/models.py | 390 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ src/super_archives/search_indexes.py | 98 -------------------------------------------------------------------------------------------------- src/super_archives/signals.py | 23 ----------------------- src/super_archives/templates/message-preview.html | 69 --------------------------------------------------------------------- src/super_archives/templates/message-thread.html | 193 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/super_archives/templates/search/indexes/super_archives/thread_collaborators.txt | 5 ----- src/super_archives/templates/search/indexes/super_archives/thread_description.txt | 3 --- src/super_archives/templates/search/indexes/super_archives/thread_text.txt | 5 ----- src/super_archives/templates/superarchives/emails/email_blank_subject.txt | 11 ----------- src/super_archives/templates/superarchives/emails/email_verification.txt | 6 ------ src/super_archives/templates/superarchives/includes/message.html | 78 ------------------------------------------------------------------------------ src/super_archives/templates/superarchives/tags/display_message.html | 5 ----- src/super_archives/templates/superarchives/thread-dashboard.html | 53 ----------------------------------------------------- src/super_archives/templatetags/__init__.py | 0 src/super_archives/templatetags/superarchives.py | 35 ----------------------------------- src/super_archives/tests.py | 16 ---------------- src/super_archives/urls.py | 15 --------------- src/super_archives/utils/__init__.py | 0 src/super_archives/utils/blocks.py | 100 ---------------------------------------------------------------------------------------------------- src/super_archives/utils/email.py | 19 ------------------- src/super_archives/utils/etiquetador.py | 5 ----- src/super_archives/utils/url.py | 25 ------------------------- src/super_archives/views.py | 269 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/templates/404.html | 8 -------- src/templates/500.html | 3 --- src/templates/base.html | 236 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/templates/doughnut-chart.html | 44 -------------------------------------------- src/templates/dpaste/base.html | 16 ---------------- src/templates/dpaste/snippet_details.html | 207 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/templates/dpaste/snippet_diff.html | 14 -------------- src/templates/dpaste/snippet_form.html | 33 --------------------------------- src/templates/dpaste/snippet_new.html | 7 ------- src/templates/home.html | 85 ------------------------------------------------------------------------------------- src/templates/open-data.html | 144 ------------------------------------------------------------------------------------------------------------------------------------------------ src/templates/pizza-chart.html | 43 ------------------------------------------- src/tz/__init__.py | 0 src/tz/middleware.py | 20 -------------------- src/tz/templates/tz/set_utc_offset.html | 4 ---- 473 files changed, 12561 insertions(+), 12561 deletions(-) create mode 100644 colab/__init__.py create mode 100644 colab/accounts/__init__.py create mode 100644 colab/accounts/admin.py create mode 100644 colab/accounts/auth.py create mode 100644 colab/accounts/errors.py create mode 100644 colab/accounts/forms.py create mode 100644 colab/accounts/management/__init__.py create mode 100644 colab/accounts/management/commands/__init__.py create mode 100644 colab/accounts/management/commands/delete_invalid.py create mode 100644 colab/accounts/migrations/0001_initial.py create mode 100644 colab/accounts/migrations/__init__.py create mode 100644 colab/accounts/models.py create mode 100644 colab/accounts/search_indexes.py create mode 100644 colab/accounts/templates/accounts/change_password.html create mode 100644 colab/accounts/templates/accounts/manage_subscriptions.html create mode 100644 colab/accounts/templates/accounts/user_create_form.html create mode 100644 colab/accounts/templates/accounts/user_detail.html create mode 100644 colab/accounts/templates/accounts/user_update_form.html create mode 100644 colab/accounts/templates/search/indexes/accounts/user_text.txt create mode 100644 colab/accounts/templatetags/__init__.py create mode 100644 colab/accounts/templatetags/gravatar.py create mode 100644 colab/accounts/tests.py create mode 100644 colab/accounts/urls.py create mode 100644 colab/accounts/utils/__init__.py create mode 100644 colab/accounts/utils/mailman.py create mode 100644 colab/accounts/utils/validators.py create mode 100644 colab/accounts/views.py create mode 100644 colab/api/__init__.py create mode 100644 colab/api/resources.py create mode 100644 colab/api/urls.py create mode 100644 colab/api/views.py create mode 100644 colab/badger/__init__.py create mode 100644 colab/badger/admin.py create mode 100644 colab/badger/forms.py create mode 100644 colab/badger/management/__init__.py create mode 100644 colab/badger/management/commands/__init__.py create mode 100644 colab/badger/management/commands/rebuild_badges.py create mode 100644 colab/badger/management/commands/update_badges.py create mode 100644 colab/badger/migrations/0001_initial.py create mode 100644 colab/badger/migrations/__init__.py create mode 100644 colab/badger/models.py create mode 100644 colab/badger/tests.py create mode 100644 colab/badger/utils.py create mode 100644 colab/badger/views.py create mode 100644 colab/colab/__init__.py create mode 100644 colab/colab/colab.template.yaml create mode 100644 colab/colab/settings.py create mode 100644 colab/colab/urls.py create mode 100644 colab/colab/utils/__init__.py create mode 100644 colab/colab/utils/conf.py create mode 100644 colab/colab/utils/highlighting.py create mode 100644 colab/colab/wsgi.py create mode 100644 colab/home/__init__.py create mode 100644 colab/home/admin.py create mode 100644 colab/home/context_processors.py create mode 100644 colab/home/models.py create mode 100644 colab/home/tests.py create mode 100644 colab/home/views.py create mode 100644 colab/locale/pt_BR/LC_MESSAGES/django.mo create mode 100644 colab/locale/pt_BR/LC_MESSAGES/django.po create mode 100644 colab/manage.py create mode 100644 colab/planet/__init__.py create mode 100644 colab/planet/admin.py create mode 100644 colab/planet/locale/es/LC_MESSAGES/django.po create mode 100644 colab/planet/locale/pt_BR/LC_MESSAGES/django.mo create mode 100644 colab/planet/locale/pt_BR/LC_MESSAGES/django.po create mode 100644 colab/planet/models.py create mode 100644 colab/planet/templates/common/pagination.html create mode 100644 colab/planet/templates/feedzilla/_post_template.html create mode 100644 colab/planet/templates/feedzilla/base.html create mode 100644 colab/planet/templates/feedzilla/index.html create mode 100644 colab/planet/templates/feedzilla/submit_blog.html create mode 100644 colab/planet/templates/feedzilla/tag.html create mode 100644 colab/planet/tests.py create mode 100644 colab/planet/views.py create mode 100644 colab/proxy/__init__.py create mode 100644 colab/proxy/context_processors.py create mode 100644 colab/proxy/gitlab/__init__.py create mode 100644 colab/proxy/gitlab/admin.py create mode 100644 colab/proxy/gitlab/apps.py create mode 100644 colab/proxy/gitlab/diazo.xml create mode 100644 colab/proxy/gitlab/models.py create mode 100644 colab/proxy/gitlab/templates/proxy/gitlab.html create mode 100644 colab/proxy/gitlab/tests.py create mode 100644 colab/proxy/gitlab/urls.py create mode 100644 colab/proxy/gitlab/views.py create mode 100644 colab/proxy/jenkins/__init__.py create mode 100644 colab/proxy/jenkins/admin.py create mode 100644 colab/proxy/jenkins/apps.py create mode 100644 colab/proxy/jenkins/diazo.xml create mode 100644 colab/proxy/jenkins/models.py create mode 100644 colab/proxy/jenkins/tests.py create mode 100644 colab/proxy/jenkins/urls.py create mode 100644 colab/proxy/jenkins/views.py create mode 100644 colab/proxy/redmine/__init__.py create mode 100644 colab/proxy/redmine/admin.py create mode 100644 colab/proxy/redmine/apps.py create mode 100644 colab/proxy/redmine/diazo.xml create mode 100644 colab/proxy/redmine/models.py create mode 100644 colab/proxy/redmine/tests.py create mode 100644 colab/proxy/redmine/urls.py create mode 100644 colab/proxy/redmine/views.py create mode 100644 colab/proxy/trac/__init__.py create mode 100644 colab/proxy/trac/admin.py create mode 100644 colab/proxy/trac/apps.py create mode 100644 colab/proxy/trac/diazo.xml create mode 100644 colab/proxy/trac/migrations/0001_initial.py create mode 100644 colab/proxy/trac/migrations/__init__.py create mode 100644 colab/proxy/trac/models.py create mode 100644 colab/proxy/trac/routers.py create mode 100644 colab/proxy/trac/search_indexes.py create mode 100644 colab/proxy/trac/signals.py create mode 100644 colab/proxy/trac/templates/proxy/trac.html create mode 100644 colab/proxy/trac/templates/search/indexes/proxy/attachment_text.txt create mode 100644 colab/proxy/trac/templates/search/indexes/proxy/revision_text.txt create mode 100644 colab/proxy/trac/templates/search/indexes/proxy/ticket_text.txt create mode 100644 colab/proxy/trac/templates/search/indexes/proxy/wiki_text.txt create mode 100644 colab/proxy/trac/tests.py create mode 100644 colab/proxy/trac/urls.py create mode 100644 colab/proxy/trac/views.py create mode 100644 colab/proxy/utils/__init__.py create mode 100644 colab/proxy/utils/apps.py create mode 100644 colab/proxy/utils/views.py create mode 100644 colab/rss/__init__.py create mode 100644 colab/rss/feeds.py create mode 100644 colab/rss/urls.py create mode 100644 colab/search/__init__.py create mode 100644 colab/search/admin.py create mode 100644 colab/search/base_indexes.py create mode 100644 colab/search/forms.py create mode 100644 colab/search/models.py create mode 100644 colab/search/templates/search/includes/search_filters.html create mode 100644 colab/search/templates/search/search-message-preview.html create mode 100644 colab/search/templates/search/search-revision-preview.html create mode 100644 colab/search/templates/search/search-ticket-preview.html create mode 100644 colab/search/templates/search/search-user-preview.html create mode 100644 colab/search/templates/search/search-wiki-preview.html create mode 100644 colab/search/templates/search/search.html create mode 100644 colab/search/tests.py create mode 100644 colab/search/urls.py create mode 100644 colab/search/utils.py create mode 100644 colab/search/views.py create mode 100644 colab/static/css/screen.css create mode 100644 colab/static/dpaste/css/theme.css create mode 100644 colab/static/img/COPYRIGHT create mode 100644 colab/static/img/cc_by_sa.png create mode 100644 colab/static/img/changeset.png create mode 100644 colab/static/img/fav.ico create mode 100644 colab/static/img/logo.svg create mode 100644 colab/static/img/opendata3.png create mode 100644 colab/static/img/plus.png create mode 100644 colab/static/img/rss.png create mode 100644 colab/static/img/thread.png create mode 100644 colab/static/img/ticket.png create mode 100644 colab/static/img/user.png create mode 100644 colab/static/img/wiki.png create mode 100644 colab/static/img/x.png create mode 100644 colab/static/third-party/bootstrap-datetimepicker/README create mode 100644 colab/static/third-party/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css create mode 100644 colab/static/third-party/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js create mode 100644 colab/static/third-party/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.es.js create mode 100644 colab/static/third-party/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.pt-BR.js create mode 100644 colab/static/third-party/bootstrap/css/bootstrap-theme.min.css create mode 100644 colab/static/third-party/bootstrap/css/bootstrap.min.css create mode 100644 colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.eot create mode 100644 colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.svg create mode 100644 colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.ttf create mode 100644 colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.woff create mode 100644 colab/static/third-party/bootstrap/js/bootstrap.min.js create mode 100644 colab/static/third-party/chartjs/js/Chart.min.js create mode 100644 colab/static/third-party/chroma/js/chroma.min.js create mode 100644 colab/static/third-party/font-awesome/css/font-awesome-ie7.min.css create mode 100644 colab/static/third-party/font-awesome/css/font-awesome.min.css create mode 100644 colab/static/third-party/font-awesome/font/FontAwesome.otf create mode 100755 colab/static/third-party/font-awesome/font/fontawesome-webfont.eot create mode 100755 colab/static/third-party/font-awesome/font/fontawesome-webfont.svg create mode 100755 colab/static/third-party/font-awesome/font/fontawesome-webfont.ttf create mode 100755 colab/static/third-party/font-awesome/font/fontawesome-webfont.woff create mode 100644 colab/static/third-party/highcharts/js/highcharts.js create mode 100644 colab/static/third-party/jquery-2.0.3.min.js create mode 100644 colab/static/third-party/jquery.cookie.js create mode 100644 colab/static/third-party/jquery.debouncedresize.js create mode 100644 colab/super_archives/__init__.py create mode 100644 colab/super_archives/admin.py create mode 100644 colab/super_archives/apps.py create mode 100644 colab/super_archives/context_processors.py create mode 100644 colab/super_archives/fixtures/initial_data.json create mode 100644 colab/super_archives/locale/es/LC_MESSAGES/django.po create mode 100644 colab/super_archives/locale/pt_BR/LC_MESSAGES/django.mo create mode 100644 colab/super_archives/locale/pt_BR/LC_MESSAGES/django.po create mode 100644 colab/super_archives/management/__init__.py create mode 100644 colab/super_archives/management/commands/__init__.py create mode 100644 colab/super_archives/management/commands/import_emails.py create mode 100644 colab/super_archives/management/commands/message.py create mode 100644 colab/super_archives/management/commands/update_blocks.py create mode 100644 colab/super_archives/management/commands/update_keywords.py create mode 100644 colab/super_archives/managers.py create mode 100644 colab/super_archives/migrations/0001_initial.py create mode 100644 colab/super_archives/migrations/__init__.py create mode 100644 colab/super_archives/models.py create mode 100644 colab/super_archives/search_indexes.py create mode 100644 colab/super_archives/signals.py create mode 100644 colab/super_archives/templates/message-preview.html create mode 100644 colab/super_archives/templates/message-thread.html create mode 100644 colab/super_archives/templates/search/indexes/super_archives/thread_collaborators.txt create mode 100644 colab/super_archives/templates/search/indexes/super_archives/thread_description.txt create mode 100644 colab/super_archives/templates/search/indexes/super_archives/thread_text.txt create mode 100644 colab/super_archives/templates/superarchives/emails/email_blank_subject.txt create mode 100644 colab/super_archives/templates/superarchives/emails/email_verification.txt create mode 100644 colab/super_archives/templates/superarchives/includes/message.html create mode 100644 colab/super_archives/templates/superarchives/tags/display_message.html create mode 100644 colab/super_archives/templates/superarchives/thread-dashboard.html create mode 100644 colab/super_archives/templatetags/__init__.py create mode 100644 colab/super_archives/templatetags/superarchives.py create mode 100644 colab/super_archives/tests.py create mode 100644 colab/super_archives/urls.py create mode 100644 colab/super_archives/utils/__init__.py create mode 100644 colab/super_archives/utils/blocks.py create mode 100644 colab/super_archives/utils/email.py create mode 100644 colab/super_archives/utils/etiquetador.py create mode 100644 colab/super_archives/utils/url.py create mode 100644 colab/super_archives/views.py create mode 100644 colab/templates/404.html create mode 100644 colab/templates/500.html create mode 100644 colab/templates/base.html create mode 100644 colab/templates/doughnut-chart.html create mode 100644 colab/templates/dpaste/base.html create mode 100644 colab/templates/dpaste/snippet_details.html create mode 100644 colab/templates/dpaste/snippet_diff.html create mode 100644 colab/templates/dpaste/snippet_form.html create mode 100644 colab/templates/dpaste/snippet_new.html create mode 100644 colab/templates/home.html create mode 100644 colab/templates/open-data.html create mode 100644 colab/templates/pizza-chart.html create mode 100644 colab/tz/__init__.py create mode 100644 colab/tz/middleware.py create mode 100644 colab/tz/templates/tz/set_utc_offset.html delete mode 100644 src/accounts/__init__.py delete mode 100644 src/accounts/admin.py delete mode 100644 src/accounts/auth.py delete mode 100644 src/accounts/errors.py delete mode 100644 src/accounts/forms.py delete mode 100644 src/accounts/management/__init__.py delete mode 100644 src/accounts/management/commands/__init__.py delete mode 100644 src/accounts/management/commands/delete_invalid.py delete mode 100644 src/accounts/migrations/0001_initial.py delete mode 100644 src/accounts/migrations/__init__.py delete mode 100644 src/accounts/models.py delete mode 100644 src/accounts/search_indexes.py delete mode 100644 src/accounts/templates/accounts/change_password.html delete mode 100644 src/accounts/templates/accounts/manage_subscriptions.html delete mode 100644 src/accounts/templates/accounts/user_create_form.html delete mode 100644 src/accounts/templates/accounts/user_detail.html delete mode 100644 src/accounts/templates/accounts/user_update_form.html delete mode 100644 src/accounts/templates/search/indexes/accounts/user_text.txt delete mode 100644 src/accounts/templatetags/__init__.py delete mode 100644 src/accounts/templatetags/gravatar.py delete mode 100644 src/accounts/tests.py delete mode 100644 src/accounts/urls.py delete mode 100644 src/accounts/utils/__init__.py delete mode 100644 src/accounts/utils/mailman.py delete mode 100644 src/accounts/utils/validators.py delete mode 100644 src/accounts/views.py delete mode 100644 src/api/__init__.py delete mode 100644 src/api/resources.py delete mode 100644 src/api/urls.py delete mode 100644 src/api/views.py delete mode 100644 src/badger/__init__.py delete mode 100644 src/badger/admin.py delete mode 100644 src/badger/forms.py delete mode 100644 src/badger/management/__init__.py delete mode 100644 src/badger/management/commands/__init__.py delete mode 100644 src/badger/management/commands/rebuild_badges.py delete mode 100644 src/badger/management/commands/update_badges.py delete mode 100644 src/badger/migrations/0001_initial.py delete mode 100644 src/badger/migrations/__init__.py delete mode 100644 src/badger/models.py delete mode 100644 src/badger/tests.py delete mode 100644 src/badger/utils.py delete mode 100644 src/badger/views.py delete mode 100644 src/colab/__init__.py delete mode 100644 src/colab/colab.template.yaml delete mode 100644 src/colab/settings.py delete mode 100644 src/colab/urls.py delete mode 100644 src/colab/utils/__init__.py delete mode 100644 src/colab/utils/conf.py delete mode 100644 src/colab/utils/highlighting.py delete mode 100644 src/colab/wsgi.py delete mode 100644 src/home/__init__.py delete mode 100644 src/home/admin.py delete mode 100644 src/home/context_processors.py delete mode 100644 src/home/models.py delete mode 100644 src/home/tests.py delete mode 100644 src/home/views.py delete mode 100644 src/locale/pt_BR/LC_MESSAGES/django.mo delete mode 100644 src/locale/pt_BR/LC_MESSAGES/django.po delete mode 100644 src/manage.py delete mode 100644 src/planet/__init__.py delete mode 100644 src/planet/admin.py delete mode 100644 src/planet/locale/es/LC_MESSAGES/django.po delete mode 100644 src/planet/locale/pt_BR/LC_MESSAGES/django.mo delete mode 100644 src/planet/locale/pt_BR/LC_MESSAGES/django.po delete mode 100644 src/planet/models.py delete mode 100644 src/planet/templates/common/pagination.html delete mode 100644 src/planet/templates/feedzilla/_post_template.html delete mode 100644 src/planet/templates/feedzilla/base.html delete mode 100644 src/planet/templates/feedzilla/index.html delete mode 100644 src/planet/templates/feedzilla/submit_blog.html delete mode 100644 src/planet/templates/feedzilla/tag.html delete mode 100644 src/planet/tests.py delete mode 100644 src/planet/views.py delete mode 100644 src/proxy/__init__.py delete mode 100644 src/proxy/context_processors.py delete mode 100644 src/proxy/gitlab/__init__.py delete mode 100644 src/proxy/gitlab/admin.py delete mode 100644 src/proxy/gitlab/apps.py delete mode 100644 src/proxy/gitlab/diazo.xml delete mode 100644 src/proxy/gitlab/models.py delete mode 100644 src/proxy/gitlab/templates/proxy/gitlab.html delete mode 100644 src/proxy/gitlab/tests.py delete mode 100644 src/proxy/gitlab/urls.py delete mode 100644 src/proxy/gitlab/views.py delete mode 100644 src/proxy/jenkins/__init__.py delete mode 100644 src/proxy/jenkins/admin.py delete mode 100644 src/proxy/jenkins/apps.py delete mode 100644 src/proxy/jenkins/diazo.xml delete mode 100644 src/proxy/jenkins/models.py delete mode 100644 src/proxy/jenkins/tests.py delete mode 100644 src/proxy/jenkins/urls.py delete mode 100644 src/proxy/jenkins/views.py delete mode 100644 src/proxy/redmine/__init__.py delete mode 100644 src/proxy/redmine/admin.py delete mode 100644 src/proxy/redmine/apps.py delete mode 100644 src/proxy/redmine/diazo.xml delete mode 100644 src/proxy/redmine/models.py delete mode 100644 src/proxy/redmine/tests.py delete mode 100644 src/proxy/redmine/urls.py delete mode 100644 src/proxy/redmine/views.py delete mode 100644 src/proxy/trac/__init__.py delete mode 100644 src/proxy/trac/admin.py delete mode 100644 src/proxy/trac/apps.py delete mode 100644 src/proxy/trac/diazo.xml delete mode 100644 src/proxy/trac/migrations/0001_initial.py delete mode 100644 src/proxy/trac/migrations/__init__.py delete mode 100644 src/proxy/trac/models.py delete mode 100644 src/proxy/trac/routers.py delete mode 100644 src/proxy/trac/search_indexes.py delete mode 100644 src/proxy/trac/signals.py delete mode 100644 src/proxy/trac/templates/proxy/trac.html delete mode 100644 src/proxy/trac/templates/search/indexes/proxy/attachment_text.txt delete mode 100644 src/proxy/trac/templates/search/indexes/proxy/revision_text.txt delete mode 100644 src/proxy/trac/templates/search/indexes/proxy/ticket_text.txt delete mode 100644 src/proxy/trac/templates/search/indexes/proxy/wiki_text.txt delete mode 100644 src/proxy/trac/tests.py delete mode 100644 src/proxy/trac/urls.py delete mode 100644 src/proxy/trac/views.py delete mode 100644 src/proxy/utils/__init__.py delete mode 100644 src/proxy/utils/apps.py delete mode 100644 src/proxy/utils/views.py delete mode 100644 src/rss/__init__.py delete mode 100644 src/rss/feeds.py delete mode 100644 src/rss/urls.py delete mode 100644 src/search/__init__.py delete mode 100644 src/search/admin.py delete mode 100644 src/search/base_indexes.py delete mode 100644 src/search/forms.py delete mode 100644 src/search/models.py delete mode 100644 src/search/templates/search/includes/search_filters.html delete mode 100644 src/search/templates/search/search-message-preview.html delete mode 100644 src/search/templates/search/search-revision-preview.html delete mode 100644 src/search/templates/search/search-ticket-preview.html delete mode 100644 src/search/templates/search/search-user-preview.html delete mode 100644 src/search/templates/search/search-wiki-preview.html delete mode 100644 src/search/templates/search/search.html delete mode 100644 src/search/tests.py delete mode 100644 src/search/urls.py delete mode 100644 src/search/utils.py delete mode 100644 src/search/views.py delete mode 100644 src/static/css/screen.css delete mode 100644 src/static/dpaste/css/theme.css delete mode 100644 src/static/img/COPYRIGHT delete mode 100644 src/static/img/cc_by_sa.png delete mode 100644 src/static/img/changeset.png delete mode 100644 src/static/img/fav.ico delete mode 100644 src/static/img/logo.svg delete mode 100644 src/static/img/opendata3.png delete mode 100644 src/static/img/plus.png delete mode 100644 src/static/img/rss.png delete mode 100644 src/static/img/thread.png delete mode 100644 src/static/img/ticket.png delete mode 100644 src/static/img/user.png delete mode 100644 src/static/img/wiki.png delete mode 100644 src/static/img/x.png delete mode 100644 src/static/third-party/bootstrap-datetimepicker/README delete mode 100644 src/static/third-party/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css delete mode 100644 src/static/third-party/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js delete mode 100644 src/static/third-party/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.es.js delete mode 100644 src/static/third-party/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.pt-BR.js delete mode 100644 src/static/third-party/bootstrap/css/bootstrap-theme.min.css delete mode 100644 src/static/third-party/bootstrap/css/bootstrap.min.css delete mode 100644 src/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.eot delete mode 100644 src/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.svg delete mode 100644 src/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.ttf delete mode 100644 src/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.woff delete mode 100644 src/static/third-party/bootstrap/js/bootstrap.min.js delete mode 100644 src/static/third-party/chartjs/js/Chart.min.js delete mode 100644 src/static/third-party/chroma/js/chroma.min.js delete mode 100644 src/static/third-party/font-awesome/css/font-awesome-ie7.min.css delete mode 100644 src/static/third-party/font-awesome/css/font-awesome.min.css delete mode 100644 src/static/third-party/font-awesome/font/FontAwesome.otf delete mode 100755 src/static/third-party/font-awesome/font/fontawesome-webfont.eot delete mode 100755 src/static/third-party/font-awesome/font/fontawesome-webfont.svg delete mode 100755 src/static/third-party/font-awesome/font/fontawesome-webfont.ttf delete mode 100755 src/static/third-party/font-awesome/font/fontawesome-webfont.woff delete mode 100644 src/static/third-party/highcharts/js/highcharts.js delete mode 100644 src/static/third-party/jquery-2.0.3.min.js delete mode 100644 src/static/third-party/jquery.cookie.js delete mode 100644 src/static/third-party/jquery.debouncedresize.js delete mode 100644 src/super_archives/__init__.py delete mode 100644 src/super_archives/admin.py delete mode 100644 src/super_archives/apps.py delete mode 100644 src/super_archives/context_processors.py delete mode 100644 src/super_archives/fixtures/initial_data.json delete mode 100644 src/super_archives/locale/es/LC_MESSAGES/django.po delete mode 100644 src/super_archives/locale/pt_BR/LC_MESSAGES/django.mo delete mode 100644 src/super_archives/locale/pt_BR/LC_MESSAGES/django.po delete mode 100644 src/super_archives/management/__init__.py delete mode 100644 src/super_archives/management/commands/__init__.py delete mode 100644 src/super_archives/management/commands/import_emails.py delete mode 100644 src/super_archives/management/commands/message.py delete mode 100644 src/super_archives/management/commands/update_blocks.py delete mode 100644 src/super_archives/management/commands/update_keywords.py delete mode 100644 src/super_archives/managers.py delete mode 100644 src/super_archives/migrations/0001_initial.py delete mode 100644 src/super_archives/migrations/__init__.py delete mode 100644 src/super_archives/models.py delete mode 100644 src/super_archives/search_indexes.py delete mode 100644 src/super_archives/signals.py delete mode 100644 src/super_archives/templates/message-preview.html delete mode 100644 src/super_archives/templates/message-thread.html delete mode 100644 src/super_archives/templates/search/indexes/super_archives/thread_collaborators.txt delete mode 100644 src/super_archives/templates/search/indexes/super_archives/thread_description.txt delete mode 100644 src/super_archives/templates/search/indexes/super_archives/thread_text.txt delete mode 100644 src/super_archives/templates/superarchives/emails/email_blank_subject.txt delete mode 100644 src/super_archives/templates/superarchives/emails/email_verification.txt delete mode 100644 src/super_archives/templates/superarchives/includes/message.html delete mode 100644 src/super_archives/templates/superarchives/tags/display_message.html delete mode 100644 src/super_archives/templates/superarchives/thread-dashboard.html delete mode 100644 src/super_archives/templatetags/__init__.py delete mode 100644 src/super_archives/templatetags/superarchives.py delete mode 100644 src/super_archives/tests.py delete mode 100644 src/super_archives/urls.py delete mode 100644 src/super_archives/utils/__init__.py delete mode 100644 src/super_archives/utils/blocks.py delete mode 100644 src/super_archives/utils/email.py delete mode 100644 src/super_archives/utils/etiquetador.py delete mode 100644 src/super_archives/utils/url.py delete mode 100644 src/super_archives/views.py delete mode 100644 src/templates/404.html delete mode 100644 src/templates/500.html delete mode 100644 src/templates/base.html delete mode 100644 src/templates/doughnut-chart.html delete mode 100644 src/templates/dpaste/base.html delete mode 100644 src/templates/dpaste/snippet_details.html delete mode 100644 src/templates/dpaste/snippet_diff.html delete mode 100644 src/templates/dpaste/snippet_form.html delete mode 100644 src/templates/dpaste/snippet_new.html delete mode 100644 src/templates/home.html delete mode 100644 src/templates/open-data.html delete mode 100644 src/templates/pizza-chart.html delete mode 100644 src/tz/__init__.py delete mode 100644 src/tz/middleware.py delete mode 100644 src/tz/templates/tz/set_utc_offset.html diff --git a/colab/__init__.py b/colab/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/__init__.py diff --git a/colab/accounts/__init__.py b/colab/accounts/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/accounts/__init__.py diff --git a/colab/accounts/admin.py b/colab/accounts/admin.py new file mode 100644 index 0000000..c12ce74 --- /dev/null +++ b/colab/accounts/admin.py @@ -0,0 +1,56 @@ + +from django import forms +from django.contrib import admin +from django.contrib.auth.admin import UserAdmin +from django.utils.translation import ugettext_lazy as _ + +from .models import User + + +class UserCreationForm(forms.ModelForm): + class Meta: + model = User + fields = ('username', 'email') + + def __init__(self, *args, **kwargs): + super(UserCreationForm, self).__init__(*args, **kwargs) + self.fields['email'].required = True + + +class UserChangeForm(forms.ModelForm): + class Meta: + model = User + fields = ('username', 'first_name', 'last_name', 'email', 'is_active', + 'is_staff', 'is_superuser', 'groups', 'last_login', + 'date_joined', 'twitter', 'facebook', 'google_talk', + 'webpage') + + def __init__(self, *args, **kwargs): + super(UserChangeForm, self).__init__(*args, **kwargs) + self.fields['email'].required = True + + + +class MyUserAdmin(UserAdmin): + form = UserChangeForm + add_form = UserCreationForm + + fieldsets = ( + (None, {'fields': ('username', 'email')}), + (_('Personal info'), {'fields': ('first_name', 'last_name', 'twitter', + 'facebook', 'google_talk', 'webpage', + )}), + (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', + 'groups')}), + (_('Important dates'), {'fields': ('last_login', 'date_joined')}) + ) + + add_fieldsets = ( + (None, { + 'classes': ('wide',), + 'fields': ('username', 'email')} + ), + ) + + +admin.site.register(User, MyUserAdmin) diff --git a/colab/accounts/auth.py b/colab/accounts/auth.py new file mode 100644 index 0000000..b04fa78 --- /dev/null +++ b/colab/accounts/auth.py @@ -0,0 +1,6 @@ + +from django_browserid.auth import BrowserIDBackend + +class ColabBrowserIDBackend(BrowserIDBackend): + def filter_users_by_email(self, email): + return self.User.objects.filter(emails__address=email) diff --git a/colab/accounts/errors.py b/colab/accounts/errors.py new file mode 100644 index 0000000..43d056b --- /dev/null +++ b/colab/accounts/errors.py @@ -0,0 +1,2 @@ +class XMPPChangePwdException(Exception): + """Error changing XMPP Account password""" diff --git a/colab/accounts/forms.py b/colab/accounts/forms.py new file mode 100644 index 0000000..f55d13a --- /dev/null +++ b/colab/accounts/forms.py @@ -0,0 +1,114 @@ +# -*- coding: utf-8 -*- + +from django import forms +from django.contrib.auth import get_user_model +from django.utils.translation import ugettext_lazy as _ + +from conversejs.models import XMPPAccount + +from accounts.utils import mailman +from super_archives.models import MailingList +from .utils.validators import validate_social_account + +User = get_user_model() + + +class SocialAccountField(forms.Field): + def __init__(self, *args, **kwargs): + self.url = kwargs.pop('url', None) + super(SocialAccountField, self).__init__(*args, **kwargs) + + def validate(self, value): + super(SocialAccountField, self).validate(value) + + if value and not validate_social_account(value, self.url): + raise forms.ValidationError(_('Social account does not exist'), + code='social-account-doesnot-exist') + + +class UserForm(forms.ModelForm): + required = ('first_name', 'last_name', 'email', 'username') + + class Meta: + model = User + + def __init__(self, *args, **kwargs): + super(UserForm, self).__init__(*args, **kwargs) + for field_name, field in self.fields.items(): + # Adds form-control class to all form fields + field.widget.attrs.update({'class': 'form-control'}) + + # Set UserForm.required fields as required + if field_name in UserForm.required: + field.required = True + + +class UserCreationForm(UserForm): + class Meta: + model = User + fields = ('first_name', 'last_name', 'email', 'username') + + +class UserUpdateForm(UserForm): + bio = forms.CharField( + widget=forms.Textarea(attrs={'rows': '6', 'maxlength': '200'}), + max_length=200, + label=_(u'Bio'), + help_text=_(u'Write something about you in 200 characters or less.'), + required=False, + ) + + class Meta: + model = User + fields = ('first_name', 'last_name', + 'institution', 'role', 'twitter', 'facebook', + 'google_talk', 'github', 'webpage', 'bio') + + twitter = SocialAccountField(url='https://twitter.com/', required=False) + facebook = SocialAccountField(url='https://graph.facebook.com/', required=False) + + +class ListsForm(forms.Form): + LISTS_NAMES = (( + listname, u'{} ({})'.format(listname, description) + ) for listname, description in mailman.all_lists(description=True)) + + lists = forms.MultipleChoiceField(label=_(u'Mailing lists'), + required=False, + widget=forms.CheckboxSelectMultiple, + choices=LISTS_NAMES) + + +class ChangeXMPPPasswordForm(forms.ModelForm): + password1 = forms.CharField(label=_("Password"), + widget=forms.PasswordInput) + password2 = forms.CharField(label=_("Password confirmation"), + widget=forms.PasswordInput, + help_text=_("Enter the same password as above, for verification.")) + + class Meta: + model = XMPPAccount + fields = ('password1', 'password2') + + def __init__(self, *args, **kwargs): + super(ChangeXMPPPasswordForm, self).__init__(*args, **kwargs) + + for field_name, field in self.fields.items(): + # Adds form-control class to all form fields + field.widget.attrs.update({'class': 'form-control'}) + + def clean_password2(self): + password1 = self.cleaned_data.get("password1") + password2 = self.cleaned_data.get("password2") + if password1 and password2 and password1 != password2: + raise forms.ValidationError( + _("Password mismatch"), + code='password_mismatch', + ) + return password2 + + def save(self, commit=True): + self.instance.password = self.cleaned_data['password2'] + if commit: + self.instance.save() + return self.instance diff --git a/colab/accounts/management/__init__.py b/colab/accounts/management/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/accounts/management/__init__.py diff --git a/colab/accounts/management/commands/__init__.py b/colab/accounts/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/accounts/management/commands/__init__.py diff --git a/colab/accounts/management/commands/delete_invalid.py b/colab/accounts/management/commands/delete_invalid.py new file mode 100644 index 0000000..0335e98 --- /dev/null +++ b/colab/accounts/management/commands/delete_invalid.py @@ -0,0 +1,42 @@ + + +from django.db.models import F +from django.utils import timezone +from django.utils.translation import ugettext as _ +from django.core.management.base import BaseCommand, CommandError + + +from ...models import User + + +class Command(BaseCommand): + """Delete user accounts that have never logged in. + + Delete from database user accounts that have never logged in + and are at least 24h older. + + """ + + help = __doc__ + + def handle(self, *args, **kwargs): + seconds = timezone.timedelta(seconds=1) + now = timezone.now() + one_day_ago = timezone.timedelta(days=1) + + # Query for users that have NEVER logged in + # + # By default django sets the last_login as auto_now and then + # last_login is pretty much the same than date_joined + # (instead of null as I expected). Because of that we query + # for users which last_login is between date_joined - N and + # date_joined + N, where N is a small constant in seconds. + users = User.objects.filter(last_login__gt=(F('date_joined') - seconds), + last_login__lt=(F('date_joined') + seconds), + date_joined__lt=now-one_day_ago) + count = 0 + for user in users: + count += 1 + user.delete() + + print _(u'%(count)s users deleted.') % {'count': count} diff --git a/colab/accounts/migrations/0001_initial.py b/colab/accounts/migrations/0001_initial.py new file mode 100644 index 0000000..59fd7a6 --- /dev/null +++ b/colab/accounts/migrations/0001_initial.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.utils.timezone +import django.core.validators + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(default=django.utils.timezone.now, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(help_text='Required. 30 characters or fewer. Letters, digits and ./+/-/_ only.', unique=True, max_length=30, verbose_name='username', validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username.', 'invalid')])), + ('first_name', models.CharField(max_length=30, verbose_name='first name', blank=True)), + ('last_name', models.CharField(max_length=30, verbose_name='last name', blank=True)), + ('email', models.EmailField(unique=True, max_length=75, verbose_name='email address', blank=True)), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('institution', models.CharField(max_length=128, null=True, blank=True)), + ('role', models.CharField(max_length=128, null=True, blank=True)), + ('twitter', models.CharField(max_length=128, null=True, blank=True)), + ('facebook', models.CharField(max_length=128, null=True, blank=True)), + ('google_talk', models.EmailField(max_length=75, null=True, blank=True)), + ('github', models.CharField(max_length=128, null=True, verbose_name='github', blank=True)), + ('webpage', models.CharField(max_length=256, null=True, blank=True)), + ('verification_hash', models.CharField(max_length=32, null=True, blank=True)), + ('modified', models.DateTimeField(auto_now=True)), + ('bio', models.CharField(max_length=200, null=True, blank=True)), + ('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Group', blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of his/her group.', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Permission', blank=True, help_text='Specific permissions for this user.', verbose_name='user permissions')), + ], + options={ + 'abstract': False, + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + }, + bases=(models.Model,), + ), + ] diff --git a/colab/accounts/migrations/__init__.py b/colab/accounts/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/accounts/migrations/__init__.py diff --git a/colab/accounts/models.py b/colab/accounts/models.py new file mode 100644 index 0000000..e530afa --- /dev/null +++ b/colab/accounts/models.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +import urlparse + +from django.db import models, DatabaseError +from django.contrib.auth.hashers import check_password +from django.contrib.auth.models import AbstractUser +from django.core import validators +from django.core.urlresolvers import reverse +from django.utils.translation import ugettext_lazy as _ + +from conversejs import xmpp + +from .utils import mailman + + +class User(AbstractUser): + institution = models.CharField(max_length=128, null=True, blank=True) + role = models.CharField(max_length=128, null=True, blank=True) + twitter = models.CharField(max_length=128, null=True, blank=True) + facebook = models.CharField(max_length=128, null=True, blank=True) + google_talk = models.EmailField(null=True, blank=True) + github = models.CharField(max_length=128, null=True, blank=True, + verbose_name=u'github') + webpage = models.CharField(max_length=256, null=True, blank=True) + verification_hash = models.CharField(max_length=32, null=True, blank=True) + modified = models.DateTimeField(auto_now=True) + bio = models.CharField(max_length=200, null=True, blank=True) + + def check_password(self, raw_password): + + if self.xmpp.exists() and raw_password == self.xmpp.first().password: + return True + + return super(User, self).check_password(raw_password) + + def get_absolute_url(self): + return reverse('user_profile', kwargs={'username': self.username}) + + def twitter_link(self): + return urlparse.urljoin('https://twitter.com', self.twitter) + + def facebook_link(self): + return urlparse.urljoin('https://www.facebook.com', self.facebook) + + def mailinglists(self): + return mailman.user_lists(self) + + def update_subscription(self, email, lists): + mailman.update_subscription(email, lists) + + +# We need to have `email` field set as unique but Django does not +# support field overriding (at least not until 1.6). +# The following workaroud allows to change email field to unique +# without having to rewrite all AbstractUser here +User._meta.get_field('email')._unique = True +User._meta.get_field('username').help_text = _( + u'Required. 30 characters or fewer. Letters, digits and ' + u'./+/-/_ only.' +) +User._meta.get_field('username').validators[0] = validators.RegexValidator( + r'^[\w.+-]+$', + _('Enter a valid username.'), + 'invalid' +) diff --git a/colab/accounts/search_indexes.py b/colab/accounts/search_indexes.py new file mode 100644 index 0000000..ec13877 --- /dev/null +++ b/colab/accounts/search_indexes.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- + +from haystack import indexes +from django.db.models import Count + +from badger.utils import get_users_counters +from .models import User + + +class UserIndex(indexes.SearchIndex, indexes.Indexable): + # common fields + text = indexes.CharField(document=True, use_template=True, stored=False) + url = indexes.CharField(model_attr='get_absolute_url', indexed=False) + title = indexes.CharField(model_attr='get_full_name') + description = indexes.CharField(null=True) + type = indexes.CharField() + icon_name = indexes.CharField() + + # extra fields + username = indexes.CharField(model_attr='username', stored=False) + name = indexes.CharField(model_attr='get_full_name') + email = indexes.CharField(model_attr='email', stored=False) + institution = indexes.CharField(model_attr='institution', null=True) + role = indexes.CharField(model_attr='role', null=True) + google_talk = indexes.CharField(model_attr='google_talk', null=True, + stored=False) + webpage = indexes.CharField(model_attr='webpage', null=True, stored=False) + message_count = indexes.IntegerField(stored=False) + changeset_count = indexes.IntegerField(stored=False) + ticket_count = indexes.IntegerField(stored=False) + wiki_count = indexes.IntegerField(stored=False) + contribution_count = indexes.IntegerField(stored=False) + + def get_model(self): + return User + + @property + def badge_counters(self): + if not hasattr(self, '_badge_counters'): + self._badge_counters = get_users_counters() + return self._badge_counters + + def prepare(self, obj): + prepared_data = super(UserIndex, self).prepare(obj) + + prepared_data['contribution_count'] = sum(( + self.prepared_data['message_count'], + self.prepared_data['changeset_count'], + self.prepared_data['ticket_count'], + self.prepared_data['wiki_count'] + )) + + return prepared_data + + def prepare_description(self, obj): + return u'{}\n{}\n{}\n{}'.format( + obj.institution, obj.role, obj.username, obj.get_full_name() + ) + + def prepare_icon_name(self, obj): + return u'user' + + def prepare_type(self, obj): + return u'user' + + def prepare_message_count(self, obj): + return self.badge_counters[obj.username]['messages'] + + def prepare_changeset_count(self, obj): + return self.badge_counters[obj.username]['revisions'] + + def prepare_ticket_count(self, obj): + return self.badge_counters[obj.username]['tickets'] + + def prepare_wiki_count(self, obj): + return self.badge_counters[obj.username]['wikis'] + + def index_queryset(self, using=None): + return self.get_model().objects.filter(is_active=True) diff --git a/colab/accounts/templates/accounts/change_password.html b/colab/accounts/templates/accounts/change_password.html new file mode 100644 index 0000000..221148d --- /dev/null +++ b/colab/accounts/templates/accounts/change_password.html @@ -0,0 +1,21 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block main-content %} +
+ {% csrf_token %} +
+

{% trans "Change XMPP Client and SVN Password" %}

+
+ {% for field in form %} +
+ + {{ field }} + {{ field.errors }} +
+ {% endfor %} + +
+
+
+{% endblock %} diff --git a/colab/accounts/templates/accounts/manage_subscriptions.html b/colab/accounts/templates/accounts/manage_subscriptions.html new file mode 100644 index 0000000..a4908d0 --- /dev/null +++ b/colab/accounts/templates/accounts/manage_subscriptions.html @@ -0,0 +1,45 @@ +{% extends 'base.html' %} +{% load i18n gravatar %} + +{% block main-content %} + +

{% blocktrans %}Group Subscriptions{% endblocktrans %}

+

{% gravatar user_.email 50 %} {{ user_.get_full_name }} ({{ user_.username }})

+
+ +
+ {% csrf_token %} + +
+ {% for email, lists in membership.items %} +
+
+
+

{{ email }}

+
+
+ {% for list, checked in lists %} +
+ +
+ {% endfor %} +
+
+
+ {% endfor %} +
+ +
+
+ +
+
+ +
+ +

+

+ +{% endblock %} diff --git a/colab/accounts/templates/accounts/user_create_form.html b/colab/accounts/templates/accounts/user_create_form.html new file mode 100644 index 0000000..2b7bb38 --- /dev/null +++ b/colab/accounts/templates/accounts/user_create_form.html @@ -0,0 +1,66 @@ +{% extends "base.html" %} +{% load i18n %} +{% block main-content %} + +

{% trans "Sign up" %}

+ +
+ {% if form.errors %} +
+ {% trans "Please correct the errors below and try again" %} +
+ {% endif %} +
+ + +

+ +

+ +
+ {% csrf_token %} + +
+ +
+
+
+
+ {% trans 'Personal Information' %} + {% for field in user_form %} +
+ + {{ field }} + {{ field.errors }} +
+ {% endfor %} +
+
+
+ +
+
+
+ {% trans 'Subscribe to groups' %} + {% for choice in lists_form.lists %} +
{{ choice }}
+ {% endfor %} + {{ lists_form.errors }} +
+
+
+ +
+
+ +
+
+ +
+
+ +
+ +{% endblock %} diff --git a/colab/accounts/templates/accounts/user_detail.html b/colab/accounts/templates/accounts/user_detail.html new file mode 100644 index 0000000..eac8758 --- /dev/null +++ b/colab/accounts/templates/accounts/user_detail.html @@ -0,0 +1,182 @@ +{% extends "base.html" %} + +{% load i18n gravatar i18n_model %} + +{% block title %}Perfil{% endblock %} + +{% block head_js %} + {% trans "Messages" as group_collabs %} + {% trans "Contributions" as type_collabs %} + + {% include "doughnut-chart.html" with chart_data=type_count chart_canvas="collabs" name=type_collabs %} + {% include "doughnut-chart.html" with chart_data=list_activity chart_canvas="collabs2" name=group_collabs %} +{% endblock %} + +{% block main-content %} + +
+
+
+ {% gravatar user_.email 200 %} +
+ +

+ {{ user_.get_full_name }} + {{ user_.username }} +

+ + {% if request.user == user_ or request.user.is_superuser %} +   {% trans "edit profile"|title %} +   {% trans "group membership"|title %} + {% endif %} + + {% if request.user.is_active %} + {% if user_.bio %} +
+
    +
  • + {% trans 'Bio' %} +
  • +
  • {{ user_.bio }}
  • +
+ {% endif %} + {% endif %} + +
+ {% if request.user.is_active %} + +
+ {% endif %} + +
    + {% if user_.institution or user_.role %} +
  • + + {{ user_.role }} + {% if user_.institution and user_.role %}-{% endif %} + {{ user_.institution }} +
  • + {% endif %} + {% if request.user.is_active %} +
  • + {% if user_.twitter %} + {{ user_.twitter }} + {% endif %} + {% if user_.facebook %} + {{ user_.facebook }} + {% endif %} +
  • + + {% if user_.google_talk %} +
  • {{ user_.google_talk }}
  • + {% endif %} + + {% if user_.github %} +
  • {{ user_.github }}
  • + {% endif %} + + {% if user_.webpage %} +
  • {{ user_.webpage }}
  • + {% endif %} + {% endif %} +
+ + {% if user_.mailinglists %} + {% trans 'Groups: ' %} + {% for list in user_.mailinglists %} + {{ list }} + {% endfor %} + {% endif %} + +
+ +
+ +
+
+
+

{% trans "Collaborations by Type" %}

+
+
+
+
+ +

+
+
+
+
+ + +
+
+
+

{% trans "Participation by Group" %}

+
+
+
+ +

+
+
+
+
+ + + {% if user_.badge_set.exists %} +
+
+
+

{% trans "Badges" %}

+
+
+
+ {% for badge in user_.badge_set.all %} + {% translate badge as badge_trans %} + + {% endfor %} +
+
+
+
+ {% endif %} + +
+ +
+ +
+

{% trans "Latest posted" %}

+
    + {% for doc in emails %} + {% include "message-preview.html" with result=doc %} + {% empty %} +
  • {% trans "There are no posts by this user so far." %}
  • + {% endfor %} +
+ + {% trans "View more posts..." %} + +
 
+
+ +
+

{% trans "Latest contributions" %}

+
    + {% for result in results %} + {% include "message-preview.html" %} + {% empty %} +
  • {% trans "No contributions of this user so far." %}
  • + {% endfor %} +
+ + {% trans "View more contributions..." %} + +
 
+
+ +
+ +{% endblock %} diff --git a/colab/accounts/templates/accounts/user_update_form.html b/colab/accounts/templates/accounts/user_update_form.html new file mode 100644 index 0000000..27304fb --- /dev/null +++ b/colab/accounts/templates/accounts/user_update_form.html @@ -0,0 +1,207 @@ +{% extends "base.html" %} +{% load i18n gravatar %} + +{% block head_js %} + +{% endblock %} + + +{% block main-content %} + +
+ {% with user_.first_name as firstname %} +

{% trans 'profile information'|title %}

+ {% endwith %} + +

{% gravatar user_.email 50 %} {{ user_.get_full_name }} ({{ user_.username }})

+ + {% trans "Change your avatar at Gravatar.com" %} + +
+
+
+ +
+ {% csrf_token %} + +
+
+ {% for field in form %} +
+
+ + {{ field }} + {{ field.errors }} +
+
+ {% endfor %} +
+ +
+
+
+

{% trans "Emails" %}

+
+
+
    + {% for email in user_.emails.iterator %} +
  • + {% gravatar user_.email 30 %} + + {% if email.address == user_.email %} + {% trans "Primary" %} + {% else %} +
    + + +
    + {% endif %} +
    +
  • + {% endfor %} + {% for email in user_.emails_not_validated.iterator %} +
  • + {% gravatar user_.email 30 %} + +
    + + +
    +
    +
  • + {% endfor %} +
+
+ + +
+ +
+
+
+
+ +
+
+
+
+

+ {% trans 'Change Password' %} +

+
+
+
+ {% trans "This feature is available only for those who need to change the password for some reason as having an old user with the same username, forgot your password to commit, usage of other XMPP Client for connection. Usually, you won't need to change this password. Only change it if you are sure about what you are doing." %} +
+ {% trans "Change Password" %} +
+
+
+
+ +
+
+ +
+
+
+{% endblock %} diff --git a/colab/accounts/templates/search/indexes/accounts/user_text.txt b/colab/accounts/templates/search/indexes/accounts/user_text.txt new file mode 100644 index 0000000..35b480f --- /dev/null +++ b/colab/accounts/templates/search/indexes/accounts/user_text.txt @@ -0,0 +1,7 @@ +{{ object.username }} +{{ object.get_full_name }} +{{ object.get_full_name|slugify }} +{{ object.institution }} +{{ object.institution|slugify }} +{{ object.role }} +{{ object.role|slugify }} diff --git a/colab/accounts/templatetags/__init__.py b/colab/accounts/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/accounts/templatetags/__init__.py diff --git a/colab/accounts/templatetags/gravatar.py b/colab/accounts/templatetags/gravatar.py new file mode 100644 index 0000000..ceff4a8 --- /dev/null +++ b/colab/accounts/templatetags/gravatar.py @@ -0,0 +1,20 @@ + +from django import template + +from super_archives.models import EmailAddress + + +register = template.Library() + + +@register.simple_tag +def gravatar(email, size=80): + if isinstance(email, basestring): + try: + email = EmailAddress.objects.get(address=email) + except EmailAddress.DoesNotExist: + pass + + email_md5 = getattr(email, 'md5', 'anonymous') + + return u''.format(email_md5, size, size, size) diff --git a/colab/accounts/tests.py b/colab/accounts/tests.py new file mode 100644 index 0000000..501deb7 --- /dev/null +++ b/colab/accounts/tests.py @@ -0,0 +1,16 @@ +""" +This file demonstrates writing tests using the unittest module. These will pass +when you run "manage.py test". + +Replace this with more appropriate tests for your application. +""" + +from django.test import TestCase + + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.assertEqual(1 + 1, 2) diff --git a/colab/accounts/urls.py b/colab/accounts/urls.py new file mode 100644 index 0000000..c9ca9f9 --- /dev/null +++ b/colab/accounts/urls.py @@ -0,0 +1,25 @@ + +from django.conf.urls import patterns, include, url + +from .views import (UserProfileDetailView, UserProfileUpdateView, + ManageUserSubscriptionsView, ChangeXMPPPasswordView) + +from accounts import views + +urlpatterns = patterns('', + url(r'^register/$', 'accounts.views.signup', name='signup'), + + url(r'^change-password/$', + ChangeXMPPPasswordView.as_view(), name='change_password'), + + url(r'^logout/?$', 'accounts.views.logoutColab', name='logout'), + + url(r'^(?P[\w@+.-]+)/?$', + UserProfileDetailView.as_view(), name='user_profile'), + + url(r'^(?P[\w@+.-]+)/edit/?$', + UserProfileUpdateView.as_view(), name='user_profile_update'), + + url(r'^(?P[\w@+.-]+)/subscriptions/?$', + ManageUserSubscriptionsView.as_view(), name='user_list_subscriptions'), +) diff --git a/colab/accounts/utils/__init__.py b/colab/accounts/utils/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/accounts/utils/__init__.py diff --git a/colab/accounts/utils/mailman.py b/colab/accounts/utils/mailman.py new file mode 100644 index 0000000..07fe7ac --- /dev/null +++ b/colab/accounts/utils/mailman.py @@ -0,0 +1,97 @@ + +import urlparse +import requests +import logging + +from django.conf import settings + +TIMEOUT = 1 + + +def get_url(listname=None): + if listname: + return urlparse.urljoin(settings.MAILMAN_API_URL, '/' + listname) + + return settings.MAILMAN_API_URL + + +def subscribe(listname, address): + url = get_url(listname) + try: + requests.put(url, timeout=TIMEOUT, data={'address': address}) + except: + logging.exception('Unable to subscribe user') + return False + return True + + +def unsubscribe(listname, address): + url = get_url(listname) + try: + requests.delete(url, timeout=TIMEOUT, data={'address': address}) + except: + logging.exception('Unable to unsubscribe user') + return False + return True + + +def update_subscription(address, lists): + current_lists = address_lists(address) + + for maillist in current_lists: + if maillist not in lists: + unsubscribe(maillist, address) + + for maillist in lists: + if maillist not in current_lists: + subscribe(maillist, address) + + +def address_lists(address, description=''): + url = get_url() + + params = {'address': address, + 'description': description} + + try: + lists = requests.get(url, timeout=TIMEOUT, params=params) + except: + logging.exception('Unable to list mailing lists') + return [] + + return lists.json() + + +def all_lists(*args, **kwargs): + return address_lists('', *args, **kwargs) + + +def user_lists(user): + list_set = set() + + for email in user.emails.values_list('address', flat=True): + list_set.update(address_lists(email)) + + return tuple(list_set) + + +def get_list_description(listname, lists=None): + if not lists: + lists = dict(all_lists(description=True)) + elif not isinstance(lists, dict): + lists = dict(lists) + + return lists.get(listname) + + +def list_users(listname): + url = get_url(listname) + + params = {} + + try: + users = requests.get(url, timeout=TIMEOUT, params=params) + except requests.exceptions.RequestException: + return [] + + return users.json() diff --git a/colab/accounts/utils/validators.py b/colab/accounts/utils/validators.py new file mode 100644 index 0000000..68f4128 --- /dev/null +++ b/colab/accounts/utils/validators.py @@ -0,0 +1,26 @@ + +import urllib2 +import urlparse + + +def validate_social_account(account, url): + """Verifies if a social account is valid. + + Examples: + + >>> validate_social_account('seocam', 'http://twitter.com') + True + + >>> validate_social_account('seocam-fake-should-fail', 'http://twitter.com') + False + """ + + request = urllib2.Request(urlparse.urljoin(url, account)) + request.get_method = lambda: 'HEAD' + + try: + response = urllib2.urlopen(request) + except urllib2.HTTPError: + return False + + return response.code == 200 diff --git a/colab/accounts/views.py b/colab/accounts/views.py new file mode 100644 index 0000000..e1ec516 --- /dev/null +++ b/colab/accounts/views.py @@ -0,0 +1,251 @@ +#!/usr/bin/env python +# encoding: utf-8 + +import datetime + +from collections import OrderedDict + +from django.contrib.auth.views import logout +from django.contrib import messages +from django.db import transaction +from django.db.models import Count +from django.contrib.auth import get_user_model +from django.utils.translation import ugettext as _ +from django.shortcuts import render, redirect, get_object_or_404 +from django.core.urlresolvers import reverse +from django.core.exceptions import PermissionDenied +from django.views.generic import DetailView, UpdateView +from django.utils.decorators import method_decorator + +from django.http import HttpResponse +from conversejs import xmpp +from conversejs.models import XMPPAccount +from haystack.query import SearchQuerySet + +from super_archives.models import EmailAddress, Message +from search.utils import trans +#from proxy.trac.models import WikiCollabCount, TicketCollabCount +from .forms import (UserCreationForm, ListsForm, UserUpdateForm, + ChangeXMPPPasswordForm) +from .errors import XMPPChangePwdException +from .utils import mailman + + +class UserProfileBaseMixin(object): + model = get_user_model() + slug_field = 'username' + slug_url_kwarg = 'username' + context_object_name = 'user_' + + +class UserProfileUpdateView(UserProfileBaseMixin, UpdateView): + template_name = 'accounts/user_update_form.html' + form_class = UserUpdateForm + + def get_success_url(self): + return reverse('user_profile', kwargs={'username': self.object.username}) + + def get_object(self, *args, **kwargs): + obj = super(UserProfileUpdateView, self).get_object(*args, **kwargs) + if self.request.user != obj and not self.request.user.is_superuser: + raise PermissionDenied + + return obj + + +class UserProfileDetailView(UserProfileBaseMixin, DetailView): + template_name = 'accounts/user_detail.html' + + def get_context_data(self, **kwargs): + user = self.object + context = {} + + count_types = OrderedDict() + + fields_or_lookup = ( + {'collaborators__contains': user.username}, + {'fullname_and_username__contains': user.username}, + ) + + counter_class = {} + #{ + # 'wiki': WikiCollabCount, + # 'ticket': TicketCollabCount, + #} + + types = ['thread'] + #types.extend(['ticket', 'wiki', 'changeset', 'attachment']) + + messages = Message.objects.filter(from_address__user__pk=user.pk) + for type in types: + CounterClass = counter_class.get(type) + if CounterClass: + try: + counter = CounterClass.objects.get(author=user.username) + except CounterClass.DoesNotExist: + count_types[trans(type)] = 0 + else: + count_types[trans(type)] = counter.count + elif type == 'thread': + count_types[trans(type)] = messages.count() + else: + sqs = SearchQuerySet() + for filter_or in fields_or_lookup: + sqs = sqs.filter_or(type=type, **filter_or) + count_types[trans(type)] = sqs.count() + + context['type_count'] = count_types + + sqs = SearchQuerySet() + for filter_or in fields_or_lookup: + sqs = sqs.filter_or(**filter_or).exclude(type='thread') + + context['results'] = sqs.order_by('-modified', '-created')[:10] + + email_pks = [addr.pk for addr in user.emails.iterator()] + query = Message.objects.filter(from_address__in=email_pks) + query = query.order_by('-received_time') + context['emails'] = query[:10] + + count_by = 'thread__mailinglist__name' + context['list_activity'] = dict(messages.values_list(count_by)\ + .annotate(Count(count_by))\ + .order_by(count_by)) + + context.update(kwargs) + return super(UserProfileDetailView, self).get_context_data(**context) + + +def logoutColab(request): + response = logout(request, next_page='/') + response.delete_cookie('_redmine_session') + response.delete_cookie('_gitlab_session') + return response + + +def signup(request): + # If the request method is GET just return the form + if request.method == 'GET': + user_form = UserCreationForm() + lists_form = ListsForm() + return render(request, 'accounts/user_create_form.html', + {'user_form': user_form, 'lists_form': lists_form}) + + user_form = UserCreationForm(request.POST) + lists_form = ListsForm(request.POST) + + if not user_form.is_valid() or not lists_form.is_valid(): + return render(request, 'accounts/user_create_form.html', + {'user_form': user_form, 'lists_form': lists_form}) + + user = user_form.save() + + # Check if the user's email have been used previously + # in the mainling lists to link the user to old messages + email_addr, created = EmailAddress.objects.get_or_create(address=user.email) + if created: + email_addr.real_name = user.get_full_name() + + email_addr.user = user + email_addr.save() + + mailing_lists = lists_form.cleaned_data.get('lists') + mailman.update_subscription(user.email, mailing_lists) + + messages.success(request, _('Your profile has been created!')) + messages.warning(request, _('You must login to validated your profile. ' + 'Profiles not validated are deleted in 24h.')) + + return redirect('user_profile', username=user.username) + + +class ManageUserSubscriptionsView(UserProfileBaseMixin, DetailView): + http_method_names = [u'get', u'post'] + template_name = u'accounts/manage_subscriptions.html' + + def get_object(self, *args, **kwargs): + obj = super(ManageUserSubscriptionsView, self).get_object(*args, + **kwargs) + if self.request.user != obj and not self.request.user.is_superuser: + raise PermissionDenied + + return obj + + def post(self, request, *args, **kwargs): + user = self.get_object() + for email in user.emails.values_list('address', flat=True): + lists = self.request.POST.getlist(email) + user.update_subscription(email, lists) + + return redirect('user_profile', username=user.username) + + def get_context_data(self, **kwargs): + context = {} + context['membership'] = {} + + user = self.get_object() + emails = user.emails.values_list('address', flat=True) + all_lists = mailman.all_lists(description=True) + + for email in emails: + lists = [] + lists_for_address = mailman.address_lists(email) + for listname, description in all_lists: + if listname in lists_for_address: + checked = True + else: + checked = False + lists.append(( + {'listname': listname, 'description': description}, + checked + )) + + context['membership'].update({email: lists}) + + context.update(kwargs) + + return super(ManageUserSubscriptionsView, self).get_context_data(**context) + + +class ChangeXMPPPasswordView(UpdateView): + model = XMPPAccount + form_class = ChangeXMPPPasswordForm + fields = ['password', ] + template_name = 'accounts/change_password.html' + + def get_success_url(self): + return reverse('user_profile', kwargs={ + 'username': self.request.user.username + }) + + def get_object(self, queryset=None): + obj = get_object_or_404(XMPPAccount, user=self.request.user.pk) + self.old_password = obj.password + return obj + + def form_valid(self, form): + transaction.set_autocommit(False) + + response = super(ChangeXMPPPasswordView, self).form_valid(form) + + changed = xmpp.change_password( + self.object.jid, + self.old_password, + form.cleaned_data['password1'] + ) + + if not changed: + messages.error( + self.request, + _(u'Could not change your password. Please, try again later.') + ) + transaction.rollback() + return response + else: + transaction.commit() + + messages.success( + self.request, + _("You've changed your password successfully!") + ) + return response diff --git a/colab/api/__init__.py b/colab/api/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/api/__init__.py diff --git a/colab/api/resources.py b/colab/api/resources.py new file mode 100644 index 0000000..6a891ce --- /dev/null +++ b/colab/api/resources.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- + +from django.contrib.auth import get_user_model + +from tastypie import fields +from tastypie.constants import ALL_WITH_RELATIONS, ALL +from tastypie.resources import ModelResource + +from super_archives.models import Message, EmailAddress +#from proxy.trac.models import Revision, Ticket, Wiki + +User = get_user_model() + + +class UserResource(ModelResource): + class Meta: + queryset = User.objects.filter(is_active=True) + resource_name = 'user' + fields = ['username', 'institution', 'role', 'bio', 'first_name', + 'last_name', 'email'] + allowed_methods = ['get', ] + filtering = { + 'email': ('exact', ), + 'username': ALL, + 'institution': ALL, + 'role': ALL, + 'bio': ALL, + } + + def dehydrate_email(self, bundle): + return '' + + +class EmailAddressResource(ModelResource): + user = fields.ForeignKey(UserResource, 'user', full=False, null=True) + + class Meta: + queryset = EmailAddress.objects.all() + resource_name = 'emailaddress' + excludes = ['md5', ] + allowed_methods = ['get', ] + filtering = { + 'address': ('exact', ), + 'user': ALL_WITH_RELATIONS, + 'real_name': ALL, + } + + def dehydrate_address(self, bundle): + return '' + + +class MessageResource(ModelResource): + from_address = fields.ForeignKey(EmailAddressResource, 'from_address', + full=False) + + class Meta: + queryset = Message.objects.all() + resource_name = 'message' + excludes = ['spam', 'subject_clean', 'message_id'] + filtering = { + 'from_address': ALL_WITH_RELATIONS, + 'subject': ALL, + 'body': ALL, + 'received_time': ALL, + } + + +#class RevisionResource(ModelResource): +# class Meta: +# queryset = Revision.objects.all() +# resource_name = 'revision' +# excludes = ['collaborators', ] +# filtering = { +# 'key': ALL, +# 'rev': ALL, +# 'author': ALL, +# 'message': ALL, +# 'repository_name': ALL, +# 'created': ALL, +# } +# +# +#class TicketResource(ModelResource): +# class Meta: +# queryset = Ticket.objects.all() +# resource_name = 'ticket' +# excludes = ['collaborators', ] +# filtering = { +# 'id': ALL, +# 'summary': ALL, +# 'description': ALL, +# 'milestone': ALL, +# 'priority': ALL, +# 'component': ALL, +# 'version': ALL, +# 'severity': ALL, +# 'reporter': ALL, +# 'author': ALL, +# 'status': ALL, +# 'keywords': ALL, +# 'created': ALL, +# 'modified': ALL, +# 'modified_by': ALL, +# } +# +# +#class WikiResource(ModelResource): +# class Meta: +# queryset = Wiki.objects.all() +# resource_name = 'wiki' +# excludes = ['collaborators', ] +# filtering = { +# 'name': ALL, +# 'wiki_text': ALL, +# 'author': ALL, +# 'name': ALL, +# 'created': ALL, +# 'modified': ALL, +# 'modified_by': ALL, +# } diff --git a/colab/api/urls.py b/colab/api/urls.py new file mode 100644 index 0000000..4e0b29c --- /dev/null +++ b/colab/api/urls.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- + +from django.conf.urls import patterns, include, url + +from tastypie.api import Api + +from .resources import (UserResource, EmailAddressResource, MessageResource) +from .views import VoteView + + +api = Api(api_name='v1') +api.register(UserResource()) +api.register(EmailAddressResource()) +api.register(MessageResource()) + + +urlpatterns = patterns('', + url(r'message/(?P\d+)/vote$', VoteView.as_view()), + + # tastypie urls + url(r'', include(api.urls)), +) diff --git a/colab/api/views.py b/colab/api/views.py new file mode 100644 index 0000000..d92b4f8 --- /dev/null +++ b/colab/api/views.py @@ -0,0 +1,45 @@ + +from django import http +from django.db import IntegrityError +from django.views.generic import View +from django.core.exceptions import ObjectDoesNotExist + + +from super_archives.models import Message + + +class VoteView(View): + + http_method_names = [u'get', u'put', u'delete', u'head'] + + def put(self, request, msg_id): + if not request.user.is_authenticated(): + return http.HttpResponseForbidden() + + try: + Message.objects.get(id=msg_id).vote(request.user) + except IntegrityError: + # 409 Conflict + # used for duplicated entries + return http.HttpResponse(status=409) + + # 201 Created + return http.HttpResponse(status=201) + + def get(self, request, msg_id): + votes = Message.objects.get(id=msg_id).votes_count() + return http.HttpResponse(votes, content_type='application/json') + + def delete(self, request, msg_id): + if not request.user.is_authenticated(): + return http.HttpResponseForbidden() + + try: + Message.objects.get(id=msg_id).unvote(request.user) + except ObjectDoesNotExist: + return http.HttpResponseGone() + + # 204 No Content + # empty body, as per RFC2616. + # object deleted + return http.HttpResponse(status=204) diff --git a/colab/badger/__init__.py b/colab/badger/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/badger/__init__.py diff --git a/colab/badger/admin.py b/colab/badger/admin.py new file mode 100644 index 0000000..c0d0b0d --- /dev/null +++ b/colab/badger/admin.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ + +from .forms import BadgeForm +from .models import Badge, BadgeI18N + + +class BadgeI18NInline(admin.TabularInline): + model = BadgeI18N + + +class BadgeAdmin(admin.ModelAdmin): + form = BadgeForm + inlines = [BadgeI18NInline, ] + list_display = ['title', 'description', 'order'] + list_editable = ['order', ] + + +admin.site.register(Badge, BadgeAdmin) diff --git a/colab/badger/forms.py b/colab/badger/forms.py new file mode 100644 index 0000000..f5c6125 --- /dev/null +++ b/colab/badger/forms.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +import base64 + +from django import forms +from django.utils.translation import ugettext_lazy as _ + +from PIL import Image + +from .models import Badge + +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + + +class BadgeForm(forms.ModelForm): + image = forms.ImageField(label=_(u'Image'), required=False) + + class Meta: + model = Badge + fields = ( + 'title', 'description', 'image', 'user_attr', 'comparison', + 'value', 'awardees' + ) + + def clean_image(self): + if not self.instance.pk and not self.cleaned_data['image']: + raise forms.ValidationError(_(u'You must add an Image')) + return self.cleaned_data['image'] + + def save(self, commit=True): + + instance = super(BadgeForm, self).save(commit=False) + + if self.cleaned_data['image']: + img = Image.open(self.cleaned_data['image']) + img = img.resize((50, 50), Image.ANTIALIAS) + f = StringIO() + img.save(f, 'png') + instance.image_base64 = f.getvalue().encode('base64') + f.close() + + if commit: + instance.save() + + return instance diff --git a/colab/badger/management/__init__.py b/colab/badger/management/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/badger/management/__init__.py diff --git a/colab/badger/management/commands/__init__.py b/colab/badger/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/badger/management/commands/__init__.py diff --git a/colab/badger/management/commands/rebuild_badges.py b/colab/badger/management/commands/rebuild_badges.py new file mode 100644 index 0000000..5cbb813 --- /dev/null +++ b/colab/badger/management/commands/rebuild_badges.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +from django.core.management.base import BaseCommand, CommandError +from haystack.query import SearchQuerySet + +from accounts.models import User +from badger.models import Badge + + +class Command(BaseCommand): + help = "Rebuild the user's badges." + + def handle(self, *args, **kwargs): + for badge in Badge.objects.filter(type='auto'): + if not badge.comparison: + continue + elif badge.comparison == 'biggest': + order = u'-{}'.format(Badge.USER_ATTR_OPTS[badge.user_attr]) + sqs = SearchQuerySet().filter(type='user') + user = sqs.order_by(order)[0] + badge.awardees.remove(*list(badge.awardees.all())) + badge.awardees.add(User.objects.get(pk=user.pk)) + continue + + comparison = u'__{}'.format(badge.comparison) if badge.comparison \ + is not 'equal' else u'' + + key = u'{}{}'.format( + Badge.USER_ATTR_OPTS[badge.user_attr], + comparison + ) + opts = {key: badge.value} + + sqs = SearchQuerySet().filter( + type='user', + **opts + ) + + # Remove all awardees to make sure that all of then + # still accomplish the necessary to keep the badge + badge.awardees.remove(*list(badge.awardees.all())) + + for user in sqs: + badge.awardees.add(User.objects.get(pk=user.pk)) diff --git a/colab/badger/management/commands/update_badges.py b/colab/badger/management/commands/update_badges.py new file mode 100644 index 0000000..7c59a44 --- /dev/null +++ b/colab/badger/management/commands/update_badges.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +from django.core.management.base import BaseCommand, CommandError +from haystack.query import SearchQuerySet + +from accounts.models import User +from badger.models import Badge + +import logging + +class Command(BaseCommand): + help = "Update the user's badges" + + def update_badges(self): + for badge in Badge.objects.filter(type='auto'): + if not badge.comparison: + continue + elif badge.comparison == 'biggest': + order = u'-{}'.format(Badge.USER_ATTR_OPTS[badge.user_attr]) + sqs = SearchQuerySet().filter(type='user') + user = sqs.order_by(order)[0] + badge.awardees.add(User.objects.get(pk=user.pk)) + continue + + comparison = u'__{}'.format(badge.comparison) if badge.comparison \ + is not 'equal' else u'' + + key = u'{}{}'.format( + Badge.USER_ATTR_OPTS[badge.user_attr], + comparison + ) + opts = {key: badge.value} + + sqs = SearchQuerySet().filter(type='user', **opts) + + for user in sqs: + badge.awardees.add(User.objects.get(pk=user.pk)) + + def handle(self, *args, **kwargs): + try: + self.update_badges() + except Exception as e: + logging.exception(e) + raise diff --git a/colab/badger/migrations/0001_initial.py b/colab/badger/migrations/0001_initial.py new file mode 100644 index 0000000..2909a1a --- /dev/null +++ b/colab/badger/migrations/0001_initial.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Badge', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=200, null=True, verbose_name='Title', blank=True)), + ('description', models.CharField(max_length=200, null=True, verbose_name='Description', blank=True)), + ('image_base64', models.TextField(verbose_name='Image')), + ('type', models.CharField(max_length=200, verbose_name='Type', choices=[('auto', 'Automatically'), ('manual', 'Manual')])), + ('user_attr', models.CharField(blank=True, max_length=100, null=True, verbose_name='User attribute', choices=[('messages', 'Messages'), ('contributions', 'Contributions'), ('wikis', 'Wikis'), ('revisions', 'Revisions'), ('tickets', 'Ticket')])), + ('comparison', models.CharField(blank=True, max_length=10, null=True, verbose_name='Comparison', choices=[('gte', 'Greater than or equal'), ('lte', 'less than or equal'), ('equal', 'Equal'), ('biggest', 'Biggest')])), + ('value', models.PositiveSmallIntegerField(null=True, verbose_name='Value', blank=True)), + ('order', models.PositiveSmallIntegerField(default=100, verbose_name='Order')), + ('awardees', models.ManyToManyField(to=settings.AUTH_USER_MODEL, null=True, verbose_name='Awardees', blank=True)), + ], + options={ + 'ordering': ['order'], + 'verbose_name': 'Badge', + 'verbose_name_plural': 'Badges', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='BadgeI18N', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('i18n_language', models.CharField(max_length=10, verbose_name='language', choices=[(b'pt-br', 'Portuguese'), (b'es', 'Spanish')])), + ('title', models.CharField(max_length=200, null=True, verbose_name='Title', blank=True)), + ('description', models.CharField(max_length=200, null=True, verbose_name='Description', blank=True)), + ('i18n_source', models.ForeignKey(related_name=b'translations', editable=False, to='badger.Badge', verbose_name='source')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='badgei18n', + unique_together=set([('i18n_source', 'i18n_language')]), + ), + ] diff --git a/colab/badger/migrations/__init__.py b/colab/badger/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/badger/migrations/__init__.py diff --git a/colab/badger/models.py b/colab/badger/models.py new file mode 100644 index 0000000..b5b72bf --- /dev/null +++ b/colab/badger/models.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- + +from django.conf import settings +from django.db import models +from django.utils.translation import ugettext_lazy as _ +from i18n_model.models import I18nModel + + +class Badge(models.Model): + COMPARISON_CHOICES = ( + (u'gte', _(u'Greater than or equal')), + (u'lte', _(u'less than or equal')), + (u'equal', _(u'Equal')), + (u'biggest', _(u'Biggest')), + ) + TYPE_CHOICES = ( + (u'auto', _(u'Automatically')), + (u'manual', _(u'Manual')), + ) + USER_ATTR_CHOICES = ( + (u'messages', _(u'Messages')), + (u'contributions', _(u'Contributions')), + (u'wikis', _(u'Wikis')), + (u'revisions', _(u'Revisions')), + (u'tickets', _(u'Ticket')), + ) + USER_ATTR_OPTS = { + u'messages': u'message_count', + u'revisions': u'changeset_count', + u'tickets': u'ticket_count', + u'wikis': u'wiki_count', + u'contributions': u'contribution_count', + } + + title = models.CharField(_(u'Title'), max_length=200, blank=True, + null=True) + description = models.CharField(_(u'Description'), max_length=200, + blank=True, null=True) + image_base64 = models.TextField(_(u'Image')) + type = models.CharField(_(u'Type'), max_length=200, choices=TYPE_CHOICES) + user_attr = models.CharField( + _(u'User attribute'),max_length=100, + choices=USER_ATTR_CHOICES, + blank=True, + null=True, + ) + comparison = models.CharField( + _(u'Comparison'), + max_length=10, + choices=COMPARISON_CHOICES, + blank=True, + null=True + ) + value = models.PositiveSmallIntegerField( + _(u'Value'), + blank=True, + null=True + ) + awardees = models.ManyToManyField( + settings.AUTH_USER_MODEL, + verbose_name=_(u'Awardees'), + blank=True, + null=True + ) + order = models.PositiveSmallIntegerField(_(u'Order'), default=100) + + class Meta: + verbose_name = _(u'Badge') + verbose_name_plural = _(u'Badges') + ordering = ['order', ] + + def __unicode__(self): + return u'{} ({}, {})'.format( + self.title, + self.get_user_attr_display(), + self.get_type_display(), + ) + + +class BadgeI18N(I18nModel): + class Meta: + source_model = Badge + translation_fields = ('title', 'description') diff --git a/colab/badger/tests.py b/colab/badger/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/colab/badger/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/colab/badger/utils.py b/colab/badger/utils.py new file mode 100644 index 0000000..cee5db9 --- /dev/null +++ b/colab/badger/utils.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- + +from django.db.models import Count + +#from proxy.trac.models import (Revision, Ticket, Wiki, +# WikiCollabCount, TicketCollabCount) +from accounts.models import User + + +def get_wiki_counters(): + return {author: count for author, count in + WikiCollabCount.objects.values_list()} + + +def get_revision_counters(): + return { + author: count for author, count in Revision.objects.values_list( + 'author' + ).annotate(count=Count('author')) + } + + +def get_ticket_counters(): + return {author: count for author, count in + TicketCollabCount.objects.values_list()} + + +def get_users_counters(): + wiki_counters = get_wiki_counters() + revision_counters = get_revision_counters() + ticket_counters = get_ticket_counters() + + users_counters = {} + for user in User.objects.annotate(message_count=Count('emails__message')): + users_counters[user.username] = { + 'messages': user.message_count, + 'wikis': wiki_counters.get(user.username, 0), + 'revisions': revision_counters.get(user.username, 0), + 'tickets': ticket_counters.get(user.username, 0), + } + return users_counters diff --git a/colab/badger/views.py b/colab/badger/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/colab/badger/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/colab/colab/__init__.py b/colab/colab/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/colab/__init__.py diff --git a/colab/colab/colab.template.yaml b/colab/colab/colab.template.yaml new file mode 100644 index 0000000..13dbaaa --- /dev/null +++ b/colab/colab/colab.template.yaml @@ -0,0 +1,53 @@ + +DEBUG: false +TEMPLATE_DEBUG: false + +ADMINS: &admin + - + - John Foo + - john@example.com + - + - Mary Bar + - mary@example.com + +MANAGERS: *admin + +COLAB_FROM_ADDRESS: '"Colab" ' +SERVER_EMAIL: '"Colab" ' + +EMAIL_HOST: localhost +EMAIL_PORT: 25 +EMAIL_SUBJECT_PREFIX: '[colab]' + +SECRET_KEY: '{{ secret_key }}' + +SITE_URL: 'http://www.example.com/' + +ALLOWED_HOSTS: + - example.com + - example.org + - example.net + +CONVERSEJS_ENABLED: false + +CONVERSEJS_AUTO_REGISTER: 'xmpp.example.com' + +DATABASES: + default: + ENGINE: django.db.backends.postgresql_psycopg2 + HOST: localhost + NAME: colab + USER: colab + PASSWORD: colab + +ROBOTS_NOINDEX: false + +# Set to false to disable +RAVEN_DSN: 'http://public:secret@example.com/1' + +PROXIED_APPS: + gitlab: + upstream: 'http://localhost:8090/gitlab/' + trac: + upstream: 'http://localhost:5000/trac/' + diff --git a/colab/colab/settings.py b/colab/colab/settings.py new file mode 100644 index 0000000..ff14541 --- /dev/null +++ b/colab/colab/settings.py @@ -0,0 +1,315 @@ +""" +Django settings for colab project. + +For more information on this file, see +https://docs.djangoproject.com/en/1.7/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.7/ref/settings/ +""" + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +import os +BASE_DIR = os.path.dirname(os.path.dirname(__file__)) + +# Used for settings translation +from django.utils.translation import ugettext_lazy as _ + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = "{{ secret_key }}" + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +TEMPLATE_DEBUG = True + +ALLOWED_HOSTS = [] + +DATABASE_ROUTERS = [] + +# Application definition + +INSTALLED_APPS = ( + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + + # First app to provide AUTH_USER_MODEL to others + 'accounts', + + # Not standard apps + 'raven.contrib.django.raven_compat', + 'cliauth', + 'django_mobile', + 'django_browserid', + 'conversejs', + 'haystack', + 'hitcounter', + 'i18n_model', + 'mptt', + 'dpaste', + + # Own apps + 'super_archives', + 'api', + 'rss', + 'planet', + 'search', + 'badger', + 'tz', + + # Feedzilla and deps + 'feedzilla', + 'taggit', + 'common', +) + +MIDDLEWARE_CLASSES = ( + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +) + +ROOT_URLCONF = 'colab.urls' + +WSGI_APPLICATION = 'colab.wsgi.application' + +# Internationalization +# https://docs.djangoproject.com/en/1.7/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.7/howto/static-files/ + +STATIC_ROOT = '/usr/share/nginx/colab/static/' +MEDIA_ROOT = '/usr/share/nginx/colab/media/' + +STATIC_URL = '/static/' +MEDIA_URL = '/media/' + + +# Normally you should not import ANYTHING from Django directly +# into your settings, but ImproperlyConfigured is an exception. +from django.core.exceptions import ImproperlyConfigured + + +def get_env_setting(setting): + """ Get the environment setting or return exception """ + try: + return os.environ[setting] + except KeyError: + error_msg = "Set the %s env variable" % setting + raise ImproperlyConfigured(error_msg) + + +# Allow Django runserver to serve SVG files +# https://code.djangoproject.com/ticket/20162 +import mimetypes +mimetypes.add_type('image/svg+xml', '.svg') + +LANGUAGES = ( + ('en', _('English')), + ('pt-br', _('Portuguese')), + ('es', _('Spanish')), +) + +DJANGO_DATE_FORMAT_TO_JS = { + 'pt-br': ('pt-BR', 'dd/MM/yyyy'), + 'es': ('es', 'dd/MM/yyyy'), +} + +LANGUAGE_CODE = 'en' + +# The absolute path to the folder containing the attachments +ATTACHMENTS_FOLDER_PATH = '/mnt/trac/attachments/' + +# ORDERING_DATA receives the options to order for as it's keys and a dict as +# value, if you want to order for the last name, you can use something like: +# 'last_name': {'name': 'Last Name', 'fields': 'last_name'} inside the dict, +# you pass two major keys (name, fields) +# The major key name is the name to appear on the template +# the major key fields it show receive the name of the fields to order for in +# the indexes + +ORDERING_DATA = { + 'latest': { + 'name': _(u'Recent activity'), + 'fields': ('-modified', '-created'), + }, + 'hottest': { + 'name': _(u'Relevance'), + 'fields': None, + }, +} + + +# File type groupings is a tuple of tuples containg what it should filter, +# how it should be displayed, and a tuple of which mimetypes it includes +FILE_TYPE_GROUPINGS = ( + ('document', _(u'Document'), + ('doc', 'docx', 'odt', 'otx', 'dotx', 'pdf', 'ott')), + ('presentation', _(u'Presentation'), ('ppt', 'pptx', 'odp')), + ('text', _(u'Text'), ('txt', 'po', 'conf', 'log')), + ('code', _(u'Code'), + ('py', 'php', 'js', 'sql', 'sh', 'patch', 'diff', 'html', '')), + ('compressed', _(u'Compressed'), ('rar', 'zip', 'gz', 'tgz', 'bz2')), + ('image', _(u'Image'), + ('jpg', 'jpeg', 'png', 'tiff', 'gif', 'svg', 'psd', 'planner', 'cdr')), + ('spreadsheet', _(u'Spreadsheet'), + ('ods', 'xls', 'xlsx', 'xslt', 'csv')), +) + +# the following variable define how many characters should be shown before +# a highlighted word, to make sure that the highlighted word will appear +HIGHLIGHT_NUM_CHARS_BEFORE_MATCH = 30 +HAYSTACK_CUSTOM_HIGHLIGHTER = 'colab.utils.highlighting.ColabHighlighter' + +HAYSTACK_CONNECTIONS = { + 'default': { + 'ENGINE': 'haystack.backends.solr_backend.SolrEngine', + 'URL': 'http://localhost:8983/solr/', + } +} + +CACHES = { + 'default': { + 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', + 'LOCATION': '127.0.0.1:11211', + } +} + +DATABASE_ROUTERS = [] + + +TEMPLATE_CONTEXT_PROCESSORS = ( + 'django.contrib.auth.context_processors.auth', + 'django.core.context_processors.debug', + 'django.core.context_processors.i18n', + 'django.core.context_processors.media', + 'django.core.context_processors.static', + 'django.core.context_processors.tz', + 'django.contrib.messages.context_processors.messages', + 'django.core.context_processors.request', + 'django_mobile.context_processors.is_mobile', + 'super_archives.context_processors.mailarchive', + 'proxy.context_processors.proxied_apps', + 'home.context_processors.robots', +) + +MIDDLEWARE_CLASSES = ( + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.locale.LocaleMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django_mobile.middleware.MobileDetectionMiddleware', + 'django_mobile.middleware.SetFlavourMiddleware', + 'tz.middleware.TimezoneMiddleware', +) + +# Add the django_browserid authentication backend. +AUTHENTICATION_BACKENDS = ( + 'django.contrib.auth.backends.ModelBackend', + 'accounts.auth.ColabBrowserIDBackend', +) + +STATICFILES_DIRS = ( + os.path.join(BASE_DIR, 'static'), +) + +TEMPLATE_DIRS = ( + os.path.join(BASE_DIR, 'templates'), +) + +LOCALE_PATHS = ( + os.path.join(BASE_DIR, 'locale'), +) + +AUTH_USER_MODEL = 'accounts.User' + +from django.contrib.messages import constants as messages +MESSAGE_TAGS = { + messages.INFO: 'alert-info', + messages.SUCCESS: 'alert-success', + messages.WARNING: 'alert-warning', + messages.ERROR: 'alert-danger', +} + +### Feedzilla (planet) +from feedzilla.settings import * +FEEDZILLA_PAGE_SIZE = 5 +FEEDZILLA_SITE_TITLE = _(u'Planet Colab') +FEEDZILLA_SITE_DESCRIPTION = _(u'Colab blog aggregator') + +### Mailman API settings +MAILMAN_API_URL = 'http://localhost:9000' + +### BrowserID / Persona +SITE_URL = 'localhost:8000' +BROWSERID_AUDIENCES = [SITE_URL, SITE_URL.replace('https', 'http')] + + +LOGIN_URL = '/' +LOGIN_REDIRECT_URL = '/' +LOGIN_REDIRECT_URL_FAILURE = '/' +LOGOUT_REDIRECT_URL = '/user/logout' +BROWSERID_CREATE_USER = False + +REVPROXY_ADD_REMOTE_USER = True + +## Converse.js settings +# This URL must use SSL in order to keep chat sessions secure +CONVERSEJS_BOSH_SERVICE_URL = SITE_URL + '/http-bind' + +CONVERSEJS_ALLOW_CONTACT_REQUESTS = False +CONVERSEJS_SHOW_ONLY_ONLINE_USERS = True + + +# Tastypie settings +TASTYPIE_DEFAULT_FORMATS = ['json', ] + +# Dpaste settings +DPASTE_EXPIRE_CHOICES = ( + ('onetime', _(u'One Time Snippet')), + (3600, _(u'In one hour')), + (3600 * 24 * 7, _(u'In one week')), + (3600 * 24 * 30, _(u'In one month')), + ('never', _(u'Never')), +) +DPASTE_EXPIRE_DEFAULT = DPASTE_EXPIRE_CHOICES[4][0] +DPASTE_DEFAULT_GIST_DESCRIPTION = 'Gist created from Colab DPaste' +DPASTE_DEFAULT_GIST_NAME = 'colab_paste' +DPASTE_LEXER_DEFAULT = 'text' + +from .utils.conf import load_yaml_settings +locals().update(load_yaml_settings()) + +if locals().get('RAVEN_DSN', False): + RAVEN_CONFIG = { + 'dsn': RAVEN_DSN + '?timeout=30', + } + +for app_label in locals().get('PROXIED_APPS', {}).keys(): + INSTALLED_APPS += ('proxy.{}'.format(app_label),) diff --git a/colab/colab/urls.py b/colab/colab/urls.py new file mode 100644 index 0000000..6d175c6 --- /dev/null +++ b/colab/colab/urls.py @@ -0,0 +1,45 @@ +from django.conf.urls import patterns, include, url, static +from django.conf import settings +from django.views.generic import TemplateView +from django.contrib import admin + +from accounts.models import User +from search.forms import ColabSearchForm +from super_archives.models import Message + + +admin.autodiscover() + +urlpatterns = patterns('', + url(r'^$', 'home.views.index', name='home'), + url(r'^robots.txt$', 'home.views.robots', name='robots'), + + url(r'^open-data/$', TemplateView.as_view(template_name='open-data.html'), + name='opendata'), + + url(r'^search/', include('search.urls')), + url(r'^archives/', include('super_archives.urls')), + url(r'^api/', include('api.urls')), + url(r'^rss/', include('rss.urls')), + + url(r'^user/', include('accounts.urls')), # Kept for backwards compatibility + url(r'^signup/', include('accounts.urls')), # (same here) TODO: move to nginx + url(r'^account/', include('accounts.urls')), + + url(r'', include('django_browserid.urls')), + + url(r'^planet/', include('feedzilla.urls')), + + url(r'paste/', include('dpaste.urls.dpaste')), + + # Uncomment the next line to enable the admin: + url(r'^colab/admin/', include(admin.site.urls)), + + url(r'^trac/', include('proxy.trac.urls')), +) + +if settings.DEBUG: + urlpatterns += static.static( + settings.MEDIA_URL, + document_root=settings.MEDIA_ROOT + ) diff --git a/colab/colab/utils/__init__.py b/colab/colab/utils/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/colab/utils/__init__.py diff --git a/colab/colab/utils/conf.py b/colab/colab/utils/conf.py new file mode 100644 index 0000000..b73904a --- /dev/null +++ b/colab/colab/utils/conf.py @@ -0,0 +1,32 @@ + +import os +import yaml + +from django.core.exceptions import ImproperlyConfigured + + +class InaccessibleYAMLSettings(ImproperlyConfigured): + """Settings YAML is Inaccessible. + + Check if the file exists and if you have read permissions.""" + + +def load_yaml_settings(): + yaml_path = os.getenv('COLAB_SETTINGS', '/etc/colab.yaml') + + if not os.path.exists(yaml_path): + msg = "The yaml file {} does not exist".format(yaml_path) + raise InaccessibleYAMLSettings(msg) + + try: + with open(yaml_path) as yaml_file: + yaml_settings = yaml.load(yaml_file.read()) + except IOError: + msg = ('Could not open settings file {}. Please ' + 'check if the file exists and if user ' + 'has read rights.').format(yaml_path) + raise InaccessibleYAMLSettings(msg) + + return yaml_settings + +yaml_settings = load_yaml_settings() diff --git a/colab/colab/utils/highlighting.py b/colab/colab/utils/highlighting.py new file mode 100644 index 0000000..8f41b7c --- /dev/null +++ b/colab/colab/utils/highlighting.py @@ -0,0 +1,38 @@ +from haystack.utils import Highlighter +from django.conf import settings +from django.utils.html import escape, strip_tags + + +class ColabHighlighter(Highlighter): + def highlight(self, text_block): + self.text_block = escape(strip_tags(text_block)) + highlight_locations = self.find_highlightable_words() + start_offset, end_offset = self.find_window(highlight_locations) + return self.render_html(highlight_locations, start_offset, end_offset) + + def find_window(self, highlight_locations): + """Getting the HIGHLIGHT_NUM_CHARS_BEFORE_MATCH setting + to find how many characters before the first word found should + be removed from the window + """ + + if len(self.text_block) <= self.max_length: + return (0, self.max_length) + + num_chars_before = getattr( + settings, + 'HIGHLIGHT_NUM_CHARS_BEFORE_MATCH', + 0 + ) + + best_start, best_end = super(ColabHighlighter, self).find_window( + highlight_locations + ) + if best_start <= num_chars_before: + best_end -= best_start + best_start = 0 + else: + best_start -= num_chars_before + best_end -= num_chars_before + + return (best_start, best_end) diff --git a/colab/colab/wsgi.py b/colab/colab/wsgi.py new file mode 100644 index 0000000..02679ab --- /dev/null +++ b/colab/colab/wsgi.py @@ -0,0 +1,14 @@ +""" +WSGI config for colab project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/ +""" + +import os +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "colab.settings") + +from django.core.wsgi import get_wsgi_application +application = get_wsgi_application() diff --git a/colab/home/__init__.py b/colab/home/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/home/__init__.py diff --git a/colab/home/admin.py b/colab/home/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/colab/home/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/colab/home/context_processors.py b/colab/home/context_processors.py new file mode 100644 index 0000000..7cdb531 --- /dev/null +++ b/colab/home/context_processors.py @@ -0,0 +1,4 @@ +from django.conf import settings + +def robots(request): + return {'ROBOTS_NOINDEX': getattr(settings, 'ROBOTS_NOINDEX', False)} diff --git a/colab/home/models.py b/colab/home/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/colab/home/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/colab/home/tests.py b/colab/home/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/colab/home/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/colab/home/views.py b/colab/home/views.py new file mode 100644 index 0000000..607f756 --- /dev/null +++ b/colab/home/views.py @@ -0,0 +1,65 @@ + +from collections import OrderedDict + +from django.conf import settings +from django.core.cache import cache +from django.shortcuts import render +from django.http import HttpResponse, Http404 + +from search.utils import trans +from haystack.query import SearchQuerySet + +#from proxy.trac.models import WikiCollabCount, TicketCollabCount +from super_archives.models import Thread + + +def index(request): + """Index page view""" + + + latest_threads = Thread.objects.all()[:6] + hottest_threads = Thread.highest_score.from_haystack()[:6] + + count_types = cache.get('home_chart') + if count_types is None: + count_types = OrderedDict() + count_types['thread'] = SearchQuerySet().filter( + type='thread', + ).count() + # TODO: this section should be inside trac app and only use it here + #if settings.TRAC_ENABLED: + # for type in ['changeset', 'attachment']: + # count_types[type] = SearchQuerySet().filter( + # type=type, + # ).count() + + # count_types['ticket'] = sum([ + # ticket.count for ticket in TicketCollabCount.objects.all() + # ]) + + # count_types['wiki'] = sum([ + # wiki.count for wiki in WikiCollabCount.objects.all() + # ]) + + cache.set('home_chart', count_types) + + for key in count_types.keys(): + count_types[trans(key)] = count_types.pop(key) + + context = { + 'hottest_threads': hottest_threads[:6], + 'latest_threads': latest_threads, + 'type_count': count_types, + 'latest_results': SearchQuerySet().all().order_by( + '-modified', '-created' + )[:6], + } + return render(request, 'home.html', context) + + +def robots(request): + if getattr(settings, 'ROBOTS_NOINDEX', False): + return HttpResponse('User-agent: *\nDisallow: /', + content_type='text/plain') + + raise Http404 diff --git a/colab/locale/pt_BR/LC_MESSAGES/django.mo b/colab/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ade8834 Binary files /dev/null and b/colab/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/colab/locale/pt_BR/LC_MESSAGES/django.po b/colab/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 0000000..0070732 --- /dev/null +++ b/colab/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,1540 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-07 12:49+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: accounts/admin.py:40 +msgid "Personal info" +msgstr "Informações Pessoais" + +#: accounts/admin.py:43 +msgid "Permissions" +msgstr "Permissões" + +#: accounts/admin.py:45 +msgid "Important dates" +msgstr "Datas importantes" + +#: accounts/forms.py:25 +msgid "Social account does not exist" +msgstr "Conta social não existe" + +#: accounts/forms.py:56 accounts/templates/accounts/user_detail.html:38 +msgid "Bio" +msgstr "Bio" + +#: accounts/forms.py:57 +msgid "Write something about you in 200 characters or less." +msgstr "Escreva algo sobre você em 200 caracteres ou menos." + +#: accounts/forms.py:76 +msgid "Mailing lists" +msgstr "Listas de e-mail" + +#: accounts/forms.py:83 +msgid "Password" +msgstr "Senha" + +#: accounts/forms.py:85 +msgid "Password confirmation" +msgstr "Confirmação de senha" + +#: accounts/forms.py:87 +msgid "Enter the same password as above, for verification." +msgstr "Digite a mesma senha que acima, para verificação." + +#: accounts/forms.py:105 +msgid "Password mismatch" +msgstr "Senhas diferentes" + +#: accounts/models.py:59 +msgid "Required. 30 characters or fewer. Letters, digits and ./+/-/_ only." +msgstr "" +"Obrigatório. 30 caracteres ou menos. Letras, números e ./+/-/_ somente." + +#: accounts/models.py:64 +msgid "Enter a valid username." +msgstr "Insira um nome de usuário válido." + +#: accounts/views.py:144 +msgid "Your profile has been created!" +msgstr "Seu perfil foi criado!" + +#: accounts/views.py:145 +msgid "" +"You must login to validated your profile. Profiles not validated are deleted " +"in 24h." +msgstr "" +"Você deve se logar para validar seu perfil. Perfis não validados serão " +"deletados em 24h." + +#: accounts/views.py:229 +msgid "Could not change your password. Please, try again later." +msgstr "" +"Não conseguimos alterar sua senha. Por favor, tente novamente mais tarde." + +#: accounts/views.py:238 +msgid "You've changed your password successfully!" +msgstr "Senha alterada com sucesso!" + +#: accounts/management/commands/delete_invalid.py:42 +#, python-format +msgid "%(count)s users deleted." +msgstr "%(count)s usuários deletados." + +#: accounts/templates/accounts/change_password.html:8 +msgid "Change XMPP Client and SVN Password" +msgstr "Trocar senha do Repositório e do Mensageiro" + +#: accounts/templates/accounts/change_password.html:17 +#: accounts/templates/accounts/user_update_form.html:195 +msgid "Change Password" +msgstr "Trocar senha" + +#: accounts/templates/accounts/manage_subscriptions.html:6 +msgid "Group Subscriptions" +msgstr "Inscrições em grupos" + +#: accounts/templates/accounts/manage_subscriptions.html:36 +msgid "Update subscriptions" +msgstr "Atualizar inscrições" + +#: accounts/templates/accounts/user_create_form.html:5 +msgid "Sign up" +msgstr "Cadastrar" + +#: accounts/templates/accounts/user_create_form.html:10 +msgid "Please correct the errors below and try again" +msgstr "Por favor, corrija os erros abaixo e tente novamente" + +#: accounts/templates/accounts/user_create_form.html:17 +msgid "Required fields" +msgstr "Campos obrigatórios" + +#: accounts/templates/accounts/user_create_form.html:29 +msgid "Personal Information" +msgstr "Informações pessoais" + +#: accounts/templates/accounts/user_create_form.html:46 +msgid "Subscribe to groups" +msgstr "Inscreva-se nos grupos" + +#: accounts/templates/accounts/user_create_form.html:60 +#: templates/base.html:106 templates/base.html.py:111 +msgid "Register" +msgstr "Cadastre-se" + +#: accounts/templates/accounts/user_detail.html:8 badger/models.py:22 +#: super_archives/models.py:258 +msgid "Messages" +msgstr "Mensagens" + +#: accounts/templates/accounts/user_detail.html:9 badger/models.py:23 +#: templates/home.html:7 +msgid "Contributions" +msgstr "Contribuições" + +#: accounts/templates/accounts/user_detail.html:29 +msgid "edit profile" +msgstr "editar perfil" + +#: accounts/templates/accounts/user_detail.html:30 +msgid "group membership" +msgstr "Inscrições nos grupos" + +#: accounts/templates/accounts/user_detail.html:65 +msgid "Twitter account" +msgstr "Conta Twitter" + +#: accounts/templates/accounts/user_detail.html:68 +msgid "Facebook account" +msgstr "Conta Facebook" + +#: accounts/templates/accounts/user_detail.html:73 +msgid "Google talk account" +msgstr "Conta Google" + +#: accounts/templates/accounts/user_detail.html:77 +msgid "Github account" +msgstr "Conta Github" + +#: accounts/templates/accounts/user_detail.html:81 +msgid "Personal webpage" +msgstr "Página web pessoal" + +#: accounts/templates/accounts/user_detail.html:87 +msgid "Groups: " +msgstr "Grupos: " + +#: accounts/templates/accounts/user_detail.html:100 +msgid "Collaborations by Type" +msgstr "Colaborações por tipo" + +#: accounts/templates/accounts/user_detail.html:116 +msgid "Participation by Group" +msgstr "Participação por grupo" + +#: accounts/templates/accounts/user_detail.html:132 badger/models.py:70 +msgid "Badges" +msgstr "Medalhas" + +#: accounts/templates/accounts/user_detail.html:151 +msgid "Latest posted" +msgstr "Últimas postagens" + +#: accounts/templates/accounts/user_detail.html:156 +msgid "There are no posts by this user so far." +msgstr "Não há posts deste usuário até agora." + +#: accounts/templates/accounts/user_detail.html:160 +msgid "View more posts..." +msgstr "Ver mais postagens..." + +#: accounts/templates/accounts/user_detail.html:166 +msgid "Latest contributions" +msgstr "Últimas colaborações" + +#: accounts/templates/accounts/user_detail.html:171 +msgid "No contributions of this user so far." +msgstr "Não há posts deste usuário até agora." + +#: accounts/templates/accounts/user_detail.html:175 +msgid "View more contributions..." +msgstr "Ver mais colaborações..." + +#: accounts/templates/accounts/user_update_form.html:65 +msgid "We sent a verification email to " +msgstr "Enviamos um email de verificação para " + +#: accounts/templates/accounts/user_update_form.html:66 +msgid "Please follow the instructions in it." +msgstr "Por favor, siga as instruções." + +#: accounts/templates/accounts/user_update_form.html:110 +msgid "profile information" +msgstr "informações do perfil" + +#: accounts/templates/accounts/user_update_form.html:115 +msgid "Change your avatar at Gravatar.com" +msgstr "Troque seu avatar em Gravatar.com" + +#: accounts/templates/accounts/user_update_form.html:142 search/utils.py:8 +msgid "Emails" +msgstr "E-mails" + +#: accounts/templates/accounts/user_update_form.html:151 +msgid "Primary" +msgstr "Primário" + +#: accounts/templates/accounts/user_update_form.html:154 +msgid "Setting..." +msgstr "Definindo..." + +#: accounts/templates/accounts/user_update_form.html:154 +msgid "Set as Primary" +msgstr "Definir como Primário" + +#: accounts/templates/accounts/user_update_form.html:155 +msgid "Deleting..." +msgstr "Deletando..." + +#: accounts/templates/accounts/user_update_form.html:155 +#: accounts/templates/accounts/user_update_form.html:167 +msgid "Delete" +msgstr "Apagar" + +#: accounts/templates/accounts/user_update_form.html:166 +msgid "Sending verification..." +msgstr "Enviando verificação..." + +#: accounts/templates/accounts/user_update_form.html:166 +msgid "Verify" +msgstr "Verificar" + +#: accounts/templates/accounts/user_update_form.html:174 +msgid "Add another email address:" +msgstr "Adicionar outro endereço de e-mail" + +#: accounts/templates/accounts/user_update_form.html:177 +msgid "Add" +msgstr "Adicionar" + +#: accounts/templates/accounts/user_update_form.html:193 +msgid "" +"This feature is available only for those who need to change the password for some " +"reason as having an old user with the same username, forgot your password to " +"commit, usage of other XMPP Client for connection. Usually, you won't need " +"to change this password. Only change it if you are sure about what you are " +"doing." +msgstr "" +"Este recurso está disponível para quem precisa trocar a senha por algum " +"motivo como ter um usuário antigo com mesmo nome de usuário, esqueceu da " +"senha antiga para commit, uso de outro cliente XMPP para conexão. " +"Normalmente, você não terá que trocar essa senha. Somente troque essa senha " +"se tiver certeza do que está fazendo." + +#: accounts/templates/accounts/user_update_form.html:203 +msgid "Update" +msgstr "Atualizar" + +#: badger/forms.py:19 badger/models.py:40 colab/custom_settings.py:53 +msgid "Image" +msgstr "Imagem" + +#: badger/forms.py:30 +msgid "You must add an Image" +msgstr "Você deve adicionar uma imagem" + +#: badger/models.py:12 +msgid "Greater than or equal" +msgstr "Maior que ou igual" + +#: badger/models.py:13 +msgid "less than or equal" +msgstr "menor que ou igual" + +#: badger/models.py:14 +msgid "Equal" +msgstr "Igual" + +#: badger/models.py:15 +msgid "Biggest" +msgstr "Maior" + +#: badger/models.py:18 +msgid "Automatically" +msgstr "Automaticamente" + +#: badger/models.py:19 +msgid "Manual" +msgstr "Manual" + +#: badger/models.py:24 +msgid "Wikis" +msgstr "Wikis" + +#: badger/models.py:25 +msgid "Revisions" +msgstr "Conjunto de mudanças" + +#: badger/models.py:26 search/views.py:42 +#: search/templates/search/includes/search_filters.html:124 +msgid "Ticket" +msgstr "Tíquetes" + +#: badger/models.py:36 +msgid "Title" +msgstr "Título" + +#: badger/models.py:38 +msgid "Description" +msgstr "Descrição" + +#: badger/models.py:41 search/forms.py:18 +msgid "Type" +msgstr "Tipo" + +#: badger/models.py:43 +msgid "User attribute" +msgstr "Atributo do usuário" + +#: badger/models.py:49 +msgid "Comparison" +msgstr "Comparação" + +#: badger/models.py:56 +msgid "Value" +msgstr "Valor" + +#: badger/models.py:62 +msgid "Awardees" +msgstr "Premiados" + +#: badger/models.py:66 +msgid "Order" +msgstr "Ordem" + +#: badger/models.py:69 +msgid "Badge" +msgstr "Medalha" + +#: colab/custom_settings.py:9 +msgid "English" +msgstr "Inglês" + +#: colab/custom_settings.py:10 +msgid "Portuguese" +msgstr "Português" + +#: colab/custom_settings.py:11 +msgid "Spanish" +msgstr "Espanhol" + +#: colab/custom_settings.py:34 +msgid "Recent activity" +msgstr "Atividade recente" + +#: colab/custom_settings.py:38 +msgid "Relevance" +msgstr "Relevância" + +#: colab/custom_settings.py:46 +msgid "Document" +msgstr "Documento" + +#: colab/custom_settings.py:48 +msgid "Presentation" +msgstr "Apresentação" + +#: colab/custom_settings.py:49 +msgid "Text" +msgstr "Texto" + +#: colab/custom_settings.py:50 search/utils.py:9 +msgid "Code" +msgstr "Código" + +#: colab/custom_settings.py:52 +msgid "Compressed" +msgstr "Compactado" + +#: colab/custom_settings.py:55 +msgid "Spreadsheet" +msgstr "Planilha" + +#: colab/custom_settings.py:267 +msgid "Planet Colab" +msgstr "" + +#: colab/custom_settings.py:268 +msgid "Colab blog aggregator" +msgstr "Agregador de blog Colab" + +#: colab/custom_settings.py:309 +msgid "One Time Snippet" +msgstr "" + +#: colab/custom_settings.py:310 +msgid "In one hour" +msgstr "" + +#: colab/custom_settings.py:311 +msgid "In one week" +msgstr "" + +#: colab/custom_settings.py:312 +msgid "In one month" +msgstr "" + +#: colab/custom_settings.py:313 +#, fuzzy +msgid "Never" +msgstr "Seriedade" + +#: planet/templates/feedzilla/_post_template.html:8 +msgid "From" +msgstr "De" + +#: planet/templates/feedzilla/_post_template.html:8 +msgid "on" +msgstr "em" + +#: planet/templates/feedzilla/_post_template.html:12 +msgid "Read original" +msgstr "Leia o original" + +#: planet/templates/feedzilla/base.html:7 +msgid "Community Blogs" +msgstr "Blogs da Comunidade" + +#: planet/templates/feedzilla/base.html:17 +msgid "Tags" +msgstr "Etiquetas" + +#: planet/templates/feedzilla/base.html:21 +msgid "Source Blogs" +msgstr "Blogs de origem" + +#: planet/templates/feedzilla/base.html:25 +#: planet/templates/feedzilla/submit_blog.html:5 +msgid "Submit a blog" +msgstr "Sugerir um blog" + +#: planet/templates/feedzilla/index.html:10 +msgid "There is no RSS registered" +msgstr "Não há RSS registrado" + +#: planet/templates/feedzilla/index.html:12 +msgid "Please" +msgstr "Por favor" + +#: planet/templates/feedzilla/index.html:13 +msgid "click here" +msgstr "clique aqui" + +#: planet/templates/feedzilla/index.html:14 +msgid "to submit a blog" +msgstr "enviar um blog" + +#: planet/templates/feedzilla/submit_blog.html:8 +msgid "" +"Thank you. Your application has been accepted and will be reviewed by admin " +"in the near time." +msgstr "" +"Obrigado. Sua aplicação foi aceita e logo será revisada por um administrador." + +#: planet/templates/feedzilla/submit_blog.html:29 +msgid "Submit" +msgstr "Enviar" + +#: planet/templates/feedzilla/tag.html:7 +#, python-format +msgid "Posts with «%(tag)s» label" +msgstr "Postagens com a etiqueta «%(tag)s»" + +#: planet/templates/feedzilla/tag.html:16 +msgid "No posts with such label" +msgstr "Não há posts com essa etiqueta" + +#: rss/feeds.py:13 +msgid "Latest Discussions" +msgstr "Últimas discussões" + +#: rss/feeds.py:32 +msgid "Discussions Most Relevance" +msgstr "Discussões Mais Relevantes" + +#: rss/feeds.py:51 +msgid "Latest collaborations" +msgstr "Últimas colaborações" + +#: search/forms.py:16 search/templates/search/search.html:41 +#: templates/base.html:91 +msgid "Search" +msgstr "Busca" + +#: search/forms.py:19 search/views.py:22 search/views.py:33 search/views.py:69 +#: search/views.py:86 search/views.py:119 +msgid "Author" +msgstr "Autor" + +#: search/forms.py:20 +msgid "Modified by" +msgstr "Modificado por" + +#: search/forms.py:22 search/views.py:70 +msgid "Status" +msgstr "" + +#: search/forms.py:26 search/views.py:36 +msgid "Mailinglist" +msgstr "Grupo" + +#: search/forms.py:30 search/views.py:46 +msgid "Milestone" +msgstr "Etapa" + +#: search/forms.py:31 search/views.py:51 +msgid "Priority" +msgstr "Prioridade" + +#: search/forms.py:32 search/views.py:56 +msgid "Component" +msgstr "Componente" + +#: search/forms.py:33 search/views.py:61 +msgid "Severity" +msgstr "Seriedade" + +#: search/forms.py:34 search/views.py:66 +msgid "Reporter" +msgstr "Relator" + +#: search/forms.py:35 search/views.py:73 +msgid "Keywords" +msgstr "Palavras chaves" + +#: search/forms.py:36 search/views.py:25 search/views.py:78 +msgid "Collaborators" +msgstr "Colaboradores" + +#: search/forms.py:37 search/views.py:89 +msgid "Repository" +msgstr "Repositório" + +#: search/forms.py:38 search/views.py:99 +msgid "Username" +msgstr "Usuário" + +#: search/forms.py:39 search/views.py:102 +msgid "Name" +msgstr "Nome" + +#: search/forms.py:40 search/views.py:105 +msgid "Institution" +msgstr "Instituição" + +#: search/forms.py:41 search/views.py:108 +msgid "Role" +msgstr "Cargo" + +#: search/forms.py:42 search/templates/search/includes/search_filters.html:151 +#: search/templates/search/includes/search_filters.html:153 +#: search/templates/search/includes/search_filters.html:185 +#: search/templates/search/includes/search_filters.html:186 +msgid "Since" +msgstr "Desde" + +#: search/forms.py:43 search/templates/search/includes/search_filters.html:160 +#: search/templates/search/includes/search_filters.html:162 +#: search/templates/search/includes/search_filters.html:189 +#: search/templates/search/includes/search_filters.html:190 +msgid "Until" +msgstr "Até" + +#: search/forms.py:44 search/views.py:116 +msgid "Filename" +msgstr "Nome do arquivo" + +#: search/forms.py:45 search/views.py:122 +msgid "Used by" +msgstr "Usado por" + +#: search/forms.py:46 search/views.py:125 +msgid "File type" +msgstr "Tipo do arquivo" + +#: search/forms.py:47 search/views.py:128 +msgid "Size" +msgstr "Tamanho" + +#: search/utils.py:7 search/views.py:20 +#: search/templates/search/includes/search_filters.html:116 +#: templates/open-data.html:130 +msgid "Wiki" +msgstr "Wiki" + +#: search/utils.py:10 +msgid "Tickets" +msgstr "Tíquetes" + +#: search/utils.py:11 +msgid "Attachments" +msgstr "Anexos" + +#: search/views.py:31 search/templates/search/includes/search_filters.html:120 +msgid "Discussion" +msgstr "Discussões" + +#: search/views.py:84 search/templates/search/includes/search_filters.html:128 +msgid "Changeset" +msgstr "Conjunto de Mudanças" + +#: search/views.py:95 search/templates/search/includes/search_filters.html:132 +msgid "User" +msgstr "Usuário" + +#: search/views.py:112 +#: search/templates/search/includes/search_filters.html:136 +msgid "Attachment" +msgstr "Anexo" + +#: search/templates/search/search.html:4 +msgid "search" +msgstr "busca" + +#: search/templates/search/search.html:46 +msgid "documents found" +msgstr "documentos encontrados" + +#: search/templates/search/search.html:57 +msgid "Search here" +msgstr "Pesquise aqui" + +#: search/templates/search/search.html:69 +#: search/templates/search/search.html:79 +msgid "Filters" +msgstr "Filtros" + +#: search/templates/search/search.html:100 +msgid "No results for your search." +msgstr "Não há resultados para sua busca." + +#: search/templates/search/search.html:102 +msgid "You are searching for" +msgstr "Você está procurando por" + +#: search/templates/search/includes/search_filters.html:5 +#: search/templates/search/includes/search_filters.html:33 +#: search/templates/search/includes/search_filters.html:51 +#: search/templates/search/includes/search_filters.html:69 +msgid "Remove filter" +msgstr "Remover filtro" + +#: search/templates/search/includes/search_filters.html:88 +#: search/templates/search/includes/search_filters.html:171 +#: search/templates/search/includes/search_filters.html:195 +msgid "Filter" +msgstr "Filtro" + +#: search/templates/search/includes/search_filters.html:94 +msgid "Sort by" +msgstr "Ordenar por" + +#: search/templates/search/includes/search_filters.html:111 +msgid "Types" +msgstr "Tipos" + +#: super_archives/models.py:62 +#: super_archives/templates/message-preview.html:62 +#: super_archives/templates/message-thread.html:4 +msgid "Anonymous" +msgstr "Anônimo" + +#: super_archives/models.py:112 +msgid "Mailing List" +msgstr "Lista de e-mail" + +#: super_archives/models.py:113 +msgid "The Mailing List where is the thread" +msgstr "A lista de e-mail onde estão as mensagens" + +#: super_archives/models.py:116 +msgid "Latest message" +msgstr "Última mensagem" + +#: super_archives/models.py:117 +msgid "Latest message posted" +msgstr "Última mensagem postada" + +#: super_archives/models.py:118 +msgid "Score" +msgstr "Pontuação" + +#: super_archives/models.py:118 +msgid "Thread score" +msgstr "Pontuação do conjunto de mensagens" + +#: super_archives/models.py:127 +msgid "Thread" +msgstr "Conjunto de mensagens" + +#: super_archives/models.py:128 +msgid "Threads" +msgstr "Conjuntos de mensagens" + +#: super_archives/models.py:242 +msgid "Subject" +msgstr "Assunto" + +#: super_archives/models.py:243 +msgid "Please enter a message subject" +msgstr "Por favor, digite o assunto da mensagem" + +#: super_archives/models.py:246 +msgid "Message body" +msgstr "Corpo da mensagem" + +#: super_archives/models.py:247 +msgid "Please enter a message body" +msgstr "Por favor, digite o corpo da mensagem" + +#: super_archives/models.py:257 +msgid "Message" +msgstr "Mensagem" + +#: super_archives/views.py:92 +msgid "Error trying to connect to Mailman API" +msgstr "Erro na conexão com a API do Mailman" + +#: super_archives/views.py:95 +msgid "Timeout trying to connect to Mailman API" +msgstr "Tempo de espera esgotado na conexão com a API do Mailman" + +#: super_archives/views.py:99 +msgid "" +"Your message was sent to this topic. It may take some minutes before it's " +"delivered by email to the group. Why don't you breath some fresh air in the " +"meanwhile?" +msgstr "" +"Sua mensagem foi enviada para esse tópico. Pode levar alguns minutos até ser " +"entregue via e-mail para o grupo. Por quê você não respira um ar fresco " +"enquanto isso?" + +#: super_archives/views.py:108 +msgid "You cannot send an empty email" +msgstr "Você não pode enviar um e-mail vazio" + +#: super_archives/views.py:110 +msgid "Mailing list does not exist" +msgstr "Lista de e-mail não existe" + +#: super_archives/views.py:112 +msgid "Unknown error trying to connect to Mailman API" +msgstr "Erro desconhecido na conexão com a API do Mailman" + +#: super_archives/views.py:151 +msgid "" +"The email address you are trying to verify either has already been verified " +"or does not exist." +msgstr "" +"O endereço de e-mail que você está tentando verificar ou já foi verificado " +"ou não existe." + +#: super_archives/views.py:162 +msgid "" +"The email address you are trying to verify is already an active email " +"address." +msgstr "" +"O endereço de e-mail que você está tentando verificar já é um endereço de e-" +"mail ativo" + +#: super_archives/views.py:172 +msgid "Email address verified!" +msgstr "Endereço de e-mail verificado!" + +#: super_archives/management/commands/import_emails.py:207 +msgid "[Colab] Warning - Email sent with a blank subject." +msgstr "[Colab] Aviso - E-mail enviado com o campo assunto em branco." + +#: super_archives/templates/message-preview.html:42 +#: super_archives/templates/message-preview.html:62 +msgid "by" +msgstr "por" + +#: super_archives/templates/message-preview.html:65 +#: super_archives/templates/message-thread.html:161 +msgid "ago" +msgstr "atrás" + +#: super_archives/templates/message-thread.html:35 +msgid "You must login before voting." +msgstr "Você deve estar logado antes de votar." + +#: super_archives/templates/message-thread.html:132 +msgid "Order by" +msgstr "Ordernar por" + +#: super_archives/templates/message-thread.html:136 +msgid "Votes" +msgstr "Votos" + +#: super_archives/templates/message-thread.html:140 +msgid "Date" +msgstr "Data" + +#: super_archives/templates/message-thread.html:145 +msgid "Related:" +msgstr "Relacionado:" + +#: super_archives/templates/message-thread.html:156 +msgid "Statistics:" +msgstr "Estatísticas:" + +#: super_archives/templates/message-thread.html:160 +msgid "started at" +msgstr "começou à" + +#: super_archives/templates/message-thread.html:166 +msgid "viewed" +msgstr "visualizado" + +#: super_archives/templates/message-thread.html:167 +#: super_archives/templates/message-thread.html:172 +#: super_archives/templates/message-thread.html:177 +msgid "times" +msgstr "vezes" + +#: super_archives/templates/message-thread.html:171 +msgid "answered" +msgstr "respondido" + +#: super_archives/templates/message-thread.html:176 +msgid "voted" +msgstr "votado" + +#: super_archives/templates/message-thread.html:182 +msgid "Tags:" +msgstr "Etiquetas:" + +#: super_archives/templates/superarchives/thread-dashboard.html:4 +#: super_archives/templates/superarchives/thread-dashboard.html:7 +#: templates/base.html:66 +msgid "Groups" +msgstr "Grupos" + +#: super_archives/templates/superarchives/thread-dashboard.html:17 +msgid "latest" +msgstr "mais recentes" + +#: super_archives/templates/superarchives/thread-dashboard.html:25 +#: super_archives/templates/superarchives/thread-dashboard.html:39 +msgid "more..." +msgstr "mais..." + +#: super_archives/templates/superarchives/thread-dashboard.html:31 +msgid "most relevant" +msgstr "mais relevantes" + +#: super_archives/templates/superarchives/emails/email_blank_subject.txt:2 +msgid "Hello" +msgstr "Olá" + +#: super_archives/templates/superarchives/emails/email_blank_subject.txt:3 +#, python-format +msgid "" +"\n" +"You've sent an email to %(mailinglist)s with a blank subject and the " +"following content:\n" +"\n" +"\"%(body)s\"\n" +"\n" +"Please, fill the subject in every email you send it.\n" +"\n" +"Thank you.\n" +msgstr "" +"\n" +"Você enviou um e-mail para %(mailinglist)s com o campo Assunto em branco e o " +"seguinte conteúdo:\n" +"\n" +"\"%(body)s\"\n" +"\n" +"Por favor, preencha o assunto em todos os e-mails que você enviar.\n" +"\n" +"Obrigado.\n" + +#: super_archives/templates/superarchives/emails/email_verification.txt:2 +#, python-format +msgid "" +"Hey, we want to verify that you are indeed \"%(fullname)s (%(username)s)\". " +"If that's the case, please follow the link below:" +msgstr "" +"Hey, queremos verificar se você realmente é \"%(fullname)s (%(username)s)\". " +"Se esse é o caso, por favor, clique no link abaixo:" + +#: super_archives/templates/superarchives/emails/email_verification.txt:6 +#, python-format +msgid "" +"If you're not %(username)s or didn't request verification you can ignore " +"this email." +msgstr "" +"Se você não é %(username)s ou não pediu uma verificação você pode ignorar " +"esse e-mail" + +#: super_archives/templates/superarchives/includes/message.html:17 +#: super_archives/templates/superarchives/includes/message.html:18 +msgid "Link to this message" +msgstr "Link para essa mensagem" + +#: super_archives/templates/superarchives/includes/message.html:46 +msgid "Reply" +msgstr "Responder" + +#: super_archives/templates/superarchives/includes/message.html:63 +msgid "Send a message" +msgstr "Enviar uma mensagem" + +#: super_archives/templates/superarchives/includes/message.html:66 +msgid "" +"After sending a message it will take few minutes before it shows up in here. " +"Why don't you grab a coffee?" +msgstr "" +"Depois de enviar uma mensagem levará alguns minutos antes dela aparecer " +"aqui. Por que você não pega um café?" + +#: super_archives/templates/superarchives/includes/message.html:69 +msgid "Send" +msgstr "Enviar" + +#: super_archives/utils/email.py:14 +msgid "Please verify your email " +msgstr "Por favor, verifique seu e-mail " + +#: super_archives/utils/email.py:25 +msgid "Registration on the mailing list" +msgstr "Inscrição na lista de e-mail" + +#: templates/404.html:5 +msgid "Not found. Keep searching! :)" +msgstr "Não encontrado. Continue procurando! :)" + +#: templates/500.html:2 +msgid "Ooopz... something went wrong!" +msgstr "Opa... algo saiu errado!" + +#: templates/base.html:63 +msgid "Timeline" +msgstr "Linha do Tempo" + +#: templates/base.html:69 +msgid "Blogs" +msgstr "" + +#: templates/base.html:72 +msgid "Contribute" +msgstr "Contribua" + +#: templates/base.html:76 +msgid "New Wiki Page" +msgstr "Nova Página Wiki" + +#: templates/base.html:78 +msgid "View Tickets" +msgstr "Ver Tiquetes" + +#: templates/base.html:80 +msgid "New Ticket" +msgstr "Novo Tíquete" + +#: templates/base.html:82 +msgid "Roadmap" +msgstr "Planejamento" + +#: templates/base.html:86 +msgid "Browse Source" +msgstr "Códigos Fontes" + +#: templates/base.html:87 +msgid "Continuous Integration" +msgstr "Integração Contínua" + +#: templates/base.html:95 +msgid "Help" +msgstr "Ajuda" + +#: templates/base.html:107 templates/base.html.py:112 +msgid "Login" +msgstr "Entrar" + +#: templates/base.html:126 +msgid "My Profile" +msgstr "Meu Perfil" + +#: templates/base.html:127 +msgid "Logout" +msgstr "Sair" + +#: templates/base.html:139 templates/base.html.py:142 +msgid "Search here..." +msgstr "Pesquise aqui..." + +#: templates/base.html:155 +msgid "The login has failed. Please, try again." +msgstr "O login falhou. Por favor, tente novamente." + +#: templates/base.html:182 +msgid "Last email imported at" +msgstr "Último e-mail importado em" + +#: templates/base.html:189 +msgid "The contents of this site is published under license" +msgstr "O conteúdo deste site está publicado sob a licença" + +#: templates/base.html:192 +msgid "" +"Creative Commons 3.0 Brasil - Atribuição - Não-Comercial - Compartilha-Igual" +msgstr "" + +#: templates/home.html:21 +msgid "Latest Collaborations" +msgstr "Últimas Colaborações" + +#: templates/home.html:25 +msgid "RSS - Latest collaborations" +msgstr "RSS - Últimas Colaborações" + +#: templates/home.html:34 +msgid "View more collaborations..." +msgstr "Ver mais colaborações..." + +#: templates/home.html:41 +msgid "Collaboration Graph" +msgstr "Gráfico de Colaborações" + +#: templates/home.html:52 +msgid "Most Relevant Threads" +msgstr "Discussões Mais Relevantes" + +#: templates/home.html:56 +msgid "RSS - Most Relevant Threads" +msgstr "RSS - Discussões Mais Relevantes" + +#: templates/home.html:64 templates/home.html.py:83 +msgid "View more discussions..." +msgstr "Ver mais discussões..." + +#: templates/home.html:71 +msgid "Latest Threads" +msgstr "Últimas Discussões" + +#: templates/home.html:75 +msgid "RSS - Latest Threads" +msgstr "RSS - Últimas Discussões" + +#: templates/open-data.html:6 +msgid "OpenData" +msgstr "OpenData" + +#: templates/open-data.html:7 +msgid "" +"If you are interested in any other data that is not provided by this API, " +"please contact us via the ticketing system (you must be registered in order " +"to create a ticket)." +msgstr "" + +#: templates/open-data.html:9 +msgid "Retrieving data via API" +msgstr "" + +#: templates/open-data.html:10 +msgid "Colab API works through HTTP/REST, always returning JSON objects." +msgstr "" + +#: templates/open-data.html:12 +msgid "The base API URL is" +msgstr "" + +#: templates/open-data.html:19 +msgid "" +"Each model listed below has a resource_uri field available, which is the " +"object's data URI." +msgstr "" + +#: templates/open-data.html:20 +msgid "" +"The following list contains the available models to retrieve data and its " +"fields available for filtering" +msgstr "" + +#: templates/open-data.html:24 templates/open-data.html.py:39 +#: templates/open-data.html:50 templates/open-data.html.py:62 +#: templates/open-data.html:74 templates/open-data.html.py:95 +msgid "Fields" +msgstr "" + +#: templates/open-data.html:25 +msgid "" +"The email field is not shown for user's privacy, but you can use it to filter" +msgstr "" + +#: templates/open-data.html:27 +msgid "The user's username" +msgstr "" + +#: templates/open-data.html:28 +#, fuzzy +msgid "The user's email address" +msgstr "Adicionar outro endereço de e-mail" + +#: templates/open-data.html:29 +msgid "What is the user's institution" +msgstr "" + +#: templates/open-data.html:30 +msgid "What is the user's role" +msgstr "" + +#: templates/open-data.html:31 +msgid "The user's first name" +msgstr "" + +#: templates/open-data.html:32 +msgid "The user's last name" +msgstr "" + +#: templates/open-data.html:33 +msgid "A mini bio of the user" +msgstr "" + +#: templates/open-data.html:40 +msgid "" +"The address field is not shown for user's privacy, but you can use it to " +"filter" +msgstr "" + +#: templates/open-data.html:42 +msgid "It has a relationshop with the user described above" +msgstr "" + +#: templates/open-data.html:43 +#, fuzzy +msgid "An email address" +msgstr "Adicionar outro endereço de e-mail" + +#: templates/open-data.html:44 +msgid "The user's real name" +msgstr "" + +#: templates/open-data.html:52 +msgid "It has a relationship with the emailaddress described above" +msgstr "" + +#: templates/open-data.html:53 +#, fuzzy +msgid "The message's body" +msgstr "Corpo da mensagem" + +#: templates/open-data.html:54 +#, fuzzy +msgid "The message's subject" +msgstr "Por favor, digite o assunto da mensagem" + +#: templates/open-data.html:55 +#, fuzzy +msgid "The message's id" +msgstr "Última mensagem" + +#: templates/open-data.html:56 +msgid "The message's received time" +msgstr "" + +#: templates/open-data.html:64 +msgid "The revision's author username" +msgstr "" + +#: templates/open-data.html:65 +msgid "When the revision's were created" +msgstr "" + +#: templates/open-data.html:66 +msgid "The revision's key" +msgstr "" + +#: templates/open-data.html:67 +msgid "The revision's message" +msgstr "" + +#: templates/open-data.html:68 +msgid "The revision's repository name" +msgstr "" + +#: templates/open-data.html:76 +msgid "The ticket's author username" +msgstr "" + +#: templates/open-data.html:77 +msgid "The ticket's component" +msgstr "" + +#: templates/open-data.html:78 +msgid "When the ticket's were created" +msgstr "" + +#: templates/open-data.html:79 +msgid "The ticket's description" +msgstr "" + +#: templates/open-data.html:80 +#, fuzzy +msgid "The ticket's id" +msgstr "Tíquetes" + +#: templates/open-data.html:81 +msgid "The ticket's keywords" +msgstr "" + +#: templates/open-data.html:82 +msgid "The ticket's milestone" +msgstr "" + +#: templates/open-data.html:83 templates/open-data.html.py:99 +msgid "The time of the last modification" +msgstr "" + +#: templates/open-data.html:84 +msgid "The username of the last user who modified the ticket" +msgstr "" + +#: templates/open-data.html:85 +msgid "The ticket's priority" +msgstr "" + +#: templates/open-data.html:86 +msgid "The ticket's severity" +msgstr "" + +#: templates/open-data.html:87 +msgid "The ticket's status" +msgstr "" + +#: templates/open-data.html:88 +msgid "The ticket's summary" +msgstr "" + +#: templates/open-data.html:89 +msgid "The ticket's version" +msgstr "" + +#: templates/open-data.html:97 +msgid "The wiki's author username" +msgstr "" + +#: templates/open-data.html:98 +msgid "When the wiki's were created" +msgstr "" + +#: templates/open-data.html:100 +msgid "The username of the last user who modified the wiki" +msgstr "" + +#: templates/open-data.html:101 +msgid "The wiki's name" +msgstr "" + +#: templates/open-data.html:102 +msgid "the wiki's content" +msgstr "" + +#: templates/open-data.html:109 +msgid "Parameters" +msgstr "" + +#: templates/open-data.html:112 +msgid "Results per page" +msgstr "" + +#: templates/open-data.html:113 +msgid "Number of results to be displayed per page." +msgstr "" + +#: templates/open-data.html:114 +msgid "Default: 20" +msgstr "" + +#: templates/open-data.html:118 +msgid "Starts of n element" +msgstr "" + +#: templates/open-data.html:119 +msgid "Where n is the index of the first result to appear in the page." +msgstr "" + +#: templates/open-data.html:120 +msgid "Default: 0" +msgstr "" + +#: templates/open-data.html:122 +#, fuzzy +msgid "Filtering" +msgstr "Filtro" + +#: templates/open-data.html:124 +msgid "The field name" +msgstr "" + +#: templates/open-data.html:125 +msgid "" +"If you are looking for a specific wiki, and you know the wiki's name, you " +"can filter it as below" +msgstr "" + +#: templates/open-data.html:126 +#, fuzzy +msgid "WikiName" +msgstr "Nome" + +#: templates/open-data.html:127 +msgid "" +"Where "name" is the fieldname and "WikiName" is the " +"value you want to filter." +msgstr "" + +#: templates/open-data.html:128 +#, fuzzy +msgid "Usage" +msgstr "Mensagem" + +#: templates/open-data.html:129 +msgid "" +"You can also filter using Django lookup fields with the double underscores, " +"just as below" +msgstr "" + +#: templates/open-data.html:131 templates/open-data.html.py:132 +#, fuzzy +msgid "test" +msgstr "mais recentes" + +#: templates/open-data.html:133 +msgid "Usage with relationships" +msgstr "" + +#: templates/open-data.html:134 +msgid "" +"You can use related fields to filter too. So, you can filter by any field of " +"emailaddress using the 'from_address' field of message, which has a relation " +"to emailaddress. You will achieve the related fields by using double " +"underscore and the field's name. See the example below" +msgstr "" + +#: templates/open-data.html:136 +msgid "" +"So, real_name is a field of emailaddress, and you had access to this field " +"by a message field called from_address and using double underscore to say " +"you want to use a field of that relationship" +msgstr "" + +#: templates/open-data.html:137 +msgid "" +"Note: email filters must be exact. Which means that __contains, " +"__startswith, __endswith and others won't work" +msgstr "" + +#: templates/open-data.html:138 +msgid "" +"Another example of usage with relations. Used to retrieve all messages of a " +"given user, using the username or the email field" +msgstr "" + +#: templates/dpaste/snippet_details.html:37 +#, fuzzy +msgid "Compare" +msgstr "Comparação" + +#: templates/dpaste/snippet_details.html:47 +#, python-format +msgid "Expires in: %(date)s" +msgstr "" + +#: templates/dpaste/snippet_details.html:49 +msgid "Snippet never expires" +msgstr "" + +#: templates/dpaste/snippet_details.html:51 +msgid "One-time snippet" +msgstr "" + +#: templates/dpaste/snippet_details.html:56 +msgid "Really delete this snippet?" +msgstr "" + +#: templates/dpaste/snippet_details.html:58 +#, fuzzy +msgid "Delete Now" +msgstr "Apagar" + +#: templates/dpaste/snippet_details.html:63 +#: templates/dpaste/snippet_details.html:65 +#, fuzzy +msgid "Compare Snippets" +msgstr "Comparação" + +#: templates/dpaste/snippet_details.html:69 +#: templates/dpaste/snippet_details.html:71 +msgid "View Raw" +msgstr "" + +#: templates/dpaste/snippet_details.html:75 +msgid "Gist" +msgstr "" + +#: templates/dpaste/snippet_details.html:88 +msgid "This is a one-time snippet." +msgstr "" + +#: templates/dpaste/snippet_details.html:90 +msgid "It will automatically get deleted after {{ remaining }} further views." +msgstr "" + +#: templates/dpaste/snippet_details.html:92 +msgid "It will automatically get deleted after the next view." +msgstr "" + +#: templates/dpaste/snippet_details.html:94 +msgid "It cannot be viewed again." +msgstr "" + +#: templates/dpaste/snippet_details.html:109 +msgid "Reply to this snippet" +msgstr "" + +#: templates/dpaste/snippet_diff.html:5 +#, python-format +msgid "" +"\n" +" Diff between #%(filea_id)s and #%(fileb_id)s\n" +" " +msgstr "" + +#: templates/dpaste/snippet_form.html:28 +msgid "Paste it" +msgstr "" + +#~ msgid "Creative Commons - attribution, non-commercial" +#~ msgstr "Creative Commons - atribuição e não-comercial" + +#~ msgid "Willing to help" +#~ msgstr "Vontade de ajudar" + +#~ msgid "Identi.ca account" +#~ msgstr "Conta Identi.ca" + +#~ msgid "Biography" +#~ msgstr "Biografia" + +#~ msgid "Other Collaborations" +#~ msgstr "Outras Colaborações" + +#~ msgid "Mailing List Subscriptions" +#~ msgstr "Inscrições em listas de e-mails" + +#~ msgid "Change SVN and XMPP Client password" +#~ msgstr "Trocar a senha do SVN e do Mensageiro" + +#~ msgid "" +#~ "You don't need to change this password. Change it only if you really know " +#~ "what you are doing." +#~ msgstr "" +#~ "Você não precisa trocar essa senha. Troque-a somente se tem certeza do " +#~ "que está fazendo." + +#~ msgid "Subscribes: " +#~ msgstr "Inscrições: " + +#~ msgid "Discussions" +#~ msgstr "Discussões" + +#~ msgid "Community inside participations" +#~ msgstr "Participações internas da comunidade" + +#~ msgid "documents found in" +#~ msgstr "documentos encontrados em" + +#~ msgid "seconds" +#~ msgstr "segundos" + +#~ msgid "Previous" +#~ msgstr "Anterior" + +#~ msgid "Page" +#~ msgstr "Página" + +#~ msgid "of" +#~ msgstr "de" + +#~ msgid "Next" +#~ msgstr "Pŕoximo" + +#~ msgid "%(option)s" +#~ msgstr "%(option)s" + +#~ msgid "%(name)s" +#~ msgstr "%(name)s" + +#~ msgid "%(name)s" +#~ msgstr "%(name)s" diff --git a/colab/manage.py b/colab/manage.py new file mode 100644 index 0000000..a466007 --- /dev/null +++ b/colab/manage.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "colab.settings") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/colab/planet/__init__.py b/colab/planet/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/planet/__init__.py diff --git a/colab/planet/admin.py b/colab/planet/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/colab/planet/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/colab/planet/locale/es/LC_MESSAGES/django.po b/colab/planet/locale/es/LC_MESSAGES/django.po new file mode 100644 index 0000000..9f516d1 --- /dev/null +++ b/colab/planet/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,103 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Leonardo J. Caballero G. , 2013. +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-07-26 11:28-0300\n" +"PO-Revision-Date: 2013-10-15 23:46-0430\n" +"Last-Translator: Leonardo J. Caballero G. \n" +"Language-Team: ES \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.7.1\n" + +#: templates/common/pagination.html:5 templates/common/pagination.html.py:7 +msgid "previous" +msgstr "anterior" + +#: templates/common/pagination.html:31 templates/common/pagination.html:33 +msgid "next" +msgstr "próximo" + +#: templates/feedzilla/_post_template.html:9 +msgid "From" +msgstr "De" + +#: templates/feedzilla/_post_template.html:9 +msgid "on" +msgstr "en" + +#: templates/feedzilla/_post_template.html:17 +msgid "Read original" +msgstr "Leer original" + +#: templates/feedzilla/base.html:6 +msgid "Planet" +msgstr "Planeta" + +#: templates/feedzilla/base.html:15 templates/feedzilla/submit_blog.html:5 +msgid "Submit a blog" +msgstr "Solicite la inclusión de un blog" + +#: templates/feedzilla/base.html:18 +msgid "Tags" +msgstr "Etiquetas" + +#: templates/feedzilla/base.html:22 +msgid "Source Blogs" +msgstr "Fuente de Blogs" + +#: templates/feedzilla/submit_blog.html:8 +msgid "" +"Thank you. Your application has been accepted and will be reviewed by admin " +"in the near time." +msgstr "Gracias. Su solicitud ha sido aceptado y sera revisado por el administrador, lo mas pronto posible." + +#: templates/feedzilla/submit_blog.html:10 +msgid "Required fields" +msgstr "Campos requeridos" + +#: templates/feedzilla/submit_blog.html:14 +msgid "Blog Information" +msgstr "Información del blog" + +#: templates/feedzilla/submit_blog.html:15 +msgid "Blog URL" +msgstr "Dirección URL de Blog" + +#: templates/feedzilla/submit_blog.html:16 +msgid "Blog name" +msgstr "Nombre de blog" + +#: templates/feedzilla/submit_blog.html:17 +msgid "Name of author of the blog" +msgstr "Nombre del autor del blog" + +#: templates/feedzilla/submit_blog.html:18 +msgid "Feed URL" +msgstr "Dirección URL de Feed" + +#: templates/feedzilla/submit_blog.html:18 +msgid "You can specify what exactly feed you want submit" +msgstr "" +"Usted puede especificar cual feed exactamente usted quiere solicitar su " +"inclusión" + +#: templates/feedzilla/submit_blog.html:19 +msgid "Submit" +msgstr "Solicite la inclusión de un blog" + +#: templates/feedzilla/tag.html:5 +#, python-format +msgid "Posts with «%(tag)s» label" +msgstr "Envíos con etiqueta «%(tag)s»" + +#: templates/feedzilla/tag.html:14 +msgid "No posts with such label" +msgstr "No hay envíos con dicha etiqueta" diff --git a/colab/planet/locale/pt_BR/LC_MESSAGES/django.mo b/colab/planet/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ed75b5d Binary files /dev/null and b/colab/planet/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/colab/planet/locale/pt_BR/LC_MESSAGES/django.po b/colab/planet/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 0000000..bf99c46 --- /dev/null +++ b/colab/planet/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,119 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-08-20 14:52-0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: templates/common/pagination.html:5 templates/common/pagination.html.py:7 +msgid "previous" +msgstr "anterior" + +#: templates/common/pagination.html:31 templates/common/pagination.html:33 +msgid "next" +msgstr "próxima" + +#: templates/feedzilla/_post_template.html:9 +msgid "From" +msgstr "De" + +#: templates/feedzilla/_post_template.html:9 +msgid "on" +msgstr "em" + +#: templates/feedzilla/_post_template.html:13 +msgid "Read original" +msgstr "Ler original" + +#: templates/feedzilla/base.html:6 +msgid "Planet" +msgstr "Planet" + +#: templates/feedzilla/base.html:14 templates/feedzilla/submit_blog.html:7 +msgid "Submit a blog" +msgstr "Solicite a inclusão de um blog" + +#: templates/feedzilla/base.html:17 +msgid "Tags" +msgstr "Tags" + +#: templates/feedzilla/base.html:21 +msgid "Source Blogs" +msgstr "Blogs Fonte" + +#: templates/feedzilla/index.html:11 +msgid "There's no RSS registered" +msgstr "Não há RSS cadastrado" + +#: templates/feedzilla/index.html:12 +msgid "Please" +msgstr "Por favor" + +#: templates/feedzilla/index.html:13 +msgid "click here" +msgstr "clique aqui" + +#: templates/feedzilla/index.html:14 +msgid "to submit a blog" +msgstr "para a inclusão de um blog" + +#: templates/feedzilla/submit_blog.html:11 +msgid "" +"Thank you. Your application has been accepted and will be reviewed by admin " +"in the near time." +msgstr "" + +#: templates/feedzilla/submit_blog.html:13 +msgid "Required fields" +msgstr "" + +#: templates/feedzilla/submit_blog.html:17 +msgid "Blog Information" +msgstr "Informações do blog" + +#: templates/feedzilla/submit_blog.html:18 +msgid "Blog URL" +msgstr "" + +#: templates/feedzilla/submit_blog.html:19 +#, fuzzy +msgid "Blog name" +msgstr "Blogs" + +#: templates/feedzilla/submit_blog.html:20 +msgid "Name of author of the blog" +msgstr "" + +#: templates/feedzilla/submit_blog.html:21 +msgid "Feed URL" +msgstr "" + +#: templates/feedzilla/submit_blog.html:21 +msgid "You can specify what exactly feed you want submit" +msgstr "" + +#: templates/feedzilla/submit_blog.html:22 +#, fuzzy +msgid "Submit" +msgstr "Solicite a inclusão de um blog" + +#: templates/feedzilla/tag.html:7 +#, python-format +msgid "Posts with «%(tag)s» label" +msgstr "" + +#: templates/feedzilla/tag.html:16 +msgid "No posts with such label" +msgstr "" diff --git a/colab/planet/models.py b/colab/planet/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/colab/planet/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/colab/planet/templates/common/pagination.html b/colab/planet/templates/common/pagination.html new file mode 100644 index 0000000..270f64e --- /dev/null +++ b/colab/planet/templates/common/pagination.html @@ -0,0 +1,34 @@ +{% load i18n %} +{% if page.paginator.num_pages > 1 %} +
+
    + {% if page.has_previous %} +
  • «
  • + {% endif %} + + {% if page.paginator.frame_start_page > 1 %} +
  • 1
  • + {% endif %} + {% if page.paginator.frame_start_page > 2 %} +
  • ...
  • + {% endif %} + + {% for number, url in page.paginator.frame %} + {% if not url %}..{% else %} +
  • {{ number }}
  • + {% endif %} + {% endfor %} + + {% if page.paginator.frame_end_page != page.paginator.num_pages %} + {% if page.paginator.frame_end_page != page.paginator.num_pages|add:"-1" %} +
  • ...
  • + {% endif %} +
  • {{ page.paginator.num_pages }}
  • + {% endif %} + + {% if page.has_next %} +
  • »
  • + {% endif %} +
+
+{% endif %} diff --git a/colab/planet/templates/feedzilla/_post_template.html b/colab/planet/templates/feedzilla/_post_template.html new file mode 100644 index 0000000..33444cc --- /dev/null +++ b/colab/planet/templates/feedzilla/_post_template.html @@ -0,0 +1,23 @@ +{% load i18n %} + +
+ + +

{{ post.title }}

+ + + + {{ post.summary|safe }} + + {% trans "Read original" %} + + {% if post.tags.count %} +
+ Tags: + {% for tag in post.tags.all %} + {{ tag }} + {% endfor %} + +
+ {% endif %} +
diff --git a/colab/planet/templates/feedzilla/base.html b/colab/planet/templates/feedzilla/base.html new file mode 100644 index 0000000..79c2574 --- /dev/null +++ b/colab/planet/templates/feedzilla/base.html @@ -0,0 +1,32 @@ +{% extends 'base.html' %} +{% load i18n feedzilla_tags %} + +{% block title %}Blogs{% endblock %} + +{% block main-content %} +

{% trans 'Community Blogs' %}

+
+ +
+
+ {% block feedzilla_content %}{% endblock %} +
+ +
+
+

{% trans 'Tags' %}

+ {% feedzilla_tag_cloud %} +
+
+

{% trans 'Source Blogs' %}

+ {% feedzilla_donor_list order_by="title" %} + {% if user.is_authenticated %} + + {% endif %} +
+
+
+ +{% endblock %} diff --git a/colab/planet/templates/feedzilla/index.html b/colab/planet/templates/feedzilla/index.html new file mode 100644 index 0000000..e387da1 --- /dev/null +++ b/colab/planet/templates/feedzilla/index.html @@ -0,0 +1,20 @@ +{% extends 'feedzilla/base.html' %} +{% load i18n %} + +{% block feedzilla_content %} + +{% for post in page.object_list %} + {% include 'feedzilla/_post_template.html' %} +
+ {% empty %} +

{% trans 'There is no RSS registered' %}

+

+ {% trans 'Please' %} + {% trans 'click here' %} + {% trans 'to submit a blog' %}

+ +{% endfor %} + +{% include "common/pagination.html" %} + +{% endblock %} diff --git a/colab/planet/templates/feedzilla/submit_blog.html b/colab/planet/templates/feedzilla/submit_blog.html new file mode 100644 index 0000000..a638dbb --- /dev/null +++ b/colab/planet/templates/feedzilla/submit_blog.html @@ -0,0 +1,37 @@ +{% extends 'feedzilla/base.html' %} +{% load i18n %} + +{% block feedzilla_content %} +

{% trans "Submit a blog" %}

+ +{% if success %} +

{% trans "Thank you. Your application has been accepted and will be reviewed by admin in the near time." %}

+{% else %} +
+ {% csrf_token %} + +
+ {% for field in form %} +
+
+ + + {{ field.errors }} +
+
+ {% endfor %} +
+ +
+
+ +
+
+ +
+ +
+{% endif %} +{% endblock %} diff --git a/colab/planet/templates/feedzilla/tag.html b/colab/planet/templates/feedzilla/tag.html new file mode 100644 index 0000000..3cc3666 --- /dev/null +++ b/colab/planet/templates/feedzilla/tag.html @@ -0,0 +1,19 @@ +{% extends 'feedzilla/base.html' %} +{% load i18n %} + +{% block feedzilla_content %} + +
+

{% block title %}{% blocktrans %}Posts with «{{ tag }}» label{% endblocktrans %}{% endblock title %}

+
+ {% if page.object_list %} + {% for post in page.object_list %} + {% include 'feedzilla/_post_template.html' %} +
+ {% endfor %} + {% include "pagination.html" %} + {% else %} +

{% trans "No posts with such label" %}

+ {% endif %} +
+{% endblock %} diff --git a/colab/planet/tests.py b/colab/planet/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/colab/planet/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/colab/planet/views.py b/colab/planet/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/colab/planet/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/colab/proxy/__init__.py b/colab/proxy/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/proxy/__init__.py diff --git a/colab/proxy/context_processors.py b/colab/proxy/context_processors.py new file mode 100644 index 0000000..317f0f9 --- /dev/null +++ b/colab/proxy/context_processors.py @@ -0,0 +1,12 @@ + +from django.apps import apps + + +def proxied_apps(request): + proxied_apps = {} + + for app in apps.get_app_configs(): + if getattr(app, 'colab_proxied_app', False): + proxied_apps[app.label] = True + + return {'proxy': proxied_apps} diff --git a/colab/proxy/gitlab/__init__.py b/colab/proxy/gitlab/__init__.py new file mode 100644 index 0000000..a2b3db3 --- /dev/null +++ b/colab/proxy/gitlab/__init__.py @@ -0,0 +1,3 @@ + + +default_app_config = 'proxy.gitlab.apps.ProxyGitlabAppConfig' diff --git a/colab/proxy/gitlab/admin.py b/colab/proxy/gitlab/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/colab/proxy/gitlab/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/colab/proxy/gitlab/apps.py b/colab/proxy/gitlab/apps.py new file mode 100644 index 0000000..aea37de --- /dev/null +++ b/colab/proxy/gitlab/apps.py @@ -0,0 +1,7 @@ + +from ..utils.apps import ColabProxiedAppConfig + + +class ProxyGitlabAppConfig(ColabProxiedAppConfig): + name = 'proxy.gitlab' + verbose_name = 'Gitlab Proxy' diff --git a/colab/proxy/gitlab/diazo.xml b/colab/proxy/gitlab/diazo.xml new file mode 100644 index 0000000..a4e8c82 --- /dev/null +++ b/colab/proxy/gitlab/diazo.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/colab/proxy/gitlab/models.py b/colab/proxy/gitlab/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/colab/proxy/gitlab/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/colab/proxy/gitlab/templates/proxy/gitlab.html b/colab/proxy/gitlab/templates/proxy/gitlab.html new file mode 100644 index 0000000..6694ca5 --- /dev/null +++ b/colab/proxy/gitlab/templates/proxy/gitlab.html @@ -0,0 +1,47 @@ +{% extends 'base.html' %} +{% load static %} + +{% block head_css %} + +{% endblock %} + +{% block head_js %} + + + + +{% endblock %} diff --git a/colab/proxy/gitlab/tests.py b/colab/proxy/gitlab/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/colab/proxy/gitlab/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/colab/proxy/gitlab/urls.py b/colab/proxy/gitlab/urls.py new file mode 100644 index 0000000..afe6440 --- /dev/null +++ b/colab/proxy/gitlab/urls.py @@ -0,0 +1,10 @@ + +from django.conf.urls import patterns, url + +from .views import GitlabProxyView + + +urlpatterns = patterns('', + # Gitlab URLs + url(r'^gitlab/(?P.*)$', GitlabProxyView.as_view()), +) diff --git a/colab/proxy/gitlab/views.py b/colab/proxy/gitlab/views.py new file mode 100644 index 0000000..c09c19c --- /dev/null +++ b/colab/proxy/gitlab/views.py @@ -0,0 +1,9 @@ + +from django.conf import settings + +from ..utils.views import ColabProxyView + + +class GitlabProxyView(ColabProxyView): + upstream = settings.PROXIED_APPS['gitlab']['upstream'] + diazo_theme_template = 'proxy/gitlab.html' diff --git a/colab/proxy/jenkins/__init__.py b/colab/proxy/jenkins/__init__.py new file mode 100644 index 0000000..093a0b1 --- /dev/null +++ b/colab/proxy/jenkins/__init__.py @@ -0,0 +1,3 @@ + + +default_app_config = 'proxy.jenkins.apps.ProxyJenkinsAppConfig' diff --git a/colab/proxy/jenkins/admin.py b/colab/proxy/jenkins/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/colab/proxy/jenkins/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/colab/proxy/jenkins/apps.py b/colab/proxy/jenkins/apps.py new file mode 100644 index 0000000..b9fb226 --- /dev/null +++ b/colab/proxy/jenkins/apps.py @@ -0,0 +1,7 @@ + +from ..utils.apps import ColabProxiedAppConfig + + +class ProxyJenkinsAppConfig(ColabProxiedAppConfig): + name = 'proxy.jenkins' + verbose_name = 'Jenkins Proxy' diff --git a/colab/proxy/jenkins/diazo.xml b/colab/proxy/jenkins/diazo.xml new file mode 100644 index 0000000..7eacea4 --- /dev/null +++ b/colab/proxy/jenkins/diazo.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + diff --git a/colab/proxy/jenkins/models.py b/colab/proxy/jenkins/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/colab/proxy/jenkins/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/colab/proxy/jenkins/tests.py b/colab/proxy/jenkins/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/colab/proxy/jenkins/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/colab/proxy/jenkins/urls.py b/colab/proxy/jenkins/urls.py new file mode 100644 index 0000000..8c499e4 --- /dev/null +++ b/colab/proxy/jenkins/urls.py @@ -0,0 +1,10 @@ + +from django.conf.urls import patterns, url + +from .views import JenkinsProxyView + + +urlpatterns = patterns('', + # Jenkins URLs + url(r'^ci/(?P.*)$', JenkinsProxyView.as_view()), +) diff --git a/colab/proxy/jenkins/views.py b/colab/proxy/jenkins/views.py new file mode 100644 index 0000000..079fc8b --- /dev/null +++ b/colab/proxy/jenkins/views.py @@ -0,0 +1,8 @@ + +from django.conf import settings + +from ..utils.views import ColabProxyView + + +class JenkinsProxyView(ColabProxyView): + upstream = settings.PROXIED_APPS['jenkins']['upstream'] diff --git a/colab/proxy/redmine/__init__.py b/colab/proxy/redmine/__init__.py new file mode 100644 index 0000000..38dd692 --- /dev/null +++ b/colab/proxy/redmine/__init__.py @@ -0,0 +1,3 @@ + + +default_app_config = 'proxy.redmine.apps.ProxyRedmineAppConfig' diff --git a/colab/proxy/redmine/admin.py b/colab/proxy/redmine/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/colab/proxy/redmine/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/colab/proxy/redmine/apps.py b/colab/proxy/redmine/apps.py new file mode 100644 index 0000000..62382e9 --- /dev/null +++ b/colab/proxy/redmine/apps.py @@ -0,0 +1,7 @@ + +from ..utils.apps import ColabProxiedAppConfig + + +class ProxyRedmineAppConfig(ColabProxiedAppConfig): + name = 'proxy.redmine' + verbose_name = 'Redmine Proxy' diff --git a/colab/proxy/redmine/diazo.xml b/colab/proxy/redmine/diazo.xml new file mode 100644 index 0000000..ba2fad0 --- /dev/null +++ b/colab/proxy/redmine/diazo.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/colab/proxy/redmine/models.py b/colab/proxy/redmine/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/colab/proxy/redmine/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/colab/proxy/redmine/tests.py b/colab/proxy/redmine/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/colab/proxy/redmine/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/colab/proxy/redmine/urls.py b/colab/proxy/redmine/urls.py new file mode 100644 index 0000000..d8e908b --- /dev/null +++ b/colab/proxy/redmine/urls.py @@ -0,0 +1,10 @@ + +from django.conf.urls import patterns, url + +from .views import RedmineProxyView + + +urlpatterns = patterns('', + # RedmineProxyView URLs + url(r'^redmine/(?P.*)$', RedmineProxyView.as_view()), +) diff --git a/colab/proxy/redmine/views.py b/colab/proxy/redmine/views.py new file mode 100644 index 0000000..5899440 --- /dev/null +++ b/colab/proxy/redmine/views.py @@ -0,0 +1,9 @@ + +from django.conf import settings + +from ..utils.views import ColabProxyView + + +class RedmineProxyView(ColabProxyView): + upstream = settings.PROXIED_APPS['redmine']['upstream'] + diazo_theme_template = 'proxy/redmine.html' diff --git a/colab/proxy/trac/__init__.py b/colab/proxy/trac/__init__.py new file mode 100644 index 0000000..5cb7f41 --- /dev/null +++ b/colab/proxy/trac/__init__.py @@ -0,0 +1,3 @@ + + +default_app_config = 'proxy.trac.apps.ProxyTracAppConfig' diff --git a/colab/proxy/trac/admin.py b/colab/proxy/trac/admin.py new file mode 100644 index 0000000..6127dc7 --- /dev/null +++ b/colab/proxy/trac/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +from . import signals diff --git a/colab/proxy/trac/apps.py b/colab/proxy/trac/apps.py new file mode 100644 index 0000000..371c253 --- /dev/null +++ b/colab/proxy/trac/apps.py @@ -0,0 +1,7 @@ + +from ..utils.apps import ColabProxiedAppConfig + + +class ProxyTracAppConfig(ColabProxiedAppConfig): + name = 'proxy.trac' + verbose_name = 'Trac Proxy' diff --git a/colab/proxy/trac/diazo.xml b/colab/proxy/trac/diazo.xml new file mode 100644 index 0000000..03ab404 --- /dev/null +++ b/colab/proxy/trac/diazo.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + diff --git a/colab/proxy/trac/migrations/0001_initial.py b/colab/proxy/trac/migrations/0001_initial.py new file mode 100644 index 0000000..20f94eb --- /dev/null +++ b/colab/proxy/trac/migrations/0001_initial.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations, connections + + +def create_views(apps, schema_editor): + connection = connections['trac'] + + cursor = connection.cursor() + + # revision_view + cursor.execute(''' + CREATE OR REPLACE VIEW revision_view AS SELECT + revision.rev, + revision.author, + revision.message, + repository.value AS repository_name, + TIMESTAMP WITH TIME ZONE 'epoch' + (revision.time/1000000) * INTERVAL '1s' AS created, + CONCAT(revision.repos, '-', revision.rev) AS key + FROM revision + INNER JOIN repository ON( + repository.id = revision.repos + AND repository.name = 'name' + AND repository.value != '' + ); + ''') + + # attachment_view + cursor.execute(''' + CREATE OR REPLACE VIEW attachment_view AS SELECT + CONCAT(attachment.type, '/' , attachment.id, '/', attachment.filename) AS url, + attachment.type AS used_by, + attachment.filename AS filename, + attachment.id as attach_id, + (SELECT LOWER(SUBSTRING(attachment.filename FROM '\.(\w+)$'))) AS mimetype, + attachment.author AS author, + attachment.description AS description, + attachment.size AS size, + TIMESTAMP WITH TIME ZONE 'epoch' + (attachment.time/1000000)* INTERVAL '1s' AS created + FROM attachment; + ''') + + # wiki_view + cursor.execute(''' + CREATE OR REPLACE VIEW wiki_view AS SELECT + wiki.name AS name, + (SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name + AND wiki2.version = MAX(wiki.version)) AS wiki_text, + (SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name + AND wiki3.version = 1) AS author, + string_agg(DISTINCT wiki.author, ', ') AS collaborators, + TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS created, + TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS modified, + (SELECT wiki4.author FROM wiki AS wiki4 WHERE wiki4.name = wiki.name + AND wiki4.version = MAX(wiki.version)) AS modified_by + FROM wiki + GROUP BY wiki.name; + ''') + + # ticket_view + cursor.execute(''' + CREATE OR REPLACE VIEW ticket_view AS SELECT + ticket.id AS id, + ticket.summary as summary, + ticket.description as description, + ticket.milestone as milestone, + ticket.priority as priority, + ticket.component as component, + ticket.version as version, + ticket.severity as severity, + ticket.reporter as reporter, + ticket.reporter as author, + ticket.status as status, + ticket.keywords as keywords, + (SELECT + string_agg(DISTINCT ticket_change.author, ', ') + FROM ticket_change WHERE ticket_change.ticket = ticket.id + GROUP BY ticket_change.ticket) as collaborators, + TIMESTAMP WITH TIME ZONE 'epoch' + (time/1000000)* INTERVAL '1s' AS created, + TIMESTAMP WITH TIME ZONE 'epoch' + (changetime/1000000) * INTERVAL '1s' AS modified, + (SELECT + ticket_change.author + FROM ticket_change + WHERE ticket_change.ticket = ticket.id + AND ticket_change.time = ticket.changetime + LIMIT 1 + ) AS modified_by + FROM ticket; + ''') + + # ticket_collab_count_view + cursor.execute(''' + CREATE OR REPLACE VIEW ticket_collab_count_view AS + SELECT + COALESCE (t1.author, t2.author) as author, + (COALESCE(t1.count, 0) + COALESCE(t2.count, 0)) as count + FROM + (SELECT author, count(*) as count + FROM ticket_change + GROUP BY author + ORDER BY author + ) AS t1 + FULL OUTER JOIN + (SELECT reporter as author, count(*) as count + FROM ticket + GROUP BY reporter + ORDER BY reporter + ) AS t2 + ON t1.author = t2.author; + ''') + + # wiki_collab_count_view + cursor.execute(''' + CREATE OR REPLACE VIEW wiki_collab_count_view AS + SELECT author, count(*) from wiki GROUP BY author; + ''') + + +def drop_views(apps, schema_editor): + connection = connections['trac'] + + cursor = connection.cursor() + cursor.execute(''' + DROP VIEW IF EXISTS revision_view; + DROP VIEW IF EXISTS ticket_view; + DROP VIEW IF EXISTS wiki_view; + DROP VIEW IF EXISTS ticket_collab_count_view; + DROP VIEW IF EXISTS wiki_collab_count_view; + DROP VIEW IF EXISTS attachment_view; + ''') + + +class Migration(migrations.Migration): + + dependencies = [ + ] + + operations = [ + migrations.RunPython(code=create_views, reverse_code=drop_views) + ] diff --git a/colab/proxy/trac/migrations/__init__.py b/colab/proxy/trac/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/proxy/trac/migrations/__init__.py diff --git a/colab/proxy/trac/models.py b/colab/proxy/trac/models.py new file mode 100644 index 0000000..c71b74d --- /dev/null +++ b/colab/proxy/trac/models.py @@ -0,0 +1,149 @@ +# -*- coding: utf-8 -*- +from django.db import models +from django.conf import settings +import os +import urllib2 + +from accounts.models import User +from hitcounter.models import HitCounterModelMixin + + +class Attachment(models.Model, HitCounterModelMixin): + url = models.TextField(primary_key=True) + attach_id = models.TextField() + used_by = models.TextField() + filename = models.TextField() + author = models.TextField(blank=True) + description = models.TextField(blank=True) + created = models.DateTimeField(blank=True) + mimetype = models.TextField(blank=True) + size = models.IntegerField(blank=True) + + class Meta: + managed = False + db_table = 'attachment_view' + + @property + def filepath(self): + return os.path.join( + settings.ATTACHMENTS_FOLDER_PATH, + self.used_by, + self.attach_id, + urllib2.quote(self.filename.encode('utf8')) + ) + + def get_absolute_url(self): + return u'/raw-attachment/{}'.format(self.url) + + def get_author(self): + try: + return User.objects.get(username=self.author) + except User.DoesNotExist: + return None + + +class Revision(models.Model, HitCounterModelMixin): + key = models.TextField(blank=True, primary_key=True) + rev = models.TextField(blank=True) + author = models.TextField(blank=True) + message = models.TextField(blank=True) + repository_name = models.TextField(blank=True) + created = models.DateTimeField(blank=True, null=True) + + class Meta: + managed = False + db_table = 'revision_view' + + def get_absolute_url(self): + return u'/changeset/{}/{}'.format(self.rev, self.repository_name) + + def get_author(self): + try: + return User.objects.get(username=self.author) + except User.DoesNotExist: + return None + + +class Ticket(models.Model, HitCounterModelMixin): + id = models.IntegerField(primary_key=True) + summary = models.TextField(blank=True) + description = models.TextField(blank=True) + milestone = models.TextField(blank=True) + priority = models.TextField(blank=True) + component = models.TextField(blank=True) + version = models.TextField(blank=True) + severity = models.TextField(blank=True) + reporter = models.TextField(blank=True) + author = models.TextField(blank=True) + status = models.TextField(blank=True) + keywords = models.TextField(blank=True) + collaborators = models.TextField(blank=True) + created = models.DateTimeField(blank=True, null=True) + modified = models.DateTimeField(blank=True, null=True) + modified_by = models.TextField(blank=True) + + class Meta: + managed = False + db_table = 'ticket_view' + + def get_absolute_url(self): + return u'/ticket/{}'.format(self.id) + + def get_author(self): + try: + return User.objects.get(username=self.author) + except User.DoesNotExist: + return None + + def get_modified_by(self): + try: + return User.objects.get(username=self.modified_by) + except User.DoesNotExist: + return None + + +class Wiki(models.Model, HitCounterModelMixin): + name = models.TextField(primary_key=True) + wiki_text = models.TextField(blank=True) + author = models.TextField(blank=True) + collaborators = models.TextField(blank=True) + created = models.DateTimeField(blank=True, null=True) + modified = models.DateTimeField(blank=True, null=True) + modified_by = models.TextField(blank=True) + + class Meta: + managed = False + db_table = 'wiki_view' + + def get_absolute_url(self): + return u'/wiki/{}'.format(self.name) + + def get_author(self): + try: + return User.objects.get(username=self.author) + except User.DoesNotExist: + return None + + def get_modified_by(self): + try: + return User.objects.get(username=self.modified_by) + except User.DoesNotExist: + return None + + +class WikiCollabCount(models.Model): + author = models.TextField(primary_key=True) + count = models.IntegerField() + + class Meta: + managed = False + db_table = 'wiki_collab_count_view' + + +class TicketCollabCount(models.Model): + author = models.TextField(primary_key=True) + count = models.IntegerField() + + class Meta: + managed = False + db_table = 'ticket_collab_count_view' diff --git a/colab/proxy/trac/routers.py b/colab/proxy/trac/routers.py new file mode 100644 index 0000000..9d053cb --- /dev/null +++ b/colab/proxy/trac/routers.py @@ -0,0 +1,23 @@ +class TracRouter(object): + def db_for_read(self, model, **hints): + if model._meta.app_label == 'proxy': + return 'trac' + return None + + def db_for_write(self, model, **hints): + if model._meta.app_label == 'proxy': + return 'trac' + return None + + def allow_relation(self, obj1, obj2, **hints): + if obj1._meta.app_label == 'proxy' or \ + obj2._meta.app_label == 'proxy': + return True + return None + + def allow_migrate(self, db, model): + if db == 'trac': + return model._meta.app_label == 'proxy' + elif model._meta.app_label == 'proxy': + False + return None diff --git a/colab/proxy/trac/search_indexes.py b/colab/proxy/trac/search_indexes.py new file mode 100644 index 0000000..c7c413f --- /dev/null +++ b/colab/proxy/trac/search_indexes.py @@ -0,0 +1,157 @@ +# -*- coding: utf-8 -*- + +import math +import string + +from django.template import loader, Context +from django.utils.text import slugify +from haystack import indexes +from haystack.utils import log as logging + +from search.base_indexes import BaseIndex +from .models import Attachment, Ticket, Wiki, Revision + + +logger = logging.getLogger('haystack') + +# the string maketrans always return a string encoded with latin1 +# http://stackoverflow.com/questions/1324067/how-do-i-get-str-translate-to-work-with-unicode-strings +table = string.maketrans( + string.punctuation, + '.' * len(string.punctuation) +).decode('latin1') + + +class AttachmentIndex(BaseIndex, indexes.Indexable): + title = indexes.CharField(model_attr='filename') + description = indexes.CharField(model_attr='description', null=True) + modified = indexes.DateTimeField(model_attr='created', null=True) + used_by = indexes.CharField(model_attr='used_by', null=True, stored=False) + mimetype = indexes.CharField( + model_attr='mimetype', + null=True, + stored=False + ) + size = indexes.IntegerField(model_attr='size', null=True, stored=False) + filename = indexes.CharField(stored=False) + + def get_model(self): + return Attachment + + def get_updated_field(self): + return 'created' + + def prepare(self, obj): + data = super(AttachmentIndex, self).prepare(obj) + + try: + file_obj = open(obj.filepath) + except IOError as e: + logger.warning(u'IOError: %s - %s', e.strerror, e.filename) + return data + backend = self._get_backend(None) + + extracted_data = backend.extract_file_contents(file_obj) + file_obj.close() + + if not extracted_data: + return data + + t = loader.select_template( + ('search/indexes/proxy/attachment_text.txt', ) + ) + data['text'] = t.render(Context({ + 'object': obj, + 'extracted': extracted_data, + })) + return data + + def prepare_filename(self, obj): + return obj.filename.translate(table).replace('.', ' ') + + def prepare_icon_name(self, obj): + return u'file' + + def prepare_type(self, obj): + return u'attachment' + + +class WikiIndex(BaseIndex, indexes.Indexable): + title = indexes.CharField(model_attr='name') + collaborators = indexes.CharField( + model_attr='collaborators', + null=True, + stored=False, + ) + + def get_model(self): + return Wiki + + def prepare_description(self, obj): + return u'{}\n{}'.format(obj.wiki_text, obj.collaborators) + + def prepare_icon_name(self, obj): + return u'book' + + def prepare_type(self, obj): + return u'wiki' + + +class TicketIndex(BaseIndex, indexes.Indexable): + tag = indexes.CharField(model_attr='status', null=True) + milestone = indexes.CharField(model_attr='milestone', null=True) + component = indexes.CharField(model_attr='component', null=True) + severity = indexes.CharField(model_attr='severity', null=True) + reporter = indexes.CharField(model_attr='reporter', null=True) + keywords = indexes.CharField(model_attr='keywords', null=True) + collaborators = indexes.CharField( + model_attr='collaborators', + null=True, + stored=False, + ) + + def get_model(self): + return Ticket + + def prepare_description(self, obj): + return u'{}\n{}\n{}\n{}\n{}\n{}\n{}'.format( + obj.description, obj.milestone, obj.component, obj.severity, + obj.reporter, obj.keywords, obj.collaborators + ) + + def prepare_icon_name(self, obj): + return u'tag' + + def prepare_title(self, obj): + return u'#{} - {}'.format(obj.pk, obj.summary) + + def prepare_type(self, obj): + return 'ticket' + + +class RevisionIndex(BaseIndex, indexes.Indexable): + description = indexes.CharField(model_attr='message', null=True) + modified = indexes.DateTimeField(model_attr='created', null=True) + repository_name = indexes.CharField( + model_attr='repository_name', + stored=False + ) + + def get_model(self): + return Revision + + def get_updated_field(self): + return 'created' + + def get_boost(self, obj): + boost = super(RevisionIndex, self).get_boost(obj) + return boost * 0.8 + + def prepare_icon_name(self, obj): + return u'align-right' + + def prepare_title(self, obj): + return u'{} [{}]'.format(obj.repository_name, obj.rev) + + def prepare_type(self, obj): + return 'changeset' diff --git a/colab/proxy/trac/signals.py b/colab/proxy/trac/signals.py new file mode 100644 index 0000000..0d477a6 --- /dev/null +++ b/colab/proxy/trac/signals.py @@ -0,0 +1,33 @@ + +from django.db import connections +from django.dispatch import receiver +from django.db.models.signals import post_save + +from accounts.models import User + + +@receiver(post_save, sender=User) +def change_session_attribute_email(sender, instance, **kwargs): + cursor = connections['trac'].cursor() + + cursor.execute(("UPDATE session_attribute SET value=%s " + "WHERE name='email' AND sid=%s"), + [instance.email, instance.username]) + cursor.execute(("UPDATE session_attribute SET value=%s " + "WHERE name='name' AND sid=%s"), + [instance.get_full_name(), instance.username]) + + cursor.execute(("INSERT INTO session_attribute " + "(sid, authenticated, name, value) " + "SELECT %s, '1', 'email', %s WHERE NOT EXISTS " + "(SELECT 1 FROM session_attribute WHERE sid=%s " + "AND name='email')"), + [instance.username, instance.email, instance.username]) + + cursor.execute(("INSERT INTO session_attribute " + "(sid, authenticated, name, value) " + "SELECT %s, '1', 'name', %s WHERE NOT EXISTS " + "(SELECT 1 FROM session_attribute WHERE sid=%s " + "AND name='name')"), + [instance.username, instance.get_full_name(), + instance.username]) diff --git a/colab/proxy/trac/templates/proxy/trac.html b/colab/proxy/trac/templates/proxy/trac.html new file mode 100644 index 0000000..bae56e4 --- /dev/null +++ b/colab/proxy/trac/templates/proxy/trac.html @@ -0,0 +1,7 @@ +{% extends "base.html" %} + +{% block head %} + + + {{ block.super }} +{% endblock %} diff --git a/colab/proxy/trac/templates/search/indexes/proxy/attachment_text.txt b/colab/proxy/trac/templates/search/indexes/proxy/attachment_text.txt new file mode 100644 index 0000000..9b22bae --- /dev/null +++ b/colab/proxy/trac/templates/search/indexes/proxy/attachment_text.txt @@ -0,0 +1,15 @@ +{{ object.filename }} +{{ object.filename|slugify }} +{{ object.description }} +{{ object.description|slugify }} +{{ object.used_by }} +{{ object.mimetype }} +{{ object.get_author.get_full_name }} + +{% for k, v in extracted.metadata.items %} + {% for val in v %} + {{ k }}: {{ val|safe }} + {% endfor %} +{% endfor %} + +{{ extracted.contents|striptags|safe }} diff --git a/colab/proxy/trac/templates/search/indexes/proxy/revision_text.txt b/colab/proxy/trac/templates/search/indexes/proxy/revision_text.txt new file mode 100644 index 0000000..64cca83 --- /dev/null +++ b/colab/proxy/trac/templates/search/indexes/proxy/revision_text.txt @@ -0,0 +1,8 @@ +{{ object.repository_name }} +{{ object.repository_name|slugify }} +{{ object.rev }} +{{ object.rev|slugify }} +{% firstof object.get_author.get_full_name object.author %} +{% firstof object.get_author.get_full_name|slugify object.author|slugify %} +{{ object.message }} +{{ object.message|slugify }} diff --git a/colab/proxy/trac/templates/search/indexes/proxy/ticket_text.txt b/colab/proxy/trac/templates/search/indexes/proxy/ticket_text.txt new file mode 100644 index 0000000..93d199e --- /dev/null +++ b/colab/proxy/trac/templates/search/indexes/proxy/ticket_text.txt @@ -0,0 +1,20 @@ +{{ object.summary }} +{{ object.summary|slugify }} +{{ object.description }} +{{ object.description|slugify }} +{{ object.milestone }} +{{ object.milestone|slugify }} +{{ object.component|slugify }} +{{ object.version }} +{{ object.severity }} +{{ object.severity|slugify }} +{{ object.reporter }} +{{ object.reporter|slugify }} +{% firstof object.get_author.get_fullname or object.author %} +{% firstof object.get_author.get_fullname|slugify or object.author|slugify %} +{{ object.status }} +{{ object.status|slugify }} +{{ object.keywords }} +{{ object.keywords|slugify }} +{{ object.collaborators }} +{{ object.collaborators|slugify }} diff --git a/colab/proxy/trac/templates/search/indexes/proxy/wiki_text.txt b/colab/proxy/trac/templates/search/indexes/proxy/wiki_text.txt new file mode 100644 index 0000000..d1b51c4 --- /dev/null +++ b/colab/proxy/trac/templates/search/indexes/proxy/wiki_text.txt @@ -0,0 +1,9 @@ +{{ object.author }} +{{ object.get_author.get_full_name }} +{{ object.get_author.get_full_name|slugify }} +{{ object.name }} +{{ object.name|slugify }} +{{ object.collaborators }} +{{ object.collaborators|slugify }} +{{ object.wiki_text }} +{{ object.wiki_text|slugify }} diff --git a/colab/proxy/trac/tests.py b/colab/proxy/trac/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/colab/proxy/trac/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/colab/proxy/trac/urls.py b/colab/proxy/trac/urls.py new file mode 100644 index 0000000..1acbba2 --- /dev/null +++ b/colab/proxy/trac/urls.py @@ -0,0 +1,10 @@ + +from django.conf.urls import patterns, url + +from .views import TracProxyView + + +urlpatterns = patterns('', + # Trac + url(r'^(?P.*)$', TracProxyView.as_view()), +) diff --git a/colab/proxy/trac/views.py b/colab/proxy/trac/views.py new file mode 100644 index 0000000..5ccdc85 --- /dev/null +++ b/colab/proxy/trac/views.py @@ -0,0 +1,42 @@ + +from django.conf import settings + +from hitcounter.views import HitCounterViewMixin + +from ..utils.views import ColabProxyView +from .models import Wiki, Ticket, Revision + + +class TracProxyView(HitCounterViewMixin, ColabProxyView): + upstream = settings.PROXIED_APPS['trac']['upstream'] + diazo_theme_template = 'proxy/trac.html' + + def get_object(self): + obj = None + + if self.request.path_info.startswith('/wiki'): + wiki_name = self.request.path_info.split('/', 2)[-1] + if not wiki_name: + wiki_name = 'WikiStart' + try: + obj = Wiki.objects.get(name=wiki_name) + except Wiki.DoesNotExist: + return None + elif self.request.path_info.startswith('/ticket'): + ticket_id = self.request.path_info.split('/')[2] + try: + obj = Ticket.objects.get(id=ticket_id) + except (Ticket.DoesNotExist, ValueError): + return None + elif self.request.path_info.startswith('/changeset'): + try: + changeset, repo = self.request.path_info.split('/')[2:4] + except ValueError: + return None + try: + obj = Revision.objects.get(rev=changeset, + repository_name=repo) + except Revision.DoesNotExist: + return None + + return obj diff --git a/colab/proxy/utils/__init__.py b/colab/proxy/utils/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/proxy/utils/__init__.py diff --git a/colab/proxy/utils/apps.py b/colab/proxy/utils/apps.py new file mode 100644 index 0000000..9369ff1 --- /dev/null +++ b/colab/proxy/utils/apps.py @@ -0,0 +1,6 @@ + +from django.apps import AppConfig + + +class ColabProxiedAppConfig(AppConfig): + colab_proxied_app = True diff --git a/colab/proxy/utils/views.py b/colab/proxy/utils/views.py new file mode 100644 index 0000000..429ebe6 --- /dev/null +++ b/colab/proxy/utils/views.py @@ -0,0 +1,10 @@ + +from django.conf import settings + +from revproxy.views import ProxyView + + +class ColabProxyView(ProxyView): + add_remote_user = settings.REVPROXY_ADD_REMOTE_USER + diazo_theme_template = 'base.html' + html5 = True diff --git a/colab/rss/__init__.py b/colab/rss/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/rss/__init__.py diff --git a/colab/rss/feeds.py b/colab/rss/feeds.py new file mode 100644 index 0000000..7bec55f --- /dev/null +++ b/colab/rss/feeds.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python +# encoding: utf-8 + +from django.contrib.syndication.views import Feed +from django.utils.translation import ugettext as _ + +from haystack.query import SearchQuerySet + +from super_archives.models import Thread + + +class LatestThreadsFeeds(Feed): + title = _(u'Latest Discussions') + link = '/rss/threads/latest/' + + def items(self): + return Thread.objects.all()[:20] + + def item_link(self, item): + return item.latest_message.url + + def item_title(self, item): + title = '[' + item.mailinglist.name + '] ' + title += item.latest_message.subject_clean + return title + + def item_description(self, item): + return item.latest_message.body + + +class HottestThreadsFeeds(Feed): + title = _(u'Discussions Most Relevance') + link = '/rss/threads/hottest/' + + def items(self): + return Thread.highest_score.all()[:20] + + def item_link(self, item): + return item.latest_message.url + + def item_title(self, item): + title = '[' + item.mailinglist.name + '] ' + title += item.latest_message.subject_clean + return title + + def item_description(self, item): + return item.latest_message.body + + +class LatestColabFeeds(Feed): + title = _(u'Latest collaborations') + link = '/rss/colab/latest/' + + def items(self): + items = SearchQuerySet().order_by('-modified', '-created')[:20] + return items + + def item_title(self, item): + type_ = item.type + ': ' + mailinglist = item.tag + + if mailinglist: + prefix = type_ + mailinglist + ' - ' + else: + prefix = type_ + + return prefix + item.title + + def item_description(self, item): + return item.latest_description + + def item_link(self, item): + return item.url diff --git a/colab/rss/urls.py b/colab/rss/urls.py new file mode 100644 index 0000000..a26b6f6 --- /dev/null +++ b/colab/rss/urls.py @@ -0,0 +1,9 @@ +from django.conf.urls import patterns, url +import feeds + +urlpatterns = patterns('', + url(r'threads/latest/$', feeds.LatestThreadsFeeds(), name='rss_latest_threads'), + url(r'colab/latest/$', feeds.LatestColabFeeds(), name='rss_latest_colab'), + url(r'threads/hottest/$', feeds.HottestThreadsFeeds(), name='rss_hottest_threads'), +) + diff --git a/colab/search/__init__.py b/colab/search/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/search/__init__.py diff --git a/colab/search/admin.py b/colab/search/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/colab/search/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/colab/search/base_indexes.py b/colab/search/base_indexes.py new file mode 100644 index 0000000..5a73182 --- /dev/null +++ b/colab/search/base_indexes.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- + +import math + +from haystack import indexes + + +class BaseIndex(indexes.SearchIndex): + text = indexes.CharField(document=True, use_template=True, stored=False) + url = indexes.CharField(model_attr='get_absolute_url', indexed=False) + title = indexes.CharField() + description = indexes.CharField(null=True) + fullname = indexes.CharField(null=True) + author = indexes.CharField(null=True) + author_url = indexes.CharField(null=True, indexed=False) + created = indexes.DateTimeField(model_attr='created', null=True) + modified = indexes.DateTimeField(model_attr='modified', null=True) + type = indexes.CharField() + icon_name = indexes.CharField(indexed=False) + fullname_and_username = indexes.CharField(null=True, stored=False) + hits = indexes.IntegerField(model_attr='hits') + modified_by = indexes.CharField(null=True) + modified_by_url = indexes.CharField(null=True) + + def get_updated_field(self): + return 'modified' + + def get_boost(self, obj): + if obj.hits <= 10: + return 1 + + return math.log(obj.hits) + + def prepare(self, obj): + self.author_obj = None + if hasattr(obj, 'get_author'): + self.author_obj = obj.get_author() + + data = super(BaseIndex, self).prepare(obj) + data['boost'] = self.get_boost(obj) + + return data + + def prepare_author(self, obj): + if self.author_obj: + return self.author_obj.username + return obj.author + + def prepare_author_url(self, obj): + if self.author_obj: + return self.author_obj.get_absolute_url() + return None + + def prepare_fullname(self, obj): + if hasattr(obj, 'modified_by'): + modified_by = obj.get_modified_by() + if modified_by: + return modified_by.get_full_name() + if self.author_obj: + return self.author_obj.get_full_name() + return obj.author + + def prepare_fullname_and_username(self, obj): + if hasattr(obj, 'modified_by'): + modified_by = obj.get_modified_by() + if modified_by: + return u'{}\n{}'.format( + modified_by.get_full_name(), + modified_by.username, + ) + if not self.author_obj: + return obj.author + return u'{}\n{}'.format( + self.author_obj.get_full_name(), + self.author_obj.username, + ) + + def prepare_modified_by(self, obj): + if hasattr(obj, 'modified_by'): + modified_by = obj.get_modified_by() + if modified_by: + return modified_by.get_full_name() + if self.author_obj: + return self.author_obj.get_full_name() + return obj.author + + def prepare_modified_by_url(self, obj): + if hasattr(obj, 'modified_by'): + modified_by = obj.get_modified_by() + if modified_by: + return modified_by.get_absolute_url() + if self.author_obj: + return self.author_obj.get_absolute_url() + return None diff --git a/colab/search/forms.py b/colab/search/forms.py new file mode 100644 index 0000000..439286e --- /dev/null +++ b/colab/search/forms.py @@ -0,0 +1,169 @@ +# -*- coding: utf-8 -*- + +import unicodedata + +from django import forms +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ +from haystack.forms import SearchForm +from haystack.inputs import AltParser + +from accounts.models import User +from super_archives.models import Message, MailingList + + +class ColabSearchForm(SearchForm): + q = forms.CharField(label=_('Search'), required=False) + order = forms.CharField(widget=forms.HiddenInput(), required=False) + type = forms.CharField(required=False, label=_(u'Type')) + author = forms.CharField(required=False, label=_(u'Author')) + modified_by = forms.CharField(required=False, label=_(u'Modified by')) + # ticket status + tag = forms.CharField(required=False, label=_(u'Status')) + # mailinglist tag + list = forms.MultipleChoiceField( + required=False, + label=_(u'Mailinglist'), + choices=[(v, v) for v in MailingList.objects.values_list( + 'name', flat=True)] + ) + milestone = forms.CharField(required=False, label=_(u'Milestone')) + priority = forms.CharField(required=False, label=_(u'Priority')) + component = forms.CharField(required=False, label=_(u'Component')) + severity = forms.CharField(required=False, label=_(u'Severity')) + reporter = forms.CharField(required=False, label=_(u'Reporter')) + keywords = forms.CharField(required=False, label=_(u'Keywords')) + collaborators = forms.CharField(required=False, label=_(u'Collaborators')) + repository_name = forms.CharField(required=False, label=_(u'Repository')) + username = forms.CharField(required=False, label=_(u'Username')) + name = forms.CharField(required=False, label=_(u'Name')) + institution = forms.CharField(required=False, label=_(u'Institution')) + role = forms.CharField(required=False, label=_(u'Role')) + since = forms.DateField(required=False, label=_(u'Since')) + until = forms.DateField(required=False, label=_(u'Until')) + filename = forms.CharField(required=False, label=_(u'Filename')) + used_by = forms.CharField(required=False, label=_(u'Used by')) + mimetype = forms.CharField(required=False, label=_(u'File type')) + size = forms.CharField(required=False, label=_(u'Size')) + + def search(self): + if not self.is_valid(): + return self.no_query_found() + + # filter_or goes here + sqs = self.searchqueryset.all() + mimetype = self.cleaned_data['mimetype'] + if mimetype: + filter_mimetypes = {'mimetype__in': []} + for type_, display, mimelist in settings.FILE_TYPE_GROUPINGS: + if type_ in mimetype: + filter_mimetypes['mimetype__in'] += mimelist + if not self.cleaned_data['size']: + sqs = sqs.filter_or(mimetype__in=mimelist) + + if self.cleaned_data['size']: + # (1024 * 1024) / 2 + # (1024 * 1024) * 10 + filter_sizes = {} + filter_sizes_exp = {} + if '<500KB' in self.cleaned_data['size']: + filter_sizes['size__lt'] = 524288 + if '500KB__10MB' in self.cleaned_data['size']: + filter_sizes_exp['size__gte'] = 524288 + filter_sizes_exp['size__lte'] = 10485760 + if '>10MB' in self.cleaned_data['size']: + filter_sizes['size__gt'] = 10485760 + + if self.cleaned_data['mimetype']: + # Add the mimetypes filters to this dict and filter it + if filter_sizes_exp: + filter_sizes_exp.update(filter_mimetypes) + sqs = sqs.filter_or(**filter_sizes_exp) + for filter_or in filter_sizes.items(): + filter_or = dict((filter_or, )) + filter_or.update(filter_mimetypes) + sqs = sqs.filter_or(**filter_or) + else: + for filter_or in filter_sizes.items(): + filter_or = dict((filter_or, )) + sqs = sqs.filter_or(**filter_or) + sqs = sqs.filter_or(**filter_sizes_exp) + + if self.cleaned_data['used_by']: + sqs = sqs.filter_or(used_by__in=self.cleaned_data['used_by'].split()) + + + if self.cleaned_data['q']: + q = unicodedata.normalize( + 'NFKD', self.cleaned_data.get('q') + ).encode('ascii', 'ignore') + + dismax_opts = { + 'q.alt': '*.*', + 'pf': 'title^2.1 author^1.9 description^1.7', + 'mm': '2<70%', + + # Date boosting: http://wiki.apache.org/solr/FunctionQuery#Date_Boosting + 'bf': 'recip(ms(NOW/HOUR,modified),3.16e-11,1,1)^10', + } + + sqs = sqs.filter(content=AltParser('edismax', q, **dismax_opts)) + + if self.cleaned_data['type']: + sqs = sqs.filter(type=self.cleaned_data['type']) + + if self.cleaned_data['order']: + for option, dict_order in settings.ORDERING_DATA.items(): + if self.cleaned_data['order'] == option: + if dict_order['fields']: + sqs = sqs.order_by(*dict_order['fields']) + + if self.cleaned_data['author']: + sqs = sqs.filter( + fullname_and_username__contains=self.cleaned_data['author'] + ) + + if self.cleaned_data['modified_by']: + sqs = sqs.filter( + fullname_and_username__contains=self.cleaned_data['modified_by'] + ) + + if self.cleaned_data['milestone']: + sqs = sqs.filter(milestone=self.cleaned_data['milestone']) + if self.cleaned_data['priority']: + sqs = sqs.filter(priority=self.cleaned_data['priority']) + if self.cleaned_data['severity']: + sqs = sqs.filter(severity=self.cleaned_data['severity']) + if self.cleaned_data['reporter']: + sqs = sqs.filter(reporter=self.cleaned_data['reporter']) + if self.cleaned_data['keywords']: + sqs = sqs.filter(keywords=self.cleaned_data['keywords']) + if self.cleaned_data['collaborators']: + sqs = sqs.filter(collaborators=self.cleaned_data['collaborators']) + if self.cleaned_data['repository_name']: + sqs = sqs.filter( + repository_name=self.cleaned_data['repository_name'] + ) + if self.cleaned_data['username']: + sqs = sqs.filter(username=self.cleaned_data['username']) + if self.cleaned_data['name']: + sqs = sqs.filter(name=self.cleaned_data['name']) + if self.cleaned_data['institution']: + sqs = sqs.filter(institution=self.cleaned_data['institution']) + if self.cleaned_data['role']: + sqs = sqs.filter(role=self.cleaned_data['role']) + if self.cleaned_data['tag']: + sqs = sqs.filter(tag=self.cleaned_data['tag']) + + if self.cleaned_data['list']: + sqs = sqs.filter(tag__in=self.cleaned_data['list']) + + if self.cleaned_data['since']: + sqs = sqs.filter(modified__gte=self.cleaned_data['since']) + if self.cleaned_data['until']: + sqs = sqs.filter(modified__lte=self.cleaned_data['until']) + + if self.cleaned_data['filename']: + sqs = sqs.filter(filename=self.cleaned_data['filename']) + + return sqs diff --git a/colab/search/models.py b/colab/search/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/colab/search/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/colab/search/templates/search/includes/search_filters.html b/colab/search/templates/search/includes/search_filters.html new file mode 100644 index 0000000..d9068d7 --- /dev/null +++ b/colab/search/templates/search/includes/search_filters.html @@ -0,0 +1,201 @@ +{% load i18n superarchives %} + +{% if filters %} + +
+
+ + + + + + + {% for field_lookup, field_display, field_value in filters.fields %} +
+ + {% if field_lookup == "list" %} + + {% elif field_lookup == "size" %} +
    + {% for value, option in size_choices %} + {% with value|add:" "|add:size_chosen as sizelistadd %} + {% if value in field_value %} +
  • + + {{ option }} +
  • + {% else %} +
  • + + {{ option }} +
  • + {% endif %} + {% endwith %} + {% endfor %} +
+ {% elif field_lookup == "mimetype" %} +
    + {% for value, option in mimetype_choices %} + {% with value|add:" "|add:mimetype_chosen as mimelistadd %} + {% if value in mimetype_chosen %} +
  • + + {{ option }} +
  • + {% else %} +
  • + + {{ option }} +
  • + {% endif %} + {% endwith %} + {% endfor %} +
+ {% elif field_lookup == "used_by" %} +
    + {% for value, option in used_by_choices %} + {% with value|add:" "|add:used_by_chosen as used_byadd %} + {% if value in used_by_chosen %} +
  • + + {{ option }} +
  • + {% else %} +
  • + + {{ option }} +
  • + {% endif %} + {% endwith %} + {% endfor %} +
+ {% else %} + + {% endif %} +
+ {% endfor %} + +
+


+{% endif %} + +

{% trans "Sort by" %}

+ + +{% if not request.GET.type %} +

{% trans "Types" %}

+ + +{% endif %} +
+ + + + + + diff --git a/colab/search/templates/search/search-message-preview.html b/colab/search/templates/search/search-message-preview.html new file mode 100644 index 0000000..e449429 --- /dev/null +++ b/colab/search/templates/search/search-message-preview.html @@ -0,0 +1,18 @@ +{% load i18n %} + + + +{% if result.mailinglist %} + + {{ result.mailinglist }} + +{% endif %} + + + + {{ result.title }} + + + +- {{ result.description|striptags }} diff --git a/colab/search/templates/search/search-revision-preview.html b/colab/search/templates/search/search-revision-preview.html new file mode 100644 index 0000000..1f99c44 --- /dev/null +++ b/colab/search/templates/search/search-revision-preview.html @@ -0,0 +1,9 @@ +{% load i18n %} + + + + + {{ result.repository_name }} [{{ result.revision }}] + + +{% if result.message %}- {{ result.message }}{% endif %} diff --git a/colab/search/templates/search/search-ticket-preview.html b/colab/search/templates/search/search-ticket-preview.html new file mode 100644 index 0000000..eade62b --- /dev/null +++ b/colab/search/templates/search/search-ticket-preview.html @@ -0,0 +1,16 @@ +{% load i18n %} +{% load highlight %} + + + + +{% if result.status %} + {{ result.status }} +{% endif %} + + + #{{ result.pk }} - {% filter striptags|truncatewords:50 %}{{ result.summary|escape }}{% endfilter %} + + + +- {% highlight result.description with query max_length "150" %} diff --git a/colab/search/templates/search/search-user-preview.html b/colab/search/templates/search/search-user-preview.html new file mode 100644 index 0000000..cee56c5 --- /dev/null +++ b/colab/search/templates/search/search-user-preview.html @@ -0,0 +1,9 @@ +{% load i18n %} + + + + + {{ result.name }} + + +{% if result.institution %}- {{ result.institution }}{% endif %}{% if result.role %} - {{ result.role }}{% endif %} diff --git a/colab/search/templates/search/search-wiki-preview.html b/colab/search/templates/search/search-wiki-preview.html new file mode 100644 index 0000000..e62f954 --- /dev/null +++ b/colab/search/templates/search/search-wiki-preview.html @@ -0,0 +1,9 @@ +{% load i18n %} + + + + + {{ result.name }} + + +{% if result.wiki_text %}- {{ result.wiki_text|truncatechars:150 }}{% elif result.comment %}- {{ result.comment|truncatechars:150 }}{% endif %} diff --git a/colab/search/templates/search/search.html b/colab/search/templates/search/search.html new file mode 100644 index 0000000..a3b9ac2 --- /dev/null +++ b/colab/search/templates/search/search.html @@ -0,0 +1,159 @@ +{% extends "base.html" %} +{% load i18n highlight superarchives static %} + +{% block title %}{% trans 'search'|title %}{% endblock %} + +{% block head_js %} + +{% if use_language %} + +{% endif %} + + +{% endblock %} + +{% block head_css %} + +{% endblock %} + +{% block main-content %} +
+
+

{% trans "Search" %}

+
+
+

+

+ {{ page.paginator.count }} {% trans "documents found" %} +

+
+
+ +
+ +
+ + +
+ + + + + +
+
    + {% for result in page.object_list %} + {% include "message-preview.html" %} + {% empty %} +
  • + {% trans "No results for your search." %} + {% if request.GET.q %} +

    {% trans "You are searching for" %} {{ request.GET.q }}

    + {% endif %} +
  • + {% endfor %} +
+ + {% if page.has_other_pages %} +
+ +
+ {% endif %} +
+ +
+ +{% endblock %} diff --git a/colab/search/tests.py b/colab/search/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/colab/search/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/colab/search/urls.py b/colab/search/urls.py new file mode 100644 index 0000000..0139e86 --- /dev/null +++ b/colab/search/urls.py @@ -0,0 +1,14 @@ +from django.conf.urls import patterns, include, url +from haystack.query import SearchQuerySet + +from .forms import ColabSearchForm +from .views import ColabSearchView + + +urlpatterns = patterns('', + url(r'^$', ColabSearchView( + template='search/search.html', + searchqueryset=SearchQuerySet(), + form_class=ColabSearchForm, + ), name='haystack_search'), +) diff --git a/colab/search/utils.py b/colab/search/utils.py new file mode 100644 index 0000000..8372ee3 --- /dev/null +++ b/colab/search/utils.py @@ -0,0 +1,14 @@ + +from django.utils.translation import ugettext as _ + + +def trans(key): + translations = { + 'wiki': _('Wiki'), + 'thread': _('Emails'), + 'changeset': _('Code'), + 'ticket': _('Tickets'), + 'attachment': _('Attachments'), + } + + return translations.get(key, key) diff --git a/colab/search/views.py b/colab/search/views.py new file mode 100644 index 0000000..751f18e --- /dev/null +++ b/colab/search/views.py @@ -0,0 +1,176 @@ +# -*- coding:utf-8 -*- + +from django.conf import settings +from django.utils.translation import ugettext as _ + +from haystack.views import SearchView + +#from proxy.trac.models import Attachment + + +class ColabSearchView(SearchView): + def extra_context(self, *args, **kwargs): + + use_language, date_format = settings.DJANGO_DATE_FORMAT_TO_JS.get( + self.request.LANGUAGE_CODE, (None, None) + ) + + types = { + 'thread': { + 'name': _(u'Discussion'), + 'fields': ( + ('author', _(u'Author'), self.request.GET.get('author')), + ( + 'list', + _(u'Mailinglist'), + self.request.GET.getlist('list') + ), + ), + }, + } + # TODO: Replace for a more generic plugin architecture + #if settings.TRAC_ENABLED: + # types['wiki'] = { + # 'name': _(u'Wiki'), + # 'fields': ( + # ('author', _(u'Author'), self.request.GET.get('author')), + # ( + # 'collaborators', + # _(u'Collaborators'), + # self.request.GET.get('collaborators'), + # ), + # ), + # } + + # types['ticket'] = { + # 'name': _(u'Ticket'), + # 'fields': ( + # ( + # 'milestone', + # _(u'Milestone'), + # self.request.GET.get('milestone') + # ), + # ( + # 'priority', + # _(u'Priority'), + # self.request.GET.get('priority') + # ), + # ( + # 'component', + # _(u'Component'), + # self.request.GET.get('component') + # ), + # ( + # 'severity', + # _(u'Severity'), + # self.request.GET.get('severity') + # ), + # ( + # 'reporter', + # _(u'Reporter'), + # self.request.GET.get('reporter') + # ), + # ('author', _(u'Author'), self.request.GET.get('author')), + # ('tag', _(u'Status'), self.request.GET.get('tag')), + # ( + # 'keywords', + # _(u'Keywords'), + # self.request.GET.get('keywords'), + # ), + # ( + # 'collaborators', + # _(u'Collaborators'), + # self.request.GET.get('collaborators') + # ), + # ), + # } + + # types['changeset'] = { + # 'name': _(u'Changeset'), + # 'fields': ( + # ('author', _(u'Author'), self.request.GET.get('author')), + # ( + # 'repository_name', + # _(u'Repository'), + # self.request.GET.get('repository_name'), + # ), + # ) + # } + + # types['user'] = { + # 'name': _(u'User'), + # 'fields': ( + # ( + # 'username', + # _(u'Username'), + # self.request.GET.get('username'), + # ), + # ('name', _(u'Name'), self.request.GET.get('name')), + # ( + # 'institution', + # _(u'Institution'), + # self.request.GET.get('institution'), + # ), + # ('role', _(u'Role'), self.request.GET.get('role')) + # ), + # } + + # types['attachment'] = { + # 'name': _(u'Attachment'), + # 'fields': ( + # ( + # 'filename', + # _(u'Filename'), + # self.request.GET.get('filename') + # ), + # ('author', _(u'Author'), self.request.GET.get('author')), + # ( + # 'used_by', + # _(u'Used by'), self.request.GET.get('used_by')), + # ( + # 'mimetype', + # _(u'File type'), + # self.request.GET.get('mimetype') + # ), + # ('size', _(u'Size'), self.request.GET.get('size')), + # ) + # } + + try: + type_chosen = self.form.cleaned_data.get('type') + except AttributeError: + type_chosen = '' + + mimetype_choices = () + size_choices = () + used_by_choices = () + + if type_chosen == 'attachment': + mimetype_choices = [(type_, display) for type_, display, mimelist_ in settings.FILE_TYPE_GROUPINGS] + size_choices = [ + ('<500KB', u'< 500 KB'), + ('500KB__10MB', u'>= 500 KB <= 10 MB'), + ('>10MB', u'> 10 MB'), + ] + used_by_choices = set([ + (v, v) for v in Attachment.objects.values_list( + 'used_by', flat=True) + ]) + + mimetype_chosen = self.request.GET.get('mimetype') + size_chosen = self.request.GET.get('size') + used_by_chosen = self.request.GET.get('used_by') + + return dict( + filters=types.get(type_chosen), + type_chosen=type_chosen, + order_data=settings.ORDERING_DATA, + date_format=date_format, + use_language=use_language, + mimetype_chosen=mimetype_chosen if mimetype_chosen else '', + mimetype_choices=mimetype_choices, + size_chosen=size_chosen if size_chosen else '', + size_choices=size_choices, + used_by_chosen=used_by_chosen if used_by_chosen else '', + used_by_choices=used_by_choices, + ) diff --git a/colab/static/css/screen.css b/colab/static/css/screen.css new file mode 100644 index 0000000..dc9cf89 --- /dev/null +++ b/colab/static/css/screen.css @@ -0,0 +1,451 @@ + +body { + padding-top: 57px; +} + +li hr { + margin: 10px 0; +} + +/* Header */ + +#header-searchbox { + width: 190px; +} + +#header-hr { + margin-top: 0; +} + +.navbar-default .navbar-brand, +.navbar a.dropdown-toggle.user { + padding: 0; + margin-top: 5px; + margin-left: 10px; +} + +.navbar-brand img { + height: 40px; +} + +#user-menu .wrapper { + padding: 3px 10px; + white-space: nowrap; +} + +#user-menu .wrapper a { + margin: 5px 0; +} + +#user-menu .user-info { + display: inline-block; + vertical-align: top; + padding-left: 5px; +} + +#user-menu .user-info span { + display: block; +} + +#user-menu .dropdown-menu .thumbnail { + width: 100px; + display: inline-block; +} + +/* End of Header */ + + +/* From message-preview.html*/ +.quiet { + color: #999; + font-size: 85%; +} + +.preview-message { + white-space: nowrap; + overflow: hidden; + line-height: 25px; + border-bottom: solid 1px #ddd; +} + +.preview-message a { + text-decoration: none; +} + +.preview-message img { + margin-right: 5px; +} + +.subject, +.subject a { + color: #000; +} + +.subject a:hover, +.subject a:focus { + text-decoration: underline; + color: #335; +} + +.subject img { + margin-right: 5px; +} + +/* message-list (ul wrapping preview-message) */ + +ul.message-list { + padding: 0; +} + +ul.message-list li { + list-style: none; +} + +/* End of message-preview.html */ + + +/* Forms */ +.required label:before { + color: #f00; + content: "* "; +} + +form.signup .form-group { + width: 90%; + margin-left: 0.5em; +} + +div.submit { + margin: auto; + margin-bottom: 5em; + width: 200px; +} + +.checkbox ul { + list-style: none; + padding: 0; +} + +.checkbox ul li { + line-height: 1.6; +} + +/* End Forms */ + + +/* User profile */ + +.vcard { + min-height: 400px; +} + +.vcard .thumbnail { + width: 200px; + height: 200px; +} + +.vcard h1 { + margin: 0; + padding: 0; + font-size: 26px; + line-height: 33px; + letter-spacing: -1px; +} + +.vcard h1 span, +.vcard h1 em { + display: inline-block; + overflow-x: hidden; + text-overflow: ellipsis; + width: 100%; + padding: 0; + vertical-align: bottom; +} + +.vcard h1 em { + font-weight: 300; + font-size: 20px; + font-size: 20px; + letter-spacing: 1px; +} + +.vcard .divider { + border-bottom: 1px solid #EEE; + margin-top: 10px; +} + + +/* end of User profile */ + + +.rss-icon { + background-image: url(../img/rss.png); + width: 16px; + height: 16px; + display: inline-block; + margin-left: 3px; +} + +.column-align { + display: inline-block; + margin-bottom: 20px; +} + +#filters h4 { + margin-top: 25px; +} + +ul.unstyled-list { + list-style-type: none; + padding: 3px 0; + margin: 10px 0; +} + +ul.unstyled-list li { + min-height: 27px; +} + +ul.unstyled-list .glyphicon-chevron-right { + font-size: 85%; +} + +#avatar { + background-color: #FFF; + padding: 9px 12px; + width: 47px; + height: 50px; +} + +.blog-post-item .post-meta { + margin-bottom: 2em; +} + +.blog-post-item .tags { + margin-top: 1em; +} + +.reply.btn { + margin-left: 1em; +} + +.email-message pre { + border: 0; + background-color: #fff; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; +} + +.email-message .user-fullname { + vertical-align: middle; +} + +.email-message .panel-heading img { + margin-right: 10px; +} + +.email-message .panel-heading .date { + margin-right: 10px; +} + +.email-message .panel-heading { + padding: 10px 0; +} + +.selected .glyphicon-remove { + color: #f00; +} + +.selected a { + color: #000; + font-weight: bold; +} + +.toggle-reply { + height: 10px; + line-height: 3px; + padding: 0px 5px 14px; + vertical-align: middle; + font-size: 20px; + background-color: #bbb; + border-color: #aaa; +} + +.toggle-reply:hover, +.toggle-reply:focus { + background-color: #aaa; + border-color: #999; +} + +/* Converse JS */ + +#chatpanel form#converse-login { + padding: 0; +} + +#chatpanel form#converse-login input, +#chatpanel form#converse-login label { + margin: 2px 10px; +} + +#chatpanel form#converse-login .login-submit{ + margin-top: 10px; +} + +#chatpanel a.configure-chatroom-button, +#chatpanel a.close-chatbox-button { + background-color: #F6F6F6; + margin-right: 0.6em; +} + +#chatpanel .chat-head #controlbox-tabs li { + width:32%; +} + +#chatpanel .oc-chat-head { + height: 37px; +} + +#chatpanel .chatbox dl.dropdown { + margin-top: 0; +} + +#chatpanel #converse-roster { + height: 207px; +} + +#chatpanel #toggle-controlbox { + font-size: 100% !important; + padding: 0 4px 26px !important; +} + +#chatpanel { + height: 342px !important; +} + +#chatpanel div#controlbox-panes { + width: auto; +} + +#chatpanel .chat-head-chatbox, #chatpanel .chat-head-chatroom { + height: 40.5px; +} + +#chatpanel form.sendXMPPMessage { + height: 76px; + border: none; +} + +#chatpanel form.sendXMPPMessage textarea { + width: 189px; + max-width: 285px; + max-height: 66px; +} + +#chatpanel .chatbox form.sendXMPPMessage textarea { + max-width: 189px; +} + +#chatpanel .chat-content, +#chatpanel .chatroom .participants{ + width: auto; +} + +#chatpanel div#chatrooms { + overflow-y: visible; +} + + +/* End of Converse JS*/ + + +/* Feedzilla */ + +#planet .well h3 { + margin-top: 0; +} + +.tag-cloud { + text-align: justify; + margin-top: 6px; +} + +.tag-cloud .size-1 { + font-size: 0.9em; +} + +.tag-cloud .size-2 { + font-size: 1.2em; +} + +.tag-cloud .size-3 { + font-size: 1.4em; +} + +.tag-cloud .size-4 { + font-size: 1.6em; +} + +/* end Feedzilla */ + +/* user profile update */ + +.btn.delete-email:not(:hover) { + background-color: #fff; + color: #D9534F; +} + +.btn .icon-warning-sign { + color: #F0AD4E; +} + +ul.emails { + margin: 0; +} + +/* end user profile update */ + +/* search highlighting */ +span.highlighted { + background-color: yellow; +} + +/* paginator icon */ +.small-icon { + font-size: 10px; +} + +/* Subscribe list */ +.vcard .label { + line-height: 2; +} + +/* Message link */ + +.div-message-link { + display: inline !important; +} + +.message-link { + margin-left: 15px; +} + +.email-message .popover { + max-width: 350px; + width: 350px; +} + +/* Chart div */ +.chart { + text-align: center; +} + +.chart > canvas { + width: 250px; +} + +.chart > p { + text-align: center; + line-height: 1.5em; +} +.chart > p > label { + margin: 0 2px; +} diff --git a/colab/static/dpaste/css/theme.css b/colab/static/dpaste/css/theme.css new file mode 100644 index 0000000..5da06ca --- /dev/null +++ b/colab/static/dpaste/css/theme.css @@ -0,0 +1,212 @@ + +.shortcut { + color: #AAA; + font-size: 13px; + font-weight: 300; + margin-left: 15px; +} + +.form-horizontal .form-group { + margin: 0 0 20px 0; +} + +#id_content{ + width: 100%; + font-family: monospace; + font-size: 14px; + line-height: 16px; +} + +/* ---------------------------------------------------------------------------- + Snippet Details +---------------------------------------------------------------------------- */ +#snippet-diff { + display: none; +} +.snippet-options{ + margin-bottom: 20px; +} + +.snippet-reply { + margin-top: 30px; +} + +.snippet-reply-hidden { + opacity: 0.3; +} + +.snippet-reply-hidden, +.snippet-reply-hidden *{ + cursor: pointer; +} + +.snippet-diff-form { +} + +.snippet-rendered { + color: #666; + font-size: 16px; + line-height: 24px; + max-width: 620px; + font-family: Helvetica, FreeSerif, serif; + font-weight: 300; +} +.diff-form { +/* margin-bottom: 10px;*/ +} + +#diff { + margin-bottom: 10px; +/* display: none;*/ +} + +.tree{ + width: 100%; + line-height: 1.8em; +} + +.tree ul, +.tree ul li{ + margin: 0; + padding: 0; + list-style: none; +} + +.tree ul li{ + color: #ccc; + clear: both; +} + +.tree ul li div{ + border-bottom: 1px solid #EEE; +} + +.tree strong{ + color: #111; + font-weight: normal; +} + +.tree ul li li{ + padding-left: 0; + margin-left: 15px; + color: #ccc; + list-style: circle; +} + +/* ---------------------------------------------------------------------------- + .code +---------------------------------------------------------------------------- */ + +.code { + width: 100%; + background: #232829; + color: #f8f8f2; + padding: 20px 30px !important; + border-radius: 0; + padding: 20px 30px; + font-family: Monaco,Menlo,Consolas,"Courier New",monospace; +} + +.code.wordwrap { + overflow: auto; + white-space: nowrap; +} + +.code ol { + margin: 0 0 0 45px; +} + +.code ol li { + color: #aaa; + font-size: 12px; + line-height: 21px; + cursor: pointer; + padding-left: 5px; +} + +.code ol li.marked { + color: #f4e009; + background-color: #4f4800; + margin-right: -30px; + padding-right: 30px; +} + +/* ---------------------------------------------------------------------------- + Pygments +---------------------------------------------------------------------------- */ + +.code .gd { color: #FF494F; display: block; } +.code .gi { color: #53C64A; display: block; } + +.code .hll { background-color: #49483e } +.code .c { color: #75715e } /* Comment */ +.code .err { color: #960050; background-color: #1e0010 } /* Error */ +.code .k { color: #66d9ef } /* Keyword */ +.code .l { color: #ae81ff } /* Literal */ +.code .n { color: #f8f8f2 } /* Name */ +.code .o { color: #f92672 } /* Operator */ +.code .p { color: #f8f8f2 } /* Punctuation */ +.code .cm { color: #75715e } /* Comment.Multiline */ +.code .cp { color: #75715e } /* Comment..codeproc */ +.code .c1 { color: #75715e } /* Comment.Single */ +.code .cs { color: #75715e } /* Comment.Special */ +.code .ge { font-style: italic } /* Generic.Emph */ +.code .gs { font-weight: bold } /* Generic.Strong */ +.code .kc { color: #66d9ef } /* Keyword.Constant */ +.code .kd { color: #66d9ef } /* Keyword.Declaration */ +.code .kn { color: #f92672 } /* Keyword.Namespace */ +.code .kp { color: #66d9ef } /* Keyword.Pseudo */ +.code .kr { color: #66d9ef } /* Keyword.Reserved */ +.code .kt { color: #66d9ef } /* Keyword.Type */ +.code .ld { color: #e6db74 } /* Literal.Date */ +.code .m { color: #ae81ff } /* Literal.Number */ +.code .s { color: #e6db74 } /* Literal.String */ +.code .na { color: #a6e22e } /* Name.Attribute */ +.code .nb { color: #f8f8f2 } /* Name.Builtin */ +.code .nc { color: #a6e22e } /* Name.Class */ +.code .no { color: #66d9ef } /* Name.Constant */ +.code .nd { color: #a6e22e } /* Name.Decorator */ +.code .ni { color: #f8f8f2 } /* Name.Entity */ +.code .ne { color: #a6e22e } /* Name.Exception */ +.code .nf { color: #a6e22e } /* Name.Function */ +.code .nl { color: #f8f8f2 } /* Name.Label */ +.code .nn { color: #f8f8f2 } /* Name.Namespace */ +.code .nx { color: #a6e22e } /* Name.Other */ +.code .py { color: #f8f8f2 } /* Name.Property */ +.code .nt { color: #f92672 } /* Name.Tag */ +.code .nv { color: #f8f8f2 } /* Name.Variable */ +.code .ow { color: #f92672 } /* Operator.Word */ +.code .w { color: #f8f8f2 } /* Text.Whitespace */ +.code .mf { color: #ae81ff } /* Literal.Number.Float */ +.code .mh { color: #ae81ff } /* Literal.Number.Hex */ +.code .mi { color: #ae81ff } /* Literal.Number.Integer */ +.code .mo { color: #ae81ff } /* Literal.Number.Oct */ +.code .sb { color: #e6db74 } /* Literal.String.Backtick */ +.code .sc { color: #e6db74 } /* Literal.String.Char */ +.code .sd { color: #e6db74 } /* Literal.String.Doc */ +.code .s2 { color: #e6db74 } /* Literal.String.Double */ +.code .se { color: #ae81ff } /* Literal.String.Escape */ +.code .sh { color: #e6db74 } /* Literal.String.Heredoc */ +.code .si { color: #e6db74 } /* Literal.String.Interpol */ +.code .sx { color: #e6db74 } /* Literal.String.Other */ +.code .sr { color: #e6db74 } /* Literal.String.Regex */ +.code .s1 { color: #e6db74 } /* Literal.String.Single */ +.code .ss { color: #e6db74 } /* Literal.String.Symbol */ +.code .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ +.code .vc { color: #f8f8f2 } /* Name.Variable.Class */ +.code .vg { color: #f8f8f2 } /* Name.Variable.Global */ +.code .vi { color: #f8f8f2 } /* Name.Variable.Instance */ +.code .il { color: #ae81ff } /* Literal.Number.Integer.Long */ + + +/* ---------------------------------------------------------------------------- + Mobile +---------------------------------------------------------------------------- */ + +@media (max-width: 580px) { + .form-options-expire { + float: left; + clear: left; + margin-top: 10px; + } +} diff --git a/colab/static/img/COPYRIGHT b/colab/static/img/COPYRIGHT new file mode 100644 index 0000000..86cc332 --- /dev/null +++ b/colab/static/img/COPYRIGHT @@ -0,0 +1,11 @@ +The icons listed bellow were copied from the Iconic icons package. The icons in this set were originally designed for the Franklin Street WordPress theme and are available under CC Attribution-Share Alike 3.0 license - http://creativecommons.org/licenses/by-sa/3.0/us/ + +* ticket.png +* changeset.png +* thread.png +* wiki.png +* x.png +* plus.png +* rss.png + +The full Iconic package can be found here: https://github.com/downloads/somerandomdude/Iconic/iconic.zip diff --git a/colab/static/img/cc_by_sa.png b/colab/static/img/cc_by_sa.png new file mode 100644 index 0000000..f70cb10 Binary files /dev/null and b/colab/static/img/cc_by_sa.png differ diff --git a/colab/static/img/changeset.png b/colab/static/img/changeset.png new file mode 100644 index 0000000..80e3ee1 Binary files /dev/null and b/colab/static/img/changeset.png differ diff --git a/colab/static/img/fav.ico b/colab/static/img/fav.ico new file mode 100644 index 0000000..4290246 Binary files /dev/null and b/colab/static/img/fav.ico differ diff --git a/colab/static/img/logo.svg b/colab/static/img/logo.svg new file mode 100644 index 0000000..cd22010 --- /dev/null +++ b/colab/static/img/logo.svg @@ -0,0 +1,64 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/colab/static/img/opendata3.png b/colab/static/img/opendata3.png new file mode 100644 index 0000000..dc12759 Binary files /dev/null and b/colab/static/img/opendata3.png differ diff --git a/colab/static/img/plus.png b/colab/static/img/plus.png new file mode 100644 index 0000000..16194ef Binary files /dev/null and b/colab/static/img/plus.png differ diff --git a/colab/static/img/rss.png b/colab/static/img/rss.png new file mode 100644 index 0000000..978e758 Binary files /dev/null and b/colab/static/img/rss.png differ diff --git a/colab/static/img/thread.png b/colab/static/img/thread.png new file mode 100644 index 0000000..c429cbe Binary files /dev/null and b/colab/static/img/thread.png differ diff --git a/colab/static/img/ticket.png b/colab/static/img/ticket.png new file mode 100644 index 0000000..09fcc0c Binary files /dev/null and b/colab/static/img/ticket.png differ diff --git a/colab/static/img/user.png b/colab/static/img/user.png new file mode 100644 index 0000000..f027000 Binary files /dev/null and b/colab/static/img/user.png differ diff --git a/colab/static/img/wiki.png b/colab/static/img/wiki.png new file mode 100644 index 0000000..c267a33 Binary files /dev/null and b/colab/static/img/wiki.png differ diff --git a/colab/static/img/x.png b/colab/static/img/x.png new file mode 100644 index 0000000..0a766db Binary files /dev/null and b/colab/static/img/x.png differ diff --git a/colab/static/third-party/bootstrap-datetimepicker/README b/colab/static/third-party/bootstrap-datetimepicker/README new file mode 100644 index 0000000..615774d --- /dev/null +++ b/colab/static/third-party/bootstrap-datetimepicker/README @@ -0,0 +1,7 @@ +This bootstrap extension was copied from + +https://github.com/Eonasdan/bootstrap-datetimepicker +ed42869337753e50adeb4a0e2476bfffc8edf2a9 + +Distributed under Apache License Version 2.0: +https://github.com/Eonasdan/bootstrap-datetimepicker/blob/master/LICENSE diff --git a/colab/static/third-party/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css b/colab/static/third-party/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css new file mode 100644 index 0000000..bc103a9 --- /dev/null +++ b/colab/static/third-party/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css @@ -0,0 +1,9 @@ +/*! + * Datepicker for Bootstrap v3 + * + * Copyright 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ + .bootstrap-datetimepicker-widget{top:0;left:0;z-index:3000;width:250px;padding:4px;margin-top:1px;border-radius:4px}.bootstrap-datetimepicker-widget .btn{padding:6px}.bootstrap-datetimepicker-widget:before{position:absolute;top:-7px;left:6px;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:''}.bootstrap-datetimepicker-widget:after{position:absolute;top:-6px;left:7px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid white;border-left:6px solid transparent;content:''}.bootstrap-datetimepicker-widget.pull-right:before{right:6px;left:auto}.bootstrap-datetimepicker-widget.pull-right:after{right:7px;left:auto}.bootstrap-datetimepicker-widget>ul{margin:0;list-style-type:none}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:100%;font-size:1.2em;font-weight:bold}.bootstrap-datetimepicker-widget table[data-hour-format="12"] .separator{width:4px;padding:0;margin:0}.bootstrap-datetimepicker-widget .datepicker>div{display:none}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget td,.bootstrap-datetimepicker-widget th{width:20px;height:20px;text-align:center;border-radius:4px}.bootstrap-datetimepicker-widget td.day:hover,.bootstrap-datetimepicker-widget td.hour:hover,.bootstrap-datetimepicker-widget td.minute:hover,.bootstrap-datetimepicker-widget td.second:hover{cursor:pointer;background:#eee}.bootstrap-datetimepicker-widget td.old,.bootstrap-datetimepicker-widget td.new{color:#999}.bootstrap-datetimepicker-widget td.active,.bootstrap-datetimepicker-widget td.active:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#428bca}.bootstrap-datetimepicker-widget td.disabled,.bootstrap-datetimepicker-widget td.disabled:hover{color:#999;cursor:not-allowed;background:0}.bootstrap-datetimepicker-widget td span{display:block;float:left;width:47px;height:54px;margin:2px;line-height:54px;cursor:pointer;border-radius:4px}.bootstrap-datetimepicker-widget td span:hover{background:#eee}.bootstrap-datetimepicker-widget td span.active{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#428bca}.bootstrap-datetimepicker-widget td span.old{color:#999}.bootstrap-datetimepicker-widget td span.disabled,.bootstrap-datetimepicker-widget td span.disabled:hover{color:#999;cursor:not-allowed;background:0}.bootstrap-datetimepicker-widget th.switch{width:145px}.bootstrap-datetimepicker-widget th.next,.bootstrap-datetimepicker-widget th.prev{font-size:21px}.bootstrap-datetimepicker-widget th.disabled,.bootstrap-datetimepicker-widget th.disabled:hover{color:#999;cursor:not-allowed;background:0}.bootstrap-datetimepicker-widget thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget thead tr:first-child th:hover{background:#eee}.input-group.date .input-group-addon span{display:block;width:16px;height:16px;cursor:pointer}.bootstrap-datetimepicker-widget.left-oriented:before{right:6px;left:auto}.bootstrap-datetimepicker-widget.left-oriented:after{right:7px;left:auto}.bootstrap-datetimepicker-widget ul.list-unstyled li.in div.timepicker div.timepicker-picker table.table-condensed tbody>tr>td{padding:0!important} \ No newline at end of file diff --git a/colab/static/third-party/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js b/colab/static/third-party/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js new file mode 100644 index 0000000..a9596d2 --- /dev/null +++ b/colab/static/third-party/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js @@ -0,0 +1,28 @@ +/** + * version 1.0.6 + * @license + * ========================================================= + * bootstrap-datetimepicker.js + * http://www.eyecon.ro/bootstrap-datepicker + * ========================================================= + * Copyright 2012 Stefan Petre + * + * Contributions: + * - Andrew Rowls + * - Thiago de Arruda + * - updated for Bootstrap v3 by Jonathan Peterson @Eonasdan + * + * 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(i){var q=(window.orientation!==undefined);var b=function(s,k){this.id=n++;this.init(s,k)};var o=function(k){if(typeof k==="string"){return new Date(k)}return k};b.prototype={constructor:b,init:function(s,k){var t=false;this.useMoment=(typeof moment!="undefined");if(!(k.pickTime||k.pickDate)){throw new Error("Must choose at least one picker")}this.options=k;this.$element=i(s);this.language=k.language in a?k.language:"en";this.pickDate=k.pickDate;this.pickTime=k.pickTime;this.isInput=this.$element.is("input");this.component=false;if(this.$element.hasClass("input-group")){this.component=this.$element.find(".input-group-addon")}this.format=k.format;if(!this.format){if(a[this.language].format!=null){this.format=a[this.language].format}else{if(this.isInput){this.format=this.$element.data("format")}else{this.format=this.$element.find("input").data("format")}}if(!this.format){this.format=(this.pickDate?"MM/dd/yyyy":"")}this.format+=(this.pickTime?" hh:mm":"")+(this.pickSeconds?":ss":"")}this._compileFormat();if(this.component){t=this.component.find("span")}if(this.pickTime){if(t&&t.length){this.timeIcon=t.data("time-icon");this.upIcon=t.data("up-icon");this.downIcon=t.data("down-icon")}if(!this.timeIcon){this.timeIcon="glyphicon glyphicon-time"}if(!this.upIcon){this.upIcon="glyphicon glyphicon-chevron-up"}if(!this.downIcon){this.downIcon="glyphicon glyphicon-chevron-down"}if(t){t.addClass(this.timeIcon)}}if(this.pickDate){if(t&&t.length){this.dateIcon=t.data("date-icon")}if(!this.dateIcon){this.dateIcon="glyphicon glyphicon-calendar"}if(t){t.removeClass(this.timeIcon);t.addClass(this.dateIcon)}}this.widget=i(d(this.timeIcon,this.upIcon,this.downIcon,k.pickDate,k.pickTime,k.pick12HourFormat,k.pickSeconds,k.collapse)).appendTo("body");this.minViewMode=k.minViewMode||this.$element.data("date-minviewmode")||0;if(typeof this.minViewMode==="string"){switch(this.minViewMode){case"months":this.minViewMode=1;break;case"years":this.minViewMode=2;break;default:this.minViewMode=0;break}}this.viewMode=k.viewMode||this.$element.data("date-viewmode")||0;if(typeof this.viewMode==="string"){switch(this.viewMode){case"months":this.viewMode=1;break;case"years":this.viewMode=2;break;default:this.viewMode=0;break}}if(k.defaultDate!==""){this.setValue(k.defaultDate)}this.startViewMode=this.viewMode;this.weekStart=k.weekStart||this.$element.data("date-weekstart")||0;this.weekEnd=this.weekStart===0?6:this.weekStart-1;setStartDate(k.startDate||this.$element.data("date-startdate"));this.setEndDate(k.endDate||this.$element.data("date-enddate"));this.fillDow();this.fillMonths();this.fillHours();this.fillMinutes();this.fillSeconds();this.update();this.showMode();this._attachDatePickerEvents()},show:function(k){this.widget.show();this.height=this.component?this.component.outerHeight():this.$element.outerHeight();this.place();this.$element.trigger({type:"show",date:this._date});this._attachDatePickerGlobalEvents();if(k){k.stopPropagation();k.preventDefault()}},disable:function(){this.$element.find("input").prop("disabled",true);this._detachDatePickerEvents()},enable:function(){this.$element.find("input").prop("disabled",false);this._attachDatePickerEvents()},hide:function(){var t=this.widget.find(".collapse");for(var k=0;ks.height()){t.top=t.top-(this.widget.height()+this.height+10)}if(this.options.width!==undefined){this.widget.width(this.options.width)}if(this.options.orientation==="left"){this.widget.addClass("left-oriented");t.left=t.left-this.widget.width()+20}if(this._isInFixed()){k="fixed";t.top-=s.scrollTop();t.left-=s.scrollLeft()}if(s.width()");while(k'+a[this.language].daysMin[(k++)%7]+"")}this.widget.find(".datepicker-days thead").append(s)},fillMonths:function(){var s="";var k=0;while(k<12){s+=''+a[this.language].monthsShort[k++]+""}this.widget.find(".datepicker-months td").append(s)},fillDate:function(){var D=this.viewDate.getUTCFullYear();var B=this.viewDate.getUTCMonth();var s=m(this._date.getUTCFullYear(),this._date.getUTCMonth(),this._date.getUTCDate(),0,0,0,0);var C=typeof this.startDate==="object"?this.startDate.getUTCFullYear():-Infinity;var F=typeof this.startDate==="object"?this.startDate.getUTCMonth():-1;var G=typeof this.endDate==="object"?this.endDate.getUTCFullYear():Infinity;var z=typeof this.endDate==="object"?this.endDate.getUTCMonth():12;this.widget.find(".datepicker-days").find(".disabled").removeClass("disabled");this.widget.find(".datepicker-months").find(".disabled").removeClass("disabled");this.widget.find(".datepicker-years").find(".disabled").removeClass("disabled");this.widget.find(".datepicker-days th:eq(1)").text(a[this.language].months[B]+" "+D);var v=m(D,B-1,28,0,0,0,0);var E=j.getDaysInMonth(v.getUTCFullYear(),v.getUTCMonth());v.setUTCDate(E);v.setUTCDate(E-(v.getUTCDay()-this.weekStart+7)%7);if((D==C&&B<=F)||D=z)||D>G){this.widget.find(".datepicker-days th:eq(2)").addClass("disabled")}var y=new Date(v.valueOf());y.setUTCDate(y.getUTCDate()+42);y=y.valueOf();var x=[];var H;var u;while(v.valueOf()");x.push(H)}u="";if(v.getUTCFullYear()D||(v.getUTCFullYear()==D&&v.getUTCMonth()>B)){u+=" new"}}if(v.valueOf()===s.valueOf()){u+=" active"}if((v.valueOf()+86400000)<=this.startDate){u+=" disabled"}if(v.valueOf()>this.endDate){u+=" disabled"}H.append(''+v.getUTCDate()+"");v.setUTCDate(v.getUTCDate()+1)}this.widget.find(".datepicker-days tbody").empty().append(x);var A=this._date.getUTCFullYear();var k=this.widget.find(".datepicker-months").find("th:eq(1)").text(D).end().find("span").removeClass("active");if(A===D){k.eq(this._date.getUTCMonth()).addClass("active")}if(A-1G){this.widget.find(".datepicker-months th:eq(2)").addClass("disabled")}for(var w=0;w<12;w++){if((D==C&&F>w)||(DG)){i(k[w]).addClass("disabled")}}}x="";D=parseInt(D/10,10)*10;var t=this.widget.find(".datepicker-years").find("th:eq(1)").text(D+"-"+(D+9)).end().find("td");this.widget.find(".datepicker-years").find("th").removeClass("disabled");if(C>D){this.widget.find(".datepicker-years").find("th:eq(0)").addClass("disabled")}if(GG)?" disabled":"")+'">'+D+"";D+=1}t.html(x)},fillHours:function(){var u=this.widget.find(".timepicker .timepicker-hours table");u.parent().hide();var t="";if(this.options.pick12HourFormat){var v=1;for(var s=0;s<3;s+=1){t+="";for(var k=0;k<4;k+=1){var w=v.toString();t+=''+f(w,2,"0")+"";v++}t+=""}}else{var v=0;for(var s=0;s<6;s+=1){t+="";for(var k=0;k<4;k+=1){var w=v.toString();t+=''+f(w,2,"0")+"";v++}t+=""}}u.html(t)},fillMinutes:function(){var u=this.widget.find(".timepicker .timepicker-minutes table");u.parent().hide();var t="";var v=0;for(var s=0;s<5;s++){t+="";for(var k=0;k<4;k+=1){var w=v.toString();t+=''+f(w,2,"0")+"";v+=3}t+=""}u.html(t)},fillSeconds:function(){var u=this.widget.find(".timepicker .timepicker-seconds table");u.parent().hide();var t="";var v=0;for(var s=0;s<5;s++){t+="";for(var k=0;k<4;k+=1){var w=v.toString();t+=''+f(w,2,"0")+"";v+=3}t+=""}u.html(t)},fillTime:function(){if(!this._date){return}var x=this.widget.find(".timepicker span[data-time-component]");var u=x.closest("table");var t=this.options.pick12HourFormat;var k=this._date.getUTCHours();var w="AM";if(t){if(k>=12){w="PM"}if(k===0){k=12}else{if(k!=12){k=k%12}}this.widget.find(".timepicker [data-action=togglePeriod]").text(w)}k=f(k.toString(),2,"0");var v=f(this._date.getUTCMinutes().toString(),2,"0");var s=f(this._date.getUTCSeconds().toString(),2,"0");x.filter("[data-time-component=hours]").text(k);x.filter("[data-time-component=minutes]").text(v);x.filter("[data-time-component=seconds]").text(s)},click:function(y){y.stopPropagation();y.preventDefault();this._unset=false;var x=i(y.target).closest("span, td, th");if(x.length===1){if(!x.is(".disabled")){switch(x[0].nodeName.toLowerCase()){case"th":switch(x[0].className){case"switch":this.showMode(1);break;case"prev":case"next":var s=this.viewDate;var t=j.modes[this.viewMode].navFnc;var v=j.modes[this.viewMode].navStep;if(x[0].className==="prev"){v=v*-1}s["set"+t](s["get"+t]()+v);this.fillDate();break}break;case"span":if(x.is(".month")){var w=x.parent().find("span").index(x);this.viewDate.setUTCMonth(w)}else{var u=parseInt(x.text(),10)||0;this.viewDate.setUTCFullYear(u)}if(this.viewMode!==0){this._date=m(this.viewDate.getUTCFullYear(),this.viewDate.getUTCMonth(),this.viewDate.getUTCDate(),this._date.getUTCHours(),this._date.getUTCMinutes(),this._date.getUTCSeconds(),this._date.getUTCMilliseconds());this.notifyChange()}this.showMode(-1);this.fillDate();break;case"td":if(x.is(".day")){var k=parseInt(x.text(),10)||1;var w=this.viewDate.getUTCMonth();var u=this.viewDate.getUTCFullYear();if(x.is(".old")){if(w===0){w=11;u-=1}else{w-=1}}else{if(x.is(".new")){if(w==11){w=0;u+=1}else{w+=1}}}this._date=m(u,w,k,this._date.getUTCHours(),this._date.getUTCMinutes(),this._date.getUTCSeconds(),this._date.getUTCMilliseconds());this.viewDate=m(u,w,Math.min(28,k),0,0,0,0);this.fillDate();this.set();this.notifyChange()}break}}}},actions:{incrementHours:function(k){this._date.setUTCHours(this._date.getUTCHours()+1)},incrementMinutes:function(k){this._date.setUTCMinutes(this._date.getUTCMinutes()+1)},incrementSeconds:function(k){this._date.setUTCSeconds(this._date.getUTCSeconds()+1)},decrementHours:function(k){this._date.setUTCHours(this._date.getUTCHours()-1)},decrementMinutes:function(k){this._date.setUTCMinutes(this._date.getUTCMinutes()-1)},decrementSeconds:function(k){this._date.setUTCSeconds(this._date.getUTCSeconds()-1)},togglePeriod:function(s){var k=this._date.getUTCHours();if(k>=12){k-=12}else{k+=12}this._date.setUTCHours(k)},showPicker:function(){this.widget.find(".timepicker > div:not(.timepicker-picker)").hide();this.widget.find(".timepicker .timepicker-picker").show()},showHours:function(){this.widget.find(".timepicker .timepicker-picker").hide();this.widget.find(".timepicker .timepicker-hours").show()},showMinutes:function(){this.widget.find(".timepicker .timepicker-picker").hide();this.widget.find(".timepicker .timepicker-minutes").show()},showSeconds:function(){this.widget.find(".timepicker .timepicker-picker").hide();this.widget.find(".timepicker .timepicker-seconds").show()},selectHour:function(t){var u=i(t.target);var k=parseInt(u.text(),10);if(this.options.pick12HourFormat){var s=this._date.getUTCHours();if(s>=12){if(k!=12){k=(k+12)%24}}else{if(k===12){k=0}else{k=k%12}}}this._date.setUTCHours(k);this.actions.showPicker.call(this)},selectMinute:function(s){var t=i(s.target);var k=parseInt(t.text(),10);this._date.setUTCMinutes(k);this.actions.showPicker.call(this)},selectSecond:function(s){var t=i(s.target);var k=parseInt(t.text(),10);this._date.setUTCSeconds(k);this.actions.showPicker.call(this)}},doAction:function(s){s.stopPropagation();s.preventDefault();if(!this._date){this._date=m(1970,0,0,0,0,0,0)}var k=i(s.currentTarget).data("action");var t=this.actions[k].apply(this,arguments);this.set();this.fillTime();this.notifyChange();return t},stopEvent:function(k){k.stopPropagation();k.preventDefault()},keydown:function(v){var u=this,t=v.which,s=i(v.target);if(t==8||t==46){setTimeout(function(){u._resetMaskPos(s)})}},keypress:function(v){var u=v.which;if(u==8||u==46){return}var t=i(v.target);var x=String.fromCharCode(u);var w=t.val()||"";w+=x;var s=this._mask[this._maskPos];if(!s){return false}if(s.end!=w.length){return}if(!s.pattern.test(w.slice(s.start))){w=w.slice(0,w.length-1);while((s=this._mask[this._maskPos])&&s.character){w+=s.character;this._maskPos++}w+=x;if(s.end!=w.length){t.val(w);return false}else{if(!s.pattern.test(w.slice(s.start))){t.val(w.slice(0,s.start));return false}else{t.val(w);this._maskPos++;return false}}}else{this._maskPos++}},change:function(s){var k=i(s.target);var t=k.val();if(this._formatPattern.test(t)){this.update();this.setValue(this._date.getTime());this.notifyChange();this.set()}else{if(t&&t.trim()){this.setValue(this._date.getTime());if(this._date){this.set()}else{k.val("")}}else{if(this._date){this.setValue(null);this.notifyChange();this._unset=true}}}this._resetMaskPos(k)},showMode:function(k){if(k){this.viewMode=Math.max(this.minViewMode,Math.min(2,this.viewMode+k))}this.widget.find(".datepicker > div").hide().filter(".datepicker-"+j.modes[this.viewMode].clsName).show()},destroy:function(){this._detachDatePickerEvents();this._detachDatePickerGlobalEvents();this.widget.remove();this.$element.removeData("datetimepicker");this.component.removeData("datetimepicker")},formatDate:function(k){return this.format.replace(c,function(u){var t,v,w,s=u.length;if(u==="ms"){s=1}v=p[u].property;if(v==="Hours12"){w=k.getUTCHours();if(w===0){w=12}else{if(w!==12){w=w%12}}}else{if(v==="Period12"){if(k.getUTCHours()>=12){return"PM"}else{return"AM"}}else{t="get"+v;w=k[t]()}}if(t==="getUTCMonth"){w=w+1}if(t==="getUTCYear"){w=w+1900-2000}return f(w.toString(),s,"0")}).trim()},parseDate:function(y){if(this.useMoment){var x=moment(y);return x}var t,u,w,s,v,k={};if(!(t=this._formatPattern.exec(y))){return null}for(u=1;ut.length){this._maskPos=s;break}else{if(this._mask[s].end===t.length){this._maskPos=s+1;break}}}},_finishParsingDate:function(s){var w,x,u,k,v,y,t;w=s.UTCFullYear;if(s.UTCYear){w=2000+s.UTCYear}if(!w){w=1970}if(s.UTCMonth){x=s.UTCMonth-1}else{x=0}u=s.UTCDate||1;k=s.UTCHours||0;v=s.UTCMinutes||0;y=s.UTCSeconds||0;t=s.UTCMilliseconds||0;if(s.Hours12){k=s.Hours12}if(s.Period12){if(/pm/i.test(s.Period12)){if(k!=12){k=(k+12)%24}}else{k=k%12}}return m(w,x,u,k,v,y,t)},_compileFormat:function(){var u,t,w=[],s=[],x=this.format,k={},v=0,y=0;while(u=h.exec(x)){t=u[0];if(t in p){v++;k[v]=p[t].property;w.push("\\s*"+p[t].getPattern(this)+"\\s*");s.push({pattern:new RegExp(p[t].getPattern(this)),property:p[t].property,start:y,end:y+=t.length})}else{w.push(g(t));s.push({pattern:new RegExp(g(t)),character:t,start:y,end:++y})}x=x.slice(t.length)}this._mask=s;this._maskPos=0;this._formatPattern=new RegExp("^\\s*"+w.join("")+"\\s*$");this._propertiesByIndex=k},_attachDatePickerEvents:function(){var k=this;this.widget.on("click",".datepicker *",i.proxy(this.click,this));this.widget.on("click","[data-action]",i.proxy(this.doAction,this));this.widget.on("mousedown",i.proxy(this.stopEvent,this));if(this.pickDate&&this.pickTime){this.widget.on("click.togglePicker",".accordion-toggle",function(x){x.stopPropagation();var w=i(this);var v=w.closest("ul");var t=v.find(".in");var s=v.find(".collapse:not(.in)");if(t&&t.length){var u=t.data("collapse");if(u&&u.transitioning){return}t.collapse("hide");s.collapse("show");w.find("span").toggleClass(k.timeIcon+" "+k.dateIcon);k.$element.find(".input-group-addon span").toggleClass(k.timeIcon+" "+k.dateIcon)}})}if(this.isInput){this.$element.on({focus:i.proxy(this.show,this),change:i.proxy(this.change,this),blur:i.proxy(this.hide,this)});if(this.options.maskInput){this.$element.on({keydown:i.proxy(this.keydown,this),keypress:i.proxy(this.keypress,this)})}}else{this.$element.on({change:i.proxy(this.change,this)},"input");if(this.options.maskInput){this.$element.on({keydown:i.proxy(this.keydown,this),keypress:i.proxy(this.keypress,this)},"input")}if(this.component){this.component.on("click",i.proxy(this.show,this))}else{this.$element.on("click",i.proxy(this.show,this))}}},_attachDatePickerGlobalEvents:function(){i(window).on("resize.datetimepicker"+this.id,i.proxy(this.place,this));if(!this.isInput){i(document).on("mousedown.datetimepicker"+this.id,i.proxy(this.hide,this))}},_detachDatePickerEvents:function(){this.widget.off("click",".datepicker *",this.click);this.widget.off("click","[data-action]");this.widget.off("mousedown",this.stopEvent);if(this.pickDate&&this.pickTime){this.widget.off("click.togglePicker")}if(this.isInput){this.$element.off({focus:this.show,change:this.change});if(this.options.maskInput){this.$element.off({keydown:this.keydown,keypress:this.keypress})}}else{this.$element.off({change:this.change},"input");if(this.options.maskInput){this.$element.off({keydown:this.keydown,keypress:this.keypress},"input")}if(this.component){this.component.off("click",this.show)}else{this.$element.off("click",this.show)}}},_detachDatePickerGlobalEvents:function(){i(window).off("resize.datetimepicker"+this.id);if(!this.isInput){i(document).off("mousedown.datetimepicker"+this.id)}},_isInFixed:function(){if(this.$element){var s=this.$element.parents();var k=false;for(var t=0;t
    '+j.template+'
  • '+l.getTemplate(s,t,y,v)+"
")}else{if(k){return('")}else{return('")}}}function m(){return new Date(Date.UTC.apply(Date,arguments))}var j={modes:[{clsName:"days",navFnc:"UTCMonth",navStep:1},{clsName:"months",navFnc:"UTCFullYear",navStep:1},{clsName:"years",navFnc:"UTCFullYear",navStep:10}],isLeapYear:function(k){return(((k%4===0)&&(k%100!==0))||(k%400===0))},getDaysInMonth:function(k,s){return[31,(j.isLeapYear(k)?29:28),31,30,31,30,31,31,30,31,30,31][s]},headTemplate:'‹›',contTemplate:''};j.template='
'+j.headTemplate+'
'+j.headTemplate+j.contTemplate+'
'+j.headTemplate+j.contTemplate+"
";var l={hourTemplate:'',minuteTemplate:'',secondTemplate:''};l.getTemplate=function(k,s,u,t){return('
'+(s?'':"")+(k?'':"")+" "+(s?'":"")+(k?'':"")+''+(s?'':"")+(k?'':"")+'
"+l.hourTemplate+' :'+l.minuteTemplate+":'+l.secondTemplate+"
'+(s?'
':""))}})(window.jQuery); diff --git a/colab/static/third-party/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.es.js b/colab/static/third-party/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.es.js new file mode 100644 index 0000000..0a38396 --- /dev/null +++ b/colab/static/third-party/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.es.js @@ -0,0 +1,66 @@ +// moment.js language configuration +// language : spanish (es) +// author : Julio Napurí : https://github.com/julionc + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('es', { + months : "enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"), + monthsShort : "ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"), + weekdays : "domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"), + weekdaysShort : "dom._lun._mar._mié._jue._vie._sáb.".split("_"), + weekdaysMin : "Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D [de] MMMM [de] YYYY", + LLL : "D [de] MMMM [de] YYYY LT", + LLLL : "dddd, D [de] MMMM [de] YYYY LT" + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : "en %s", + past : "hace %s", + s : "unos segundos", + m : "un minuto", + mm : "%d minutos", + h : "una hora", + hh : "%d horas", + d : "un día", + dd : "%d días", + M : "un mes", + MM : "%d meses", + y : "un año", + yy : "%d años" + }, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/colab/static/third-party/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.pt-BR.js b/colab/static/third-party/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.pt-BR.js new file mode 100644 index 0000000..056b138 --- /dev/null +++ b/colab/static/third-party/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.pt-BR.js @@ -0,0 +1,14 @@ +/** + * Brazilian translation for bootstrap-datetimepicker + * Cauan Cabral + */ +;(function($){ + $.fn.datetimepicker.dates['pt-BR'] = { + days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado", "Domingo"], + daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb", "Dom"], + daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa", "Do"], + months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], + monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], + today: "Hoje" + }; +}(jQuery)); diff --git a/colab/static/third-party/bootstrap/css/bootstrap-theme.min.css b/colab/static/third-party/bootstrap/css/bootstrap-theme.min.css new file mode 100644 index 0000000..cad36b4 --- /dev/null +++ b/colab/static/third-party/bootstrap/css/bootstrap-theme.min.css @@ -0,0 +1 @@ +.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-gradient(linear,left 0,left 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,0%,#e6e6e6,100%);background-image:-moz-linear-gradient(top,#fff 0,#e6e6e6 100%);background-image:linear-gradient(to bottom,#fff 0,#e6e6e6 100%);background-repeat:repeat-x;border-color:#e0e0e0;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0)}.btn-default:active,.btn-default.active{background-color:#e6e6e6;border-color:#e0e0e0}.btn-primary{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3071a9));background-image:-webkit-linear-gradient(top,#428bca,0%,#3071a9,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;border-color:#2d6ca2;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.btn-primary:active,.btn-primary.active{background-color:#3071a9;border-color:#2d6ca2}.btn-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5cb85c),to(#449d44));background-image:-webkit-linear-gradient(top,#5cb85c,0%,#449d44,100%);background-image:-moz-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;border-color:#419641;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.btn-success:active,.btn-success.active{background-color:#449d44;border-color:#419641}.btn-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f0ad4e),to(#ec971f));background-image:-webkit-linear-gradient(top,#f0ad4e,0%,#ec971f,100%);background-image:-moz-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;border-color:#eb9316;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.btn-warning:active,.btn-warning.active{background-color:#ec971f;border-color:#eb9316}.btn-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9534f),to(#c9302c));background-image:-webkit-linear-gradient(top,#d9534f,0%,#c9302c,100%);background-image:-moz-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;border-color:#c12e2a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.btn-danger:active,.btn-danger.active{background-color:#c9302c;border-color:#c12e2a}.btn-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5bc0de),to(#31b0d5));background-image:-webkit-linear-gradient(top,#5bc0de,0%,#31b0d5,100%);background-image:-moz-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;border-color:#2aabd2;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.btn-info:active,.btn-info.active{background-color:#31b0d5;border-color:#2aabd2}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#357ebd));background-image:-webkit-linear-gradient(top,#428bca,0%,#357ebd,100%);background-image:-moz-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fff),to(#f8f8f8));background-image:-webkit-linear-gradient(top,#fff,0%,#f8f8f8,100%);background-image:-moz-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar .navbar-nav>.active>a{background-color:#f8f8f8}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-gradient(linear,left 0,left 100%,from(#3c3c3c),to(#222));background-image:-webkit-linear-gradient(top,#3c3c3c,0%,#222,100%);background-image:-moz-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0)}.navbar-inverse .navbar-nav>.active>a{background-color:#222}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#dff0d8),to(#c8e5bc));background-image:-webkit-linear-gradient(top,#dff0d8,0%,#c8e5bc,100%);background-image:-moz-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9edf7),to(#b9def0));background-image:-webkit-linear-gradient(top,#d9edf7,0%,#b9def0,100%);background-image:-moz-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fcf8e3),to(#f8efc0));background-image:-webkit-linear-gradient(top,#fcf8e3,0%,#f8efc0,100%);background-image:-moz-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f2dede),to(#e7c3c3));background-image:-webkit-linear-gradient(top,#f2dede,0%,#e7c3c3,100%);background-image:-moz-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-gradient(linear,left 0,left 100%,from(#ebebeb),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#ebebeb,0%,#f5f5f5,100%);background-image:-moz-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3071a9));background-image:-webkit-linear-gradient(top,#428bca,0%,#3071a9,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5cb85c),to(#449d44));background-image:-webkit-linear-gradient(top,#5cb85c,0%,#449d44,100%);background-image:-moz-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5bc0de),to(#31b0d5));background-image:-webkit-linear-gradient(top,#5bc0de,0%,#31b0d5,100%);background-image:-moz-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f0ad4e),to(#ec971f));background-image:-webkit-linear-gradient(top,#f0ad4e,0%,#ec971f,100%);background-image:-moz-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9534f),to(#c9302c));background-image:-webkit-linear-gradient(top,#d9534f,0%,#c9302c,100%);background-image:-moz-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3278b3));background-image:-webkit-linear-gradient(top,#428bca,0%,#3278b3,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f5f5f5),to(#e8e8e8));background-image:-webkit-linear-gradient(top,#f5f5f5,0%,#e8e8e8,100%);background-image:-moz-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#357ebd));background-image:-webkit-linear-gradient(top,#428bca,0%,#357ebd,100%);background-image:-moz-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#dff0d8),to(#d0e9c6));background-image:-webkit-linear-gradient(top,#dff0d8,0%,#d0e9c6,100%);background-image:-moz-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9edf7),to(#c4e3f3));background-image:-webkit-linear-gradient(top,#d9edf7,0%,#c4e3f3,100%);background-image:-moz-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fcf8e3),to(#faf2cc));background-image:-webkit-linear-gradient(top,#fcf8e3,0%,#faf2cc,100%);background-image:-moz-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f2dede),to(#ebcccc));background-image:-webkit-linear-gradient(top,#f2dede,0%,#ebcccc,100%);background-image:-moz-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-gradient(linear,left 0,left 100%,from(#e8e8e8),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#e8e8e8,0%,#f5f5f5,100%);background-image:-moz-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} \ No newline at end of file diff --git a/colab/static/third-party/bootstrap/css/bootstrap.min.css b/colab/static/third-party/bootstrap/css/bootstrap.min.css new file mode 100644 index 0000000..a553c4f --- /dev/null +++ b/colab/static/third-party/bootstrap/css/bootstrap.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v3.0.0 + * + * Copyright 2013 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 by @mdo and @fat. + *//*! normalize.css v2.1.0 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}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}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing: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) ")"}.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:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.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}}*,*: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}button,input,select[multiple],textarea{background-image:none}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;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}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16.099999999999998px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-warning{color:#c09853}.text-danger{color:#b94a48}.text-success{color:#468847}.text-info{color:#3a87ad}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1}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,h2,h3{margin-top:20px;margin-bottom:10px}h4,h5,h6{margin-top:10px;margin-bottom:10px}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}h1 small,.h1 small{font-size:24px}h2 small,.h2 small{font-size:18px}h3 small,.h3 small,h4 small,.h4 small{font-size:14px}.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}dl{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}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.428571429;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-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:1.428571429}code,pre{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}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.prettyprint{margin-bottom:20px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.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,.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,.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,.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{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{float:left}.col-xs-1{width:8.333333333333332%}.col-xs-2{width:16.666666666666664%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333333333%}.col-xs-5{width:41.66666666666667%}.col-xs-6{width:50%}.col-xs-7{width:58.333333333333336%}.col-xs-8{width:66.66666666666666%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333333334%}.col-xs-11{width:91.66666666666666%}.col-xs-12{width:100%}@media(min-width:768px){.container{max-width:750px}.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{float:left}.col-sm-1{width:8.333333333333332%}.col-sm-2{width:16.666666666666664%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333333333%}.col-sm-5{width:41.66666666666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333333333336%}.col-sm-8{width:66.66666666666666%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333333334%}.col-sm-11{width:91.66666666666666%}.col-sm-12{width:100%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-11{left:91.66666666666666%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-11{margin-left:91.66666666666666%}}@media(min-width:992px){.container{max-width:970px}.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{float:left}.col-md-1{width:8.333333333333332%}.col-md-2{width:16.666666666666664%}.col-md-3{width:25%}.col-md-4{width:33.33333333333333%}.col-md-5{width:41.66666666666667%}.col-md-6{width:50%}.col-md-7{width:58.333333333333336%}.col-md-8{width:66.66666666666666%}.col-md-9{width:75%}.col-md-10{width:83.33333333333334%}.col-md-11{width:91.66666666666666%}.col-md-12{width:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.333333333333332%}.col-md-push-2{left:16.666666666666664%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333333333%}.col-md-push-5{left:41.66666666666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.333333333333336%}.col-md-push-8{left:66.66666666666666%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333333334%}.col-md-push-11{left:91.66666666666666%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-11{right:91.66666666666666%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-11{margin-left:91.66666666666666%}}@media(min-width:1200px){.container{max-width:1170px}.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{float:left}.col-lg-1{width:8.333333333333332%}.col-lg-2{width:16.666666666666664%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333333333%}.col-lg-5{width:41.66666666666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333333333336%}.col-lg-8{width:66.66666666666666%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333333334%}.col-lg-11{width:91.66666666666666%}.col-lg-12{width:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-11{left:91.66666666666666%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-11{margin-left:91.66666666666666%}}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-"]{display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{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>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;border-color:#d6e9c6}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td{background-color:#d0e9c6;border-color:#c9e2b3}.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;border-color:#eed3d7}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td{background-color:#ebcccc;border-color:#e6c1c7}.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;border-color:#fbeed5}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td{background-color:#faf2cc;border-color:#f8e5be}@media(max-width:768px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0;background-color:#fff}.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>thead>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>thead>tr:last-child>td,.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}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;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}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}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-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-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,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;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{height:auto}.input-lg{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:45px;line-height:45px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-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}.has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.has-error .help-block,.has-error .control-label{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-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}.has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.has-success .help-block,.has-success .control-label{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-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}.has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}.form-control-static{padding-top:7px;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}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left: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 .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.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;border:1px solid transparent;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 #333;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,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;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-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-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-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-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-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-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,.btn-xs{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px}.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';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1}.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-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-print:before{content:"\e045"}.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-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.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-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-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.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"}.glyphicon-briefcase:before{content:"\1f4bc"}.glyphicon-calendar:before{content:"\1f4c5"}.glyphicon-pushpin:before{content:"\1f4cc"}.glyphicon-paperclip:before{content:"\1f4ce"}.glyphicon-camera:before{content:"\1f4f7"}.glyphicon-lock:before{content:"\1f512"}.glyphicon-bell:before{content:"\1f514"}.glyphicon-bookmark:before{content:"\1f516"}.glyphicon-fire:before{content:"\1f525"}.glyphicon-wrench:before{content:"\1f527"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid #000;border-right:4px solid transparent;border-bottom:0 dotted;border-left:4px solid transparent;content:""}.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;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,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:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#fff;text-decoration:none;background-color:#428bca}.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-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{border-top:0 dotted;border-bottom:4px solid #000;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{right:0;left:auto}}.btn-default .caret{border-top-color:#333}.btn-primary .caret,.btn-success .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret{border-top-color:#fff}.dropup .btn-default .caret{border-bottom-color:#333}.dropup .btn-primary .caret,.dropup .btn-success .caret,.dropup .btn-warning .caret,.dropup .btn-danger .caret,.dropup .btn-info .caret{border-bottom-color:#fff}.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:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-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-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-top-right-radius:0;border-bottom-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:5px 10px;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,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.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{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.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-right-radius:0;border-bottom-left-radius:4px;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>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified .btn{display:table-cell;float:none;width:1%}[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.col{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;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:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.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{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;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>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){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>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.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{text-align:center}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}}.nav-tabs.nav-justified>li>a{margin-right:0;border-bottom:1px solid #ddd}.nav-tabs.nav-justified>.active>a{border-bottom-color:#fff}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:5px}.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}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-bottom:1px solid #ddd}.nav-tabs-justified>.active>a{border-bottom-color:#fff}.tabbable:before,.tabbable:after{display:table;content:" "}.tabbable:after{clear:both}.tabbable:before,.tabbable:after{display:table;content:" "}.tabbable:after{clear:both}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.nav .caret{border-top-color:#428bca;border-bottom-color:#428bca}.nav a:hover .caret{border-top-color:#2a6496;border-bottom-color:#2a6496}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;z-index:1000;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.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-collapse .navbar-nav.navbar-left:first-child{margin-left:-15px}.navbar-collapse .navbar-nav.navbar-right:last-child{margin-right:-15px}.navbar-collapse .navbar-text:last-child{margin-right:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{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;border-width:0 0 1px}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;z-index:1030}.navbar-fixed-bottom{bottom:0;margin-bottom:0}.navbar-brand{float:left;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{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.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}}@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,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)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left: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-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-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-text{float:left;margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{margin-right:15px;margin-left:15px}}.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:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e6e6e6}.navbar-default .navbar-nav>.dropdown>a:hover .caret,.navbar-default .navbar-nav>.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.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}.navbar-default .navbar-nav>.open>a .caret,.navbar-default .navbar-nav>.open>a:hover .caret,.navbar-default .navbar-nav>.open>a:focus .caret{border-top-color:#555;border-bottom-color:#555}.navbar-default .navbar-nav>.dropdown>a .caret{border-top-color:#777;border-bottom-color:#777}@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}.navbar-inverse .navbar-nav>.dropdown>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-nav>.dropdown>a .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .navbar-nav>.open>a .caret,.navbar-inverse .navbar-nav>.open>a:hover .caret,.navbar-inverse .navbar-nav>.open>a:focus .caret{border-top-color:#fff;border-bottom-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>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;text-decoration:none;background-color:#fff;border:1px solid #ddd}.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-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{background-color:#eee}.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>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-bottom-left-radius:6px;border-top-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-bottom-left-radius:3px;border-top-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:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;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;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}.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}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.btn .badge{position:relative;top:-1px}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;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1{font-size:63px}}.thumbnail{display:inline-block;display:block;height:auto;max-width:100%;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}.thumbnail>img{display:block;height:auto;max-width:100%}a.thumbnail:hover,a.thumbnail:focus{border-color:#428bca}.thumbnail>img{margin-right:auto;margin-left:auto}.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:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-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}}@-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:#f5f5f5;border-radius:4px;-webkit-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;background-color:#428bca;-webkit-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-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{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: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-size:40px 40px}.progress.active .progress-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-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{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: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-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{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: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-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{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: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-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{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: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)}.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-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}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.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,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table{margin-bottom:0}.panel>.panel-body+.table{border-top:1px solid #ddd}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-title{margin-top:0;margin-bottom:0;font-size:16px}.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 .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:#468847;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-warning{border-color:#fbeed5}.panel-warning>.panel-heading{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#fbeed5}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#fbeed5}.panel-danger{border-color:#eed3d7}.panel-danger>.panel-heading{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#eed3d7}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#eed3d7}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#3a87ad;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}.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,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-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;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:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}body.modal-open,.modal-open .navbar-fixed-top,.modal-open .navbar-fixed-bottom{margin-right:15px}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.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{z-index:1050;width:auto;padding:10px;margin-right:auto;margin-left:auto}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.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:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;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}@media screen and (min-width:768px){.modal-dialog{right:auto;left:50%;width:600px;padding-top:30px;padding-bottom:30px}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.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-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;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}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right: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);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);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;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{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;content:" "}.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;content:" "}.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;content:" "}.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;content:" "}.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;height:auto;max-width:100%;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,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.5)),to(rgba(0,0,0,0.0001)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.0001)),to(rgba(0,0,0,0.5)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,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{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%;left:50%;z-index:5;display:inline-block}.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;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,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.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{display:table;content:" "}.clearfix:after{clear:both}.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}.affix{position:fixed}@-ms-viewport{width:device-width}@media screen and (max-width:400px){@-ms-viewport{width:320px}}.hidden{display:none!important;visibility:hidden!important}.visible-xs{display:none!important}tr.visible-xs{display:none!important}th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm{display:none!important}tr.visible-sm{display:none!important}th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md{display:none!important}tr.visible-md{display:none!important}th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg{display:none!important}tr.visible-lg{display:none!important}th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs{display:none!important}tr.hidden-xs{display:none!important}th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm{display:none!important}tr.hidden-xs.hidden-sm{display:none!important}th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md{display:none!important}tr.hidden-xs.hidden-md{display:none!important}th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg{display:none!important}tr.hidden-xs.hidden-lg{display:none!important}th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs{display:none!important}tr.hidden-sm.hidden-xs{display:none!important}th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}tr.hidden-sm{display:none!important}th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md{display:none!important}tr.hidden-sm.hidden-md{display:none!important}th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg{display:none!important}tr.hidden-sm.hidden-lg{display:none!important}th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs{display:none!important}tr.hidden-md.hidden-xs{display:none!important}th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm{display:none!important}tr.hidden-md.hidden-sm{display:none!important}th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}tr.hidden-md{display:none!important}th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg{display:none!important}tr.hidden-md.hidden-lg{display:none!important}th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs{display:none!important}tr.hidden-lg.hidden-xs{display:none!important}th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm{display:none!important}tr.hidden-lg.hidden-sm{display:none!important}th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md{display:none!important}tr.hidden-lg.hidden-md{display:none!important}th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg{display:none!important}tr.hidden-lg{display:none!important}th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print{display:none!important}tr.visible-print{display:none!important}th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print{display:none!important}tr.hidden-print{display:none!important}th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.eot b/colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..87eaa43 Binary files /dev/null and b/colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.eot differ diff --git a/colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.svg b/colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..5fee068 --- /dev/null +++ b/colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.ttf b/colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..be784dc Binary files /dev/null and b/colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.ttf differ diff --git a/colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.woff b/colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..2cc3e48 Binary files /dev/null and b/colab/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.woff differ diff --git a/colab/static/third-party/bootstrap/js/bootstrap.min.js b/colab/static/third-party/bootstrap/js/bootstrap.min.js new file mode 100644 index 0000000..1765631 --- /dev/null +++ b/colab/static/third-party/bootstrap/js/bootstrap.min.js @@ -0,0 +1,6 @@ +/** +* bootstrap.js v3.0.0 by @fat and @mdo +* Copyright 2013 Twitter Inc. +* http://www.apache.org/licenses/LICENSE-2.0 +*/ +if(!jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(window.jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]');if(a.length){var b=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");"radio"===b.prop("type")&&a.find(".active").removeClass("active")}this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(window.jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(''}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(window.jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(window.jQuery); \ No newline at end of file diff --git a/colab/static/third-party/chartjs/js/Chart.min.js b/colab/static/third-party/chartjs/js/Chart.min.js new file mode 100644 index 0000000..6214b4d --- /dev/null +++ b/colab/static/third-party/chartjs/js/Chart.min.js @@ -0,0 +1,11 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 1.0.1-beta.3 + * + * Copyright 2014 Nick Downie + * Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + */ +(function(){"use strict";var t=this,i=t.Chart,e=function(t){this.canvas=t.canvas,this.ctx=t;this.width=t.canvas.width,this.height=t.canvas.height;return this.aspectRatio=this.width/this.height,s.retinaScale(this),this};e.defaults={global:{animation:!0,animationSteps:60,animationEasing:"easeOutQuart",showScale:!0,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleIntegersOnly:!0,scaleBeginAtZero:!1,scaleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",responsive:!1,maintainAspectRatio:!0,showTooltips:!0,tooltipEvents:["mousemove","touchstart","touchmove","mouseout"],tooltipFillColor:"rgba(0,0,0,0.8)",tooltipFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipFontSize:14,tooltipFontStyle:"normal",tooltipFontColor:"#fff",tooltipTitleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipTitleFontSize:14,tooltipTitleFontStyle:"bold",tooltipTitleFontColor:"#fff",tooltipYPadding:6,tooltipXPadding:6,tooltipCaretSize:8,tooltipCornerRadius:6,tooltipXOffset:10,tooltipTemplate:"<%if (label){%><%=label%>: <%}%><%= value %>",multiTooltipTemplate:"<%= value %>",multiTooltipKeyBackground:"#fff",onAnimationProgress:function(){},onAnimationComplete:function(){}}},e.types={};var s=e.helpers={},n=s.each=function(t,i,e){var s=Array.prototype.slice.call(arguments,3);if(t)if(t.length===+t.length){var n;for(n=0;ni)return i}else if(f(e)&&e>t)return e;return t},s.getDecimalPlaces=function(t){return t%1!==0&&f(t)?t.toString().split(".")[1].length:0}),x=s.radians=function(t){return t*(Math.PI/180)},S=(s.getAngleFromPoint=function(t,i){var e=i.x-t.x,s=i.y-t.y,n=Math.sqrt(e*e+s*s),o=2*Math.PI+Math.atan2(s,e);return 0>e&&0>s&&(o+=2*Math.PI),{angle:o,distance:n}},s.aliasPixel=function(t){return t%2===0?0:.5}),C=(s.splineCurve=function(t,i,e,s){var n=Math.sqrt(Math.pow(i.x-t.x,2)+Math.pow(i.y-t.y,2)),o=Math.sqrt(Math.pow(e.x-i.x,2)+Math.pow(e.y-i.y,2)),a=s*n/(n+o),h=s*o/(n+o);return{inner:{x:i.x-a*(e.x-t.x),y:i.y-a*(e.y-t.y)},outer:{x:i.x+h*(e.x-t.x),y:i.y+h*(e.y-t.y)}}},s.calculateOrderOfMagnitude=function(t){return Math.floor(Math.log(t)/Math.LN10)}),y=(s.calculateScaleRange=function(t,i,e,s,n){var o=2,a=Math.floor(i/(1.5*e)),h=o>=a,l=g(t),r=m(t);l===r&&(l+=.5,r>=.5&&!s?r-=.5:l+=.5);for(var c=Math.abs(l-r),u=C(c),d=Math.ceil(l/(1*Math.pow(10,u)))*Math.pow(10,u),p=s?0:Math.floor(r/(1*Math.pow(10,u)))*Math.pow(10,u),f=d-p,v=Math.pow(10,u),x=Math.round(f/v);(x>a||a>2*x)&&!h;)if(x>a)v*=2,x=Math.round(f/v),x%1!==0&&(h=!0);else if(n&&u>=0){if(v/2%1!==0)break;v/=2,x=Math.round(f/v)}else v/=2,x=Math.round(f/v);return h&&(x=o,v=f/x),{steps:x,stepValue:v,min:p,max:p+x*v}},s.template=function(t,i){function e(t,i){var e=/\W/.test(t)?new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+t.replace(/[\r\t\n]/g," ").split("<%").join(" ").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split(" ").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');"):s[t]=s[t];return i?e(i):e}if(t instanceof Function)return t(i);var s={};return e(t,i)}),b=(s.generateLabels=function(t,i,e,s){var o=new Array(i);return labelTemplateString&&n(o,function(i,n){o[n]=y(t,{value:e+s*(n+1)})}),o},s.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),st?-.5*s*Math.pow(2,10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e):s*Math.pow(2,-10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e)*.5+1)},easeInBack:function(t){var i=1.70158;return 1*(t/=1)*t*((i+1)*t-i)},easeOutBack:function(t){var i=1.70158;return 1*((t=t/1-1)*t*((i+1)*t+i)+1)},easeInOutBack:function(t){var i=1.70158;return(t/=.5)<1?.5*t*t*(((i*=1.525)+1)*t-i):.5*((t-=2)*t*(((i*=1.525)+1)*t+i)+2)},easeInBounce:function(t){return 1-b.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?7.5625*t*t:2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*b.easeInBounce(2*t):.5*b.easeOutBounce(2*t-1)+.5}}),w=s.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),P=(s.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),s.animationLoop=function(t,i,e,s,n,o){var a=0,h=b[e]||b.linear,l=function(){a++;var e=a/i,r=h(e);t.call(o,r,e,a),s.call(o,r,e),i>a?o.animationFrame=w(l):n.apply(o)};w(l)},s.getRelativePosition=function(t){var i,e,s=t.originalEvent||t,n=t.currentTarget||t.srcElement,o=n.getBoundingClientRect();return s.touches?(i=s.touches[0].clientX-o.left,e=s.touches[0].clientY-o.top):(i=s.clientX-o.left,e=s.clientY-o.top),{x:i,y:e}},s.addEvent=function(t,i,e){t.addEventListener?t.addEventListener(i,e):t.attachEvent?t.attachEvent("on"+i,e):t["on"+i]=e}),L=s.removeEvent=function(t,i,e){t.removeEventListener?t.removeEventListener(i,e,!1):t.detachEvent?t.detachEvent("on"+i,e):t["on"+i]=c},k=(s.bindEvents=function(t,i,e){t.events||(t.events={}),n(i,function(i){t.events[i]=function(){e.apply(t,arguments)},P(t.chart.canvas,i,t.events[i])})},s.unbindEvents=function(t,i){n(i,function(i,e){L(t.chart.canvas,e,i)})}),F=s.getMaximumWidth=function(t){var i=t.parentNode;return i.clientWidth},R=s.getMaximumHeight=function(t){var i=t.parentNode;return i.clientHeight},A=(s.getMaximumSize=s.getMaximumWidth,s.retinaScale=function(t){var i=t.ctx,e=t.canvas.width,s=t.canvas.height;window.devicePixelRatio&&(i.canvas.style.width=e+"px",i.canvas.style.height=s+"px",i.canvas.height=s*window.devicePixelRatio,i.canvas.width=e*window.devicePixelRatio,i.scale(window.devicePixelRatio,window.devicePixelRatio))}),T=s.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},M=s.fontString=function(t,i,e){return i+" "+t+"px "+e},W=s.longestText=function(t,i,e){t.font=i;var s=0;return n(e,function(i){var e=t.measureText(i).width;s=e>s?e:s}),s},z=s.drawRoundedRectangle=function(t,i,e,s,n,o){t.beginPath(),t.moveTo(i+o,e),t.lineTo(i+s-o,e),t.quadraticCurveTo(i+s,e,i+s,e+o),t.lineTo(i+s,e+n-o),t.quadraticCurveTo(i+s,e+n,i+s-o,e+n),t.lineTo(i+o,e+n),t.quadraticCurveTo(i,e+n,i,e+n-o),t.lineTo(i,e+o),t.quadraticCurveTo(i,e,i+o,e),t.closePath()};e.instances={},e.Type=function(t,i,s){this.options=i,this.chart=s,this.id=u(),e.instances[this.id]=this,i.responsive&&this.resize(),this.initialize.call(this,t)},a(e.Type.prototype,{initialize:function(){return this},clear:function(){return T(this.chart),this},stop:function(){return s.cancelAnimFrame.call(t,this.animationFrame),this},resize:function(t){this.stop();var i=this.chart.canvas,e=F(this.chart.canvas),s=this.options.maintainAspectRatio?e/this.chart.aspectRatio:R(this.chart.canvas);return i.width=this.chart.width=e,i.height=this.chart.height=s,A(this.chart),"function"==typeof t&&t.apply(this,Array.prototype.slice.call(arguments,1)),this},reflow:c,render:function(t){return t&&this.reflow(),this.options.animation&&!t?s.animationLoop(this.draw,this.options.animationSteps,this.options.animationEasing,this.options.onAnimationProgress,this.options.onAnimationComplete,this):(this.draw(),this.options.onAnimationComplete.call(this)),this},generateLegend:function(){return y(this.options.legendTemplate,this)},destroy:function(){this.clear(),k(this,this.events),delete e.instances[this.id]},showTooltip:function(t,i){"undefined"==typeof this.activeElements&&(this.activeElements=[]);var o=function(t){var i=!1;return t.length!==this.activeElements.length?i=!0:(n(t,function(t,e){t!==this.activeElements[e]&&(i=!0)},this),i)}.call(this,t);if(o||i){if(this.activeElements=t,this.draw(),t.length>0)if(this.datasets&&this.datasets.length>1){for(var a,h,r=this.datasets.length-1;r>=0&&(a=this.datasets[r].points||this.datasets[r].bars||this.datasets[r].segments,h=l(a,t[0]),-1===h);r--);var c=[],u=[],d=function(){var t,i,e,n,o,a=[],l=[],r=[];return s.each(this.datasets,function(i){t=i.points||i.bars||i.segments,t[h]&&a.push(t[h])}),s.each(a,function(t){l.push(t.x),r.push(t.y),c.push(s.template(this.options.multiTooltipTemplate,t)),u.push({fill:t._saved.fillColor||t.fillColor,stroke:t._saved.strokeColor||t.strokeColor})},this),o=m(r),e=g(r),n=m(l),i=g(l),{x:n>this.chart.width/2?n:i,y:(o+e)/2}}.call(this,h);new e.MultiTooltip({x:d.x,y:d.y,xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,xOffset:this.options.tooltipXOffset,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,titleTextColor:this.options.tooltipTitleFontColor,titleFontFamily:this.options.tooltipTitleFontFamily,titleFontStyle:this.options.tooltipTitleFontStyle,titleFontSize:this.options.tooltipTitleFontSize,cornerRadius:this.options.tooltipCornerRadius,labels:c,legendColors:u,legendColorBackground:this.options.multiTooltipKeyBackground,title:t[0].label,chart:this.chart,ctx:this.chart.ctx}).draw()}else n(t,function(t){var i=t.tooltipPosition();new e.Tooltip({x:Math.round(i.x),y:Math.round(i.y),xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,caretHeight:this.options.tooltipCaretSize,cornerRadius:this.options.tooltipCornerRadius,text:y(this.options.tooltipTemplate,t),chart:this.chart}).draw()},this);return this}},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)}}),e.Type.extend=function(t){var i=this,s=function(){return i.apply(this,arguments)};if(s.prototype=o(i.prototype),a(s.prototype,t),s.extend=e.Type.extend,t.name||i.prototype.name){var n=t.name||i.prototype.name,l=e.defaults[i.prototype.name]?o(e.defaults[i.prototype.name]):{};e.defaults[n]=a(l,t.defaults),e.types[n]=s,e.prototype[n]=function(t,i){var o=h(e.defaults.global,e.defaults[n],i||{});return new s(t,o,this)}}else d("Name not provided for this chart, so it hasn't been registered");return i},e.Element=function(t){a(this,t),this.initialize.apply(this,arguments),this.save()},a(e.Element.prototype,{initialize:function(){},restore:function(t){return t?n(t,function(t){this[t]=this._saved[t]},this):a(this,this._saved),this},save:function(){return this._saved=o(this),delete this._saved._saved,this},update:function(t){return n(t,function(t,i){this._saved[i]=this[i],this[i]=t},this),this},transition:function(t,i){return n(t,function(t,e){this[e]=(t-this._saved[e])*i+this._saved[e]},this),this},tooltipPosition:function(){return{x:this.x,y:this.y}}}),e.Element.extend=r,e.Point=e.Element.extend({display:!0,inRange:function(t,i){var e=this.hitDetectionRadius+this.radius;return Math.pow(t-this.x,2)+Math.pow(i-this.y,2)=this.startAngle&&e.angle<=this.endAngle,o=e.distance>=this.innerRadius&&e.distance<=this.outerRadius;return n&&o},tooltipPosition:function(){var t=this.startAngle+(this.endAngle-this.startAngle)/2,i=(this.outerRadius-this.innerRadius)/2+this.innerRadius;return{x:this.x+Math.cos(t)*i,y:this.y+Math.sin(t)*i}},draw:function(t){var i=this.ctx;i.beginPath(),i.arc(this.x,this.y,this.outerRadius,this.startAngle,this.endAngle),i.arc(this.x,this.y,this.innerRadius,this.endAngle,this.startAngle,!0),i.closePath(),i.strokeStyle=this.strokeColor,i.lineWidth=this.strokeWidth,i.fillStyle=this.fillColor,i.fill(),i.lineJoin="bevel",this.showStroke&&i.stroke()}}),e.Rectangle=e.Element.extend({draw:function(){var t=this.ctx,i=this.width/2,e=this.x-i,s=this.x+i,n=this.base-(this.base-this.y),o=this.strokeWidth/2;this.showStroke&&(e+=o,s-=o,n+=o),t.beginPath(),t.fillStyle=this.fillColor,t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.moveTo(e,this.base),t.lineTo(e,n),t.lineTo(s,n),t.lineTo(s,this.base),t.fill(),this.showStroke&&t.stroke()},height:function(){return this.base-this.y},inRange:function(t,i){return t>=this.x-this.width/2&&t<=this.x+this.width/2&&i>=this.y&&i<=this.base}}),e.Tooltip=e.Element.extend({draw:function(){var t=this.chart.ctx;t.font=M(this.fontSize,this.fontStyle,this.fontFamily),this.xAlign="center",this.yAlign="above";var i=2,e=t.measureText(this.text).width+2*this.xPadding,s=this.fontSize+2*this.yPadding,n=s+this.caretHeight+i;this.x+e/2>this.chart.width?this.xAlign="left":this.x-e/2<0&&(this.xAlign="right"),this.y-n<0&&(this.yAlign="below");var o=this.x-e/2,a=this.y-n;switch(t.fillStyle=this.fillColor,this.yAlign){case"above":t.beginPath(),t.moveTo(this.x,this.y-i),t.lineTo(this.x+this.caretHeight,this.y-(i+this.caretHeight)),t.lineTo(this.x-this.caretHeight,this.y-(i+this.caretHeight)),t.closePath(),t.fill();break;case"below":a=this.y+i+this.caretHeight,t.beginPath(),t.moveTo(this.x,this.y+i),t.lineTo(this.x+this.caretHeight,this.y+i+this.caretHeight),t.lineTo(this.x-this.caretHeight,this.y+i+this.caretHeight),t.closePath(),t.fill()}switch(this.xAlign){case"left":o=this.x-e+(this.cornerRadius+this.caretHeight);break;case"right":o=this.x-(this.cornerRadius+this.caretHeight)}z(t,o,a,e,s,this.cornerRadius),t.fill(),t.fillStyle=this.textColor,t.textAlign="center",t.textBaseline="middle",t.fillText(this.text,o+e/2,a+s/2)}}),e.MultiTooltip=e.Element.extend({initialize:function(){this.font=M(this.fontSize,this.fontStyle,this.fontFamily),this.titleFont=M(this.titleFontSize,this.titleFontStyle,this.titleFontFamily),this.height=this.labels.length*this.fontSize+(this.labels.length-1)*(this.fontSize/2)+2*this.yPadding+1.5*this.titleFontSize,this.ctx.font=this.titleFont;var t=this.ctx.measureText(this.title).width,i=W(this.ctx,this.font,this.labels)+this.fontSize+3,e=g([i,t]);this.width=e+2*this.xPadding;var s=this.height/2;this.y-s<0?this.y=s:this.y+s>this.chart.height&&(this.y=this.chart.height-s),this.x>this.chart.width/2?this.x-=this.xOffset+this.width:this.x+=this.xOffset},getLineHeight:function(t){var i=this.y-this.height/2+this.yPadding,e=t-1;return 0===t?i+this.titleFontSize/2:i+(1.5*this.fontSize*e+this.fontSize/2)+1.5*this.titleFontSize},draw:function(){z(this.ctx,this.x,this.y-this.height/2,this.width,this.height,this.cornerRadius);var t=this.ctx;t.fillStyle=this.fillColor,t.fill(),t.closePath(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=this.titleTextColor,t.font=this.titleFont,t.fillText(this.title,this.x+this.xPadding,this.getLineHeight(0)),t.font=this.font,s.each(this.labels,function(i,e){t.fillStyle=this.textColor,t.fillText(i,this.x+this.xPadding+this.fontSize+3,this.getLineHeight(e+1)),t.fillStyle=this.legendColorBackground,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize),t.fillStyle=this.legendColors[e].fill,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize)},this)}}),e.Scale=e.Element.extend({initialize:function(){this.fit()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(y(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}));this.yLabelWidth=this.display&&this.showLabels?W(this.ctx,this.font,this.yLabels):0},addXLabel:function(t){this.xLabels.push(t),this.valuesCount++,this.fit()},removeXLabel:function(){this.xLabels.shift(),this.valuesCount--,this.fit()},fit:function(){this.startPoint=this.display?this.fontSize:0,this.endPoint=this.display?this.height-1.5*this.fontSize-5:this.height,this.startPoint+=this.padding,this.endPoint-=this.padding;var t,i=this.endPoint-this.startPoint;for(this.calculateYRange(i),this.buildYLabels(),this.calculateXLabelRotation();i>this.endPoint-this.startPoint;)i=this.endPoint-this.startPoint,t=this.yLabelWidth,this.calculateYRange(i),this.buildYLabels(),tthis.yLabelWidth+10?e/2:this.yLabelWidth+10,this.xLabelRotation=0,this.display){var n,o=W(this.ctx,this.font,this.xLabels);this.xLabelWidth=o;for(var a=Math.floor(this.calculateX(1)-this.calculateX(0))-6;this.xLabelWidth>a&&0===this.xLabelRotation||this.xLabelWidth>a&&this.xLabelRotation<=90&&this.xLabelRotation>0;)n=Math.cos(x(this.xLabelRotation)),t=n*e,i=n*s,t+this.fontSize/2>this.yLabelWidth+8&&(this.xScalePaddingLeft=t+this.fontSize/2),this.xScalePaddingRight=this.fontSize/2,this.xLabelRotation++,this.xLabelWidth=n*o;this.xLabelRotation>0&&(this.endPoint-=Math.sin(x(this.xLabelRotation))*o+3)}else this.xLabelWidth=0,this.xScalePaddingRight=this.padding,this.xScalePaddingLeft=this.padding},calculateYRange:c,drawingArea:function(){return this.startPoint-this.endPoint},calculateY:function(t){var i=this.drawingArea()/(this.min-this.max);return this.endPoint-i*(t-this.min)},calculateX:function(t){var i=(this.xLabelRotation>0,this.width-(this.xScalePaddingLeft+this.xScalePaddingRight)),e=i/(this.valuesCount-(this.offsetGridLines?0:1)),s=e*t+this.xScalePaddingLeft;return this.offsetGridLines&&(s+=e/2),Math.round(s)},update:function(t){s.extend(this,t),this.fit()},draw:function(){var t=this.ctx,i=(this.endPoint-this.startPoint)/this.steps,e=Math.round(this.xScalePaddingLeft);this.display&&(t.fillStyle=this.textColor,t.font=this.font,n(this.yLabels,function(n,o){var a=this.endPoint-i*o,h=Math.round(a);t.textAlign="right",t.textBaseline="middle",this.showLabels&&t.fillText(n,e-10,a),t.beginPath(),o>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),h+=s.aliasPixel(t.lineWidth),t.moveTo(e,h),t.lineTo(this.width,h),t.stroke(),t.closePath(),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(e-5,h),t.lineTo(e,h),t.stroke(),t.closePath()},this),n(this.xLabels,function(i,e){var s=this.calculateX(e)+S(this.lineWidth),n=this.calculateX(e-(this.offsetGridLines?.5:0))+S(this.lineWidth),o=this.xLabelRotation>0;t.beginPath(),e>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),t.moveTo(n,this.endPoint),t.lineTo(n,this.startPoint-3),t.stroke(),t.closePath(),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(n,this.endPoint),t.lineTo(n,this.endPoint+5),t.stroke(),t.closePath(),t.save(),t.translate(s,o?this.endPoint+12:this.endPoint+8),t.rotate(-1*x(this.xLabelRotation)),t.font=this.font,t.textAlign=o?"right":"center",t.textBaseline=o?"middle":"top",t.fillText(i,0,0),t.restore()},this))}}),e.RadialScale=e.Element.extend({initialize:function(){this.size=m([this.height,this.width]),this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2},calculateCenterOffset:function(t){var i=this.drawingArea/(this.max-this.min);return(t-this.min)*i},update:function(){this.lineArc?this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2:this.setScaleSize(),this.buildYLabels()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(y(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}))},getCircumference:function(){return 2*Math.PI/this.valuesCount},setScaleSize:function(){var t,i,e,s,n,o,a,h,l,r,c,u,d=m([this.height/2-this.pointLabelFontSize-5,this.width/2]),p=this.width,g=0;for(this.ctx.font=M(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),i=0;ip&&(p=t.x+s,n=i),t.x-sp&&(p=t.x+e,n=i):i>this.valuesCount/2&&t.x-e0){var s,n=e*(this.drawingArea/this.steps),o=this.yCenter-n;if(this.lineWidth>0)if(t.strokeStyle=this.lineColor,t.lineWidth=this.lineWidth,this.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,n,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var a=0;a=0;i--){if(this.angleLineWidth>0){var e=this.getPointPosition(i,this.calculateCenterOffset(this.max));t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(e.x,e.y),t.stroke(),t.closePath()}var s=this.getPointPosition(i,this.calculateCenterOffset(this.max)+5);t.font=M(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),t.fillStyle=this.pointLabelFontColor;var o=this.labels.length,a=this.labels.length/2,h=a/2,l=h>i||i>o-h,r=i===h||i===o-h;t.textAlign=0===i?"center":i===a?"center":a>i?"left":"right",t.textBaseline=r?"middle":l?"bottom":"top",t.fillText(this.labels[i],s.x,s.y)}}}}}),s.addEvent(window,"resize",function(){var t;return function(){clearTimeout(t),t=setTimeout(function(){n(e.instances,function(t){t.options.responsive&&t.resize(t.render,!0)})},50)}}()),p?define(function(){return e}):"object"==typeof module&&module.exports&&(module.exports=e),t.Chart=e,e.noConflict=function(){return t.Chart=i,e}}).call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleBeginAtZero:!0,scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,barShowStroke:!0,barStrokeWidth:2,barValueSpacing:5,barDatasetSpacing:1,legendTemplate:'
    <% for (var i=0; i
  • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>
'};i.Type.extend({name:"Bar",defaults:s,initialize:function(t){var s=this.options;this.ScaleClass=i.Scale.extend({offsetGridLines:!0,calculateBarX:function(t,i,e){var n=this.calculateBaseWidth(),o=this.calculateX(e)-n/2,a=this.calculateBarWidth(t);return o+a*i+i*s.barDatasetSpacing+a/2},calculateBaseWidth:function(){return this.calculateX(1)-this.calculateX(0)-2*s.barValueSpacing},calculateBarWidth:function(t){var i=this.calculateBaseWidth()-(t-1)*s.barDatasetSpacing;return i/t}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getBarsAtEvent(t):[];this.eachBars(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),this.BarClass=i.Rectangle.extend({strokeWidth:this.options.barStrokeWidth,showStroke:this.options.barShowStroke,ctx:this.chart.ctx}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,bars:[]};this.datasets.push(s),e.each(i.data,function(n,o){e.isNumber(n)&&s.bars.push(new this.BarClass({value:n,label:t.labels[o],datasetLabel:i.label,strokeColor:i.strokeColor,fillColor:i.fillColor,highlightFill:i.highlightFill||i.fillColor,highlightStroke:i.highlightStroke||i.strokeColor}))},this)},this),this.buildScale(t.labels),this.BarClass.prototype.base=this.scale.endPoint,this.eachBars(function(t,i,s){e.extend(t,{width:this.scale.calculateBarWidth(this.datasets.length),x:this.scale.calculateBarX(this.datasets.length,s,i),y:this.scale.endPoint}),t.save()},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachBars(function(t){t.save()}),this.render()},eachBars:function(t){e.each(this.datasets,function(i,s){e.each(i.bars,t,this,s)},this)},getBarsAtEvent:function(t){for(var i,s=[],n=e.getRelativePosition(t),o=function(t){s.push(t.bars[i])},a=0;a<% for (var i=0; i
  • <%if(segments[i].label){%><%=segments[i].label%><%}%>
  • <%}%>'};i.Type.extend({name:"Doughnut",defaults:s,initialize:function(t){this.segments=[],this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,this.SegmentArc=i.Arc.extend({ctx:this.chart.ctx,x:this.chart.width/2,y:this.chart.height/2}),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[]; +e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.calculateTotal(t),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({value:t.value,outerRadius:this.options.animateScale?0:this.outerRadius,innerRadius:this.options.animateScale?0:this.outerRadius/100*this.options.percentageInnerCutout,fillColor:t.color,highlightColor:t.highlight||t.color,showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,startAngle:1.5*Math.PI,circumference:this.options.animateRotate?0:this.calculateCircumference(t.value),label:t.label})),e||(this.reflow(),this.update())},calculateCircumference:function(t){return 2*Math.PI*(t/this.total)},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this)},update:function(){this.calculateTotal(this.segments),e.each(this.activeElements,function(t){t.restore(["fillColor"])}),e.each(this.segments,function(t){t.save()}),this.render()},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,e.each(this.segments,function(t){t.update({outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout})},this)},draw:function(t){var i=t?t:1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.calculateCircumference(t.value),outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout},i),t.endAngle=t.startAngle+t.circumference,t.draw(),0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
  • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>'};i.Type.extend({name:"Line",defaults:s,initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx,inRange:function(t){return Math.pow(t-this.x,2)=t.points.length-1?e.splineCurve(t.points[s-1],i,i,0):e.splineCurve(t.points[s-1],i,t.points[s+1],this.options.bezierCurveTension)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(t.points,function(i,e){e>0?this.options.bezierCurve?s.bezierCurveTo(t.points[e-1].controlPoints.outer.x,t.points[e-1].controlPoints.outer.y,i.controlPoints.inner.x,i.controlPoints.inner.y,i.x,i.y):s.lineTo(i.x,i.y):s.moveTo(i.x,i.y)},this),s.stroke(),this.options.datasetFill&&(s.lineTo(t.points[t.points.length-1].x,this.scale.endPoint),s.lineTo(this.scale.calculateX(0),this.scale.endPoint),s.fillStyle=t.fillColor,s.closePath(),s.fill()),e.each(t.points,function(t){t.draw()})},this)}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)",scaleBeginAtZero:!0,scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,scaleShowLine:!0,segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'
      <% for (var i=0; i
    • <%if(segments[i].label){%><%=segments[i].label%><%}%>
    • <%}%>
    '};i.Type.extend({name:"PolarArea",defaults:s,initialize:function(t){this.segments=[],this.SegmentArc=i.Arc.extend({showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,ctx:this.chart.ctx,innerRadius:0,x:this.chart.width/2,y:this.chart.height/2}),this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,lineArc:!0,width:this.chart.width,height:this.chart.height,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,valuesCount:t.length}),this.updateScaleRange(t),this.scale.update(),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({fillColor:t.color,highlightColor:t.highlight||t.color,label:t.label,value:t.value,outerRadius:this.options.animateScale?0:this.scale.calculateCenterOffset(t.value),circumference:this.options.animateRotate?0:this.scale.getCircumference(),startAngle:1.5*Math.PI})),e||(this.reflow(),this.update())},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this),this.scale.valuesCount=this.segments.length},updateScaleRange:function(t){var i=[];e.each(t,function(t){i.push(t.value)});var s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s,{size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2})},update:function(){this.calculateTotal(this.segments),e.each(this.segments,function(t){t.save()}),this.render()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.updateScaleRange(this.segments),this.scale.update(),e.extend(this.scale,{xCenter:this.chart.width/2,yCenter:this.chart.height/2}),e.each(this.segments,function(t){t.update({outerRadius:this.scale.calculateCenterOffset(t.value)})},this)},draw:function(t){var i=t||1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.scale.getCircumference(),outerRadius:this.scale.calculateCenterOffset(t.value)},i),t.endAngle=t.startAngle+t.circumference,0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
  • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>'},initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx}),this.datasets=[],this.buildScale(t),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,pointColor:i.pointColor,pointStrokeColor:i.pointStrokeColor,points:[]};this.datasets.push(s),e.each(i.data,function(n,o){if(e.isNumber(n)){var a;this.scale.animation||(a=this.scale.getPointPosition(o,this.scale.calculateCenterOffset(n))),s.points.push(new this.PointClass({value:n,label:t.labels[o],datasetLabel:i.label,x:this.options.animation?this.scale.xCenter:a.x,y:this.options.animation?this.scale.yCenter:a.y,strokeColor:i.pointStrokeColor,fillColor:i.pointColor,highlightFill:i.pointHighlightFill||i.pointColor,highlightStroke:i.pointHighlightStroke||i.pointStrokeColor}))}},this)},this),this.render()},eachPoints:function(t){e.each(this.datasets,function(i){e.each(i.points,t,this)},this)},getPointsAtEvent:function(t){var i=e.getRelativePosition(t),s=e.getAngleFromPoint({x:this.scale.xCenter,y:this.scale.yCenter},i),n=2*Math.PI/this.scale.valuesCount,o=Math.round((s.angle-1.5*Math.PI)/n),a=[];return(o>=this.scale.valuesCount||0>o)&&(o=0),s.distance<=this.scale.drawingArea&&e.each(this.datasets,function(t){a.push(t.points[o])}),a},buildScale:function(t){this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,angleLineColor:this.options.angleLineColor,angleLineWidth:this.options.angleShowLineOut?this.options.angleLineWidth:0,pointLabelFontColor:this.options.pointLabelFontColor,pointLabelFontSize:this.options.pointLabelFontSize,pointLabelFontFamily:this.options.pointLabelFontFamily,pointLabelFontStyle:this.options.pointLabelFontStyle,height:this.chart.height,width:this.chart.width,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,labels:t.labels,valuesCount:t.datasets[0].data.length}),this.scale.setScaleSize(),this.updateScaleRange(t.datasets),this.scale.buildYLabels()},updateScaleRange:function(t){var i=function(){var i=[];return e.each(t,function(t){t.data?i=i.concat(t.data):e.each(t.points,function(t){i.push(t.value)})}),i}(),s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s)},addData:function(t,i){this.scale.valuesCount++,e.each(t,function(t,s){if(e.isNumber(t)){var n=this.scale.getPointPosition(this.scale.valuesCount,this.scale.calculateCenterOffset(t));this.datasets[s].points.push(new this.PointClass({value:t,label:i,x:n.x,y:n.y,strokeColor:this.datasets[s].pointStrokeColor,fillColor:this.datasets[s].pointColor}))}},this),this.scale.labels.push(i),this.reflow(),this.update()},removeData:function(){this.scale.valuesCount--,this.scale.labels.shift(),e.each(this.datasets,function(t){t.points.shift()},this),this.reflow(),this.update()},update:function(){this.eachPoints(function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.scale,{width:this.chart.width,height:this.chart.height,size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2}),this.updateScaleRange(this.datasets),this.scale.setScaleSize(),this.scale.buildYLabels()},draw:function(t){var i=t||1,s=this.chart.ctx;this.clear(),this.scale.draw(),e.each(this.datasets,function(t){e.each(t.points,function(t,e){t.transition(this.scale.getPointPosition(e,this.scale.calculateCenterOffset(t.value)),i)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(t.points,function(t,i){0===i?s.moveTo(t.x,t.y):s.lineTo(t.x,t.y)},this),s.closePath(),s.stroke(),s.fillStyle=t.fillColor,s.fill(),e.each(t.points,function(t){t.draw()})},this)}})}.call(this); \ No newline at end of file diff --git a/colab/static/third-party/chroma/js/chroma.min.js b/colab/static/third-party/chroma/js/chroma.min.js new file mode 100644 index 0000000..41dc232 --- /dev/null +++ b/colab/static/third-party/chroma/js/chroma.min.js @@ -0,0 +1,21 @@ +/** echo * @license echo * while read i do echo * done echo +*/ +!function(){var Color,K,PITHIRD,TWOPI,X,Y,Z,bezier,brewer,chroma,clip_rgb,colors,cos,css2rgb,hex2rgb,hsi2rgb,hsl2rgb,hsv2rgb,lab2lch,lab2rgb,lab_xyz,lch2lab,lch2rgb,limit,luminance,luminance_x,rgb2hex,rgb2hsi,rgb2hsl,rgb2hsv,rgb2lab,rgb2lch,rgb_xyz,root,type,unpack,xyz_lab,xyz_rgb,_ref;chroma=function(x,y,z,m){return new Color(x,y,z,m)};if(typeof module!=="undefined"&&module!==null&&module.exports!=null){module.exports=chroma}if(typeof define==="function"&&define.amd){define([],function(){return chroma})}else{root=typeof exports!=="undefined"&&exports!==null?exports:this;root.chroma=chroma}chroma.color=function(x,y,z,m){return new Color(x,y,z,m)};chroma.hsl=function(h,s,l,a){return new Color(h,s,l,a,"hsl")};chroma.hsv=function(h,s,v,a){return new Color(h,s,v,a,"hsv")};chroma.rgb=function(r,g,b,a){return new Color(r,g,b,a,"rgb")};chroma.hex=function(x){return new Color(x)};chroma.css=function(x){return new Color(x)};chroma.lab=function(l,a,b){return new Color(l,a,b,"lab")};chroma.lch=function(l,c,h){return new Color(l,c,h,"lch")};chroma.hsi=function(h,s,i){return new Color(h,s,i,"hsi")};chroma.gl=function(r,g,b,a){return new Color(r*255,g*255,b*255,a,"gl")};chroma.interpolate=function(a,b,f,m){if(a==null||b==null){return"#000"}if(type(a)==="string"){a=new Color(a)}if(type(b)==="string"){b=new Color(b)}return a.interpolate(f,b,m)};chroma.mix=chroma.interpolate;chroma.contrast=function(a,b){var l1,l2;if(type(a)==="string"){a=new Color(a)}if(type(b)==="string"){b=new Color(b)}l1=a.luminance();l2=b.luminance();if(l1>l2){return(l1+.05)/(l2+.05)}else{return(l2+.05)/(l1+.05)}};chroma.luminance=function(color){return chroma(color).luminance()};chroma._Color=Color;Color=function(){function Color(){var a,arg,args,m,me,me_rgb,x,y,z,_i,_len,_ref,_ref1,_ref2,_ref3;me=this;args=[];for(_i=0,_len=arguments.length;_i<_len;_i++){arg=arguments[_i];if(arg!=null){args.push(arg)}}if(args.length===0){_ref=[255,0,255,1,"rgb"],x=_ref[0],y=_ref[1],z=_ref[2],a=_ref[3],m=_ref[4]}else if(type(args[0])==="array"){if(args[0].length===3){_ref1=args[0],x=_ref1[0],y=_ref1[1],z=_ref1[2];a=1}else if(args[0].length===4){_ref2=args[0],x=_ref2[0],y=_ref2[1],z=_ref2[2],a=_ref2[3]}else{throw"unknown input argument"}m=args[1]}else if(type(args[0])==="string"){x=args[0];m="hex"}else if(type(args[0])==="object"){_ref3=args[0]._rgb,x=_ref3[0],y=_ref3[1],z=_ref3[2],a=_ref3[3];m="rgb"}else if(args.length>=3){x=args[0];y=args[1];z=args[2]}if(args.length===3){m="rgb";a=1}else if(args.length===4){if(type(args[3])==="string"){m=args[3];a=1}else if(type(args[3])==="number"){m="rgb";a=args[3]}}else if(args.length===5){a=args[3];m=args[4]}if(a==null){a=1}if(m==="rgb"){me._rgb=[x,y,z,a]}else if(m==="gl"){me._rgb=[x*255,y*255,z*255,a]}else if(m==="hsl"){me._rgb=hsl2rgb(x,y,z);me._rgb[3]=a}else if(m==="hsv"){me._rgb=hsv2rgb(x,y,z);me._rgb[3]=a}else if(m==="hex"){me._rgb=hex2rgb(x)}else if(m==="lab"){me._rgb=lab2rgb(x,y,z);me._rgb[3]=a}else if(m==="lch"){me._rgb=lch2rgb(x,y,z);me._rgb[3]=a}else if(m==="hsi"){me._rgb=hsi2rgb(x,y,z);me._rgb[3]=a}me_rgb=clip_rgb(me._rgb)}Color.prototype.rgb=function(){return this._rgb.slice(0,3)};Color.prototype.rgba=function(){return this._rgb};Color.prototype.hex=function(){return rgb2hex(this._rgb)};Color.prototype.toString=function(){return this.name()};Color.prototype.hsl=function(){return rgb2hsl(this._rgb)};Color.prototype.hsv=function(){return rgb2hsv(this._rgb)};Color.prototype.lab=function(){return rgb2lab(this._rgb)};Color.prototype.lch=function(){return rgb2lch(this._rgb)};Color.prototype.hsi=function(){return rgb2hsi(this._rgb)};Color.prototype.gl=function(){return[this._rgb[0]/255,this._rgb[1]/255,this._rgb[2]/255,this._rgb[3]]};Color.prototype.luminance=function(){return luminance(this._rgb)};Color.prototype.name=function(){var h,k;h=this.hex();for(k in chroma.colors){if(h===chroma.colors[k]){return k}}return h};Color.prototype.alpha=function(alpha){if(arguments.length){this._rgb[3]=alpha;return this}return this._rgb[3]};Color.prototype.css=function(mode){var hsl,me,rgb,rnd;if(mode==null){mode="rgb"}me=this;rgb=me._rgb;if(mode.length===3&&rgb[3]<1){mode+="a"}if(mode==="rgb"){return mode+"("+rgb.slice(0,3).join(",")+")"}else if(mode==="rgba"){return mode+"("+rgb.join(",")+")"}else if(mode==="hsl"||mode==="hsla"){hsl=me.hsl();rnd=function(a){return Math.round(a*100)/100};hsl[0]=rnd(hsl[0]);hsl[1]=rnd(hsl[1]*100)+"%";hsl[2]=rnd(hsl[2]*100)+"%";if(mode.length===4){hsl[3]=rgb[3]}return mode+"("+hsl.join(",")+")"}};Color.prototype.interpolate=function(f,col,m){var dh,hue,hue0,hue1,lbv,lbv0,lbv1,me,res,sat,sat0,sat1,xyz0,xyz1;me=this;if(m==null){m="rgb"}if(type(col)==="string"){col=new Color(col)}if(m==="hsl"||m==="hsv"||m==="lch"||m==="hsi"){if(m==="hsl"){xyz0=me.hsl();xyz1=col.hsl()}else if(m==="hsv"){xyz0=me.hsv();xyz1=col.hsv()}else if(m==="hsi"){xyz0=me.hsi();xyz1=col.hsi()}else if(m==="lch"){xyz0=me.lch();xyz1=col.lch()}if(m.substr(0,1)==="h"){hue0=xyz0[0],sat0=xyz0[1],lbv0=xyz0[2];hue1=xyz1[0],sat1=xyz1[1],lbv1=xyz1[2]}else{lbv0=xyz0[0],sat0=xyz0[1],hue0=xyz0[2];lbv1=xyz1[0],sat1=xyz1[1],hue1=xyz1[2]}if(!isNaN(hue0)&&!isNaN(hue1)){if(hue1>hue0&&hue1-hue0>180){dh=hue1-(hue0+360)}else if(hue1180){dh=hue1+360-hue0}else{dh=hue1-hue0}hue=hue0+f*dh}else if(!isNaN(hue0)){hue=hue0;if(lbv1===1||lbv1===0){sat=sat0}}else if(!isNaN(hue1)){hue=hue1;if(lbv0===1||lbv0===0){sat=sat1}}else{hue=Number.NaN}if(sat==null){sat=sat0+f*(sat1-sat0)}lbv=lbv0+f*(lbv1-lbv0);if(m.substr(0,1)==="h"){res=new Color(hue,sat,lbv,m)}else{res=new Color(lbv,sat,hue,m)}}else if(m==="rgb"){xyz0=me._rgb;xyz1=col._rgb;res=new Color(xyz0[0]+f*(xyz1[0]-xyz0[0]),xyz0[1]+f*(xyz1[1]-xyz0[1]),xyz0[2]+f*(xyz1[2]-xyz0[2]),m)}else if(m==="lab"){xyz0=me.lab();xyz1=col.lab();res=new Color(xyz0[0]+f*(xyz1[0]-xyz0[0]),xyz0[1]+f*(xyz1[1]-xyz0[1]),xyz0[2]+f*(xyz1[2]-xyz0[2]),m)}else{throw"color mode "+m+" is not supported"}res.alpha(me.alpha()+f*(col.alpha()-me.alpha()));return res};Color.prototype.premultiply=function(){var a,rgb;rgb=this.rgb();a=this.alpha();return chroma(rgb[0]*a,rgb[1]*a,rgb[2]*a,a)};Color.prototype.darken=function(amount){var lch,me;if(amount==null){amount=20}me=this;lch=me.lch();lch[0]-=amount;return chroma.lch(lch).alpha(me.alpha())};Color.prototype.darker=function(amount){return this.darken(amount)};Color.prototype.brighten=function(amount){if(amount==null){amount=20}return this.darken(-amount)};Color.prototype.brighter=function(amount){return this.brighten(amount)};Color.prototype.saturate=function(amount){var lch,me;if(amount==null){amount=20}me=this;lch=me.lch();lch[1]+=amount;return chroma.lch(lch).alpha(me.alpha())};Color.prototype.desaturate=function(amount){if(amount==null){amount=20}return this.saturate(-amount)};return Color}();clip_rgb=function(rgb){var i;for(i in rgb){if(i<3){if(rgb[i]<0){rgb[i]=0}if(rgb[i]>255){rgb[i]=255}}else if(i===3){if(rgb[i]<0){rgb[i]=0}if(rgb[i]>1){rgb[i]=1}}}return rgb};css2rgb=function(css){var hsl,i,m,rgb,_i,_j,_k,_l;css=css.toLowerCase();if(chroma.colors!=null&&chroma.colors[css]){return hex2rgb(chroma.colors[css])}if(m=css.match(/rgb\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*\)/)){rgb=m.slice(1,4);for(i=_i=0;_i<=2;i=++_i){rgb[i]=+rgb[i]}rgb[3]=1}else if(m=css.match(/rgba\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*,\s*([01]|[01]?\.\d+)\)/)){rgb=m.slice(1,5);for(i=_j=0;_j<=3;i=++_j){rgb[i]=+rgb[i]}}else if(m=css.match(/rgb\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/)){rgb=m.slice(1,4);for(i=_k=0;_k<=2;i=++_k){rgb[i]=Math.round(rgb[i]*2.55)}rgb[3]=1}else if(m=css.match(/rgba\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/)){rgb=m.slice(1,5);for(i=_l=0;_l<=2;i=++_l){rgb[i]=Math.round(rgb[i]*2.55)}rgb[3]=+rgb[3]}else if(m=css.match(/hsl\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/)){hsl=m.slice(1,4);hsl[1]*=.01;hsl[2]*=.01;rgb=hsl2rgb(hsl);rgb[3]=1}else if(m=css.match(/hsla\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/)){hsl=m.slice(1,4);hsl[1]*=.01;hsl[2]*=.01;rgb=hsl2rgb(hsl);rgb[3]=+m[4]}return rgb};hex2rgb=function(hex){var a,b,g,r,rgb,u;if(hex.match(/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/)){if(hex.length===4||hex.length===7){hex=hex.substr(1)}if(hex.length===3){hex=hex.split("");hex=hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2]}u=parseInt(hex,16);r=u>>16;g=u>>8&255;b=u&255;return[r,g,b,1]}if(hex.match(/^#?([A-Fa-f0-9]{8})$/)){if(hex.length===9){hex=hex.substr(1)}u=parseInt(hex,16);r=u>>24&255;g=u>>16&255;b=u>>8&255;a=u&255;return[r,g,b,a]}if(rgb=css2rgb(hex)){return rgb}throw"unknown color: "+hex};hsi2rgb=function(h,s,i){var b,g,r,_ref;_ref=unpack(arguments),h=_ref[0],s=_ref[1],i=_ref[2];h/=360;if(h<1/3){b=(1-s)/3;r=(1+s*cos(TWOPI*h)/cos(PITHIRD-TWOPI*h))/3;g=1-(b+r)}else if(h<2/3){h-=1/3;r=(1-s)/3;g=(1+s*cos(TWOPI*h)/cos(PITHIRD-TWOPI*h))/3;b=1-(r+g)}else{h-=2/3;g=(1-s)/3;b=(1+s*cos(TWOPI*h)/cos(PITHIRD-TWOPI*h))/3;r=1-(g+b)}r=limit(i*r*3);g=limit(i*g*3);b=limit(i*b*3);return[r*255,g*255,b*255]};hsl2rgb=function(){var b,c,g,h,i,l,r,s,t1,t2,t3,_i,_ref,_ref1;_ref=unpack(arguments),h=_ref[0],s=_ref[1],l=_ref[2];if(s===0){r=g=b=l*255}else{t3=[0,0,0];c=[0,0,0];t2=l<.5?l*(1+s):l+s-l*s;t1=2*l-t2;h/=360;t3[0]=h+1/3;t3[1]=h;t3[2]=h-1/3;for(i=_i=0;_i<=2;i=++_i){if(t3[i]<0){t3[i]+=1}if(t3[i]>1){t3[i]-=1}if(6*t3[i]<1){c[i]=t1+(t2-t1)*6*t3[i]}else if(2*t3[i]<1){c[i]=t2}else if(3*t3[i]<2){c[i]=t1+(t2-t1)*(2/3-t3[i])*6}else{c[i]=t1}}_ref1=[Math.round(c[0]*255),Math.round(c[1]*255),Math.round(c[2]*255)],r=_ref1[0],g=_ref1[1],b=_ref1[2]}return[r,g,b]};hsv2rgb=function(){var b,f,g,h,i,p,q,r,s,t,v,_ref,_ref1,_ref2,_ref3,_ref4,_ref5,_ref6;_ref=unpack(arguments),h=_ref[0],s=_ref[1],v=_ref[2];v*=255;if(s===0){r=g=b=v}else{if(h===360){h=0}if(h>360){h-=360}if(h<0){h+=360}h/=60;i=Math.floor(h);f=h-i;p=v*(1-s);q=v*(1-s*f);t=v*(1-s*(1-f));switch(i){case 0:_ref1=[v,t,p],r=_ref1[0],g=_ref1[1],b=_ref1[2];break;case 1:_ref2=[q,v,p],r=_ref2[0],g=_ref2[1],b=_ref2[2];break;case 2:_ref3=[p,v,t],r=_ref3[0],g=_ref3[1],b=_ref3[2];break;case 3:_ref4=[p,q,v],r=_ref4[0],g=_ref4[1],b=_ref4[2];break;case 4:_ref5=[t,p,v],r=_ref5[0],g=_ref5[1],b=_ref5[2];break;case 5:_ref6=[v,p,q],r=_ref6[0],g=_ref6[1],b=_ref6[2]}}r=Math.round(r);g=Math.round(g);b=Math.round(b);return[r,g,b]};K=18;X=.95047;Y=1;Z=1.08883;lab2lch=function(){var a,b,c,h,l,_ref;_ref=unpack(arguments),l=_ref[0],a=_ref[1],b=_ref[2];c=Math.sqrt(a*a+b*b);h=Math.atan2(b,a)/Math.PI*180;return[l,c,h]};lab2rgb=function(l,a,b){var g,r,x,y,z,_ref,_ref1;if(l!==void 0&&l.length===3){_ref=l,l=_ref[0],a=_ref[1],b=_ref[2]}if(l!==void 0&&l.length===3){_ref1=l,l=_ref1[0],a=_ref1[1],b=_ref1[2]}y=(l+16)/116;x=y+a/500;z=y-b/200;x=lab_xyz(x)*X;y=lab_xyz(y)*Y;z=lab_xyz(z)*Z;r=xyz_rgb(3.2404542*x-1.5371385*y-.4985314*z);g=xyz_rgb(-.969266*x+1.8760108*y+.041556*z);b=xyz_rgb(.0556434*x-.2040259*y+1.0572252*z);return[limit(r,0,255),limit(g,0,255),limit(b,0,255),1]};lab_xyz=function(x){if(x>.206893034){return x*x*x}else{return(x-4/29)/7.787037}};xyz_rgb=function(r){return Math.round(255*(r<=.00304?12.92*r:1.055*Math.pow(r,1/2.4)-.055))};lch2lab=function(){var c,h,l,_ref;_ref=unpack(arguments),l=_ref[0],c=_ref[1],h=_ref[2];h=h*Math.PI/180;return[l,Math.cos(h)*c,Math.sin(h)*c]};lch2rgb=function(l,c,h){var L,a,b,g,r,_ref,_ref1;_ref=lch2lab(l,c,h),L=_ref[0],a=_ref[1],b=_ref[2];_ref1=lab2rgb(L,a,b),r=_ref1[0],g=_ref1[1],b=_ref1[2];return[limit(r,0,255),limit(g,0,255),limit(b,0,255)]};luminance=function(r,g,b){var _ref;_ref=unpack(arguments),r=_ref[0],g=_ref[1],b=_ref[2];r=luminance_x(r);g=luminance_x(g);b=luminance_x(b);return.2126*r+.7152*g+.0722*b};luminance_x=function(x){x/=255;if(x<=.03928){return x/12.92}else{return Math.pow((x+.055)/1.055,2.4)}};rgb2hex=function(){var b,g,r,str,u,_ref;_ref=unpack(arguments),r=_ref[0],g=_ref[1],b=_ref[2];u=r<<16|g<<8|b;str="000000"+u.toString(16);return"#"+str.substr(str.length-6)};rgb2hsi=function(){var TWOPI,b,g,h,i,min,r,s,_ref;_ref=unpack(arguments),r=_ref[0],g=_ref[1],b=_ref[2];TWOPI=Math.PI*2;r/=255;g/=255;b/=255;min=Math.min(r,g,b);i=(r+g+b)/3;s=1-min/i;if(s===0){h=0}else{h=(r-g+(r-b))/2;h/=Math.sqrt((r-g)*(r-g)+(r-b)*(g-b));h=Math.acos(h);if(b>g){h=TWOPI-h}h/=TWOPI}return[h*360,s,i]};rgb2hsl=function(r,g,b){var h,l,max,min,s,_ref;if(r!==void 0&&r.length>=3){_ref=r,r=_ref[0],g=_ref[1],b=_ref[2]}r/=255;g/=255;b/=255;min=Math.min(r,g,b);max=Math.max(r,g,b);l=(max+min)/2;if(max===min){s=0;h=Number.NaN}else{s=l<.5?(max-min)/(max+min):(max-min)/(2-max-min)}if(r===max){h=(g-b)/(max-min)}else if(g===max){h=2+(b-r)/(max-min)}else if(b===max){h=4+(r-g)/(max-min)}h*=60;if(h<0){h+=360}return[h,s,l]};rgb2hsv=function(){var b,delta,g,h,max,min,r,s,v,_ref;_ref=unpack(arguments),r=_ref[0],g=_ref[1],b=_ref[2];min=Math.min(r,g,b);max=Math.max(r,g,b);delta=max-min;v=max/255;if(max===0){h=Number.NaN;s=0}else{s=delta/max;if(r===max){h=(g-b)/delta}if(g===max){h=2+(b-r)/delta}if(b===max){h=4+(r-g)/delta}h*=60;if(h<0){h+=360}}return[h,s,v]};rgb2lab=function(){var b,g,r,x,y,z,_ref;_ref=unpack(arguments),r=_ref[0],g=_ref[1],b=_ref[2];r=rgb_xyz(r);g=rgb_xyz(g);b=rgb_xyz(b);x=xyz_lab((.4124564*r+.3575761*g+.1804375*b)/X);y=xyz_lab((.2126729*r+.7151522*g+.072175*b)/Y);z=xyz_lab((.0193339*r+.119192*g+.9503041*b)/Z);return[116*y-16,500*(x-y),200*(y-z)]};rgb_xyz=function(r){if((r/=255)<=.04045){return r/12.92}else{return Math.pow((r+.055)/1.055,2.4)}};xyz_lab=function(x){if(x>.008856){return Math.pow(x,1/3)}else{return 7.787037*x+4/29}};rgb2lch=function(){var a,b,g,l,r,_ref,_ref1;_ref=unpack(arguments),r=_ref[0],g=_ref[1],b=_ref[2];_ref1=rgb2lab(r,g,b),l=_ref1[0],a=_ref1[1],b=_ref1[2];return lab2lch(l,a,b)};chroma.scale=function(colors,positions){var classifyValue,f,getClass,getColor,resetCache,setColors,setDomain,tmap,_colorCache,_colors,_correctLightness,_domain,_fixed,_max,_min,_mode,_nacol,_numClasses,_out,_pos,_spread;_mode="rgb";_nacol=chroma("#ccc");_spread=0;_fixed=false;_domain=[0,1];_colors=[];_out=false;_pos=[];_min=0;_max=1;_correctLightness=false;_numClasses=0;_colorCache={};setColors=function(colors,positions){var c,col,_i,_j,_ref,_ref1,_ref2;if(colors==null){colors=["#ddd","#222"]}if(colors!=null&&type(colors)==="string"&&((_ref=chroma.brewer)!=null?_ref[colors]:void 0)!=null){colors=chroma.brewer[colors]}if(type(colors)==="array"){colors=colors.slice(0);for(c=_i=0,_ref1=colors.length-1;0<=_ref1?_i<=_ref1:_i>=_ref1;c=0<=_ref1?++_i:--_i){col=colors[c];if(type(col)==="string"){colors[c]=chroma(col)}}if(positions!=null){_pos=positions}else{_pos=[];for(c=_j=0,_ref2=colors.length-1;0<=_ref2?_j<=_ref2:_j>=_ref2;c=0<=_ref2?++_j:--_j){_pos.push(c/(colors.length-1))}}}resetCache();return _colors=colors};setDomain=function(domain){if(domain==null){domain=[]}_domain=domain;_min=domain[0];_max=domain[domain.length-1];resetCache();if(domain.length===2){return _numClasses=0}else{return _numClasses=domain.length-1}};getClass=function(value){var i,n;if(_domain!=null){n=_domain.length-1;i=0;while(i=_domain[i]){i++}return i-1}return 0};tmap=function(t){return t};classifyValue=function(value){var i,maxc,minc,n,val;val=value;if(_domain.length>2){n=_domain.length-1;i=getClass(value);minc=_domain[0]+(_domain[1]-_domain[0])*(0+_spread*.5);maxc=_domain[n-1]+(_domain[n]-_domain[n-1])*(1-_spread*.5);val=_min+(_domain[i]+(_domain[i+1]-_domain[i])*.5-minc)/(maxc-minc)*(_max-_min)}return val};getColor=function(val,bypassMap){var c,col,f0,i,k,p,t,_i,_ref;if(bypassMap==null){bypassMap=false}if(isNaN(val)){return _nacol}if(!bypassMap){if(_domain.length>2){c=getClass(val);t=c/(_numClasses-1)}else{t=f0=(val-_min)/(_max-_min);t=Math.min(1,Math.max(0,t))}}else{t=val}if(!bypassMap){t=tmap(t)}k=Math.floor(t*1e4);if(_colorCache[k]){col=_colorCache[k]}else{if(type(_colors)==="array"){for(i=_i=0,_ref=_pos.length-1;0<=_ref?_i<=_ref:_i>=_ref;i=0<=_ref?++_i:--_i){p=_pos[i];if(t<=p){col=_colors[i];break}if(t>=p&&i===_pos.length-1){col=_colors[i];break}if(t>p&&t<_pos[i+1]){t=(t-p)/(_pos[i+1]-p);col=chroma.interpolate(_colors[i],_colors[i+1],t,_mode);break}}}else if(type(_colors)==="function"){col=_colors(t)}_colorCache[k]=col}return col};resetCache=function(){return _colorCache={}};setColors(colors,positions);f=function(v){var c;c=getColor(v);if(_out&&c[_out]){return c[_out]()}else{return c}};f.domain=function(domain,classes,mode,key){var d;if(mode==null){mode="e"}if(!arguments.length){return _domain}if(classes!=null){d=chroma.analyze(domain,key);if(classes===0){domain=[d.min,d.max]}else{domain=chroma.limits(d,mode,classes)}}setDomain(domain);return f};f.mode=function(_m){if(!arguments.length){return _mode}_mode=_m;resetCache();return f};f.range=function(colors,_pos){setColors(colors,_pos);return f};f.out=function(_o){_out=_o;return f};f.spread=function(val){if(!arguments.length){return _spread}_spread=val;return f};f.correctLightness=function(v){if(!arguments.length){return _correctLightness}_correctLightness=v;resetCache();if(_correctLightness){tmap=function(t){var L0,L1,L_actual,L_diff,L_ideal,max_iter,pol,t0,t1;L0=getColor(0,true).lab()[0];L1=getColor(1,true).lab()[0];pol=L0>L1;L_actual=getColor(t,true).lab()[0];L_ideal=L0+(L1-L0)*t;L_diff=L_actual-L_ideal;t0=0;t1=1;max_iter=20;while(Math.abs(L_diff)>.01&&max_iter-->0){!function(){if(pol){L_diff*=-1}if(L_diff<0){t0=t;t+=(t1-t)*.5}else{t1=t;t+=(t0-t)*.5}L_actual=getColor(t,true).lab()[0];return L_diff=L_actual-L_ideal}()}return t}}else{tmap=function(t){return t}}return f};f.colors=function(out){var i,samples,_i,_j,_len,_ref;if(out==null){out="hex"}colors=[];samples=[];if(_domain.length>2){for(i=_i=1,_ref=_domain.length;1<=_ref?_i<_ref:_i>_ref;i=1<=_ref?++_i:--_i){samples.push((_domain[i-1]+_domain[i])*.5)}}else{samples=_domain}for(_j=0,_len=samples.length;_j<_len;_j++){i=samples[_j];colors.push(f(i)[out]())}return colors};return f};if((_ref=chroma.scales)==null){chroma.scales={}}chroma.scales.cool=function(){return chroma.scale([chroma.hsl(180,1,.9),chroma.hsl(250,.7,.4)])};chroma.scales.hot=function(){return chroma.scale(["#000","#f00","#ff0","#fff"],[0,.25,.75,1]).mode("rgb")};chroma.analyze=function(data,key,filter){var add,k,r,val,visit,_i,_len;r={min:Number.MAX_VALUE,max:Number.MAX_VALUE*-1,sum:0,values:[],count:0};if(filter==null){filter=function(){return true}}add=function(val){if(val!=null&&!isNaN(val)){r.values.push(val);r.sum+=val;if(valr.max){r.max=val}r.count+=1}};visit=function(val,k){if(filter(val,k)){if(key!=null&&type(key)==="function"){return add(key(val))}else if(key!=null&&type(key)==="string"||type(key)==="number"){return add(val[key])}else{return add(val)}}};if(type(data)==="array"){for(_i=0,_len=data.length;_i<_len;_i++){val=data[_i];visit(val)}}else{for(k in data){val=data[k];visit(val,k)}}r.domain=[r.min,r.max];r.limits=function(mode,num){return chroma.limits(r,mode,num)};return r};chroma.limits=function(data,mode,num){var assignments,best,centroids,cluster,clusterSizes,dist,i,j,kClusters,limits,max,max_log,min,min_log,mindist,n,nb_iters,newCentroids,p,pb,pr,repeat,sum,tmpKMeansBreaks,value,values,_i,_j,_k,_l,_m,_n,_o,_p,_q,_r,_ref1,_ref10,_ref11,_ref12,_ref13,_ref14,_ref15,_ref2,_ref3,_ref4,_ref5,_ref6,_ref7,_ref8,_ref9,_s,_t,_u,_v,_w;if(mode==null){mode="equal"}if(num==null){num=7}if(data.values==null){data=chroma.analyze(data)}min=data.min;max=data.max;sum=data.sum;values=data.values.sort(function(a,b){return a-b});limits=[];if(mode.substr(0,1)==="c"){limits.push(min);limits.push(max)}if(mode.substr(0,1)==="e"){limits.push(min);for(i=_i=1,_ref1=num-1;1<=_ref1?_i<=_ref1:_i>=_ref1;i=1<=_ref1?++_i:--_i){limits.push(min+i/num*(max-min))}limits.push(max)}else if(mode.substr(0,1)==="l"){if(min<=0){throw"Logarithmic scales are only possible for values > 0"}min_log=Math.LOG10E*Math.log(min);max_log=Math.LOG10E*Math.log(max);limits.push(min);for(i=_j=1,_ref2=num-1;1<=_ref2?_j<=_ref2:_j>=_ref2;i=1<=_ref2?++_j:--_j){limits.push(Math.pow(10,min_log+i/num*(max_log-min_log)))}limits.push(max)}else if(mode.substr(0,1)==="q"){limits.push(min);for(i=_k=1,_ref3=num-1;1<=_ref3?_k<=_ref3:_k>=_ref3;i=1<=_ref3?++_k:--_k){p=values.length*i/num;pb=Math.floor(p);if(pb===p){limits.push(values[pb])}else{pr=p-pb;limits.push(values[pb]*pr+values[pb+1]*(1-pr))}}limits.push(max)}else if(mode.substr(0,1)==="k"){n=values.length;assignments=new Array(n);clusterSizes=new Array(num);repeat=true;nb_iters=0;centroids=null;centroids=[];centroids.push(min);for(i=_l=1,_ref4=num-1;1<=_ref4?_l<=_ref4:_l>=_ref4;i=1<=_ref4?++_l:--_l){centroids.push(min+i/num*(max-min))}centroids.push(max);while(repeat){for(j=_m=0,_ref5=num-1;0<=_ref5?_m<=_ref5:_m>=_ref5;j=0<=_ref5?++_m:--_m){clusterSizes[j]=0}for(i=_n=0,_ref6=n-1;0<=_ref6?_n<=_ref6:_n>=_ref6;i=0<=_ref6?++_n:--_n){value=values[i];mindist=Number.MAX_VALUE;for(j=_o=0,_ref7=num-1;0<=_ref7?_o<=_ref7:_o>=_ref7;j=0<=_ref7?++_o:--_o){dist=Math.abs(centroids[j]-value);if(dist=_ref8;j=0<=_ref8?++_p:--_p){newCentroids[j]=null}for(i=_q=0,_ref9=n-1;0<=_ref9?_q<=_ref9:_q>=_ref9;i=0<=_ref9?++_q:--_q){cluster=assignments[i];if(newCentroids[cluster]===null){newCentroids[cluster]=values[i]}else{newCentroids[cluster]+=values[i]}}for(j=_r=0,_ref10=num-1;0<=_ref10?_r<=_ref10:_r>=_ref10;j=0<=_ref10?++_r:--_r){newCentroids[j]*=1/clusterSizes[j]}repeat=false;for(j=_s=0,_ref11=num-1;0<=_ref11?_s<=_ref11:_s>=_ref11;j=0<=_ref11?++_s:--_s){if(newCentroids[j]!==centroids[i]){repeat=true;break}}centroids=newCentroids;nb_iters++;if(nb_iters>200){repeat=false}}kClusters={};for(j=_t=0,_ref12=num-1;0<=_ref12?_t<=_ref12:_t>=_ref12;j=0<=_ref12?++_t:--_t){kClusters[j]=[]}for(i=_u=0,_ref13=n-1;0<=_ref13?_u<=_ref13:_u>=_ref13;i=0<=_ref13?++_u:--_u){cluster=assignments[i];kClusters[cluster].push(values[i])}tmpKMeansBreaks=[];for(j=_v=0,_ref14=num-1;0<=_ref14?_v<=_ref14:_v>=_ref14;j=0<=_ref14?++_v:--_v){tmpKMeansBreaks.push(kClusters[j][0]);tmpKMeansBreaks.push(kClusters[j][kClusters[j].length-1])}tmpKMeansBreaks=tmpKMeansBreaks.sort(function(a,b){return a-b});limits.push(tmpKMeansBreaks[0]);for(i=_w=1,_ref15=tmpKMeansBreaks.length-1;_w<=_ref15;i=_w+=2){if(!isNaN(tmpKMeansBreaks[i])){limits.push(tmpKMeansBreaks[i])}}}return limits};/** + ColorBrewer colors for chroma.js + + Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The + Pennsylvania State University. + + 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. + + @preserve + */ +chroma.brewer=brewer={OrRd:["#fff7ec","#fee8c8","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#b30000","#7f0000"],PuBu:["#fff7fb","#ece7f2","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#045a8d","#023858"],BuPu:["#f7fcfd","#e0ecf4","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#810f7c","#4d004b"],Oranges:["#fff5eb","#fee6ce","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#a63603","#7f2704"],BuGn:["#f7fcfd","#e5f5f9","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#006d2c","#00441b"],YlOrBr:["#ffffe5","#fff7bc","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#993404","#662506"],YlGn:["#ffffe5","#f7fcb9","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#006837","#004529"],Reds:["#fff5f0","#fee0d2","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#a50f15","#67000d"],RdPu:["#fff7f3","#fde0dd","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177","#49006a"],Greens:["#f7fcf5","#e5f5e0","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#006d2c","#00441b"],YlGnBu:["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#253494","#081d58"],Purples:["#fcfbfd","#efedf5","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#54278f","#3f007d"],GnBu:["#f7fcf0","#e0f3db","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#0868ac","#084081"],Greys:["#ffffff","#f0f0f0","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525","#000000"],YlOrRd:["#ffffcc","#ffeda0","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#bd0026","#800026"],PuRd:["#f7f4f9","#e7e1ef","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#980043","#67001f"],Blues:["#f7fbff","#deebf7","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#08519c","#08306b"],PuBuGn:["#fff7fb","#ece2f0","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016c59","#014636"],Spectral:["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#ffffbf","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2"],RdYlGn:["#a50026","#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850","#006837"],RdBu:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac","#053061"],PiYG:["#8e0152","#c51b7d","#de77ae","#f1b6da","#fde0ef","#f7f7f7","#e6f5d0","#b8e186","#7fbc41","#4d9221","#276419"],PRGn:["#40004b","#762a83","#9970ab","#c2a5cf","#e7d4e8","#f7f7f7","#d9f0d3","#a6dba0","#5aae61","#1b7837","#00441b"],RdYlBu:["#a50026","#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"],BrBG:["#543005","#8c510a","#bf812d","#dfc27d","#f6e8c3","#f5f5f5","#c7eae5","#80cdc1","#35978f","#01665e","#003c30"],RdGy:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#ffffff","#e0e0e0","#bababa","#878787","#4d4d4d","#1a1a1a"],PuOr:["#7f3b08","#b35806","#e08214","#fdb863","#fee0b6","#f7f7f7","#d8daeb","#b2abd2","#8073ac","#542788","#2d004b"],Set2:["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854","#ffd92f","#e5c494","#b3b3b3"],Accent:["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0","#f0027f","#bf5b17","#666666"],Set1:["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf","#999999"],Set3:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd","#ccebc5","#ffed6f"],Dark2:["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02","#a6761d","#666666"],Paired:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6","#6a3d9a","#ffff99","#b15928"],Pastel2:["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9","#fff2ae","#f1e2cc","#cccccc"],Pastel1:["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc","#e5d8bd","#fddaec","#f2f2f2"]};chroma.colors=colors={indigo:"#4b0082",gold:"#ffd700",hotpink:"#ff69b4",firebrick:"#b22222",indianred:"#cd5c5c",yellow:"#ffff00",mistyrose:"#ffe4e1",darkolivegreen:"#556b2f",olive:"#808000",darkseagreen:"#8fbc8f",pink:"#ffc0cb",tomato:"#ff6347",lightcoral:"#f08080",orangered:"#ff4500",navajowhite:"#ffdead",lime:"#00ff00",palegreen:"#98fb98",darkslategrey:"#2f4f4f",greenyellow:"#adff2f",burlywood:"#deb887",seashell:"#fff5ee",mediumspringgreen:"#00fa9a",fuchsia:"#ff00ff",papayawhip:"#ffefd5",blanchedalmond:"#ffebcd",chartreuse:"#7fff00",dimgray:"#696969",black:"#000000",peachpuff:"#ffdab9",springgreen:"#00ff7f",aquamarine:"#7fffd4",white:"#ffffff",orange:"#ffa500",lightsalmon:"#ffa07a",darkslategray:"#2f4f4f",brown:"#a52a2a",ivory:"#fffff0",dodgerblue:"#1e90ff",peru:"#cd853f",lawngreen:"#7cfc00",chocolate:"#d2691e",crimson:"#dc143c",forestgreen:"#228b22",darkgrey:"#a9a9a9",lightseagreen:"#20b2aa",cyan:"#00ffff",mintcream:"#f5fffa",silver:"#c0c0c0",antiquewhite:"#faebd7",mediumorchid:"#ba55d3",skyblue:"#87ceeb",gray:"#808080",darkturquoise:"#00ced1",goldenrod:"#daa520",darkgreen:"#006400",floralwhite:"#fffaf0",darkviolet:"#9400d3",darkgray:"#a9a9a9",moccasin:"#ffe4b5",saddlebrown:"#8b4513",grey:"#808080",darkslateblue:"#483d8b",lightskyblue:"#87cefa",lightpink:"#ffb6c1",mediumvioletred:"#c71585",slategrey:"#708090",red:"#ff0000",deeppink:"#ff1493",limegreen:"#32cd32",darkmagenta:"#8b008b",palegoldenrod:"#eee8aa",plum:"#dda0dd",turquoise:"#40e0d0",lightgrey:"#d3d3d3",lightgoldenrodyellow:"#fafad2",darkgoldenrod:"#b8860b",lavender:"#e6e6fa",maroon:"#800000",yellowgreen:"#9acd32",sandybrown:"#f4a460",thistle:"#d8bfd8",violet:"#ee82ee",navy:"#000080",magenta:"#ff00ff",dimgrey:"#696969",tan:"#d2b48c",rosybrown:"#bc8f8f",olivedrab:"#6b8e23",blue:"#0000ff",lightblue:"#add8e6",ghostwhite:"#f8f8ff",honeydew:"#f0fff0",cornflowerblue:"#6495ed",slateblue:"#6a5acd",linen:"#faf0e6",darkblue:"#00008b",powderblue:"#b0e0e6",seagreen:"#2e8b57",darkkhaki:"#bdb76b",snow:"#fffafa",sienna:"#a0522d",mediumblue:"#0000cd",royalblue:"#4169e1",lightcyan:"#e0ffff",green:"#008000",mediumpurple:"#9370db",midnightblue:"#191970",cornsilk:"#fff8dc",paleturquoise:"#afeeee",bisque:"#ffe4c4",slategray:"#708090",darkcyan:"#008b8b",khaki:"#f0e68c",wheat:"#f5deb3",teal:"#008080",darkorchid:"#9932cc",deepskyblue:"#00bfff",salmon:"#fa8072",darkred:"#8b0000",steelblue:"#4682b4",palevioletred:"#db7093",lightslategray:"#778899",aliceblue:"#f0f8ff",lightslategrey:"#778899",lightgreen:"#90ee90",orchid:"#da70d6",gainsboro:"#dcdcdc",mediumseagreen:"#3cb371",lightgray:"#d3d3d3",mediumturquoise:"#48d1cc",lemonchiffon:"#fffacd",cadetblue:"#5f9ea0",lightyellow:"#ffffe0",lavenderblush:"#fff0f5",coral:"#ff7f50",purple:"#800080",aqua:"#00ffff",whitesmoke:"#f5f5f5",mediumslateblue:"#7b68ee",darkorange:"#ff8c00",mediumaquamarine:"#66cdaa",darksalmon:"#e9967a",beige:"#f5f5dc",blueviolet:"#8a2be2",azure:"#f0ffff",lightsteelblue:"#b0c4de",oldlace:"#fdf5e6"};type=function(){var classToType,name,_i,_len,_ref1;classToType={};_ref1="Boolean Number String Function Array Date RegExp Undefined Null".split(" ");for(_i=0,_len=_ref1.length;_i<_len;_i++){name=_ref1[_i];classToType["[object "+name+"]"]=name.toLowerCase()}return function(obj){var strType;strType=Object.prototype.toString.call(obj);return classToType[strType]||"object"}}();limit=function(x,min,max){if(min==null){min=0}if(max==null){max=1}if(xmax){x=max}return x};unpack=function(args){if(args.length>=3){return args}else{return args[0]}};TWOPI=Math.PI*2;PITHIRD=Math.PI/3;cos=Math.cos;bezier=function(colors){var I,I0,I1,c,lab0,lab1,lab2,lab3,_ref1,_ref2,_ref3;colors=function(){var _i,_len,_results;_results=[];for(_i=0,_len=colors.length;_i<_len;_i++){c=colors[_i];_results.push(chroma(c))}return _results}();if(colors.length===2){_ref1=function(){var _i,_len,_results;_results=[];for(_i=0,_len=colors.length;_i<_len;_i++){c=colors[_i];_results.push(c.lab())}return _results}(),lab0=_ref1[0],lab1=_ref1[1];I=function(t){var i,lab;lab=function(){var _i,_results;_results=[];for(i=_i=0;_i<=2;i=++_i){_results.push(lab0[i]+t*(lab1[i]-lab0[i]))}return _results}();return chroma.lab.apply(chroma,lab)}}else if(colors.length===3){_ref2=function(){var _i,_len,_results;_results=[];for(_i=0,_len=colors.length;_i<_len;_i++){c=colors[_i];_results.push(c.lab())}return _results}(),lab0=_ref2[0],lab1=_ref2[1],lab2=_ref2[2];I=function(t){var i,lab;lab=function(){var _i,_results;_results=[];for(i=_i=0;_i<=2;i=++_i){_results.push((1-t)*(1-t)*lab0[i]+2*(1-t)*t*lab1[i]+t*t*lab2[i])}return _results}();return chroma.lab.apply(chroma,lab)}}else if(colors.length===4){_ref3=function(){var _i,_len,_results;_results=[];for(_i=0,_len=colors.length;_i<_len;_i++){c=colors[_i];_results.push(c.lab())}return _results}(),lab0=_ref3[0],lab1=_ref3[1],lab2=_ref3[2],lab3=_ref3[3];I=function(t){var i,lab;lab=function(){var _i,_results;_results=[];for(i=_i=0;_i<=2;i=++_i){_results.push((1-t)*(1-t)*(1-t)*lab0[i]+3*(1-t)*(1-t)*t*lab1[i]+3*(1-t)*t*t*lab2[i]+t*t*t*lab3[i])}return _results}();return chroma.lab.apply(chroma,lab)}}else if(colors.length===5){I0=bezier(colors.slice(0,3));I1=bezier(colors.slice(2,5));I=function(t){if(t<.5){return I0(t*2)}else{return I1((t-.5)*2)}}}return I};chroma.interpolate.bezier=bezier}.call(this); \ No newline at end of file diff --git a/colab/static/third-party/font-awesome/css/font-awesome-ie7.min.css b/colab/static/third-party/font-awesome/css/font-awesome-ie7.min.css new file mode 100644 index 0000000..d3dae63 --- /dev/null +++ b/colab/static/third-party/font-awesome/css/font-awesome-ie7.min.css @@ -0,0 +1,384 @@ +.icon-large{font-size:1.3333333333333333em;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;vertical-align:middle;} +.nav [class^="icon-"],.nav [class*=" icon-"]{vertical-align:inherit;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;}.nav [class^="icon-"].icon-large,.nav [class*=" icon-"].icon-large{vertical-align:-25%;} +.nav-pills [class^="icon-"].icon-large,.nav-tabs [class^="icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large{line-height:.75em;margin-top:-7px;padding-top:5px;margin-bottom:-5px;padding-bottom:4px;} +.btn [class^="icon-"].pull-left,.btn [class*=" icon-"].pull-left,.btn [class^="icon-"].pull-right,.btn [class*=" icon-"].pull-right{vertical-align:inherit;} +.btn [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large{margin-top:-0.5em;} +a [class^="icon-"],a [class*=" icon-"]{cursor:pointer;} +.icon-glass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-music{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-search{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-envelope-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-heart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-star{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-star-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-user{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-film{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-th-large{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-th{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-th-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ok{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-remove{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-zoom-in{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-zoom-out{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-power-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-signal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-cog{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-gear{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-trash{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-home{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-file-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-time{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-road{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-download-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-inbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-play-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-repeat{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-rotate-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-refresh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-list-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-lock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-flag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-headphones{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-volume-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-volume-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-volume-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-qrcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-barcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-tag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-tags{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-book{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bookmark{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-print{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-camera{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-font{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bold{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-italic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-text-height{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-text-width{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-align-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-align-center{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-align-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-align-justify{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-indent-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-indent-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-facetime-video{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-picture{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-pencil{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-map-marker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-adjust{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-tint{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-edit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-share{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-check{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-move{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-step-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-fast-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-pause{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-stop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-fast-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-step-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-eject{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-minus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-remove-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ok-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-question-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-info-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-screenshot{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-remove-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ok-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ban-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-share-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-mail-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-resize-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-resize-small{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-asterisk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-exclamation-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-gift{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-leaf{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-fire{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-eye-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-eye-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-warning-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-plane{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-calendar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-random{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-comment{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-magnet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-retweet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-shopping-cart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-folder-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-folder-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-resize-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-resize-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bar-chart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-twitter-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-facebook-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-camera-retro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-key{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-cogs{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-gears{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-comments{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-thumbs-up-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-thumbs-down-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-star-half{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-heart-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-signout{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-linkedin-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-pushpin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-external-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-signin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-trophy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-github-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-upload-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-lemon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-check-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-unchecked{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bookmark-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-phone-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-twitter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-facebook{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-github{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-unlock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-credit-card{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-rss{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-hdd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bullhorn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bell{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-certificate{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-hand-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-hand-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-hand-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-hand-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-circle-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-circle-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-circle-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-circle-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-globe{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-wrench{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-tasks{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-filter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-briefcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-fullscreen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-group{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-cloud{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-beaker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-cut{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-copy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-paper-clip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-paperclip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-save{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sign-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-reorder{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-list-ul{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-list-ol{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-strikethrough{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-underline{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-table{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-magic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-truck{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-pinterest{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-pinterest-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-google-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-google-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-money{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-caret-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-caret-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-caret-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-caret-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-columns{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-envelope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-linkedin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-undo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-rotate-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-legal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-dashboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-comment-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-comments-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bolt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sitemap{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-umbrella{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-paste{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-lightbulb{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-exchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-cloud-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-cloud-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-user-md{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-stethoscope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-suitcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bell-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-coffee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-food{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-file-text-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-building{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-hospital{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ambulance{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-medkit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-fighter-jet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-beer{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-h-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-plus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-double-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-double-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-double-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-double-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-desktop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-laptop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-tablet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-mobile-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-circle-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-quote-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-quote-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-spinner{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-mail-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-github-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-folder-close-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-folder-open-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-expand-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-collapse-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-smile{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-frown{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-meh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-gamepad{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-keyboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-flag-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-flag-checkered{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-terminal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-code{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-mail-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-star-half-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-star-half-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-location-arrow{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-crop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-code-fork{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-unlink{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-question{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-info{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-exclamation{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-superscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-subscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-eraser{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-puzzle-piece{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-microphone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-microphone-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-shield{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-calendar-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-fire-extinguisher{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-rocket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-maxcdn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-sign-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-sign-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-sign-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-sign-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-html5{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-css3{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-anchor{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-unlock-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bullseye{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ellipsis-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ellipsis-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-rss-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-play-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ticket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-minus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-check-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-level-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-level-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-check-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-edit-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-external-link-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-share-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-compass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-collapse{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-collapse-top{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-expand{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-eur{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-euro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-gbp{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-usd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-dollar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-inr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-rupee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-jpy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-yen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-cny{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-renminbi{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-krw{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-won{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-btc{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bitcoin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-file{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-file-text{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-by-alphabet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-by-alphabet-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-by-attributes{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-by-attributes-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-by-order{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-by-order-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-thumbs-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-thumbs-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-youtube-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-youtube{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-xing{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-xing-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-youtube-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-dropbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-stackexchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-instagram{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-flickr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-adn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bitbucket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bitbucket-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-tumblr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-tumblr-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-long-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-long-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-long-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-long-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-apple{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-windows{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-android{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-linux{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-dribbble{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-skype{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-foursquare{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-trello{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-female{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-male{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-gittip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sun{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-moon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-archive{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bug{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-vk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-weibo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-renren{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} diff --git a/colab/static/third-party/font-awesome/css/font-awesome.min.css b/colab/static/third-party/font-awesome/css/font-awesome.min.css new file mode 100644 index 0000000..866437f --- /dev/null +++ b/colab/static/third-party/font-awesome/css/font-awesome.min.css @@ -0,0 +1,403 @@ +@font-face{font-family:'FontAwesome';src:url('../font/fontawesome-webfont.eot?v=3.2.1');src:url('../font/fontawesome-webfont.eot?#iefix&v=3.2.1') format('embedded-opentype'),url('../font/fontawesome-webfont.woff?v=3.2.1') format('woff'),url('../font/fontawesome-webfont.ttf?v=3.2.1') format('truetype'),url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1') format('svg');font-weight:normal;font-style:normal;}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;} +[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none;} +.icon-large:before{vertical-align:-10%;font-size:1.3333333333333333em;} +a [class^="icon-"],a [class*=" icon-"]{display:inline;} +[class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.1428571428571428em;text-align:right;padding-right:0.2857142857142857em;}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.4285714285714286em;} +.icons-ul{margin-left:2.142857142857143em;list-style-type:none;}.icons-ul>li{position:relative;} +.icons-ul .icon-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;text-align:center;line-height:inherit;} +[class^="icon-"].hide,[class*=" icon-"].hide{display:none;} +.icon-muted{color:#eeeeee;} +.icon-light{color:#ffffff;} +.icon-dark{color:#333333;} +.icon-border{border:solid 1px #eeeeee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.icon-2x{font-size:2em;}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.icon-3x{font-size:3em;}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.icon-4x{font-size:4em;}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.icon-5x{font-size:5em;}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;} +.pull-right{float:right;} +.pull-left{float:left;} +[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em;} +[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em;} +[class^="icon-"],[class*=" icon-"]{display:inline;width:auto;height:auto;line-height:normal;vertical-align:baseline;background-image:none;background-position:0% 0%;background-repeat:repeat;margin-top:0;} +.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:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:none;} +.btn [class^="icon-"].icon-large,.nav [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large,.nav [class*=" icon-"].icon-large{line-height:.9em;} +.btn [class^="icon-"].icon-spin,.nav [class^="icon-"].icon-spin,.btn [class*=" icon-"].icon-spin,.nav [class*=" icon-"].icon-spin{display:inline-block;} +.nav-tabs [class^="icon-"],.nav-pills [class^="icon-"],.nav-tabs [class*=" icon-"],.nav-pills [class*=" icon-"],.nav-tabs [class^="icon-"].icon-large,.nav-pills [class^="icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large{line-height:.9em;} +.btn [class^="icon-"].pull-left.icon-2x,.btn [class*=" icon-"].pull-left.icon-2x,.btn [class^="icon-"].pull-right.icon-2x,.btn [class*=" icon-"].pull-right.icon-2x{margin-top:.18em;} +.btn [class^="icon-"].icon-spin.icon-large,.btn [class*=" icon-"].icon-spin.icon-large{line-height:.8em;} +.btn.btn-small [class^="icon-"].pull-left.icon-2x,.btn.btn-small [class*=" icon-"].pull-left.icon-2x,.btn.btn-small [class^="icon-"].pull-right.icon-2x,.btn.btn-small [class*=" icon-"].pull-right.icon-2x{margin-top:.25em;} +.btn.btn-large [class^="icon-"],.btn.btn-large [class*=" icon-"]{margin-top:0;}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x,.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-top:.05em;} +.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x{margin-right:.2em;} +.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-left:.2em;} +.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{line-height:inherit;} +.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%;}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em;} +.icon-stack .icon-stack-base{font-size:2em;*line-height:1em;} +.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;} +a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none;} +@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);} 100%{-moz-transform:rotate(359deg);}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);} 100%{-webkit-transform:rotate(359deg);}}@-o-keyframes spin{0%{-o-transform:rotate(0deg);} 100%{-o-transform:rotate(359deg);}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg);} 100%{-ms-transform:rotate(359deg);}}@keyframes spin{0%{transform:rotate(0deg);} 100%{transform:rotate(359deg);}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);} +.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);} +.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);} +.icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1);} +.icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1);} +a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block;} +.icon-glass:before{content:"\f000";} +.icon-music:before{content:"\f001";} +.icon-search:before{content:"\f002";} +.icon-envelope-alt:before{content:"\f003";} +.icon-heart:before{content:"\f004";} +.icon-star:before{content:"\f005";} +.icon-star-empty:before{content:"\f006";} +.icon-user:before{content:"\f007";} +.icon-film:before{content:"\f008";} +.icon-th-large:before{content:"\f009";} +.icon-th:before{content:"\f00a";} +.icon-th-list:before{content:"\f00b";} +.icon-ok:before{content:"\f00c";} +.icon-remove:before{content:"\f00d";} +.icon-zoom-in:before{content:"\f00e";} +.icon-zoom-out:before{content:"\f010";} +.icon-power-off:before,.icon-off:before{content:"\f011";} +.icon-signal:before{content:"\f012";} +.icon-gear:before,.icon-cog:before{content:"\f013";} +.icon-trash:before{content:"\f014";} +.icon-home:before{content:"\f015";} +.icon-file-alt:before{content:"\f016";} +.icon-time:before{content:"\f017";} +.icon-road:before{content:"\f018";} +.icon-download-alt:before{content:"\f019";} +.icon-download:before{content:"\f01a";} +.icon-upload:before{content:"\f01b";} +.icon-inbox:before{content:"\f01c";} +.icon-play-circle:before{content:"\f01d";} +.icon-rotate-right:before,.icon-repeat:before{content:"\f01e";} +.icon-refresh:before{content:"\f021";} +.icon-list-alt:before{content:"\f022";} +.icon-lock:before{content:"\f023";} +.icon-flag:before{content:"\f024";} +.icon-headphones:before{content:"\f025";} +.icon-volume-off:before{content:"\f026";} +.icon-volume-down:before{content:"\f027";} +.icon-volume-up:before{content:"\f028";} +.icon-qrcode:before{content:"\f029";} +.icon-barcode:before{content:"\f02a";} +.icon-tag:before{content:"\f02b";} +.icon-tags:before{content:"\f02c";} +.icon-book:before{content:"\f02d";} +.icon-bookmark:before{content:"\f02e";} +.icon-print:before{content:"\f02f";} +.icon-camera:before{content:"\f030";} +.icon-font:before{content:"\f031";} +.icon-bold:before{content:"\f032";} +.icon-italic:before{content:"\f033";} +.icon-text-height:before{content:"\f034";} +.icon-text-width:before{content:"\f035";} +.icon-align-left:before{content:"\f036";} +.icon-align-center:before{content:"\f037";} +.icon-align-right:before{content:"\f038";} +.icon-align-justify:before{content:"\f039";} +.icon-list:before{content:"\f03a";} +.icon-indent-left:before{content:"\f03b";} +.icon-indent-right:before{content:"\f03c";} +.icon-facetime-video:before{content:"\f03d";} +.icon-picture:before{content:"\f03e";} +.icon-pencil:before{content:"\f040";} +.icon-map-marker:before{content:"\f041";} +.icon-adjust:before{content:"\f042";} +.icon-tint:before{content:"\f043";} +.icon-edit:before{content:"\f044";} +.icon-share:before{content:"\f045";} +.icon-check:before{content:"\f046";} +.icon-move:before{content:"\f047";} +.icon-step-backward:before{content:"\f048";} +.icon-fast-backward:before{content:"\f049";} +.icon-backward:before{content:"\f04a";} +.icon-play:before{content:"\f04b";} +.icon-pause:before{content:"\f04c";} +.icon-stop:before{content:"\f04d";} +.icon-forward:before{content:"\f04e";} +.icon-fast-forward:before{content:"\f050";} +.icon-step-forward:before{content:"\f051";} +.icon-eject:before{content:"\f052";} +.icon-chevron-left:before{content:"\f053";} +.icon-chevron-right:before{content:"\f054";} +.icon-plus-sign:before{content:"\f055";} +.icon-minus-sign:before{content:"\f056";} +.icon-remove-sign:before{content:"\f057";} +.icon-ok-sign:before{content:"\f058";} +.icon-question-sign:before{content:"\f059";} +.icon-info-sign:before{content:"\f05a";} +.icon-screenshot:before{content:"\f05b";} +.icon-remove-circle:before{content:"\f05c";} +.icon-ok-circle:before{content:"\f05d";} +.icon-ban-circle:before{content:"\f05e";} +.icon-arrow-left:before{content:"\f060";} +.icon-arrow-right:before{content:"\f061";} +.icon-arrow-up:before{content:"\f062";} +.icon-arrow-down:before{content:"\f063";} +.icon-mail-forward:before,.icon-share-alt:before{content:"\f064";} +.icon-resize-full:before{content:"\f065";} +.icon-resize-small:before{content:"\f066";} +.icon-plus:before{content:"\f067";} +.icon-minus:before{content:"\f068";} +.icon-asterisk:before{content:"\f069";} +.icon-exclamation-sign:before{content:"\f06a";} +.icon-gift:before{content:"\f06b";} +.icon-leaf:before{content:"\f06c";} +.icon-fire:before{content:"\f06d";} +.icon-eye-open:before{content:"\f06e";} +.icon-eye-close:before{content:"\f070";} +.icon-warning-sign:before{content:"\f071";} +.icon-plane:before{content:"\f072";} +.icon-calendar:before{content:"\f073";} +.icon-random:before{content:"\f074";} +.icon-comment:before{content:"\f075";} +.icon-magnet:before{content:"\f076";} +.icon-chevron-up:before{content:"\f077";} +.icon-chevron-down:before{content:"\f078";} +.icon-retweet:before{content:"\f079";} +.icon-shopping-cart:before{content:"\f07a";} +.icon-folder-close:before{content:"\f07b";} +.icon-folder-open:before{content:"\f07c";} +.icon-resize-vertical:before{content:"\f07d";} +.icon-resize-horizontal:before{content:"\f07e";} +.icon-bar-chart:before{content:"\f080";} +.icon-twitter-sign:before{content:"\f081";} +.icon-facebook-sign:before{content:"\f082";} +.icon-camera-retro:before{content:"\f083";} +.icon-key:before{content:"\f084";} +.icon-gears:before,.icon-cogs:before{content:"\f085";} +.icon-comments:before{content:"\f086";} +.icon-thumbs-up-alt:before{content:"\f087";} +.icon-thumbs-down-alt:before{content:"\f088";} +.icon-star-half:before{content:"\f089";} +.icon-heart-empty:before{content:"\f08a";} +.icon-signout:before{content:"\f08b";} +.icon-linkedin-sign:before{content:"\f08c";} +.icon-pushpin:before{content:"\f08d";} +.icon-external-link:before{content:"\f08e";} +.icon-signin:before{content:"\f090";} +.icon-trophy:before{content:"\f091";} +.icon-github-sign:before{content:"\f092";} +.icon-upload-alt:before{content:"\f093";} +.icon-lemon:before{content:"\f094";} +.icon-phone:before{content:"\f095";} +.icon-unchecked:before,.icon-check-empty:before{content:"\f096";} +.icon-bookmark-empty:before{content:"\f097";} +.icon-phone-sign:before{content:"\f098";} +.icon-twitter:before{content:"\f099";} +.icon-facebook:before{content:"\f09a";} +.icon-github:before{content:"\f09b";} +.icon-unlock:before{content:"\f09c";} +.icon-credit-card:before{content:"\f09d";} +.icon-rss:before{content:"\f09e";} +.icon-hdd:before{content:"\f0a0";} +.icon-bullhorn:before{content:"\f0a1";} +.icon-bell:before{content:"\f0a2";} +.icon-certificate:before{content:"\f0a3";} +.icon-hand-right:before{content:"\f0a4";} +.icon-hand-left:before{content:"\f0a5";} +.icon-hand-up:before{content:"\f0a6";} +.icon-hand-down:before{content:"\f0a7";} +.icon-circle-arrow-left:before{content:"\f0a8";} +.icon-circle-arrow-right:before{content:"\f0a9";} +.icon-circle-arrow-up:before{content:"\f0aa";} +.icon-circle-arrow-down:before{content:"\f0ab";} +.icon-globe:before{content:"\f0ac";} +.icon-wrench:before{content:"\f0ad";} +.icon-tasks:before{content:"\f0ae";} +.icon-filter:before{content:"\f0b0";} +.icon-briefcase:before{content:"\f0b1";} +.icon-fullscreen:before{content:"\f0b2";} +.icon-group:before{content:"\f0c0";} +.icon-link:before{content:"\f0c1";} +.icon-cloud:before{content:"\f0c2";} +.icon-beaker:before{content:"\f0c3";} +.icon-cut:before{content:"\f0c4";} +.icon-copy:before{content:"\f0c5";} +.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6";} +.icon-save:before{content:"\f0c7";} +.icon-sign-blank:before{content:"\f0c8";} +.icon-reorder:before{content:"\f0c9";} +.icon-list-ul:before{content:"\f0ca";} +.icon-list-ol:before{content:"\f0cb";} +.icon-strikethrough:before{content:"\f0cc";} +.icon-underline:before{content:"\f0cd";} +.icon-table:before{content:"\f0ce";} +.icon-magic:before{content:"\f0d0";} +.icon-truck:before{content:"\f0d1";} +.icon-pinterest:before{content:"\f0d2";} +.icon-pinterest-sign:before{content:"\f0d3";} +.icon-google-plus-sign:before{content:"\f0d4";} +.icon-google-plus:before{content:"\f0d5";} +.icon-money:before{content:"\f0d6";} +.icon-caret-down:before{content:"\f0d7";} +.icon-caret-up:before{content:"\f0d8";} +.icon-caret-left:before{content:"\f0d9";} +.icon-caret-right:before{content:"\f0da";} +.icon-columns:before{content:"\f0db";} +.icon-sort:before{content:"\f0dc";} +.icon-sort-down:before{content:"\f0dd";} +.icon-sort-up:before{content:"\f0de";} +.icon-envelope:before{content:"\f0e0";} +.icon-linkedin:before{content:"\f0e1";} +.icon-rotate-left:before,.icon-undo:before{content:"\f0e2";} +.icon-legal:before{content:"\f0e3";} +.icon-dashboard:before{content:"\f0e4";} +.icon-comment-alt:before{content:"\f0e5";} +.icon-comments-alt:before{content:"\f0e6";} +.icon-bolt:before{content:"\f0e7";} +.icon-sitemap:before{content:"\f0e8";} +.icon-umbrella:before{content:"\f0e9";} +.icon-paste:before{content:"\f0ea";} +.icon-lightbulb:before{content:"\f0eb";} +.icon-exchange:before{content:"\f0ec";} +.icon-cloud-download:before{content:"\f0ed";} +.icon-cloud-upload:before{content:"\f0ee";} +.icon-user-md:before{content:"\f0f0";} +.icon-stethoscope:before{content:"\f0f1";} +.icon-suitcase:before{content:"\f0f2";} +.icon-bell-alt:before{content:"\f0f3";} +.icon-coffee:before{content:"\f0f4";} +.icon-food:before{content:"\f0f5";} +.icon-file-text-alt:before{content:"\f0f6";} +.icon-building:before{content:"\f0f7";} +.icon-hospital:before{content:"\f0f8";} +.icon-ambulance:before{content:"\f0f9";} +.icon-medkit:before{content:"\f0fa";} +.icon-fighter-jet:before{content:"\f0fb";} +.icon-beer:before{content:"\f0fc";} +.icon-h-sign:before{content:"\f0fd";} +.icon-plus-sign-alt:before{content:"\f0fe";} +.icon-double-angle-left:before{content:"\f100";} +.icon-double-angle-right:before{content:"\f101";} +.icon-double-angle-up:before{content:"\f102";} +.icon-double-angle-down:before{content:"\f103";} +.icon-angle-left:before{content:"\f104";} +.icon-angle-right:before{content:"\f105";} +.icon-angle-up:before{content:"\f106";} +.icon-angle-down:before{content:"\f107";} +.icon-desktop:before{content:"\f108";} +.icon-laptop:before{content:"\f109";} +.icon-tablet:before{content:"\f10a";} +.icon-mobile-phone:before{content:"\f10b";} +.icon-circle-blank:before{content:"\f10c";} +.icon-quote-left:before{content:"\f10d";} +.icon-quote-right:before{content:"\f10e";} +.icon-spinner:before{content:"\f110";} +.icon-circle:before{content:"\f111";} +.icon-mail-reply:before,.icon-reply:before{content:"\f112";} +.icon-github-alt:before{content:"\f113";} +.icon-folder-close-alt:before{content:"\f114";} +.icon-folder-open-alt:before{content:"\f115";} +.icon-expand-alt:before{content:"\f116";} +.icon-collapse-alt:before{content:"\f117";} +.icon-smile:before{content:"\f118";} +.icon-frown:before{content:"\f119";} +.icon-meh:before{content:"\f11a";} +.icon-gamepad:before{content:"\f11b";} +.icon-keyboard:before{content:"\f11c";} +.icon-flag-alt:before{content:"\f11d";} +.icon-flag-checkered:before{content:"\f11e";} +.icon-terminal:before{content:"\f120";} +.icon-code:before{content:"\f121";} +.icon-reply-all:before{content:"\f122";} +.icon-mail-reply-all:before{content:"\f122";} +.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123";} +.icon-location-arrow:before{content:"\f124";} +.icon-crop:before{content:"\f125";} +.icon-code-fork:before{content:"\f126";} +.icon-unlink:before{content:"\f127";} +.icon-question:before{content:"\f128";} +.icon-info:before{content:"\f129";} +.icon-exclamation:before{content:"\f12a";} +.icon-superscript:before{content:"\f12b";} +.icon-subscript:before{content:"\f12c";} +.icon-eraser:before{content:"\f12d";} +.icon-puzzle-piece:before{content:"\f12e";} +.icon-microphone:before{content:"\f130";} +.icon-microphone-off:before{content:"\f131";} +.icon-shield:before{content:"\f132";} +.icon-calendar-empty:before{content:"\f133";} +.icon-fire-extinguisher:before{content:"\f134";} +.icon-rocket:before{content:"\f135";} +.icon-maxcdn:before{content:"\f136";} +.icon-chevron-sign-left:before{content:"\f137";} +.icon-chevron-sign-right:before{content:"\f138";} +.icon-chevron-sign-up:before{content:"\f139";} +.icon-chevron-sign-down:before{content:"\f13a";} +.icon-html5:before{content:"\f13b";} +.icon-css3:before{content:"\f13c";} +.icon-anchor:before{content:"\f13d";} +.icon-unlock-alt:before{content:"\f13e";} +.icon-bullseye:before{content:"\f140";} +.icon-ellipsis-horizontal:before{content:"\f141";} +.icon-ellipsis-vertical:before{content:"\f142";} +.icon-rss-sign:before{content:"\f143";} +.icon-play-sign:before{content:"\f144";} +.icon-ticket:before{content:"\f145";} +.icon-minus-sign-alt:before{content:"\f146";} +.icon-check-minus:before{content:"\f147";} +.icon-level-up:before{content:"\f148";} +.icon-level-down:before{content:"\f149";} +.icon-check-sign:before{content:"\f14a";} +.icon-edit-sign:before{content:"\f14b";} +.icon-external-link-sign:before{content:"\f14c";} +.icon-share-sign:before{content:"\f14d";} +.icon-compass:before{content:"\f14e";} +.icon-collapse:before{content:"\f150";} +.icon-collapse-top:before{content:"\f151";} +.icon-expand:before{content:"\f152";} +.icon-euro:before,.icon-eur:before{content:"\f153";} +.icon-gbp:before{content:"\f154";} +.icon-dollar:before,.icon-usd:before{content:"\f155";} +.icon-rupee:before,.icon-inr:before{content:"\f156";} +.icon-yen:before,.icon-jpy:before{content:"\f157";} +.icon-renminbi:before,.icon-cny:before{content:"\f158";} +.icon-won:before,.icon-krw:before{content:"\f159";} +.icon-bitcoin:before,.icon-btc:before{content:"\f15a";} +.icon-file:before{content:"\f15b";} +.icon-file-text:before{content:"\f15c";} +.icon-sort-by-alphabet:before{content:"\f15d";} +.icon-sort-by-alphabet-alt:before{content:"\f15e";} +.icon-sort-by-attributes:before{content:"\f160";} +.icon-sort-by-attributes-alt:before{content:"\f161";} +.icon-sort-by-order:before{content:"\f162";} +.icon-sort-by-order-alt:before{content:"\f163";} +.icon-thumbs-up:before{content:"\f164";} +.icon-thumbs-down:before{content:"\f165";} +.icon-youtube-sign:before{content:"\f166";} +.icon-youtube:before{content:"\f167";} +.icon-xing:before{content:"\f168";} +.icon-xing-sign:before{content:"\f169";} +.icon-youtube-play:before{content:"\f16a";} +.icon-dropbox:before{content:"\f16b";} +.icon-stackexchange:before{content:"\f16c";} +.icon-instagram:before{content:"\f16d";} +.icon-flickr:before{content:"\f16e";} +.icon-adn:before{content:"\f170";} +.icon-bitbucket:before{content:"\f171";} +.icon-bitbucket-sign:before{content:"\f172";} +.icon-tumblr:before{content:"\f173";} +.icon-tumblr-sign:before{content:"\f174";} +.icon-long-arrow-down:before{content:"\f175";} +.icon-long-arrow-up:before{content:"\f176";} +.icon-long-arrow-left:before{content:"\f177";} +.icon-long-arrow-right:before{content:"\f178";} +.icon-apple:before{content:"\f179";} +.icon-windows:before{content:"\f17a";} +.icon-android:before{content:"\f17b";} +.icon-linux:before{content:"\f17c";} +.icon-dribbble:before{content:"\f17d";} +.icon-skype:before{content:"\f17e";} +.icon-foursquare:before{content:"\f180";} +.icon-trello:before{content:"\f181";} +.icon-female:before{content:"\f182";} +.icon-male:before{content:"\f183";} +.icon-gittip:before{content:"\f184";} +.icon-sun:before{content:"\f185";} +.icon-moon:before{content:"\f186";} +.icon-archive:before{content:"\f187";} +.icon-bug:before{content:"\f188";} +.icon-vk:before{content:"\f189";} +.icon-weibo:before{content:"\f18a";} +.icon-renren:before{content:"\f18b";} diff --git a/colab/static/third-party/font-awesome/font/FontAwesome.otf b/colab/static/third-party/font-awesome/font/FontAwesome.otf new file mode 100644 index 0000000..7012545 Binary files /dev/null and b/colab/static/third-party/font-awesome/font/FontAwesome.otf differ diff --git a/colab/static/third-party/font-awesome/font/fontawesome-webfont.eot b/colab/static/third-party/font-awesome/font/fontawesome-webfont.eot new file mode 100755 index 0000000..0662cb9 Binary files /dev/null and b/colab/static/third-party/font-awesome/font/fontawesome-webfont.eot differ diff --git a/colab/static/third-party/font-awesome/font/fontawesome-webfont.svg b/colab/static/third-party/font-awesome/font/fontawesome-webfont.svg new file mode 100755 index 0000000..2edb4ec --- /dev/null +++ b/colab/static/third-party/font-awesome/font/fontawesome-webfont.svg @@ -0,0 +1,399 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/colab/static/third-party/font-awesome/font/fontawesome-webfont.ttf b/colab/static/third-party/font-awesome/font/fontawesome-webfont.ttf new file mode 100755 index 0000000..d365924 Binary files /dev/null and b/colab/static/third-party/font-awesome/font/fontawesome-webfont.ttf differ diff --git a/colab/static/third-party/font-awesome/font/fontawesome-webfont.woff b/colab/static/third-party/font-awesome/font/fontawesome-webfont.woff new file mode 100755 index 0000000..b9bd17e Binary files /dev/null and b/colab/static/third-party/font-awesome/font/fontawesome-webfont.woff differ diff --git a/colab/static/third-party/highcharts/js/highcharts.js b/colab/static/third-party/highcharts/js/highcharts.js new file mode 100644 index 0000000..ba9a937 --- /dev/null +++ b/colab/static/third-party/highcharts/js/highcharts.js @@ -0,0 +1,285 @@ +/* + Highcharts JS v3.0.7 (2013-10-24) + + (c) 2009-2013 Torstein Hønsi + + License: www.highcharts.com/license +*/ +(function(){function s(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a}function x(){var a,b=arguments.length,c={},d=function(a,b){var c,h;typeof a!=="object"&&(a={});for(h in b)b.hasOwnProperty(h)&&(c=b[h],a[h]=c&&typeof c==="object"&&Object.prototype.toString.call(c)!=="[object Array]"&&typeof c.nodeType!=="number"?d(a[h]||{},c):b[h]);return a};for(a=0;a3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+M(a-c).toFixed(f).slice(2):"")}function Ba(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function mb(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);return c.apply(this,a)}}function Ca(a,b){for(var c="{",d=!1, +e,f,g,h,i,j=[];(c=a.indexOf(c))!==-1;){e=a.slice(0,c);if(d){f=e.split(":");g=f.shift().split(".");i=g.length;e=b;for(h=0;h-1?h.thousandsSep:"")):e=Ya(f,e)}j.push(e);a=a.slice(c+1);c=(d=!d)?"}":"{"}j.push(a);return j.join("")}function nb(a){return R.pow(10,P(R.log(a)/R.LN10))}function ob(a,b,c,d){var e,c=o(c,1);e=a/c;b||(b=[1,2,2.5,5,10],d&&d.allowDecimals=== +!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d=D[pb]&&(i.setMilliseconds(0),i.setSeconds(j>=D[Za]?0:k*P(i.getSeconds()/k)));if(j>=D[Za])i[Fb](j>=D[Qa]?0:k*P(i[qb]()/k));if(j>=D[Qa])i[Gb](j>=D[ta]?0:k*P(i[rb]()/k));if(j>=D[ta])i[sb](j>=D[Ra]?1:k*P(i[Sa]()/k));j>=D[Ra]&&(i[Hb](j>=D[Da]?0:k*P(i[ab]()/k)),h=i[bb]());j>=D[Da]&&(h-=h%k,i[Ib](h));if(j===D[$a])i[sb](i[Sa]()-i[tb]()+o(d,1));b=1;h=i[bb](); +for(var d=i.getTime(),l=i[ab](),m=i[Sa](),p=g?0:(864E5+i.getTimezoneOffset()*6E4)%864E5;dc&&(c=a[b]);return c}function Ka(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(),delete a[c]}function Ta(a){db||(db=U(Ea));a&&db.appendChild(a);db.innerHTML=""}function ka(a,b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+a;if(b)throw c;else N.console&&console.log(c)}function ia(a){return parseFloat(a.toPrecision(14))} +function La(a,b){Fa=o(a,b.animation)}function Lb(){var a=L.global.useUTC,b=a?"getUTC":"get",c=a?"setUTC":"set";cb=a?Date.UTC:function(a,b,c,g,h,i){return(new Date(a,b,o(c,1),o(g,0),o(h,0),o(i,0))).getTime()};qb=b+"Minutes";rb=b+"Hours";tb=b+"Day";Sa=b+"Date";ab=b+"Month";bb=b+"FullYear";Fb=c+"Minutes";Gb=c+"Hours";sb=c+"Date";Hb=c+"Month";Ib=c+"FullYear"}function va(){}function Ma(a,b,c,d){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!0;!c&&!d&&this.addLabel()}function vb(a,b){this.axis=a;if(b)this.options= +b,this.id=b.id}function Mb(a,b,c,d,e,f){var g=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d;this.total=null;this.points={};this.stack=e;this.percent=f==="percent";this.alignOptions={align:b.align||(g?c?"left":"right":"center"),verticalAlign:b.verticalAlign||(g?"middle":c?"bottom":"top"),y:o(b.y,g?4:c?14:-6),x:o(b.x,g?c?-6:6:0)};this.textAlign=b.textAlign||(g?c?"right":"left":"center")}function eb(){this.init.apply(this,arguments)}function wb(){this.init.apply(this,arguments)} +function xb(a,b){this.init(a,b)}function fb(a,b){this.init(a,b)}function yb(){this.init.apply(this,arguments)}var v,z=document,N=window,R=Math,t=R.round,P=R.floor,wa=R.ceil,r=R.max,J=R.min,M=R.abs,V=R.cos,ba=R.sin,xa=R.PI,Ua=xa*2/360,na=navigator.userAgent,Nb=N.opera,sa=/msie/i.test(na)&&!Nb,gb=z.documentMode===8,hb=/AppleWebKit/.test(na),ib=/Firefox/.test(na),Ob=/(Mobile|Android|Windows Phone)/.test(na),ya="http://www.w3.org/2000/svg",W=!!z.createElementNS&&!!z.createElementNS(ya,"svg").createSVGRect, +Ub=ib&&parseInt(na.split("Firefox/")[1],10)<4,ca=!W&&!sa&&!!z.createElement("canvas").getContext,Va,jb=z.documentElement.ontouchstart!==v,Pb={},zb=0,db,L,Ya,Fa,Ab,D,oa=function(){},Ga=[],Ea="div",S="none",Qb="rgba(192,192,192,"+(W?1.0E-4:0.002)+")",Db="millisecond",pb="second",Za="minute",Qa="hour",ta="day",$a="week",Ra="month",Da="year",Rb="stroke-width",cb,qb,rb,tb,Sa,ab,bb,Fb,Gb,sb,Hb,Ib,X={};N.Highcharts=N.Highcharts?ka(16,!0):{};Ya=function(a,b,c){if(!u(b)||isNaN(b))return"Invalid date";var a= +o(a,"%Y-%m-%d %H:%M:%S"),d=new Date(b),e,f=d[rb](),g=d[tb](),h=d[Sa](),i=d[ab](),j=d[bb](),k=L.lang,l=k.weekdays,d=s({a:l[g].substr(0,3),A:l[g],d:Ba(h),e:h,b:k.shortMonths[i],B:k.months[i],m:Ba(i+1),y:j.toString().substr(2,2),Y:j,H:Ba(f),I:Ba(f%12||12),l:f%12||12,M:Ba(d[qb]()),p:f<12?"AM":"PM",P:f<12?"am":"pm",S:Ba(d.getSeconds()),L:Ba(t(b%1E3),3)},Highcharts.dateFormats);for(e in d)for(;a.indexOf("%"+e)!==-1;)a=a.replace("%"+e,typeof d[e]==="function"?d[e](b):d[e]);return c?a.substr(0,1).toUpperCase()+ +a.substr(1):a};Jb.prototype={wrapColor:function(a){if(this.color>=a)this.color=0},wrapSymbol:function(a){if(this.symbol>=a)this.symbol=0}};D=function(){for(var a=0,b=arguments,c=b.length,d={};a-1,f=e?7:3,g,b=b.split(" "),c=[].concat(c),h,i,j=function(a){for(g=a.length;g--;)a[g]==="M"&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&& +(j(b),j(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=[].concat(c).splice(0,f).concat(c);a.shift=0;if(b.length)for(a=c.length;b.length{point.key}
    ',pointFormat:'{series.name}: {point.y}
    ',shadow:!0,snap:Ob?25:10,style:{color:"#333333",cursor:"default", +fontSize:"12px",padding:"8px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Highcharts.com",href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#909090",fontSize:"9px"}}};var Z=L.plotOptions,Y=Z.line;Lb();var Yb=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,Zb=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,$b=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/, +qa=function(a){var b=[],c,d;(function(a){a&&a.stops?d=Na(a.stops,function(a){return qa(a[1])}):(c=Yb.exec(a))?b=[y(c[1]),y(c[2]),y(c[3]),parseFloat(c[4],10)]:(c=Zb.exec(a))?b=[y(c[1],16),y(c[2],16),y(c[3],16),1]:(c=$b.exec(a))&&(b=[y(c[1]),y(c[2]),y(c[3]),1])})(a);return{get:function(c){var f;d?(f=x(a),f.stops=[].concat(f.stops),n(d,function(a,b){f.stops[b]=[f.stops[b][0],a.get(c)]})):f=b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?b[3]:"rgba("+b.join(",")+")":a;return f},brighten:function(a){if(d)n(d, +function(b){b.brighten(a)});else if(ra(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=y(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},rgba:b,setOpacity:function(a){b[3]=a;return this}}};va.prototype={init:function(a,b){this.element=b==="span"?U(b):z.createElementNS(ya,b);this.renderer=a;this.attrSetters={}},opacity:1,animate:function(a,b,c){b=o(b,Fa,!0);Wa(this);if(b){b=x(b);if(c)b.complete=c;Bb(this,a,b)}else this.attr(a),c&&c()},attr:function(a,b){var c,d,e,f,g=this.element,h=g.nodeName.toLowerCase(), +i=this.renderer,j,k=this.attrSetters,l=this.shadows,m,p,q=this;ea(a)&&u(b)&&(c=a,a={},a[c]=b);if(ea(a))c=a,h==="circle"?c={x:"cx",y:"cy"}[c]||c:c==="strokeWidth"&&(c="stroke-width"),q=w(g,c)||this[c]||0,c!=="d"&&c!=="visibility"&&c!=="fill"&&(q=parseFloat(q));else{for(c in a)if(j=!1,d=a[c],e=k[c]&&k[c].call(this,d,c),e!==!1){e!==v&&(d=e);if(c==="d")d&&d.join&&(d=d.join(" ")),/(NaN| {2}|^$)/.test(d)&&(d="M 0 0");else if(c==="x"&&h==="text")for(e=0;e1100)&&b.call(d,a)}):d["on"+a]=b;return this},setRadialReference:function(a){this.element.radialReference=a;return this},translate:function(a,b){return this.attr({translateX:a,translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this},htmlCss:function(a){var b=this.element;if(b=a&&b.tagName==="SPAN"&&a.width)delete a.width,this.textWidth=b,this.updateTransform();this.styles=s(this.styles,a);I(this.element,a);return this},htmlGetBBox:function(){var a= +this.element,b=this.bBox;if(!b){if(a.nodeName==="text")a.style.position="absolute";b=this.bBox={x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}}return b},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,f=this.y||0,g=this.textAlign||"left",h={left:0,center:0.5,right:1}[g],i=g&&g!=="left",j=this.shadows;I(b,{marginLeft:c,marginTop:d});j&&n(j,function(a){I(a,{marginLeft:c+1,marginTop:d+1})}); +this.inverted&&n(b.childNodes,function(c){a.invertChild(c,b)});if(b.tagName==="SPAN"){var k,l,j=this.rotation,m;k=0;var p=1,q=0,aa;m=y(this.textWidth);var B=this.xCorr||0,O=this.yCorr||0,Sb=[j,g,b.innerHTML,this.textWidth].join(",");if(Sb!==this.cTT){u(j)&&(k=j*Ua,p=V(k),q=ba(k),this.setSpanRotation(j,q,p));k=o(this.elemWidth,b.offsetWidth);l=o(this.elemHeight,b.offsetHeight);if(k>m&&/[ \-]/.test(b.textContent||b.innerText))I(b,{width:m+"px",display:"block",whiteSpace:"normal"}),k=m;m=a.fontMetrics(b.style.fontSize).b; +B=p<0&&-k;O=q<0&&-l;aa=p*q<0;B+=q*m*(aa?1-h:h);O-=p*m*(j?aa?h:1-h:1);i&&(B-=k*h*(p<0?-1:1),j&&(O-=l*h*(q<0?-1:1)),I(b,{textAlign:g}));this.xCorr=B;this.yCorr=O}I(b,{left:e+B+"px",top:f+O+"px"});if(hb)l=b.offsetHeight;this.cTT=Sb}}else this.alignOnAdd=!0},setSpanRotation:function(a){var b={};b[sa?"-ms-transform":hb?"-webkit-transform":ib?"MozTransform":Nb?"-o-transform":""]=b.transform="rotate("+a+"deg)";I(this.element,b)},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c= +this.scaleX,d=this.scaleY,e=this.inverted,f=this.rotation;e&&(a+=this.attr("width"),b+=this.attr("height"));a=["translate("+a+","+b+")"];e?a.push("rotate(90) scale(-1,1)"):f&&a.push("rotate("+f+" "+(this.x||0)+" "+(this.y||0)+")");(u(c)||u(d))&&a.push("scale("+o(c,1)+" "+o(d,1)+")");a.length&&w(this.element,"transform",a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects;if(a){if(this.alignOptions= +a,this.alignByTranslate=b,!c||ea(c))this.alignTo=d=c||"renderer",ga(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=o(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+(a.y||0);if(d==="right"||d==="center")f+=(c.width-(a.width||0))/{right:1,center:2}[d];h[b?"translateX":"x"]=t(f);if(e==="bottom"||e==="middle")g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1);h[b?"translateY":"y"]=t(g);this[this.placed?"animate":"attr"](h);this.placed= +!0;this.alignAttr=h;return this},getBBox:function(){var a=this.bBox,b=this.renderer,c,d=this.rotation;c=this.element;var e=this.styles,f=d*Ua;if(!a){if(c.namespaceURI===ya||b.forExport){try{a=c.getBBox?s({},c.getBBox()):{width:c.offsetWidth,height:c.offsetHeight}}catch(g){}if(!a||a.width<0)a={width:0,height:0}}else a=this.htmlGetBBox();if(b.isSVG){b=a.width;c=a.height;if(sa&&e&&e.fontSize==="11px"&&c.toPrecision(3)==="22.7")a.height=c=14;if(d)a.width=M(c*ba(f))+M(b*V(f)),a.height=M(c*V(f))+M(b*ba(f))}this.bBox= +a}return a},show:function(){return this.attr({visibility:"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.hide()}})},add:function(a){var b=this.renderer,c=a||b,d=c.element||b.box,e=d.childNodes,f=this.element,g=w(f,"zIndex"),h;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);if(g)c.handleZ=!0,g=y(g);if(c.handleZ)for(c=0;cg||!u(g)&&u(b))){d.insertBefore(f,a);h=!0;break}h||d.appendChild(f);this.added=!0;A(this,"add");return this},safeRemoveChild:function(a){var b=a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName==="SPAN"&&a.parentGroup,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point=null;Wa(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f/g,'').replace(/<(i|em)>/g,'').replace(//g,"").split(//g),f=b.childNodes,g=/style="([^"]+)"/,h=/href="(http[^"]+)"/,i=w(b,"x"),j=a.styles,k=a.textWidth,l=j&&j.lineHeight,m=f.length;m--;)b.removeChild(f[m]);k&&!a.added&&this.box.appendChild(b);e[e.length-1]===""&&e.pop();n(e,function(e,f){var m,o=0, +e=e.replace(//g,"|||");m=e.split("|||");n(m,function(e){if(e!==""||m.length===1){var p={},n=z.createElementNS(ya,"tspan"),r;g.test(e)&&(r=e.match(g)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),w(n,"style",r));h.test(e)&&!d&&(w(n,"onclick",'location.href="'+e.match(h)[1]+'"'),I(n,{cursor:"pointer"}));e=(e.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"<").replace(/>/g,">");if(e!==" "&&(n.appendChild(z.createTextNode(e)),o?p.dx=0:p.x=i,w(n,p),!o&&f&& +(!W&&d&&I(n,{display:"block"}),w(n,"dy",l||c.fontMetrics(/px$/.test(n.style.fontSize)?n.style.fontSize:j.fontSize).h,hb&&n.offsetHeight)),b.appendChild(n),o++,k))for(var e=e.replace(/([^\^])-/g,"$1- ").split(" "),u,t,p=a._clipHeight,E=[],v=y(l||16),s=1;e.length||E.length;)delete a.bBox,u=a.getBBox(),t=u.width,!W&&c.forExport&&(t=c.measureSpanWidth(n.firstChild.data,a.styles)),u=t>k,!u||e.length===1?(e=E,E=[],e.length&&(s++,p&&s*v>p?(e=["..."],a.attr("title",a.textStr)):(n=z.createElementNS(ya,"tspan"), +w(n,{dy:v,x:i}),r&&w(n,"style",r),b.appendChild(n),t>k&&(k=t)))):(n.removeChild(n.firstChild),E.unshift(e.pop())),e.length&&n.appendChild(z.createTextNode(e.join(" ").replace(/- /g,"-")))}})})},button:function(a,b,c,d,e,f,g,h,i){var j=this.label(a,b,c,i,null,null,null,null,"button"),k=0,l,m,p,q,n,o,a={x1:0,y1:0,x2:0,y2:1},e=x({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:a,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},e);p=e.style;delete e.style;f=x(e,{stroke:"#68A", +fill:{linearGradient:a,stops:[[0,"#FFF"],[1,"#ACF"]]}},f);q=f.style;delete f.style;g=x(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#9BD"],[1,"#CDF"]]}},g);n=g.style;delete g.style;h=x(e,{style:{color:"#CCC"}},h);o=h.style;delete h.style;K(j.element,sa?"mouseover":"mouseenter",function(){k!==3&&j.attr(f).css(q)});K(j.element,sa?"mouseout":"mouseleave",function(){k!==3&&(l=[e,f,g][k],m=[p,q,n][k],j.attr(l).css(m))});j.setState=function(a){(j.state=k=a)?a===2?j.attr(g).css(n):a===3&&j.attr(h).css(o): +j.attr(e).css(p)};return j.on("click",function(){k!==3&&d.call(j)}).attr(e).css(s({cursor:"default"},p))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=t(a[1])-b%2/2);a[2]===a[5]&&(a[2]=a[5]=t(a[2])+b%2/2);return a},path:function(a){var b={fill:S};Ia(a)?b.d=a:T(a)&&s(b,a);return this.createElement("path").attr(b)},circle:function(a,b,c){a=T(a)?a:{x:a,y:b,r:c};return this.createElement("circle").attr(a)},arc:function(a,b,c,d,e,f){if(T(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol("arc", +a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0});a.r=c;return a},rect:function(a,b,c,d,e,f){e=T(a)?a.r:e;e=this.createElement("rect").attr({rx:e,ry:e,fill:S});return e.attr(T(a)?a:e.crisp(f,a,b,r(c,0),r(d,0)))},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[o(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return u(a)?b.attr({"class":"highcharts-"+a}):b},image:function(a,b, +c,d,e){var f={preserveAspectRatio:S};arguments.length>1&&s(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(t(b),t(c),d,e,f),i=/^url\((.*?)\)$/,j,k;if(h)g=this.path(h),s(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&s(g,f);else if(i.test(a))k=function(a,b){a.element&&(a.attr({width:b[0], +height:b[1]}),a.alignByTranslate||a.translate(t((d-b[0])/2),t((e-b[1])/2)))},j=a.match(i)[1],a=Pb[j],g=this.image(j).attr({x:b,y:c}),g.isImg=!0,a?k(g,a):(g.attr({width:0,height:0}),U("img",{onload:function(){k(g,Pb[j]=[this.width,this.height])},src:j}));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return["M",a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c,b+d,a,b+d,"Z"]},triangle:function(a,b,c,d){return["M", +a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,e){var f=e.start,c=e.r||c||d,g=e.end-0.001,d=e.innerR,h=e.open,i=V(f),j=ba(f),k=V(g),g=ba(g),e=e.end-f');if(b)c=e||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element=U(c);this.renderer=a;this.attrSetters={}},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();A(this,"add");return this}, +updateTransform:va.prototype.htmlUpdateTransform,setSpanRotation:function(a,b,c){I(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11=",c,", M12=",-b,", M21=",b,", M22=",c,", sizingMethod='auto expand')"].join(""):S})},pathToVML:function(a){for(var b=a.length,c=[],d;b--;)if(ra(a[b]))c[b]=t(a[b]*10)-5;else if(a[b]==="Z")c[b]="x";else if(c[b]=a[b],a.isArc&&(a[b]==="wa"||a[b]==="at"))d=a[b]==="wa"?1:-1,c[b+5]===c[b+7]&&(c[b+7]-=d),c[b+6]===c[b+8]&&(c[b+8]-=d);return c.join(" ")||"x"}, +attr:function(a,b){var c,d,e,f=this.element||{},g=f.style,h=f.nodeName,i=this.renderer,j=this.symbolName,k,l=this.shadows,m,p=this.attrSetters,q=this;ea(a)&&u(b)&&(c=a,a={},a[c]=b);if(ea(a))c=a,q=c==="strokeWidth"||c==="stroke-width"?this.strokeweight:this[c];else for(c in a)if(d=a[c],m=!1,e=p[c]&&p[c].call(this,d,c),e!==!1&&d!==null){e!==v&&(d=e);if(j&&/^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(c))k||(this.symbolAttr(a),k=!0),m=!0;else if(c==="d"){d=d||[];this.d=d.join(" ");f.path= +d=this.pathToVML(d);if(l)for(e=l.length;e--;)l[e].path=l[e].cutOff?this.cutOffPath(d,l[e].cutOff):d;m=!0}else if(c==="visibility"){if(l)for(e=l.length;e--;)l[e].style[c]=d;h==="DIV"&&(d=d==="hidden"?"-999em":0,gb||(g[c]=d?"visible":"hidden"),c="top");g[c]=d;m=!0}else if(c==="zIndex")d&&(g[c]=d),m=!0;else if(pa(c,["x","y","width","height"])!==-1)this[c]=d,c==="x"||c==="y"?c={x:"left",y:"top"}[c]:d=r(0,d),this.updateClipping?(this[c]=d,this.updateClipping()):g[c]=d,m=!0;else if(c==="class"&&h==="DIV")f.className= +d;else if(c==="stroke")d=i.color(d,f,c),c="strokecolor";else if(c==="stroke-width"||c==="strokeWidth")f.stroked=d?!0:!1,c="strokeweight",this[c]=d,ra(d)&&(d+="px");else if(c==="dashstyle")(f.getElementsByTagName("stroke")[0]||U(i.prepVML([""]),null,null,f))[c]=d||"solid",this.dashstyle=d,m=!0;else if(c==="fill")if(h==="SPAN")g.color=d;else{if(h!=="IMG")f.filled=d!==S?!0:!1,d=i.color(d,f,c,this),c="fillcolor"}else if(c==="opacity")m=!0;else if(h==="shape"&&c==="rotation")this[c]=f.style[c]= +d,f.style.left=-t(ba(d*Ua)+1)+"px",f.style.top=t(V(d*Ua))+"px";else if(c==="translateX"||c==="translateY"||c==="rotation")this[c]=d,this.updateTransform(),m=!0;else if(c==="text")this.bBox=null,f.innerHTML=d,m=!0;m||(gb?f[c]=d:w(f,c,d))}return q},clip:function(a){var b=this,c;a?(c=a.members,ga(c,b),c.push(b),b.destroyClip=function(){ga(c,b)},a=a.getCSS(b)):(b.destroyClip&&b.destroyClip(),a={clip:gb?"inherit":"rect(auto)"});return b.css(a)},css:va.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&& +Ta(a)},destroy:function(){this.destroyClip&&this.destroyClip();return va.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=N.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c,a=a.split(/[ ,]/);c=a.length;if(c===9||c===11)a[c-4]=a[c-2]=y(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,c){var d=[],e,f=this.element,g=this.renderer,h,i=f.style,j,k=f.path,l,m,p,q;k&&typeof k.value!=="string"&&(k="x");m=k;if(a){p=o(a.width,3);q=(a.opacity|| +0.15)/p;for(e=1;e<=3;e++){l=p*2+1-2*e;c&&(m=this.cutOffPath(k.value,l+0.5));j=[''];h=U(g.prepVML(j),null,{left:y(i.left)+o(a.offsetX,1),top:y(i.top)+o(a.offsetY,1)});if(c)h.cutOff=l+1;j=[''];U(g.prepVML(j),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this}};F=ha(va,F); +var la={Element:F,isIE8:na.indexOf("MSIE 8.0")>-1,init:function(a,b,c){var d,e;this.alignedObjects=[];d=this.createElement(Ea);e=d.element;e.style.position="relative";a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper=d;this.setSize(b,c,!1);if(!z.namespaces.hcv){z.namespaces.add("hcv","urn:schemas-microsoft-com:vml");try{z.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}catch(f){z.styleSheets[0].cssText+= +"hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=T(a);return s(e,{members:[],left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b=a.element,c=b.nodeName,a=a.inverted,d=this.top-(c==="shape"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:"rect("+t(a?e:d)+"px,"+t(a?f: +b)+"px,"+t(a?b:f)+"px,"+t(a?d:e)+"px)"};!a&&gb&&c==="DIV"&&s(d,{width:b+"px",height:f+"px"});return d},updateClipping:function(){n(e.members,function(a){a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,j=S;a&&a.linearGradient?i="gradient":a&&a.radialGradient&&(i="pattern");if(i){var k,l,m=a.linearGradient||a.radialGradient,p,q,o,B,O,r="",a=a.stops,u,t=[],v=function(){h=['']; +U(e.prepVML(h),null,null,b)};p=a[0];u=a[a.length-1];p[0]>0&&a.unshift([0,p[1]]);u[0]<1&&a.push([1,u[1]]);n(a,function(a,b){g.test(a[1])?(f=qa(a[1]),k=f.get("rgb"),l=f.get("a")):(k=a[1],l=1);t.push(a[0]*100+"% "+k);b?(o=l,B=k):(q=l,O=k)});if(c==="fill")if(i==="gradient")c=m.x1||m[0]||0,a=m.y1||m[1]||0,p=m.x2||m[2]||0,m=m.y2||m[3]||0,r='angle="'+(90-R.atan((m-a)/(p-c))*180/xa)+'"',v();else{var j=m.r,s=j*2,E=j*2,H=m.cx,C=m.cy,x=b.radialReference,w,j=function(){x&&(w=d.getBBox(),H+=(x[0]-w.x)/w.width- +0.5,C+=(x[1]-w.y)/w.height-0.5,s*=x[2]/w.width,E*=x[2]/w.height);r='src="'+L.global.VMLRadialGradientURL+'" size="'+s+","+E+'" origin="0.5,0.5" position="'+H+","+C+'" color2="'+O+'" ';v()};d.added?j():K(d,"add",j);j=B}else j=k}else if(g.test(a)&&b.tagName!=="IMG")f=qa(a),h=["<",c,' opacity="',f.get("a"),'"/>'],U(this.prepVML(h),null,null,b),j=f.get("rgb");else{j=b.getElementsByTagName(c);if(j.length)j[0].opacity=1,j[0].type="solid";j=a}return j},prepVML:function(a){var b=this.isIE8,a=a.join("");b? +(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<","1&&f.attr({x:b,y:c,width:d,height:e});return f},rect:function(a,b,c,d,e,f){var g=this.symbol("rect");g.r=T(a)?a.r:e;return g.attr(T(a)?a:g.crisp(f,a,b,r(c,0),r(d,0)))},invertChild:function(a,b){var c=b.style;I(a,{flip:"x",left:y(c.width)-1,top:y(c.height)-1,rotation:-90})}, +symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=e.innerR,d=V(f),i=ba(f),j=V(g),k=ba(g);if(g-f===0)return["x"];f=["wa",a-h,b-h,a+h,b+h,a+h*d,b+h*i,a+h*j,b+h*k];e.open&&!c&&f.push("e","M",a,b);f.push("at",a-c,b-c,a+c,b+c,a+c*j,b+c*k,a+c*d,b+c*i,"x","e");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r);e&&e.isCircle&&(a-=c/2,b-=d/2);return["wa",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,"e"]},rect:function(a,b,c,d,e){var f=a+c,g=b+d,h;!u(e)||!e.r?f=za.prototype.symbols.square.apply(0, +arguments):(h=J(e.r,c,d),f=["M",a+h,b,"L",f-h,b,"wa",f-2*h,b,f,b+2*h,f-h,b,f,b+h,"L",f,g-h,"wa",f-2*h,g-2*h,f,g,f,g-h,f-h,g,"L",a+h,g,"wa",a,g-2*h,a+2*h,g,a+h,g,a,g-h,"L",a,b+h,"wa",a,b,a+2*h,b+2*h,a,b+h,a+h,b,"x","e"]);return f}}};Highcharts.VMLRenderer=F=function(){this.init.apply(this,arguments)};F.prototype=x(za.prototype,la);Va=F}za.prototype.measureSpanWidth=function(a,b){var c=z.createElement("span"),d=z.createTextNode(a);c.appendChild(d);I(c,b);this.box.appendChild(c);return c.offsetWidth}; +var Tb;if(ca)Highcharts.CanVGRenderer=F=function(){ya="http://www.w3.org/1999/xhtml"},F.prototype.symbols={},Tb=function(){function a(){var a=b.length,d;for(d=0;dj&&(c=!1)):h+k>m&&(h=m-k,d&&h+l0&&b.height>0){f=x({align:c&&k&&"center",x:c?!k&&4:10,verticalAlign:!c&&k&&"middle",y:c?k?16:10:k?6:-4,rotation:c&&!k&&90},f);if(!g)a.label=g=v.text(f.text,0,0,f.useHTML).attr({align:f.textAlign||f.align,rotation:f.rotation,zIndex:O}).css(f.style).add();b=[q[1],q[4],o(q[6],q[1])];q=[q[2],q[5],o(q[7],q[2])];c=Ja(b);k=Ja(q);g.align(f,!1,{x:c,y:k,width:ua(b)-c,height:ua(q)-k});g.show()}else g&&g.hide();return a}, +destroy:function(){ga(this.axis.plotLinesAndBands,this);delete this.axis;Ka(this)}};Mb.prototype={destroy:function(){Ka(this,this.axis)},render:function(a){var b=this.options,c=b.format,c=c?Ca(c,this):b.formatter.call(this);this.label?this.label.attr({text:c,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(c,0,0,b.useHTML).css(b.style).attr({align:this.textAlign,rotation:b.rotation,visibility:"hidden"}).add(a)},setOffset:function(a,b){var c=this.axis,d=c.chart,e=d.inverted,f=this.isNegative, +g=c.translate(this.percent?100:this.total,0,0,0,1),c=c.translate(0),c=M(g-c),h=d.xAxis[0].translate(this.x)+a,i=d.plotHeight,f={x:e?f?g:g-c:h,y:e?i-h-b:f?i-g-c:i-g,width:e?c:b,height:e?b:c};if(e=this.label)e.align(this.alignOptions,null,f),f=e.alignAttr,e.attr({visibility:this.options.crop===!1||d.isInsidePlot(f.x,f.y)?W?"inherit":"visible":"hidden"})}};eb.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b", +month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#C0C0C0",labels:G,lineColor:"#C0D0E0",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:5,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#4d759e",fontWeight:"bold"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0, +gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return Aa(this.total,-1)},style:G.style}},defaultLeftAxisOptions:{labels:{x:-8,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:8,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{x:0,y:14},title:{rotation:0}},defaultTopAxisOptions:{labels:{x:0,y:-5}, +title:{rotation:0}},init:function(a,b){var c=b.isX;this.horiz=a.inverted?!c:c;this.xOrY=(this.isXAxis=c)?"x":"y";this.opposite=b.opposite;this.side=this.horiz?this.opposite?0:2:this.opposite?1:3;this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.chart=a;this.reversed=d.reversed;this.zoomEnabled=d.zoomEnabled!==!1;this.categories=d.categories||e==="category";this.names=[];this.isLog=e==="logarithmic"; +this.isDatetimeAxis=e==="datetime";this.isLinked=u(d.linkedTo);this.tickmarkOffset=this.categories&&d.tickmarkPlacement==="between"?0.5:0;this.ticks={};this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stackExtremes={};this.min=this.max=null;var f,d=this.options.events;pa(this,a.axes)===-1&&(a.axes.push(this),a[c?"xAxis":"yAxis"].push(this)); +this.series=this.series||[];if(a.inverted&&c&&this.reversed===v)this.reversed=!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in d)K(this,f,d[f]);if(this.isLog)this.val2lin=ma,this.lin2val=fa},setOptions:function(a){this.options=x(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],x(L[this.isXAxis?"xAxis":"yAxis"],a))},update:function(a, +b){var c=this.chart,a=c.options[this.xOrY+"Axis"][this.options.index]=x(this.userOptions,a);this.destroy(!0);this._addedPlotLB=this.userMin=this.userMax=v;this.init(c,s(a,{events:v}));c.isDirtyBox=!0;o(b,!0)&&c.redraw()},remove:function(a){var b=this.chart,c=this.xOrY+"Axis";n(this.series,function(a){a.remove(!1)});ga(b.axes,this);ga(b[c],this);b.options[c].splice(this.options.index,1);n(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;o(a,!0)&&b.redraw()},defaultLabelFormatter:function(){var a= +this.axis,b=this.value,c=a.categories,d=this.dateTimeLabelFormat,e=L.lang.numericSymbols,f=e&&e.length,g,h=a.options.labels.format,a=a.isLog?b:a.tickInterval;if(h)g=Ca(h,this);else if(c)g=b;else if(d)g=Ya(d,b);else if(f&&a>=1E3)for(;f--&&g===v;)c=Math.pow(1E3,f+1),a>=c&&e[f]!==null&&(g=Aa(b/c,-1)+e[f]);g===v&&(g=b>=1E3?Aa(b,0):Aa(b,-1));return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=null;a.stackExtremes={};a.buildStacks();n(a.series,function(c){if(c.visible|| +!b.options.chart.ignoreHiddenSeries){var d;d=c.options.threshold;var e;a.hasVisibleSeries=!0;a.isLog&&d<=0&&(d=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=J(o(a.dataMin,d[0]),Ja(d)),a.dataMax=r(o(a.dataMax,d[0]),ua(d))}else{c.getExtremes();e=c.dataMax;c=c.dataMin;if(u(c)&&u(e))a.dataMin=J(o(a.dataMin,c),c),a.dataMax=r(o(a.dataMax,e),e);if(u(d))if(a.dataMin>=d)a.dataMin=d,a.ignoreMinPadding=!0;else if(a.dataMaxf+this.width)m=!0}else if(c=f,i=l-this.right,hg+this.height)m=!0;return m&&!d?null:e.renderer.crispLine(["M",c,h,"L",i,j],b||0)},getPlotBandPath:function(a,b){var c= +this.getPlotLinePath(b),d=this.getPlotLinePath(a);d&&c?d.push(c[4],c[5],c[1],c[2]):d=null;return d},getLinearTickPositions:function(a,b,c){for(var d,b=ia(P(b/a)*a),c=ia(wa(c/a)*a),e=[];b<=c;){e.push(b);b=ia(b+a);if(b===d)break;d=b}return e},getLogTickPositions:function(a,b,c,d){var e=this.options,f=this.len,g=[];if(!d)this._minorAutoInterval=null;if(a>=0.5)a=t(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=P(b),h,i,j,k,l,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];f< +c+1&&!l;f++){i=e.length;for(h=0;hb&&(!d||k<=c)&&g.push(k),k>c&&(l=!0),k=j}else if(b=fa(b),c=fa(c),a=e[d?"minorTickInterval":"tickInterval"],a=o(a==="auto"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:f)||1)),a=ob(a,null,nb(a)),g=Na(this.getLinearTickPositions(a,b,c),ma),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g},getMinorTickPositions:function(){var a=this.options,b=this.tickPositions,c=this.minorTickInterval, +d=[],e;if(this.isLog){e=b.length;for(a=1;a=this.minRange,f,g,h,i,j;if(this.isXAxis&&this.minRange===v&&!this.isLog)u(a.min)||u(a.max)? +this.minRange=null:(n(this.series,function(a){i=a.xData;for(g=j=a.xIncrement?1:i.length-1;g>0;g--)if(h=i[g]-i[g-1],f===v||hb&&(g=0);c=r(c,g);e=r(e,ea(h)?0:g/2);f=r(f,h==="on"?0:g);!a.noSharedTooltip&&u(l)&&(d=u(d)?J(d,l):l)}),g=this.ordinalSlope&&d?this.ordinalSlope/d:1,this.minPointOffset=e*=g,this.pointRangePadding=f*=g,this.pointRange=J(c,b),this.closestPointRange=d;if(a)this.oldTransA=h;this.translationSlope=this.transA=h=this.len/(b+f||1);this.transB=this.horiz? +this.left:this.bottom;this.minPixelPadding=h*e},setTickPositions:function(a){var b=this,c=b.chart,d=b.options,e=b.isLog,f=b.isDatetimeAxis,g=b.isXAxis,h=b.isLinked,i=b.options.tickPositioner,j=d.maxPadding,k=d.minPadding,l=d.tickInterval,m=d.minTickInterval,p=d.tickPixelInterval,q,aa=b.categories;h?(b.linkedParent=c[g?"xAxis":"yAxis"][d.linkedTo],c=b.linkedParent.getExtremes(),b.min=o(c.min,c.dataMin),b.max=o(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&ka(11,1)):(b.min=o(b.userMin,d.min, +b.dataMin),b.max=o(b.userMax,d.max,b.dataMax));if(e)!a&&J(b.min,o(b.dataMin,b.min))<=0&&ka(10,1),b.min=ia(ma(b.min)),b.max=ia(ma(b.max));if(b.range&&(b.userMin=b.min=r(b.min,b.max-b.range),b.userMax=b.max,a))b.range=null;b.beforePadding&&b.beforePadding();b.adjustForMinRange();if(!aa&&!b.usePercentage&&!h&&u(b.min)&&u(b.max)&&(c=b.max-b.min)){if(!u(d.min)&&!u(b.userMin)&&k&&(b.dataMin<0||!b.ignoreMinPadding))b.min-=c*k;if(!u(d.max)&&!u(b.userMax)&&j&&(b.dataMax>0||!b.ignoreMaxPadding))b.max+=c*j}b.min=== +b.max||b.min===void 0||b.max===void 0?b.tickInterval=1:h&&!l&&p===b.linkedParent.options.tickPixelInterval?b.tickInterval=b.linkedParent.tickInterval:(b.tickInterval=o(l,aa?1:(b.max-b.min)*p/r(b.len,p)),!u(l)&&b.lenr(2*b.len,200)&&ka(19,!0),a=f?(b.getNonLinearTimeTicks||Eb)(Cb(b.tickInterval, +d.units),b.min,b.max,d.startOfWeek,b.ordinalPositions,b.closestPointRange,!0):e?b.getLogTickPositions(b.tickInterval,b.min,b.max):b.getLinearTickPositions(b.tickInterval,b.min,b.max),q&&a.splice(1,a.length-2),b.tickPositions=a;if(!h)e=a[0],f=a[a.length-1],h=b.minPointOffset||0,d.startOnTick?b.min=e:b.min-h>e&&a.shift(),d.endOnTick?b.max=f:b.max+h(b[d]||0)&&this.options.alignTicks!==!1)b[d]=c.length;a.maxTicks=b},adjustTickAmount:function(){var a=this._maxTicksKey,b=this.tickPositions,c=this.chart.maxTicks;if(c&&c[a]&&!this.isDatetimeAxis&&!this.categories&&!this.isLinked&&this.options.alignTicks!==!1){var d=this.tickAmount,e=b.length;this.tickAmount=a=c[a];if(e=this.dataMax&&(b=v));this.displayBtn=a!==v||b!==v;this.setExtremes(a,b,!1,v,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=b.offsetRight||0,e=this.horiz,f,g;this.left=g=o(b.left,a.plotLeft+c);this.top=f=o(b.top,a.plotTop);this.width=c=o(b.width,a.plotWidth-c+d);this.height=b=o(b.height,a.plotHeight);this.bottom=a.chartHeight- +b-f;this.right=a.chartWidth-c-g;this.len=r(e?c:b,0);this.pos=e?g:f},getExtremes:function(){var a=this.isLog;return{min:a?ia(fa(this.min)):this.min,max:a?ia(fa(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?fa(this.min):this.min,b=b?fa(this.max):this.max;c>a||a===null?a=c:b15&&a<165?"right":a>195&&a<345?"left":"center"},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,j,k=0,l,m=0,p=d.title,q=d.labels,aa=0,B=b.axisOffset,t=b.clipOffset, +s=[-1,1,1,-1][h],w,x=1,y=o(q.maxStaggerLines,5),Ha,E,H,C;a.hasData=j=a.hasVisibleSeries||u(a.min)&&u(a.max)&&!!e;a.showAxis=b=j||o(d.showEmpty,!0);a.staggerLines=a.horiz&&q.staggerLines;if(!a.axisGroup)a.gridGroup=c.g("grid").attr({zIndex:d.gridZIndex||1}).add(),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).add(),a.labelGroup=c.g("axis-labels").attr({zIndex:q.zIndex||7}).add();if(j||a.isLinked){a.labelAlign=o(q.align||a.autoLabelAlign(q.rotation));n(e,function(b){f[b]?f[b].addLabel():f[b]=new Ma(a, +b)});if(a.horiz&&!a.staggerLines&&y&&!q.rotation){for(w=a.reversed?[].concat(e).reverse():e;x1)a.staggerLines=x}n(e,function(b){if(h===0||h===2||{1:"left",3:"right"}[h]===a.labelAlign)aa=r(f[b].getLabelSize(),aa)});if(a.staggerLines)aa*=a.staggerLines,a.labelOffset=aa}else for(w in f)f[w].destroy(),delete f[w];if(p&& +p.text&&p.enabled!==!1){if(!a.axisTitle)a.axisTitle=c.text(p.text,0,0,p.useHTML).attr({zIndex:7,rotation:p.rotation||0,align:p.textAlign||{low:"left",middle:"center",high:"right"}[p.align]}).css(p.style).add(a.axisGroup),a.axisTitle.isNew=!0;if(b)k=a.axisTitle.getBBox()[g?"height":"width"],m=o(p.margin,g?5:10),l=p.offset;a.axisTitle[b?"show":"hide"]()}a.offset=s*o(d.offset,B[h]);a.axisTitleMargin=o(l,aa+m+(h!==2&&aa&&s*d.labels[g?"y":"x"]));B[h]=r(B[h],a.axisTitleMargin+k+s*a.offset);t[i]=r(t[i], +P(d.lineWidth/2)*2)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",e?this.left:f,e?d:this.top,"L",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,h=this.offset,i=y(e.style.fontSize||12),d={low:f+(a?0:d), +middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?i:0);return{x:a?d:b+(g?this.width:0)+h+(e.x||0),y:a?b-(g?this.height:0)+h:d+(e.y||0)}},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.isLog,f=a.isLinked,g=a.tickPositions,h=a.axisTitle,i=a.stacks,j=a.ticks,k=a.minorTicks,l=a.alternateBands,m=d.stackLabels,p=d.alternateGridColor,q=a.tickmarkOffset,o=d.lineWidth,B,r=b.hasRendered&&u(a.oldMin)&&!isNaN(a.oldMin);B=a.hasData; +var t=a.showAxis,s,w;n([j,k,l],function(a){for(var b in a)a[b].isActive=!1});if(B||f)if(a.minorTickInterval&&!a.categories&&n(a.getMinorTickPositions(),function(b){k[b]||(k[b]=new Ma(a,b,"minor"));r&&k[b].isNew&&k[b].render(null,!0);k[b].render(null,!1,1)}),g.length&&(n(g.slice(1).concat([g[0]]),function(b,c){c=c===g.length-1?0:c+1;if(!f||b>=a.min&&b<=a.max)j[b]||(j[b]=new Ma(a,b)),r&&j[b].isNew&&j[b].render(c,!0),j[b].render(c,!1,1)}),q&&a.min===0&&(j[-1]||(j[-1]=new Ma(a,-1,null,!0)),j[-1].render(-1))), +p&&n(g,function(b,c){if(c%2===0&&b1||M(b-f.y)>1))clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(){var a=this,b;clearTimeout(this.hideTimer); +if(!this.isHidden)b=this.chart.hoverPoints,this.hideTimer=setTimeout(function(){a.label.fadeOut();a.isHidden=!0},o(this.options.hideDelay,500)),b&&n(b,function(a){a.setState()}),this.chart.hoverPoints=null},hideCrosshairs:function(){n(this.crosshairs,function(a){a&&a.hide()})},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted,f=d.plotTop,g=0,h=0,i,a=ja(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===v&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-f]);c||(n(a,function(a){i= +a.series.yAxis;g+=a.plotX;h+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&i?i.top-f:0)}),g/=a.length,h/=a.length,c=[e?d.plotWidth-h:g,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-g:h]);return Na(c,t)},getPosition:function(a,b,c){var d=this.chart,e=d.plotLeft,f=d.plotTop,g=d.plotWidth,h=d.plotHeight,i=o(this.options.distance,12),j=c.plotX,c=c.plotY,d=j+e+(d.inverted?i:-a-i),k=c-b+f+15,l;d<7&&(d=e+r(j,0)+i);d+a>e+g&&(d-=d+a-(e+g),k=c-b+f-i,l=!0);k=k&&c<=k+b&&(k=c+ +f+i));k+b>f+h&&(k=r(f,f+h-b-i));return{x:d,y:k}},defaultFormatter:function(a){var b=this.points||ja(this),c=b[0].series,d;d=[c.tooltipHeaderFormatter(b[0])];n(b,function(a){c=a.series;d.push(c.tooltipFormatter&&c.tooltipFormatter(a)||a.point.tooltipFormatter(c.tooltipOptions.pointFormat))});d.push(a.options.footerFormat||"");return d.join("")},refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h={},i,j=[];i=e.formatter||this.defaultFormatter;var h=c.hoverPoints,k,l=e.crosshairs, +m=this.shared;clearTimeout(this.hideTimer);this.followPointer=ja(a)[0].series.tooltipOptions.followPointer;g=this.getAnchor(a,b);f=g[0];g=g[1];m&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints=a,h&&n(h,function(a){a.setState()}),n(a,function(a){a.setState("hover");j.push(a.getLabelConfig())}),h={x:a[0].category,y:a[0].y},h.points=j,a=a[0]):h=a.getLabelConfig();i=i.call(h,this);h=a.series;i===!1?this.hide():(this.isHidden&&(Wa(d),d.attr("opacity",1).show()),d.attr({text:i}),k=e.borderColor|| +a.color||h.color||"#606060",d.attr({stroke:k}),this.updatePosition({plotX:f,plotY:g}),this.isHidden=!1);if(l){l=ja(l);for(d=l.length;d--;)if(m=a.series,e=m[d?"yAxis":"xAxis"],l[d]&&e)if(h=d?o(a.stackY,a.y):a.x,e.isLog&&(h=ma(h)),d===1&&m.modifyValue&&(h=m.modifyValue(h)),e=e.getPlotLinePath(h,1),this.crosshairs[d])this.crosshairs[d].attr({d:e,visibility:"visible"});else{h={"stroke-width":l[d].width||1,stroke:l[d].color||"#C0C0C0",zIndex:l[d].zIndex||2};if(l[d].dashStyle)h.dashstyle=l[d].dashStyle; +this.crosshairs[d]=c.renderer.path(e).attr(h).add()}}A(c,"tooltipRefresh",{text:i,x:f+c.plotLeft,y:g+c.plotTop,borderColor:k})},updatePosition:function(a){var b=this.chart,c=this.label,c=(this.options.positioner||this.getPosition).call(this,c.width,c.height,a);this.move(t(c.x),t(c.y),a.plotX+b.plotLeft,a.plotY+b.plotTop)}};xb.prototype={init:function(a,b){var c=b.chart,d=c.events,e=ca?"":c.zoomType,c=a.inverted,f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor= +f&&!c||e&&c;this.zoomVert=e&&!c||f&&c;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(b.tooltip.enabled)a.tooltip=new wb(a,b.tooltip);this.setDOMEvents()},normalize:function(a,b){var c,d,a=a||N.event;if(!a.target)a.target=a.srcElement;a=Xb(a);d=a.touches?a.touches.item(0):a;if(!b)this.chartPosition=b=Wb(this.chart.container);d.pageX===v?(c=r(a.x,a.clientX-b.left),d=a.y):(c=d.pageX-b.left,d=d.pageY-b.top);return s(a,{chartX:t(c),chartY:t(d)})},getCoordinates:function(a){var b= +{xAxis:[],yAxis:[]};n(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return b},getIndex:function(a){var b=this.chart;return b.inverted?b.plotHeight+b.plotTop-a.chartY:a.chartX-b.plotLeft},runPointActions:function(a){var b=this.chart,c=b.series,d=b.tooltip,e,f=b.hoverPoint,g=b.hoverSeries,h,i,j=b.chartWidth,k=this.getIndex(a);if(d&&this.options.tooltip.shared&&(!g||!g.noSharedTooltip)){e=[];h=c.length;for(i=0;ij&&e.splice(h,1);if(e.length&&e[0].clientX!==this.hoverX)d.refresh(e,a),this.hoverX=e[0].clientX}if(g&&g.tracker){if((b=g.tooltipPoints[k])&&b!==f)b.onMouseOver(a)}else d&&d.followPointer&&!d.isHidden&&(a=d.getAnchor([{}],a),d.updatePosition({plotX:a[0],plotY:a[1]}))},reset:function(a){var b=this.chart, +c=b.hoverSeries,d=b.hoverPoint,e=b.tooltip,b=e&&e.shared?b.hoverPoints:d;(a=a&&e&&b)&&ja(b)[0].plotX===v&&(a=!1);if(a)e.refresh(b);else{if(d)d.onMouseOut();if(c)c.onMouseOut();e&&(e.hide(),e.hideCrosshairs());this.hoverX=null}},scaleGroups:function(a,b){var c=this.chart,d;n(c.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&(e.group.attr(d),e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});c.clipRect.attr(b|| +c.clipBox)},pinchTranslate:function(a,b,c,d,e,f,g,h){a&&this.pinchTranslateDirection(!0,c,d,e,f,g,h);b&&this.pinchTranslateDirection(!1,c,d,e,f,g,h)},pinchTranslateDirection:function(a,b,c,d,e,f,g,h){var i=this.chart,j=a?"x":"y",k=a?"X":"Y",l="chart"+k,m=a?"width":"height",p=i["plot"+(a?"Left":"Top")],q,o,n=h||1,r=i.inverted,t=i.bounds[a?"h":"v"],u=b.length===1,s=b[0][l],v=c[0][l],w=!u&&b[1][l],x=!u&&c[1][l],y,c=function(){!u&&M(s-w)>20&&(n=h||M(v-x)/M(s-w));o=(p-v)/n+s;q=i["plot"+(a?"Width":"Height")]/ +n};c();b=o;bt.max&&(b=t.max-q,y=!0);y?(v-=0.8*(v-g[j][0]),u||(x-=0.8*(x-g[j][1])),c()):g[j]=[v,x];r||(f[j]=o-p,f[m]=q);f=r?1/n:n;e[m]=q;e[j]=b;d[r?a?"scaleY":"scaleX":"scale"+k]=n;d["translate"+k]=f*p+(v-f*s)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,e=c.tooltip&&c.tooltip.options.followTouchMove,f=a.touches,g=f.length,h=b.lastValidTouch,i=b.zoomHor||b.pinchHor,j=b.zoomVert||b.pinchVert,k=i||j,l=b.selectionMarker,m={},p=g===1&&(b.inClass(a.target,"highcharts-tracker")&& +c.runTrackerClick||c.runChartClick),q={};(k||e)&&!p&&a.preventDefault();Na(f,function(a){return b.normalize(a)});if(a.type==="touchstart")n(f,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),h.x=[d[0].chartX,d[1]&&d[1].chartX],h.y=[d[0].chartY,d[1]&&d[1].chartY],n(c.axes,function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?"h":"v"],d=a.minPixelPadding,e=a.toPixels(a.dataMin),f=a.toPixels(a.dataMax),g=J(e,f),e=r(e,f);b.min=J(a.pos,g-d);b.max=r(a.pos+a.len,e+d)}});else if(d.length){if(!l)b.selectionMarker= +l=s({destroy:oa},c.plotBox);b.pinchTranslate(i,j,d,f,m,l,q,h);b.hasPinched=k;b.scaleGroups(m,q);!k&&e&&g===1&&this.runPointActions(b.normalize(a))}},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,f=this.zoomHor,g=this.zoomVert,h=b.plotLeft,i=b.plotTop,j=b.plotWidth,k=b.plotHeight,l,m=this.mouseDownX,p=this.mouseDownY;d< +h?d=h:d>h+j&&(d=h+j);ei+k&&(e=i+k);this.hasDragged=Math.sqrt(Math.pow(m-d,2)+Math.pow(p-e,2));if(this.hasDragged>10){l=b.isInsidePlot(m-h,p-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&l&&!this.selectionMarker)this.selectionMarker=b.renderer.rect(h,i,f?1:j,g?1:k,0).attr({fill:c.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();this.selectionMarker&&f&&(d-=m,this.selectionMarker.attr({width:M(d),x:(d>0?0:d)+m}));this.selectionMarker&&g&&(d=e-p,this.selectionMarker.attr({height:M(d), +y:(d>0?0:d)+p}));l&&!this.selectionMarker&&c.panning&&b.pan(a,c.panning)}},drop:function(a){var b=this.chart,c=this.hasPinched;if(this.selectionMarker){var d={xAxis:[],yAxis:[],originalEvent:a.originalEvent||a},e=this.selectionMarker,f=e.x,g=e.y,h;if(this.hasDragged||c)n(b.axes,function(a){if(a.zoomEnabled){var b=a.horiz,c=a.toValue(b?f:g),b=a.toValue(b?f+e.width:g+e.height);!isNaN(c)&&!isNaN(b)&&(d[a.xOrY+"Axis"].push({axis:a,min:J(c,b),max:r(c,b)}),h=!0)}}),h&&A(b,"selection",d,function(a){b.zoom(s(a, +c?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();c&&this.scaleGroups()}if(b)I(b.container,{cursor:b._cursor}),b.cancelClick=this.hasDragged>10,b.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a=this.normalize(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(a){this.drop(a)},onDocumentMouseMove:function(a){var b=this.chart,c=this.chartPosition,d=b.hoverSeries,a=this.normalize(a,c); +c&&d&&!this.inClass(a.target,"highcharts-tracker")&&!b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(){this.reset();this.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart,a=this.normalize(a);a.returnValue=!1;b.mouseIsDown==="mousedown"&&this.drag(a);(this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop))&&!b.openMenu&&this.runPointActions(a)},inClass:function(a,b){for(var c;a;){if(c= +w(a,"class"))if(c.indexOf(b)!==-1)return!0;else if(c.indexOf("highcharts-container")!==-1)return!1;a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries;if(b&&!b.options.stickyTracking&&!this.inClass(a.toElement||a.relatedTarget,"highcharts-tooltip"))b.onMouseOut()},onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop,f=b.inverted,g,h,i,a=this.normalize(a);a.cancelBubble=!0;if(!b.cancelClick)c&&this.inClass(a.target,"highcharts-tracker")?(g=this.chartPosition, +h=c.plotX,i=c.plotY,s(c,{pageX:g.left+d+(f?b.plotWidth-i:h),pageY:g.top+e+(f?b.plotHeight-h:i)}),A(c.series,"click",s(a,{point:c})),b.hoverPoint&&c.firePointEvent("click",a)):(s(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&A(b,"click",a))},onContainerTouchStart:function(a){var b=this.chart;a.touches.length===1?(a=this.normalize(a),b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)?(this.runPointActions(a),this.pinch(a)):this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchMove:function(a){(a.touches.length=== +1||a.touches.length===2)&&this.pinch(a)},onDocumentTouchEnd:function(a){this.drop(a)},setDOMEvents:function(){var a=this,b=a.chart.container,c;this._events=c=[[b,"onmousedown","onContainerMouseDown"],[b,"onmousemove","onContainerMouseMove"],[b,"onclick","onContainerClick"],[b,"mouseleave","onContainerMouseLeave"],[z,"mousemove","onDocumentMouseMove"],[z,"mouseup","onDocumentMouseUp"]];jb&&c.push([b,"ontouchstart","onContainerTouchStart"],[b,"ontouchmove","onContainerTouchMove"],[z,"touchend","onDocumentTouchEnd"]); +n(c,function(b){a["_"+b[2]]=function(c){a[b[2]](c)};b[1].indexOf("on")===0?b[0][b[1]]=a["_"+b[2]]:K(b[0],b[1],a["_"+b[2]])})},destroy:function(){var a=this;n(a._events,function(b){b[1].indexOf("on")===0?b[0][b[1]]=null:$(b[0],b[1],a["_"+b[2]])});delete a._events;clearInterval(a.tooltipTimeout)}};fb.prototype={init:function(a,b){var c=this,d=b.itemStyle,e=o(b.padding,8),f=b.itemMarginTop||0;this.options=b;if(b.enabled)c.baseline=y(d.fontSize)+3+f,c.itemStyle=d,c.itemHiddenStyle=x(d,b.itemHiddenStyle), +c.itemMarginTop=f,c.padding=e,c.initialItemX=e,c.initialItemY=e-5,c.maxItemWidth=0,c.chart=a,c.itemHeight=0,c.lastLineHeight=0,c.render(),K(c.chart,"endResize",function(){c.positionCheckboxes()})},colorizeItem:function(a,b){var c=this.options,d=a.legendItem,e=a.legendLine,f=a.legendSymbol,g=this.itemHiddenStyle.color,c=b?c.itemStyle.color:g,h=b?a.color:g,g=a.options&&a.options.marker,i={stroke:h,fill:h},j;d&&d.css({fill:c,color:c});e&&e.attr({stroke:h});if(f){if(g&&f.isMarker)for(j in g=a.convertAttribs(g), +g)d=g[j],d!==v&&(i[j]=d);f.attr(i)}},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,d=a._legendItemPos,e=d[0],d=d[1],f=a.checkbox;a.legendGroup&&a.legendGroup.translate(b?e:this.legendWidth-e-2*c-4,d);if(f)f.x=e,f.y=d},destroyItem:function(a){var b=a.checkbox;n(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&Ta(a.checkbox)},destroy:function(){var a=this.group,b=this.box;if(b)this.box=b.destroy();if(a)this.group=a.destroy()}, +positionCheckboxes:function(a){var b=this.group.alignAttr,c,d=this.clipHeight||this.legendHeight;if(b)c=b.translateY,n(this.allItems,function(e){var f=e.checkbox,g;f&&(g=c+f.y+(a||0)+3,I(f,{left:b.translateX+e.legendItemWidth+f.x-20+"px",top:g+"px",display:g>c-6&&g(p||c.chartWidth-2*k-B))b.itemX=B,b.itemY+=n+b.lastLineHeight+q,b.lastLineHeight=0;b.maxItemWidth=r(b.maxItemWidth, +e);b.lastItemY=n+b.itemY+q;b.lastLineHeight=r(g,b.lastLineHeight);a._legendItemPos=[b.itemX,b.itemY];f?b.itemX+=e:(b.itemY+=n+g+q,b.lastLineHeight=g);b.offsetWidth=p||r((f?b.itemX-B-l:e)+k,b.offsetWidth)},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,j=a.options,k=a.padding,l=j.borderWidth,m=j.backgroundColor;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g("legend").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d), +a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();e=[];n(b.series,function(a){var b=a.options;if(o(b.showInLegend,b.linkedTo===v?v:!1,!0))e=e.concat(a.legendItems||(b.legendType==="point"?a.data:a))});Kb(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});j.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;n(e,function(b){a.renderItem(b)});g=j.width||a.offsetWidth;h=a.lastItemY+a.lastLineHeight+a.titleHeight;h=a.handleOverflow(h);if(l|| +m){g+=k;h+=k;if(i){if(g>0&&h>0)i[i.isNew?"attr":"animate"](i.crisp(null,null,null,g,h)),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,j.borderRadius,l||0).attr({stroke:j.borderColor,"stroke-width":l||0,fill:m||S}).add(d).shadow(j.shadow),i.isNew=!0;i[f?"show":"hide"]()}a.legendWidth=g;a.legendHeight=h;n(e,function(b){a.positionItem(b)});f&&d.align(s({width:g,height:h},j),!0,"spacingBox");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=this.chart,d=c.renderer,e=this.options, +f=e.y,f=c.spacingBox.height+(e.verticalAlign==="top"?-f:f)-this.padding,g=e.maxHeight,h=this.clipRect,i=e.navigation,j=o(i.animation,!0),k=i.arrowSize||12,l=this.nav;e.layout==="horizontal"&&(f/=2);g&&(f=J(f,g));if(a>f&&!e.useHTML){this.clipHeight=c=f-20-this.titleHeight;this.pageCount=wa(a/c);this.currentPage=o(this.currentPage,1);this.fullHeight=a;if(!h)h=b.clipRect=d.clipRect(0,0,9999,0),b.contentGroup.clip(h);h.attr({height:c});if(!l)this.nav=l=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle", +0,0,k,k).on("click",function(){b.scroll(-1,j)}).add(l),this.pager=d.text("",15,10).css(i.style).add(l),this.down=d.symbol("triangle-down",0,0,k,k).on("click",function(){b.scroll(1,j)}).add(l);b.scroll(0);a=f}else if(l)h.attr({height:c.chartHeight}),l.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return a},scroll:function(a,b){var c=this.pageCount,d=this.currentPage+a,e=this.clipHeight,f=this.options.navigation,g=f.activeColor,h=f.inactiveColor,f=this.pager,i=this.padding;d>c&&(d= +c);if(d>0)b!==v&&La(b,this.chart),this.nav.attr({translateX:i,translateY:e+7+this.titleHeight,visibility:"visible"}),this.up.attr({fill:d===1?h:g}).css({cursor:d===1?"default":"pointer"}),f.attr({text:d+"/"+this.pageCount}),this.down.attr({x:18+this.pager.getBBox().width,fill:d===c?h:g}).css({cursor:d===c?"default":"pointer"}),e=-J(e*(d-1),this.fullHeight-e+i)+1,this.scrollGroup.animate({translateY:e}),f.attr({text:d+"/"+c}),this.currentPage=d,this.positionCheckboxes(e)}};/Trident\/7\.0/.test(na)&& +mb(fb.prototype,"positionItem",function(a,b){var c=this,d=function(){a.call(c,b)};c.chart.renderer.forExport?d():setTimeout(d)});yb.prototype={init:function(a,b){var c,d=a.series;a.series=null;c=x(L,a);c.series=a.series=d;d=c.chart;this.margin=this.splashArray("margin",d);this.spacing=this.splashArray("spacing",d);var e=d.events;this.bounds={h:{},v:{}};this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=d.showAxes;var f=this,g;f.index=Ga.length;Ga.push(f); +d.reflow!==!1&&K(f,"load",function(){f.initReflow()});if(e)for(g in e)K(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=ca?!1:o(d.animation,!0);f.pointCount=0;f.counters=new Jb;f.firstRender()},initSeries:function(a){var b=this.options.chart;(b=X[a.type||b.type||b.defaultSeriesType])||ka(17,!0);b=new b;b.init(this,a);return b},addSeries:function(a,b,c){var d,e=this;a&&(b=o(b,!0),A(e,"addSeries",{options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();b&&e.redraw(c)}));return d},addAxis:function(a, +b,c,d){var e=b?"xAxis":"yAxis",f=this.options;new eb(this,x(a,{index:this[e].length,isX:b}));f[e]=ja(f[e]||{});f[e].push(a);o(c,!0)&&this.redraw(d)},isInsidePlot:function(a,b,c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},adjustTickAmounts:function(){this.options.chart.alignTicks!==!1&&n(this.axes,function(a){a.adjustTickAmount()});this.maxTicks=null},redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend,f=this.isDirtyLegend,g,h,i=this.isDirtyBox, +j=c.length,k=j,l=this.renderer,m=l.isHidden(),p=[];La(a,this);m&&this.cloneRenderTo();for(this.layOutTitles();k--;)if(a=c[k],a.options.stacking&&(g=!0,a.isDirty)){h=!0;break}if(h)for(k=j;k--;)if(a=c[k],a.options.stacking)a.isDirty=!0;n(c,function(a){a.isDirty&&a.options.legendType==="point"&&(f=!0)});if(f&&e.options.enabled)e.render(),this.isDirtyLegend=!1;g&&this.getStacks();if(this.hasCartesianSeries){if(!this.isResizing)this.maxTicks=null,n(b,function(a){a.setScale()});this.adjustTickAmounts(); +this.getMargins();n(b,function(a){a.isDirty&&(i=!0)});n(b,function(a){if(a.isDirtyExtremes)a.isDirtyExtremes=!1,p.push(function(){A(a,"afterSetExtremes",s(a.eventArgs,a.getExtremes()));delete a.eventArgs});(i||g)&&a.redraw()})}i&&this.drawChartBox();n(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.reset&&d.reset(!0);l.draw();A(this,"redraw");m&&this.cloneRenderTo(!0);n(p,function(a){a.call()})},showLoading:function(a){var b=this.options,c=this.loadingDiv,d=b.loading; +if(!c)this.loadingDiv=c=U(Ea,{className:"highcharts-loading"},s(d.style,{zIndex:10,display:S}),this.container),this.loadingSpan=U("span",null,d.labelStyle,c);this.loadingSpan.innerHTML=a||b.lang.loading;if(!this.loadingShown)I(c,{opacity:0,display:"",left:this.plotLeft+"px",top:this.plotTop+"px",width:this.plotWidth+"px",height:this.plotHeight+"px"}),Bb(c,{opacity:d.style.opacity},{duration:d.showDuration||0}),this.loadingShown=!0},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&Bb(b, +{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){I(b,{display:S})}});this.loadingShown=!1},get:function(a){var b=this.axes,c=this.series,d,e;for(d=0;dJ(k.dataMin,k.min)&&i=18&&a<=25&&(a=15);c&&(c.css({width:(d.width||f)+"px"}).align(s({y:a+e.margin},d),!1,"spacingBox"),!d.floating&&!d.verticalAlign&&(a=wa(a+c.getBBox().height)));this.titleOffset=a},getChartSize:function(){var a=this.options.chart,b=this.renderToClone||this.renderTo;this.containerWidth=kb(b,"width");this.containerHeight=kb(b,"height");this.chartWidth=r(0,a.width||this.containerWidth||600);this.chartHeight=r(0,o(a.height,this.containerHeight>19?this.containerHeight: +400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Ta(b),delete this.renderToClone):(c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=b=this.renderTo.cloneNode(0),I(b,{position:"absolute",top:"-9999px",display:"block"}),z.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options.chart,c,d,e;this.renderTo=a=b.renderTo;e="highcharts-"+zb++;if(ea(a))this.renderTo=a=z.getElementById(a); +a||ka(13,!0);c=y(w(a,"data-highcharts-chart"));!isNaN(c)&&Ga[c]&&Ga[c].destroy();w(a,"data-highcharts-chart",this.index);a.innerHTML="";a.offsetWidth||this.cloneRenderTo();this.getChartSize();c=this.chartWidth;d=this.chartHeight;this.container=a=U(Ea,{className:"highcharts-container"+(b.className?" "+b.className:""),id:e},s({position:"relative",overflow:"hidden",width:c+"px",height:d+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},b.style),this.renderToClone|| +a);this._cursor=a.style.cursor;this.renderer=b.forExport?new za(a,c,d,!0):new Va(a,c,d);ca&&this.renderer.create(this,a,c,d)},getMargins:function(){var a=this.spacing,b,c=this.legend,d=this.margin,e=this.options.legend,f=o(e.margin,10),g=e.x,h=e.y,i=e.align,j=e.verticalAlign,k=this.titleOffset;this.resetMargins();b=this.axisOffset;if(k&&!u(d[0]))this.plotTop=r(this.plotTop,k+this.options.title.margin+a[0]);if(c.display&&!e.floating)if(i==="right"){if(!u(d[1]))this.marginRight=r(this.marginRight,c.legendWidth- +g+f+a[1])}else if(i==="left"){if(!u(d[3]))this.plotLeft=r(this.plotLeft,c.legendWidth+g+f+a[3])}else if(j==="top"){if(!u(d[0]))this.plotTop=r(this.plotTop,c.legendHeight+h+f+a[0])}else if(j==="bottom"&&!u(d[2]))this.marginBottom=r(this.marginBottom,c.legendHeight-h+f+a[2]);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);this.hasCartesianSeries&&n(this.axes,function(a){a.getOffset()});u(d[3])||(this.plotLeft+=b[3]);u(d[0])|| +(this.plotTop+=b[0]);u(d[2])||(this.marginBottom+=b[2]);u(d[1])||(this.marginRight+=b[1]);this.setChartSize()},initReflow:function(){function a(a){var g=c.width||kb(d,"width"),h=c.height||kb(d,"height"),a=a?a.target:N;if(!b.hasUserSize&&g&&h&&(a===N||a===z)){if(g!==b.containerWidth||h!==b.containerHeight)clearTimeout(e),b.reflowTimeout=e=setTimeout(function(){if(b.container)b.setSize(g,h,!1),b.hasUserSize=null},100);b.containerWidth=g;b.containerHeight=h}}var b=this,c=b.options.chart,d=b.renderTo, +e;b.reflow=a;K(N,"resize",a);K(b,"destroy",function(){$(N,"resize",a)})},setSize:function(a,b,c){var d=this,e,f,g;d.isResizing+=1;g=function(){d&&A(d,"endResize",null,function(){d.isResizing-=1})};La(c,d);d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;if(u(a))d.chartWidth=e=r(0,t(a)),d.hasUserSize=!!e;if(u(b))d.chartHeight=f=r(0,t(b));I(d.container,{width:e+"px",height:f+"px"});d.setChartSize(!0);d.renderer.setSize(e,f,c);d.maxTicks=null;n(d.axes,function(a){a.isDirty=!0;a.setScale()}); +n(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.getMargins();d.redraw(c);d.oldChartHeight=null;A(d,"resize");Fa===!1?g():setTimeout(g,Fa&&Fa.duration||500)},setChartSize:function(a){var b=this.inverted,c=this.renderer,d=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,h=this.clipOffset,i,j,k,l;this.plotLeft=i=t(this.plotLeft);this.plotTop=j=t(this.plotTop);this.plotWidth=k=r(0,t(d-i-this.marginRight));this.plotHeight=l=r(0,t(e-j-this.marginBottom)); +this.plotSizeX=b?l:k;this.plotSizeY=b?k:l;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:e-g[0]-g[2]};this.plotBox=c.plotBox={x:i,y:j,width:k,height:l};d=2*P(this.plotBorderWidth/2);b=wa(r(d,h[3])/2);c=wa(r(d,h[0])/2);this.clipBox={x:b,y:c,width:P(this.plotSizeX-r(d,h[1])/2-b),height:P(this.plotSizeY-r(d,h[2])/2-c)};a||n(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this.spacing,b=this.margin; +this.plotTop=o(b[0],a[0]);this.marginRight=o(b[1],a[1]);this.marginBottom=o(b[2],a[2]);this.plotLeft=o(b[3],a[3]);this.axisOffset=[0,0,0,0];this.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,j=a.backgroundColor,k=a.plotBackgroundColor,l=a.plotBackgroundImage,m=a.plotBorderWidth||0,p,q=this.plotLeft,o=this.plotTop,n=this.plotWidth, +r=this.plotHeight,t=this.plotBox,u=this.clipRect,s=this.clipBox;p=i+(a.shadow?8:0);if(i||j)if(e)e.animate(e.crisp(null,null,null,c-p,d-p));else{e={fill:j||S};if(i)e.stroke=a.borderColor,e["stroke-width"]=i;this.chartBackground=b.rect(p/2,p/2,c-p,d-p,a.borderRadius,i).attr(e).add().shadow(a.shadow)}if(k)f?f.animate(t):this.plotBackground=b.rect(q,o,n,r,0).attr({fill:k}).add().shadow(a.plotShadow);if(l)h?h.animate(t):this.plotBGImage=b.image(l,q,o,n,r).add();u?u.animate({width:s.width,height:s.height}): +this.clipRect=b.clipRect(s);if(m)g?g.animate(g.crisp(null,q,o,n,r)):this.plotBorder=b.rect(q,o,n,r,0,-m).attr({stroke:a.plotBorderColor,"stroke-width":m,zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,c,d=a.options.series,e,f;n(["inverted","angular","polar"],function(g){c=X[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&e--;)(c=X[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=this,b=a.series; +n(b,function(a){a.linkedSeries.length=0});n(b,function(b){var d=b.options.linkedTo;if(ea(d)&&(d=d===":previous"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b),b.linkedParent=d})},render:function(){var a=this,b=a.axes,c=a.renderer,d=a.options,e=d.labels,f=d.credits,g;a.setTitle();a.legend=new fb(a,d.legend);a.getStacks();n(b,function(a){a.setScale()});a.getMargins();a.maxTicks=null;n(b,function(a){a.setTickPositions(!0);a.setMaxTicks()});a.adjustTickAmounts();a.getMargins();a.drawChartBox(); +a.hasCartesianSeries&&n(b,function(a){a.render()});if(!a.seriesGroup)a.seriesGroup=c.g("series-group").attr({zIndex:3}).add();n(a.series,function(a){a.translate();a.setTooltipPoints();a.render()});e.items&&n(e.items,function(b){var d=s(e.style,b.style),f=y(d.left)+a.plotLeft,g=y(d.top)+a.plotTop+12;delete d.left;delete d.top;c.text(b.html,f,g).attr({zIndex:2}).css(d).add()});if(f.enabled&&!a.credits)g=f.href,a.credits=c.text(f.text,0,0).on("click",function(){if(g)location.href=g}).attr({align:f.position.align, +zIndex:8}).css(f.style).add().align(f.position);a.hasRendered=!0},destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;A(a,"destroy");Ga[a.index]=v;a.renderTo.removeAttribute("data-highcharts-chart");$(a);for(e=b.length;e--;)b[e]=b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();n("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(b){var c= +a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML="",$(d),f&&Ta(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this;return!W&&N==N.top&&z.readyState!=="complete"||ca&&!N.canvg?(ca?Tb.push(function(){a.firstRender()},a.options.global.canvasToolsURL):z.attachEvent("onreadystatechange",function(){z.detachEvent("onreadystatechange",a.firstRender);z.readyState==="complete"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options,c=a.callback;if(a.isReadyToRender())a.getContainer(), +A(a,"init"),a.resetMargins(),a.setChartSize(),a.propFromSeries(),a.getAxes(),n(b.series||[],function(b){a.initSeries(b)}),a.linkSeries(),A(a,"beforeRender"),a.pointer=new xb(a,b),a.render(),a.renderer.draw(),c&&c.apply(a,[a]),n(a.callbacks,function(b){b.apply(a,[a])}),a.cloneRenderTo(!0),A(a,"load")},splashArray:function(a,b){var c=b[a],c=T(c)?c:[c,c,c,c];return[o(b[a+"Top"],c[0]),o(b[a+"Right"],c[1]),o(b[a+"Bottom"],c[2]),o(b[a+"Left"],c[3])]}};yb.prototype.callbacks=[];var Pa=function(){};Pa.prototype= +{init:function(a,b,c){this.series=a;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter++],a.colorCounter===b.length))a.colorCounter=0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=c.pointValKey,a=Pa.prototype.optionsToObject.call(this,a);s(this,a);this.options=this.options?s(this.options,a):a;if(d)this.y=this[d];if(this.x===v&&c)this.x=b===v?c.autoIncrement():b;return this}, +optionsToObject:function(a){var b={},c=this.series,d=c.pointArrayMap||["y"],e=d.length,f=0,g=0;if(typeof a==="number"||a===null)b[d[0]]=a;else if(Ia(a)){if(a.length>e){c=typeof a[0];if(c==="string")b.name=a[0];else if(c==="number")b.x=a[0];f++}for(;ga+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart.options,c=b.plotOptions,d=c[this.type];this.userOptions=a;a=x(d,c.series,a);this.tooltipOptions=x(b.tooltip,a.tooltip);d.marker===null&&delete a.marker;return a},getColor:function(){var a=this.options,b=this.userOptions, +c=this.chart.options.colors,d=this.chart.counters,e;e=a.color||Z[this.type].color;if(!e&&!a.colorByPoint)u(b._colorIndex)?a=b._colorIndex:(b._colorIndex=d.color,a=d.color++),e=c[a];this.color=e;d.wrapColor(c.length)},getSymbol:function(){var a=this.userOptions,b=this.options.marker,c=this.chart,d=c.options.symbols,c=c.counters;this.symbol=b.symbol;if(!this.symbol)u(a._symbolIndex)?a=a._symbolIndex:(a._symbolIndex=c.symbol,a=c.symbol++),this.symbol=d[a];if(/^url/.test(this.symbol))b.radius=0;c.wrapSymbol(d.length)}, +drawLegendSymbol:function(a){var b=this.options,c=b.marker,d=a.options,e;e=d.symbolWidth;var f=this.chart.renderer,g=this.legendGroup,a=a.baseline-t(f.fontMetrics(d.itemStyle.fontSize).b*0.3);if(b.lineWidth){d={"stroke-width":b.lineWidth};if(b.dashStyle)d.dashstyle=b.dashStyle;this.legendLine=f.path(["M",0,a,"L",e,a]).attr(d).add(g)}if(c&&c.enabled)b=c.radius,this.legendSymbol=e=f.symbol(this.symbol,e/2-b,a-b,2*b,2*b).add(g),e.isMarker=!0},addPoint:function(a,b,c,d){var e=this.options,f=this.data, +g=this.graph,h=this.area,i=this.chart,j=this.xData,k=this.yData,l=this.zData,m=this.xAxis&&this.xAxis.names,p=g&&g.shift||0,q=e.data,r;La(d,i);c&&n([g,h,this.graphNeg,this.areaNeg],function(a){if(a)a.shift=p+1});if(h)h.isArea=!0;b=o(b,!0);d={series:this};this.pointClass.prototype.applyOptions.apply(d,[a]);g=d.x;h=j.length;if(this.requireSorting&&gg;)h--;j.splice(h,0,g);k.splice(h,0,this.toYData?this.toYData(d):d.y);l.splice(h,0,d.z);if(m)m[g]=d.name;q.splice(h,0,a);r&&(this.data.splice(h, +0,null),this.processData());e.legendType==="point"&&this.generatePoints();c&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),j.shift(),k.shift(),l.shift(),q.shift()));this.isDirtyData=this.isDirty=!0;b&&(this.getAttribs(),i.redraw())},setData:function(a,b){var c=this.points,d=this.options,e=this.chart,f=null,g=this.xAxis,h=g&&g.names,i;this.xIncrement=null;this.pointRange=g&&g.categories?1:d.pointRange;this.colorCounter=0;var j=[],k=[],l=[],m=a?a.length:[];i=o(d.turboThreshold,1E3);var p=this.pointArrayMap, +p=p&&p.length,q=!!this.toYData;if(i&&m>i){for(i=0;f===null&&ij||this.forceCrop))if(a=h.min,h=h.max,b[d-1]h)b=[],c=[];else if(b[0]h)e=this.cropData(this.xData,this.yData,a,h),b=e.xData,c=e.yData,e=e.start,f=!0;for(h=b.length-1;h>=0;h--)d=b[h]-b[h-1],d>0&&(g===v||d=c){f=r(0,i-h);break}for(;id){g=i+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,j=this.hasGroupedData,k,l=[],m;if(!b&&!j)b=[],b.length= +a.length,b=this.data=b;for(m=0;m0),j=this.getExtremesFromAll||this.cropped||(b[l+1]||j)>=h&&(b[l-1]||j)<=g,i&&j)if(i=k.length)for(;i--;)k[i]!==null&&(e[f++]=k[i]);else e[f++]=k;this.dataMin=o(void 0,Ja(e));this.dataMax=o(void 0,ua(e))},translate:function(){this.processedXData||this.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue, +i=a.pointPlacement,j=i==="between"||ra(i),k=a.threshold,a=0;a=f.min&&c<=f.max){h=b[i+1];c=d===v?0:d+1;for(d=b[i+1]?J(r(0,P((e.clientX+(h?h.wrappedClientX||h.clientX:g))/2)),g):g;c>=0&&c<=d;)j[c++]=e}this.tooltipPoints=j}},tooltipHeaderFormatter:function(a){var b=this.tooltipOptions,c=b.xDateFormat,d=b.dateTimeLabelFormats,e=this.xAxis,f=e&&e.options.type==="datetime",b=b.headerFormat,e=e&&e.closestPointRange,g;if(f&&!c)if(e)for(g in D){if(D[g]>= +e){c=d[g];break}}else c=d.day;f&&c&&ra(a.key)&&(b=b.replace("{point.key}","{point.key:"+c+"}"));return Ca(b,{point:a,series:this})},onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&A(this,"mouseOver");this.setState("hover");a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;if(d)d.onMouseOut();this&&a.events.mouseOut&&A(this,"mouseOut");c&&!a.stickyTracking&&(!c.shared||this.noSharedTooltip)&& +c.hide();this.setState();b.hoverSeries=null},animate:function(a){var b=this,c=b.chart,d=c.renderer,e;e=b.options.animation;var f=c.clipBox,g=c.inverted,h;if(e&&!T(e))e=Z[b.type].animation;h="_sharedClip"+e.duration+e.easing;if(a)a=c[h],e=c[h+"m"],a||(c[h]=a=d.clipRect(s(f,{width:0})),c[h+"m"]=e=d.clipRect(-99,g?-c.plotLeft:-c.plotTop,99,g?c.chartWidth:c.chartHeight)),b.group.clip(a),b.markerGroup.clip(e),b.sharedClipKey=h;else{if(a=c[h])a.animate({width:c.plotSizeX},e),c[h+"m"].animate({width:c.plotSizeX+ +99},e);b.animate=null;b.animationTimeout=setTimeout(function(){b.afterAnimate()},e.duration)}},afterAnimate:function(){var a=this.chart,b=this.sharedClipKey,c=this.group;c&&this.options.clip!==!1&&(c.clip(a.clipRect),this.markerGroup.clip());setTimeout(function(){b&&a[b]&&(a[b]=a[b].destroy(),a[b+"m"]=a[b+"m"].destroy())},100)},drawPoints:function(){var a,b=this.points,c=this.chart,d,e,f,g,h,i,j,k,l=this.options.marker,m,n=this.markerGroup;if(l.enabled||this._hasPointMarkers)for(f=b.length;f--;)if(g= +b[f],d=P(g.plotX),e=g.plotY,k=g.graphic,i=g.marker||{},a=l.enabled&&i.enabled===v||i.enabled,m=c.isInsidePlot(t(d),e,c.inverted),a&&e!==v&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?"select":""],h=a.r,i=o(i.symbol,this.symbol),j=i.indexOf("url")===0,k)k.attr({visibility:m?W?"inherit":"visible":"hidden"}).animate(s({x:d-h,y:e-h},k.symbolName?{width:2*h,height:2*h}:{}));else{if(m&&(h>0||j))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h).attr(a).add(n)}else if(k)g.graphic=k.destroy()},convertAttribs:function(a, +b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=o(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=Z[a.type].marker?b.marker:b,d=c.states,e=d.hover,f,g=a.color,h={stroke:g,fill:g},i=a.points||[],j=[],k,l=a.pointAttrToOptions,m=b.negativeColor,p=c.lineColor,q;b.marker?(e.radius=e.radius||c.radius+2,e.lineWidth=e.lineWidth||c.lineWidth+1):e.color=e.color||qa(e.color||g).brighten(e.brightness).get();j[""]=a.convertAttribs(c, +h);n(["hover","select"],function(b){j[b]=a.convertAttribs(d[b],j[""])});a.pointAttr=j;for(g=i.length;g--;){h=i[g];if((c=h.options&&h.options.marker||h.options)&&c.enabled===!1)c.radius=0;if(h.negative&&m)h.color=h.fillColor=m;f=b.colorByPoint||h.color;if(h.options)for(q in l)u(c[l[q]])&&(f=!0);if(f){c=c||{};k=[];d=c.states||{};f=d.hover=d.hover||{};if(!b.marker)f.color=qa(f.color||h.color).brighten(f.brightness||e.brightness).get();k[""]=a.convertAttribs(s({color:h.color,fillColor:h.color,lineColor:p=== +null?h.color:v},c),j[""]);k.hover=a.convertAttribs(d.hover,j.hover,k[""]);k.select=a.convertAttribs(d.select,j.select,k[""])}else k=j;h.pointAttr=k}},update:function(a,b){var c=this.chart,d=this.type,e=X[d].prototype,f,a=x(this.userOptions,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1);for(f in e)e.hasOwnProperty(f)&&(this[f]=v);s(this,X[a.type||d].prototype);this.init(c,a);o(b,!0)&&c.redraw(!1)},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\/533/.test(na), +d,e,f=a.data||[],g,h,i;A(a,"destroy");$(a);n(["xAxis","yAxis"],function(b){if(i=a[b])ga(i.series,a),i.isDirty=i.forceRedraw=!0,i.stacks={}});a.legendItem&&a.chart.legend.destroyItem(a);for(e=f.length;e--;)(g=f[e])&&g.destroy&&g.destroy();a.points=null;clearTimeout(a.animationTimeout);n("area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip".split(","),function(b){a[b]&&(d=c&&b==="group"?"hide":"destroy",a[b][d]())});if(b.hoverSeries===a)b.hoverSeries=null;ga(b.series, +a);for(h in a)delete a[h]},drawDataLabels:function(){var a=this,b=a.options,c=b.cursor,d=b.dataLabels,b=a.points,e,f,g,h;if(d.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(d),h=a.plotGroup("dataLabelsGroup","data-labels",a.visible?"visible":"hidden",d.zIndex||6),f=d,n(b,function(b){var j,k=b.dataLabel,l,m,n=b.connector,q=!0;e=b.options&&b.options.dataLabels;j=o(e&&e.enabled,f.enabled);if(k&&!j)b.dataLabel=k.destroy();else if(j){d=x(f,e);j=d.rotation;l=b.getLabelConfig();g=d.format? +Ca(d.format,l):d.formatter.call(l,d);d.style.color=o(d.color,d.style.color,a.color,"black");if(k)if(u(g))k.attr({text:g}),q=!1;else{if(b.dataLabel=k=k.destroy(),n)b.connector=n.destroy()}else if(u(g)){k={fill:d.backgroundColor,stroke:d.borderColor,"stroke-width":d.borderWidth,r:d.borderRadius||0,rotation:j,padding:d.padding,zIndex:1};for(m in k)k[m]===v&&delete k[m];k=b.dataLabel=a.chart.renderer[j?"text":"label"](g,0,-999,null,null,null,d.useHTML).attr(k).css(s(d.style,c&&{cursor:c})).add(h).shadow(d.shadow)}k&& +a.alignDataLabel(b,k,d,null,q)}})},alignDataLabel:function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=o(a.plotX,-999),i=o(a.plotY,-999),j=b.getBBox();if(a=this.visible&&f.isInsidePlot(a.plotX,a.plotY,g))d=s({x:g?f.plotWidth-i:h,y:t(g?f.plotHeight-h:i),width:0,height:0},d),s(c,{width:j.width,height:j.height}),c.rotation?(g={align:c.align,x:d.x+c.x+d.width/2,y:d.y+c.y+d.height/2},b[e?"attr":"animate"](g)):(b.align(c,null,d),g=b.alignAttr,o(c.overflow,"justify")==="justify"?this.justifyDataLabel(b,c, +g,j,d,e):o(c.crop,!0)&&(a=f.isInsidePlot(g.x,g.y)&&f.isInsidePlot(g.x+j.width,g.y+j.height)));a||b.attr({y:-999})},justifyDataLabel:function(a,b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,j,k;j=c.x;if(j<0)h==="right"?b.align="left":b.x=-j,k=!0;j=c.x+d.width;if(j>g.plotWidth)h==="left"?b.align="right":b.x=g.plotWidth-j,k=!0;j=c.y;if(j<0)i==="bottom"?b.verticalAlign="top":b.y=-j,k=!0;j=c.y+d.height;if(j>g.plotHeight)i==="top"?b.verticalAlign="bottom":b.y=g.plotHeight-j,k=!0;if(k)a.placed= +!f,a.align(b,null,e)},getSegmentPath:function(a){var b=this,c=[],d=b.options.step;n(a,function(e,f){var g=e.plotX,h=e.plotY,i;b.getPointSpline?c.push.apply(c,b.getPointSpline(a,e,f)):(c.push(f?"L":"M"),d&&f&&(i=a[f-1],d==="right"?c.push(i.plotX,h):d==="center"?c.push((i.plotX+g)/2,i.plotY,(i.plotX+g)/2,h):c.push(g,i.plotY)),c.push(e.plotX,e.plotY))});return c},getGraphPath:function(){var a=this,b=[],c,d=[];n(a.segments,function(e){c=a.getSegmentPath(e);e.length>1?b=b.concat(c):d.push(e[0])});a.singlePoints= +d;return a.graphPath=b},drawGraph:function(){var a=this,b=this.options,c=[["graph",b.lineColor||this.color]],d=b.lineWidth,e=b.dashStyle,f=b.linecap!=="square",g=this.getGraphPath(),h=b.negativeColor;h&&c.push(["graphNeg",h]);n(c,function(c,h){var k=c[0],l=a[k];if(l)Wa(l),l.animate({d:g});else if(d&&g.length)l={stroke:c[1],"stroke-width":d,zIndex:1},e?l.dashstyle=e:f&&(l["stroke-linecap"]=l["stroke-linejoin"]="round"),a[k]=a.chart.renderer.path(g).attr(l).add(a.group).shadow(!h&&b.shadow)})},clipNeg:function(){var a= +this.options,b=this.chart,c=b.renderer,d=a.negativeColor||a.negativeFillColor,e,f=this.graph,g=this.area,h=this.posClip,i=this.negClip;e=b.chartWidth;var j=b.chartHeight,k=r(e,j),l=this.yAxis;if(d&&(f||g)){d=t(l.toPixels(a.threshold||0,!0));a={x:0,y:0,width:k,height:d};k={x:0,y:d,width:k,height:k};if(b.inverted)a.height=k.y=b.plotWidth-d,c.isVML&&(a={x:b.plotWidth-d-b.plotLeft,y:0,width:e,height:j},k={x:d+b.plotLeft-e,y:0,width:b.plotLeft+d,height:e});l.reversed?(b=k,e=a):(b=a,e=k);h?(h.animate(b), +i.animate(e)):(this.posClip=h=c.clipRect(b),this.negClip=i=c.clipRect(e),f&&this.graphNeg&&(f.clip(h),this.graphNeg.clip(i)),g&&(g.clip(h),this.areaNeg.clip(i)))}},invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};n(["group","markerGroup"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)K(c,"resize",a),K(b,"destroy",function(){$(c,"resize",a)}),a(),b.invertGroups=a},plotGroup:function(a,b,c,d,e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({visibility:c, +zIndex:d||0.1}).add(e));f[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){return{translateX:this.xAxis?this.xAxis.left:this.chart.plotLeft,translateY:this.yAxis?this.yAxis.top:this.chart.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this.chart,b,c=this.options,d=c.animation&&!!this.animate&&a.renderer.isSVG,e=this.visible?"visible":"hidden",f=c.zIndex,g=this.hasRendered,h=a.seriesGroup;b=this.plotGroup("group","series",e,f,h);this.markerGroup=this.plotGroup("markerGroup", +"markers",e,f,h);d&&this.animate(!0);this.getAttribs();b.inverted=this.isCartesian?a.inverted:!1;this.drawGraph&&(this.drawGraph(),this.clipNeg());this.drawDataLabels();this.drawPoints();this.options.enableMouseTracking!==!1&&this.drawTracker();a.inverted&&this.invertGroups();c.clip!==!1&&!this.sharedClipKey&&!g&&b.clip(a.clipRect);d?this.animate():g||this.afterAnimate();this.isDirty=this.isDirtyData=!1;this.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirtyData,c=this.group,d=this.xAxis, +e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:o(d&&d.left,a.plotLeft),translateY:o(e&&e.top,a.plotTop)}));this.translate();this.setTooltipPoints(!0);this.render();b&&A(this,"updatedData")},setState:function(a){var b=this.options,c=this.graph,d=this.graphNeg,e=b.states,b=b.lineWidth,a=a||"";if(this.state!==a)this.state=a,e[a]&&e[a].enabled===!1||(a&&(b=e[a].lineWidth||b+1),c&&!c.dashstyle&&(a={"stroke-width":b},c.attr(a),d&&d.attr(a)))},setVisible:function(a, +b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.userOptions.visible=a===v?!h:a)?"show":"hide";n(["group","dataLabelsGroup","markerGroup","tracker"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&n(d.series,function(a){if(a.options.stacking&&a.visible)a.isDirty=!0});n(c.linkedSeries,function(b){b.setVisible(a,!1)});if(g)d.isDirtyBox=!0;b!==!1&&d.redraw();A(c, +f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===v?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;A(this,a?"select":"unselect")},drawTracker:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,f=a.chart,g=f.pointer,h=f.renderer,i=f.options.tooltip.snap,j=a.tracker,k=b.cursor,l=k&&{cursor:k},k=a.singlePoints,m,p=function(){if(f.hoverSeries!==a)a.onMouseOver()};if(e&&!c)for(m= +e+1;m--;)d[m]==="M"&&d.splice(m+1,0,d[m+1]-i,d[m+2],"L"),(m&&d[m]==="M"||m===e)&&d.splice(m,0,"L",d[m-2]+i,d[m-1]);for(m=0;m=0;d--)g=o(a[d].yBottom,f),da&&i>e?(i=r(a,e),k=2*e-i):ig&&k>e?(k=r(g,e),i=2*e-k):kf?b-f:e-(d.translate(a.y,0,1,0,1)<=e?f:0)));a.barX=n;a.pointWidth=g;b=M(n)<0.5;u=t(n+u)+j;n=t(n)+j;u-=n;v=M(s)<0.5;c=t(s+c)+k;s=t(s)+k;c-=s;b&&(n+=1,u-=1);v&&(s-=1,c+=1);a.shapeType="rect";a.shapeArgs={x:n,y:s,width:u,height:c}})}, +getSymbol:oa,drawLegendSymbol:G.prototype.drawLegendSymbol,drawGraph:oa,drawPoints:function(){var a=this,b=a.options,c=a.chart.renderer,d;n(a.points,function(e){var f=e.plotY,g=e.graphic;if(f!==v&&!isNaN(f)&&e.y!==null)d=e.shapeArgs,g?(Wa(g),g.animate(x(d))):e.graphic=c[e.shapeType](d).attr(e.pointAttr[e.selected?"select":""]).add(a.group).shadow(b.shadow,null,b.stacking&&!b.borderRadius);else if(g)e.graphic=g.destroy()})},drawTracker:function(){var a=this,b=a.chart,c=b.pointer,d=a.options.cursor, +e=d&&{cursor:d},f=function(c){var d=c.target,e;if(b.hoverSeries!==a)a.onMouseOver();for(;d&&!e;)e=d.point,d=d.parentNode;if(e!==v&&e!==b.hoverPoint)e.onMouseOver(c)};n(a.points,function(a){if(a.graphic)a.graphic.element.point=a;if(a.dataLabel)a.dataLabel.element.point=a});if(!a._hasTracking)n(a.trackerGroups,function(b){if(a[b]&&(a[b].addClass("highcharts-tracker").on("mouseover",f).on("mouseout",function(a){c.onTrackerMouseOut(a)}).css(e),jb))a[b].on("touchstart",f)}),a._hasTracking=!0},alignDataLabel:function(a, +b,c,d,e){var f=this.chart,g=f.inverted,h=a.dlBox||a.shapeArgs,i=a.below||a.plotY>o(this.translatedThreshold,f.plotSizeY),j=o(c.inside,!!this.options.stacking);if(h&&(d=x(h),g&&(d={x:f.plotWidth-d.y-d.height,y:f.plotHeight-d.x-d.width,width:d.height,height:d.width}),!j))g?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0);c.align=o(c.align,!g||j?"center":i?"right":"left");c.verticalAlign=o(c.verticalAlign,g||j?"middle":i?"top":"bottom");Q.prototype.alignDataLabel.call(this,a,b,c,d,e)},animate:function(a){var b= +this.yAxis,c=this.options,d=this.chart.inverted,e={};if(W)a?(e.scaleY=0.001,a=J(b.pos+b.len,r(b.pos,b.toPixels(c.threshold))),d?e.translateX=a-b.len:e.translateY=a,this.group.attr(e)):(e.scaleY=1,e[d?"translateX":"translateY"]=b.pos,this.group.animate(e,this.options.animation),this.animate=null)},remove:function(){var a=this,b=a.chart;b.hasRendered&&n(b.series,function(b){if(b.type===a.type)b.isDirty=!0});Q.prototype.remove.apply(a,arguments)}});X.column=F;Z.bar=x(Z.column);la=ha(F,{type:"bar",inverted:!0}); +X.bar=la;Z.scatter=x(Y,{lineWidth:0,tooltip:{headerFormat:'{series.name}
    ',pointFormat:"x: {point.x}
    y: {point.y}
    ",followPointer:!0},stickyTracking:!1});la=ha(Q,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["markerGroup"],takeOrdinalPosition:!1,drawTracker:F.prototype.drawTracker,setTooltipPoints:oa});X.scatter=la;Z.pie=x(Y,{borderColor:"#FFFFFF",borderWidth:1,center:[null,null],clip:!1, +colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name}},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});Y={type:"pie",isCartesian:!1,pointClass:ha(Pa,{init:function(){Pa.prototype.init.apply(this,arguments);var a=this,b;if(a.y<0)a.y=null;s(a,{visible:a.visible!==!1,name:o(a.name,"Slice")});b=function(b){a.slice(b.type==="select")}; +K(a,"select",b);K(a,"unselect",b);return a},setVisible:function(a){var b=this,c=b.series,d=c.chart,e;b.visible=b.options.visible=a=a===v?!b.visible:a;c.options.data[pa(b,c.data)]=b.options;e=a?"show":"hide";n(["graphic","dataLabel","connector","shadowGroup"],function(a){if(b[a])b[a][e]()});b.legendItem&&d.legend.colorizeItem(b,a);if(!c.isDirty&&c.options.ignoreHiddenPoint)c.isDirty=!0,d.redraw()},slice:function(a,b,c){var d=this.series;La(c,d.chart);o(b,!0);this.sliced=this.options.sliced=a=u(a)? +a:!this.sliced;d.options.data[pa(this,d.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)}}),requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:oa,animate:function(a){var b=this,c=b.points,d=b.startAngleRad;if(!a)n(c,function(a){var c=a.graphic,a=a.shapeArgs;c&&(c.attr({r:b.center[3]/ +2,start:d,end:d}),c.animate({r:a.r,start:a.start,end:a.end},b.options.animation))}),b.animate=null},setData:function(a,b){Q.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();o(b,!0)&&this.chart.redraw()},generatePoints:function(){var a,b=0,c,d,e,f=this.options.ignoreHiddenPoint;Q.prototype.generatePoints.call(this);c=this.points;d=c.length;for(a=0;a0?e.y/b*100:0,e.total=b},getCenter:function(){var a= +this.options,b=this.chart,c=2*(a.slicedOffset||0),d,e=b.plotWidth-2*c,f=b.plotHeight-2*c,b=a.center,a=[o(b[0],"50%"),o(b[1],"50%"),a.size||"100%",a.innerSize||0],g=J(e,f),h;return Na(a,function(a,b){h=/%$/.test(a);d=b<2||b===2&&h;return(h?[e,f,g,g][b]*y(a)/100:a)+(d?c:0)})},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g,h,i=c.startAngle||0,j=this.startAngleRad=xa/180*(i-90),i=(this.endAngleRad=xa/180*((c.endAngle||i+360)-90))-j,k=this.points, +l=c.dataLabels.distance,c=c.ignoreHiddenPoint,m,n=k.length,o;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h=R.asin((b-a[1])/(a[2]/2+l));return a[0]+(c?-1:1)*V(h)*(a[2]/2+l)};for(m=0;m0.75*i&&(h-=2*xa);o.slicedTranslation={translateX:t(V(h)*d),translateY:t(ba(h)*d)};f=V(h)*a[2]/2;g=ba(h)*a[2]/2;o.tooltipPos= +[a[0]+f*0.7,a[1]+g*0.7];o.half=h<-xa/2||h>xa/2?1:0;o.angle=h;e=J(e,l/2);o.labelPos=[a[0]+f+V(h)*l,a[1]+g+ba(h)*l,a[0]+f+V(h)*e,a[1]+g+ba(h)*e,a[0]+f,a[1]+g,l<0?"center":o.half?"right":"left",h]}},setTooltipPoints:oa,drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g;if(e&&!a.shadowGroup)a.shadowGroup=b.g("shadow").add(a.group);n(a.points,function(h){d=h.graphic;g=h.shapeArgs;f=h.shadowGroup;if(e&&!f)f=h.shadowGroup=b.g("shadow").add(a.shadowGroup);c=h.sliced? +h.slicedTranslation:{translateX:0,translateY:0};f&&f.attr(c);d?d.animate(s(g,c)):h.graphic=d=b.arc(g).setRadialReference(a.center).attr(h.pointAttr[h.selected?"select":""]).attr({"stroke-linejoin":"round"}).attr(c).add(a.group).shadow(e,f);h.visible===!1&&h.setVisible(!1)})},sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!==void 0&&(d.angle-a.angle)*b})},drawDataLabels:function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=o(e.connectorPadding,10),g=o(e.connectorWidth,1), +h=d.plotWidth,d=d.plotHeight,i,j,k=o(e.softConnector,!0),l=e.distance,m=a.center,p=m[2]/2,q=m[1],u=l>0,s,v,w,x,y=[[],[]],z,A,E,H,C,D=[0,0,0,0],J=function(a,b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){Q.prototype.drawDataLabels.apply(a);n(b,function(a){a.dataLabel&&y[a.half].push(a)});for(H=0;!x&&b[H];)x=b[H]&&b[H].dataLabel&&(b[H].dataLabel.getBBox().height||21),H++;for(H=2;H--;){var b=[],I=[],G=y[H],K=G.length,F;a.sortByAngle(G,H-0.5);if(l>0){for(C=q-p-l;C<=q+p+l;C+=x)b.push(C); +v=b.length;if(K>v){c=[].concat(G);c.sort(J);for(C=K;C--;)c[C].rank=C;for(C=K;C--;)G[C].rank>=v&&G.splice(C,1);K=G.length}for(C=0;C0){if(v=I.pop(),F=v.i,A=v.y,c>A&&b[F+1]!==null||ch-f&&(D[1]=r(t(z+v-h+f),D[1])),A-x/2<0?D[0]=r(t(-A+x/2),D[0]):A+x/2>d&&(D[2]=r(t(A+x/2-d),D[2]))}}if(ua(D)===0||this.verifyDataLabelOverflow(D))this.placeDataLabels(),u&&g&&n(this.points,function(b){i=b.connector;w=b.labelPos;if((s=b.dataLabel)&& +s._pos)E=s._attr.visibility,z=s.connX,A=s.connY,j=k?["M",z+(w[6]==="left"?5:-5),A,"C",z,A,2*w[2]-w[4],2*w[3]-w[5],w[2],w[3],"L",w[4],w[5]]:["M",z+(w[6]==="left"?5:-5),A,"L",w[2],w[3],"L",w[4],w[5]],i?(i.animate({d:j}),i.attr("visibility",E)):b.connector=i=a.chart.renderer.path(j).attr({"stroke-width":g,stroke:e.connectorColor||b.color||"#606060",visibility:E}).add(a.group);else if(i)b.connector=i.destroy()})}},verifyDataLabelOverflow:function(a){var b=this.center,c=this.options,d=c.center,e=c=c.minSize|| +80,f;d[0]!==null?e=r(b[2]-r(a[1],a[3]),c):(e=r(b[2]-a[1]-a[3],c),b[0]+=(a[3]-a[1])/2);d[1]!==null?e=r(J(e,b[2]-r(a[0],a[2])),c):(e=r(J(e,b[2]-a[0]-a[2]),c),b[1]+=(a[0]-a[2])/2);e)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v="sizzle"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",W="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",$=W.replace("w","w#"),B="\\["+M+"*("+W+")"+M+"*(?:([*^$|!~]?=)"+M+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+$+")|)|)"+M+"*\\]",I=":("+W+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+B.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=RegExp("^"+M+"*,"+M+"*"),X=RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=RegExp(M+"*[+~]"),Y=RegExp("="+M+"*([^\\]'\"]*)"+M+"*\\]","g"),V=RegExp(I),G=RegExp("^"+$+"$"),J={ID:RegExp("^#("+W+")"),CLASS:RegExp("^\\.("+W+")"),TAG:RegExp("^("+W.replace("w","w*")+")"),ATTR:RegExp("^"+B),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:RegExp("^(?:"+R+")$","i"),needsContext:RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Q=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\d$/i,tt=/'|\\/g,nt=RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),rt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||"string"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute("id"))?m=g.replace(tt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split("|"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent("onbeforeunload",function(){c()}),n.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML="
    ",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute("id")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ut(function(e){var n=t.createElement("input");n.setAttribute("type","hidden"),e.appendChild(n).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",I)}),d=d.length&&RegExp(d.join("|")),g=g.length&&RegExp(g.join("|")),y=Q.test(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,"='$1']"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||"").replace(nt,rt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ot.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(nt,rt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ot.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ot.error("unsupported pseudo: "+e);return r[v]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,"$1"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||"")||ot.error("unsupported lang: "+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return et.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z," ")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,a)||r,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x="0",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&"ID"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split("").sort(S).join("")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement("div"))}),ut(function(e){return e.innerHTML="
    ","#"===e.firstChild.getAttribute("href")})||lt("type|href|height|width",function(e,t,n){return n?undefined:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||lt("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&"string"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t) +};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n\f]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},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(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,"string"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return Z(e,"nextSibling")},prev:function(e){return Z(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,nt=/<([\w:]+)/,rt=/<|&#?\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\s*(?:[^=]|=\s*.checked.)/i,at=/^$|\/(?:java|ecma)script/i,ut=/^true\/(.*)/,lt=/^\s*\s*$/g,ct={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(tt,"<$1>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,"script"),s.length>0&&dt(s,!u&&mt(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,"<$1>")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(t.createTextNode(i));f.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),"script"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||"")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}});function pt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ot.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp("^("+b+")(.*)$","i"),Ct=RegExp("^("+b+")(?!px)[a-z%]+$","i"),kt=RegExp("^([+-])=("+b+")","i"),Nt={BODY:"block"},Et={position:"absolute",visibility:"hidden",display:"block"},St={letterSpacing:0,fontWeight:400},jt=["Top","Right","Bottom","Left"],Dt=["Webkit","O","Moz","ms"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[s]=q.access(r,"olddisplay",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),"normal"===i&&t in St&&(i=St[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ft(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+jt[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+jt[o]+"Width",!0,i))):(s+=x.css(e,"padding"+jt[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+jt[o]+"Width",!0,i)));return s}function Pt(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?"border":"content"),r,o)+"px"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),"none"!==n&&n||(xt=(xt||x("