From 8306211456517823a2a943e2634e4b2f7708415a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 6 Sep 2017 09:13:14 +1200 Subject: [PATCH 01/82] Update django from 1.11.4 to 1.11.5 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 009babc1c..3085f3389 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,7 +1,7 @@ # Base dependencies go here # Django -django==1.11.4 +django==1.11.5 django-autoslug==1.9.3 django-grappelli==2.10.1 From 7358cf9d0586f6e10699b100ec6edba50081579a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 24 Sep 2017 08:17:41 +1300 Subject: [PATCH 02/82] Update whitenoise from 3.3.0 to 3.3.1 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 3085f3389..7215a4e88 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -7,7 +7,7 @@ django-grappelli==2.10.1 # Configuration django-environ==0.4.4 -whitenoise==3.3.0 +whitenoise==3.3.1 django-storages==1.6.5 # Python-PostgreSQL Database Adapter From 81f6c76f3405cd2c5dcfccb9dff5aac3cddaff61 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 10 Oct 2017 06:43:06 +1300 Subject: [PATCH 03/82] Update pydocstyle from 2.0.0 to 2.1.1 --- requirements/testing.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/testing.txt b/requirements/testing.txt index d38930e29..84218d013 100644 --- a/requirements/testing.txt +++ b/requirements/testing.txt @@ -3,7 +3,7 @@ # Check Python style flake8==3.4.1 -pydocstyle==2.0.0 +pydocstyle==2.1.1 # Coverage Tools coverage==4.4.1 From daa8916da2f71c1a3a8229eb688cb205a3925c8b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 24 Oct 2017 12:14:29 +1300 Subject: [PATCH 04/82] Update flake8 from 3.4.1 to 3.5.0 --- requirements/testing.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/testing.txt b/requirements/testing.txt index d38930e29..924a933f6 100644 --- a/requirements/testing.txt +++ b/requirements/testing.txt @@ -2,7 +2,7 @@ -r base.txt # Check Python style -flake8==3.4.1 +flake8==3.5.0 pydocstyle==2.0.0 # Coverage Tools From 844c48ef9cb95416f344fa62f99dacac06e17dbb Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 16 Nov 2017 08:38:07 +1300 Subject: [PATCH 05/82] Update django-debug-toolbar from 1.8 to 1.9.1 --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index db4178768..c0254a6cb 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -3,4 +3,4 @@ -r testing.txt # Debugging Tools -django-debug-toolbar==1.8 +django-debug-toolbar==1.9.1 From 5f995116d8d26b693b5ae430ab684ab4b1dc8f86 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 20 Dec 2017 00:24:26 +1300 Subject: [PATCH 06/82] Update django-tinymce from 2.6.0 to 2.7.0 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 7215a4e88..566c4d5e8 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -26,4 +26,4 @@ Pillow==4.2.1 google-cloud-storage==1.4.0 # Text editor -django-tinymce==2.6.0 +django-tinymce==2.7.0 From a06af180c37aa681801aba7564ea0c3921c32f50 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 7 Jan 2018 03:11:17 +1300 Subject: [PATCH 07/82] Update argon2-cffi from 16.3.0 to 18.1.0 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 7215a4e88..908afd2e3 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -14,7 +14,7 @@ django-storages==1.6.5 psycopg2==2.7.3.1 # Password storage -argon2-cffi==16.3.0 +argon2-cffi==18.1.0 # Maps django-google-maps==0.7.0 From 7c0b98de9b0802d12898a81cabba89e549bd875e Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 28 Jan 2018 03:07:48 +1300 Subject: [PATCH 08/82] Update django-grappelli from 2.10.1 to 2.11.1 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 7215a4e88..478fd37e1 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -3,7 +3,7 @@ # Django django==1.11.5 django-autoslug==1.9.3 -django-grappelli==2.10.1 +django-grappelli==2.11.1 # Configuration django-environ==0.4.4 From fb4fb704dd0c89cfc8227eb143c90fc35a256a99 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 11 Feb 2018 23:25:15 +1300 Subject: [PATCH 09/82] Update coverage from 4.4.1 to 4.5.1 --- requirements/testing.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/testing.txt b/requirements/testing.txt index 924a933f6..6fa23f16c 100644 --- a/requirements/testing.txt +++ b/requirements/testing.txt @@ -6,4 +6,4 @@ flake8==3.5.0 pydocstyle==2.0.0 # Coverage Tools -coverage==4.4.1 +coverage==4.5.1 From 59e8b25a0ad130aa1698cf1476bee342a858987d Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 21 Feb 2018 01:09:32 +1300 Subject: [PATCH 10/82] Update django-google-maps from 0.7.0 to 0.10.1 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 7215a4e88..295e96ebd 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -17,7 +17,7 @@ psycopg2==2.7.3.1 argon2-cffi==16.3.0 # Maps -django-google-maps==0.7.0 +django-google-maps==0.10.1 # Images Pillow==4.2.1 From 85c70f1f186284c2d6f8a27ef91b5590b3f24e57 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Sat, 24 Mar 2018 21:26:40 +1300 Subject: [PATCH 11/82] Switch Heroku setup to Docker GCP App Engine system --- .coveragerc | 9 +- .dockerignore | 2 + .travis.yml | 45 +-- Dockerfile | 20 ++ Dockerfile-local | 20 ++ Procfile | 2 - app.json | 26 -- cs4teachers/config/settings/base.py | 10 +- cs4teachers/config/settings/local.py | 25 +- cs4teachers/config/settings/production.py | 21 +- cs4teachers/config/settings/testing.py | 9 +- cs4teachers/config/wsgi.py | 11 +- cs4teachers/docker-development-entrypoint.sh | 27 ++ cs4teachers/docker-production-entrypoint.sh | 8 + cs4teachers/gulpfile.js | 155 +++++++++ cs4teachers/gunicorn.conf.py | 6 + cs4teachers/package.json | 25 ++ docker-compose.yml | 34 ++ helper | 340 +++++++++++++++++++ infrastructure/nginx/Dockerfile | 14 + infrastructure/nginx/nginx.conf | 31 ++ requirements.txt | 3 - requirements/base.txt | 12 +- requirements/production.txt | 4 +- requirements/testing.txt | 7 +- runtime.txt | 1 - setup.cfg | 11 +- 27 files changed, 796 insertions(+), 82 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 Dockerfile-local delete mode 100644 Procfile delete mode 100644 app.json create mode 100755 cs4teachers/docker-development-entrypoint.sh create mode 100755 cs4teachers/docker-production-entrypoint.sh create mode 100644 cs4teachers/gulpfile.js create mode 100644 cs4teachers/gunicorn.conf.py create mode 100644 cs4teachers/package.json create mode 100644 docker-compose.yml create mode 100755 helper create mode 100644 infrastructure/nginx/Dockerfile create mode 100644 infrastructure/nginx/nginx.conf delete mode 100644 requirements.txt delete mode 100644 runtime.txt diff --git a/.coveragerc b/.coveragerc index 9707d2ab8..0390148fd 100644 --- a/.coveragerc +++ b/.coveragerc @@ -7,4 +7,11 @@ source = omit = # Omit migration files */migrations/* - */wsgi.py + # Omit settings files for local and production environments + # TODO: Add integration tests for local and production environments + */config/settings/* + # Omit pregenerated files + */config/wsgi.py + +[report] +fail_under=20 diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..7139353da --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +cs4teachers/build/* +cs4teachers/node_modules/* diff --git a/.travis.yml b/.travis.yml index a2b8e2b3d..94b64f9f9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,30 +1,33 @@ -dist: trusty sudo: required -language: python -python: - - "3.6" services: - - postgresql -addons: - postgresql: "9.6" + - docker env: - - DJANGO_SETTINGS_MODULE=config.settings.testing -install: pip install -r requirements/testing.txt -before_script: - - psql -c 'create database cs4teachers;' -U postgres -script: - - python cs4teachers/manage.py migrate - - python cs4teachers/manage.py collectstatic --no-input --clear - - coverage run cs4teachers/manage.py test tests --settings=config.settings.testing -v=3 - - flake8 - - pydocstyle --count --explain -after_success: - - coverage xml -i - - coverage report -m --skip-covered - - bash <(curl -s https://codecov.io/bash) + - DOCKER_COMPOSE_VERSION=1.11.2 +language: python +python: + - '3.6' +before_install: + # See https://github.com/travis-ci/travis-ci/issues/7940 + - sudo rm -f /etc/boto.cfg +install: + - sudo docker --version + - sudo docker-compose --version +jobs: + include: + - stage: test + - script: ./helper ci test_suite + - script: ./helper ci test_backwards + if: type = pull_request + - script: ./helper ci style notifications: email: false slack: rooms: deptfunstuff:abJKvzApk5SKtcEyAgtswXAv on_success: change on_failure: change +stages: + - name: test + - name: develop deploy + if: branch = develop + - name: production deploy + if: branch = master diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..2b912219f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +FROM uccser/django:1.11.11 + +# Add metadata to Docker image +LABEL maintainer="csse-education-research@canterbury.ac.nz" + +# Set terminal to be noninteractive +ARG DEBIAN_FRONTEND=noninteractive +ENV DJANGO_PRODUCTION=True + +EXPOSE 8080 +RUN mkdir /cs4teachers +WORKDIR /cs4teachers + +# Copy and install Python dependencies +COPY requirements /requirements +RUN /docker_venv/bin/pip3 install -r /requirements/production.txt + +ADD ./cs4teachers /cs4teachers/ + +CMD /cs4teachers/docker-production-entrypoint.sh diff --git a/Dockerfile-local b/Dockerfile-local new file mode 100644 index 000000000..01f10e6f7 --- /dev/null +++ b/Dockerfile-local @@ -0,0 +1,20 @@ +FROM uccser/django:1.11.11 + +# Add metadata to Docker image +LABEL maintainer="csse-education-research@canterbury.ac.nz" + +# Set terminal to be noninteractive +ARG DEBIAN_FRONTEND=noninteractive + +ENV DJANGO_PRODUCTION=False +EXPOSE 8080 + +# Copy and create virtual environment +COPY requirements /requirements + +# Install dependencies +RUN /docker_venv/bin/pip3 install -r /requirements/local.txt + +RUN mkdir /cs4teachers/ +RUN mkdir /cs4teachers/cs4teachers/ +WORKDIR /cs4teachers/cs4teachers/ diff --git a/Procfile b/Procfile deleted file mode 100644 index 4b5a73bfa..000000000 --- a/Procfile +++ /dev/null @@ -1,2 +0,0 @@ -release: python cs4teachers/manage.py migrate -web: gunicorn --pythonpath cs4teachers config.wsgi --log-file=- diff --git a/app.json b/app.json deleted file mode 100644 index 68f602e9b..000000000 --- a/app.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "cs4teachers", - "scripts": { - }, - "env": { - "DJANGO_SECRET_KEY": { - "required": true - }, - "DJANGO_SETTINGS_MODULE": { - "required": true - }, - "DATABASE_URL": { - "required": true - } - }, - "formation": { - }, - "addons": [ - "heroku-postgresql" - ], - "buildpacks": [ - { - "url": "heroku/python" - } - ] -} diff --git a/cs4teachers/config/settings/base.py b/cs4teachers/config/settings/base.py index dc7f652e2..d7ce5df4b 100644 --- a/cs4teachers/config/settings/base.py +++ b/cs4teachers/config/settings/base.py @@ -12,6 +12,7 @@ """ import environ +import os.path # cs4teachers/cs4teachers/config/settings/base.py - 3 = cs4teachers/ ROOT_DIR = environ.Path(__file__) - 3 @@ -158,14 +159,15 @@ # STATIC FILE CONFIGURATION # ------------------------------------------------------------------------------ # See: https://docs.djangoproject.com/en/dev/ref/settings/#static-root -STATIC_ROOT = str(ROOT_DIR.path("staticfiles")) +STATIC_ROOT = os.path.join(str(ROOT_DIR.path("staticfiles")), "") # See: https://docs.djangoproject.com/en/dev/ref/settings/#static-url +BUILD_ROOT = os.path.join(str(ROOT_DIR.path("build")), "") STATIC_URL = "/staticfiles/" # See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS STATICFILES_DIRS = [ - str(ROOT_DIR.path("static")), + BUILD_ROOT, ] # See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders @@ -254,3 +256,7 @@ ], } TINYMCE_INCLUDE_JQUERY = False + +# OTHER SETTINGS +# ------------------------------------------------------------------------------ +DJANGO_PRODUCTION = env.bool("DJANGO_PRODUCTION") diff --git a/cs4teachers/config/settings/local.py b/cs4teachers/config/settings/local.py index a233527e7..6e2fb0d8f 100644 --- a/cs4teachers/config/settings/local.py +++ b/cs4teachers/config/settings/local.py @@ -8,19 +8,19 @@ from .base import * # noqa: F403 -# DEBUG -# ---------------------------------------------------------------------------- -DEBUG = env.bool("DJANGO_DEBUG", default=True) # noqa: F405 -TEMPLATES[0]["OPTIONS"]["debug"] = DEBUG # noqa: F405 - # DATABASE CONFIGURATION # ---------------------------------------------------------------------------- # See: https://docs.djangoproject.com/en/dev/ref/settings/#databases DATABASES = { - "default": env.db("DATABASE_URL", default="postgres:///cs4teachers"), # noqa: F405 + "default": env.db("DATABASE_URL"), # noqa: F405 } DATABASES["default"]["ATOMIC_REQUESTS"] = True +# DEBUG +# ---------------------------------------------------------------------------- +DEBUG = env.bool("DJANGO_DEBUG", default=True) # noqa: F405 +TEMPLATES[0]["OPTIONS"]["debug"] = DEBUG # noqa: F405 + # SECRET CONFIGURATION # ---------------------------------------------------------------------------- # See: https://docs.djangoproject.com/en/dev/ref/settings/#secret-key @@ -41,11 +41,24 @@ MIDDLEWARE += ["debug_toolbar.middleware.DebugToolbarMiddleware", ] # noqa: F405 INSTALLED_APPS += ["debug_toolbar", ] # noqa: F405 INTERNAL_IPS = ["127.0.0.1"] + + +def show_django_debug_toolbar(request): + """Show Django Debug Toolbar in every request when running locally. + + Args: + request: The request object. + """ + return True + + DEBUG_TOOLBAR_CONFIG = { "DISABLE_PANELS": [ "debug_toolbar.panels.redirects.RedirectsPanel", ], "SHOW_TEMPLATE_CONTEXT": True, + "SHOW_TOOLBAR_CALLBACK": show_django_debug_toolbar, + } # TESTING diff --git a/cs4teachers/config/settings/production.py b/cs4teachers/config/settings/production.py index 163444e74..c9e5c6642 100644 --- a/cs4teachers/config/settings/production.py +++ b/cs4teachers/config/settings/production.py @@ -13,11 +13,28 @@ # Raises ImproperlyConfigured exception if DJANGO_SECRET_KEY not in os.environ SECRET_KEY = env("DJANGO_SECRET_KEY") # noqa: F405 +# SECURITY WARNING: App Engine"s security features ensure that it is safe to +# have ALLOWED_HOSTS = ["*"] when the app is deployed. If you deploy a Django +# app not on App Engine, make sure to set an appropriate host here. +# See https://docs.djangoproject.com/en/dev/ref/settings/ +ALLOWED_HOSTS = ["*"] + +if env("DEPLOYMENT", default=None) == "prod": # noqa: F405 + PREPEND_WWW = True +else: + PREPEND_WWW = False + # DATABASE CONFIGURATION # ---------------------------------------------------------------------------- # See: https://docs.djangoproject.com/en/dev/ref/settings/#databases DATABASES = { - "default": env.db("DATABASE_URL"), # noqa: F405 + "default": { + "ENGINE": "django.db.backends.postgresql", + "NAME": "cs4teachers", + "USER": env("GOOGLE_CLOUD_SQL_DATABASE_USERNAME"), # noqa: F405 + "PASSWORD": env("GOOGLE_CLOUD_SQL_DATABASE_PASSWORD"), # noqa: F405 + "HOST": "/cloudsql/" + env("GOOGLE_CLOUD_SQL_CONNECTION_NAME"), # noqa: F405 + } } DATABASES["default"]["ATOMIC_REQUESTS"] = True @@ -35,6 +52,7 @@ # set this to 60 seconds and then to 518400 when you can prove it works SECURE_HSTS_SECONDS = 60 +SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") SECURE_HSTS_INCLUDE_SUBDOMAINS = env.bool("DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS", default=True) # noqa: F405 SECURE_CONTENT_TYPE_NOSNIFF = env.bool("DJANGO_SECURE_CONTENT_TYPE_NOSNIFF", default=True) # noqa: F405 SECURE_BROWSER_XSS_FILTER = True @@ -44,7 +62,6 @@ CSRF_COOKIE_SECURE = True CSRF_COOKIE_HTTPONLY = True X_FRAME_OPTIONS = "DENY" -INSTALLED_APPS += ["gunicorn", ] # noqa: F405 # Static Assets # ------------------------ diff --git a/cs4teachers/config/settings/testing.py b/cs4teachers/config/settings/testing.py index e7e69334e..d750745fe 100644 --- a/cs4teachers/config/settings/testing.py +++ b/cs4teachers/config/settings/testing.py @@ -8,9 +8,9 @@ # ---------------------------------------------------------------------------- # See: https://docs.djangoproject.com/en/dev/ref/settings/#databases DATABASES = { - "default": env.db("DATABASE_URL", default="postgres:///cs4teachers"), # noqa: F405 + "default": env.db("DATABASE_URL"), # noqa: F405 } -DATABASES['default']['ATOMIC_REQUESTS'] = True +DATABASES["default"]["ATOMIC_REQUESTS"] = True # DEBUG # ---------------------------------------------------------------------------- @@ -55,3 +55,8 @@ "django.template.loaders.app_directories.Loader", ], ], ] +# Your local stuff: Below this line define 3rd party library settings +# ---------------------------------------------------------------------------- +INSTALLED_APPS += [ # noqa: F405 + "test_without_migrations", +] diff --git a/cs4teachers/config/wsgi.py b/cs4teachers/config/wsgi.py index 706eb209f..f3037b692 100644 --- a/cs4teachers/config/wsgi.py +++ b/cs4teachers/config/wsgi.py @@ -4,15 +4,20 @@ It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see -https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/ +https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/ """ import os from django.core.wsgi import get_wsgi_application -from whitenoise.django import DjangoWhiteNoise +# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks +# if running multiple sites in the same mod_wsgi process. To fix this, use +# mod_wsgi daemon mode with each site in its own daemon process, or use +# os.environ["DJANGO_SETTINGS_MODULE"] = "config.settings.production" os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production") +# This application object is used by any WSGI server configured to use this +# file. This includes Django's development server, if the WSGI_APPLICATION +# setting points here. application = get_wsgi_application() -application = DjangoWhiteNoise(application) diff --git a/cs4teachers/docker-development-entrypoint.sh b/cs4teachers/docker-development-entrypoint.sh new file mode 100755 index 000000000..e4423dbb6 --- /dev/null +++ b/cs4teachers/docker-development-entrypoint.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +function postgres_ready(){ +/docker_venv/bin/python << END +import sys +import psycopg2 +try: + conn = psycopg2.connect(dbname="postgres", user="postgres", host="postgres", port="5434") +except psycopg2.OperationalError: + sys.exit(-1) +sys.exit(0) +END +} + +until postgres_ready; do + >&2 echo "Postgres is unavailable - sleeping" + sleep 1 +done + +>&2 echo "Postgres is up - continuing..." + +echo "Compiling message files" +/docker_venv/bin/python3 ./manage.py compilemessages + +# Start gunicorn service +echo "Starting gunicorn" +/docker_venv/bin/gunicorn -c ./gunicorn.conf.py -b :$PORT config.wsgi --reload diff --git a/cs4teachers/docker-production-entrypoint.sh b/cs4teachers/docker-production-entrypoint.sh new file mode 100755 index 000000000..b25354d4b --- /dev/null +++ b/cs4teachers/docker-production-entrypoint.sh @@ -0,0 +1,8 @@ +export DJANGO_SETTINGS_MODULE="config.settings.production" + +echo "Compiling message files" +/docker_venv/bin/python3 ./manage.py compilemessages + +# Start gunicorn service +echo "Starting gunicorn" +/docker_venv/bin/gunicorn -c gunicorn.conf.py -b :8080 config.wsgi diff --git a/cs4teachers/gulpfile.js b/cs4teachers/gulpfile.js new file mode 100644 index 000000000..97eb8a6cf --- /dev/null +++ b/cs4teachers/gulpfile.js @@ -0,0 +1,155 @@ +// gulp build : for a one off development build +// gulp build --production : for a minified production build + +'use strict'; +var gulp = require('gulp'); +var gutil = require('gulp-util'); +var del = require('del'); +var gulpif = require('gulp-if'); +var exec = require('child_process').exec; +var runSequence = require('run-sequence') +var notify = require('gulp-notify'); +var buffer = require('vinyl-buffer'); +var argv = require('yargs').argv; + +// sass +var sass = require('gulp-sass'); +var postcss = require('gulp-postcss'); +var postcssFlexbugFixes = require('postcss-flexbugs-fixes'); +var autoprefixer = require('autoprefixer'); +var sourcemaps = require('gulp-sourcemaps'); + +// linting +var jshint = require('gulp-jshint'); +var stylish = require('jshint-stylish'); + +// gulp build --production +var production = !!argv.production; +// determine if we're doing a build +// and if so, bypass the livereload +var build = argv._.length ? argv._[0] === 'build' : true; + +// ---------------------------- +// Error notification methods +// ---------------------------- +var beep = function() { + var os = require('os'); + var file = 'gulp/error.wav'; + if (os.platform() === 'linux') { + // linux + exec("aplay " + file); + } else { + // mac + console.log("afplay " + file); + exec("afplay " + file); + } +}; +var handleError = function(task) { + return function(err) { + beep(); + + notify.onError({ + message: task + ' failed, check the logs..', + sound: false + })(err); + + gutil.log(gutil.colors.bgRed(task + ' error:'), gutil.colors.red(err)); + }; +}; + +// -------------------------- +// CUSTOM TASK METHODS +// -------------------------- +var tasks = { + // -------------------------- + // Delete build folder + // -------------------------- + clean: function() { + return del(['build/']); + }, + // -------------------------- + // Copy static images + // -------------------------- + images: function() { + return gulp.src('static/img/**/*') + .pipe(gulp.dest('build/img')); + }, + // -------------------------- + // CSS + // -------------------------- + css: function() { + return gulp.src('static/css/**/*.css') + .pipe(gulp.dest('build/css')); + }, + // -------------------------- + // JS + // -------------------------- + js: function() { + return gulp.src('static/js/**/*.js') + .pipe(gulp.dest('build/js')); + }, + // -------------------------- + // SASS (libsass) + // -------------------------- + sass: function() { + return gulp.src('static/scss/*.scss') + // sourcemaps + sass + error handling + .pipe(gulpif(!production, sourcemaps.init())) + .pipe(sass({ + sourceComments: !production, + outputStyle: production ? 'compressed' : 'nested' + })) + .on('error', handleError('SASS')) + // generate .maps + .pipe(gulpif(!production, sourcemaps.write({ + 'includeContent': false, + 'sourceRoot': '.' + }))) + // autoprefixer + .pipe(gulpif(!production, sourcemaps.init({ + 'loadMaps': true + }))) + .pipe(postcss([autoprefixer({browsers: ['last 2 versions']}), postcssFlexbugFixes])) + // we don't serve the source files + // so include scss content inside the sourcemaps + .pipe(sourcemaps.write({ + 'includeContent': true + })) + // write sourcemaps to a specific directory + // give it a file and save + .pipe(gulp.dest('build/css')); + }, + + // -------------------------- + // linting + // -------------------------- + lintjs: function() { + return gulp.src([ + 'gulpfile.js', + 'static/js/index.js', + 'static/js/**/*.js' + ]).pipe(jshint()) + .pipe(jshint.reporter(stylish)) + .on('error', function() { + beep(); + }); + }, +}; + +// // -------------------------- +// // CUSTOMS TASKS +// // -------------------------- +gulp.task('clean', tasks.clean); +// // for production we require the clean method on every individual task +var req = []; +// // individual tasks +gulp.task('images', req, tasks.images); +gulp.task('js', req, tasks.js); +gulp.task('css', req, tasks.css); +gulp.task('sass', req, tasks.sass); +gulp.task('lint:js', tasks.lintjs); + +// // build task +gulp.task('build', function(callback) { + runSequence('clean', ['images', 'css', 'js', 'sass'], callback); +}); diff --git a/cs4teachers/gunicorn.conf.py b/cs4teachers/gunicorn.conf.py new file mode 100644 index 000000000..4bd597133 --- /dev/null +++ b/cs4teachers/gunicorn.conf.py @@ -0,0 +1,6 @@ +"""Configuration file for gunicorn.""" + +# Details from https://cloud.google.com/appengine/docs/flexible/python/runtime +worker_class = "gevent" +forwarded_allow_ips = "*" +secure_scheme_headers = {"X-APPENGINE-HTTPS": "on"} diff --git a/cs4teachers/package.json b/cs4teachers/package.json new file mode 100644 index 000000000..bc210005b --- /dev/null +++ b/cs4teachers/package.json @@ -0,0 +1,25 @@ +{ + "name": "cs4teachers-assets", + "version": "0.0.1", + "main": "gulpfile.js", + "private": true, + "dependencies": { + "autoprefixer": "7.1.6", + "child_process": "1.0.2", + "del": "3.0.0", + "gulp": "3.9.1", + "gulp-if": "2.0.2", + "gulp-jshint": "2.0.4", + "gulp-notify": "3.0.0", + "gulp-postcss": "7.0.0", + "gulp-sass": "3.1.0", + "gulp-sourcemaps": "2.6.1", + "gulp-util": "3.0.8", + "jshint": "2.9.5", + "jshint-stylish": "2.2.1", + "postcss-flexbugs-fixes": "3.2.0", + "run-sequence": "2.2.0", + "vinyl-buffer": "1.0.0", + "yargs": "10.0.3" + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..380207193 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,34 @@ +version: '3' +services: + postgres: + restart: always + image: postgres:9.6.8 + # Set port to non-standard value to not use Travis CI Postgres server. + command: postgres -p 5434 + + django: + build: + context: . + dockerfile: ./Dockerfile-local + command: /cs4teachers/cs4teachers/docker-development-entrypoint.sh + volumes: + - .:/cs4teachers + environment: + - PORT=8080 + - USE_DOCKER=yes + - DATABASE_URL=postgres://postgres@postgres:5434/postgres + - DJANGO_SETTINGS_MODULE=config.settings.local + depends_on: + - postgres + + nginx: + build: + context: . + dockerfile: ./infrastructure/nginx/Dockerfile + volumes: + - ./cs4teachers/:/app/ + - /app/node_modules + depends_on: + - django + ports: + - "82:80" diff --git a/helper b/helper new file mode 100755 index 000000000..35ad37211 --- /dev/null +++ b/helper @@ -0,0 +1,340 @@ +#!/bin/bash +# Helper script for commands related to the cs4teachers repository. +# +# Notes: +# - Changes to template only require user to refresh browser. +# - Changes to static files require the 'static' command to be run. +# - Changes to Python code are detected by gunicorn and should take effect +# on the server after a few seconds. + +set -e + +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color + +cmd_helps=() +dev_cmd_helps=() + +defhelp() { + if [ "$1" = '-dev' ]; then + local command="${2?}" + local text="${3?}" + local help_str + help_str="$(printf ' %-24s %s' "$command" "$text")" + dev_cmd_helps+=("$help_str") + else + local command="${1?}" + local text="${2?}" + local help_str + help_str="$(printf ' %-24s %s' "$command" "$text")" + cmd_helps+=("$help_str") + fi +} + +# Print out help information +cmd_help() { + echo "Script for performing tasks related to the cs4teachers repository." + echo + echo "Usage: ./helper [COMMAND]" + echo "Replace [COMMAND] with a word from the list below." + echo + echo "COMMAND list:" + for str in "${cmd_helps[@]}"; do + echo -e "$str" + done + echo + echo "DEV_COMMAND list:" + for str in "${dev_cmd_helps[@]}"; do + echo -e "$str" + done +} + +defhelp help 'View all help.' +defhelp 'dev [DEV_COMMAND]' 'Run a developer command.' + +# Start development environment +cmd_start() { + echo "Creating systems..." + docker-compose up -d + echo "" + # Alert user that system is ready + echo -e "\n${GREEN}System is up!${NC}" + echo "Run the command ./helper update to load content." +} + +defhelp start 'Start development environment (this also runs the update command).' + +# Stop development environment +cmd_end() { + echo "Stopping systems... (takes roughly 10 to 20 seconds)" + docker-compose down + echo + echo "Deleting system volumes..." + volumes=($(docker volume ls -qf dangling=true )) + for volume in "${volumes[@]}"; do + docker volume rm "${volume}" + done +} +defhelp end 'Stop development environment.' + +cmd_restart() { + cmd_end + cmd_start +} +defhelp restart 'Stop and then restart development environment.' + +# Run Django migrate and updatedata commands +cmd_update() { + dev_static + + echo "" + dev_migrate + + echo "" + dev_collect_static + echo "" + echo -e "\n${GREEN}Content is loaded!${NC}" + echo "Open your preferred web browser to the URL 'localhost:82'" +} +defhelp update 'Update system ready for use.' + +# Collecting static files +dev_collect_static() { + echo + echo "Collecting static files..." + docker-compose exec django /docker_venv/bin/python3 ./manage.py collectstatic --no-input --clear +} +defhelp -dev collect_static "Collecting static files." + +# Run Django flush command +dev_flush() { + docker-compose exec django /docker_venv/bin/python3 ./manage.py flush +} +defhelp -dev flush 'Run Django flush command.' + +# Run Django makemigrations command +dev_makemigrations() { + echo "Creating database migrations..." + docker-compose exec django /docker_venv/bin/python3 ./manage.py makemigrations +} +defhelp -dev makemigrations 'Run Django makemigrations command.' + +# Run Django migrate command +dev_migrate() { + echo "Applying database migrations..." + docker-compose exec django /docker_venv/bin/python3 ./manage.py migrate +} +defhelp -dev migrate 'Run Django migrate command.' + +# Build Docker images +dev_build() { + echo "Building Docker images..." + docker-compose build + echo + echo "Deleting untagged images..." + untagged_images=($(docker images --no-trunc | grep '' | awk '{print $3}')) + if [[ ${#untagged_images[@]} -gt 0 ]]; then + docker rmi "${untagged_images[@]}" + fi +} +defhelp -dev build 'Build or rebuild Docker images.' + +# Build static files +dev_static() { + echo "Building static files..." + docker-compose exec nginx gulp build +} +defhelp -dev static 'Build static files.' + +# Build production static files +dev_static_prod() { + echo "Building production static files..." + docker-compose exec nginx gulp build --production +} +defhelp -dev static_prod 'Build production static files.' + +# Run shell +dev_shell() { + docker-compose exec django bash +} +defhelp -dev shell "Open shell to Django folder." + +# Run shell +dev_createsuperuser() { + docker-compose exec django /docker_venv/bin/python3 ./manage.py createsuperuser +} +defhelp -dev createsuperuser "Create superuser in Django system." + +# Reboot Django Docker container +dev_reboot_django() { + echo "Rebooting Django Docker container..." + docker-compose restart django +} +defhelp -dev reboot_django 'Reboot Django Docker container.' + +# Run style checks +dev_style() { + echo "Running PEP8 style checker..." + docker-compose exec django /docker_venv/bin/flake8 + pep8_status=$? + echo + echo "Running Python docstring checker..." + docker-compose exec django /docker_venv/bin/pydocstyle --count --explain + pydocstyle_status=$? + ! (( pep8_status || pydocstyle_status )) +} +defhelp -dev style 'Run style checks.' + +# Run test suite +dev_test_suite() { + echo "Running test suite..." + docker-compose exec django /docker_venv/bin/coverage run --rcfile=/cs4teachers/.coveragerc ./manage.py test --settings=config.settings.testing --pattern "test_*.py" -v 3 --nomigrations +} +defhelp -dev test_suite 'Run test suite with code coverage.' + +# Run specific test suite +dev_test_specific() { + echo "Running specific test suite..." + docker-compose exec django /docker_venv/bin/python3 ./manage.py test --settings=config.settings.testing "${1}" -v 3 --nomigrations +} +defhelp -dev test_specific 'Run specific test suite. Pass in parameter of Python test module.' + +# Display test coverage table +dev_test_coverage() { + echo "Displaying test suite coverage..." + docker-compose exec django /docker_venv/bin/coverage xml -i + docker-compose exec django /docker_venv/bin/coverage report -m --skip-covered +} +defhelp -dev test_coverage 'Display code coverage report.' + +# Run test suite backwards for CI testing +dev_test_backwards() { + echo "Running test suite backwards..." + docker-compose exec django /docker_venv/bin/python3 ./manage.py test --settings=config.settings.testing --pattern "test_*.py" --reverse -v 0 --nomigrations +} +defhelp -dev test_backwards 'Run test suite backwards.' + +# Delete all untagged dangling Docker images +cmd_clean() { + echo "If the following commands return an argument not found error," + echo "this is because there is nothing to delete for clean up." + + echo + echo "Deleting unused volumes..." + + unused_volumes=($(docker volume ls -qf dangling=true)) + for vol in "${unused_volumes[@]}"; do + docker volume rm "${vol}" + done + + echo + echo "Deleting exited containers..." + exited_containers=($(docker ps --filter status=dead --filter status=exited -aq)) + for container in "${exited_containers[@]}"; do + docker rm -v "${container}" + done + echo + echo "Deleting dangling images..." + dangling_images=($(docker images -f "dangling=true" -q)) + if [[ ${#dangling_images[@]} -gt 0 ]]; then + docker rmi "${dangling_images[@]}" + fi +} +defhelp clean 'Delete unused Docker files.' + +# Delete all Docker containers and images +cmd_wipe() { + docker ps -a -q | xargs docker rm + docker images -q | xargs docker rmi +} +defhelp wipe 'Delete all Docker containers and images.' + +# View logs +cmd_logs() { + docker-compose logs +} +defhelp logs 'View logs.' + +ci_test_suite() { + dev_static + dev_collect_static + dev_test_suite + test_status=$? + dev_test_coverage + coverage_status=$? + bash <(curl -s https://codecov.io/bash) + ! (( $test_status || $coverage_status )) +} + +ci_style() { + dev_style +} + +ci_test_backwards() { + dev_static + dev_collect_static + dev_test_backwards +} + +ci_load_content() { + cmd_update +} + +cmd_ci() { + cmd_start + local cmd="$1" + shift + if [ -z "$cmd" ]; then + echo -e "${RED}ERROR: ci command requires one parameter!${NC}" + cmd_help + exit 1 + fi + if silent type "ci_$cmd"; then + "ci_$cmd" "$@" + exit $? + else + echo -e "${RED}ERROR: Unknown command!${NC}" + echo "Type './helper help' for available commands." + return 1 + fi +} + +silent() { + "$@" > /dev/null 2>&1 +} + +cmd_dev() { + local cmd="$1" + shift + if [ -z "$cmd" ]; then + echo -e "${RED}ERROR: dev command requires one parameter!${NC}" + cmd_help + return 1 + fi + if silent type "dev_$cmd"; then + "dev_$cmd" "$@" + exit $? + else + echo -e "${RED}ERROR: Unknown command!${NC}" + echo "Type './helper help' for available commands." + return 1 + fi +} + +# If no command given +if [ $# -eq 0 ]; then + echo -e "${RED}ERROR: This script requires a command!${NC}" + cmd_help + exit 1 +fi +cmd="$1" +shift +if silent type "cmd_$cmd"; then + "cmd_$cmd" "$@" + exit $? +else + echo -e "${RED}ERROR: Unknown command!${NC}" + echo "Type './helper help' for available commands." + exit 1 +fi diff --git a/infrastructure/nginx/Dockerfile b/infrastructure/nginx/Dockerfile new file mode 100644 index 000000000..5d2199e2c --- /dev/null +++ b/infrastructure/nginx/Dockerfile @@ -0,0 +1,14 @@ +FROM uccser/nginx-with-gulp:1.13.3 + +RUN apt-get update \ + && apt-get install --no-install-suggests -y \ + libcairo2-dev \ + libpango1.0-dev \ + libjpeg-dev \ + libgif-dev \ + && rm -rf /var/lib/apt/lists/* + +ADD cs4teachers/package.json /app/ +RUN npm install +ADD ./cs4teachers/ /app/ +ADD infrastructure/nginx/nginx.conf /etc/nginx/nginx.conf diff --git a/infrastructure/nginx/nginx.conf b/infrastructure/nginx/nginx.conf new file mode 100644 index 000000000..1b1862045 --- /dev/null +++ b/infrastructure/nginx/nginx.conf @@ -0,0 +1,31 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + include mime.types; + server { + listen 80; + server_name example.org; + + access_log /dev/stdout; + error_log /dev/stdout info; + + location / { + # checks for static file, if not found proxy to app + try_files $uri @proxy_to_app; + expires -1; + alias /app/; + } + + # Gunicorn/Django container + location @proxy_to_app { + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + proxy_redirect off; + proxy_pass http://django:8080; + } + } +} diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index d1197135e..000000000 --- a/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -# This file is here because many Platforms as a Service look for -# requirements.txt in the root directory of a project. --r requirements/production.txt diff --git a/requirements/base.txt b/requirements/base.txt index 7215a4e88..7af84e3af 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,18 +1,16 @@ -# Base dependencies go here +# Wheel 0.25+ needed to install certain packages on CPython 3.5+ +# like Pillow and psycopg2 +# See http://bitly.com/wheel-building-fails-CPython-35 +# Verified bug on Python 3.5.1 +wheel==0.30.0 # Django -django==1.11.5 django-autoslug==1.9.3 django-grappelli==2.10.1 # Configuration -django-environ==0.4.4 -whitenoise==3.3.1 django-storages==1.6.5 -# Python-PostgreSQL Database Adapter -psycopg2==2.7.3.1 - # Password storage argon2-cffi==16.3.0 diff --git a/requirements/production.txt b/requirements/production.txt index f70a44c96..3c15e93b3 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -2,6 +2,4 @@ # production that aren't in development. -r base.txt -# WSGI Handler -gevent==1.2.2 -gunicorn==19.7.1 +gsutil==4.28 diff --git a/requirements/testing.txt b/requirements/testing.txt index 924a933f6..539356482 100644 --- a/requirements/testing.txt +++ b/requirements/testing.txt @@ -3,7 +3,10 @@ # Check Python style flake8==3.5.0 -pydocstyle==2.0.0 +pydocstyle==2.1.1 # Coverage Tools -coverage==4.4.1 +coverage==4.5.1 + +# Skip migration files for local testing +django-test-without-migrations==0.6 diff --git a/runtime.txt b/runtime.txt deleted file mode 100644 index c91e43be5..000000000 --- a/runtime.txt +++ /dev/null @@ -1 +0,0 @@ -python-3.6.1 diff --git a/setup.cfg b/setup.cfg index 8ca301b25..7f73dc29c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -2,14 +2,23 @@ exclude = # No need to traverse our git or venv directories .git, + venv, + docker_venv, # There's no value in checking cache directories __pycache__, # These files are mostly or completely autogenerated migrations, + manage.py, cs4teachers/manage.py, + # This contains our built project files and documentation + build, + + # This contains node_modules that we don't want to check + node_modules, + show-source = True statistics = True count = True @@ -18,4 +27,4 @@ max-line-length = 119 [pydocstyle] # Ignore following rules to allow Google Python Style docstrings add_ignore = D407,D413 -match_dir = (?!migrations).* +match_dir = (?!migrations|node_modules).* From fc5274159d15d61c08ebf4cdfb1200b2f438b772 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Sat, 24 Mar 2018 21:35:24 +1300 Subject: [PATCH 12/82] Remove unused lines in Travis CI config file --- .travis.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 94b64f9f9..2ff74b148 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,6 @@ sudo: required services: - docker -env: - - DOCKER_COMPOSE_VERSION=1.11.2 language: python python: - '3.6' @@ -27,7 +25,3 @@ notifications: on_failure: change stages: - name: test - - name: develop deploy - if: branch = develop - - name: production deploy - if: branch = master From 5782e9a6ea27e510ef931fbe943fd3b19eb495be Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Sat, 24 Mar 2018 21:41:39 +1300 Subject: [PATCH 13/82] Fix syntax error in Travis CI config file --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2ff74b148..d642f4afc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ install: jobs: include: - stage: test - - script: ./helper ci test_suite + script: ./helper ci test_suite - script: ./helper ci test_backwards if: type = pull_request - script: ./helper ci style From 4c3297b0f229ed057e2fb43722ca98de45cd3fc4 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Sun, 25 Mar 2018 13:49:30 +1300 Subject: [PATCH 14/82] Remove unused Pillow dependency --- requirements/base.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index 5b6dc49fe..236255347 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -17,9 +17,6 @@ argon2-cffi==16.3.0 # Maps django-google-maps==0.7.0 -# Images -Pillow==4.2.1 - # Storage google-cloud-storage==1.4.0 From 8bc925c96e5ccb424e95ed39c4dbaf66b9e2b3f3 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Mon, 26 Mar 2018 09:16:57 +1300 Subject: [PATCH 15/82] Use django-storages for media uploads --- cs4teachers/config/settings/production.py | 16 ++++++++++------ cs4teachers/events/models.py | 15 +++++++++------ helper | 10 +++++----- requirements/base.txt | 4 ++-- requirements/production.txt | 2 +- 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/cs4teachers/config/settings/production.py b/cs4teachers/config/settings/production.py index c9e5c6642..ba67f0383 100644 --- a/cs4teachers/config/settings/production.py +++ b/cs4teachers/config/settings/production.py @@ -63,10 +63,6 @@ CSRF_COOKIE_HTTPONLY = True X_FRAME_OPTIONS = "DENY" -# Static Assets -# ------------------------ -STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage" - LOGGING = { "version": 1, "disable_existing_loggers": False, @@ -83,5 +79,13 @@ } } -# Use Google Cloud Platform for storage -DEFAULT_FILE_STORAGE = "config.storage.GoogleCloudStorage" + +# Static and media files +# ------------------------ +INSTALLED_APPS += [ # noqa: F405 + "storages", +] +DEFAULT_FILE_STORAGE = "storages.backends.gcloud.GoogleCloudStorage" +GS_BUCKET_NAME = env("GOOGLE_CLOUD_STORAGE_BUCKET_NAME") +GS_FILE_OVERWRITE = False +STATIC_URL = "https://storage.googleapis.com/" + env("GOOGLE_CLOUD_STORAGE_BUCKET_NAME") + "/static/" # noqa: F405 diff --git a/cs4teachers/events/models.py b/cs4teachers/events/models.py index 56a586f33..5e77470a0 100644 --- a/cs4teachers/events/models.py +++ b/cs4teachers/events/models.py @@ -1,10 +1,13 @@ """Models for the events application.""" +from os.path import join from django.db import models from django.urls import reverse from autoslug import AutoSlugField from django_google_maps import fields as map_fields +UPLOAD_BASE_PATH = "uploads/events" + class Location(models.Model): """Model for location of session.""" @@ -36,7 +39,7 @@ class LocationImage(models.Model): """Model for image of location model.""" name = models.CharField(max_length=255) - image = models.ImageField(upload_to="images/locations/") + image = models.ImageField(upload_to=join(UPLOAD_BASE_PATH, "locations/images/")) location = models.ForeignKey( Location, related_name="images", @@ -57,7 +60,7 @@ class Series(models.Model): slug = AutoSlugField(unique=True, populate_from="name") name = models.CharField(max_length=150) subtitle = models.CharField(max_length=150, blank=True) - logo = models.ImageField(upload_to="images/series/", null=True, blank=True) + logo = models.ImageField(upload_to=join(UPLOAD_BASE_PATH, "series/logos/"), null=True, blank=True) description = models.TextField() def find_closest_event(self): @@ -100,7 +103,7 @@ class Sponsor(models.Model): name = models.CharField(unique=True, max_length=200) url = models.URLField() - logo = models.ImageField(upload_to="images/sponsors/", null=True, blank=True) + logo = models.ImageField(upload_to=join(UPLOAD_BASE_PATH, "sponsors/logos/"), null=True, blank=True) def __str__(self): """Text representation of Sponsor object. @@ -182,7 +185,7 @@ class EventImage(models.Model): """Model for image of event model.""" name = models.CharField(max_length=255) - image = models.ImageField(upload_to="images/events/") + image = models.ImageField(upload_to=join(UPLOAD_BASE_PATH, "events/images/")) event = models.ForeignKey( Event, related_name="images", @@ -204,7 +207,7 @@ class Resource(models.Model): name = models.CharField(max_length=150) url = models.URLField() description = models.TextField(blank=True) - image = models.ImageField(upload_to="images/resources/", null=True, blank=True) + image = models.ImageField(upload_to=join(UPLOAD_BASE_PATH, "resources/images/"), null=True, blank=True) def __str__(self): """Text representation of Resource object. @@ -226,7 +229,7 @@ class Session(models.Model): ) name = models.CharField(max_length=200) description = models.TextField(blank=True) - image = models.ImageField(upload_to="images/sessions/", null=True, blank=True) + image = models.ImageField(join(UPLOAD_BASE_PATH, "sessions/images/"), null=True, blank=True) start_datetime = models.DateTimeField() end_datetime = models.DateTimeField() locations = models.ManyToManyField( diff --git a/helper b/helper index 35ad37211..ef6371900 100755 --- a/helper +++ b/helper @@ -160,12 +160,16 @@ dev_shell() { } defhelp -dev shell "Open shell to Django folder." -# Run shell dev_createsuperuser() { docker-compose exec django /docker_venv/bin/python3 ./manage.py createsuperuser } defhelp -dev createsuperuser "Create superuser in Django system." +dev_sampledata() { + docker-compose exec django /docker_venv/bin/python3 ./manage.py shell -c "from django.contrib.auth.models import User; User.objects.filter(email='admin@example.com').delete(); User.objects.create_superuser('admin', 'admin@example.com', 'password')" +} +defhelp -dev sampledata "Add sample data to website." + # Reboot Django Docker container dev_reboot_django() { echo "Rebooting Django Docker container..." @@ -277,10 +281,6 @@ ci_test_backwards() { dev_test_backwards } -ci_load_content() { - cmd_update -} - cmd_ci() { cmd_start local cmd="$1" diff --git a/requirements/base.txt b/requirements/base.txt index 6477003fc..7d888fa23 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -8,8 +8,8 @@ wheel==0.30.0 django-autoslug==1.9.3 django-grappelli==2.11.1 -# Configuration -django-storages==1.6.5 +# Required for ImageField on models +Pillow==5.0.0 # Password storage argon2-cffi==18.1.0 diff --git a/requirements/production.txt b/requirements/production.txt index 3c15e93b3..143679667 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -2,4 +2,4 @@ # production that aren't in development. -r base.txt -gsutil==4.28 +django-storages==1.6.5 From 0e968ef61f49581cddbaaa02cbb8c1a033e23378 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Mon, 26 Mar 2018 09:20:54 +1300 Subject: [PATCH 16/82] Remove old Google Cloud Storage files --- cs4teachers/config/google_cloud_file.py | 131 ------------------------ cs4teachers/config/storage.py | 103 ------------------- requirements/base.txt | 3 - 3 files changed, 237 deletions(-) delete mode 100644 cs4teachers/config/google_cloud_file.py delete mode 100644 cs4teachers/config/storage.py diff --git a/cs4teachers/config/google_cloud_file.py b/cs4teachers/config/google_cloud_file.py deleted file mode 100644 index 5a0c7e22e..000000000 --- a/cs4teachers/config/google_cloud_file.py +++ /dev/null @@ -1,131 +0,0 @@ -"""Logic for a file that would be in a google cloud bucket.""" -from django.core.files.base import File -from django.utils.encoding import force_bytes -from google.cloud.storage.blob import Blob -from google.cloud.exceptions import NotFound -from tempfile import SpooledTemporaryFile -import os -import logging -import mimetypes - -logger = logging.getLogger(__name__) - - -class GoogleCloudFile(File): - """File logic for reading and writing to Google Cloud bucket files.""" - - def __init__(self, name, mode, bucket): - """Create a GoogleCloudFile handler. - - Args: - name: The name of the file within the bucket (string). - mode: A string of the file mode to open with (string). - bucket: The bucket to load and save to (Bucket). - """ - self.name = name - self.mode = mode - self._mimetype = mimetypes.guess_type(name)[0] - self._is_dirty = False - self._file = None - self._blob = bucket.get_blob(name) - if not self.blob and "w" in mode: - self.blob = Blob(self.name, bucket) - elif not self.blob and "r" in mode: - message = "{} file was not found." - message.format(name) - raise NotFound(message=message) - self.open(mode) - - @property - def size(self): - """Get the size of the file. - - Returns: - The size of the file (int). - """ - if self._is_dirty: - if hasattr(self.file, 'size'): - return self.file.size - if hasattr(self.file, 'tell') and hasattr(self.file, 'seek'): - pos = self.file.tell() - self.file.seek(0, os.SEEK_END) - size = self.file.tell() - self.file.seek(pos) - return size - raise AttributeError("Unable to determine the file's size.") - return self.blob.size - - def _get_file(self): - """Get the underlying file object. - - Returns: - The underlying file object (stream). - """ - if self._file is None: - self.open() - return self._file - - def _set_file(self, value): - """Set the underlying file object. - - Args: - value: The new file object (stream). - """ - self._file = value - - file = property(_get_file, _set_file) - - def open(self, mode=None): - """Open or reopen the file. - - Args: - mode: The mode to file as, similar to pythons open - function (string). - """ - if mode is not None: - self.mode = mode - self._file = None - self._is_dirty = False - - self._file = SpooledTemporaryFile(mode="w+b", suffix=".GoogleCloudFile") - self.blob.download_to_file(self._file) - if "a" not in self.mode: - self._file.seek(0) - - def read(self, num_bytes=None): - """Read from file. - - Args: - num_bytes: The number of bytes to read from the file (int). - Returns: - The bytes read (bytes). - """ - if "r" not in self.mode: - raise AttributeError("File was not opened in read mode.") - - if num_bytes is None: - num_bytes = -1 - - return super(GoogleCloudFile, self).read(num_bytes) - - def write(self, content): - """Write to the file. - - Args: - content: Something to write to the file, if not bytes - will attempt to convert (object). - """ - if "w" not in self.mode or "a" not in self.mode: - raise AttributeError("File was not opened in write mode.") - - self._is_dirty = True - return super(GoogleCloudFile, self).write(force_bytes(content)) - - def close(self): - """Close the file, and save out changes.""" - if self._file is not None: - if ("w" in self.mode or "a" in self.mode) and self._is_dirty: - self._file.seek(0) - self.blob.upload_from_file(self._file, content_type=self.mime_type) - self._file.close() - self._file = None diff --git a/cs4teachers/config/storage.py b/cs4teachers/config/storage.py deleted file mode 100644 index 73100343e..000000000 --- a/cs4teachers/config/storage.py +++ /dev/null @@ -1,103 +0,0 @@ -"""Module for custom Django storage for storing files on Google Cloud Platform.""" - -from .google_cloud_file import GoogleCloudFile -from django.core.files.storage import Storage -from google.cloud.storage.client import Client -from google.cloud.exceptions import GoogleCloudError -from google.oauth2 import service_account -import environ -import logging -import json -import mimetypes - -logger = logging.getLogger(__name__) - - -class GoogleCloudStorage(Storage): - """Custom Django storage for storing files on Google Cloud Platform.""" - - def __init__(self, option=None, *args, **kwargs): - """Create the GoogleCloudStorage object.""" - super().__init__(*args, **kwargs) - self.env = environ.Env() - self.bucket = self.retrieve_bucket() - - def retrieve_bucket(self): - """Return bucket used for storing files. - - Returns: - Bucket object. - """ - project = self.env("GOOGLE_PROJECT") - service_account_file = json.loads(self.env("GOOGLE_APPLICATION_CREDENTIALS")) - credentials = service_account.Credentials.from_service_account_info(service_account_file) - client = Client(project=project, credentials=credentials) - return client.bucket("cs4teachers-static") - - def _open(self, name, mode="rb"): - """Mechanism used by the Django storage class to open the file. - - Called by Storage.open(). - - Args: - name (str): Name of the file. - mode (str): Mode to open the file. - - Returns: - GoogleCloudFile object of the file. - """ - return GoogleCloudFile(name, mode, self.bucket) - - def exists(self, name): - """Return boolean if file already exists in storage. - - Args: - name (str): Name of file. - - Returns: - True if a file referenced by the given name already exists in the - storage system, or False if the name is available for a new file. - """ - blob = self.bucket.blob(name) - return blob.exists() - - def _save(self, name, content): - """Mechanism used by the Django storage class to save the file. - - Called by Storage.save(). - - Args: - name (str): Name of the file. - content (File): Content of the file. - - Returns: - Actual name of the file saved (may be different to name given) (str). - """ - mimetype = mimetypes.guess_type(name)[0] - try: - blob = self.bucket.blob(name) - blob.upload_from_file(content, content_type=mimetype) - return blob.public_url - - except GoogleCloudError as e: - message = "Upload of file {} failed with error: {}" - message.format(name, e) - logger.error(message) - return None - - def delete(self, name): - """Delete a file. - - Args: - name (str): Name of file to delete. - """ - blob = self.bucket.blob(name) - blob.delete() - - def url(self, name): - """Return URL where the file referenced by name can be accessed. - - Args: - name (str): Name of file to delete. - """ - return self.bucket.blob(name).public_url diff --git a/requirements/base.txt b/requirements/base.txt index 7d888fa23..d5de8935a 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -17,8 +17,5 @@ argon2-cffi==18.1.0 # Maps django-google-maps==0.10.1 -# Storage -google-cloud-storage==1.4.0 - # Text editor django-tinymce==2.7.0 From c09b3886878850608458ac4b9c851ced30446e73 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Mon, 26 Mar 2018 11:42:36 +1300 Subject: [PATCH 17/82] Enable email sending --- cs4teachers/config/settings/base.py | 10 +++++++++ cs4teachers/config/settings/local.py | 9 ++++++++ cs4teachers/config/settings/production.py | 25 ++++++++++++++++++++++- requirements/base.txt | 3 +++ 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/cs4teachers/config/settings/base.py b/cs4teachers/config/settings/base.py index d7ce5df4b..b40ebfd3e 100644 --- a/cs4teachers/config/settings/base.py +++ b/cs4teachers/config/settings/base.py @@ -257,6 +257,16 @@ } TINYMCE_INCLUDE_JQUERY = False +# ADMIN +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#admins +ADMINS = [ + ("University of Canterbury Computer Science Research Group", + "csse-education-research@canterbury.ac.nz"), +] +# https://docs.djangoproject.com/en/dev/ref/settings/#managers +MANAGERS = ADMINS + # OTHER SETTINGS # ------------------------------------------------------------------------------ DJANGO_PRODUCTION = env.bool("DJANGO_PRODUCTION") diff --git a/cs4teachers/config/settings/local.py b/cs4teachers/config/settings/local.py index 6e2fb0d8f..7ef25ee46 100644 --- a/cs4teachers/config/settings/local.py +++ b/cs4teachers/config/settings/local.py @@ -64,3 +64,12 @@ def show_django_debug_toolbar(request): # TESTING # ---------------------------------------------------------------------------- TEST_RUNNER = "django.test.runner.DiscoverRunner" + +# EMAIL +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#email-backend +EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" +# https://docs.djangoproject.com/en/dev/ref/settings/#email-host +EMAIL_HOST = "localhost" +# https://docs.djangoproject.com/en/dev/ref/settings/#email-port +EMAIL_PORT = 1025 diff --git a/cs4teachers/config/settings/production.py b/cs4teachers/config/settings/production.py index ba67f0383..7c626c881 100644 --- a/cs4teachers/config/settings/production.py +++ b/cs4teachers/config/settings/production.py @@ -86,6 +86,29 @@ "storages", ] DEFAULT_FILE_STORAGE = "storages.backends.gcloud.GoogleCloudStorage" -GS_BUCKET_NAME = env("GOOGLE_CLOUD_STORAGE_BUCKET_NAME") +GS_BUCKET_NAME = env("GOOGLE_CLOUD_STORAGE_BUCKET_NAME") # noqa: F405 GS_FILE_OVERWRITE = False STATIC_URL = "https://storage.googleapis.com/" + env("GOOGLE_CLOUD_STORAGE_BUCKET_NAME") + "/static/" # noqa: F405 + +# EMAIL +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#default-from-email +DEFAULT_FROM_EMAIL = env( # noqa: F405 + "DJANGO_DEFAULT_FROM_EMAIL", + default="cs4teachers.org.nz " +) +# https://docs.djangoproject.com/en/dev/ref/settings/#server-email +SERVER_EMAIL = env("DJANGO_SERVER_EMAIL", default=DEFAULT_FROM_EMAIL) # noqa: F405 +# https://docs.djangoproject.com/en/dev/ref/settings/#email-subject-prefix +EMAIL_SUBJECT_PREFIX = env("DJANGO_EMAIL_SUBJECT_PREFIX", default="[cs4teachers.org.nz] ") # noqa: F405 + +# Anymail (Mailgun) +# ------------------------------------------------------------------------------ +# https://anymail.readthedocs.io/en/stable/installation/#installing-anymail +INSTALLED_APPS += ["anymail"] # noqa F405 +EMAIL_BACKEND = "anymail.backends.mailgun.EmailBackend" +# https://anymail.readthedocs.io/en/stable/installation/#anymail-settings-reference +ANYMAIL = { + "MAILGUN_API_KEY": env("MAILGUN_API_KEY"), # noqa: F405 + "MAILGUN_SENDER_DOMAIN": env("MAILGUN_DOMAIN") # noqa: F405 +} diff --git a/requirements/base.txt b/requirements/base.txt index d5de8935a..eb3f6a365 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -19,3 +19,6 @@ django-google-maps==0.10.1 # Text editor django-tinymce==2.7.0 + +# Email +django-anymail==2.0 From 15638c8a7eb4c27beab6dd58d00b0058d69d0353 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Mon, 26 Mar 2018 14:30:51 +1300 Subject: [PATCH 18/82] Basic django-allauth setup --- cs4teachers/config/settings/base.py | 16 +++++++++++++++- cs4teachers/config/urls.py | 1 + requirements/base.txt | 3 +++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/cs4teachers/config/settings/base.py b/cs4teachers/config/settings/base.py index b40ebfd3e..b9114e186 100644 --- a/cs4teachers/config/settings/base.py +++ b/cs4teachers/config/settings/base.py @@ -41,6 +41,10 @@ "django_google_maps", "tinymce", "grappelli", + "allauth", + "allauth.account", + "allauth.socialaccount", + "allauth.socialaccount.providers.google", ] # Apps specific for this project go here. @@ -150,7 +154,6 @@ "django.template.context_processors.tz", "django.contrib.messages.context_processors.messages", "config.context_processors.version_number.version_number", - "django.template.context_processors.request", ], }, }, @@ -267,6 +270,17 @@ # https://docs.djangoproject.com/en/dev/ref/settings/#managers MANAGERS = ADMINS +# ALLAUTH +# ------------------------------------------------------------------------------ +# https://django-allauth.readthedocs.io/en/latest/installation.html +AUTHENTICATION_BACKENDS = ( + # Needed to login by username in Django admin, regardless of `allauth` + "django.contrib.auth.backends.ModelBackend", + # `allauth` specific authentication methods, such as login by e-mail + "allauth.account.auth_backends.AuthenticationBackend", +) +LOGIN_REDIRECT_URL = "/" + # OTHER SETTINGS # ------------------------------------------------------------------------------ DJANGO_PRODUCTION = env.bool("DJANGO_PRODUCTION") diff --git a/cs4teachers/config/urls.py b/cs4teachers/config/urls.py index c145a7a39..0f9f67bed 100644 --- a/cs4teachers/config/urls.py +++ b/cs4teachers/config/urls.py @@ -17,6 +17,7 @@ url(r"^grappelli/", include("grappelli.urls")), url(r"^admin/", include(admin.site.urls)), url(r"^tinymce/", include("tinymce.urls")), + url(r"^accounts/", include("allauth.urls")), ] if settings.DEBUG: diff --git a/requirements/base.txt b/requirements/base.txt index eb3f6a365..45a6f2457 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -11,6 +11,9 @@ django-grappelli==2.11.1 # Required for ImageField on models Pillow==5.0.0 +# Users +django-allauth==0.35.0 + # Password storage argon2-cffi==18.1.0 From d5dd044ec246033f134e4208d58d60435b4ad49c Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Thu, 17 Jan 2019 09:12:16 +1300 Subject: [PATCH 19/82] Recreate website from scratch using Django 2.1.5 Built upon the output of cookiecutter-django and merged with our Docker image setup. --- .coveragerc | 16 +- .dockerignore | 5 +- .editorconfig | 33 ++ .gitattributes | 1 + .gitignore | 233 +++++++- .pylintrc | 14 + .travis.yml | 6 +- Dockerfile | 13 +- Dockerfile-local | 10 +- LICENSE | 2 +- README.md | 9 - README.rst | 78 +++ cs4teachers/config/settings/base.py | 286 ---------- cs4teachers/config/settings/local.py | 75 --- cs4teachers/config/settings/production.py | 114 ---- cs4teachers/config/settings/testing.py | 62 --- cs4teachers/config/urls.py | 28 - cs4teachers/config/wsgi.py | 23 - cs4teachers/events/__init__.py | 1 - cs4teachers/events/admin.py | 140 ----- cs4teachers/events/apps.py | 9 - cs4teachers/events/migrations/0001_initial.py | 27 - .../events/migrations/0002_event_published.py | 20 - .../migrations/0003_auto_20170614_1648.py | 20 - .../migrations/0004_auto_20170618_0842.py | 49 -- .../migrations/0005_auto_20170618_1700.py | 31 -- .../migrations/0006_auto_20170618_1711.py | 33 -- .../migrations/0007_auto_20170618_1936.py | 25 - .../migrations/0008_auto_20170618_2017.py | 25 - .../migrations/0009_auto_20170618_2019.py | 60 --- .../migrations/0010_auto_20170618_2049.py | 24 - .../migrations/0011_auto_20170618_2103.py | 28 - .../migrations/0012_auto_20170621_1111.py | 23 - .../events/migrations/0013_thirdpartyevent.py | 32 -- .../migrations/0014_auto_20170624_0955.py | 25 - .../migrations/0015_auto_20170624_1512.py | 25 - .../migrations/0016_auto_20170705_0951.py | 35 -- .../migrations/0017_auto_20170705_0952.py | 20 - .../migrations/0018_auto_20170706_0803.py | 41 -- .../migrations/0019_auto_20170706_1326.py | 27 - .../migrations/0020_auto_20170709_1421.py | 29 - .../migrations/0021_auto_20170709_1951.py | 36 -- .../migrations/0022_auto_20170709_2121.py | 20 - .../migrations/0023_auto_20170710_2125.py | 49 -- .../migrations/0024_auto_20170714_1917.py | 32 -- .../migrations/0025_auto_20170714_1921.py | 21 - .../migrations/0026_auto_20170715_0811.py | 28 - .../migrations/0027_auto_20170716_1341.py | 20 - .../migrations/0028_auto_20170716_1544.py | 27 - .../migrations/0029_auto_20170716_1638.py | 20 - .../events/migrations/0030_series_subtitle.py | 20 - .../migrations/0031_auto_20170828_2006.py | 27 - cs4teachers/events/models.py | 279 ---------- cs4teachers/events/urls.py | 57 -- cs4teachers/events/utils.py | 113 ---- cs4teachers/events/views.py | 146 ----- cs4teachers/general/__init__.py | 1 - cs4teachers/general/admin.py | 19 - cs4teachers/general/apps.py | 9 - cs4teachers/general/urls.py | 9 - cs4teachers/general/views.py | 21 - cs4teachers/static/css/bootstrap.min.css | 6 - cs4teachers/static/css/website.css | 62 --- .../static/favicon/android-chrome-192x192.png | Bin 12364 -> 0 bytes .../static/favicon/android-chrome-384x384.png | Bin 27013 -> 0 bytes .../static/favicon/apple-touch-icon.png | Bin 11671 -> 0 bytes cs4teachers/static/favicon/browserconfig.xml | 9 - cs4teachers/static/favicon/favicon-16x16.png | Bin 1091 -> 0 bytes cs4teachers/static/favicon/favicon-32x32.png | Bin 1870 -> 0 bytes cs4teachers/static/favicon/favicon.ico | Bin 15086 -> 0 bytes cs4teachers/static/favicon/manifest.json | 18 - cs4teachers/static/favicon/mstile-150x150.png | Bin 9021 -> 0 bytes .../static/favicon/safari-pinned-tab.svg | 41 -- .../static/img/panorama-cs4hs-2015.jpg | Bin 44625 -> 0 bytes .../uc-computer-science-education-logo.png | Bin 10461 -> 0 bytes cs4teachers/static/js/bootstrap.min.js | 7 - .../static/js/ie10-viewport-bug-workaround.js | 24 - .../static/js/jquery-3.2.1.slim.min.js | 4 - cs4teachers/static/js/tether.min.js | 1 - cs4teachers/static/tinymce/LICENSE.TXT | 504 ------------------ .../tinymce/plugins/advlist/plugin.min.js | 1 - .../tinymce/plugins/autolink/plugin.min.js | 1 - .../tinymce/plugins/autoresize/plugin.min.js | 1 - .../tinymce/plugins/autosave/plugin.min.js | 1 - .../static/tinymce/plugins/code/plugin.min.js | 1 - .../static/tinymce/plugins/hr/plugin.min.js | 1 - .../static/tinymce/plugins/link/plugin.min.js | 1 - .../tinymce/plugins/lists/plugin.min.js | 1 - .../plugins/searchreplace/plugin.min.js | 1 - .../tinymce/plugins/table/plugin.min.js | 2 - .../tinymce/plugins/textcolor/plugin.min.js | 1 - .../skins/lightgray/content.inline.min.css | 1 - .../tinymce/skins/lightgray/content.min.css | 1 - .../skins/lightgray/fonts/tinymce-small.eot | Bin 9492 -> 0 bytes .../skins/lightgray/fonts/tinymce-small.svg | 63 --- .../skins/lightgray/fonts/tinymce-small.ttf | Bin 9304 -> 0 bytes .../skins/lightgray/fonts/tinymce-small.woff | Bin 9380 -> 0 bytes .../tinymce/skins/lightgray/fonts/tinymce.eot | Bin 17572 -> 0 bytes .../tinymce/skins/lightgray/fonts/tinymce.svg | 131 ----- .../tinymce/skins/lightgray/fonts/tinymce.ttf | Bin 17408 -> 0 bytes .../skins/lightgray/fonts/tinymce.woff | Bin 17484 -> 0 bytes .../tinymce/skins/lightgray/img/anchor.gif | Bin 53 -> 0 bytes .../tinymce/skins/lightgray/img/loader.gif | Bin 2608 -> 0 bytes .../tinymce/skins/lightgray/img/object.gif | Bin 152 -> 0 bytes .../tinymce/skins/lightgray/img/trans.gif | Bin 43 -> 0 bytes .../tinymce/skins/lightgray/skin.min.css | 6 - .../static/tinymce/themes/modern/theme.min.js | 1 - cs4teachers/static/tinymce/tinymce.min.js | 16 - cs4teachers/templates/base.html | 86 --- cs4teachers/templates/events/event.html | 127 ----- .../templates/events/events-table.html | 46 -- cs4teachers/templates/events/index.html | 8 - cs4teachers/templates/events/location.html | 21 - cs4teachers/templates/events/resources.html | 19 - cs4teachers/templates/events/series.html | 20 - cs4teachers/templates/events/series_list.html | 40 -- cs4teachers/templates/events/session.html | 44 -- .../templates/events/third-party-badge.html | 1 - .../templates/events/third-party-event.html | 42 -- cs4teachers/templates/flatpages/default.html | 11 - cs4teachers/templates/general/index.html | 43 -- .../templates/generic/map-element.html | 1 - cs4teachers/templates/generic/map-script.html | 22 - cs4teachers/tests/BaseTest.py | 13 - cs4teachers/tests/__init__.py | 1 - .../tests/events/EventDataGenerator.py | 148 ----- cs4teachers/tests/events/__init__.py | 1 - cs4teachers/tests/events/models/__init__.py | 1 - cs4teachers/tests/events/models/test_event.py | 50 -- .../tests/events/models/test_location.py | 57 -- .../tests/events/models/test_resource.py | 57 -- .../tests/events/models/test_sponsor.py | 42 -- .../events/models/test_third_party_event.py | 32 -- cs4teachers/tests/general/__init__.py | 1 - cs4teachers/tests/general/urls/__init__.py | 1 - .../tests/general/urls/test_index_url.py | 12 - helper => dev | 87 ++- docker-compose.yml | 9 +- dthm4kaiako/__init__.py | 7 + .../config/__init__.py | 2 +- .../context_processors/version_number.py | 0 .../config/settings}/__init__.py | 0 dthm4kaiako/config/settings/base.py | 254 +++++++++ dthm4kaiako/config/settings/local.py | 76 +++ dthm4kaiako/config/settings/production.py | 201 +++++++ dthm4kaiako/config/settings/test.py | 55 ++ dthm4kaiako/config/urls.py | 54 ++ dthm4kaiako/config/wsgi.py | 29 + dthm4kaiako/conftest.py | 20 + dthm4kaiako/contrib/__init__.py | 5 + dthm4kaiako/contrib/sites/__init__.py | 5 + .../contrib/sites/migrations/0001_initial.py | 42 ++ .../migrations/0002_alter_domain_unique.py | 20 + .../0003_set_site_domain_and_name.py | 34 ++ .../contrib/sites/migrations/__init__.py | 5 + .../docker-development-entrypoint.sh | 0 .../docker-production-entrypoint.sh | 0 {cs4teachers => dthm4kaiako}/gulpfile.js | 0 {cs4teachers => dthm4kaiako}/gunicorn.conf.py | 0 dthm4kaiako/locale/README.rst | 6 + {cs4teachers => dthm4kaiako}/manage.py | 7 +- {cs4teachers => dthm4kaiako}/package.json | 2 +- .../static/fonts/.gitkeep | 0 dthm4kaiako/static/img/favicons/favicon.ico | Bin 0 -> 8348 bytes dthm4kaiako/static/js/project.js | 1 + dthm4kaiako/static/scss/project.scss | 37 ++ dthm4kaiako/templates/403_csrf.html | 9 + dthm4kaiako/templates/404.html | 9 + dthm4kaiako/templates/500.html | 13 + .../templates/account/account_inactive.html | 12 + dthm4kaiako/templates/account/base.html | 10 + dthm4kaiako/templates/account/email.html | 80 +++ .../templates/account/email_confirm.html | 32 ++ dthm4kaiako/templates/account/login.html | 48 ++ dthm4kaiako/templates/account/logout.html | 22 + .../templates/account/password_change.html | 17 + .../templates/account/password_reset.html | 26 + .../account/password_reset_done.html | 17 + .../account/password_reset_from_key.html | 25 + .../account/password_reset_from_key_done.html | 10 + .../templates/account/password_set.html | 17 + dthm4kaiako/templates/account/signup.html | 23 + .../templates/account/signup_closed.html | 12 + .../templates/account/verification_sent.html | 13 + .../account/verified_email_required.html | 24 + dthm4kaiako/templates/base.html | 90 ++++ dthm4kaiako/templates/pages/about.html | 1 + dthm4kaiako/templates/pages/home.html | 1 + dthm4kaiako/templates/users/user_detail.html | 36 ++ dthm4kaiako/templates/users/user_form.html | 17 + dthm4kaiako/templates/users/user_list.html | 17 + dthm4kaiako/users/__init__.py | 0 dthm4kaiako/users/adapters.py | 18 + dthm4kaiako/users/admin.py | 17 + dthm4kaiako/users/apps.py | 13 + dthm4kaiako/users/forms.py | 31 ++ dthm4kaiako/users/migrations/0001_initial.py | 132 +++++ dthm4kaiako/users/migrations/__init__.py | 0 dthm4kaiako/users/models.py | 14 + dthm4kaiako/users/tests/__init__.py | 0 dthm4kaiako/users/tests/factories.py | 29 + dthm4kaiako/users/tests/test_forms.py | 41 ++ dthm4kaiako/users/tests/test_models.py | 8 + dthm4kaiako/users/tests/test_urls.py | 28 + dthm4kaiako/users/tests/test_views.py | 53 ++ dthm4kaiako/users/urls.py | 16 + dthm4kaiako/users/views.py | 52 ++ infrastructure/nginx/Dockerfile | 4 +- pytest.ini | 2 + requirements/base.txt | 37 +- requirements/local.txt | 31 +- requirements/production.txt | 13 +- requirements/testing.txt | 12 - setup.cfg | 47 +- 214 files changed, 2366 insertions(+), 4336 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .pylintrc delete mode 100644 README.md create mode 100644 README.rst delete mode 100644 cs4teachers/config/settings/base.py delete mode 100644 cs4teachers/config/settings/local.py delete mode 100644 cs4teachers/config/settings/production.py delete mode 100644 cs4teachers/config/settings/testing.py delete mode 100644 cs4teachers/config/urls.py delete mode 100644 cs4teachers/config/wsgi.py delete mode 100644 cs4teachers/events/__init__.py delete mode 100644 cs4teachers/events/admin.py delete mode 100644 cs4teachers/events/apps.py delete mode 100644 cs4teachers/events/migrations/0001_initial.py delete mode 100644 cs4teachers/events/migrations/0002_event_published.py delete mode 100644 cs4teachers/events/migrations/0003_auto_20170614_1648.py delete mode 100644 cs4teachers/events/migrations/0004_auto_20170618_0842.py delete mode 100644 cs4teachers/events/migrations/0005_auto_20170618_1700.py delete mode 100644 cs4teachers/events/migrations/0006_auto_20170618_1711.py delete mode 100644 cs4teachers/events/migrations/0007_auto_20170618_1936.py delete mode 100644 cs4teachers/events/migrations/0008_auto_20170618_2017.py delete mode 100644 cs4teachers/events/migrations/0009_auto_20170618_2019.py delete mode 100644 cs4teachers/events/migrations/0010_auto_20170618_2049.py delete mode 100644 cs4teachers/events/migrations/0011_auto_20170618_2103.py delete mode 100644 cs4teachers/events/migrations/0012_auto_20170621_1111.py delete mode 100644 cs4teachers/events/migrations/0013_thirdpartyevent.py delete mode 100644 cs4teachers/events/migrations/0014_auto_20170624_0955.py delete mode 100644 cs4teachers/events/migrations/0015_auto_20170624_1512.py delete mode 100644 cs4teachers/events/migrations/0016_auto_20170705_0951.py delete mode 100644 cs4teachers/events/migrations/0017_auto_20170705_0952.py delete mode 100644 cs4teachers/events/migrations/0018_auto_20170706_0803.py delete mode 100644 cs4teachers/events/migrations/0019_auto_20170706_1326.py delete mode 100644 cs4teachers/events/migrations/0020_auto_20170709_1421.py delete mode 100644 cs4teachers/events/migrations/0021_auto_20170709_1951.py delete mode 100644 cs4teachers/events/migrations/0022_auto_20170709_2121.py delete mode 100644 cs4teachers/events/migrations/0023_auto_20170710_2125.py delete mode 100644 cs4teachers/events/migrations/0024_auto_20170714_1917.py delete mode 100644 cs4teachers/events/migrations/0025_auto_20170714_1921.py delete mode 100644 cs4teachers/events/migrations/0026_auto_20170715_0811.py delete mode 100644 cs4teachers/events/migrations/0027_auto_20170716_1341.py delete mode 100644 cs4teachers/events/migrations/0028_auto_20170716_1544.py delete mode 100644 cs4teachers/events/migrations/0029_auto_20170716_1638.py delete mode 100644 cs4teachers/events/migrations/0030_series_subtitle.py delete mode 100644 cs4teachers/events/migrations/0031_auto_20170828_2006.py delete mode 100644 cs4teachers/events/models.py delete mode 100644 cs4teachers/events/urls.py delete mode 100644 cs4teachers/events/utils.py delete mode 100644 cs4teachers/events/views.py delete mode 100644 cs4teachers/general/__init__.py delete mode 100644 cs4teachers/general/admin.py delete mode 100644 cs4teachers/general/apps.py delete mode 100644 cs4teachers/general/urls.py delete mode 100644 cs4teachers/general/views.py delete mode 100644 cs4teachers/static/css/bootstrap.min.css delete mode 100644 cs4teachers/static/css/website.css delete mode 100644 cs4teachers/static/favicon/android-chrome-192x192.png delete mode 100644 cs4teachers/static/favicon/android-chrome-384x384.png delete mode 100644 cs4teachers/static/favicon/apple-touch-icon.png delete mode 100644 cs4teachers/static/favicon/browserconfig.xml delete mode 100644 cs4teachers/static/favicon/favicon-16x16.png delete mode 100644 cs4teachers/static/favicon/favicon-32x32.png delete mode 100644 cs4teachers/static/favicon/favicon.ico delete mode 100644 cs4teachers/static/favicon/manifest.json delete mode 100644 cs4teachers/static/favicon/mstile-150x150.png delete mode 100644 cs4teachers/static/favicon/safari-pinned-tab.svg delete mode 100644 cs4teachers/static/img/panorama-cs4hs-2015.jpg delete mode 100644 cs4teachers/static/img/uc-computer-science-education-logo.png delete mode 100644 cs4teachers/static/js/bootstrap.min.js delete mode 100644 cs4teachers/static/js/ie10-viewport-bug-workaround.js delete mode 100644 cs4teachers/static/js/jquery-3.2.1.slim.min.js delete mode 100644 cs4teachers/static/js/tether.min.js delete mode 100644 cs4teachers/static/tinymce/LICENSE.TXT delete mode 100644 cs4teachers/static/tinymce/plugins/advlist/plugin.min.js delete mode 100644 cs4teachers/static/tinymce/plugins/autolink/plugin.min.js delete mode 100644 cs4teachers/static/tinymce/plugins/autoresize/plugin.min.js delete mode 100644 cs4teachers/static/tinymce/plugins/autosave/plugin.min.js delete mode 100644 cs4teachers/static/tinymce/plugins/code/plugin.min.js delete mode 100644 cs4teachers/static/tinymce/plugins/hr/plugin.min.js delete mode 100644 cs4teachers/static/tinymce/plugins/link/plugin.min.js delete mode 100644 cs4teachers/static/tinymce/plugins/lists/plugin.min.js delete mode 100644 cs4teachers/static/tinymce/plugins/searchreplace/plugin.min.js delete mode 100644 cs4teachers/static/tinymce/plugins/table/plugin.min.js delete mode 100644 cs4teachers/static/tinymce/plugins/textcolor/plugin.min.js delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/content.inline.min.css delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/content.min.css delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce-small.eot delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce-small.svg delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce-small.ttf delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce-small.woff delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce.eot delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce.svg delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce.ttf delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce.woff delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/img/anchor.gif delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/img/loader.gif delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/img/object.gif delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/img/trans.gif delete mode 100644 cs4teachers/static/tinymce/skins/lightgray/skin.min.css delete mode 100644 cs4teachers/static/tinymce/themes/modern/theme.min.js delete mode 100644 cs4teachers/static/tinymce/tinymce.min.js delete mode 100644 cs4teachers/templates/base.html delete mode 100644 cs4teachers/templates/events/event.html delete mode 100644 cs4teachers/templates/events/events-table.html delete mode 100644 cs4teachers/templates/events/index.html delete mode 100644 cs4teachers/templates/events/location.html delete mode 100644 cs4teachers/templates/events/resources.html delete mode 100644 cs4teachers/templates/events/series.html delete mode 100644 cs4teachers/templates/events/series_list.html delete mode 100644 cs4teachers/templates/events/session.html delete mode 100644 cs4teachers/templates/events/third-party-badge.html delete mode 100644 cs4teachers/templates/events/third-party-event.html delete mode 100644 cs4teachers/templates/flatpages/default.html delete mode 100644 cs4teachers/templates/general/index.html delete mode 100644 cs4teachers/templates/generic/map-element.html delete mode 100644 cs4teachers/templates/generic/map-script.html delete mode 100644 cs4teachers/tests/BaseTest.py delete mode 100644 cs4teachers/tests/__init__.py delete mode 100644 cs4teachers/tests/events/EventDataGenerator.py delete mode 100644 cs4teachers/tests/events/__init__.py delete mode 100644 cs4teachers/tests/events/models/__init__.py delete mode 100644 cs4teachers/tests/events/models/test_event.py delete mode 100644 cs4teachers/tests/events/models/test_location.py delete mode 100644 cs4teachers/tests/events/models/test_resource.py delete mode 100644 cs4teachers/tests/events/models/test_sponsor.py delete mode 100644 cs4teachers/tests/events/models/test_third_party_event.py delete mode 100644 cs4teachers/tests/general/__init__.py delete mode 100644 cs4teachers/tests/general/urls/__init__.py delete mode 100644 cs4teachers/tests/general/urls/test_index_url.py rename helper => dev (86%) create mode 100644 dthm4kaiako/__init__.py rename {cs4teachers => dthm4kaiako}/config/__init__.py (64%) rename {cs4teachers => dthm4kaiako}/config/context_processors/version_number.py (100%) rename {cs4teachers/events/migrations => dthm4kaiako/config/settings}/__init__.py (100%) create mode 100644 dthm4kaiako/config/settings/base.py create mode 100644 dthm4kaiako/config/settings/local.py create mode 100644 dthm4kaiako/config/settings/production.py create mode 100644 dthm4kaiako/config/settings/test.py create mode 100644 dthm4kaiako/config/urls.py create mode 100644 dthm4kaiako/config/wsgi.py create mode 100644 dthm4kaiako/conftest.py create mode 100644 dthm4kaiako/contrib/__init__.py create mode 100644 dthm4kaiako/contrib/sites/__init__.py create mode 100644 dthm4kaiako/contrib/sites/migrations/0001_initial.py create mode 100644 dthm4kaiako/contrib/sites/migrations/0002_alter_domain_unique.py create mode 100644 dthm4kaiako/contrib/sites/migrations/0003_set_site_domain_and_name.py create mode 100644 dthm4kaiako/contrib/sites/migrations/__init__.py rename {cs4teachers => dthm4kaiako}/docker-development-entrypoint.sh (100%) rename {cs4teachers => dthm4kaiako}/docker-production-entrypoint.sh (100%) rename {cs4teachers => dthm4kaiako}/gulpfile.js (100%) rename {cs4teachers => dthm4kaiako}/gunicorn.conf.py (100%) create mode 100644 dthm4kaiako/locale/README.rst rename {cs4teachers => dthm4kaiako}/manage.py (90%) rename {cs4teachers => dthm4kaiako}/package.json (94%) rename cs4teachers/general/migrations/__init__.py => dthm4kaiako/static/fonts/.gitkeep (100%) create mode 100644 dthm4kaiako/static/img/favicons/favicon.ico create mode 100644 dthm4kaiako/static/js/project.js create mode 100644 dthm4kaiako/static/scss/project.scss create mode 100644 dthm4kaiako/templates/403_csrf.html create mode 100644 dthm4kaiako/templates/404.html create mode 100644 dthm4kaiako/templates/500.html create mode 100644 dthm4kaiako/templates/account/account_inactive.html create mode 100644 dthm4kaiako/templates/account/base.html create mode 100644 dthm4kaiako/templates/account/email.html create mode 100644 dthm4kaiako/templates/account/email_confirm.html create mode 100644 dthm4kaiako/templates/account/login.html create mode 100644 dthm4kaiako/templates/account/logout.html create mode 100644 dthm4kaiako/templates/account/password_change.html create mode 100644 dthm4kaiako/templates/account/password_reset.html create mode 100644 dthm4kaiako/templates/account/password_reset_done.html create mode 100644 dthm4kaiako/templates/account/password_reset_from_key.html create mode 100644 dthm4kaiako/templates/account/password_reset_from_key_done.html create mode 100644 dthm4kaiako/templates/account/password_set.html create mode 100644 dthm4kaiako/templates/account/signup.html create mode 100644 dthm4kaiako/templates/account/signup_closed.html create mode 100644 dthm4kaiako/templates/account/verification_sent.html create mode 100644 dthm4kaiako/templates/account/verified_email_required.html create mode 100644 dthm4kaiako/templates/base.html create mode 100644 dthm4kaiako/templates/pages/about.html create mode 100644 dthm4kaiako/templates/pages/home.html create mode 100644 dthm4kaiako/templates/users/user_detail.html create mode 100644 dthm4kaiako/templates/users/user_form.html create mode 100644 dthm4kaiako/templates/users/user_list.html create mode 100644 dthm4kaiako/users/__init__.py create mode 100644 dthm4kaiako/users/adapters.py create mode 100644 dthm4kaiako/users/admin.py create mode 100644 dthm4kaiako/users/apps.py create mode 100644 dthm4kaiako/users/forms.py create mode 100644 dthm4kaiako/users/migrations/0001_initial.py create mode 100644 dthm4kaiako/users/migrations/__init__.py create mode 100644 dthm4kaiako/users/models.py create mode 100644 dthm4kaiako/users/tests/__init__.py create mode 100644 dthm4kaiako/users/tests/factories.py create mode 100644 dthm4kaiako/users/tests/test_forms.py create mode 100644 dthm4kaiako/users/tests/test_models.py create mode 100644 dthm4kaiako/users/tests/test_urls.py create mode 100644 dthm4kaiako/users/tests/test_views.py create mode 100644 dthm4kaiako/users/urls.py create mode 100644 dthm4kaiako/users/views.py create mode 100644 pytest.ini delete mode 100644 requirements/testing.txt diff --git a/.coveragerc b/.coveragerc index 0390148fd..2a1c2497e 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,17 +1,9 @@ [run] +include = dthm4kaiako/* +omit = *migrations*, *tests* +plugins = + django_coverage_plugin branch = True -source = - config - general - events -omit = - # Omit migration files - */migrations/* - # Omit settings files for local and production environments - # TODO: Add integration tests for local and production environments - */config/settings/* - # Omit pregenerated files - */config/wsgi.py [report] fail_under=20 diff --git a/.dockerignore b/.dockerignore index 7139353da..d046494af 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,3 @@ -cs4teachers/build/* -cs4teachers/node_modules/* +dthm4kaiako/build/* +dthm4kaiako/temp/* +dthm4kaiako/node_modules/* diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..1612d1acb --- /dev/null +++ b/.editorconfig @@ -0,0 +1,33 @@ +# http://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{py,rst,ini}] +indent_style = space +indent_size = 4 + +[*.py] +line_length=120 +known_first_party=dthm4kaiako +multi_line_output=3 +default_section=THIRDPARTY + +[*.{html,css,scss,json,yml}] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab + +[nginx.conf] +indent_style = space +indent_size = 2 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..176a458f9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/.gitignore b/.gitignore index e1b69ab31..a95e80ecf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +cs4teachers### Python template # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -8,7 +9,6 @@ __pycache__/ # Distribution / packaging .Python -env/ build/ develop-eggs/ dist/ @@ -51,16 +51,7 @@ coverage.xml *.pot # Django stuff: -*.log staticfiles/ -media/ - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy # Sphinx documentation docs/_build/ @@ -68,30 +59,16 @@ docs/_build/ # PyBuilder target/ -# Jupyter Notebook -.ipynb_checkpoints - # pyenv .python-version -# celery beat schedule file -celerybeat-schedule -# SageMath parsed files -*.sage.py -# dotenv -.env - -# virtualenv +# Environments .venv venv/ ENV/ -# Spyder project settings -.spyderproject -.spyproject - # Rope project settings .ropeproject @@ -100,3 +77,209 @@ ENV/ # mypy .mypy_cache/ + + +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + + +### Linux template +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + + +### VisualStudioCode template +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + + + + + +### Windows template +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + + +### macOS template +# General +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + + +### SublimeText template +# Cache files for Sublime Text +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache + +# Workspace files are user-specific +*.sublime-workspace + +# Project files should be checked into the repository, unless a significant +# proportion of contributors will probably not be using Sublime Text +# *.sublime-project + +# SFTP configuration file +sftp-config.json + +# Package control specific files +Package Control.last-run +Package Control.ca-list +Package Control.ca-bundle +Package Control.system-ca-bundle +Package Control.cache/ +Package Control.ca-certs/ +Package Control.merged-ca-bundle +Package Control.user-ca-bundle +oscrypto-ca-bundle.crt +bh_unicode_properties.cache + +# Sublime-github package stores a github token in this file +# https://packagecontrol.io/packages/sublime-github +GitHub.sublime-settings + + +### Vim template +# Swap +[._]*.s[a-v][a-z] +[._]*.sw[a-p] +[._]s[a-v][a-z] +[._]sw[a-p] + +# Session +Session.vim + +# Temporary +.netrwhist + +# Auto-generated tag files +tags + + +### VirtualEnv template +# Virtualenv +# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ +[Bb]in +[Ii]nclude +[Ll]ib +[Ll]ib64 +[Ss]cripts +pyvenv.cfg +pip-selfcheck.json +.env + + +### Project template + +dthm4kaiako/media/ + +.pytest_cache/ diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 000000000..feecc1bfa --- /dev/null +++ b/.pylintrc @@ -0,0 +1,14 @@ +[MASTER] +load-plugins=pylint_common, pylint_django + +[FORMAT] +max-line-length=120 + +[MESSAGES CONTROL] +disable=missing-docstring,invalid-name + +[DESIGN] +max-parents=13 + +[TYPECHECK] +generated-members=REQUEST,acl_users,aq_parent,"[a-zA-Z]+_set{1,2}",save,delete diff --git a/.travis.yml b/.travis.yml index d642f4afc..84401cb23 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,10 +13,10 @@ install: jobs: include: - stage: test - script: ./helper ci test_suite - - script: ./helper ci test_backwards + script: ./dev ci test_suite + - script: ./dev ci test_backwards if: type = pull_request - - script: ./helper ci style + - script: ./dev ci style notifications: email: false slack: diff --git a/Dockerfile b/Dockerfile index 2b912219f..21e141987 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,6 @@ -FROM uccser/django:1.11.11 +# This Dockerfile is based off the Google App Engine Python runtime image +# https://github.com/GoogleCloudPlatform/python-runtime +FROM uccser/django:2.1.5 # Add metadata to Docker image LABEL maintainer="csse-education-research@canterbury.ac.nz" @@ -8,13 +10,12 @@ ARG DEBIAN_FRONTEND=noninteractive ENV DJANGO_PRODUCTION=True EXPOSE 8080 -RUN mkdir /cs4teachers -WORKDIR /cs4teachers +RUN mkdir /dthm4kaiako +WORKDIR /dthm4kaiako # Copy and install Python dependencies COPY requirements /requirements RUN /docker_venv/bin/pip3 install -r /requirements/production.txt -ADD ./cs4teachers /cs4teachers/ - -CMD /cs4teachers/docker-production-entrypoint.sh +ADD ./dthm4kaiako /dthm4kaiako/ +CMD /docker_venv/bin/gunicorn -c gunicorn.conf.py -b :8080 config.wsgi diff --git a/Dockerfile-local b/Dockerfile-local index 01f10e6f7..5a5bef4ac 100644 --- a/Dockerfile-local +++ b/Dockerfile-local @@ -1,4 +1,6 @@ -FROM uccser/django:1.11.11 +# This Dockerfile is based off the Google App Engine Python runtime image +# https://github.com/GoogleCloudPlatform/python-runtime +FROM uccser/django:2.1.5 # Add metadata to Docker image LABEL maintainer="csse-education-research@canterbury.ac.nz" @@ -15,6 +17,6 @@ COPY requirements /requirements # Install dependencies RUN /docker_venv/bin/pip3 install -r /requirements/local.txt -RUN mkdir /cs4teachers/ -RUN mkdir /cs4teachers/cs4teachers/ -WORKDIR /cs4teachers/cs4teachers/ +RUN mkdir /dthm4kaiako/ +RUN mkdir /dthm4kaiako/dthm4kaiako/ +WORKDIR /dthm4kaiako/dthm4kaiako/ diff --git a/LICENSE b/LICENSE index e92e1fa27..5133dc9cd 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017 University of Canterbury Computer Science Education Research +Copyright (c) 2019 University of Canterbury Computer Science Education Research Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md deleted file mode 100644 index 6b067f662..000000000 --- a/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Computer Science for Teachers - -This system runs the website for listing [UCCSER](http://www.canterbury.ac.nz/engineering/schools/csse/computer-science-education/) cs4teachers (Computer Science for Teachers) events. -These events are for training New Zealand teachers for teaching Computer Science within primary and secondary schools. - -## License - -The project is licensed under the -[MIT license](https://opensource.org/licenses/MIT) (`LICENSE` file). diff --git a/README.rst b/README.rst new file mode 100644 index 000000000..8d3b2039a --- /dev/null +++ b/README.rst @@ -0,0 +1,78 @@ +dthm4kaiako +=========== + +Website for Digital Technologies & Hangarau Matihiko for Kaiako + +.. image:: https://img.shields.io/badge/built%20with-Cookiecutter%20Django-ff69b4.svg + :target: https://github.com/pydanny/cookiecutter-django/ + :alt: Built with Cookiecutter Django + + +:License: MIT + + +Settings +-------- + +Moved to settings_. + +.. _settings: http://cookiecutter-django.readthedocs.io/en/latest/settings.html + +Basic Commands +-------------- + +Setting Up Your Users +^^^^^^^^^^^^^^^^^^^^^ + +* To create a **normal user account**, just go to Sign Up and fill out the form. Once you submit it, you'll see a "Verify Your E-mail Address" page. Go to your console to see a simulated email verification message. Copy the link into your browser. Now the user's email should be verified and ready to go. + +* To create an **superuser account**, use this command:: + + $ python manage.py createsuperuser + +For convenience, you can keep your normal user logged in on Chrome and your superuser logged in on Firefox (or similar), so that you can see how the site behaves for both kinds of users. + +Type checks +^^^^^^^^^^^ + +Running type checks with mypy: + +:: + + $ mypy dthm4kaiako + +Test coverage +^^^^^^^^^^^^^ + +To run the tests, check your test coverage, and generate an HTML coverage report:: + + $ coverage run -m pytest + $ coverage html + $ open htmlcov/index.html + +Running tests with py.test +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + $ pytest + +Live reloading and Sass CSS compilation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Moved to `Live reloading and SASS compilation`_. + +.. _`Live reloading and SASS compilation`: http://cookiecutter-django.readthedocs.io/en/latest/live-reloading-and-sass-compilation.html + + + + + +Deployment +---------- + +The following details how to deploy this application. + + + + diff --git a/cs4teachers/config/settings/base.py b/cs4teachers/config/settings/base.py deleted file mode 100644 index b9114e186..000000000 --- a/cs4teachers/config/settings/base.py +++ /dev/null @@ -1,286 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Django settings for cs4teachers project. - -Generated by 'django-admin startproject' using Django 1.11.2. - -For more information on this file, see -https://docs.djangoproject.com/en/1.11/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/1.11/ref/settings/ -""" - -import environ -import os.path - -# cs4teachers/cs4teachers/config/settings/base.py - 3 = cs4teachers/ -ROOT_DIR = environ.Path(__file__) - 3 - -# Load operating system environment variables and then prepare to use them -env = environ.Env() - -# APP CONFIGURATION -# ---------------------------------------------------------------------------- -DJANGO_APPS = [ - # Default Django apps: - "django.contrib.auth", - "django.contrib.contenttypes", - "django.contrib.sessions", - "django.contrib.sites", - "django.contrib.messages", - "django.contrib.staticfiles", - "django.contrib.flatpages", - # Useful template tags - "django.contrib.humanize", - # Admin - "django.contrib.admin", -] - -THIRD_PARTY_APPS = [ - "django_google_maps", - "tinymce", - "grappelli", - "allauth", - "allauth.account", - "allauth.socialaccount", - "allauth.socialaccount.providers.google", -] - -# Apps specific for this project go here. -LOCAL_APPS = [ - "general.apps.GeneralConfig", - "events.apps.EventsConfig", -] - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps -INSTALLED_APPS = THIRD_PARTY_APPS + DJANGO_APPS + LOCAL_APPS - -MIDDLEWARE = [ - "django.middleware.security.SecurityMiddleware", - "django.contrib.sessions.middleware.SessionMiddleware", - "django.middleware.common.CommonMiddleware", - "django.middleware.csrf.CsrfViewMiddleware", - "django.contrib.auth.middleware.AuthenticationMiddleware", - "django.contrib.messages.middleware.MessageMiddleware", - "django.middleware.clickjacking.XFrameOptionsMiddleware", -] - -# DEBUG -# ---------------------------------------------------------------------------- -# See: https://docs.djangoproject.com/en/dev/ref/settings/#debug -DEBUG = env.bool("DJANGO_DEBUG", False) - -# GENERAL CONFIGURATION -# ---------------------------------------------------------------------------- -# Local time zone for this installation. Choices can be found here: -# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name -# although not all choices may be available on all operating systems. -# In a Windows environment this must be set to your system time zone. -TIME_ZONE = "NZ" - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#language-code -LANGUAGE_CODE = "en-NZ" - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#site-id -SITE_ID = 1 - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-i18n -USE_I18N = False - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-l10n -USE_L10N = False - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-tz -USE_TZ = False - -TIME_FORMAT = "fA" - -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%Y", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", - "%d/%m/%y", - "%d-%m-%Y %H:%M:%S", - "%d-%m-%Y %H:%M:%S.%f", - "%d-%m-%Y %H:%M", - "%d-%m-%Y", -] - -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", - "%d/%m/%y", - "%d-%m-%Y", - "%d-%m-%y", -] - -TIME_INPUT_FORMATS = [ - "%H:%M:%S", - "%H:%M", -] - -# TEMPLATE CONFIGURATION -# ---------------------------------------------------------------------------- -# See: https://docs.djangoproject.com/en/dev/ref/settings/#templates -TEMPLATES = [ - { - # See: https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-TEMPLATES-BACKEND - "BACKEND": "django.template.backends.django.DjangoTemplates", - # See: https://docs.djangoproject.com/en/dev/ref/settings/#template-dirs - "DIRS": [ - str(ROOT_DIR.path("templates")), - ], - "OPTIONS": { - # See: https://docs.djangoproject.com/en/dev/ref/settings/#template-debug - "debug": DEBUG, - # See: https://docs.djangoproject.com/en/dev/ref/settings/#template-loaders - # https://docs.djangoproject.com/en/dev/ref/templates/api/#loader-types - "loaders": [ - "django.template.loaders.filesystem.Loader", - "django.template.loaders.app_directories.Loader", - ], - # See: https://docs.djangoproject.com/en/dev/ref/settings/#template-context-processors - "context_processors": [ - "django.template.context_processors.debug", - "django.template.context_processors.request", - "django.contrib.auth.context_processors.auth", - "django.template.context_processors.i18n", - "django.template.context_processors.media", - "django.template.context_processors.static", - "django.template.context_processors.tz", - "django.contrib.messages.context_processors.messages", - "config.context_processors.version_number.version_number", - ], - }, - }, -] - -# STATIC FILE CONFIGURATION -# ------------------------------------------------------------------------------ -# See: https://docs.djangoproject.com/en/dev/ref/settings/#static-root -STATIC_ROOT = os.path.join(str(ROOT_DIR.path("staticfiles")), "") - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#static-url -BUILD_ROOT = os.path.join(str(ROOT_DIR.path("build")), "") -STATIC_URL = "/staticfiles/" - -# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS -STATICFILES_DIRS = [ - BUILD_ROOT, -] - -# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders -STATICFILES_FINDERS = [ - "django.contrib.staticfiles.finders.FileSystemFinder", - "django.contrib.staticfiles.finders.AppDirectoriesFinder", -] - -# MEDIA CONFIGURATION -# ------------------------------------------------------------------------------ -# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-root -MEDIA_ROOT = str(ROOT_DIR("media")) - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-url -MEDIA_URL = "/media/" - -# URL Configuration -# ------------------------------------------------------------------------------ -ROOT_URLCONF = "config.urls" - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#wsgi-application -WSGI_APPLICATION = "config.wsgi.application" - -# PASSWORD VALIDATION -# https://docs.djangoproject.com/en/dev/ref/settings/#auth-password-validators -# ------------------------------------------------------------------------------ - -AUTH_PASSWORD_VALIDATORS = [ - { - "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", - }, - { - "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", - }, - { - "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", - }, - { - "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", - }, -] - -# PASSWORD STORAGE SETTINGS -# ------------------------------------------------------------------------------ -# See https://docs.djangoproject.com/en/dev/topics/auth/passwords/#using-argon2-with-django -PASSWORD_HASHERS = [ - "django.contrib.auth.hashers.Argon2PasswordHasher", - "django.contrib.auth.hashers.PBKDF2PasswordHasher", - "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher", - "django.contrib.auth.hashers.BCryptSHA256PasswordHasher", - "django.contrib.auth.hashers.BCryptPasswordHasher", -] - -GOOGLE_MAPS_API_KEY = "AIzaSyBy7T00JYsCeF8HaHrGLSKePJxxjMdWMrQ" - - -# GRAPPELLI SETTINGS -# ------------------------------------------------------------------------------ -# See http://django-grappelli.readthedocs.io/en/latest/customization.html - -GRAPPELLI_ADMIN_TITLE = "cs4teachers admin" - - -# TINYMCE SETTINGS -# ------------------------------------------------------------------------------ -# See http://django-tinymce.readthedocs.io/en/latest/installation.html#configuration - -TINYMCE_JS_URL = "/staticfiles/tinymce/tinymce.min.js" -TINYMCE_DEFAULT_CONFIG = { - "theme": "modern", - "relative_urls": False, - "branding": False, - "height": 200, - "plugins": [ - "advlist", - "autolink", - "autoresize", - "autosave", - "code", - "hr", - "link", - "lists", - "searchreplace", - "table", - "textcolor", - ], -} -TINYMCE_INCLUDE_JQUERY = False - -# ADMIN -# ------------------------------------------------------------------------------ -# https://docs.djangoproject.com/en/dev/ref/settings/#admins -ADMINS = [ - ("University of Canterbury Computer Science Research Group", - "csse-education-research@canterbury.ac.nz"), -] -# https://docs.djangoproject.com/en/dev/ref/settings/#managers -MANAGERS = ADMINS - -# ALLAUTH -# ------------------------------------------------------------------------------ -# https://django-allauth.readthedocs.io/en/latest/installation.html -AUTHENTICATION_BACKENDS = ( - # Needed to login by username in Django admin, regardless of `allauth` - "django.contrib.auth.backends.ModelBackend", - # `allauth` specific authentication methods, such as login by e-mail - "allauth.account.auth_backends.AuthenticationBackend", -) -LOGIN_REDIRECT_URL = "/" - -# OTHER SETTINGS -# ------------------------------------------------------------------------------ -DJANGO_PRODUCTION = env.bool("DJANGO_PRODUCTION") diff --git a/cs4teachers/config/settings/local.py b/cs4teachers/config/settings/local.py deleted file mode 100644 index 7ef25ee46..000000000 --- a/cs4teachers/config/settings/local.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Django settings for local development environment. - -- Run in Debug mode -- Add Django Debug Toolbar -""" - -from .base import * # noqa: F403 - -# DATABASE CONFIGURATION -# ---------------------------------------------------------------------------- -# See: https://docs.djangoproject.com/en/dev/ref/settings/#databases -DATABASES = { - "default": env.db("DATABASE_URL"), # noqa: F405 -} -DATABASES["default"]["ATOMIC_REQUESTS"] = True - -# DEBUG -# ---------------------------------------------------------------------------- -DEBUG = env.bool("DJANGO_DEBUG", default=True) # noqa: F405 -TEMPLATES[0]["OPTIONS"]["debug"] = DEBUG # noqa: F405 - -# SECRET CONFIGURATION -# ---------------------------------------------------------------------------- -# See: https://docs.djangoproject.com/en/dev/ref/settings/#secret-key -# Note: This key only used for development and testing. -SECRET_KEY = env("DJANGO_SECRET_KEY", default="iln3f89h!530417)xn57$jf143y-(5+auxzva6%tx(vzw=mgh(") # noqa: F405 - -# CACHING -# ---------------------------------------------------------------------------- -CACHES = { - "default": { - "BACKEND": "django.core.cache.backends.locmem.LocMemCache", - "LOCATION": "" - } -} - -# django-debug-toolbar -# ---------------------------------------------------------------------------- -MIDDLEWARE += ["debug_toolbar.middleware.DebugToolbarMiddleware", ] # noqa: F405 -INSTALLED_APPS += ["debug_toolbar", ] # noqa: F405 -INTERNAL_IPS = ["127.0.0.1"] - - -def show_django_debug_toolbar(request): - """Show Django Debug Toolbar in every request when running locally. - - Args: - request: The request object. - """ - return True - - -DEBUG_TOOLBAR_CONFIG = { - "DISABLE_PANELS": [ - "debug_toolbar.panels.redirects.RedirectsPanel", - ], - "SHOW_TEMPLATE_CONTEXT": True, - "SHOW_TOOLBAR_CALLBACK": show_django_debug_toolbar, - -} - -# TESTING -# ---------------------------------------------------------------------------- -TEST_RUNNER = "django.test.runner.DiscoverRunner" - -# EMAIL -# ------------------------------------------------------------------------------ -# https://docs.djangoproject.com/en/dev/ref/settings/#email-backend -EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" -# https://docs.djangoproject.com/en/dev/ref/settings/#email-host -EMAIL_HOST = "localhost" -# https://docs.djangoproject.com/en/dev/ref/settings/#email-port -EMAIL_PORT = 1025 diff --git a/cs4teachers/config/settings/production.py b/cs4teachers/config/settings/production.py deleted file mode 100644 index 7c626c881..000000000 --- a/cs4teachers/config/settings/production.py +++ /dev/null @@ -1,114 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Django settings for production environment. - -- Load secret values from environment variables. -""" - -from .base import * # noqa: F403 - -# SECRET CONFIGURATION -# ------------------------------------------------------------------------------ -# See: https://docs.djangoproject.com/en/dev/ref/settings/#secret-key -# Raises ImproperlyConfigured exception if DJANGO_SECRET_KEY not in os.environ -SECRET_KEY = env("DJANGO_SECRET_KEY") # noqa: F405 - -# SECURITY WARNING: App Engine"s security features ensure that it is safe to -# have ALLOWED_HOSTS = ["*"] when the app is deployed. If you deploy a Django -# app not on App Engine, make sure to set an appropriate host here. -# See https://docs.djangoproject.com/en/dev/ref/settings/ -ALLOWED_HOSTS = ["*"] - -if env("DEPLOYMENT", default=None) == "prod": # noqa: F405 - PREPEND_WWW = True -else: - PREPEND_WWW = False - -# DATABASE CONFIGURATION -# ---------------------------------------------------------------------------- -# See: https://docs.djangoproject.com/en/dev/ref/settings/#databases -DATABASES = { - "default": { - "ENGINE": "django.db.backends.postgresql", - "NAME": "cs4teachers", - "USER": env("GOOGLE_CLOUD_SQL_DATABASE_USERNAME"), # noqa: F405 - "PASSWORD": env("GOOGLE_CLOUD_SQL_DATABASE_PASSWORD"), # noqa: F405 - "HOST": "/cloudsql/" + env("GOOGLE_CLOUD_SQL_CONNECTION_NAME"), # noqa: F405 - } -} -DATABASES["default"]["ATOMIC_REQUESTS"] = True - -# Allow all host headers -ALLOWED_HOSTS = ["*"] - -# This ensures that Django will be able to detect a secure connection -# properly on Heroku. -SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") - -# SECURITY CONFIGURATION -# ------------------------------------------------------------------------------ -# See https://docs.djangoproject.com/en/dev/ref/middleware/#module-django.middleware.security -# and https://docs.djangoproject.com/en/dev/howto/deployment/checklist/#run-manage-py-check-deploy - -# set this to 60 seconds and then to 518400 when you can prove it works -SECURE_HSTS_SECONDS = 60 -SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") -SECURE_HSTS_INCLUDE_SUBDOMAINS = env.bool("DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS", default=True) # noqa: F405 -SECURE_CONTENT_TYPE_NOSNIFF = env.bool("DJANGO_SECURE_CONTENT_TYPE_NOSNIFF", default=True) # noqa: F405 -SECURE_BROWSER_XSS_FILTER = True -SESSION_COOKIE_SECURE = True -SESSION_COOKIE_HTTPONLY = True -SECURE_SSL_REDIRECT = env.bool("DJANGO_SECURE_SSL_REDIRECT", default=True) # noqa: F405 -CSRF_COOKIE_SECURE = True -CSRF_COOKIE_HTTPONLY = True -X_FRAME_OPTIONS = "DENY" - -LOGGING = { - "version": 1, - "disable_existing_loggers": False, - "handlers": { - "console": { - "level": "INFO", - "class": "logging.StreamHandler", - }, - }, - "loggers": { - "django": { - "handlers": ["console"], - } - } -} - - -# Static and media files -# ------------------------ -INSTALLED_APPS += [ # noqa: F405 - "storages", -] -DEFAULT_FILE_STORAGE = "storages.backends.gcloud.GoogleCloudStorage" -GS_BUCKET_NAME = env("GOOGLE_CLOUD_STORAGE_BUCKET_NAME") # noqa: F405 -GS_FILE_OVERWRITE = False -STATIC_URL = "https://storage.googleapis.com/" + env("GOOGLE_CLOUD_STORAGE_BUCKET_NAME") + "/static/" # noqa: F405 - -# EMAIL -# ------------------------------------------------------------------------------ -# https://docs.djangoproject.com/en/dev/ref/settings/#default-from-email -DEFAULT_FROM_EMAIL = env( # noqa: F405 - "DJANGO_DEFAULT_FROM_EMAIL", - default="cs4teachers.org.nz " -) -# https://docs.djangoproject.com/en/dev/ref/settings/#server-email -SERVER_EMAIL = env("DJANGO_SERVER_EMAIL", default=DEFAULT_FROM_EMAIL) # noqa: F405 -# https://docs.djangoproject.com/en/dev/ref/settings/#email-subject-prefix -EMAIL_SUBJECT_PREFIX = env("DJANGO_EMAIL_SUBJECT_PREFIX", default="[cs4teachers.org.nz] ") # noqa: F405 - -# Anymail (Mailgun) -# ------------------------------------------------------------------------------ -# https://anymail.readthedocs.io/en/stable/installation/#installing-anymail -INSTALLED_APPS += ["anymail"] # noqa F405 -EMAIL_BACKEND = "anymail.backends.mailgun.EmailBackend" -# https://anymail.readthedocs.io/en/stable/installation/#anymail-settings-reference -ANYMAIL = { - "MAILGUN_API_KEY": env("MAILGUN_API_KEY"), # noqa: F405 - "MAILGUN_SENDER_DOMAIN": env("MAILGUN_DOMAIN") # noqa: F405 -} diff --git a/cs4teachers/config/settings/testing.py b/cs4teachers/config/settings/testing.py deleted file mode 100644 index d750745fe..000000000 --- a/cs4teachers/config/settings/testing.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- -"""Settings for running on continuous integration server.""" - -from .base import * # noqa: F403 - - -# DATABASE CONFIGURATION -# ---------------------------------------------------------------------------- -# See: https://docs.djangoproject.com/en/dev/ref/settings/#databases -DATABASES = { - "default": env.db("DATABASE_URL"), # noqa: F405 -} -DATABASES["default"]["ATOMIC_REQUESTS"] = True - -# DEBUG -# ---------------------------------------------------------------------------- -# Turn debug off so tests run faster -DEBUG = False -TEMPLATES[0]["OPTIONS"]["debug"] = False # noqa: F405 - -# SECRET CONFIGURATION -# ---------------------------------------------------------------------------- -# See: https://docs.djangoproject.com/en/dev/ref/settings/#secret-key -# Note: This key only used for development and testing. -SECRET_KEY = env("DJANGO_SECRET_KEY", default="l@@)w&&%&u37+sjz^lsx^+29y_333oid3ygxzucar^8o(axo*f") # noqa: F405 - -# CACHING -# ---------------------------------------------------------------------------- -# Speed advantages of in-memory caching without having to run Memcached -CACHES = { - "default": { - "BACKEND": "django.core.cache.backends.locmem.LocMemCache", - "LOCATION": "" - } -} - -# TESTING -# ---------------------------------------------------------------------------- -TEST_RUNNER = "django.test.runner.DiscoverRunner" - - -# PASSWORD HASHING -# ---------------------------------------------------------------------------- -# Use fast password hasher so tests run faster -PASSWORD_HASHERS = [ - "django.contrib.auth.hashers.MD5PasswordHasher", -] - -# TEMPLATE LOADERS -# ---------------------------------------------------------------------------- -# Keep templates in memory so tests run faster -TEMPLATES[0]["OPTIONS"]["loaders"] = [ # noqa: F405 - ["django.template.loaders.cached.Loader", [ - "django.template.loaders.filesystem.Loader", - "django.template.loaders.app_directories.Loader", - ], ], -] -# Your local stuff: Below this line define 3rd party library settings -# ---------------------------------------------------------------------------- -INSTALLED_APPS += [ # noqa: F405 - "test_without_migrations", -] diff --git a/cs4teachers/config/urls.py b/cs4teachers/config/urls.py deleted file mode 100644 index 0f9f67bed..000000000 --- a/cs4teachers/config/urls.py +++ /dev/null @@ -1,28 +0,0 @@ -"""URL configuration for the Django system. - -The `urlpatterns` list routes URLs to views. -For more information please see: -https://docs.djangoproject.com/en/dev/topics/http/urls/ -""" - -from django.conf import settings -from django.conf.urls import include, url -from django.contrib import admin - - -admin.site.site_header = "cs4teachers" -urlpatterns = [ - url(r"", include("general.urls", namespace="general")), - url(r"^events/", include("events.urls", namespace="events")), - url(r"^grappelli/", include("grappelli.urls")), - url(r"^admin/", include(admin.site.urls)), - url(r"^tinymce/", include("tinymce.urls")), - url(r"^accounts/", include("allauth.urls")), -] - -if settings.DEBUG: - import debug_toolbar - from django.conf.urls.static import static - urlpatterns += [ - url(r"^__debug__/", include(debug_toolbar.urls)), - ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/cs4teachers/config/wsgi.py b/cs4teachers/config/wsgi.py deleted file mode 100644 index f3037b692..000000000 --- a/cs4teachers/config/wsgi.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -WSGI config for cs4teachers 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/1.10/howto/deployment/wsgi/ -""" - -import os - -from django.core.wsgi import get_wsgi_application - -# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks -# if running multiple sites in the same mod_wsgi process. To fix this, use -# mod_wsgi daemon mode with each site in its own daemon process, or use -# os.environ["DJANGO_SETTINGS_MODULE"] = "config.settings.production" -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production") - -# This application object is used by any WSGI server configured to use this -# file. This includes Django's development server, if the WSGI_APPLICATION -# setting points here. -application = get_wsgi_application() diff --git a/cs4teachers/events/__init__.py b/cs4teachers/events/__init__.py deleted file mode 100644 index acd4ff2fd..000000000 --- a/cs4teachers/events/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Module for the events application.""" diff --git a/cs4teachers/events/admin.py b/cs4teachers/events/admin.py deleted file mode 100644 index a6582e0f2..000000000 --- a/cs4teachers/events/admin.py +++ /dev/null @@ -1,140 +0,0 @@ -"""Administration configuration for the events application.""" - -from django.contrib import admin -from django.db import models -from events.models import ( - Event, - ThirdPartyEvent, - Location, - Session, - Series, - Sponsor, - Resource, - LocationImage, - EventImage, -) -from django_google_maps import widgets as map_widgets -from django_google_maps import fields as map_fields -from tinymce.widgets import TinyMCE - - -class SessionAdmin(admin.ModelAdmin): - """Admin interface for Session model.""" - - exclude = ("slug",) - formfield_overrides = { - models.TextField: {'widget': TinyMCE()}, - } - list_display = ("name", "event") - search_fields = ["name", "event"] - list_filter = ("event",) - filter_vertical = ("resources", "locations",) - - -class SessionInline(admin.StackedInline): - """Admin interface for Session model when displayed inline.""" - - model = Session - extra = 5 - exclude = ("slug",) - formfield_overrides = { - models.TextField: {'widget': TinyMCE()}, - } - filter_vertical = ("resources", "locations",) - - -class LocationAdmin(admin.ModelAdmin): - """Admin interface for Location model.""" - - exclude = ("slug",) - formfield_overrides = { - map_fields.AddressField: {"widget": map_widgets.GoogleMapsAddressWidget}, - models.TextField: {'widget': TinyMCE()}, - } - - -class ResourceAdmin(admin.ModelAdmin): - """Admin interface for Resource model.""" - - exclude = ("slug",) - formfield_overrides = { - models.TextField: {'widget': TinyMCE()}, - } - list_display = ("name", "url") - - -class EventAdmin(admin.ModelAdmin): - """Admin interface for Event model.""" - - fieldsets = [ - ( - None, - { - "fields": ["name", "description", "start_date", "end_date", "series", "location", "sponsors"] - } - ), - ( - "Visibility", - { - "fields": ["is_published"] - } - ), - ( - "Advanced", - { - "fields": ["slug"], - "classes": ("grp-collapse", "grp-closed") - } - ), - ] - inlines = [SessionInline] - formfield_overrides = { - models.TextField: {'widget': TinyMCE()}, - } - list_display = ("name", "series", "location", "start_date", "end_date") - list_filter = ("is_published",) - search_fields = ["name"] - filter_vertical = ("sponsors",) - - -class ThirdPartyEventAdmin(admin.ModelAdmin): - """Admin interface for ThirdPartyEvent model.""" - - fieldsets = [ - ( - None, - { - "fields": [ - "name", - "url", - "start_date", - "end_date", - "description", - "location", - ] - } - ), - ( - "Visibility", - { - "fields": ["is_published"] - } - ), - ] - formfield_overrides = { - models.TextField: {'widget': TinyMCE()}, - } - list_display = ("name", "location", "start_date", "end_date") - list_filter = ("is_published",) - search_fields = ["name"] - - -admin.site.register(Event, EventAdmin) -admin.site.register(ThirdPartyEvent, ThirdPartyEventAdmin) -admin.site.register(Session, SessionAdmin) -admin.site.register(Location, LocationAdmin) -admin.site.register(Resource, ResourceAdmin) -admin.site.register(Series) -admin.site.register(Sponsor) -admin.site.register(LocationImage) -admin.site.register(EventImage) diff --git a/cs4teachers/events/apps.py b/cs4teachers/events/apps.py deleted file mode 100644 index 88dcda888..000000000 --- a/cs4teachers/events/apps.py +++ /dev/null @@ -1,9 +0,0 @@ -"""Application configuration for the events application.""" - -from django.apps import AppConfig - - -class EventsConfig(AppConfig): - """Configuration object for the topics application.""" - - name = "events" diff --git a/cs4teachers/events/migrations/0001_initial.py b/cs4teachers/events/migrations/0001_initial.py deleted file mode 100644 index ad89ff657..000000000 --- a/cs4teachers/events/migrations/0001_initial.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-14 04:29 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Event', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('slug', models.SlugField(unique=True)), - ('name', models.CharField(max_length=200, unique=True)), - ('description', models.TextField()), - ('start_date', models.DateField()), - ('end_date', models.DateField()), - ], - ), - ] diff --git a/cs4teachers/events/migrations/0002_event_published.py b/cs4teachers/events/migrations/0002_event_published.py deleted file mode 100644 index c4c542dce..000000000 --- a/cs4teachers/events/migrations/0002_event_published.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-14 04:46 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='event', - name='published', - field=models.BooleanField(default=False), - ), - ] diff --git a/cs4teachers/events/migrations/0003_auto_20170614_1648.py b/cs4teachers/events/migrations/0003_auto_20170614_1648.py deleted file mode 100644 index 598ccb9d7..000000000 --- a/cs4teachers/events/migrations/0003_auto_20170614_1648.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-14 04:48 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0002_event_published'), - ] - - operations = [ - migrations.RenameField( - model_name='event', - old_name='published', - new_name='is_published', - ), - ] diff --git a/cs4teachers/events/migrations/0004_auto_20170618_0842.py b/cs4teachers/events/migrations/0004_auto_20170618_0842.py deleted file mode 100644 index 4e161fd97..000000000 --- a/cs4teachers/events/migrations/0004_auto_20170618_0842.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-17 20:42 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0003_auto_20170614_1648'), - ] - - operations = [ - migrations.CreateModel( - name='Location', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('slug', models.SlugField(unique=True)), - ('name', models.CharField(max_length=300)), - ('description', models.TextField(null=True)), - ('address', models.TextField()), - ], - ), - migrations.CreateModel( - name='Session', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('slug', models.SlugField(unique=True)), - ('name', models.CharField(max_length=300)), - ('description', models.TextField()), - ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sessions', to='events.Event')), - ], - ), - migrations.CreateModel( - name='Sponsor', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200)), - ('url', models.URLField()), - ], - ), - migrations.AddField( - model_name='location', - name='event', - field=models.ManyToManyField(related_name='locations', to='events.Session'), - ), - ] diff --git a/cs4teachers/events/migrations/0005_auto_20170618_1700.py b/cs4teachers/events/migrations/0005_auto_20170618_1700.py deleted file mode 100644 index 532812b8b..000000000 --- a/cs4teachers/events/migrations/0005_auto_20170618_1700.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-18 05:00 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0004_auto_20170618_0842'), - ] - - operations = [ - migrations.CreateModel( - name='Resource', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('slug', models.SlugField(unique=True)), - ('name', models.CharField(max_length=200)), - ('url', models.URLField()), - ('description', models.TextField(null=True)), - ('sessions', models.ManyToManyField(related_name='resources', to='events.Session')), - ], - ), - migrations.RenameField( - model_name='location', - old_name='event', - new_name='sessions', - ), - ] diff --git a/cs4teachers/events/migrations/0006_auto_20170618_1711.py b/cs4teachers/events/migrations/0006_auto_20170618_1711.py deleted file mode 100644 index b58505902..000000000 --- a/cs4teachers/events/migrations/0006_auto_20170618_1711.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-18 05:11 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0005_auto_20170618_1700'), - ] - - operations = [ - migrations.RemoveField( - model_name='location', - name='sessions', - ), - migrations.RemoveField( - model_name='resource', - name='sessions', - ), - migrations.AddField( - model_name='session', - name='locations', - field=models.ManyToManyField(related_name='sessions', to='events.Location'), - ), - migrations.AddField( - model_name='session', - name='resources', - field=models.ManyToManyField(related_name='sessions', to='events.Resource'), - ), - ] diff --git a/cs4teachers/events/migrations/0007_auto_20170618_1936.py b/cs4teachers/events/migrations/0007_auto_20170618_1936.py deleted file mode 100644 index e92997c09..000000000 --- a/cs4teachers/events/migrations/0007_auto_20170618_1936.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-18 07:36 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0006_auto_20170618_1711'), - ] - - operations = [ - migrations.AlterField( - model_name='location', - name='description', - field=models.TextField(blank=True), - ), - migrations.AlterField( - model_name='resource', - name='description', - field=models.TextField(blank=True), - ), - ] diff --git a/cs4teachers/events/migrations/0008_auto_20170618_2017.py b/cs4teachers/events/migrations/0008_auto_20170618_2017.py deleted file mode 100644 index 013589e04..000000000 --- a/cs4teachers/events/migrations/0008_auto_20170618_2017.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-18 08:17 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0007_auto_20170618_1936'), - ] - - operations = [ - migrations.AlterField( - model_name='session', - name='description', - field=models.TextField(blank=True), - ), - migrations.AlterField( - model_name='session', - name='resources', - field=models.ManyToManyField(blank=True, related_name='sessions', to='events.Resource'), - ), - ] diff --git a/cs4teachers/events/migrations/0009_auto_20170618_2019.py b/cs4teachers/events/migrations/0009_auto_20170618_2019.py deleted file mode 100644 index 03a8c68a0..000000000 --- a/cs4teachers/events/migrations/0009_auto_20170618_2019.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-18 08:19 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0008_auto_20170618_2017'), - ] - - operations = [ - migrations.AlterField( - model_name='event', - name='name', - field=models.CharField(max_length=150, unique=True), - ), - migrations.AlterField( - model_name='event', - name='slug', - field=models.SlugField(max_length=150, unique=True), - ), - migrations.AlterField( - model_name='location', - name='name', - field=models.CharField(max_length=150), - ), - migrations.AlterField( - model_name='location', - name='slug', - field=models.SlugField(max_length=150, unique=True), - ), - migrations.AlterField( - model_name='resource', - name='name', - field=models.CharField(max_length=150), - ), - migrations.AlterField( - model_name='resource', - name='slug', - field=models.SlugField(max_length=150, unique=True), - ), - migrations.AlterField( - model_name='session', - name='locations', - field=models.ManyToManyField(blank=True, related_name='sessions', to='events.Location'), - ), - migrations.AlterField( - model_name='session', - name='name', - field=models.CharField(max_length=200), - ), - migrations.AlterField( - model_name='session', - name='slug', - field=models.SlugField(max_length=350, unique=True), - ), - ] diff --git a/cs4teachers/events/migrations/0010_auto_20170618_2049.py b/cs4teachers/events/migrations/0010_auto_20170618_2049.py deleted file mode 100644 index ed886002f..000000000 --- a/cs4teachers/events/migrations/0010_auto_20170618_2049.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-18 08:49 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0009_auto_20170618_2019'), - ] - - operations = [ - migrations.AlterField( - model_name='session', - name='slug', - field=models.SlugField(max_length=200), - ), - migrations.AlterUniqueTogether( - name='session', - unique_together=set([('event', 'slug')]), - ), - ] diff --git a/cs4teachers/events/migrations/0011_auto_20170618_2103.py b/cs4teachers/events/migrations/0011_auto_20170618_2103.py deleted file mode 100644 index 44276d939..000000000 --- a/cs4teachers/events/migrations/0011_auto_20170618_2103.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-18 09:03 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0010_auto_20170618_2049'), - ] - - operations = [ - migrations.AddField( - model_name='session', - name='end_datetime', - field=models.DateTimeField(), - preserve_default=False, - ), - migrations.AddField( - model_name='session', - name='start_datetime', - field=models.DateTimeField(), - preserve_default=False, - ), - ] diff --git a/cs4teachers/events/migrations/0012_auto_20170621_1111.py b/cs4teachers/events/migrations/0012_auto_20170621_1111.py deleted file mode 100644 index faead4a41..000000000 --- a/cs4teachers/events/migrations/0012_auto_20170621_1111.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-20 23:11 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0011_auto_20170618_2103'), - ] - - operations = [ - migrations.RemoveField( - model_name='event', - name='end_date', - ), - migrations.RemoveField( - model_name='event', - name='start_date', - ), - ] diff --git a/cs4teachers/events/migrations/0013_thirdpartyevent.py b/cs4teachers/events/migrations/0013_thirdpartyevent.py deleted file mode 100644 index 4271c9b75..000000000 --- a/cs4teachers/events/migrations/0013_thirdpartyevent.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-23 21:49 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0012_auto_20170621_1111'), - ] - - operations = [ - migrations.CreateModel( - name='ThirdPartyEvent', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('slug', models.SlugField(max_length=150, unique=True)), - ('name', models.CharField(max_length=150, unique=True)), - ('description', models.TextField()), - ('is_published', models.BooleanField(default=False)), - ('url', models.URLField()), - ('start_datetime', models.DateTimeField()), - ('end_datetime', models.DateTimeField()), - ('locations', models.ManyToManyField(blank=True, related_name='third_party_events', to='events.Location')), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/cs4teachers/events/migrations/0014_auto_20170624_0955.py b/cs4teachers/events/migrations/0014_auto_20170624_0955.py deleted file mode 100644 index 5ac089f9a..000000000 --- a/cs4teachers/events/migrations/0014_auto_20170624_0955.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-23 21:55 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0013_thirdpartyevent'), - ] - - operations = [ - migrations.AlterField( - model_name='thirdpartyevent', - name='end_datetime', - field=models.DateField(), - ), - migrations.AlterField( - model_name='thirdpartyevent', - name='start_datetime', - field=models.DateField(), - ), - ] diff --git a/cs4teachers/events/migrations/0015_auto_20170624_1512.py b/cs4teachers/events/migrations/0015_auto_20170624_1512.py deleted file mode 100644 index a74808d1d..000000000 --- a/cs4teachers/events/migrations/0015_auto_20170624_1512.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-06-24 03:12 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0014_auto_20170624_0955'), - ] - - operations = [ - migrations.RenameField( - model_name='thirdpartyevent', - old_name='end_datetime', - new_name='end_date', - ), - migrations.RenameField( - model_name='thirdpartyevent', - old_name='start_datetime', - new_name='start_date', - ), - ] diff --git a/cs4teachers/events/migrations/0016_auto_20170705_0951.py b/cs4teachers/events/migrations/0016_auto_20170705_0951.py deleted file mode 100644 index 635b47756..000000000 --- a/cs4teachers/events/migrations/0016_auto_20170705_0951.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-04 21:51 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0015_auto_20170624_1512'), - ] - - operations = [ - migrations.RemoveField( - model_name='thirdpartyevent', - name='locations', - ), - migrations.AddField( - model_name='event', - name='location', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='events', to='events.Location'), - ), - migrations.AddField( - model_name='event', - name='sponsors', - field=models.ManyToManyField(null=True, related_name='events', to='events.Sponsor'), - ), - migrations.AddField( - model_name='thirdpartyevent', - name='location', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='third_party_events', to='events.Location'), - ), - ] diff --git a/cs4teachers/events/migrations/0017_auto_20170705_0952.py b/cs4teachers/events/migrations/0017_auto_20170705_0952.py deleted file mode 100644 index 1912dcc2b..000000000 --- a/cs4teachers/events/migrations/0017_auto_20170705_0952.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-04 21:52 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0016_auto_20170705_0951'), - ] - - operations = [ - migrations.AlterField( - model_name='event', - name='sponsors', - field=models.ManyToManyField(related_name='events', to='events.Sponsor'), - ), - ] diff --git a/cs4teachers/events/migrations/0018_auto_20170706_0803.py b/cs4teachers/events/migrations/0018_auto_20170706_0803.py deleted file mode 100644 index 808ac515d..000000000 --- a/cs4teachers/events/migrations/0018_auto_20170706_0803.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-06 08:03 -from __future__ import unicode_literals - -import autoslug.fields -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0017_auto_20170705_0952'), - ] - - operations = [ - migrations.AlterField( - model_name='event', - name='slug', - field=autoslug.fields.AutoSlugField(editable=False, populate_from='name'), - ), - migrations.AlterField( - model_name='location', - name='slug', - field=autoslug.fields.AutoSlugField(editable=False, populate_from='name'), - ), - migrations.AlterField( - model_name='resource', - name='slug', - field=autoslug.fields.AutoSlugField(editable=False, populate_from='name'), - ), - migrations.AlterField( - model_name='session', - name='slug', - field=autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique_with=['event__slug']), - ), - migrations.AlterField( - model_name='thirdpartyevent', - name='slug', - field=autoslug.fields.AutoSlugField(editable=False, populate_from='name'), - ), - ] diff --git a/cs4teachers/events/migrations/0019_auto_20170706_1326.py b/cs4teachers/events/migrations/0019_auto_20170706_1326.py deleted file mode 100644 index 2b86b02f1..000000000 --- a/cs4teachers/events/migrations/0019_auto_20170706_1326.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-06 13:26 -from __future__ import unicode_literals - -from django.db import migrations -import django_google_maps.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0018_auto_20170706_0803'), - ] - - operations = [ - migrations.AddField( - model_name='location', - name='geolocation', - field=django_google_maps.fields.GeoLocationField(default='0.0,0.0', max_length=100), - preserve_default=False, - ), - migrations.AlterField( - model_name='location', - name='address', - field=django_google_maps.fields.AddressField(max_length=200), - ), - ] diff --git a/cs4teachers/events/migrations/0020_auto_20170709_1421.py b/cs4teachers/events/migrations/0020_auto_20170709_1421.py deleted file mode 100644 index fb6e48e2c..000000000 --- a/cs4teachers/events/migrations/0020_auto_20170709_1421.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-07-09 14:21 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0019_auto_20170706_1326'), - ] - - operations = [ - migrations.AlterField( - model_name='event', - name='name', - field=models.CharField(max_length=150), - ), - migrations.AlterField( - model_name='thirdpartyevent', - name='name', - field=models.CharField(max_length=150), - ), - migrations.AlterUniqueTogether( - name='session', - unique_together=set([]), - ), - ] diff --git a/cs4teachers/events/migrations/0021_auto_20170709_1951.py b/cs4teachers/events/migrations/0021_auto_20170709_1951.py deleted file mode 100644 index 88c985864..000000000 --- a/cs4teachers/events/migrations/0021_auto_20170709_1951.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-07-09 19:51 -from __future__ import unicode_literals - -import autoslug.fields -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0020_auto_20170709_1421'), - ] - - operations = [ - migrations.AlterField( - model_name='event', - name='slug', - field=autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True), - ), - migrations.AlterField( - model_name='location', - name='slug', - field=autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True), - ), - migrations.AlterField( - model_name='resource', - name='slug', - field=autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True), - ), - migrations.AlterField( - model_name='thirdpartyevent', - name='slug', - field=autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True), - ), - ] diff --git a/cs4teachers/events/migrations/0022_auto_20170709_2121.py b/cs4teachers/events/migrations/0022_auto_20170709_2121.py deleted file mode 100644 index 7552c1a95..000000000 --- a/cs4teachers/events/migrations/0022_auto_20170709_2121.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-07-09 21:21 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0021_auto_20170709_1951'), - ] - - operations = [ - migrations.AlterField( - model_name='event', - name='sponsors', - field=models.ManyToManyField(blank=True, related_name='events', to='events.Sponsor'), - ), - ] diff --git a/cs4teachers/events/migrations/0023_auto_20170710_2125.py b/cs4teachers/events/migrations/0023_auto_20170710_2125.py deleted file mode 100644 index b4080e9a2..000000000 --- a/cs4teachers/events/migrations/0023_auto_20170710_2125.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-07-10 21:25 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0022_auto_20170709_2121'), - ] - - operations = [ - migrations.CreateModel( - name='EventImage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ('image', models.ImageField(upload_to='images/events/')), - ('location', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='events.Event')), - ], - ), - migrations.CreateModel( - name='LocationImage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ('image', models.ImageField(upload_to='images/locations/')), - ('location', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='events.Location')), - ], - ), - migrations.AddField( - model_name='resource', - name='image', - field=models.ImageField(blank=True, null=True, upload_to='images/resources/'), - ), - migrations.AddField( - model_name='session', - name='image', - field=models.ImageField(blank=True, null=True, upload_to='images/sessions/'), - ), - migrations.AddField( - model_name='sponsor', - name='logo', - field=models.ImageField(blank=True, null=True, upload_to='images/sponsors/'), - ), - ] diff --git a/cs4teachers/events/migrations/0024_auto_20170714_1917.py b/cs4teachers/events/migrations/0024_auto_20170714_1917.py deleted file mode 100644 index 04fc90dfd..000000000 --- a/cs4teachers/events/migrations/0024_auto_20170714_1917.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-07-14 19:17 -from __future__ import unicode_literals - -import autoslug.fields -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0023_auto_20170710_2125'), - ] - - operations = [ - migrations.CreateModel( - name='Series', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True)), - ('name', models.CharField(max_length=150)), - ('logo', models.ImageField(blank=True, null=True, upload_to='images/series/')), - ('description', models.TextField()), - ], - ), - migrations.AddField( - model_name='event', - name='series', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='events', to='events.Series'), - ), - ] diff --git a/cs4teachers/events/migrations/0025_auto_20170714_1921.py b/cs4teachers/events/migrations/0025_auto_20170714_1921.py deleted file mode 100644 index e7258f32a..000000000 --- a/cs4teachers/events/migrations/0025_auto_20170714_1921.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-07-14 19:21 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0024_auto_20170714_1917'), - ] - - operations = [ - migrations.AlterField( - model_name='event', - name='series', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='events', to='events.Series'), - ), - ] diff --git a/cs4teachers/events/migrations/0026_auto_20170715_0811.py b/cs4teachers/events/migrations/0026_auto_20170715_0811.py deleted file mode 100644 index daa0995cd..000000000 --- a/cs4teachers/events/migrations/0026_auto_20170715_0811.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-07-15 08:11 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0025_auto_20170714_1921'), - ] - - operations = [ - migrations.AddField( - model_name='event', - name='end_date', - field=models.DateField(default=django.utils.timezone.now), - preserve_default=False, - ), - migrations.AddField( - model_name='event', - name='start_date', - field=models.DateField(default=django.utils.timezone.now), - preserve_default=False, - ), - ] diff --git a/cs4teachers/events/migrations/0027_auto_20170716_1341.py b/cs4teachers/events/migrations/0027_auto_20170716_1341.py deleted file mode 100644 index 63d27fabf..000000000 --- a/cs4teachers/events/migrations/0027_auto_20170716_1341.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-07-16 13:41 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0026_auto_20170715_0811'), - ] - - operations = [ - migrations.AlterField( - model_name='sponsor', - name='name', - field=models.CharField(max_length=200, unique=True), - ), - ] diff --git a/cs4teachers/events/migrations/0028_auto_20170716_1544.py b/cs4teachers/events/migrations/0028_auto_20170716_1544.py deleted file mode 100644 index 4771e6353..000000000 --- a/cs4teachers/events/migrations/0028_auto_20170716_1544.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-07-16 15:44 -from __future__ import unicode_literals - -import autoslug.fields -from django.db import migrations -import events.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0027_auto_20170716_1341'), - ] - - operations = [ - migrations.AlterField( - model_name='event', - name='slug', - field=autoslug.fields.AutoSlugField(editable=False, populate_from=events.models.EventBase.create_slug, unique=True), - ), - migrations.AlterField( - model_name='thirdpartyevent', - name='slug', - field=autoslug.fields.AutoSlugField(editable=False, populate_from=events.models.EventBase.create_slug, unique=True), - ), - ] diff --git a/cs4teachers/events/migrations/0029_auto_20170716_1638.py b/cs4teachers/events/migrations/0029_auto_20170716_1638.py deleted file mode 100644 index 5709f0827..000000000 --- a/cs4teachers/events/migrations/0029_auto_20170716_1638.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-07-16 16:38 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0028_auto_20170716_1544'), - ] - - operations = [ - migrations.RenameField( - model_name='eventimage', - old_name='location', - new_name='event', - ), - ] diff --git a/cs4teachers/events/migrations/0030_series_subtitle.py b/cs4teachers/events/migrations/0030_series_subtitle.py deleted file mode 100644 index 72b6b934d..000000000 --- a/cs4teachers/events/migrations/0030_series_subtitle.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-07-16 19:00 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0029_auto_20170716_1638'), - ] - - operations = [ - migrations.AddField( - model_name='series', - name='subtitle', - field=models.CharField(blank=True, max_length=150), - ), - ] diff --git a/cs4teachers/events/migrations/0031_auto_20170828_2006.py b/cs4teachers/events/migrations/0031_auto_20170828_2006.py deleted file mode 100644 index 072ebe9a0..000000000 --- a/cs4teachers/events/migrations/0031_auto_20170828_2006.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-08-28 20:06 -from __future__ import unicode_literals - -import autoslug.fields -from django.db import migrations -import events.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('events', '0030_series_subtitle'), - ] - - operations = [ - migrations.AlterField( - model_name='event', - name='slug', - field=autoslug.fields.AutoSlugField(editable=True, populate_from=events.models.EventBase.create_slug, unique=True), - ), - migrations.AlterField( - model_name='thirdpartyevent', - name='slug', - field=autoslug.fields.AutoSlugField(editable=True, populate_from=events.models.EventBase.create_slug, unique=True), - ), - ] diff --git a/cs4teachers/events/models.py b/cs4teachers/events/models.py deleted file mode 100644 index 5e77470a0..000000000 --- a/cs4teachers/events/models.py +++ /dev/null @@ -1,279 +0,0 @@ -"""Models for the events application.""" - -from os.path import join -from django.db import models -from django.urls import reverse -from autoslug import AutoSlugField -from django_google_maps import fields as map_fields - -UPLOAD_BASE_PATH = "uploads/events" - - -class Location(models.Model): - """Model for location of session.""" - - slug = AutoSlugField(unique=True, populate_from="name") - name = models.CharField(max_length=150) - description = models.TextField(blank=True) - address = map_fields.AddressField(max_length=200) - geolocation = map_fields.GeoLocationField(max_length=100) - - def get_absolute_url(self): - """Return URL of object on website. - - Returns: - URL as a string. - """ - return reverse("events:location", kwargs={"location_slug": self.slug}) - - def __str__(self): - """Text representation of Location object. - - Returns: - Name of location (str). - """ - return self.name - - -class LocationImage(models.Model): - """Model for image of location model.""" - - name = models.CharField(max_length=255) - image = models.ImageField(upload_to=join(UPLOAD_BASE_PATH, "locations/images/")) - location = models.ForeignKey( - Location, - related_name="images", - ) - - def __str__(self): - """Text representation of LocationImage object. - - Returns: - Name of image (str). - """ - return self.name - - -class Series(models.Model): - """Model for event series.""" - - slug = AutoSlugField(unique=True, populate_from="name") - name = models.CharField(max_length=150) - subtitle = models.CharField(max_length=150, blank=True) - logo = models.ImageField(upload_to=join(UPLOAD_BASE_PATH, "series/logos/"), null=True, blank=True) - description = models.TextField() - - def find_closest_event(self): - """Find the closest event of the series. - - Chooses the first event to match one of the following rules: - 1. Event currently occuring. - 2. Closest event in future. - 3. Closest event in past. - - Returns: - Event object, or None if no events. - """ - from events.utils import calculate_days_difference - events = self.events.filter(is_published=True) - closest_event = None - for event in events: - event.days_difference = calculate_days_difference(event) - if closest_event is None or ( - event.days_difference >= 0 and event.days_difference < closest_event.days_difference - ): - closest_event = event - elif closest_event is None or ( - event.days_difference < 0 and event.days_difference > closest_event.days_difference - ): - closest_event = event - return closest_event - - def __str__(self): - """Text representation of Series object. - - Returns: - Name of series (str). - """ - return self.name - - -class Sponsor(models.Model): - """Model for sponsor of event.""" - - name = models.CharField(unique=True, max_length=200) - url = models.URLField() - logo = models.ImageField(upload_to=join(UPLOAD_BASE_PATH, "sponsors/logos/"), null=True, blank=True) - - def __str__(self): - """Text representation of Sponsor object. - - Returns: - Name of sponsor (str). - """ - return self.name - - -class EventBase(models.Model): - """Abstract base class for event models.""" - - def create_slug(self): - """Create slug for event. - - Returns: - String of slug. - """ - if hasattr(self, "series") and self.series: - return "{}-{}".format(self.series.slug, self.name) - else: - return self.name - - slug = AutoSlugField(unique=True, populate_from=create_slug, editable=True, blank=True) - name = models.CharField(max_length=150) - description = models.TextField() - start_date = models.DateField() - end_date = models.DateField() - is_published = models.BooleanField(default=False) - - class Meta: - """Meta attributes of the class.""" - - abstract = True - - -class Event(EventBase): - """Model for event in database.""" - - location = models.ForeignKey( - Location, - related_name="events", - null=True, - ) - series = models.ForeignKey( - Series, - related_name="events", - null=True, - blank=True, - ) - sponsors = models.ManyToManyField( - Sponsor, - related_name="events", - blank=True, - ) - - def get_absolute_url(self): - """Return URL of object on website. - - Returns: - URL as a string. - """ - return reverse("events:event", kwargs={"event_slug": self.slug}) - - def __str__(self): - """Text representation of Event object. - - Returns: - Name of event (str). - """ - if self.series: - return "{}: {}".format(self.series.name, self.name) - else: - return self.name - - -class EventImage(models.Model): - """Model for image of event model.""" - - name = models.CharField(max_length=255) - image = models.ImageField(upload_to=join(UPLOAD_BASE_PATH, "events/images/")) - event = models.ForeignKey( - Event, - related_name="images", - ) - - def __str__(self): - """Text representation of EventImage object. - - Returns: - Name of image (str). - """ - return self.name - - -class Resource(models.Model): - """Model for resource used in sessions.""" - - slug = AutoSlugField(unique=True, populate_from="name") - name = models.CharField(max_length=150) - url = models.URLField() - description = models.TextField(blank=True) - image = models.ImageField(upload_to=join(UPLOAD_BASE_PATH, "resources/images/"), null=True, blank=True) - - def __str__(self): - """Text representation of Resource object. - - Returns: - Name of resource (str). - """ - return self.name - - -class Session(models.Model): - """Model for session of event.""" - - slug = AutoSlugField(unique_with=["event__slug"], populate_from="name") - event = models.ForeignKey( - Event, - on_delete=models.CASCADE, - related_name="sessions", - ) - name = models.CharField(max_length=200) - description = models.TextField(blank=True) - image = models.ImageField(join(UPLOAD_BASE_PATH, "sessions/images/"), null=True, blank=True) - start_datetime = models.DateTimeField() - end_datetime = models.DateTimeField() - locations = models.ManyToManyField( - Location, - related_name="sessions", - blank=True, - ) - resources = models.ManyToManyField( - Resource, - related_name="sessions", - blank=True, - ) - - def __str__(self): - """Text representation of Session object. - - Returns: - Name of session (str). - """ - return self.name - - -class ThirdPartyEvent(EventBase): - """Model for third party event in database.""" - - url = models.URLField() - location = models.ForeignKey( - Location, - related_name="third_party_events", - null=True, - ) - - def get_absolute_url(self): - """Return URL of object on website. - - Returns: - URL as a string. - """ - return reverse("events:third_party_event", kwargs={"event_slug": self.slug}) - - def __str__(self): - """Text representation of Event object. - - Returns: - Name of event (str). - """ - return self.name diff --git a/cs4teachers/events/urls.py b/cs4teachers/events/urls.py deleted file mode 100644 index a588f0130..000000000 --- a/cs4teachers/events/urls.py +++ /dev/null @@ -1,57 +0,0 @@ -"""URL routing for the events application.""" - -from django.conf.urls import url -from events import views - - -app_name = "events" -urlpatterns = [ - # eg: /events/ - url( - r"^$", - views.IndexView.as_view(), - name="index" - ), - # eg: /events/resources/ - url( - r"^resources/$", - views.ResourceList.as_view(), - name="resources" - ), - # eg: /events/series/ - url( - r"^series/$", - views.SeriesList.as_view(), - name="series_list" - ), - # eg: /events/cs4hs-2017/ - url( - r"^(?P[-\w]+)/$", - views.EventView.as_view(), - name="event" - ), - # eg: /events/series/cs4ps/ - url( - r"^series/(?P[-\w]+)/$", - views.SeriesView.as_view(), - name="series" - ), - # eg: /events/location/erskine-315/ - url( - r"^location/(?P[-\w]+)/$", - views.LocationView.as_view(), - name="location" - ), - # eg: /events/third-party/wellington-cs4hs-2017/ - url( - r"^third-party/(?P[-\w]+)/$", - views.ThirdPartyEventView.as_view(), - name="third_party_event" - ), - # eg: /events/cs4hs-2017/welcome - url( - r"^(?P[-\w]+)/(?P[-\w]+)/$", - views.SessionView.as_view(), - name="session" - ), -] diff --git a/cs4teachers/events/utils.py b/cs4teachers/events/utils.py deleted file mode 100644 index bcefa6c36..000000000 --- a/cs4teachers/events/utils.py +++ /dev/null @@ -1,113 +0,0 @@ -"""Utility functions for the events application.""" - -from datetime import datetime, date -from events.models import ( - Event, - ThirdPartyEvent, -) - - -class GenericEvent: - """Object combining common attributes of Event and ThirdPartyEvent classes.""" - - def __init__(self, name, absolute_url, location, start_date, end_date, series=None, third_party=False): - """Construct GenericEvent object. - - Args: - name: The name of the event (str). - absolute_url: The URL of the event page (str). - location: Location object of the event (Location). - start_date: Date the event starts (date). - end_date: Date the event ends (date). - series: Series of the event if applicaable (Series). - third_party: True if event is a third party event, otherwise False. - """ - self.name = name - self.absolute_url = absolute_url - self.location = location - self.start_date = start_date - self.end_date = end_date - self.series = series - self.third_party = third_party - self.days_difference = calculate_days_difference(self) - - -def retrieve_all_events(upcoming=False, series=None): - """Retrieve both events and third party events. - - These are returned in sorted order by start datetime, - then end datetime. - - Args: - upcoming (bool): If True, only return events after the current datetime. Default is False. - series (Series): If given, only return events for the given series. - - Returns: - List of event objects (list). - """ - all_events = [] - - events = Event.objects.filter( - is_published=True - ) - - third_party_events = ThirdPartyEvent.objects.filter( - is_published=True - ) - - if upcoming: - today = datetime.today() - events = events.filter(end_date__gte=today) - third_party_events = third_party_events.filter(end_date__gte=today) - - if series: - events = events.filter(series=series) - third_party_events = [] - - for event in events: - all_events.append(GenericEvent( - event.name, - event.get_absolute_url(), - event.location, - event.start_date, - event.end_date, - event.series, - )) - - for event in third_party_events: - all_events.append(GenericEvent( - event.name, - event.get_absolute_url(), - event.location, - event.start_date, - event.end_date, - None, - True, - )) - - return sorted(all_events, key=lambda x: (x.start_date, x.end_date)) - - -def calculate_days_difference(event): - """Return the number of days difference from today for an event. - - Args: - event (BaseEvent): Event to compare to today. - - Returns: - Integer of difference: - Positive if in future. - Zero if event is occuring now. - Negative if in past. - """ - today = date.today() - # If event is on now - if today >= event.start_date and today <= event.end_date: - days_difference = 0 - # Otherwise, next upcoming event - elif today > event.end_date: - days_difference = (event.end_date - today).days - # Otherwise, latest event - else: - days_difference = (event.start_date - today).days - return days_difference diff --git a/cs4teachers/events/views.py b/cs4teachers/events/views.py deleted file mode 100644 index 6e02e02fc..000000000 --- a/cs4teachers/events/views.py +++ /dev/null @@ -1,146 +0,0 @@ -"""Views for the events application.""" - -from django.views import generic -from django.shortcuts import get_object_or_404 -from events.utils import retrieve_all_events -from events.models import ( - Series, - Event, - Session, - Location, - ThirdPartyEvent, - Resource, -) - - -class IndexView(generic.ListView): - """View for the events application homepage.""" - - template_name = "events/index.html" - context_object_name = "events" - - def get_queryset(self): - """Get queryset of all topics. - - Returns: - Queryset of Topic objects ordered by name. - """ - return retrieve_all_events() - - -class SeriesList(generic.ListView): - """View for all series.""" - - model = Series - ordering = "name" - context_object_name = "series_list" - template_name = "events/series_list.html" - - -class SeriesView(generic.DetailView): - """View for a event series.""" - - model = Series - template_name = "events/series.html" - slug_url_kwarg = "series_slug" - context_object_name = "series" - - def get_context_data(self, **kwargs): - """Provide the context data for the session view. - - Returns: - Dictionary of context data. - """ - context = super(SeriesView, self).get_context_data(**kwargs) - context["events"] = retrieve_all_events(series=self.object) - return context - - -class EventView(generic.DetailView): - """View for a specific event.""" - - model = Event - template_name = "events/event.html" - context_object_name = "event" - - def get_object(self, **kwargs): - """Retrieve object for the event view. - - Returns: - Event object, or raises 404 error if not found. - """ - return get_object_or_404( - self.model.objects.filter(is_published=True).select_related(), - slug=self.kwargs.get("event_slug", None), - ) - - def get_context_data(self, **kwargs): - """Provide the context data for the session view. - - Returns: - Dictionary of context data. - """ - context = super(EventView, self).get_context_data(**kwargs) - context["sessions"] = self.object.sessions.order_by( - "start_datetime", "end_datetime").prefetch_related("locations") - context["sponsors"] = self.object.sponsors.order_by("name") - return context - - -class SessionView(generic.DetailView): - """View for a specific session.""" - - model = Session - template_name = "events/session.html" - context_object_name = "session" - - def get_object(self, **kwargs): - """Retrieve object for the session view. - - Returns: - Session object, or raises 404 error if not found. - """ - return get_object_or_404( - self.model.objects.select_related(), - event__slug=self.kwargs.get("event_slug", None), - slug=self.kwargs.get("session_slug", None) - ) - - def get_context_data(self, **kwargs): - """Provide the context data for the session view. - - Returns: - Dictionary of context data. - """ - context = super(SessionView, self).get_context_data(**kwargs) - context["event"] = self.object.event - context["locations"] = self.object.locations.order_by("name") - context["resources"] = self.object.resources.order_by("name") - return context - - -class LocationView(generic.DetailView): - """View for a specific location.""" - - model = Location - template_name = "events/location.html" - slug_url_kwarg = "location_slug" - context_object_name = "location" - - -class ThirdPartyEventView(generic.DetailView): - """View for a specific third party event.""" - - model = ThirdPartyEvent - template_name = "events/third-party-event.html" - slug_url_kwarg = "event_slug" - context_object_name = "event" - - -class ResourceList(generic.ListView): - """View for all resources.""" - - model = Resource - ordering = "name" - context_object_name = "resources" - template_name = "events/resources.html" diff --git a/cs4teachers/general/__init__.py b/cs4teachers/general/__init__.py deleted file mode 100644 index f7b2e4e96..000000000 --- a/cs4teachers/general/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Module for the general application.""" diff --git a/cs4teachers/general/admin.py b/cs4teachers/general/admin.py deleted file mode 100644 index 704bc63ca..000000000 --- a/cs4teachers/general/admin.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Administration configuration for the events application.""" - -from django.contrib import admin -from django.contrib.flatpages.admin import FlatPageAdmin -from django.contrib.flatpages.models import FlatPage -from django.db import models -from tinymce.widgets import TinyMCE - - -class PageAdmin(FlatPageAdmin): - """Override all text fields to use TinyMCE widget.""" - - formfield_overrides = { - models.TextField: {'widget': TinyMCE()}, - } - - -admin.site.unregister(FlatPage) -admin.site.register(FlatPage, PageAdmin) diff --git a/cs4teachers/general/apps.py b/cs4teachers/general/apps.py deleted file mode 100644 index 4b6adc59b..000000000 --- a/cs4teachers/general/apps.py +++ /dev/null @@ -1,9 +0,0 @@ -"""Application configuration for the general application.""" - -from django.apps import AppConfig - - -class GeneralConfig(AppConfig): - """Configuration object for the general application.""" - - name = "general" diff --git a/cs4teachers/general/urls.py b/cs4teachers/general/urls.py deleted file mode 100644 index c675ee8a3..000000000 --- a/cs4teachers/general/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -"""URL routing for the general application.""" - -from django.conf.urls import include, url -from general import views - -urlpatterns = [ - url(r"^$", views.GeneralIndexView.as_view(), name="home"), - url(r"^pages/", include("django.contrib.flatpages.urls")), -] diff --git a/cs4teachers/general/views.py b/cs4teachers/general/views.py deleted file mode 100644 index bd86572f8..000000000 --- a/cs4teachers/general/views.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Views for the general application.""" - -from django.views.generic import TemplateView -from events.utils import retrieve_all_events - - -class GeneralIndexView(TemplateView): - """View for the homepage that renders from a template.""" - - template_name = "general/index.html" - - def get_context_data(self, **kwargs): - """Provide the context data for the homepage. - - Returns: - Dictionary of context data. - """ - # Call the base implementation first to get a context - context = super(GeneralIndexView, self).get_context_data(**kwargs) - context["events"] = retrieve_all_events(upcoming=True) - return context diff --git a/cs4teachers/static/css/bootstrap.min.css b/cs4teachers/static/css/bootstrap.min.css deleted file mode 100644 index 8538d2f58..000000000 --- a/cs4teachers/static/css/bootstrap.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com) - * Copyright 2011-2017 The Bootstrap Authors - * Copyright 2011-2017 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}@media print{*,::after,::before,blockquote::first-letter,blockquote::first-line,div::first-letter,div::first-line,li::first-letter,li::first-line,p::first-letter,p::first-line{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}html{-webkit-box-sizing:border-box;box-sizing:border-box}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}html{-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#292b2c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{cursor:help}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}a{color:#0275d8;text-decoration:none}a:focus,a:hover{color:#014c8c;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle}[role=button]{cursor:pointer}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse;background-color:transparent}caption{padding-top:.75rem;padding-bottom:.75rem;color:#636c72;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,select,textarea{line-height:inherit}input[type=checkbox]:disabled,input[type=radio]:disabled{cursor:not-allowed}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}input[type=search]{-webkit-appearance:none}output{display:inline-block}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.1}.display-2{font-size:5.5rem;font-weight:300;line-height:1.1}.display-3{font-size:4.5rem;font-weight:300;line-height:1.1}.display-4{font-size:3.5rem;font-weight:300;line-height:1.1}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.initialism{font-size:90%;text-transform:uppercase}.blockquote{padding:.5rem 1rem;margin-bottom:1rem;font-size:1.25rem;border-left:.25rem solid #eceeef}.blockquote-footer{display:block;font-size:80%;color:#636c72}.blockquote-footer::before{content:"\2014 \00A0"}.blockquote-reverse{padding-right:1rem;padding-left:0;text-align:right;border-right:.25rem solid #eceeef;border-left:0}.blockquote-reverse .blockquote-footer::before{content:""}.blockquote-reverse .blockquote-footer::after{content:"\00A0 \2014"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#636c72}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{padding:.2rem .4rem;font-size:90%;color:#bd4147;background-color:#f7f7f9;border-radius:.25rem}a>code{padding:0;color:inherit;background-color:inherit}kbd{padding:.2rem .4rem;font-size:90%;color:#fff;background-color:#292b2c;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;margin-top:0;margin-bottom:1rem;font-size:90%;color:#292b2c}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{position:relative;margin-left:auto;margin-right:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container{padding-right:15px;padding-left:15px}}@media (min-width:576px){.container{width:540px;max-width:100%}}@media (min-width:768px){.container{width:720px;max-width:100%}}@media (min-width:992px){.container{width:960px;max-width:100%}}@media (min-width:1200px){.container{width:1140px;max-width:100%}}.container-fluid{position:relative;margin-left:auto;margin-right:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container-fluid{padding-right:15px;padding-left:15px}}.row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}@media (min-width:576px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:768px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:992px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:1200px){.row{margin-right:-15px;margin-left:-15px}}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}@media (min-width:576px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{padding-right:15px;padding-left:15px}}@media (min-width:768px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{padding-right:15px;padding-left:15px}}@media (min-width:992px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{padding-right:15px;padding-left:15px}}.col{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-0{right:auto}.pull-1{right:8.333333%}.pull-2{right:16.666667%}.pull-3{right:25%}.pull-4{right:33.333333%}.pull-5{right:41.666667%}.pull-6{right:50%}.pull-7{right:58.333333%}.pull-8{right:66.666667%}.pull-9{right:75%}.pull-10{right:83.333333%}.pull-11{right:91.666667%}.pull-12{right:100%}.push-0{left:auto}.push-1{left:8.333333%}.push-2{left:16.666667%}.push-3{left:25%}.push-4{left:33.333333%}.push-5{left:41.666667%}.push-6{left:50%}.push-7{left:58.333333%}.push-8{left:66.666667%}.push-9{left:75%}.push-10{left:83.333333%}.push-11{left:91.666667%}.push-12{left:100%}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-sm-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-sm-0{right:auto}.pull-sm-1{right:8.333333%}.pull-sm-2{right:16.666667%}.pull-sm-3{right:25%}.pull-sm-4{right:33.333333%}.pull-sm-5{right:41.666667%}.pull-sm-6{right:50%}.pull-sm-7{right:58.333333%}.pull-sm-8{right:66.666667%}.pull-sm-9{right:75%}.pull-sm-10{right:83.333333%}.pull-sm-11{right:91.666667%}.pull-sm-12{right:100%}.push-sm-0{left:auto}.push-sm-1{left:8.333333%}.push-sm-2{left:16.666667%}.push-sm-3{left:25%}.push-sm-4{left:33.333333%}.push-sm-5{left:41.666667%}.push-sm-6{left:50%}.push-sm-7{left:58.333333%}.push-sm-8{left:66.666667%}.push-sm-9{left:75%}.push-sm-10{left:83.333333%}.push-sm-11{left:91.666667%}.push-sm-12{left:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-md-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-md-0{right:auto}.pull-md-1{right:8.333333%}.pull-md-2{right:16.666667%}.pull-md-3{right:25%}.pull-md-4{right:33.333333%}.pull-md-5{right:41.666667%}.pull-md-6{right:50%}.pull-md-7{right:58.333333%}.pull-md-8{right:66.666667%}.pull-md-9{right:75%}.pull-md-10{right:83.333333%}.pull-md-11{right:91.666667%}.pull-md-12{right:100%}.push-md-0{left:auto}.push-md-1{left:8.333333%}.push-md-2{left:16.666667%}.push-md-3{left:25%}.push-md-4{left:33.333333%}.push-md-5{left:41.666667%}.push-md-6{left:50%}.push-md-7{left:58.333333%}.push-md-8{left:66.666667%}.push-md-9{left:75%}.push-md-10{left:83.333333%}.push-md-11{left:91.666667%}.push-md-12{left:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-lg-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-lg-0{right:auto}.pull-lg-1{right:8.333333%}.pull-lg-2{right:16.666667%}.pull-lg-3{right:25%}.pull-lg-4{right:33.333333%}.pull-lg-5{right:41.666667%}.pull-lg-6{right:50%}.pull-lg-7{right:58.333333%}.pull-lg-8{right:66.666667%}.pull-lg-9{right:75%}.pull-lg-10{right:83.333333%}.pull-lg-11{right:91.666667%}.pull-lg-12{right:100%}.push-lg-0{left:auto}.push-lg-1{left:8.333333%}.push-lg-2{left:16.666667%}.push-lg-3{left:25%}.push-lg-4{left:33.333333%}.push-lg-5{left:41.666667%}.push-lg-6{left:50%}.push-lg-7{left:58.333333%}.push-lg-8{left:66.666667%}.push-lg-9{left:75%}.push-lg-10{left:83.333333%}.push-lg-11{left:91.666667%}.push-lg-12{left:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-xl-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-xl-0{right:auto}.pull-xl-1{right:8.333333%}.pull-xl-2{right:16.666667%}.pull-xl-3{right:25%}.pull-xl-4{right:33.333333%}.pull-xl-5{right:41.666667%}.pull-xl-6{right:50%}.pull-xl-7{right:58.333333%}.pull-xl-8{right:66.666667%}.pull-xl-9{right:75%}.pull-xl-10{right:83.333333%}.pull-xl-11{right:91.666667%}.pull-xl-12{right:100%}.push-xl-0{left:auto}.push-xl-1{left:8.333333%}.push-xl-2{left:16.666667%}.push-xl-3{left:25%}.push-xl-4{left:33.333333%}.push-xl-5{left:41.666667%}.push-xl-6{left:50%}.push-xl-7{left:58.333333%}.push-xl-8{left:66.666667%}.push-xl-9{left:75%}.push-xl-10{left:83.333333%}.push-xl-11{left:91.666667%}.push-xl-12{left:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #eceeef}.table thead th{vertical-align:bottom;border-bottom:2px solid #eceeef}.table tbody+tbody{border-top:2px solid #eceeef}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #eceeef}.table-bordered td,.table-bordered th{border:1px solid #eceeef}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table-success,.table-success>td,.table-success>th{background-color:#dff0d8}.table-hover .table-success:hover{background-color:#d0e9c6}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#d0e9c6}.table-info,.table-info>td,.table-info>th{background-color:#d9edf7}.table-hover .table-info:hover{background-color:#c4e3f3}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c4e3f3}.table-warning,.table-warning>td,.table-warning>th{background-color:#fcf8e3}.table-hover .table-warning:hover{background-color:#faf2cc}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#faf2cc}.table-danger,.table-danger>td,.table-danger>th{background-color:#f2dede}.table-hover .table-danger:hover{background-color:#ebcccc}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ebcccc}.thead-inverse th{color:#fff;background-color:#292b2c}.thead-default th{color:#464a4c;background-color:#eceeef}.table-inverse{color:#fff;background-color:#292b2c}.table-inverse td,.table-inverse th,.table-inverse thead th{border-color:#fff}.table-inverse.table-bordered{border:0}.table-responsive{display:block;width:100%;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive.table-bordered{border:0}.form-control{display:block;width:100%;padding:.5rem .75rem;font-size:1rem;line-height:1.25;color:#464a4c;background-color:#fff;background-image:none;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-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;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#464a4c;background-color:#fff;border-color:#5cb3fd;outline:0}.form-control::-webkit-input-placeholder{color:#636c72;opacity:1}.form-control::-moz-placeholder{color:#636c72;opacity:1}.form-control:-ms-input-placeholder{color:#636c72;opacity:1}.form-control::placeholder{color:#636c72;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#eceeef;opacity:1}.form-control:disabled{cursor:not-allowed}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#464a4c;background-color:#fff}.form-control-file,.form-control-range{display:block}.col-form-label{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);margin-bottom:0}.col-form-label-lg{padding-top:calc(.75rem - 1px * 2);padding-bottom:calc(.75rem - 1px * 2);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem - 1px * 2);padding-bottom:calc(.25rem - 1px * 2);font-size:.875rem}.col-form-legend{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;font-size:1rem}.form-control-static{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;line-height:1.25;border:solid transparent;border-width:1px 0}.form-control-static.form-control-lg,.form-control-static.form-control-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-sm>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>select.input-group-addon:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:1.8125rem}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.input-group-lg>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>select.input-group-addon:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:3.166667rem}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-check{position:relative;display:block;margin-bottom:.5rem}.form-check.disabled .form-check-label{color:#636c72;cursor:not-allowed}.form-check-label{padding-left:1.25rem;margin-bottom:0;cursor:pointer}.form-check-input{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.form-check-input:only-child{position:static}.form-check-inline{display:inline-block}.form-check-inline .form-check-label{vertical-align:middle}.form-check-inline+.form-check-inline{margin-left:.75rem}.form-control-feedback{margin-top:.25rem}.form-control-danger,.form-control-success,.form-control-warning{padding-right:2.25rem;background-repeat:no-repeat;background-position:center right .5625rem;-webkit-background-size:1.125rem 1.125rem;background-size:1.125rem 1.125rem}.has-success .col-form-label,.has-success .custom-control,.has-success .form-check-label,.has-success .form-control-feedback,.has-success .form-control-label{color:#5cb85c}.has-success .form-control{border-color:#5cb85c}.has-success .input-group-addon{color:#5cb85c;border-color:#5cb85c;background-color:#eaf6ea}.has-success .form-control-success{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E")}.has-warning .col-form-label,.has-warning .custom-control,.has-warning .form-check-label,.has-warning .form-control-feedback,.has-warning .form-control-label{color:#f0ad4e}.has-warning .form-control{border-color:#f0ad4e}.has-warning .input-group-addon{color:#f0ad4e;border-color:#f0ad4e;background-color:#fff}.has-warning .form-control-warning{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E")}.has-danger .col-form-label,.has-danger .custom-control,.has-danger .form-check-label,.has-danger .form-control-feedback,.has-danger .form-control-label{color:#d9534f}.has-danger .form-control{border-color:#d9534f}.has-danger .input-group-addon{color:#d9534f;border-color:#d9534f;background-color:#fdf7f7}.has-danger .form-control-danger{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E")}.form-inline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .form-check{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:auto;margin-top:0;margin-bottom:0}.form-inline .form-check-label{padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:0}.form-inline .custom-control-indicator{position:static;display:inline-block;margin-right:.25rem;vertical-align:text-bottom}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;line-height:1.25;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.5rem 1rem;font-size:1rem;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.25);box-shadow:0 0 0 2px rgba(2,117,216,.25)}.btn.disabled,.btn:disabled{cursor:not-allowed;opacity:.65}.btn.active,.btn:active{background-image:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary:hover{color:#fff;background-color:#025aa5;border-color:#01549b}.btn-primary.focus,.btn-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.5);box-shadow:0 0 0 2px rgba(2,117,216,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#0275d8;border-color:#0275d8}.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#025aa5;background-image:none;border-color:#01549b}.btn-secondary{color:#292b2c;background-color:#fff;border-color:#ccc}.btn-secondary:hover{color:#292b2c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary.focus,.btn-secondary:focus{-webkit-box-shadow:0 0 0 2px rgba(204,204,204,.5);box-shadow:0 0 0 2px rgba(204,204,204,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#fff;border-color:#ccc}.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#292b2c;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info.focus,.btn-info:focus{-webkit-box-shadow:0 0 0 2px rgba(91,192,222,.5);box-shadow:0 0 0 2px rgba(91,192,222,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#5bc0de;border-color:#5bc0de}.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;background-image:none;border-color:#2aabd2}.btn-success{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#419641}.btn-success.focus,.btn-success:focus{-webkit-box-shadow:0 0 0 2px rgba(92,184,92,.5);box-shadow:0 0 0 2px rgba(92,184,92,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#5cb85c;border-color:#5cb85c}.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;background-image:none;border-color:#419641}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning.focus,.btn-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(240,173,78,.5);box-shadow:0 0 0 2px rgba(240,173,78,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;background-image:none;border-color:#eb9316}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#c12e2a}.btn-danger.focus,.btn-danger:focus{-webkit-box-shadow:0 0 0 2px rgba(217,83,79,.5);box-shadow:0 0 0 2px rgba(217,83,79,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#d9534f;border-color:#d9534f}.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;background-image:none;border-color:#c12e2a}.btn-outline-primary{color:#0275d8;background-image:none;background-color:transparent;border-color:#0275d8}.btn-outline-primary:hover{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-primary.focus,.btn-outline-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.5);box-shadow:0 0 0 2px rgba(2,117,216,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0275d8;background-color:transparent}.btn-outline-primary.active,.btn-outline-primary:active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-secondary{color:#ccc;background-image:none;background-color:transparent;border-color:#ccc}.btn-outline-secondary:hover{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary.focus,.btn-outline-secondary:focus{-webkit-box-shadow:0 0 0 2px rgba(204,204,204,.5);box-shadow:0 0 0 2px rgba(204,204,204,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#ccc;background-color:transparent}.btn-outline-secondary.active,.btn-outline-secondary:active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-info{color:#5bc0de;background-image:none;background-color:transparent;border-color:#5bc0de}.btn-outline-info:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info.focus,.btn-outline-info:focus{-webkit-box-shadow:0 0 0 2px rgba(91,192,222,.5);box-shadow:0 0 0 2px rgba(91,192,222,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#5bc0de;background-color:transparent}.btn-outline-info.active,.btn-outline-info:active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-success{color:#5cb85c;background-image:none;background-color:transparent;border-color:#5cb85c}.btn-outline-success:hover{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success.focus,.btn-outline-success:focus{-webkit-box-shadow:0 0 0 2px rgba(92,184,92,.5);box-shadow:0 0 0 2px rgba(92,184,92,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#5cb85c;background-color:transparent}.btn-outline-success.active,.btn-outline-success:active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-warning{color:#f0ad4e;background-image:none;background-color:transparent;border-color:#f0ad4e}.btn-outline-warning:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning.focus,.btn-outline-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(240,173,78,.5);box-shadow:0 0 0 2px rgba(240,173,78,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#f0ad4e;background-color:transparent}.btn-outline-warning.active,.btn-outline-warning:active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-danger{color:#d9534f;background-image:none;background-color:transparent;border-color:#d9534f}.btn-outline-danger:hover{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-outline-danger.focus,.btn-outline-danger:focus{-webkit-box-shadow:0 0 0 2px rgba(217,83,79,.5);box-shadow:0 0 0 2px rgba(217,83,79,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#d9534f;background-color:transparent}.btn-outline-danger.active,.btn-outline-danger:active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-link{font-weight:400;color:#0275d8;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:active,.btn-link:focus{border-color:transparent}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#014c8c;text-decoration:underline;background-color:transparent}.btn-link:disabled{color:#636c72}.btn-link:disabled:focus,.btn-link:disabled:hover{text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.3em;vertical-align:middle;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-left:.3em solid transparent}.dropdown-toggle:focus{outline:0}.dropup .dropdown-toggle::after{border-top:0;border-bottom:.3em solid}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#292b2c;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-divider{height:1px;margin:.5rem 0;overflow:hidden;background-color:#eceeef}.dropdown-item{display:block;width:100%;padding:3px 1.5rem;clear:both;font-weight:400;color:#292b2c;text-align:inherit;white-space:nowrap;background:0 0;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1d1e1f;text-decoration:none;background-color:#f7f7f9}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0275d8}.dropdown-item.disabled,.dropdown-item:disabled{color:#636c72;cursor:not-allowed;background-color:transparent}.show>.dropdown-menu{display:block}.show>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#636c72;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.dropup .dropdown-menu{top:auto;bottom:100%;margin-bottom:.125rem}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.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-left:-1px}.btn-toolbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-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+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn+.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:1.125rem;padding-left:1.125rem}.btn-group-vertical{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.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-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.input-group .form-control{position:relative;z-index:2;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group .form-control:active,.input-group .form-control:focus,.input-group .form-control:hover{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#464a4c;text-align:center;background-color:#eceeef;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:not(:last-child){border-right:0}.input-group .form-control:not(:first-child),.input-group-addon:not(:first-child),.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group>.btn,.input-group-btn:not(:first-child)>.dropdown-toggle,.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn,.input-group-btn:not(:last-child)>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.form-control+.input-group-addon:not(:first-child){border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative;-webkit-box-flex:1;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:3}.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group{margin-right:-1px}.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group{z-index:2;margin-left:-1px}.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:hover,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:focus,.input-group-btn:not(:first-child)>.btn:hover{z-index:3}.custom-control{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;min-height:1.5rem;padding-left:1.5rem;margin-right:1rem;cursor:pointer}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-indicator{color:#fff;background-color:#0275d8}.custom-control-input:focus~.custom-control-indicator{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 3px #0275d8;box-shadow:0 0 0 1px #fff,0 0 0 3px #0275d8}.custom-control-input:active~.custom-control-indicator{color:#fff;background-color:#8fcafe}.custom-control-input:disabled~.custom-control-indicator{cursor:not-allowed;background-color:#eceeef}.custom-control-input:disabled~.custom-control-description{color:#636c72;cursor:not-allowed}.custom-control-indicator{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;-webkit-background-size:50% 50%;background-size:50% 50%}.custom-checkbox .custom-control-indicator{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#0275d8;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-radio .custom-control-indicator{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-controls-stacked{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.custom-controls-stacked .custom-control{margin-bottom:.25rem}.custom-controls-stacked .custom-control+.custom-control{margin-left:0}.custom-select{display:inline-block;max-width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.25;color:#464a4c;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;-webkit-background-size:8px 10px;background-size:8px 10px;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-moz-appearance:none;-webkit-appearance:none}.custom-select:focus{border-color:#5cb3fd;outline:0}.custom-select:focus::-ms-value{color:#464a4c;background-color:#fff}.custom-select:disabled{color:#636c72;cursor:not-allowed;background-color:#eceeef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-file{position:relative;display:inline-block;max-width:100%;height:2.5rem;margin-bottom:0;cursor:pointer}.custom-file-input{min-width:14rem;max-width:100%;height:2.5rem;margin:0;filter:alpha(opacity=0);opacity:0}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#464a4c;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.custom-file-control:lang(en)::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#464a4c;background-color:#eceeef;border:1px solid rgba(0,0,0,.15);border-radius:0 .25rem .25rem 0}.custom-file-control:lang(en)::before{content:"Browse"}.nav{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5em 1em}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#636c72;cursor:not-allowed}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-right-radius:.25rem;border-top-left-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#eceeef #eceeef #ddd}.nav-tabs .nav-link.disabled{color:#636c72;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#464a4c;background-color:#fff;border-color:#ddd #ddd #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-item.show .nav-link,.nav-pills .nav-link.active{color:#fff;cursor:default;background-color:#0275d8}.nav-fill .nav-item{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-webkit-box-flex:1;-webkit-flex:1 1 100%;-ms-flex:1 1 100%;flex:1 1 100%;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:.5rem 1rem}.navbar-brand{display:inline-block;padding-top:.25rem;padding-bottom:.25rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-text{display:inline-block;padding-top:.425rem;padding-bottom:.425rem}.navbar-toggler{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;padding:.25rem .75rem;font-size:1.25rem;line-height:1;background:0 0;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;-webkit-background-size:100% 100%;background-size:100% 100%}.navbar-toggler-left{position:absolute;left:1rem}.navbar-toggler-right{position:absolute;right:1rem}@media (max-width:575px){.navbar-toggleable .navbar-nav .dropdown-menu{position:static;float:none}.navbar-toggleable>.container{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-toggleable{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-toggleable .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-toggleable>.container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;width:100%}.navbar-toggleable .navbar-toggler{display:none}}@media (max-width:767px){.navbar-toggleable-sm .navbar-nav .dropdown-menu{position:static;float:none}.navbar-toggleable-sm>.container{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-toggleable-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-toggleable-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-toggleable-sm>.container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-sm .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;width:100%}.navbar-toggleable-sm .navbar-toggler{display:none}}@media (max-width:991px){.navbar-toggleable-md .navbar-nav .dropdown-menu{position:static;float:none}.navbar-toggleable-md>.container{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-toggleable-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-toggleable-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-toggleable-md>.container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-md .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;width:100%}.navbar-toggleable-md .navbar-toggler{display:none}}@media (max-width:1199px){.navbar-toggleable-lg .navbar-nav .dropdown-menu{position:static;float:none}.navbar-toggleable-lg>.container{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-toggleable-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-toggleable-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-toggleable-lg>.container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-lg .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;width:100%}.navbar-toggleable-lg .navbar-toggler{display:none}}.navbar-toggleable-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-xl .navbar-nav .dropdown-menu{position:static;float:none}.navbar-toggleable-xl>.container{padding-right:0;padding-left:0}.navbar-toggleable-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-toggleable-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-toggleable-xl>.container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-xl .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;width:100%}.navbar-toggleable-xl .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-toggler{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover,.navbar-light .navbar-toggler:focus,.navbar-light .navbar-toggler:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.open,.navbar-light .navbar-nav .open>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-toggler{color:#fff}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-toggler:focus,.navbar-inverse .navbar-toggler:hover{color:#fff}.navbar-inverse .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-inverse .navbar-nav .nav-link:focus,.navbar-inverse .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-inverse .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-inverse .navbar-nav .active>.nav-link,.navbar-inverse .navbar-nav .nav-link.active,.navbar-inverse .navbar-nav .nav-link.open,.navbar-inverse .navbar-nav .open>.nav-link{color:#fff}.navbar-inverse .navbar-toggler{border-color:rgba(255,255,255,.1)}.navbar-inverse .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E")}.navbar-inverse .navbar-text{color:rgba(255,255,255,.5)}.card{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;background-color:#fff;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card-block{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card>.list-group:first-child .list-group-item:first-child{border-top-right-radius:.25rem;border-top-left-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:#f7f7f9;border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:#f7f7f9;border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-primary{background-color:#0275d8;border-color:#0275d8}.card-primary .card-footer,.card-primary .card-header{background-color:transparent}.card-success{background-color:#5cb85c;border-color:#5cb85c}.card-success .card-footer,.card-success .card-header{background-color:transparent}.card-info{background-color:#5bc0de;border-color:#5bc0de}.card-info .card-footer,.card-info .card-header{background-color:transparent}.card-warning{background-color:#f0ad4e;border-color:#f0ad4e}.card-warning .card-footer,.card-warning .card-header{background-color:transparent}.card-danger{background-color:#d9534f;border-color:#d9534f}.card-danger .card-footer,.card-danger .card-header{background-color:transparent}.card-outline-primary{background-color:transparent;border-color:#0275d8}.card-outline-secondary{background-color:transparent;border-color:#ccc}.card-outline-info{background-color:transparent;border-color:#5bc0de}.card-outline-success{background-color:transparent;border-color:#5cb85c}.card-outline-warning{background-color:transparent;border-color:#f0ad4e}.card-outline-danger{background-color:transparent;border-color:#d9534f}.card-inverse{color:rgba(255,255,255,.65)}.card-inverse .card-footer,.card-inverse .card-header{background-color:transparent;border-color:rgba(255,255,255,.2)}.card-inverse .card-blockquote,.card-inverse .card-footer,.card-inverse .card-header,.card-inverse .card-title{color:#fff}.card-inverse .card-blockquote .blockquote-footer,.card-inverse .card-link,.card-inverse .card-subtitle,.card-inverse .card-text{color:rgba(255,255,255,.65)}.card-inverse .card-link:focus,.card-inverse .card-link:hover{color:#fff}.card-blockquote{padding:0;margin-bottom:0;border-left:0}.card-img{border-radius:calc(.25rem - 1px)}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img-top{border-top-right-radius:calc(.25rem - 1px);border-top-left-radius:calc(.25rem - 1px)}.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}@media (min-width:576px){.card-deck{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-deck .card{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0 0%;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.card-deck .card:not(:first-child){margin-left:15px}.card-deck .card:not(:last-child){margin-right:15px}}@media (min-width:576px){.card-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group .card{-webkit-box-flex:1;-webkit-flex:1 0 0%;-ms-flex:1 0 0%;flex:1 0 0%}.card-group .card+.card{margin-left:0;border-left:0}.card-group .card:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.card-group .card:first-child .card-img-top{border-top-right-radius:0}.card-group .card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group .card:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.card-group .card:last-child .card-img-top{border-top-left-radius:0}.card-group .card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group .card:not(:first-child):not(:last-child){border-radius:0}.card-group .card:not(:first-child):not(:last-child) .card-img-bottom,.card-group .card:not(:first-child):not(:last-child) .card-img-top{border-radius:0}}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%;margin-bottom:.75rem}}.breadcrumb{padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eceeef;border-radius:.25rem}.breadcrumb::after{display:block;content:"";clear:both}.breadcrumb-item{float:left}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#636c72;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#636c72}.pagination{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-item:first-child .page-link{margin-left:0;border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.page-item.active .page-link{z-index:2;color:#fff;background-color:#0275d8;border-color:#0275d8}.page-item.disabled .page-link{color:#636c72;pointer-events:none;cursor:not-allowed;background-color:#fff;border-color:#ddd}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#0275d8;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#014c8c;text-decoration:none;background-color:#eceeef;border-color:#ddd}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:.3rem;border-top-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:.3rem;border-top-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-default{background-color:#636c72}.badge-default[href]:focus,.badge-default[href]:hover{background-color:#4b5257}.badge-primary{background-color:#0275d8}.badge-primary[href]:focus,.badge-primary[href]:hover{background-color:#025aa5}.badge-success{background-color:#5cb85c}.badge-success[href]:focus,.badge-success[href]:hover{background-color:#449d44}.badge-info{background-color:#5bc0de}.badge-info[href]:focus,.badge-info[href]:hover{background-color:#31b0d5}.badge-warning{background-color:#f0ad4e}.badge-warning[href]:focus,.badge-warning[href]:hover{background-color:#ec971f}.badge-danger{background-color:#d9534f}.badge-danger[href]:focus,.badge-danger[href]:hover{background-color:#c9302c}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#eceeef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-hr{border-top-color:#d0d5d8}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible .close{position:relative;top:-.75rem;right:-1.25rem;padding:.75rem 1.25rem;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d0e9c6;color:#3c763d}.alert-success hr{border-top-color:#c1e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bcdff1;color:#31708f}.alert-info hr{border-top-color:#a6d5ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faf2cc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7ecb5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebcccc;color:#a94442}.alert-danger hr{border-top-color:#e4b9b9}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;font-size:.75rem;line-height:1rem;text-align:center;background-color:#eceeef;border-radius:.25rem}.progress-bar{height:1rem;color:#fff;background-color:#0275d8}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:1rem 1rem;background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;-o-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%}.list-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#464a4c;text-align:inherit}.list-group-item-action .list-group-item-heading{color:#292b2c}.list-group-item-action:focus,.list-group-item-action:hover{color:#464a4c;text-decoration:none;background-color:#f7f7f9}.list-group-item-action:active{color:#292b2c;background-color:#eceeef}.list-group-item{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-right-radius:.25rem;border-top-left-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#636c72;cursor:not-allowed;background-color:#fff}.list-group-item.disabled .list-group-item-heading,.list-group-item:disabled .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item:disabled .list-group-item-text{color:#636c72}.list-group-item.active{z-index:2;color:#fff;background-color:#0275d8;border-color:#0275d8}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text{color:#daeeff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active{color:#fff;background-color:#a94442;border-color:#a94442}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.75}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out;-webkit-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:15px;border-bottom:1px solid #eceeef}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:15px}.modal-footer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding:15px;border-top:1px solid #eceeef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:30px auto}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip.bs-tether-element-attached-bottom,.tooltip.tooltip-top{padding:5px 0;margin-top:-3px}.tooltip.bs-tether-element-attached-bottom .tooltip-inner::before,.tooltip.tooltip-top .tooltip-inner::before{bottom:0;left:50%;margin-left:-5px;content:"";border-width:5px 5px 0;border-top-color:#000}.tooltip.bs-tether-element-attached-left,.tooltip.tooltip-right{padding:0 5px;margin-left:3px}.tooltip.bs-tether-element-attached-left .tooltip-inner::before,.tooltip.tooltip-right .tooltip-inner::before{top:50%;left:0;margin-top:-5px;content:"";border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bs-tether-element-attached-top,.tooltip.tooltip-bottom{padding:5px 0;margin-top:3px}.tooltip.bs-tether-element-attached-top .tooltip-inner::before,.tooltip.tooltip-bottom .tooltip-inner::before{top:0;left:50%;margin-left:-5px;content:"";border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bs-tether-element-attached-right,.tooltip.tooltip-left{padding:0 5px;margin-left:-3px}.tooltip.bs-tether-element-attached-right .tooltip-inner::before,.tooltip.tooltip-left .tooltip-inner::before{top:50%;right:0;margin-top:-5px;content:"";border-width:5px 0 5px 5px;border-left-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.tooltip-inner::before{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;padding:1px;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;font-size:.875rem;word-wrap:break-word;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover.bs-tether-element-attached-bottom,.popover.popover-top{margin-top:-10px}.popover.bs-tether-element-attached-bottom::after,.popover.bs-tether-element-attached-bottom::before,.popover.popover-top::after,.popover.popover-top::before{left:50%;border-bottom-width:0}.popover.bs-tether-element-attached-bottom::before,.popover.popover-top::before{bottom:-11px;margin-left:-11px;border-top-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-bottom::after,.popover.popover-top::after{bottom:-10px;margin-left:-10px;border-top-color:#fff}.popover.bs-tether-element-attached-left,.popover.popover-right{margin-left:10px}.popover.bs-tether-element-attached-left::after,.popover.bs-tether-element-attached-left::before,.popover.popover-right::after,.popover.popover-right::before{top:50%;border-left-width:0}.popover.bs-tether-element-attached-left::before,.popover.popover-right::before{left:-11px;margin-top:-11px;border-right-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-left::after,.popover.popover-right::after{left:-10px;margin-top:-10px;border-right-color:#fff}.popover.bs-tether-element-attached-top,.popover.popover-bottom{margin-top:10px}.popover.bs-tether-element-attached-top::after,.popover.bs-tether-element-attached-top::before,.popover.popover-bottom::after,.popover.popover-bottom::before{left:50%;border-top-width:0}.popover.bs-tether-element-attached-top::before,.popover.popover-bottom::before{top:-11px;margin-left:-11px;border-bottom-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-top::after,.popover.popover-bottom::after{top:-10px;margin-left:-10px;border-bottom-color:#f7f7f7}.popover.bs-tether-element-attached-top .popover-title::before,.popover.popover-bottom .popover-title::before{position:absolute;top:0;left:50%;display:block;width:20px;margin-left:-10px;content:"";border-bottom:1px solid #f7f7f7}.popover.bs-tether-element-attached-right,.popover.popover-left{margin-left:-10px}.popover.bs-tether-element-attached-right::after,.popover.bs-tether-element-attached-right::before,.popover.popover-left::after,.popover.popover-left::before{top:50%;border-right-width:0}.popover.bs-tether-element-attached-right::before,.popover.popover-left::before{right:-11px;margin-top:-11px;border-left-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-right::after,.popover.popover-left::after{right:-10px;margin-top:-10px;border-left-color:#fff}.popover-title{padding:8px 14px;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-right-radius:calc(.3rem - 1px);border-top-left-radius:calc(.3rem - 1px)}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover::after,.popover::before{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover::before{content:"";border-width:11px}.popover::after{content:"";border-width:10px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;width:100%}@media (-webkit-transform-3d){.carousel-item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}}@supports ((-webkit-transform:translate3d(0,0,0)) or (transform:translate3d(0,0,0))){.carousel-item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}@media (-webkit-transform-3d){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@supports ((-webkit-transform:translate3d(0,0,0)) or (transform:translate3d(0,0,0))){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;-webkit-background-size:100% 100%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;max-width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{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}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-faded{background-color:#f7f7f7}.bg-primary{background-color:#0275d8!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#025aa5!important}.bg-success{background-color:#5cb85c!important}a.bg-success:focus,a.bg-success:hover{background-color:#449d44!important}.bg-info{background-color:#5bc0de!important}a.bg-info:focus,a.bg-info:hover{background-color:#31b0d5!important}.bg-warning{background-color:#f0ad4e!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#ec971f!important}.bg-danger{background-color:#d9534f!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#c9302c!important}.bg-inverse{background-color:#292b2c!important}a.bg-inverse:focus,a.bg-inverse:hover{background-color:#101112!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.rounded{border-radius:.25rem}.rounded-top{border-top-right-radius:.25rem;border-top-left-radius:.25rem}.rounded-right{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.rounded-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-left{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.rounded-circle{border-radius:50%}.rounded-0{border-radius:0}.clearfix::after{display:block;content:"";clear:both}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.flex-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.flex-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.flex-unordered{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.flex-sm-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.flex-sm-unordered{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-sm-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-sm-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.flex-md-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.flex-md-unordered{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-md-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-md-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.flex-lg-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.flex-lg-unordered{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-lg-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-lg-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.flex-xl-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.flex-xl-unordered{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-xl-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-xl-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1030}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0 0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-right:0!important;margin-left:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem .25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem .5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:1rem 1rem!important}.mt-3{margin-top:1rem!important}.mr-3{margin-right:1rem!important}.mb-3{margin-bottom:1rem!important}.ml-3{margin-left:1rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-4{margin:1.5rem 1.5rem!important}.mt-4{margin-top:1.5rem!important}.mr-4{margin-right:1.5rem!important}.mb-4{margin-bottom:1.5rem!important}.ml-4{margin-left:1.5rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-5{margin:3rem 3rem!important}.mt-5{margin-top:3rem!important}.mr-5{margin-right:3rem!important}.mb-5{margin-bottom:3rem!important}.ml-5{margin-left:3rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-0{padding:0 0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-right:0!important;padding-left:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem .25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem .5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:1rem 1rem!important}.pt-3{padding-top:1rem!important}.pr-3{padding-right:1rem!important}.pb-3{padding-bottom:1rem!important}.pl-3{padding-left:1rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-4{padding:1.5rem 1.5rem!important}.pt-4{padding-top:1.5rem!important}.pr-4{padding-right:1.5rem!important}.pb-4{padding-bottom:1.5rem!important}.pl-4{padding-left:1.5rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-5{padding:3rem 3rem!important}.pt-5{padding-top:3rem!important}.pr-5{padding-right:3rem!important}.pb-5{padding-bottom:3rem!important}.pl-5{padding-left:3rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}@media (min-width:576px){.m-sm-0{margin:0 0!important}.mt-sm-0{margin-top:0!important}.mr-sm-0{margin-right:0!important}.mb-sm-0{margin-bottom:0!important}.ml-sm-0{margin-left:0!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.m-sm-1{margin:.25rem .25rem!important}.mt-sm-1{margin-top:.25rem!important}.mr-sm-1{margin-right:.25rem!important}.mb-sm-1{margin-bottom:.25rem!important}.ml-sm-1{margin-left:.25rem!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-sm-2{margin:.5rem .5rem!important}.mt-sm-2{margin-top:.5rem!important}.mr-sm-2{margin-right:.5rem!important}.mb-sm-2{margin-bottom:.5rem!important}.ml-sm-2{margin-left:.5rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-sm-3{margin:1rem 1rem!important}.mt-sm-3{margin-top:1rem!important}.mr-sm-3{margin-right:1rem!important}.mb-sm-3{margin-bottom:1rem!important}.ml-sm-3{margin-left:1rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-sm-4{margin:1.5rem 1.5rem!important}.mt-sm-4{margin-top:1.5rem!important}.mr-sm-4{margin-right:1.5rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.ml-sm-4{margin-left:1.5rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-sm-5{margin:3rem 3rem!important}.mt-sm-5{margin-top:3rem!important}.mr-sm-5{margin-right:3rem!important}.mb-sm-5{margin-bottom:3rem!important}.ml-sm-5{margin-left:3rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-sm-0{padding:0 0!important}.pt-sm-0{padding-top:0!important}.pr-sm-0{padding-right:0!important}.pb-sm-0{padding-bottom:0!important}.pl-sm-0{padding-left:0!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.p-sm-1{padding:.25rem .25rem!important}.pt-sm-1{padding-top:.25rem!important}.pr-sm-1{padding-right:.25rem!important}.pb-sm-1{padding-bottom:.25rem!important}.pl-sm-1{padding-left:.25rem!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-sm-2{padding:.5rem .5rem!important}.pt-sm-2{padding-top:.5rem!important}.pr-sm-2{padding-right:.5rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pl-sm-2{padding-left:.5rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-sm-3{padding:1rem 1rem!important}.pt-sm-3{padding-top:1rem!important}.pr-sm-3{padding-right:1rem!important}.pb-sm-3{padding-bottom:1rem!important}.pl-sm-3{padding-left:1rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-sm-4{padding:1.5rem 1.5rem!important}.pt-sm-4{padding-top:1.5rem!important}.pr-sm-4{padding-right:1.5rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pl-sm-4{padding-left:1.5rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-sm-5{padding:3rem 3rem!important}.pt-sm-5{padding-top:3rem!important}.pr-sm-5{padding-right:3rem!important}.pb-sm-5{padding-bottom:3rem!important}.pl-sm-5{padding-left:3rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto{margin-top:auto!important}.mr-sm-auto{margin-right:auto!important}.mb-sm-auto{margin-bottom:auto!important}.ml-sm-auto{margin-left:auto!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:768px){.m-md-0{margin:0 0!important}.mt-md-0{margin-top:0!important}.mr-md-0{margin-right:0!important}.mb-md-0{margin-bottom:0!important}.ml-md-0{margin-left:0!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.m-md-1{margin:.25rem .25rem!important}.mt-md-1{margin-top:.25rem!important}.mr-md-1{margin-right:.25rem!important}.mb-md-1{margin-bottom:.25rem!important}.ml-md-1{margin-left:.25rem!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-md-2{margin:.5rem .5rem!important}.mt-md-2{margin-top:.5rem!important}.mr-md-2{margin-right:.5rem!important}.mb-md-2{margin-bottom:.5rem!important}.ml-md-2{margin-left:.5rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-md-3{margin:1rem 1rem!important}.mt-md-3{margin-top:1rem!important}.mr-md-3{margin-right:1rem!important}.mb-md-3{margin-bottom:1rem!important}.ml-md-3{margin-left:1rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-md-4{margin:1.5rem 1.5rem!important}.mt-md-4{margin-top:1.5rem!important}.mr-md-4{margin-right:1.5rem!important}.mb-md-4{margin-bottom:1.5rem!important}.ml-md-4{margin-left:1.5rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-md-5{margin:3rem 3rem!important}.mt-md-5{margin-top:3rem!important}.mr-md-5{margin-right:3rem!important}.mb-md-5{margin-bottom:3rem!important}.ml-md-5{margin-left:3rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-md-0{padding:0 0!important}.pt-md-0{padding-top:0!important}.pr-md-0{padding-right:0!important}.pb-md-0{padding-bottom:0!important}.pl-md-0{padding-left:0!important}.px-md-0{padding-right:0!important;padding-left:0!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.p-md-1{padding:.25rem .25rem!important}.pt-md-1{padding-top:.25rem!important}.pr-md-1{padding-right:.25rem!important}.pb-md-1{padding-bottom:.25rem!important}.pl-md-1{padding-left:.25rem!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-md-2{padding:.5rem .5rem!important}.pt-md-2{padding-top:.5rem!important}.pr-md-2{padding-right:.5rem!important}.pb-md-2{padding-bottom:.5rem!important}.pl-md-2{padding-left:.5rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-md-3{padding:1rem 1rem!important}.pt-md-3{padding-top:1rem!important}.pr-md-3{padding-right:1rem!important}.pb-md-3{padding-bottom:1rem!important}.pl-md-3{padding-left:1rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-md-4{padding:1.5rem 1.5rem!important}.pt-md-4{padding-top:1.5rem!important}.pr-md-4{padding-right:1.5rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pl-md-4{padding-left:1.5rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-md-5{padding:3rem 3rem!important}.pt-md-5{padding-top:3rem!important}.pr-md-5{padding-right:3rem!important}.pb-md-5{padding-bottom:3rem!important}.pl-md-5{padding-left:3rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto{margin-top:auto!important}.mr-md-auto{margin-right:auto!important}.mb-md-auto{margin-bottom:auto!important}.ml-md-auto{margin-left:auto!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:992px){.m-lg-0{margin:0 0!important}.mt-lg-0{margin-top:0!important}.mr-lg-0{margin-right:0!important}.mb-lg-0{margin-bottom:0!important}.ml-lg-0{margin-left:0!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.m-lg-1{margin:.25rem .25rem!important}.mt-lg-1{margin-top:.25rem!important}.mr-lg-1{margin-right:.25rem!important}.mb-lg-1{margin-bottom:.25rem!important}.ml-lg-1{margin-left:.25rem!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-lg-2{margin:.5rem .5rem!important}.mt-lg-2{margin-top:.5rem!important}.mr-lg-2{margin-right:.5rem!important}.mb-lg-2{margin-bottom:.5rem!important}.ml-lg-2{margin-left:.5rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-lg-3{margin:1rem 1rem!important}.mt-lg-3{margin-top:1rem!important}.mr-lg-3{margin-right:1rem!important}.mb-lg-3{margin-bottom:1rem!important}.ml-lg-3{margin-left:1rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-lg-4{margin:1.5rem 1.5rem!important}.mt-lg-4{margin-top:1.5rem!important}.mr-lg-4{margin-right:1.5rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.ml-lg-4{margin-left:1.5rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-lg-5{margin:3rem 3rem!important}.mt-lg-5{margin-top:3rem!important}.mr-lg-5{margin-right:3rem!important}.mb-lg-5{margin-bottom:3rem!important}.ml-lg-5{margin-left:3rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-lg-0{padding:0 0!important}.pt-lg-0{padding-top:0!important}.pr-lg-0{padding-right:0!important}.pb-lg-0{padding-bottom:0!important}.pl-lg-0{padding-left:0!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.p-lg-1{padding:.25rem .25rem!important}.pt-lg-1{padding-top:.25rem!important}.pr-lg-1{padding-right:.25rem!important}.pb-lg-1{padding-bottom:.25rem!important}.pl-lg-1{padding-left:.25rem!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-lg-2{padding:.5rem .5rem!important}.pt-lg-2{padding-top:.5rem!important}.pr-lg-2{padding-right:.5rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pl-lg-2{padding-left:.5rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-lg-3{padding:1rem 1rem!important}.pt-lg-3{padding-top:1rem!important}.pr-lg-3{padding-right:1rem!important}.pb-lg-3{padding-bottom:1rem!important}.pl-lg-3{padding-left:1rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-lg-4{padding:1.5rem 1.5rem!important}.pt-lg-4{padding-top:1.5rem!important}.pr-lg-4{padding-right:1.5rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pl-lg-4{padding-left:1.5rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-lg-5{padding:3rem 3rem!important}.pt-lg-5{padding-top:3rem!important}.pr-lg-5{padding-right:3rem!important}.pb-lg-5{padding-bottom:3rem!important}.pl-lg-5{padding-left:3rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto{margin-top:auto!important}.mr-lg-auto{margin-right:auto!important}.mb-lg-auto{margin-bottom:auto!important}.ml-lg-auto{margin-left:auto!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0 0!important}.mt-xl-0{margin-top:0!important}.mr-xl-0{margin-right:0!important}.mb-xl-0{margin-bottom:0!important}.ml-xl-0{margin-left:0!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.m-xl-1{margin:.25rem .25rem!important}.mt-xl-1{margin-top:.25rem!important}.mr-xl-1{margin-right:.25rem!important}.mb-xl-1{margin-bottom:.25rem!important}.ml-xl-1{margin-left:.25rem!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-xl-2{margin:.5rem .5rem!important}.mt-xl-2{margin-top:.5rem!important}.mr-xl-2{margin-right:.5rem!important}.mb-xl-2{margin-bottom:.5rem!important}.ml-xl-2{margin-left:.5rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-xl-3{margin:1rem 1rem!important}.mt-xl-3{margin-top:1rem!important}.mr-xl-3{margin-right:1rem!important}.mb-xl-3{margin-bottom:1rem!important}.ml-xl-3{margin-left:1rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-xl-4{margin:1.5rem 1.5rem!important}.mt-xl-4{margin-top:1.5rem!important}.mr-xl-4{margin-right:1.5rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.ml-xl-4{margin-left:1.5rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-xl-5{margin:3rem 3rem!important}.mt-xl-5{margin-top:3rem!important}.mr-xl-5{margin-right:3rem!important}.mb-xl-5{margin-bottom:3rem!important}.ml-xl-5{margin-left:3rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-xl-0{padding:0 0!important}.pt-xl-0{padding-top:0!important}.pr-xl-0{padding-right:0!important}.pb-xl-0{padding-bottom:0!important}.pl-xl-0{padding-left:0!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.p-xl-1{padding:.25rem .25rem!important}.pt-xl-1{padding-top:.25rem!important}.pr-xl-1{padding-right:.25rem!important}.pb-xl-1{padding-bottom:.25rem!important}.pl-xl-1{padding-left:.25rem!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-xl-2{padding:.5rem .5rem!important}.pt-xl-2{padding-top:.5rem!important}.pr-xl-2{padding-right:.5rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pl-xl-2{padding-left:.5rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-xl-3{padding:1rem 1rem!important}.pt-xl-3{padding-top:1rem!important}.pr-xl-3{padding-right:1rem!important}.pb-xl-3{padding-bottom:1rem!important}.pl-xl-3{padding-left:1rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-xl-4{padding:1.5rem 1.5rem!important}.pt-xl-4{padding-top:1.5rem!important}.pr-xl-4{padding-right:1.5rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pl-xl-4{padding-left:1.5rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-xl-5{padding:3rem 3rem!important}.pt-xl-5{padding-top:3rem!important}.pr-xl-5{padding-right:3rem!important}.pb-xl-5{padding-bottom:3rem!important}.pl-xl-5{padding-left:3rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto{margin-top:auto!important}.mr-xl-auto{margin-right:auto!important}.mb-xl-auto{margin-bottom:auto!important}.ml-xl-auto{margin-left:auto!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-normal{font-weight:400}.font-weight-bold{font-weight:700}.font-italic{font-style:italic}.text-white{color:#fff!important}.text-muted{color:#636c72!important}a.text-muted:focus,a.text-muted:hover{color:#4b5257!important}.text-primary{color:#0275d8!important}a.text-primary:focus,a.text-primary:hover{color:#025aa5!important}.text-success{color:#5cb85c!important}a.text-success:focus,a.text-success:hover{color:#449d44!important}.text-info{color:#5bc0de!important}a.text-info:focus,a.text-info:hover{color:#31b0d5!important}.text-warning{color:#f0ad4e!important}a.text-warning:focus,a.text-warning:hover{color:#ec971f!important}.text-danger{color:#d9534f!important}a.text-danger:focus,a.text-danger:hover{color:#c9302c!important}.text-gray-dark{color:#292b2c!important}a.text-gray-dark:focus,a.text-gray-dark:hover{color:#101112!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.invisible{visibility:hidden!important}.hidden-xs-up{display:none!important}@media (max-width:575px){.hidden-xs-down{display:none!important}}@media (min-width:576px){.hidden-sm-up{display:none!important}}@media (max-width:767px){.hidden-sm-down{display:none!important}}@media (min-width:768px){.hidden-md-up{display:none!important}}@media (max-width:991px){.hidden-md-down{display:none!important}}@media (min-width:992px){.hidden-lg-up{display:none!important}}@media (max-width:1199px){.hidden-lg-down{display:none!important}}@media (min-width:1200px){.hidden-xl-up{display:none!important}}.hidden-xl-down{display:none!important}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}/*# sourceMappingURL=bootstrap.min.css.map */ diff --git a/cs4teachers/static/css/website.css b/cs4teachers/static/css/website.css deleted file mode 100644 index 0f5eb98c0..000000000 --- a/cs4teachers/static/css/website.css +++ /dev/null @@ -1,62 +0,0 @@ -body { - padding-top: 3rem; -} - -#welcome-jumbotron { - background-image: url(../img/panorama-cs4hs-2015.jpg); - background-repeat: no-repeat; - background-position: center center; - border-radius: 0; -} - -.navbar { - background-color: #0a83bb; -} - -footer { - margin-top: 3rem; - border-top: 1px solid #eee; -} - -.logo { - display: block; - height: 3rem; -} - -.schedule-line { - border-top: 2px solid #e0e0e0; -} - -.schedule-line-thin { - border-top: 1px solid #e0e0e0; -} - -/* Fixes #38 */ -/* This fix will be implemented in Bootstrap 4 Beta 1 */ -@media (max-width: 576px) { - nav > .container { - margin-left: 0; - margin-right: 0; - } -} - -.img-inline { - height: 1em; -} -.img-sponsor-logo { - height: 4rem; -} - -/* This fix should not be required in later versions of Bootstrap 4 */ -.table-responsive { - display: table !important; -} - -.card-block-med-height { - min-height: 9em; -} - -.link-no-underline:hover, -.link-no-underline:focus { - text-decoration: none; -} diff --git a/cs4teachers/static/favicon/android-chrome-192x192.png b/cs4teachers/static/favicon/android-chrome-192x192.png deleted file mode 100644 index 11b69ef73568d35053b08fe3039c9c2b5dcaf78b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12364 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 MDP_rOansQM0jDml2LJ#7 diff --git a/cs4teachers/static/favicon/android-chrome-384x384.png b/cs4teachers/static/favicon/android-chrome-384x384.png deleted file mode 100644 index 1dae19cff46e0d3905052e4a7298a632e90da554..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27013 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 diff --git a/cs4teachers/static/favicon/apple-touch-icon.png b/cs4teachers/static/favicon/apple-touch-icon.png deleted file mode 100644 index 706297004bc5cfb506cbcf47079f0ec267aed78a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11671 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 QfFVHg(#le`lBOa51Gy0?F8}}l diff --git a/cs4teachers/static/favicon/browserconfig.xml b/cs4teachers/static/favicon/browserconfig.xml deleted file mode 100644 index d87e2d342..000000000 --- a/cs4teachers/static/favicon/browserconfig.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - #2b5797 - - - diff --git a/cs4teachers/static/favicon/favicon-16x16.png b/cs4teachers/static/favicon/favicon-16x16.png deleted file mode 100644 index dc144d5eff1e8c351c8419bdc5000c0abd1b6f2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1091 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>4d*d$d=H2W~yMR(WExUm#)h8XU-*Rk;1ekKccj zH(XJhcvyGp(V*q$fByNq_0}uXnaBBC_w*dS|Ka;@qv^+38+Wlb>=fpL_4Vz4`WQ z#pUM>`|iB{`s?D0PdDCtdG_gt`=T=<9s43zUu@WaCu#jCLDk8_us$EFF!wc|LykMuTBe2Z@=~W#_KQMOU_O_{_w@; zpZe2|I?Oxu?%S^&w_l%m`cb+6(5*LL58QtT47!QO9~5l6-hSxbr=Nc^H(x#e_=9l! z-Ua8MKKc0l-~a!2-hSPE_sxmNAC5hGf9~1GmtTHzx9sL?-Lvb?n+?}rzW(|%b>o$Y z)fc;t+>`D;z}vbff7|uhXCKcw`=sm0eb}%WB5^r6 zAtB|_vxiTgJ%0XB^g&`;Vrs$@aSHZe6ZL3ql<$>9MZL17bx14ADt zCO-(je&Nca>(?$`y?ou&;K}p!2hWX-%nU=#jm5*ZZrJjOjcY~p>zg-j-L$r_vfQ1q zf|)fX_U;{9o4tE#YySRW{?Wkn=T)QQLB)lMSq}v#GAS6REMAnHG`C`Ea?+!gl!I-@ z)K%0}moLd$^=tXkW}c^~PnVEM!%9Xm)Y)mMd4( zx^7*&%6`ktWY;O94IfiYTz8pm-x9Uu>DKZSn+!LcE-Nc7{`~#Rx3B&)EIQ{;Y;2w@ zoFQqyf6W2~etvOlW`<=oW_R8PXgvi6lxm4Flc?^vJ*u^ZhlH;S|x4`Uv~ZhWzq1ekcg6?#Bzm#qWrYXoK%I9 z%7Rpd%z~0+28N0`k3aEn6ozSNobo??#`9?q1G6%>UNX0^vat7L5oTcpmj;u=Da^{7 sLljQmxN_pinIkes*iScjEb!7}cqJ}a^2y0`D$oiBPgg&ebxsLQ02e?Z4FCWD diff --git a/cs4teachers/static/favicon/favicon-32x32.png b/cs4teachers/static/favicon/favicon-32x32.png deleted file mode 100644 index 998c2534a5d73cdd2cf1c544700306cce7eccb6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1870 zcmb_dc{JPk7XJy#SgN*1J);?3r#glc9<9L{6>GHCX1q>2<5_}gt3_kRGPN(EmfBuX zlv1tM)E)L!j1b=aPY02qOn>8o_nGicSI{^5QrzrN9{qh*-;_U_ivEKqfVk!WLB%#Dj z0EmJBz_uR%Sd{>PR(Lta%LV{I)1EirjtVK*|F3ypQG&8$w zDn@>7oI-q1-Hv3n$9^N)XcF?=DX_ub5fNPH^!!y@Z27DrJ>b(uaN+&T~*h{SKE zm{I73zi0Q5ncUpL72WKfO9lPu26h3yS-0XWv_AgC#Rp=7Pj49kL@0c1ji?JQ%vPF zoOSt#q>8H?erW6LzEC{3b6`_G(z~*^!af?IbDk2G%}a(<)A6vHvBKfiCDviy;L5l8 z{hFw*Z}NJzGP_hW@G9xJ?+OXcb6a>C3rA&PmUdrHGVis1`Z}j4uw|y3#>yXB^{6AO zXW*}t4zZ3z=%roRL`+&Q^-v_PpV_!vNWfEBf6i||8(K;2r80Pe>8*V_Phe6!aJO|f zwTFsCFVMMsy`0{Z9%?0-UNo}Wv&{0WBh&Vd4us+tr1f_*o6LQ|r|pCB4c-`&TQNp2 zA+A}L4F@z&2eeGbU@2BFhS$0L#O|dEGTrXwsKK*7s8wsUr0;c*-tIR6Y3B~kX}cpR zaBI`wWy7hB%kKOL3))8WOrSPu5|&iJb!P|j`VU(tl8YP?=H@83Dlem?tK=f^ly|2j{f~p2St6&%PCoQq3Vq&pSGKCC*GNb zd3)y{)jGz7F7sI)n@iSpr5+d99_%OM{H1-|c#KNF_W2hjW!1m+k=pE?4bn|JT8e)B zId>zbv?!pA3%dT#_wLN>_F}jO9UsfzTFiSbzh&#UQq`O54l-Uu2H&VqK&1S*&gfU|JE|PrJ(Vh?Y@#YJF~3Sl$s3fdmeiE})%DJA0_WK#D>wXJyb zwOd_E=K+*_gi+olKTIYg;xKbb=f*R=aG(3;I#K3Eu{Yxj>fR{GRL)A*9w95B5zJk* z=nRy6^}D-8zMavTn-#b}9N!ZU?~&VgC>muC&DHI}o6JV1SVjlh8ZgenU}s#r&pZH@ zuos%*&&m93p(5oyTb6EN;>mM?0D5z3O=#Jvmo~C@2VBxCrEKy7m8H(c$U>{j^(I|+ z#83637d-0Ze5uhVOyg_v&C;Nw5|rI~~xA8VOp2>h>`81rm%FX;ri04EfI>Ef@4twe@s+*Ef41 zUh2wP{C{gs5uyTj8_(T2vA!}1i~HfhjR!zZmhI}R>%)U3rfi!1AD!iUZbZU!Vg$v% zr416IZE#$9_ANEMrS(d{DF}a0BdTG`mLi#ki%7>?NQ6H!$SN>0NCJQv#Pq5$#L^gI z4mUNkGPATYH8X;kSwSFabO-cb1YwU5p}{f#TX29Df7w?5iiO`odi(zl4v%~k9Qq&# zjEo5n0*8hp0|6kqe4VExAK_zYIO;(p!5H3vw1J{YprX2g`t?E$X?3teqIo|;+MpE< nCeF_c6G#MIf*di?rOMR=*w#`-@}L&Qk`w^U(cPg5>X-aqEFa0k diff --git a/cs4teachers/static/favicon/favicon.ico b/cs4teachers/static/favicon/favicon.ico deleted file mode 100644 index 1dfa64910693666c5fee119fbef29fa33897db7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 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 diff --git a/cs4teachers/static/favicon/manifest.json b/cs4teachers/static/favicon/manifest.json deleted file mode 100644 index 1a31ea4c4..000000000 --- a/cs4teachers/static/favicon/manifest.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "", - "icons": [ - { - "src": "/staticfiles/favicon/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/staticfiles/favicon/android-chrome-384x384.png", - "sizes": "384x384", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} \ No newline at end of file diff --git a/cs4teachers/static/favicon/mstile-150x150.png b/cs4teachers/static/favicon/mstile-150x150.png deleted file mode 100644 index 2ffc129c2f7ec9795c052359bf84d4408bef8c11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9021 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 E0L4G5AOHXW diff --git a/cs4teachers/static/favicon/safari-pinned-tab.svg b/cs4teachers/static/favicon/safari-pinned-tab.svg deleted file mode 100644 index 825389311..000000000 --- a/cs4teachers/static/favicon/safari-pinned-tab.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - -Created by potrace 1.11, written by Peter Selinger 2001-2013 - - - - - - - diff --git a/cs4teachers/static/img/panorama-cs4hs-2015.jpg b/cs4teachers/static/img/panorama-cs4hs-2015.jpg deleted file mode 100644 index b2c6e96b3cf139c905181fa245edd51ee97a5a2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44625 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 diff --git a/cs4teachers/static/img/uc-computer-science-education-logo.png b/cs4teachers/static/img/uc-computer-science-education-logo.png deleted file mode 100644 index 31fa0c3309a5f58133df084040bd1341cba61506..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10461 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 aH8uaR*_N)-0eK@LimH;PVx7E2#Qy-w#$zl1 diff --git a/cs4teachers/static/js/bootstrap.min.js b/cs4teachers/static/js/bootstrap.min.js deleted file mode 100644 index 4defbf97a..000000000 --- a/cs4teachers/static/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com) - * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");+function(t){var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(jQuery),+function(){function t(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function e(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(){function t(t,e){for(var n=0;nthis._items.length-1||e<0)){if(this._isSliding)return void t(this._element).one(m.SLID,function(){return n.to(e)});if(i===e)return this.pause(),void this.cycle();var o=e>i?p.NEXT:p.PREVIOUS;this._slide(o,this._items[e])}},h.prototype.dispose=function(){t(this._element).off(l),t.removeData(this._element,a),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},h.prototype._getConfig=function(n){return n=t.extend({},_,n),r.typeCheckConfig(e,n,g),n},h.prototype._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(m.KEYDOWN,function(t){return e._keydown(t)}),"hover"!==this._config.pause||"ontouchstart"in document.documentElement||t(this._element).on(m.MOUSEENTER,function(t){return e.pause(t)}).on(m.MOUSELEAVE,function(t){return e.cycle(t)})},h.prototype._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case d:t.preventDefault(),this.prev();break;case f:t.preventDefault(),this.next();break;default:return}},h.prototype._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(v.ITEM)),this._items.indexOf(e)},h.prototype._getItemByDirection=function(t,e){var n=t===p.NEXT,i=t===p.PREVIOUS,o=this._getItemIndex(e),r=this._items.length-1,s=i&&0===o||n&&o===r;if(s&&!this._config.wrap)return e;var a=t===p.PREVIOUS?-1:1,l=(o+a)%this._items.length;return l===-1?this._items[this._items.length-1]:this._items[l]},h.prototype._triggerSlideEvent=function(e,n){var i=t.Event(m.SLIDE,{relatedTarget:e,direction:n});return t(this._element).trigger(i),i},h.prototype._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(v.ACTIVE).removeClass(E.ACTIVE);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(E.ACTIVE)}},h.prototype._slide=function(e,n){var i=this,o=t(this._element).find(v.ACTIVE_ITEM)[0],s=n||o&&this._getItemByDirection(e,o),a=Boolean(this._interval),l=void 0,h=void 0,c=void 0;if(e===p.NEXT?(l=E.LEFT,h=E.NEXT,c=p.LEFT):(l=E.RIGHT,h=E.PREV,c=p.RIGHT),s&&t(s).hasClass(E.ACTIVE))return void(this._isSliding=!1);var d=this._triggerSlideEvent(s,c);if(!d.isDefaultPrevented()&&o&&s){this._isSliding=!0,a&&this.pause(),this._setActiveIndicatorElement(s);var f=t.Event(m.SLID,{relatedTarget:s,direction:c});r.supportsTransitionEnd()&&t(this._element).hasClass(E.SLIDE)?(t(s).addClass(h),r.reflow(s),t(o).addClass(l),t(s).addClass(l),t(o).one(r.TRANSITION_END,function(){t(s).removeClass(l+" "+h).addClass(E.ACTIVE),t(o).removeClass(E.ACTIVE+" "+h+" "+l),i._isSliding=!1,setTimeout(function(){return t(i._element).trigger(f)},0)}).emulateTransitionEnd(u)):(t(o).removeClass(E.ACTIVE),t(s).addClass(E.ACTIVE),this._isSliding=!1,t(this._element).trigger(f)),a&&this.cycle()}},h._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(a),o=t.extend({},_,t(this).data());"object"===("undefined"==typeof e?"undefined":i(e))&&t.extend(o,e);var r="string"==typeof e?e:o.slide;if(n||(n=new h(this,o),t(this).data(a,n)),"number"==typeof e)n.to(e);else if("string"==typeof r){if(void 0===n[r])throw new Error('No method named "'+r+'"');n[r]()}else o.interval&&(n.pause(),n.cycle())})},h._dataApiClickHandler=function(e){var n=r.getSelectorFromElement(this);if(n){var i=t(n)[0];if(i&&t(i).hasClass(E.CAROUSEL)){var o=t.extend({},t(i).data(),t(this).data()),s=this.getAttribute("data-slide-to");s&&(o.interval=!1),h._jQueryInterface.call(t(i),o),s&&t(i).data(a).to(s),e.preventDefault()}}},o(h,null,[{key:"VERSION",get:function(){return s}},{key:"Default",get:function(){return _}}]),h}();return t(document).on(m.CLICK_DATA_API,v.DATA_SLIDE,T._dataApiClickHandler),t(window).on(m.LOAD_DATA_API,function(){t(v.DATA_RIDE).each(function(){var e=t(this);T._jQueryInterface.call(e,e.data())})}),t.fn[e]=T._jQueryInterface,t.fn[e].Constructor=T,t.fn[e].noConflict=function(){return t.fn[e]=c,T._jQueryInterface},T}(jQuery),function(t){var e="collapse",s="4.0.0-alpha.6",a="bs.collapse",l="."+a,h=".data-api",c=t.fn[e],u=600,d={toggle:!0,parent:""},f={toggle:"boolean",parent:"string"},_={SHOW:"show"+l,SHOWN:"shown"+l,HIDE:"hide"+l,HIDDEN:"hidden"+l,CLICK_DATA_API:"click"+l+h},g={SHOW:"show",COLLAPSE:"collapse",COLLAPSING:"collapsing",COLLAPSED:"collapsed"},p={WIDTH:"width",HEIGHT:"height"},m={ACTIVES:".card > .show, .card > .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},E=function(){function l(e,i){n(this,l),this._isTransitioning=!1,this._element=e,this._config=this._getConfig(i),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],'+('[data-toggle="collapse"][data-target="#'+e.id+'"]'))),this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}return l.prototype.toggle=function(){t(this._element).hasClass(g.SHOW)?this.hide():this.show()},l.prototype.show=function(){var e=this;if(this._isTransitioning)throw new Error("Collapse is transitioning");if(!t(this._element).hasClass(g.SHOW)){var n=void 0,i=void 0;if(this._parent&&(n=t.makeArray(t(this._parent).find(m.ACTIVES)),n.length||(n=null)),!(n&&(i=t(n).data(a),i&&i._isTransitioning))){var o=t.Event(_.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){n&&(l._jQueryInterface.call(t(n),"hide"),i||t(n).data(a,null));var s=this._getDimension();t(this._element).removeClass(g.COLLAPSE).addClass(g.COLLAPSING),this._element.style[s]=0,this._element.setAttribute("aria-expanded",!0),this._triggerArray.length&&t(this._triggerArray).removeClass(g.COLLAPSED).attr("aria-expanded",!0),this.setTransitioning(!0);var h=function(){t(e._element).removeClass(g.COLLAPSING).addClass(g.COLLAPSE).addClass(g.SHOW),e._element.style[s]="",e.setTransitioning(!1),t(e._element).trigger(_.SHOWN)};if(!r.supportsTransitionEnd())return void h();var c=s[0].toUpperCase()+s.slice(1),d="scroll"+c;t(this._element).one(r.TRANSITION_END,h).emulateTransitionEnd(u),this._element.style[s]=this._element[d]+"px"}}}},l.prototype.hide=function(){var e=this;if(this._isTransitioning)throw new Error("Collapse is transitioning");if(t(this._element).hasClass(g.SHOW)){var n=t.Event(_.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension(),o=i===p.WIDTH?"offsetWidth":"offsetHeight";this._element.style[i]=this._element[o]+"px",r.reflow(this._element),t(this._element).addClass(g.COLLAPSING).removeClass(g.COLLAPSE).removeClass(g.SHOW),this._element.setAttribute("aria-expanded",!1),this._triggerArray.length&&t(this._triggerArray).addClass(g.COLLAPSED).attr("aria-expanded",!1),this.setTransitioning(!0);var s=function(){e.setTransitioning(!1),t(e._element).removeClass(g.COLLAPSING).addClass(g.COLLAPSE).trigger(_.HIDDEN)};return this._element.style[i]="",r.supportsTransitionEnd()?void t(this._element).one(r.TRANSITION_END,s).emulateTransitionEnd(u):void s()}}},l.prototype.setTransitioning=function(t){this._isTransitioning=t},l.prototype.dispose=function(){t.removeData(this._element,a),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},l.prototype._getConfig=function(n){return n=t.extend({},d,n),n.toggle=Boolean(n.toggle),r.typeCheckConfig(e,n,f),n},l.prototype._getDimension=function(){var e=t(this._element).hasClass(p.WIDTH);return e?p.WIDTH:p.HEIGHT},l.prototype._getParent=function(){var e=this,n=t(this._config.parent)[0],i='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return t(n).find(i).each(function(t,n){e._addAriaAndCollapsedClass(l._getTargetFromElement(n),[n])}),n},l.prototype._addAriaAndCollapsedClass=function(e,n){if(e){var i=t(e).hasClass(g.SHOW);e.setAttribute("aria-expanded",i),n.length&&t(n).toggleClass(g.COLLAPSED,!i).attr("aria-expanded",i)}},l._getTargetFromElement=function(e){var n=r.getSelectorFromElement(e);return n?t(n)[0]:null},l._jQueryInterface=function(e){return this.each(function(){var n=t(this),o=n.data(a),r=t.extend({},d,n.data(),"object"===("undefined"==typeof e?"undefined":i(e))&&e);if(!o&&r.toggle&&/show|hide/.test(e)&&(r.toggle=!1),o||(o=new l(this,r),n.data(a,o)),"string"==typeof e){if(void 0===o[e])throw new Error('No method named "'+e+'"');o[e]()}})},o(l,null,[{key:"VERSION",get:function(){return s}},{key:"Default",get:function(){return d}}]),l}();return t(document).on(_.CLICK_DATA_API,m.DATA_TOGGLE,function(e){e.preventDefault();var n=E._getTargetFromElement(this),i=t(n).data(a),o=i?"toggle":t(this).data();E._jQueryInterface.call(t(n),o)}),t.fn[e]=E._jQueryInterface,t.fn[e].Constructor=E,t.fn[e].noConflict=function(){return t.fn[e]=c,E._jQueryInterface},E}(jQuery),function(t){var e="dropdown",i="4.0.0-alpha.6",s="bs.dropdown",a="."+s,l=".data-api",h=t.fn[e],c=27,u=38,d=40,f=3,_={HIDE:"hide"+a,HIDDEN:"hidden"+a,SHOW:"show"+a,SHOWN:"shown"+a,CLICK:"click"+a,CLICK_DATA_API:"click"+a+l,FOCUSIN_DATA_API:"focusin"+a+l,KEYDOWN_DATA_API:"keydown"+a+l},g={BACKDROP:"dropdown-backdrop",DISABLED:"disabled",SHOW:"show"},p={BACKDROP:".dropdown-backdrop",DATA_TOGGLE:'[data-toggle="dropdown"]',FORM_CHILD:".dropdown form",ROLE_MENU:'[role="menu"]',ROLE_LISTBOX:'[role="listbox"]',NAVBAR_NAV:".navbar-nav",VISIBLE_ITEMS:'[role="menu"] li:not(.disabled) a, [role="listbox"] li:not(.disabled) a'},m=function(){function e(t){n(this,e),this._element=t,this._addEventListeners()}return e.prototype.toggle=function(){if(this.disabled||t(this).hasClass(g.DISABLED))return!1;var n=e._getParentFromElement(this),i=t(n).hasClass(g.SHOW);if(e._clearMenus(),i)return!1;if("ontouchstart"in document.documentElement&&!t(n).closest(p.NAVBAR_NAV).length){var o=document.createElement("div");o.className=g.BACKDROP,t(o).insertBefore(this),t(o).on("click",e._clearMenus)}var r={relatedTarget:this},s=t.Event(_.SHOW,r);return t(n).trigger(s),!s.isDefaultPrevented()&&(this.focus(),this.setAttribute("aria-expanded",!0),t(n).toggleClass(g.SHOW),t(n).trigger(t.Event(_.SHOWN,r)),!1)},e.prototype.dispose=function(){t.removeData(this._element,s),t(this._element).off(a),this._element=null},e.prototype._addEventListeners=function(){t(this._element).on(_.CLICK,this.toggle)},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data(s);if(i||(i=new e(this),t(this).data(s,i)),"string"==typeof n){if(void 0===i[n])throw new Error('No method named "'+n+'"');i[n].call(this)}})},e._clearMenus=function(n){if(!n||n.which!==f){var i=t(p.BACKDROP)[0];i&&i.parentNode.removeChild(i);for(var o=t.makeArray(t(p.DATA_TOGGLE)),r=0;r0&&a--,n.which===d&&adocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},h.prototype._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},h.prototype._checkScrollbar=function(){this._isBodyOverflowing=document.body.clientWidth=n){var i=this._targets[this._targets.length-1];return void(this._activeTarget!==i&&this._activate(i))}if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){var r=this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t "+g.NAV_LINKS).addClass(_.ACTIVE),t(this._scrollElement).trigger(f.ACTIVATE,{relatedTarget:e})},h.prototype._clear=function(){t(this._selector).filter(g.ACTIVE).removeClass(_.ACTIVE)},h._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(a),o="object"===("undefined"==typeof e?"undefined":i(e))&&e; -if(n||(n=new h(this,o),t(this).data(a,n)),"string"==typeof e){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(h,null,[{key:"VERSION",get:function(){return s}},{key:"Default",get:function(){return u}}]),h}();return t(window).on(f.LOAD_DATA_API,function(){for(var e=t.makeArray(t(g.DATA_SPY)),n=e.length;n--;){var i=t(e[n]);m._jQueryInterface.call(i,i.data())}}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=c,m._jQueryInterface},m}(jQuery),function(t){var e="tab",i="4.0.0-alpha.6",s="bs.tab",a="."+s,l=".data-api",h=t.fn[e],c=150,u={HIDE:"hide"+a,HIDDEN:"hidden"+a,SHOW:"show"+a,SHOWN:"shown"+a,CLICK_DATA_API:"click"+a+l},d={DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active",DISABLED:"disabled",FADE:"fade",SHOW:"show"},f={A:"a",LI:"li",DROPDOWN:".dropdown",LIST:"ul:not(.dropdown-menu), ol:not(.dropdown-menu), nav:not(.dropdown-menu)",FADE_CHILD:"> .nav-item .fade, > .fade",ACTIVE:".active",ACTIVE_CHILD:"> .nav-item > .active, > .active",DATA_TOGGLE:'[data-toggle="tab"], [data-toggle="pill"]',DROPDOWN_TOGGLE:".dropdown-toggle",DROPDOWN_ACTIVE_CHILD:"> .dropdown-menu .active"},_=function(){function e(t){n(this,e),this._element=t}return e.prototype.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(d.ACTIVE)||t(this._element).hasClass(d.DISABLED))){var n=void 0,i=void 0,o=t(this._element).closest(f.LIST)[0],s=r.getSelectorFromElement(this._element);o&&(i=t.makeArray(t(o).find(f.ACTIVE)),i=i[i.length-1]);var a=t.Event(u.HIDE,{relatedTarget:this._element}),l=t.Event(u.SHOW,{relatedTarget:i});if(i&&t(i).trigger(a),t(this._element).trigger(l),!l.isDefaultPrevented()&&!a.isDefaultPrevented()){s&&(n=t(s)[0]),this._activate(this._element,o);var h=function(){var n=t.Event(u.HIDDEN,{relatedTarget:e._element}),o=t.Event(u.SHOWN,{relatedTarget:i});t(i).trigger(n),t(e._element).trigger(o)};n?this._activate(n,n.parentNode,h):h()}}},e.prototype.dispose=function(){t.removeClass(this._element,s),this._element=null},e.prototype._activate=function(e,n,i){var o=this,s=t(n).find(f.ACTIVE_CHILD)[0],a=i&&r.supportsTransitionEnd()&&(s&&t(s).hasClass(d.FADE)||Boolean(t(n).find(f.FADE_CHILD)[0])),l=function(){return o._transitionComplete(e,s,a,i)};s&&a?t(s).one(r.TRANSITION_END,l).emulateTransitionEnd(c):l(),s&&t(s).removeClass(d.SHOW)},e.prototype._transitionComplete=function(e,n,i,o){if(n){t(n).removeClass(d.ACTIVE);var s=t(n.parentNode).find(f.DROPDOWN_ACTIVE_CHILD)[0];s&&t(s).removeClass(d.ACTIVE),n.setAttribute("aria-expanded",!1)}if(t(e).addClass(d.ACTIVE),e.setAttribute("aria-expanded",!0),i?(r.reflow(e),t(e).addClass(d.SHOW)):t(e).removeClass(d.FADE),e.parentNode&&t(e.parentNode).hasClass(d.DROPDOWN_MENU)){var a=t(e).closest(f.DROPDOWN)[0];a&&t(a).find(f.DROPDOWN_TOGGLE).addClass(d.ACTIVE),e.setAttribute("aria-expanded",!0)}o&&o()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data(s);if(o||(o=new e(this),i.data(s,o)),"string"==typeof n){if(void 0===o[n])throw new Error('No method named "'+n+'"');o[n]()}})},o(e,null,[{key:"VERSION",get:function(){return i}}]),e}();return t(document).on(u.CLICK_DATA_API,f.DATA_TOGGLE,function(e){e.preventDefault(),_._jQueryInterface.call(t(this),"show")}),t.fn[e]=_._jQueryInterface,t.fn[e].Constructor=_,t.fn[e].noConflict=function(){return t.fn[e]=h,_._jQueryInterface},_}(jQuery),function(t){if("undefined"==typeof Tether)throw new Error("Bootstrap tooltips require Tether (http://tether.io/)");var e="tooltip",s="4.0.0-alpha.6",a="bs.tooltip",l="."+a,h=t.fn[e],c=150,u="bs-tether",d={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:"0 0",constraints:[],container:!1},f={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"string",constraints:"array",container:"(string|element|boolean)"},_={TOP:"bottom center",RIGHT:"middle left",BOTTOM:"top center",LEFT:"middle right"},g={SHOW:"show",OUT:"out"},p={HIDE:"hide"+l,HIDDEN:"hidden"+l,SHOW:"show"+l,SHOWN:"shown"+l,INSERTED:"inserted"+l,CLICK:"click"+l,FOCUSIN:"focusin"+l,FOCUSOUT:"focusout"+l,MOUSEENTER:"mouseenter"+l,MOUSELEAVE:"mouseleave"+l},m={FADE:"fade",SHOW:"show"},E={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner"},v={element:!1,enabled:!1},T={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},I=function(){function h(t,e){n(this,h),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._isTransitioning=!1,this._tether=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}return h.prototype.enable=function(){this._isEnabled=!0},h.prototype.disable=function(){this._isEnabled=!1},h.prototype.toggleEnabled=function(){this._isEnabled=!this._isEnabled},h.prototype.toggle=function(e){if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(m.SHOW))return void this._leave(null,this);this._enter(null,this)}},h.prototype.dispose=function(){clearTimeout(this._timeout),this.cleanupTether(),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._tether=null,this.element=null,this.config=null,this.tip=null},h.prototype.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var n=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){if(this._isTransitioning)throw new Error("Tooltip is transitioning");t(this.element).trigger(n);var i=t.contains(this.element.ownerDocument.documentElement,this.element);if(n.isDefaultPrevented()||!i)return;var o=this.getTipElement(),s=r.getUID(this.constructor.NAME);o.setAttribute("id",s),this.element.setAttribute("aria-describedby",s),this.setContent(),this.config.animation&&t(o).addClass(m.FADE);var a="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,l=this._getAttachment(a),c=this.config.container===!1?document.body:t(this.config.container);t(o).data(this.constructor.DATA_KEY,this).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._tether=new Tether({attachment:l,element:o,target:this.element,classes:v,classPrefix:u,offset:this.config.offset,constraints:this.config.constraints,addTargetClasses:!1}),r.reflow(o),this._tether.position(),t(o).addClass(m.SHOW);var d=function(){var n=e._hoverState;e._hoverState=null,e._isTransitioning=!1,t(e.element).trigger(e.constructor.Event.SHOWN),n===g.OUT&&e._leave(null,e)};if(r.supportsTransitionEnd()&&t(this.tip).hasClass(m.FADE))return this._isTransitioning=!0,void t(this.tip).one(r.TRANSITION_END,d).emulateTransitionEnd(h._TRANSITION_DURATION);d()}},h.prototype.hide=function(e){var n=this,i=this.getTipElement(),o=t.Event(this.constructor.Event.HIDE);if(this._isTransitioning)throw new Error("Tooltip is transitioning");var s=function(){n._hoverState!==g.SHOW&&i.parentNode&&i.parentNode.removeChild(i),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),n._isTransitioning=!1,n.cleanupTether(),e&&e()};t(this.element).trigger(o),o.isDefaultPrevented()||(t(i).removeClass(m.SHOW),this._activeTrigger[T.CLICK]=!1,this._activeTrigger[T.FOCUS]=!1,this._activeTrigger[T.HOVER]=!1,r.supportsTransitionEnd()&&t(this.tip).hasClass(m.FADE)?(this._isTransitioning=!0,t(i).one(r.TRANSITION_END,s).emulateTransitionEnd(c)):s(),this._hoverState="")},h.prototype.isWithContent=function(){return Boolean(this.getTitle())},h.prototype.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0]},h.prototype.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(E.TOOLTIP_INNER),this.getTitle()),e.removeClass(m.FADE+" "+m.SHOW),this.cleanupTether()},h.prototype.setElementContent=function(e,n){var o=this.config.html;"object"===("undefined"==typeof n?"undefined":i(n))&&(n.nodeType||n.jquery)?o?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[o?"html":"text"](n)},h.prototype.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},h.prototype.cleanupTether=function(){this._tether&&this._tether.destroy()},h.prototype._getAttachment=function(t){return _[t.toUpperCase()]},h.prototype._setListeners=function(){var e=this,n=this.config.trigger.split(" ");n.forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==T.MANUAL){var i=n===T.HOVER?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,o=n===T.HOVER?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(o,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=t.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},h.prototype._fixTitle=function(){var t=i(this.element.getAttribute("data-original-title"));(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},h.prototype._enter=function(e,n){var i=this.constructor.DATA_KEY;return n=n||t(e.currentTarget).data(i),n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?T.FOCUS:T.HOVER]=!0),t(n.getTipElement()).hasClass(m.SHOW)||n._hoverState===g.SHOW?void(n._hoverState=g.SHOW):(clearTimeout(n._timeout),n._hoverState=g.SHOW,n.config.delay&&n.config.delay.show?void(n._timeout=setTimeout(function(){n._hoverState===g.SHOW&&n.show()},n.config.delay.show)):void n.show())},h.prototype._leave=function(e,n){var i=this.constructor.DATA_KEY;if(n=n||t(e.currentTarget).data(i),n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?T.FOCUS:T.HOVER]=!1),!n._isWithActiveTrigger())return clearTimeout(n._timeout),n._hoverState=g.OUT,n.config.delay&&n.config.delay.hide?void(n._timeout=setTimeout(function(){n._hoverState===g.OUT&&n.hide()},n.config.delay.hide)):void n.hide()},h.prototype._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},h.prototype._getConfig=function(n){return n=t.extend({},this.constructor.Default,t(this.element).data(),n),n.delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),r.typeCheckConfig(e,n,this.constructor.DefaultType),n},h.prototype._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},h._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(a),o="object"===("undefined"==typeof e?"undefined":i(e))&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new h(this,o),t(this).data(a,n)),"string"==typeof e)){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(h,null,[{key:"VERSION",get:function(){return s}},{key:"Default",get:function(){return d}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return a}},{key:"Event",get:function(){return p}},{key:"EVENT_KEY",get:function(){return l}},{key:"DefaultType",get:function(){return f}}]),h}();return t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=h,I._jQueryInterface},I}(jQuery));(function(r){var a="popover",l="4.0.0-alpha.6",h="bs.popover",c="."+h,u=r.fn[a],d=r.extend({},s.Default,{placement:"right",trigger:"click",content:"",template:''}),f=r.extend({},s.DefaultType,{content:"(string|element|function)"}),_={FADE:"fade",SHOW:"show"},g={TITLE:".popover-title",CONTENT:".popover-content"},p={HIDE:"hide"+c,HIDDEN:"hidden"+c,SHOW:"show"+c,SHOWN:"shown"+c,INSERTED:"inserted"+c,CLICK:"click"+c,FOCUSIN:"focusin"+c,FOCUSOUT:"focusout"+c,MOUSEENTER:"mouseenter"+c,MOUSELEAVE:"mouseleave"+c},m=function(s){function u(){return n(this,u),t(this,s.apply(this,arguments))}return e(u,s),u.prototype.isWithContent=function(){return this.getTitle()||this._getContent()},u.prototype.getTipElement=function(){return this.tip=this.tip||r(this.config.template)[0]},u.prototype.setContent=function(){var t=r(this.getTipElement());this.setElementContent(t.find(g.TITLE),this.getTitle()),this.setElementContent(t.find(g.CONTENT),this._getContent()),t.removeClass(_.FADE+" "+_.SHOW),this.cleanupTether()},u.prototype._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},u._jQueryInterface=function(t){return this.each(function(){var e=r(this).data(h),n="object"===("undefined"==typeof t?"undefined":i(t))?t:null;if((e||!/destroy|hide/.test(t))&&(e||(e=new u(this,n),r(this).data(h,e)),"string"==typeof t)){if(void 0===e[t])throw new Error('No method named "'+t+'"');e[t]()}})},o(u,null,[{key:"VERSION",get:function(){return l}},{key:"Default",get:function(){return d}},{key:"NAME",get:function(){return a}},{key:"DATA_KEY",get:function(){return h}},{key:"Event",get:function(){return p}},{key:"EVENT_KEY",get:function(){return c}},{key:"DefaultType",get:function(){return f}}]),u}(s);return r.fn[a]=m._jQueryInterface,r.fn[a].Constructor=m,r.fn[a].noConflict=function(){return r.fn[a]=u,m._jQueryInterface},m})(jQuery)}(); diff --git a/cs4teachers/static/js/ie10-viewport-bug-workaround.js b/cs4teachers/static/js/ie10-viewport-bug-workaround.js deleted file mode 100644 index b335ef943..000000000 --- a/cs4teachers/static/js/ie10-viewport-bug-workaround.js +++ /dev/null @@ -1,24 +0,0 @@ -/*! - * IE10 viewport hack for Surface/desktop Windows 8 bug - * Copyright 2014-2017 The Bootstrap Authors - * Copyright 2014-2017 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -// See the Getting Started docs for more information: -// https://getbootstrap.com/getting-started/#support-ie10-width - -(function () { - 'use strict' - - if (navigator.userAgent.match(/IEMobile\/10\.0/)) { - var msViewportStyle = document.createElement('style') - msViewportStyle.appendChild( - document.createTextNode( - '@-ms-viewport{width:auto!important}' - ) - ) - document.head.appendChild(msViewportStyle) - } - -}()) diff --git a/cs4teachers/static/js/jquery-3.2.1.slim.min.js b/cs4teachers/static/js/jquery-3.2.1.slim.min.js deleted file mode 100644 index 105d00e61..000000000 --- a/cs4teachers/static/js/jquery-3.2.1.slim.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector | (c) JS Foundation and other contributors | jquery.org/license */ -!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a); -}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}}),r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var _a,ab=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?_a:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),_a={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ab[b]||r.find.attr;ab[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ab[g],ab[g]=e,e=null!=c(a,b,d)?g:null,ab[g]=f),e}});var bb=/^(?:input|select|textarea|button)$/i,cb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function db(a){var b=a.match(L)||[];return b.join(" ")}function eb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,eb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,eb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,eb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=eb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+db(eb(c))+" ").indexOf(b)>-1)return!0;return!1}});var fb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(fb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:db(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var gb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!gb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,gb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var hb=/\[\]$/,ib=/\r?\n/g,jb=/^(?:submit|button|image|reset|file)$/i,kb=/^(?:input|select|textarea|keygen)/i;function lb(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||hb.test(a)?d(a,e):lb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d); -});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)lb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)lb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&kb.test(this.nodeName)&&!jb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ib,"\r\n")}}):{name:b.name,value:c.replace(ib,"\r\n")}}).get()}}),r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="
",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var mb=a.jQuery,nb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=nb),b&&a.jQuery===r&&(a.jQuery=mb),r},b||(a.jQuery=a.$=r),r}); diff --git a/cs4teachers/static/js/tether.min.js b/cs4teachers/static/js/tether.min.js deleted file mode 100644 index a43a647e3..000000000 --- a/cs4teachers/static/js/tether.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t){var e=t.getBoundingClientRect(),o={};for(var n in e)o[n]=e[n];if(t.ownerDocument!==document){var r=t.ownerDocument.defaultView.frameElement;if(r){var s=i(r);o.top+=s.top,o.bottom+=s.top,o.left+=s.left,o.right+=s.left}}return o}function r(t){var e=getComputedStyle(t)||{},o=e.position,n=[];if("fixed"===o)return[t];for(var i=t;(i=i.parentNode)&&i&&1===i.nodeType;){var r=void 0;try{r=getComputedStyle(i)}catch(s){}if("undefined"==typeof r||null===r)return n.push(i),n;var a=r,f=a.overflow,l=a.overflowX,h=a.overflowY;/(auto|scroll)/.test(f+h+l)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(r.position)>=0)&&n.push(i)}return n.push(t.ownerDocument.body),t.ownerDocument!==document&&n.push(t.ownerDocument.defaultView),n}function s(){A&&document.body.removeChild(A),A=null}function a(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,n=i(t),r=P();return n.top-=r.top,n.left-=r.left,"undefined"==typeof n.width&&(n.width=document.body.scrollWidth-n.left-n.right),"undefined"==typeof n.height&&(n.height=document.body.scrollHeight-n.top-n.bottom),n.top=n.top-o.clientTop,n.left=n.left-o.clientLeft,n.right=e.body.clientWidth-n.width-n.left,n.bottom=e.body.clientHeight-n.height-n.top,n}function f(t){return t.offsetParent||document.documentElement}function l(){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");h(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var n=t.offsetWidth;o===n&&(n=e.clientWidth),document.body.removeChild(e);var i=o-n;return{width:i,height:i}}function h(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function u(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),n=c(t).replace(o," ");g(t,n)}}function d(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{u(t,e);var o=c(t)+(" "+e);g(t,o)}}function p(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=c(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function c(t){return t.className instanceof t.ownerDocument.defaultView.SVGAnimatedString?t.className.baseVal:t.className}function g(t,e){t.setAttribute("class",e)}function m(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&p(t,o)&&u(t,o)}),e.forEach(function(e){p(t,e)||d(t,e)})}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function v(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function y(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function b(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function w(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),n=0;e>n;n++)o[n]=arguments[n];return o.forEach(function(e){var o=e.top,n=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof n&&(n=parseFloat(n,10)),t.top+=o,t.left+=n}),t}function C(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t}function O(t,e){return"scrollParent"===e?e=t.scrollParents[0]:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=e,o=a(e),n=o,i=getComputedStyle(e);if(e=[n.left,n.top,o.width+n.left,o.height+n.top],t.ownerDocument!==document){var r=t.ownerDocument.defaultView;e[0]+=r.pageXOffset,e[1]+=r.pageYOffset,e[2]+=r.pageXOffset,e[3]+=r.pageYOffset}$.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(i["border"+t+"Width"]):e[o]-=parseFloat(i["border"+t+"Width"])})}(),e}var E=function(){function t(t,e){for(var o=0;o1?o-1:0),i=1;o>i;i++)n[i-1]=arguments[i];for(;e16?(e=Math.min(e-16,250),void(o=setTimeout(i,250))):void("undefined"!=typeof t&&b()-t<10||(null!=o&&(clearTimeout(o),o=null),t=b(),D(),e=b()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,n)})}();var X={center:"center",left:"right",right:"left"},F={middle:"middle",top:"bottom",bottom:"top"},H={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},N=function(t,e){var o=t.left,n=t.top;return"auto"===o&&(o=X[e.left]),"auto"===n&&(n=F[e.top]),{left:o,top:n}},U=function(t){var e=t.left,o=t.top;return"undefined"!=typeof H[t.left]&&(e=H[t.left]),"undefined"!=typeof H[t.top]&&(o=H[t.top]),{left:e,top:o}},V=function(t){var e=t.split(" "),o=B(e,2),n=o[0],i=o[1];return{top:n,left:i}},R=V,q=function(t){function e(t){var o=this;n(this,e),z(Object.getPrototypeOf(e.prototype),"constructor",this).call(this),this.position=this.position.bind(this),L.push(this),this.history=[],this.setOptions(t,!1),x.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return v(e,t),E(e,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],n={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=h(n,t);var i=this.options,s=i.element,a=i.target,f=i.targetModifier;if(this.element=s,this.target=a,this.targetModifier=f,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),d(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&d(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=R(this.options.targetAttachment),this.attachment=R(this.options.attachment),this.offset=V(this.options.offset),this.targetOffset=V(this.options.targetOffset),"undefined"!=typeof this.scrollParents&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=r(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return a(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=a(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[n.overflow,n.overflowX].indexOf("scroll")>=0||this.target!==document.body,r=0;i&&(r=15);var s=t.height-parseFloat(n.borderTopWidth)-parseFloat(n.borderBottomWidth)-r,e={width:15,height:.975*s*(s/o.scrollHeight),left:t.left+t.width-parseFloat(n.borderLeftWidth)-15},f=0;408>s&&this.target===document.body&&(f=-11e-5*Math.pow(s,2)-.00727*s+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var l=this.target.scrollTop/(o.scrollHeight-s);return e.top=l*(s-e.height-f)+t.top+parseFloat(n.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&d(this.target,this.getClass("enabled")),d(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==t.target.ownerDocument&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;u(this.target,this.getClass("enabled")),u(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),L.forEach(function(e,o){e===t&&L.splice(o,1)}),0===L.length&&s()}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var n=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var i=this._addAttachClasses;t.top&&i.push(this.getClass("element-attached")+"-"+t.top),t.left&&i.push(this.getClass("element-attached")+"-"+t.left),e.top&&i.push(this.getClass("target-attached")+"-"+e.top),e.left&&i.push(this.getClass("target-attached")+"-"+e.left);var r=[];n.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),M(function(){"undefined"!=typeof o._addAttachClasses&&(m(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&m(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=N(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var n=this.cache("element-bounds",function(){return a(t.element)}),i=n.width,r=n.height;if(0===i&&0===r&&"undefined"!=typeof this.lastSize){var s=this.lastSize;i=s.width,r=s.height}else this.lastSize={width:i,height:r};var h=this.cache("target-bounds",function(){return t.getTargetBounds()}),u=h,d=C(U(this.attachment),{width:i,height:r}),p=C(U(o),u),c=C(this.offset,{width:i,height:r}),g=C(this.targetOffset,u);d=w(d,c),p=w(p,g);for(var m=h.left+p.left-d.left,v=h.top+p.top-d.top,y=0;yT.innerWidth&&(S=this.cache("scrollbar-size",l),E.viewport.bottom-=S.height),A.body.scrollHeight>T.innerHeight&&(S=this.cache("scrollbar-size",l),E.viewport.right-=S.width),(-1===["","static"].indexOf(A.body.style.position)||-1===["","static"].indexOf(A.body.parentElement.style.position))&&(E.page.bottom=A.body.scrollHeight-v-r,E.page.right=A.body.scrollWidth-m-i),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return f(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return a(e)}),n=getComputedStyle(e),i=o,r={};if(["Top","Left","Bottom","Right"].forEach(function(t){r[t.toLowerCase()]=parseFloat(n["border"+t+"Width"])}),o.right=A.body.scrollWidth-o.left-i.width+r.right,o.bottom=A.body.scrollHeight-o.top-i.height+r.bottom,E.page.top>=o.top+r.top&&E.page.bottom>=o.bottom&&E.page.left>=o.left+r.left&&E.page.right>=o.right){var s=e.scrollTop,l=e.scrollLeft;E.offset={top:E.page.top-o.top+s-r.top,left:E.page.left-o.left+l-r.left}}}(),this.move(E),this.history.unshift(E),this.history.length>3&&this.history.pop(),e&&_(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var n in t){o[n]={};for(var i in t[n]){for(var r=!1,s=0;s=0){var c=a.split(" "),m=B(c,2);u=m[0],h=m[1]}else h=u=a;var b=O(e,r);("target"===u||"both"===u)&&(ob[3]&&"bottom"===v.top&&(o-=d,v.top="top")),"together"===u&&("top"===v.top&&("bottom"===y.top&&ob[3]&&o-(s-d)>=b[1]&&(o-=s-d,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+s>b[3]?(o-=d,v.top="top",o-=s,y.top="bottom"):"bottom"===y.top&&ob[3]&&"top"===y.top?(o-=s,y.top="bottom"):ob[2]&&"right"===v.left&&(n-=p,v.left="left")),"together"===h&&(nb[2]&&"right"===v.left?"left"===y.left?(n-=p,v.left="left",n-=f,y.left="right"):"right"===y.left&&(n-=p,v.left="left",n+=f,y.left="left"):"center"===v.left&&(n+f>b[2]&&"left"===y.left?(n-=f,y.left="right"):nb[3]&&"top"===y.top&&(o-=s,y.top="bottom")),("element"===h||"both"===h)&&(nb[2]&&("left"===y.left?(n-=f,y.left="right"):"center"===y.left&&(n-=f/2,y.left="right"))),"string"==typeof l?l=l.split(",").map(function(t){return t.trim()}):l===!0&&(l=["top","left","right","bottom"]),l=l||[];var w=[],C=[];o=0?(o=b[1],w.push("top")):C.push("top")),o+s>b[3]&&(l.indexOf("bottom")>=0?(o=b[3]-s,w.push("bottom")):C.push("bottom")),n=0?(n=b[0],w.push("left")):C.push("left")),n+f>b[2]&&(l.indexOf("right")>=0?(n=b[2]-f,w.push("right")):C.push("right")),w.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),g.push(t),w.forEach(function(e){g.push(t+"-"+e)})}(),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),g.push(t),C.forEach(function(e){g.push(t+"-"+e)})}(),(w.indexOf("left")>=0||w.indexOf("right")>=0)&&(y.left=v.left=!1),(w.indexOf("top")>=0||w.indexOf("bottom")>=0)&&(y.top=v.top=!1),(v.top!==i.top||v.left!==i.left||y.top!==e.attachment.top||y.left!==e.attachment.left)&&(e.updateAttachClasses(y,v),e.trigger("update",{attachment:y,targetAttachment:v}))}),M(function(){e.options.addTargetClasses!==!1&&m(e.target,g,c),m(e.element,g,c)}),{top:o,left:n}}});var j=x.Utils,a=j.getBounds,m=j.updateClasses,M=j.defer;x.modules.push({position:function(t){var e=this,o=t.top,n=t.left,i=this.cache("element-bounds",function(){return a(e.element)}),r=i.height,s=i.width,f=this.getTargetBounds(),l=o+r,h=n+s,u=[];o<=f.bottom&&l>=f.top&&["left","right"].forEach(function(t){var e=f[t];(e===n||e===h)&&u.push(t)}),n<=f.right&&h>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];(e===o||e===l)&&u.push(t)});var d=[],p=[],c=["left","top","right","bottom"];return d.push(this.getClass("abutted")),c.forEach(function(t){d.push(e.getClass("abutted")+"-"+t)}),u.length&&p.push(this.getClass("abutted")),u.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),M(function(){e.options.addTargetClasses!==!1&&m(e.target,p,d),m(e.element,p,d)}),!0}});var B=function(){function t(t,e){var o=[],n=!0,i=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(n=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);n=!0);}catch(f){i=!0,r=f}finally{try{!n&&a["return"]&&a["return"]()}finally{if(i)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return x.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var n=this.options.shift;"function"==typeof this.options.shift&&(n=this.options.shift.call(this,{top:e,left:o}));var i=void 0,r=void 0;if("string"==typeof n){n=n.split(" "),n[1]=n[1]||n[0];var s=n,a=B(s,2);i=a[0],r=a[1],i=parseFloat(i,10),r=parseFloat(r,10)}else i=n.top,r=n.left;return e+=i,o+=r,{top:e,left:o}}}}),I}); diff --git a/cs4teachers/static/tinymce/LICENSE.TXT b/cs4teachers/static/tinymce/LICENSE.TXT deleted file mode 100644 index b17fc9049..000000000 --- a/cs4teachers/static/tinymce/LICENSE.TXT +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/cs4teachers/static/tinymce/plugins/advlist/plugin.min.js b/cs4teachers/static/tinymce/plugins/advlist/plugin.min.js deleted file mode 100644 index e281ace27..000000000 --- a/cs4teachers/static/tinymce/plugins/advlist/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i0&&f[0].nodeName===c)})}};j(a,"lists")&&(a.addCommand("ApplyUnorderedListStyle",function(a,b){f("UL",b["list-style-type"])}),a.addCommand("ApplyOrderedListStyle",function(a,b){f("OL",b["list-style-type"])}),a.addButton("numlist",{type:h.length>0?"splitbutton":"button",tooltip:"Numbered list",menu:h,onPostRender:k("OL"),onshow:g,onselect:function(a){f("OL",a.control.settings.data)},onclick:function(){a.execCommand("InsertOrderedList")}}),a.addButton("bullist",{type:i.length>0?"splitbutton":"button",tooltip:"Bullet list",onPostRender:k("UL"),menu:i,onshow:g,onselect:function(a){f("UL",a.control.settings.data)},onclick:function(){a.execCommand("InsertUnorderedList")}}))}),function(){}}),d("0")()}(); \ No newline at end of file diff --git a/cs4teachers/static/tinymce/plugins/autolink/plugin.min.js b/cs4teachers/static/tinymce/plugins/autolink/plugin.min.js deleted file mode 100644 index 3cb570625..000000000 --- a/cs4teachers/static/tinymce/plugins/autolink/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;ic&&(b=c)}return b}function e(a,b){1!=a.nodeType||a.hasChildNodes()?g.setStart(a,d(a,b)):g.setStartBefore(a)}function f(a,b){1!=a.nodeType||a.hasChildNodes()?g.setEnd(a,d(a,b)):g.setEndAfter(a)}var g,j,k,l,m,n,o,p,q,r;if("A"!=a.selection.getNode().tagName){if(g=a.selection.getRng(!0).cloneRange(),g.startOffset<5){if(p=g.endContainer.previousSibling,!p){if(!g.endContainer.firstChild||!g.endContainer.firstChild.nextSibling)return;p=g.endContainer.firstChild.nextSibling}if(q=p.length,e(p,q),f(p,q),g.endOffset<5)return;j=g.endOffset,l=p}else{if(l=g.endContainer,3!=l.nodeType&&l.firstChild){for(;3!=l.nodeType&&l.firstChild;)l=l.firstChild;3==l.nodeType&&(e(l,0),f(l,l.nodeValue.length))}j=1==g.endOffset?2:g.endOffset-1-b}k=j;do e(l,j>=2?j-2:0),f(l,j>=1?j-1:0),j-=1,r=g.toString();while(" "!=r&&""!==r&&160!=r.charCodeAt(0)&&j-2>=0&&r!=c);i(g.toString(),c)?(e(l,j),f(l,k),j+=1):0===g.startOffset?(e(l,0),f(l,k)):(e(l,j),f(l,k)),n=g.toString(),"."==n.charAt(n.length-1)&&f(l,k-1),n=g.toString(),o=n.match(h),o&&("www."==o[1]?o[1]="http://www.":/@$/.test(o[1])&&!/^mailto:/.test(o[1])&&(o[1]="mailto:"+o[1]),m=a.selection.getBookmark(),a.selection.setRng(g),a.execCommand("createlink",!1,o[1]+o[2]),a.settings.default_link_target&&a.dom.setAttrib(a.selection.getNode(),"target",a.settings.default_link_target),a.selection.moveToBookmark(m),a.nodeChanged())}}var g,h=/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+\-]+@)(.+)$/i;if(b.settings.autolink_pattern&&(h=b.settings.autolink_pattern),b.on("keydown",function(a){if(13==a.keyCode)return e(b)}),a.ie)return void b.on("focus",function(){if(!g){g=!0;try{b.execCommand("AutoUrlDetect",!1,!0)}catch(a){}}});b.on("keypress",function(a){if(41==a.keyCode)return c(b)}),b.on("keyup",function(a){if(32==a.keyCode)return d(b)});var i=function(a,b){return a==b||" "===a||160==a.charCodeAt(0)}}),function(){}}),d("0")()}(); \ No newline at end of file diff --git a/cs4teachers/static/tinymce/plugins/autoresize/plugin.min.js b/cs4teachers/static/tinymce/plugins/autoresize/plugin.min.js deleted file mode 100644 index 081b5d32d..000000000 --- a/cs4teachers/static/tinymce/plugins/autoresize/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;ih.autoresize_min_height&&(m=n),h.autoresize_max_height&&n>h.autoresize_max_height?(m=h.autoresize_max_height,k.style.overflowY="auto",l.style.overflowY="auto"):(k.style.overflowY="hidden",l.style.overflowY="hidden",k.scrollTop=0),m!==i&&(g=m-i,e.setStyle(a.iframeElement,"height",m+"px"),i=m,b.webKit&&g<0&&f(d))}}function g(b,c,e){d.setEditorTimeout(a,function(){f({}),b--?g(b,c,e):e&&e()},c)}var h=a.settings,i=0;a.settings.inline||(h.autoresize_min_height=parseInt(a.getParam("autoresize_min_height",a.getElement().offsetHeight),10),h.autoresize_max_height=parseInt(a.getParam("autoresize_max_height",0),10),a.on("init",function(){var b,c;b=a.getParam("autoresize_overflow_padding",1),c=a.getParam("autoresize_bottom_margin",50),b!==!1&&a.dom.setStyles(a.getBody(),{paddingLeft:b,paddingRight:b}),c!==!1&&a.dom.setStyles(a.getBody(),{paddingBottom:c})}),a.on("nodechange setcontent keyup FullscreenStateChanged",f),a.getParam("autoresize_on_init",!0)&&a.on("init",function(){g(20,100,function(){g(5,1e3)})}),a.addCommand("mceAutoResize",f))}),function(){}}),d("0")()}(); \ No newline at end of file diff --git a/cs4teachers/static/tinymce/plugins/autosave/plugin.min.js b/cs4teachers/static/tinymce/plugins/autosave/plugin.min.js deleted file mode 100644 index e9eb68896..000000000 --- a/cs4teachers/static/tinymce/plugins/autosave/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;iq.autosave_retention)||(h(!1),!1)}function h(a){c.removeItem(o+"draft"),c.removeItem(o+"time"),a!==!1&&b.fire("RemoveDraft")}function i(){!n()&&b.isDirty()&&(c.setItem(o+"draft",b.getContent({format:"raw",no_events:!0})),c.setItem(o+"time",(new Date).getTime()),b.fire("StoreDraft"))}function j(){g()&&(b.setContent(c.getItem(o+"draft"),{format:"raw"}),b.fire("RestoreDraft"))}function k(){p||(setInterval(function(){b.removed||i()},q.autosave_interval),p=!0)}function l(){var a=this;a.disabled(!g()),b.on("StoreDraft RestoreDraft RemoveDraft",function(){a.disabled(!g())}),k()}function m(){b.undoManager.beforeChange(),j(),h(),b.undoManager.add()}function n(a){var c=b.settings.forced_root_block;return a=d.trim("undefined"==typeof a?b.getBody().innerHTML:a),""===a||new RegExp("^<"+c+"[^>]*>((\xa0| |[ \t]|]*>)+?|)|
$","i").test(a)}var o,p,q=b.settings;o=q.autosave_prefix||"tinymce-autosave-{path}{query}-{id}-",o=o.replace(/\{path\}/g,document.location.pathname),o=o.replace(/\{query\}/g,document.location.search),o=o.replace(/\{id\}/g,b.id),q.autosave_interval=f(q.autosave_interval,"30s"),q.autosave_retention=f(q.autosave_retention,"20m"),b.addButton("restoredraft",{title:"Restore last draft",onclick:m,onPostRender:l}),b.addMenuItem("restoredraft",{text:"Restore last draft",onclick:m,onPostRender:l,context:"file"}),b.settings.autosave_restore_when_empty!==!1&&(b.on("init",function(){g()&&n()&&j()}),b.on("saveContent",function(){h()})),e.onbeforeunload=a._beforeUnloadHandler,this.hasDraft=g,this.storeDraft=i,this.restoreDraft=j,this.removeDraft=h,this.isEmpty=n}),function(){}}),d("0")()}(); \ No newline at end of file diff --git a/cs4teachers/static/tinymce/plugins/code/plugin.min.js b/cs4teachers/static/tinymce/plugins/code/plugin.min.js deleted file mode 100644 index 7a0437ed9..000000000 --- a/cs4teachers/static/tinymce/plugins/code/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i")}),a.addButton("hr",{icon:"hr",tooltip:"Horizontal line",cmd:"InsertHorizontalRule"}),a.addMenuItem("hr",{icon:"hr",text:"Horizontal line",cmd:"InsertHorizontalRule",context:"insert"})}),function(){}}),d("0")()}(); \ No newline at end of file diff --git a/cs4teachers/static/tinymce/plugins/link/plugin.min.js b/cs4teachers/static/tinymce/plugins/link/plugin.min.js deleted file mode 100644 index dcd9d4369..000000000 --- a/cs4teachers/static/tinymce/plugins/link/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i0},j=function(a){return!(/]+>[^<]+<\/a>$/.test(a)||a.indexOf("href=")==-1))},k=function(a){return a&&"FIGURE"===a.nodeName&&/\bimage\b/i.test(a.className)},l=function(a,c){return function(e){a.undoManager.transact(function(){var g=a.selection.getNode(),h=f(a,g),i={href:e.href,target:e.target?e.target:null,rel:e.rel?e.rel:null,"class":e["class"]?e["class"]:null,title:e.title?e.title:null};b.hasRelList(a.settings)||b.allowUnsafeLinkTarget(a.settings)!==!1||(i.rel=d(i.rel,"_blank"==i.target)),e.href===c.href&&(c.attach(),c={}),h?(a.focus(),e.hasOwnProperty("text")&&("innerText"in h?h.innerText=e.text:h.textContent=e.text),a.dom.setAttribs(h,i),a.selection.select(h),a.undoManager.add()):k(g)?o(a,g,i):e.hasOwnProperty("text")?a.insertContent(a.dom.createHTML("a",i,a.dom.encode(e.text))):a.execCommand("mceInsertLink",!1,i)})}},m=function(a){return function(){a.undoManager.transact(function(){var b=a.selection.getNode();k(b)?n(a,b):a.execCommand("unlink")})}},n=function(a,b){var c,d;d=a.dom.select("img",b)[0],d&&(c=a.dom.getParents(d,"a[href]",b)[0],c&&(c.parentNode.insertBefore(d,c),a.dom.remove(c)))},o=function(a,b,c){var d,e;e=a.dom.select("img",b)[0],e&&(d=a.dom.create("a",c),e.parentNode.insertBefore(d,e),d.appendChild(e))};return{link:l,unlink:m,isLink:h,hasLinks:i,isOnlyTextSelected:j,getAnchorElement:f,getAnchorText:g,toggleTargetRules:d}}),g("6",["a","b","c","8","9"],function(a,b,c,d,e){var f={},g=function(a,b){var d=e.getLinkList(a.settings);"string"==typeof d?c.send({url:d,success:function(c){b(a,JSON.parse(c))}}):"function"==typeof d?d(function(c){b(a,c)}):b(a,d)},h=function(a,c,d){var e=function(a,d){return d=d||[],b.each(a,function(a){var b={text:a.text||a.title};a.menu?b.menu=e(a.menu):(b.value=a.value,c&&c(b)),d.push(b)}),d};return e(a,d||[])},i=function(b,c,d){var e=b.selection.getRng();a.setEditorTimeout(b,function(){b.windowManager.confirm(c,function(a){b.selection.setRng(e),d(a)})})},j=function(a,c){var g,j,k,l,m,n,o,p,q,r,s,t={},u=a.selection,v=a.dom,w=function(a){var b=k.find("#text");(!b.value()||a.lastControl&&b.value()==a.lastControl.text())&&b.value(a.control.text()),k.find("#href").value(a.control.value())},x=function(c){var d=[];if(b.each(a.dom.select("a:not([href])"),function(a){var b=a.name||a.id;b&&d.push({text:b,value:"#"+b,selected:c.indexOf("#"+b)!=-1})}),d.length)return d.unshift({text:"None",value:""}),{name:"anchor",type:"listbox",label:"Anchors",values:d,onselect:w}},y=function(){j||!l||t.text||this.parent().parent().find("#text")[0].value(this.value())},z=function(c){var d=c.meta||{};n&&n.value(a.convertURL(this.value(),"href")),b.each(c.meta,function(a,b){var c=k.find("#"+b);"text"===b?0===j.length&&(c.value(a),t.text=a):c.value(a)}),d.attach&&(f={href:this.value(),attach:d.attach}),d.text||y.call(this)},A=function(a){a.meta=k.toJSON()};l=d.isOnlyTextSelected(u.getContent()),g=d.getAnchorElement(a),t.text=j=d.getAnchorText(a.selection,g),t.href=g?v.getAttrib(g,"href"):"",g?t.target=v.getAttrib(g,"target"):e.hasDefaultLinkTarget(a.settings)&&(t.target=e.getDefaultLinkTarget(a.settings)),(s=v.getAttrib(g,"rel"))&&(t.rel=s),(s=v.getAttrib(g,"class"))&&(t["class"]=s),(s=v.getAttrib(g,"title"))&&(t.title=s),l&&(m={name:"text",type:"textbox",size:40,label:"Text to display",onchange:function(){t.text=this.value()}}),c&&(n={type:"listbox",label:"Link list",values:h(c,function(b){b.value=a.convertURL(b.value||b.url,"href")},[{text:"None",value:""}]),onselect:w,value:a.convertURL(t.href,"href"),onPostRender:function(){n=this}}),e.shouldShowTargetList(a.settings)&&(void 0===e.getTargetList(a.settings)&&e.setTargetList(a,[{text:"None",value:""},{text:"New window",value:"_blank"}]),p={name:"target",type:"listbox",label:"Target",values:h(e.getTargetList(a.settings))}),e.hasRelList(a.settings)&&(o={name:"rel",type:"listbox",label:"Rel",values:h(e.getRelList(a.settings),function(b){e.allowUnsafeLinkTarget(a.settings)===!1&&(b.value=d.toggleTargetRules(b.value,"_blank"===t.target))})}),e.hasLinkClassList(a.settings)&&(q={name:"class",type:"listbox",label:"Class",values:h(e.getLinkClassList(a.settings),function(b){b.value&&(b.textStyle=function(){return a.formatter.getCssText({inline:"a",classes:[b.value]})})})}),e.shouldShowLinkTitle(a.settings)&&(r={name:"title",type:"textbox",label:"Title",value:t.title}),k=a.windowManager.open({title:"Insert link",data:t,body:[{name:"href",type:"filepicker",filetype:"file",size:40,autofocus:!0,label:"Url",onchange:z,onkeyup:y,onbeforecall:A},m,r,x(t.href),n,o,p,q],onSubmit:function(c){var g=e.assumeExternalTargets(a.settings),h=d.link(a,f),k=d.unlink(a),m=b.extend({},t,c.data),n=m.href;return n?(l&&m.text!==j||delete m.text,n.indexOf("@")>0&&n.indexOf("//")==-1&&n.indexOf("mailto:")==-1?void i(a,"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",function(a){a&&(m.href="mailto:"+n),h(m)}):g===!0&&!/^\w+:/i.test(n)||g===!1&&/^\s*www[\.|\d\.]/i.test(n)?void i(a,"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?",function(a){a&&(m.href="http://"+n),h(m)}):void h(m)):void k()}})},k=function(a){g(a,j)};return{open:k}}),g("e",["4"],function(a){return a("tinymce.dom.DOMUtils")}),g("f",["4"],function(a){return a("tinymce.Env")}),g("7",["e","f"],function(a,b){var c=function(a,b){document.body.appendChild(a),a.dispatchEvent(b),document.body.removeChild(a)},d=function(d){if(!b.ie||b.ie>10){var e=document.createElement("a");e.target="_blank",e.href=d,e.rel="noreferrer noopener";var f=document.createEvent("MouseEvents");f.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),c(e,f)}else{var g=window.open("","_blank");if(g){g.opener=null;var h=g.document;h.open(),h.write(''),h.close()}}};return{open:d}}),g("2",["5","6","7","8","9"],function(a,b,c,d,e){var f=function(a,b){return a.dom.getParent(b,"a[href]")},g=function(a){return f(a,a.selection.getStart())},h=function(a){var b=a.getAttribute("data-mce-href");return b?b:a.getAttribute("href")},i=function(a){var b=a.plugins.contextmenu;return!!b&&b.isContextMenuVisible()},j=function(a){return a.altKey===!0&&a.shiftKey===!1&&a.ctrlKey===!1&&a.metaKey===!1},k=function(a,b){if(b){var d=h(b);if(/^#/.test(d)){var e=a.$(d);e.length&&a.selection.scrollIntoView(e[0],!0)}else c.open(b.href)}},l=function(a){return function(){b.open(a)}},m=function(a){return function(){k(a,g(a))}},n=function(a){return function(b){var c,f,g;return!!(e.hasContextToolbar(a.settings)&&!i(a)&&d.isLink(b)&&(c=a.selection,f=c.getRng(),g=f.startContainer,3==g.nodeType&&c.isCollapsed()&&f.startOffset>0&&f.startOffset0)&&d},k=function(a,b){return a.isChildOf(b,a.getRoot())};return{isTextNode:a,isListNode:b,isListItemNode:c,isBr:d,isFirstChild:e,isLastChild:f,isTextBlock:g,isBlock:h,isBogusBr:i,isEmpty:j,isChildOfBody:k}}),g("i",["a"],function(a){return a("tinymce.dom.RangeUtils")}),g("k",["i","8"],function(a,b){var c=function(c,d){var e=a.getNode(c,d);if(b.isListItemNode(c)&&b.isTextNode(e)){var f=d>=c.childNodes.length?e.data.length:0;return{container:e,offset:f}}return{container:c,offset:d}},d=function(a){var b=a.cloneRange(),d=c(a.startContainer,a.startOffset);b.setStart(d.container,d.offset);var e=c(a.endContainer,a.endOffset);return b.setEnd(e.container,e.offset),b};return{getNormalizedEndPoint:c,normalizeRange:d}}),g("c",["b","8","k"],function(a,b,c){var d=a.DOM,e=function(a){var b={},c=function(c){var e,f,g;f=a[c?"startContainer":"endContainer"],g=a[c?"startOffset":"endOffset"],1===f.nodeType&&(e=d.create("span",{"data-mce-type":"bookmark"}),f.hasChildNodes()?(g=Math.min(g,f.childNodes.length-1),c?f.insertBefore(e,f.childNodes[g]):d.insertAfter(e,f.childNodes[g])):f.appendChild(e),f=e,g=0),b[c?"startContainer":"endContainer"]=f,b[c?"startOffset":"endOffset"]=g};return c(!0),a.collapsed||c(),b},f=function(a){function b(b){var c,e,f,g=function(a){for(var b=a.parentNode.firstChild,c=0;b;){if(b===a)return c;1===b.nodeType&&"bookmark"===b.getAttribute("data-mce-type")||c++,b=b.nextSibling}return-1};c=f=a[b?"startContainer":"endContainer"],e=a[b?"startOffset":"endOffset"],c&&(1===c.nodeType&&(e=g(c),c=c.parentNode,d.remove(f)),a[b?"startContainer":"endContainer"]=c,a[b?"startOffset":"endOffset"]=e)}b(!0),b();var e=d.createRng();return e.setStart(a.startContainer,a.startOffset),a.endContainer&&e.setEnd(a.endContainer,a.endOffset),c.normalizeRange(e)};return{createBookmark:e,resolveBookmark:f}}),g("d",["a"],function(a){return a("tinymce.dom.DomQuery")}),g("9",["d","2","8"],function(a,b,c){var d=function(a){return a.dom.getParent(a.selection.getStart(!0),"OL,UL,DL")},e=function(a){var e=d(a);return b.grep(a.selection.getSelectedBlocks(),function(a){return c.isListNode(a)&&e!==a})},f=function(d){var e=b.map(d,function(a){var b=a.parentNode;return!c.isListItemNode(a)&&c.isListItemNode(b)?b:a});return a.unique(e)},g=function(a){var d=a.selection.getSelectedBlocks();return b.grep(f(d),function(a){return c.isListItemNode(a)})};return{getParentList:d,getSelectedSubLists:e,getSelectedListItems:g}}),g("4",["b","c","8","9"],function(a,b,c,d){var e=a.DOM,f=function(a,b){var d;if(c.isListNode(a)){for(;d=a.firstChild;)b.appendChild(d);e.remove(a)}},g=function(a){var b,d,g;return"DT"===a.nodeName?(e.rename(a,"DD"),!0):(b=a.previousSibling,b&&c.isListNode(b)?(b.appendChild(a),!0):b&&"LI"===b.nodeName&&c.isListNode(b.lastChild)?(b.lastChild.appendChild(a),f(a.lastChild,b.lastChild),!0):(b=a.nextSibling,b&&c.isListNode(b)?(b.insertBefore(a,b.firstChild),!0):(b=a.previousSibling,!(!b||"LI"!==b.nodeName)&&(d=e.create(a.parentNode.nodeName),g=e.getStyle(a.parentNode,"listStyleType"),g&&e.setStyle(d,"listStyleType",g),b.appendChild(d),d.appendChild(a),f(a.lastChild,d),!0))))},h=function(a){var c=d.getSelectedListItems(a);if(c.length){for(var e=b.createBookmark(a.selection.getRng(!0)),f=0;f10)||h.appendChild(d.create("br",{"data-mce-bogus":"1"})):j.appendChild(d.create("br")),j};return{createNewTextBlock:e}}),g("f",["b","8","g","2"],function(a,b,c,d){var e=a.DOM,f=function(a,f,g,h){var i,j,k,l,m=function(a){d.each(k,function(b){a.parentNode.insertBefore(b,g.parentNode)}),e.remove(a)};for(k=e.select('span[data-mce-type="bookmark"]',f),h=h||c.createNewTextBlock(a,g),i=e.createRng(),i.setStartAfter(g),i.setEndAfter(f),j=i.extractContents(),l=j.firstChild;l;l=l.firstChild)if("LI"===l.nodeName&&a.dom.isEmpty(l)){e.remove(l);break}a.dom.isEmpty(j)||e.insertAfter(j,f),e.insertAfter(h,f),b.isEmpty(a.dom,g.parentNode)&&m(g.parentNode),e.remove(g),b.isEmpty(a.dom,f)&&e.remove(f)};return{splitList:f}}),g("5",["b","c","8","e","9","f","g"],function(a,b,c,d,e,f,g){var h=a.DOM,i=function(a,b){c.isEmpty(a,b)&&h.remove(b)},j=function(a,b){var e,j=b.parentNode,k=j.parentNode;return j===a.getBody()||("DD"===b.nodeName?(h.rename(b,"DT"),!0):c.isFirstChild(b)&&c.isLastChild(b)?("LI"===k.nodeName?(h.insertAfter(b,k),i(a.dom,k),h.remove(j)):c.isListNode(k)?h.remove(j,!0):(k.insertBefore(g.createNewTextBlock(a,b),j),h.remove(j)),!0):c.isFirstChild(b)?("LI"===k.nodeName?(h.insertAfter(b,k),b.appendChild(j),i(a.dom,k)):c.isListNode(k)?k.insertBefore(b,j):(k.insertBefore(g.createNewTextBlock(a,b),j),h.remove(b)),!0):c.isLastChild(b)?("LI"===k.nodeName?h.insertAfter(b,k):c.isListNode(k)?h.insertAfter(b,j):(h.insertAfter(g.createNewTextBlock(a,b),j),h.remove(b)),!0):("LI"===k.nodeName?(j=k,e=g.createNewTextBlock(a,b,"LI")):e=c.isListNode(k)?g.createNewTextBlock(a,b,"LI"):g.createNewTextBlock(a,b),f.splitList(a,j,b,e),d.normalizeLists(a.dom,j.parentNode),!0))},k=function(a){var c=e.getSelectedListItems(a);if(c.length){var d,f,g=b.createBookmark(a.selection.getRng(!0)),h=a.getBody();for(d=c.length;d--;)for(var i=c[d].parentNode;i&&i!==h;){for(f=c.length;f--;)if(c[f]===i){c.splice(d,1);break}i=i.parentNode}for(d=0;d0?w(a,d,e,b,c):y(a,d,b,c)};return{toggleList:z,removeList:p,mergeWithAdjacentLists:u}}),g("j",["a"],function(a){return a("tinymce.dom.TreeWalker")}),g("7",["i","j","3","6","c","8","e","k","9"],function(a,b,c,d,e,f,g,h,i){var j=function(c,d,e){var g,h,i=d.startContainer,j=d.startOffset;if(3===i.nodeType&&(e?j0))return i;for(g=c.schema.getNonEmptyElements(),1===i.nodeType&&(i=a.getNode(i,j)),h=new b(i,c.getBody()),e&&f.isBogusBr(c.dom,i)&&h.next();i=h[e?"next":"prev2"]();){if("LI"===i.nodeName&&!i.hasChildNodes())return i;if(g[i.nodeName])return i;if(3===i.nodeType&&i.data.length>0)return i}},k=function(a,b){var c=b.childNodes;return 1===c.length&&!f.isListNode(c[0])&&a.isBlock(c[0])},l=function(a,b){k(a,b)&&a.remove(b.firstChild,!0)},m=function(a,b,c){var d,e;if(e=k(a,c)?c.firstChild:c,l(a,b),!f.isEmpty(a,b,!0))for(;d=b.firstChild;)e.appendChild(d)},n=function(a,b,c){var d,e,g=b.parentNode;f.isChildOfBody(a,b)&&f.isChildOfBody(a,c)&&(f.isListNode(c.lastChild)&&(e=c.lastChild),g===c.lastChild&&f.isBr(g.previousSibling)&&a.remove(g.previousSibling),d=c.lastChild,d&&f.isBr(d)&&b.hasChildNodes()&&a.remove(d),f.isEmpty(a,c,!0)&&a.$(c).empty(),m(a,b,c),e&&c.appendChild(e),a.remove(b),f.isEmpty(a,g)&&g!==a.getRoot()&&a.remove(g))},o=function(a,b,c){a.dom.$(c).empty(),n(a.dom,b,c),a.selection.setCursorLocation(c)},p=function(a,b,c,d){var f=a.dom;if(f.isEmpty(d))o(a,c,d);else{var g=e.createBookmark(b);n(f,c,d),a.selection.setRng(e.resolveBookmark(g))}},q=function(a,b,c,d){var f=e.createBookmark(b);n(a.dom,c,d),a.selection.setRng(e.resolveBookmark(f))},r=function(a,b){var c,e,g,i=a.dom,k=a.selection,l=i.getParent(k.getStart(),"LI");if(l){if(c=l.parentNode,c===a.getBody()&&f.isEmpty(i,c))return!0;if(e=h.normalizeRange(k.getRng(!0)),g=i.getParent(j(a,e,b),"LI"),g&&g!==l)return b?p(a,e,g,l):q(a,e,l,g),!0;if(!g&&!b&&d.removeList(a,c.nodeName))return!0}return!1},s=function(a,b){var c=a.getParent(b.parentNode,a.isBlock);a.remove(b),c&&a.isEmpty(c)&&a.remove(c)},t=function(a,b){var c=a.dom,e=c.getParent(a.selection.getStart(),c.isBlock);if(e&&c.isEmpty(e)){var f=h.normalizeRange(a.selection.getRng(!0)),g=c.getParent(j(a,f,b),"LI");if(g)return a.undoManager.transact(function(){s(c,e),d.mergeWithAdjacentLists(c,g.parentNode),a.selection.select(g,!0),a.selection.collapse(b)}),!0}return!1},u=function(a,b){return r(a,b)||t(a,b)},v=function(a){var b=a.dom.getParent(a.selection.getStart(),"LI,DT,DD");return!!(b||i.getSelectedListItems(a).length>0)&&(a.undoManager.transact(function(){a.execCommand("Delete"),g.normalizeLists(a.dom,a.getBody())}),!0)},w=function(a,b){return a.selection.isCollapsed()?u(a,b):v(a)},x=function(a){a.on("keydown",function(b){b.keyCode===c.BACKSPACE?w(a,!1)&&b.preventDefault():b.keyCode===c.DELETE&&w(a,!0)&&b.preventDefault()})};return{setup:x,backspaceDelete:w}}),g("0",["1","2","3","4","5","6","7","8","9"],function(a,b,c,d,e,f,g,h,i){var j=function(a,b){return function(){var c=a.dom.getParent(a.selection.getStart(),"UL,OL,DL");return c&&c.nodeName===b}},k=function(a){a.on("BeforeExecCommand",function(b){var c,f=b.command.toLowerCase();if("indent"===f?d.indentSelection(a)&&(c=!0):"outdent"===f&&e.outdentSelection(a)&&(c=!0),c)return a.fire("ExecCommand",{command:b.command}),b.preventDefault(),!0}),a.addCommand("InsertUnorderedList",function(b,c){f.toggleList(a,"UL",c)}),a.addCommand("InsertOrderedList",function(b,c){f.toggleList(a,"OL",c)}),a.addCommand("InsertDefinitionList",function(b,c){f.toggleList(a,"DL",c)})},l=function(a){a.addQueryStateHandler("InsertUnorderedList",j(a,"UL")),a.addQueryStateHandler("InsertOrderedList",j(a,"OL")),a.addQueryStateHandler("InsertDefinitionList",j(a,"DL"))},m=function(a){a.on("keydown",function(b){9!==b.keyCode||c.metaKeyPressed(b)||a.dom.getParent(a.selection.getStart(),"LI,DT,DD")&&(b.preventDefault(),b.shiftKey?e.outdentSelection(a):d.indentSelection(a))})},n=function(a){var c=function(c){return function(){var d=this;a.on("NodeChange",function(a){var e=b.grep(a.parents,h.isListNode);d.active(e.length>0&&e[0].nodeName===c)})}},d=function(a,c){var d=a.settings.plugins?a.settings.plugins:"";return b.inArray(d.split(/[ ,]/),c)!==-1};d(a,"advlist")||(a.addButton("numlist",{title:"Numbered list",cmd:"InsertOrderedList",onPostRender:c("OL")}),a.addButton("bullist",{title:"Bullet list",cmd:"InsertUnorderedList",onPostRender:c("UL")})),a.addButton("indent",{icon:"indent",title:"Increase indent",cmd:"Indent",onPostRender:function(b){var c=b.control;a.on("nodechange",function(){var b=i.getSelectedListItems(a),d=b.length>0&&h.isFirstChild(b[0]);c.disabled(d)})}})};return a.add("lists",function(a){return n(a),g.setup(a),a.on("init",function(){k(a),l(a),a.getParam("lists_indent_on_tab",!0)&&m(a)}),{backspaceDelete:function(b){g.backspaceDelete(a,b)}}}),function(){}}),d("0")()}(); \ No newline at end of file diff --git a/cs4teachers/static/tinymce/plugins/searchreplace/plugin.min.js b/cs4teachers/static/tinymce/plugins/searchreplace/plugin.min.js deleted file mode 100644 index 33cfd902d..000000000 --- a/cs4teachers/static/tinymce/plugins/searchreplace/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i0){var d=a[b];if(!d)throw"Invalid capture group";c+=a[0].indexOf(d),a[0]=d}return[c,c+a[0].length,[a[0]]]}function h(b){var c;if(3===b.nodeType)return b.data;if(o[b.nodeName]&&!n[b.nodeName])return"";if(c="",a(b))return"\n";if((n[b.nodeName]||p[b.nodeName])&&(c+="\n"),b=b.firstChild)do c+=h(b);while(b=b.nextSibling);return c}function i(b,c,d){var e,f,g,h,i=[],j=0,k=b,l=c.shift(),m=0;a:for(;;){if((n[k.nodeName]||p[k.nodeName]||a(k))&&j++,3===k.nodeType&&(!f&&k.length+j>=l[1]?(f=k,h=l[1]-j):e&&i.push(k),!e&&k.length+j>l[0]&&(e=k,g=l[0]-j),j+=k.length),e&&f){if(k=d({startNode:e,startNodeIndex:g,endNode:f,endNodeIndex:h,innerNodes:i,match:l[2],matchIndex:m}),j-=f.length-h,e=null,f=null,i=[],l=c.shift(),m++,!l)break}else if(o[k.nodeName]&&!n[k.nodeName]||!k.firstChild){if(k.nextSibling){k=k.nextSibling;continue}}else if(!a(k)){k=k.firstChild;continue}for(;;){if(k.nextSibling){k=k.nextSibling;break}if(k.parentNode===b)break a;k=k.parentNode}}}function j(a){var b;if("function"!=typeof a){var c=a.nodeType?a:m.createElement(a);b=function(a,b){var d=c.cloneNode(!1);return d.setAttribute("data-mce-index",b),a&&d.appendChild(m.createTextNode(a)),d}}else b=a;return function(a){var c,d,e,f=a.startNode,g=a.endNode,h=a.matchIndex;if(f===g){var i=f;e=i.parentNode,a.startNodeIndex>0&&(c=m.createTextNode(i.data.substring(0,a.startNodeIndex)),e.insertBefore(c,i));var j=b(a.match[0],h);return e.insertBefore(j,i),a.endNodeIndex0}var l=this,m=-1;l.init=function(a){a.addMenuItem("searchreplace",{text:"Find and replace",shortcut:"Meta+F",onclick:d,separator:"before",context:"edit"}),a.addButton("searchreplace",{tooltip:"Find and replace",shortcut:"Meta+F",onclick:d}),a.addCommand("SearchReplace",d),a.shortcuts.add("Meta+F","",d)},l.find=function(a,b,c){a=a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),a=c?"\\b"+a+"\\b":a;var d=f(new RegExp(a,b?"g":"gi"));return d&&(m=-1,m=i(!0)),d},l.next=function(){var a=i(!0);a!==-1&&(m=a)},l.prev=function(){var a=i(!1);a!==-1&&(m=a)},l.replace=function(c,d,f){var i,n,o,p,q,r,s=m;for(d=d!==!1,o=a.getBody(),n=b.grep(b.toArray(o.getElementsByTagName("span")),k),i=0;im&&n[i].setAttribute("data-mce-index",q-1)}return a.undoManager.add(),m=s,d?(r=h(s+1).length>0,l.next()):(r=h(s-1).length>0,l.prev()),!f&&r},l.done=function(c){var d,f,h,i;for(f=b.toArray(a.getBody().getElementsByTagName("span")),d=0;d9)&&(b.hasChildNodes()||(b.innerHTML='
'))}var c=function(a){return function(b,c){b&&(c=parseInt(c,10),1===c||0===c?b.removeAttribute(a,1):b.setAttribute(a,c,1))}},d=function(a){return function(b){return parseInt(b.getAttribute(a)||1,10)}};return{setColSpan:c("colSpan"),setRowSpan:c("rowspan"),getColSpan:d("colSpan"),getRowSpan:d("rowSpan"),setSpanVal:function(a,b,d){c(b)(a,d)},getSpanVal:function(a,b){return d(b)(a)},paddCell:b}}),g("d",["4","c"],function(a,b){var c=function(a,b,c){return a[c]?a[c][b]:null},d=function(a,b,d){var e=c(a,b,d);return e?e.elm:null},e=function(a,b,e,f){var g,h,i=0,j=d(a,b,e);for(g=e;(f>0?g=0)&&(h=c(a,b,g),j===h.elm);g+=f)i++;return i},f=function(a,b,c){for(var d,e=a[c],f=b;f'),!1},"childNodes"),d=q(d,!1),p(d),g(d,"rowSpan",1),g(d,"colSpan",1),f?d.appendChild(f):c.paddCell(d),d}function z(){var a,b=ca.createRng();return e(ca.select("tr",i),function(a){0===a.cells.length&&ca.remove(a)}),0===ca.select("tr",i).length?(b.setStartBefore(i),b.setEndBefore(i),ba.setRng(b),void ca.remove(i)):(e(ca.select("thead,tbody,tfoot",i),function(a){0===a.rows.length&&ca.remove(a)}),n(),void(_&&(a=Z[Math.min(Z.length-1,_.y)],a&&(ba.select(a[Math.min(a.length-1,_.x)].elm,!0),ba.collapse(!0)))))}function A(a,b,c,d){var e,f,g,h,i;for(e=Z[b][a].elm.parentNode,g=1;g<=c;g++)if(e=ca.getNext(e,"tr")){for(f=a;f>=0;f--)if(i=Z[b+g][f].elm,i.parentNode==e){for(h=1;h<=d;h++)ca.insertAfter(y(i),i);break}if(f==-1)for(h=1;h<=d;h++)e.insertBefore(y(e.cells[0]),e.cells[0])}}function B(){e(Z,function(a,b){e(a,function(a,c){var d,e,h;if(u(a)&&(a=a.elm,d=f(a,"colspan"),e=f(a,"rowspan"),d>1||e>1)){for(g(a,"rowSpan",1),g(a,"colSpan",1),h=0;hc)&&d.push(a[e]);return d}function D(b){return a.grep(b,function(a){return a.real===!1})}function E(a){for(var b=[],c=0;c1&&(x=1),g(o,"colSpan",w),g(o,"rowSpan",x),m=i;m<=k;m++)for(l=h;l<=j;l++)Z[m]&&Z[m][l]&&(b=Z[m][l].elm,b!=o&&(q=a.grep(b.childNodes),e(q,function(a){o.appendChild(a)}),q.length&&(q=a.grep(o.childNodes),s=0,e(q,function(a){"BR"==a.nodeName&&s++0&&Z[b-1][h]&&(l=Z[b-1][h].elm,m=f(l,"rowSpan"),m>1)){g(l,"rowSpan",m+1);continue}}else if(m=f(c,"rowspan"),m>1){g(c,"rowSpan",m+1);continue}k=y(c),g(k,"colSpan",c.colSpan),j.appendChild(k),d=c}j.hasChildNodes()&&(a?i.parentNode.insertBefore(j,i):ca.insertAfter(j,i))}}function J(a,b){b=b||v().length||1;for(var c=0;c1?g(c,"colSpan",b-1):ca.remove(c)}),b.push(d))})}),z()}function P(){function a(a){var b,c;e(a.cells,function(a){var c=f(a,"rowSpan");c>1&&(g(a,"rowSpan",c-1),b=T(a),A(b.x,b.y,1,1))}),b=T(a.cells[0]),e(Z[b.y],function(a){var b;a=a.elm,a!=c&&(b=f(a,"rowSpan"),b<=1?ca.remove(a):g(a,"rowSpan",b-1),c=a)})}var b;b=v(),l(i)&&b.length==i.rows.length||(e(b.reverse(),function(b){a(b)}),z())}function Q(){var a=v();if(!l(i)||a.length!=i.rows.length)return ca.remove(a),z(),a}function R(){var a=v();return e(a,function(b,c){a[c]=q(b,!0)}),a}function S(b,c){var h,i,j,l=[];b&&(h=d.splitAt(Z,_.x,_.y,c),i=h.row,a.each(h.cells,p),j=a.map(b,function(a){return a.cloneNode(!0)}),e(j,function(a,b,d){var h,j,k,m,n=a.cells.length,q=0;for(o(a),h=0;h1&&(q--,b+k>d.length?(k=d.length-b,g(j,"rowSpan",k),l.push(d.length-1)):l.push(b+k-1)),p(j);for(e(l,function(a){b<=a&&q++}),h=q;h<$;h++)a.appendChild(y(a.cells[n-1]));for(h=$;h1?g(j,"colSpan",m-1):ca.remove(j);c?i.parentNode.insertBefore(a,i):i=ca.insertAfter(a,i)}),k())}function T(a){var b;return e(Z,function(c,d){return e(c,function(c,e){if(c.elm==a)return b={x:e,y:d},!1}),!b}),b}function U(a){_=T(a)}function V(){var a,b;return a=b=0,e(Z,function(c,d){e(c,function(c,e){var f,g;u(c)&&(c=Z[d][e],e>a&&(a=e),d>b&&(b=d),c.real&&(f=c.colspan-1,g=c.rowspan-1,f&&e+f>a&&(a=e+f),g&&d+g>b&&(b=d+g)))})}),{x:a,y:b}}function W(a){var b,c,d,e,f,g,h,i,j,l;if(aa=T(a),_&&aa){for(b=Math.min(_.x,aa.x),c=Math.min(_.y,aa.y),d=Math.max(_.x,aa.x),e=Math.max(_.y,aa.y),f=d,g=e,l=c;l<=e;l++)for(j=b;j<=d;j++)a=Z[l][j],a.real&&(h=a.colspan-1,i=a.rowspan-1,h&&j+h>f&&(f=j+h),i&&l+i>g&&(g=l+i));for(k(),l=c;l<=g;l++)for(j=b;j<=f;j++)Z[l][j]&&ca.setAttrib(Z[l][j].elm,"data-mce-selected","1")}}function X(a,b){var c,d,e;c=T(a),d=c.y*$+c.x;do{if(d+=b,e=r(d%$,Math.floor(d/$)),!e)break;if(e.elm!=a)return ba.select(e.elm,!0),ca.isEmpty(e.elm)&&ba.collapse(!0),!0}while(e.elm==a);return!1}function Y(b){if(_){var c=d.splitAt(Z,_.x,_.y,b);a.each(c.cells,p)}}var Z,$,_,aa,ba=h.selection,ca=ba.dom;i=i||ca.getParent(ba.getStart(!0),"table"),n(),j=j||ca.getParent(ba.getStart(!0),"th,td"),j&&(_=T(j),aa=V(),j=r(_.x,_.y)),a.extend(this,{deleteTable:x,split:B,merge:H,insertRow:I,insertRows:J,insertCol:K,insertCols:L,splitCols:Y,deleteCols:O,deleteRows:P,cutRows:Q,copyRows:R,pasteRows:S,getPos:T,setStartCell:U,setEndCell:W,moveRelIdx:X,refresh:n})}}),g("7",["6","1","4"],function(a,b,c){return function(d,e){function f(a){d.getBody().style.webkitUserSelect="",(a||p)&&(d.$("td[data-mce-selected],th[data-mce-selected]").removeAttr("data-mce-selected"),p=!1)}function g(a,b){return!(!a||!b)&&a===o.getParent(b,"table")}function h(b){var c,f,h=b.target;if(!m&&!n&&h!==l&&(l=h,k&&j)){if(f=o.getParent(h,"td,th"),g(k,f)||(f=o.getParent(k,"td,th")),j===f&&!p)return;if(e(!0),g(k,f)){b.preventDefault(),i||(i=new a(d,k,j),d.getBody().style.webkitUserSelect="none"),i.setEndCell(f),p=!0,c=d.selection.getSel();try{c.removeAllRanges?c.removeAllRanges():c.empty()}catch(a){}}}}var i,j,k,l,m,n,o=d.dom,p=!0,q=function(){j=i=k=l=null,e(!1)};return d.on("SelectionChange",function(a){p&&a.stopImmediatePropagation()},!0),d.on("MouseDown",function(a){2==a.button||m||n||(f(),j=o.getParent(a.target,"td,th"),k=o.getParent(j,"table"))}),d.on("mouseover",h),d.on("remove",function(){o.unbind(d.getDoc(),"mouseover",h),f()}),d.on("MouseUp",function(){function a(a,d){var f=new b(a,a);do{if(3==a.nodeType&&0!==c.trim(a.nodeValue).length)return void(d?e.setStart(a,0):e.setEnd(a,a.nodeValue.length));if("BR"==a.nodeName)return void(d?e.setStartBefore(a):e.setEndBefore(a))}while(a=d?f.next():f.prev())}var e,f,g,h,k,l=d.selection;if(j){if(i&&(d.getBody().style.webkitUserSelect=""),f=o.select("td[data-mce-selected],th[data-mce-selected]"),f.length>0){e=o.createRng(),h=f[0],e.setStartBefore(h),e.setEndAfter(h),a(h,1),g=new b(h,o.getParent(f[0],"table"));do if("TD"==h.nodeName||"TH"==h.nodeName){if(!o.getAttrib(h,"data-mce-selected"))break;k=h}while(h=g.next());a(k),l.setRng(e)}d.nodeChanged(),q()}}),d.on("KeyUp Drop SetContent",function(a){f("setcontent"==a.type),q(),m=!1}),d.on("ObjectResizeStart ObjectResized",function(a){m="objectresized"!=a.type}),d.on("dragstart",function(){n=!0}),d.on("drop dragend",function(){n=!1}),{clear:f}}}),g("8",["4","2"],function(a,b){var c=a.each;return function(d){function e(){var a=d.settings.color_picker_callback;if(a)return function(){var b=this;a.call(d,function(a){b.value(a).fire("change")},b.value())}}function f(a){return{title:"Advanced",type:"form",defaults:{onchange:function(){l(a,this.parents().reverse()[0],"style"==this.name())}},items:[{label:"Style",name:"style",type:"textbox"},{type:"form",padding:0,formItemDefaults:{layout:"grid",alignH:["start","right"]},defaults:{size:7},items:[{label:"Border color",type:"colorbox",name:"borderColor",onaction:e()},{label:"Background color",type:"colorbox",name:"backgroundColor",onaction:e()}]}]}}function g(a){return a?a.replace(/px$/,""):""}function h(a){return/^[0-9]+$/.test(a)&&(a+="px"),a}function i(a){c("left center right".split(" "),function(b){d.formatter.remove("align"+b,{},a)})}function j(a){c("top middle bottom".split(" "),function(b){d.formatter.remove("valign"+b,{},a)})}function k(b,c,d){function e(b,d){return d=d||[],a.each(b,function(a){var b={text:a.text||a.title};a.menu?b.menu=e(a.menu):(b.value=a.value,c&&c(b)),d.push(b)}),d}return e(b,d||[])}function l(a,b,c){var d=b.toJSON(),e=a.parseStyle(d.style);c?(b.find("#borderColor").value(e["border-color"]||"")[0].fire("change"),b.find("#backgroundColor").value(e["background-color"]||"")[0].fire("change")):(e["border-color"]=d.borderColor,e["background-color"]=d.backgroundColor),b.find("#style").value(a.serializeStyle(a.parseStyle(a.serializeStyle(e))))}function m(a,b,c){var d=a.parseStyle(a.getAttrib(c,"style"));d["border-color"]&&(b.borderColor=d["border-color"]),d["background-color"]&&(b.backgroundColor=d["background-color"]),b.style=a.serializeStyle(d)}function n(a,b,d){var e=a.parseStyle(a.getAttrib(b,"style"));c(d,function(a){e[a.name]=a.value}),a.setAttrib(b,"style",a.serializeStyle(a.parseStyle(a.serializeStyle(e))))}var o=this;o.tableProps=function(){o.table(!0)},o.table=function(e){function j(){function c(a,b,d){if("TD"===a.tagName||"TH"===a.tagName)v.setStyle(a,b,d);else if(a.children)for(var e=0;e',p.insertBefore(e,p.firstChild)),i(p),w.align&&d.formatter.apply("align"+w.align,{},p),d.focus(),d.addVisual()})}function o(a,b){function c(a,c){for(var d=0;d1?p={width:"",height:"",scope:"","class":"",align:"",style:"",type:o.nodeName.toLowerCase()}:(p={width:g(r.getStyle(o,"width")||r.getAttrib(o,"width")),height:g(r.getStyle(o,"height")||r.getAttrib(o,"height")),scope:r.getAttrib(o,"scope"),"class":r.getAttrib(o,"class")},p.type=o.nodeName.toLowerCase(),c("left center right".split(" "),function(a){d.formatter.matchNode(o,"align"+a)&&(p.align=a)}),c("top middle bottom".split(" "),function(a){d.formatter.matchNode(o,"valign"+a)&&(p.valign=a)}),m(r,p,o)),d.settings.table_cell_class_list&&(q={name:"class",type:"listbox",label:"Class",values:k(d.settings.table_cell_class_list,function(a){a.value&&(a.textStyle=function(){return d.formatter.getCssText({block:"td",classes:[a.value]})})})});var t={type:"form",layout:"flex",direction:"column",labelGapCalc:"children",padding:0,items:[{type:"form",layout:"grid",columns:2,labelGapCalc:!1,padding:0,defaults:{type:"textbox",maxWidth:50},items:[{label:"Width",name:"width"},{label:"Height",name:"height"},{label:"Cell type",name:"type",type:"listbox",text:"None",minWidth:90,maxWidth:null,values:[{text:"Cell",value:"td"},{text:"Header cell",value:"th"}]},{label:"Scope",name:"scope",type:"listbox",text:"None",minWidth:90,maxWidth:null,values:[{text:"None",value:""},{text:"Row",value:"row"},{text:"Column",value:"col"},{text:"Row group",value:"rowgroup"},{text:"Column group",value:"colgroup"}]},{label:"H Align",name:"align",type:"listbox",text:"None",minWidth:90,maxWidth:null,values:[{text:"None",value:""},{text:"Left",value:"left"},{text:"Center",value:"center"},{text:"Right",value:"right"}]},{label:"V Align",name:"valign",type:"listbox",text:"None",minWidth:90,maxWidth:null,values:[{text:"None",value:""},{text:"Top",value:"top"},{text:"Middle",value:"middle"},{text:"Bottom",value:"bottom"}]}]},q]};d.settings.table_cell_advtab!==!1?d.windowManager.open({title:"Cell properties",bodyType:"tabpanel",data:p,body:[{title:"General",type:"form",items:t},f(r)],onsubmit:n}):d.windowManager.open({title:"Cell properties",data:p,body:t,onsubmit:n})}},o.row=function(){function b(a,b,c){(1===u.length||c)&&t.setAttrib(a,b,c)}function e(a,b,c){(1===u.length||c)&&t.setStyle(a,b,c)}function j(){var f,g,j;l(t,this),r=a.extend(r,this.toJSON()),d.undoManager.transact(function(){var a=r.type;c(u,function(c){b(c,"scope",r.scope),b(c,"style",r.style),b(c,"class",r["class"]),e(c,"height",h(r.height)),a!==c.parentNode.nodeName.toLowerCase()&&(f=t.getParent(c,"table"),g=c.parentNode,j=t.select(a,f)[0],j||(j=t.create(a),f.firstChild?f.insertBefore(j,f.firstChild):f.appendChild(j)),j.appendChild(c),g.hasChildNodes()||t.remove(g)),1===u.length&&i(c),r.align&&d.formatter.apply("align"+r.align,{},c)}),d.focus()})}var n,o,p,q,r,s,t=d.dom,u=[];n=d.dom.getParent(d.selection.getStart(),"table"),o=d.dom.getParent(d.selection.getStart(),"td,th"),c(n.rows,function(a){c(a.cells,function(b){if(t.getAttrib(b,"data-mce-selected")||b==o)return u.push(a),!1})}),p=u[0],p&&(u.length>1?r={height:"",scope:"","class":"",align:"",type:p.parentNode.nodeName.toLowerCase()}:(r={height:g(t.getStyle(p,"height")||t.getAttrib(p,"height")),scope:t.getAttrib(p,"scope"),"class":t.getAttrib(p,"class")},r.type=p.parentNode.nodeName.toLowerCase(),c("left center right".split(" "),function(a){d.formatter.matchNode(p,"align"+a)&&(r.align=a)}),m(t,r,p)),d.settings.table_row_class_list&&(q={name:"class",type:"listbox",label:"Class",values:k(d.settings.table_row_class_list,function(a){a.value&&(a.textStyle=function(){return d.formatter.getCssText({block:"tr",classes:[a.value]})})})}),s={type:"form",columns:2,padding:0,defaults:{type:"textbox"},items:[{type:"listbox",name:"type",label:"Row type",text:"Header",maxWidth:null,values:[{text:"Header",value:"thead"},{text:"Body",value:"tbody"},{text:"Footer",value:"tfoot"}]},{type:"listbox",name:"align",label:"Alignment",text:"None",maxWidth:null,values:[{text:"None",value:""},{text:"Left",value:"left"},{text:"Center",value:"center"},{text:"Right",value:"right"}]},{label:"Height",name:"height"},q]},d.settings.table_row_advtab!==!1?d.windowManager.open({title:"Row properties",data:r,bodyType:"tabpanel",body:[{title:"General",type:"form",items:s},f(t)],onsubmit:j}):d.windowManager.open({title:"Row properties",data:r,body:s,onsubmit:j}))}}}),g("9",["4","5"],function(a,b){var c;return function(d){function e(a,b){return{index:a,y:d.dom.getPos(b).y}}function f(a,b){return{index:a,y:d.dom.getPos(b).y+b.offsetHeight}}function g(a,b){return{index:a,x:d.dom.getPos(b).x}}function h(a,b){return{index:a,x:d.dom.getPos(b).x+b.offsetWidth}}function i(){var a=d.getBody().dir;return"rtl"===a}function j(){return d.inline}function k(){return j?d.getBody().ownerDocument.body:d.getBody()}function l(a,b){return i()?h(a,b):g(a,b)}function m(a,b){return i()?g(a,b):h(a,b)}function n(a,b){return o(a,"width")/o(b,"width")*100}function o(a,b){var c=d.dom.getStyle(a,b,!0),e=parseInt(c,10);return e}function p(a){var b=o(a,"width"),c=o(a.parentElement,"width");return b/c*100}function q(a,b){var c=o(a,"width");return b/c*100}function r(a,b){var c=o(a.parentElement,"width");return b/c*100}function s(a,b,c){for(var d=[],e=1;e0?s(e,f,g):[],k=h.length>0?s(l,m,h):[];w(j,a.offsetWidth,i),x(k,a.offsetHeight,i)}function F(a,b,c,d){if(b<0||b>=a.length-1)return"";var e=a[b];if(e)e={value:e,delta:0};else for(var f=a.slice(0,b).reverse(),g=0;g0?e:f}function I(b,c,d){for(var e=C(b),f=a.map(e,function(a){return l(a.colIndex,a.element).x}),g=[],h=0;h1?F(f,h):H(e[h].element,c,d);j=j?j:va,g.push(j)}return g}function J(a){var b=G(a,"height"),c=parseInt(b,10);return Q(b)&&(c=0),!isNaN(c)&&c>0?c:o(a,"height")}function K(b){for(var c=D(b),d=a.map(c,function(a){return e(a.rowIndex,a.element).y}),f=[],g=0;g1?F(d,g):J(c[g].element);i=i?i:wa,f.push(i)}return f}function L(b,c,d,e,f){function g(b){return a.map(b,function(){return 0})}function h(){var a;if(f)a=[100-l[0]];else{var b=Math.max(e,l[0]+d);a=[b-l[0]]}return a}function i(a,b){var c,f=g(l.slice(0,a)),h=g(l.slice(b+1));if(d>=0){var i=Math.max(e,l[b]-d);c=f.concat([d,i-l[b]]).concat(h)}else{var j=Math.max(e,l[a]+d),k=l[a]-j;c=f.concat([j-l[a],k]).concat(h)}return c}function j(a,b){var c,f=g(l.slice(0,b));if(d>=0)c=f.concat([d]);else{var h=Math.max(e,l[b]+d);c=f.concat([h-l[b]])}return c}var k,l=b.slice(0);return k=0===b.length?[]:1===b.length?h():0===c?i(0,1):c>0&&c=1&&S(c,b,a)}else if(_(ia)){var g=parseInt(d.dom.getAttrib(ia,pa),10),h=d.dom.getPos(ia).y;a=parseInt(d.dom.getAttrib(ia,oa),10),b=h-g,Math.abs(b)>=1&&T(c,b,a)}u(c),d.nodeChanged()}}function Z(a,b){ha=ha?ha:W(),ga=!0,d.dom.addClass(a,xa),ia=a,X(ha,b),d.dom.add(k(),ha)}function $(a){return d.dom.hasClass(a,qa)}function _(a){return d.dom.hasClass(a,ma)}function aa(a){ja=void 0!==ja?ja:a.clientX;var b=a.clientX-ja;ja=a.clientX;var c=d.dom.getPos(ia).x;d.dom.setStyle(ia,"left",c+b+"px")}function ba(a){ka=void 0!==ka?ka:a.clientY;var b=a.clientY-ka;ka=a.clientY;var c=d.dom.getPos(ia).y;d.dom.setStyle(ia,"top",c+b+"px")}function ca(a){ja=void 0,Z(a,aa)}function da(a){ka=void 0,Z(a,ba)}function ea(a){var b=a.target,e=d.getBody();if(d.$.contains(e,c)||c===e)if($(b)){a.preventDefault();var f=d.dom.getPos(b).x;d.dom.setAttrib(b,ta,f),ca(b)}else if(_(b)){a.preventDefault();var g=d.dom.getPos(b).y;d.dom.setAttrib(b,pa,g),da(b)}else t()}var fa,ga,ha,ia,ja,ka,la="mce-resize-bar",ma="mce-resize-bar-row",na="row-resize",oa="data-row",pa="data-initial-top",qa="mce-resize-bar-col",ra="col-resize",sa="data-col",ta="data-initial-left",ua=4,va=10,wa=10,xa="mce-resize-bar-dragging",ya=new RegExp(/(\d+(\.\d+)?%)/),za=new RegExp(/px|em/); -return d.on("init",function(){d.dom.bind(k(),"mousedown",ea)}),d.on("ObjectResized",function(b){var c=b.target;if("TABLE"===c.nodeName){var e=[];a.each(c.rows,function(b){a.each(b.cells,function(a){var b=d.dom.getStyle(a,"width",!0);e.push({cell:a,width:b})})}),a.each(e,function(a){d.dom.setStyle(a.cell,"width",a.width),d.dom.setAttrib(a.cell,"width",null)})}}),d.on("mouseover",function(a){if(!ga){var b=d.dom.getParent(a.target,"table");("TABLE"===a.target.nodeName||b)&&(c=b,u(b))}}),d.on("keydown",function(a){switch(a.keyCode){case b.LEFT:case b.RIGHT:case b.UP:case b.DOWN:t()}}),d.on("remove",function(){t(),d.dom.unbind(k(),"mousedown",ea)}),{adjustWidth:S,adjustHeight:T,clearBars:t,drawBars:E,determineDeltas:L,getTableGrid:z,getTableDetails:y,getWidths:I,getPixelHeights:K,isPercentageBasedSize:Q,isPixelBasedSize:R,recalculateWidths:N,recalculateCellHeights:O,recalculateRowHeights:P}}}),g("e",["b"],function(a){return a("tinymce.util.Delay")}),g("a",["5","e","2","4","c"],function(a,b,c,d,e){var f=d.each,g=e.getSpanVal;return function(h){function i(){function c(c){function d(a,b){var d=a?"previousSibling":"nextSibling",f=h.dom.getParent(b,"tr"),g=f[d];if(g)return r(h,b,g,a),c.preventDefault(),!0;var i=h.dom.getParent(f,"table"),l=f.parentNode,m=l.nodeName.toLowerCase();if("tbody"===m||m===(a?"tfoot":"thead")){var n=e(a,i,l,"tbody");if(null!==n)return j(a,n,b)}return k(a,f,d,i)}function e(a,b,c,d){var e=h.dom.select(">"+d,b),f=e.indexOf(c);if(a&&0===f||!a&&f===e.length-1)return i(a,b);if(f===-1){var g="thead"===c.tagName.toLowerCase()?0:e.length-1;return e[g]}return e[f+(a?-1:1)]}function i(a,b){var c=a?"thead":"tfoot",d=h.dom.select(">"+c,b);return 0!==d.length?d[0]:null}function j(a,b,d){var e=l(b,a);return e&&r(h,d,e,a),c.preventDefault(),!0}function k(a,b,e,f){var g=f[e];if(g)return m(g),!0;var i=h.dom.getParent(f,"td,th");if(i)return d(a,i,c);var j=l(b,!a);return m(j),c.preventDefault(),!1}function l(a,b){var c=a&&a[b?"lastChild":"firstChild"];return c&&"BR"===c.nodeName?h.dom.getParent(c,"td,th"):c}function m(a){h.selection.setCursorLocation(a,0)}function n(){return u==a.UP||u==a.DOWN}function o(a){var b=a.selection.getNode(),c=a.dom.getParent(b,"tr");return null!==c}function p(a){for(var b=0,c=a;c.previousSibling;)c=c.previousSibling,b+=g(c,"colspan");return b}function q(a,b){var c=0,d=0;return f(a.children,function(a,e){if(c+=g(a,"colspan"),d=e,c>b)return!1}),d}function r(a,b,c,d){var e=p(h.dom.getParent(b,"td,th")),f=q(c,e),g=c.childNodes[f],i=l(g,d);m(i||g)}function s(a){var b=h.selection.getNode(),c=h.dom.getParent(b,"td,th"),d=h.dom.getParent(a,"td,th");return c&&c!==d&&t(c,d)}function t(a,b){return h.dom.getParent(a,"TABLE")===h.dom.getParent(b,"TABLE")}var u=c.keyCode;if(n()&&o(h)){var v=h.selection.getNode();b.setEditorTimeout(h,function(){s(v)&&d(!c.shiftKey&&u===a.UP,v,c)},0)}}h.on("KeyDown",function(a){c(a)})}function j(){function a(a,b){var c,d=b.ownerDocument,e=d.createRange();return e.setStartBefore(b),e.setEnd(a.endContainer,a.endOffset),c=d.createElement("body"),c.appendChild(e.cloneContents()),0===c.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length}h.on("KeyDown",function(b){var c,d,e=h.dom;37!=b.keyCode&&38!=b.keyCode||(c=h.selection.getRng(),d=e.getParent(c.startContainer,"table"),d&&h.getBody().firstChild==d&&a(c,d)&&(c=e.createRng(),c.setStartBefore(d),c.setEndBefore(d),h.selection.setRng(c),b.preventDefault()))})}function k(){h.on("KeyDown SetContent VisualAid",function(){var a;for(a=h.getBody().lastChild;a;a=a.previousSibling)if(3==a.nodeType){if(a.nodeValue.length>0)break}else if(1==a.nodeType&&("BR"==a.tagName||!a.getAttribute("data-mce-bogus")))break;a&&"TABLE"==a.nodeName&&(h.settings.forced_root_block?h.dom.add(h.getBody(),h.settings.forced_root_block,h.settings.forced_root_block_attrs,c.ie&&c.ie<10?" ":'
'):h.dom.add(h.getBody(),"br",{"data-mce-bogus":"1"}))}),h.on("PreProcess",function(a){var b=a.node.lastChild;b&&("BR"==b.nodeName||1==b.childNodes.length&&("BR"==b.firstChild.nodeName||"\xa0"==b.firstChild.nodeValue))&&b.previousSibling&&"TABLE"==b.previousSibling.nodeName&&h.dom.remove(b)})}function l(){function a(a,b,c,d){var e,f,g,h=3,i=a.dom.getParent(b.startContainer,"TABLE");return i&&(e=i.parentNode),f=b.startContainer.nodeType==h&&0===b.startOffset&&0===b.endOffset&&d&&("TR"==c.nodeName||c==e),g=("TD"==c.nodeName||"TH"==c.nodeName)&&!d,f||g}function b(){var b=h.selection.getRng(),c=h.selection.getNode(),d=h.dom.getParent(b.startContainer,"TD,TH");if(a(h,b,c,d)){d||(d=c);for(var e=d.lastChild;e.lastChild;)e=e.lastChild;3==e.nodeType&&(b.setEnd(e,e.data.length),h.selection.setRng(b))}}h.on("KeyDown",function(){b()}),h.on("MouseDown",function(a){2!=a.button&&b()})}function m(){function b(a){h.selection.select(a,!0),h.selection.collapse(!0)}function c(a){h.$(a).empty(),e.paddCell(a)}h.on("keydown",function(e){if((e.keyCode==a.DELETE||e.keyCode==a.BACKSPACE)&&!e.isDefaultPrevented()){var f,g,i,j;if(f=h.dom.getParent(h.selection.getStart(),"table")){if(g=h.dom.select("td,th",f),i=d.grep(g,function(a){return!!h.dom.getAttrib(a,"data-mce-selected")}),0===i.length)return j=h.dom.getParent(h.selection.getStart(),"td,th"),void(h.selection.isCollapsed()&&j&&h.dom.isEmpty(j)&&(e.preventDefault(),c(j),b(j)));e.preventDefault(),h.undoManager.transact(function(){g.length==i.length?h.execCommand("mceTableDelete"):(d.each(i,c),b(i[0]))})}}})}function n(){var b="\ufeff",c=function(a){return h.dom.isEmpty(a)||a.firstChild===a.lastChild&&f(a.firstChild)},d=function(a){return a&&"CAPTION"==a.nodeName&&"TABLE"==a.parentNode.nodeName},e=function(a,b){var c=b.firstChild;do if(c===a)return!0;while(c=c.firstChild);return!1},f=function(a){if(3===a.nodeType){if(a.data===b)return!0;a=a.parentNode}return 1===a.nodeType&&a.hasAttribute("data-mce-caret")},g=function(a){var b=h.selection.getRng();return!b.startOffset&&!b.startContainer.previousSibling&&e(b.startContainer,a)},i=function(a,c){var d;d=c?h.dom.create("p",{"data-mce-caret":"after","data-mce-bogus":"all"},'
'):a.ownerDocument.createTextNode(b),a.appendChild(d)},j=function(a,d){var e=a.lastChild,g=h.selection.getRng(),j=g.startContainer,k=g.startOffset;c(a)?(a.innerHTML=b,j=a.lastChild,k=0):f(e)||i(a,h.dom.isBlock(e)),h.selection.setCursorLocation(j,k)},k=function(a){var b=h.selection.getRng(),c=h.dom.createRng(),d=a.firstChild;b.commonAncestorContainer===a.parentNode&&e(b.startContainer,a)&&(c.setStart(a,0),1===d.nodeType?c.setEnd(a,a.childNodes.length):c.setEnd(d,d.nodeValue.length),h.selection.setRng(c))};h.on("keydown",function(b){if(!(b.keyCode!==a.DELETE&&b.keyCode!==a.BACKSPACE||b.isDefaultPrevented())){var e=h.dom.getParent(h.selection.getStart(),"caption");d(e)&&(h.selection.isCollapsed()?(j(e),(c(e)||b.keyCode===a.BACKSPACE&&g(e))&&b.preventDefault()):(k(e),h.undoManager.transact(function(){h.execCommand("Delete"),j(e)}),b.preventDefault()))}})}n(),m(),c.webkit&&(i(),l()),c.gecko&&(j(),k()),c.ie>9&&(j(),k())}}),g("0",["1","2","3","4","5","6","7","8","9","a"],function(a,b,c,d,e,f,g,h,i,j){function k(a){function c(b){return function(){a.execCommand(b)}}function d(c,d){var e,f,g,h;for(g='',e=0;e",f=0;f"+(b.ie&&b.ie<10?" ":"
")+"";g+=""}return g+="
",a.undoManager.transact(function(){a.insertContent(g),h=a.dom.get("__mce"),a.dom.setAttrib(h,"id",null),a.$("tr",h).each(function(b,c){a.fire("newrow",{node:c}),a.$("th,td",c).each(function(b,c){a.fire("newcell",{node:c})})}),a.dom.setAttribs(h,a.settings.table_default_attributes||{}),a.dom.setStyles(h,a.settings.table_default_styles||{})}),h}function k(b,c,d){function e(){var e,f,g,h={},i=0;f=a.dom.select("td[data-mce-selected],th[data-mce-selected]"),e=f[0],e||(e=a.selection.getStart()),d&&f.length>0?(l(f,function(a){return h[a.parentNode.parentNode.nodeName]=1}),l(h,function(a){i+=a}),g=1!==i):g=!a.dom.getParent(e,c),b.disabled(g),a.selection.selectorChanged(c,function(a){b.disabled(!a)})}a.initialized?e():a.on("init",e)}function m(){k(this,"table")}function n(){k(this,"td,th")}function o(){k(this,"td,th",!0)}function p(){var a="";a='';for(var b=0;b<10;b++){a+="";for(var c=0;c<10;c++)a+='';a+=""}return a+="
",a+=''}function q(b,c,d){var e,f,g,h,i,j=d.getEl().getElementsByTagName("table")[0],k=d.isRtl()||"tl-tr"==d.parent().rel;for(j.nextSibling.innerHTML=b+1+" x "+(c+1),k&&(b=9-b),f=0;f<10;f++)for(e=0;e<10;e++)h=j.rows[f].childNodes[e].firstChild,i=(k?e>=b:e<=b)&&f<=c,a.dom.toggleClass(h,"mce-active",i),i&&(g=h);return g.parentNode}function r(){a.addButton("tableprops",{title:"Table properties",onclick:z.tableProps,icon:"table"}),a.addButton("tabledelete",{title:"Delete table",onclick:c("mceTableDelete")}),a.addButton("tablecellprops",{title:"Cell properties",onclick:c("mceTableCellProps")}),a.addButton("tablemergecells",{title:"Merge cells",onclick:c("mceTableMergeCells")}),a.addButton("tablesplitcells",{title:"Split cell",onclick:c("mceTableSplitCells")}),a.addButton("tableinsertrowbefore",{title:"Insert row before",onclick:c("mceTableInsertRowBefore")}),a.addButton("tableinsertrowafter",{title:"Insert row after",onclick:c("mceTableInsertRowAfter")}),a.addButton("tabledeleterow",{title:"Delete row",onclick:c("mceTableDeleteRow")}),a.addButton("tablerowprops",{title:"Row properties",onclick:c("mceTableRowProps")}),a.addButton("tablecutrow",{title:"Cut row",onclick:c("mceTableCutRow")}),a.addButton("tablecopyrow",{title:"Copy row",onclick:c("mceTableCopyRow")}),a.addButton("tablepasterowbefore",{title:"Paste row before",onclick:c("mceTablePasteRowBefore")}),a.addButton("tablepasterowafter",{title:"Paste row after",onclick:c("mceTablePasteRowAfter")}),a.addButton("tableinsertcolbefore",{title:"Insert column before",onclick:c("mceTableInsertColBefore")}),a.addButton("tableinsertcolafter",{title:"Insert column after",onclick:c("mceTableInsertColAfter")}),a.addButton("tabledeletecol",{title:"Delete column",onclick:c("mceTableDeleteCol")})}function s(b){var c=a.dom.is(b,"table")&&a.getBody().contains(b);return c}function t(){var b=a.settings.table_toolbar;""!==b&&b!==!1&&(b||(b="tableprops tabledelete | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol"),a.addContextToolbar(s,b))}function u(){return w}function v(a){w=a}var w,x,y=this,z=new h(a);!a.settings.object_resizing||a.settings.table_resize_bars===!1||a.settings.object_resizing!==!0&&"table"!==a.settings.object_resizing||(x=i(a)),a.settings.table_grid===!1?a.addMenuItem("inserttable",{text:"Table",icon:"table",context:"table",onclick:z.table}):a.addMenuItem("inserttable",{text:"Table",icon:"table",context:"table",ariaHideMenu:!0,onclick:function(a){a.aria&&(this.parent().hideAll(),a.stopImmediatePropagation(),z.table())},onshow:function(){q(0,0,this.menu.items()[0])},onhide:function(){var b=this.menu.items()[0].getEl().getElementsByTagName("a");a.dom.removeClass(b,"mce-active"),a.dom.addClass(b[0],"mce-active")},menu:[{type:"container",html:p(),onPostRender:function(){this.lastX=this.lastY=0},onmousemove:function(a){var b,c,d=a.target;"A"==d.tagName.toUpperCase()&&(b=parseInt(d.getAttribute("data-mce-x"),10),c=parseInt(d.getAttribute("data-mce-y"),10),(this.isRtl()||"tl-tr"==this.parent().rel)&&(b=9-b),b===this.lastX&&c===this.lastY||(q(b,c,a.control),this.lastX=b,this.lastY=c))},onclick:function(b){var c=this;"A"==b.target.tagName.toUpperCase()&&(b.preventDefault(),b.stopPropagation(),c.parent().cancel(),a.undoManager.transact(function(){d(c.lastX+1,c.lastY+1)}),a.addVisual())}}]}),a.addMenuItem("tableprops",{text:"Table properties",context:"table",onPostRender:m,onclick:z.tableProps}),a.addMenuItem("deletetable",{text:"Delete table",context:"table",onPostRender:m,cmd:"mceTableDelete"}),a.addMenuItem("cell",{separator:"before",text:"Cell",context:"table",menu:[{text:"Cell properties",onclick:c("mceTableCellProps"),onPostRender:n},{text:"Merge cells",onclick:c("mceTableMergeCells"),onPostRender:o},{text:"Split cell",onclick:c("mceTableSplitCells"),onPostRender:n}]}),a.addMenuItem("row",{text:"Row",context:"table",menu:[{text:"Insert row before",onclick:c("mceTableInsertRowBefore"),onPostRender:n},{text:"Insert row after",onclick:c("mceTableInsertRowAfter"),onPostRender:n},{text:"Delete row",onclick:c("mceTableDeleteRow"),onPostRender:n},{text:"Row properties",onclick:c("mceTableRowProps"),onPostRender:n},{text:"-"},{text:"Cut row",onclick:c("mceTableCutRow"),onPostRender:n},{text:"Copy row",onclick:c("mceTableCopyRow"),onPostRender:n},{text:"Paste row before",onclick:c("mceTablePasteRowBefore"),onPostRender:n},{text:"Paste row after",onclick:c("mceTablePasteRowAfter"),onPostRender:n}]}),a.addMenuItem("column",{text:"Column",context:"table",menu:[{text:"Insert column before",onclick:c("mceTableInsertColBefore"),onPostRender:n},{text:"Insert column after",onclick:c("mceTableInsertColAfter"),onPostRender:n},{text:"Delete column",onclick:c("mceTableDeleteCol"),onPostRender:n}]});var A=[];l("inserttable tableprops deletetable | cell row column".split(" "),function(b){"|"==b?A.push({text:"-"}):A.push(a.menuItems[b])}),a.addButton("table",{type:"menubutton",title:"Table",menu:A}),b.isIE||a.on("click",function(b){b=b.target,"TABLE"===b.nodeName&&(a.selection.select(b),a.nodeChanged())}),y.quirks=new j(a),a.on("Init",function(){y.cellSelection=new g(a,function(a){a&&x&&x.clearBars()}),y.resizeBars=x}),a.on("PreInit",function(){a.serializer.addAttributeFilter("data-mce-cell-padding,data-mce-border,data-mce-border-color",function(a,b){for(var c=a.length;c--;)a[c].attr(b,null)})}),l({mceTableSplitCells:function(a){a.split()},mceTableMergeCells:function(b){var c;c=a.dom.getParent(a.selection.getStart(),"th,td"),a.dom.select("td[data-mce-selected],th[data-mce-selected]").length?b.merge():z.merge(b,c)},mceTableInsertRowBefore:function(a){a.insertRows(!0)},mceTableInsertRowAfter:function(a){a.insertRows()},mceTableInsertColBefore:function(a){a.insertCols(!0)},mceTableInsertColAfter:function(a){a.insertCols()},mceTableDeleteCol:function(a){a.deleteCols()},mceTableDeleteRow:function(a){a.deleteRows()},mceTableCutRow:function(a){w=a.cutRows()},mceTableCopyRow:function(a){w=a.copyRows()},mceTablePasteRowBefore:function(a){a.pasteRows(w,!0)},mceTablePasteRowAfter:function(a){a.pasteRows(w)},mceSplitColsBefore:function(a){a.splitCols(!0)},mceSplitColsAfter:function(a){a.splitCols(!1)},mceTableDelete:function(a){x&&x.clearBars(),a.deleteTable()}},function(b,c){a.addCommand(c,function(){var c=new f(a);c&&(b(c),a.execCommand("mceRepaint"),y.cellSelection.clear())})}),l({mceInsertTable:z.table,mceTableProps:function(){z.table(!0)},mceTableRowProps:z.row,mceTableCellProps:z.cell},function(b,c){a.addCommand(c,function(a,c){b(c)})}),r(),t(),a.settings.table_tab_navigation!==!1&&a.on("keydown",function(b){var c,d,g,h=a.selection.getStart();if(b.keyCode===e.TAB){if(a.dom.getParent(h,"LI,DT,DD"))return;c=a.dom.getParent(h,"th,td"),c&&(b.preventDefault(),d=new f(a),g=b.shiftKey?-1:1,a.undoManager.transact(function(){!d.moveRelIdx(c,g)&&g>0&&(d.insertRow(),d.refresh(),d.moveRelIdx(c,g))}))}}),y.insertTable=d,y.setClipboardRows=v,y.getClipboardRows=u}var l=d.each;return c.add("table",k),function(){}}),d("0")()}(); \ No newline at end of file diff --git a/cs4teachers/static/tinymce/plugins/textcolor/plugin.min.js b/cs4teachers/static/tinymce/plugins/textcolor/plugin.min.js deleted file mode 100644 index 4b2f012c0..000000000 --- a/cs4teachers/static/tinymce/plugins/textcolor/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i
'+(c?"×":"")+"
"}var c,d,g,h,i,j,k,n,o=this,p=o._id,q=0;for(n=o.settings.origin,c=f(n),c.push({text:e("No color"),color:"transparent"}),g='',h=c.length-1,j=0;j",i=0;ih?g+="":(d=c[k],g+=a(d.color,d.text));g+=""}if(b.settings.color_picker_callback){for(g+='",g+="",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 - - -Generated by IcoMoon - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce-small.ttf b/cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce-small.ttf deleted file mode 100644 index a983e2dc4cb30880fffe00e1f0879be4d95eb4cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9304 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 diff --git a/cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce.eot b/cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce.eot deleted file mode 100644 index f99c13f32f5c968849f08a3d8a399157bfb0cccb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17572 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 S4xrR19F>Jx9kYDL=l=i@ywbP; diff --git a/cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce.svg b/cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce.svg deleted file mode 100644 index 5727cea42..000000000 --- a/cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - -Generated by IcoMoon - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce.ttf b/cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce.ttf deleted file mode 100644 index 16536bfd7a292e7090b9d4e0ae61061da9bc042f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17408 zcmdsed3+pKo#%U1eW)dMt6P0kt97_r?e3O!v|4JFTDB#*Y}xXmC|2zFh=~(9w&DXH z@)bgc%oH|bf|&#_*9_SNi*Yh!0s%e?WH%x6nc4xe1Do*4hs`p;Ojtpd41$CYp8%7< zs!RL*y{eX4vK-Ns>n%b&QBjq``@%_j4P5!UD zFaL}&-T>EgaNp@kr283@#^6^RJo?_d@2`An0P)?7^?&@(#J&Snov{F8gRdjM_Ye}? zpL6swwq`lv%MTqpbMMck(EAbJg!X=O^u+#s-<|l$t&FYhNB-=wefLhX2iYeWTi1tp z{P@0O6IX5xIT1(u{KDjk(`PVFJVVoz&t!R)Ut-9YJ|(??l#f_G{{_o)58~wy$FLVa z8e_k_S2pGhrpa)~q_rqLaS@>2$Tc9(@?}w~fjM{->FZF>$t0x3r(34g*Q#Fgz1H?K zK2tGMH4~T#&os`o%(TvQ%&0R1Gizt|{rt(FfBqM}zxeFyM_zyN^_Sl`@`mxo?|ymj zTybtr^cJ6H)2*+u*SxQ_{*28q(MD*dVJ0ow$jz*rS%Ws7KpU!P+GlIe)jBZ0 z^7)Ga{Tp7Kam=QstSyPL!b;KfLi_KWhLxT(Fd&0DSOo(-@k9W>d?1NH9>KgK>$AFp znM~KYUSyi2ji|CQ%Vd2Hi83<{uBq^~IYY*e1+jx&XeX29$wad&90*17iSAxC(35sI zaV4qZ6%4tMmquDI@*+w&-^9c62Oo-#CCqrDvoj%0Cpr@wWQTM`c1d6LxQlVO$K&SH zjtYm#x%9h-qR5|}5=F-oV-d+EUy&U0?9)_C9(Q{m#vo0__Ady3tbZ2O|VQEJe*UW?al&uO>A%iH5(bkwN%ZyBRC>xH)%V`*e1 zU(8v0Bn4|yBAxY zDJZUp9qUbJoB$5-Pd29kG-?l(vHp30EC4p-DgcH7!rc*sQQj&^5LPO0l|*5yyj%XG z=384DwYexB^Zn-g$)D32TW)P0@Z}?`<1O2hEzRz=Yu(K)$?Yxi)seh!p!k|AP*oN6 zRo7KjH&$0yxSTG3RaKp@I$CYTA5N)i3XXRpUR77^i&j+yP^v=YN2`5xRaJfw|3A%1 zjkD7
qE0fV3qg3i>lG;3uYEKk_jlWwzK&8|i)pG_^o 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 N%EGLUS-#`*e*qFO!Ds*g diff --git a/cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce.woff b/cs4teachers/static/tinymce/skins/lightgray/fonts/tinymce.woff deleted file mode 100644 index 74b50f4c3001da7fdfffd8638213dcf1a396da78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17484 zcmdsed3+pKo#%U1eW)dMt6P0kt97_r?e3O!v|4JFTDB#*EZOp*C|2y)PMkQAV=F%J zeT0x9Glk8VU?#!KHA6PRVw?<_K!DEz*-glNrgnhrz$Se1VY3V{6IPHVgCOCe7CHud1b%Y{!$C&;GO3{p#KK?|!e|yJcjAafWBz4XjG|%!*TZ@v~)HXE!n{kUBxG zrnc%cdyninj>q^-Isp8f6pnTNspiml_lrjfB1cOBkeK9`aePL{>rBY4ovRZ z$Jm-aWl>rAQ5S(&z6&Of8No1;K=EFk%oHwx8!~yg+6fj*j|)d`vA(!lKbA| zPj5c5=U&ts`XJ(Q;T~k4Ji6z|B+}3?KTq!R%^~OUW2a7IzU}knWQ1gSmS1E}jPcXb z3y6Qz^7$`Wo_i24f4ILqMq!PyU)?Jka|Y97IHZU*g-=ghyhSevH6V||4R}+j2Ik;V z_(Q1YWD?Ti(=F5LYgMoLUTga~pQ)IsnhDH=XBuZ(W?E-DX4IL1nYA-}e(~flzVOT5 zUw-cOL$AO1`pa(|dc%0*_rJP#t~fV`w$SG^n{IuLz2<$b_2+Dci8ewr4Kr!cMs8;1 z%o?=u1lmwV8!s$rgU`Jhcf{q`%2;2lF}g_^RW>Q>lp&>G=~41Zm(r=UD{V@3`1$a+ z!ULffLsh{igO3GkYM-q=TkEiACI<5FcyY!tn;Nl7Rx=V~g_UAy7uNTk)3DNW1_op> z2Ou$kjY$OX%LkGOqVwX+NdfUvrN|KkSH_L;F=0wn=@qmSP(nb zg?2Joo=h~m!hujEpXlyY13hVX6IYTdUcrzHd1<8eA}^wZ^G!S~f9Rp;c*2Y)Iy)26 zbfPn{UUo>AWta3dkGmLmdpvGF?Wk~=oJ+rdD2n{qDN%GHF&>dz@@2^(&pu7X{;Vz@e*F4H%UXzwN{j)^7`8*!v8rxR zof@nu3ns$i7r?vZP-vD(dQm4wVREvrYuFl{i#IiO&Gr<#E!p-(eWTQ%ajh1w*`CvG zhnKg<#ptL}^WQQ?Yt{>IF~-u!O1_x0hIwncSh^#C#gAkCy4enP7yA%nsVr~fncyJr zNoPFV$3qb%=uS4f00G$ee0MLlJX26y5j)nK&Nu-a;-73z18CG9Dr5cg09gQR$W;Ig z1BAOH2&24Jk|3;9-YSX0R(ZGlN6k04G-`8EJmv??50F2nHMZQ`JmAYmR>xbmC0m-^ zYuCD)Taw#a;;SQh-$3y-SD>mY>Z`7+s&1^Vu5dYB{;H}vUv;$Fia(rE)f61>M!c%7 z+83>=3ZPVl$d6Y0>Z+>zBL07xlNx8ybsN`3O`Yo^FvqlH^T4HiB$8}y*_$02%IY28RE7S^Tdu0E`<$AluG8wQ7*(LEvd&vwS6yX~(i(M?;($TW2SI1* zS(>%74wffu>`Av-uVz;xmd~aZ;Y1<8`*>F#E}T@|Y9bs|^MxcqzN`hk)9IKVOHX@) zK`)PU!zcoA42kKJ^@a&w(x<#ZEtXElP`0Rhg9Z{g(=U zsa3bU*5diMYr^3gdVNi!iP4K6n@^N6c5M!`uv}|X@g>p3z2*btOK7U72fb9&8{|eQ zWMT!ZG~mVJIae`-C0QqS!NyjiD!c^Em=6(WF}Wq-1%$ScdQ??MujYW1AVc`enq9#B z+R^~VRDuhO)&*E2c7xF#l&D-LkW`auFq{V{6cEaX!$`?f2yXFcXq9vW&;UmdfC7JG zju~3<&2H^u{cyiBsgx#Q;0ih$v0#8GS?NdNI_?yNXK`;9L4&wLB-i?ZC+mi_*8keJ zc_8%;ZO@grE&+xN2A;+=2M6nJVgnd&caszj`J`lXR#G!PgHk>$2%CG5C$63KlkC=k zWO86@mV7>P-{sxfnGTQNT~RA-x^@;T)gV8<`|^DwdM;ZLtd#gQGXP+;$I>4l8+gHt z26>jd!yX>)ZQ_#jhqiRz=bs>A^zBziwrFEdKRgKzkLcUZM_xDIV4S;bxx$BrR1a6v zJ|0oh(jZqPjd1FT&-bO<4sIEF_1n_lzilGHbWA?{^w>!reEkt8IA|92zbE?E*h#bz z=`C;&`?SjqK2Q*3yapivc_&5&lwN~uqT2-sFwL$S?g}mAf=5tB#w`RJN(bvek%bCW z3VgtBECXQ&d}R&q?ctg?e*ZA@l;;+M76qQS5qEIrCy<{l1JBK03?z-8B{H=Q8!P7yTgo zn5WVqul4&Q=<008UIowP)-&0)Qtd+cooYSSaTXv*nu|@-yV)c=$d0fR>0@W!&VGd*ynobe#o$%vz_b?@duLvc^G811cIah5uU9I5Q01 zc%3!t*cVY0?Bcsy>5lX0V#Y8u^B)jcVQ@pk+Dps;Tx)=92ZR0<40w1zhD#V+WRfvurT3W|B`5+DjK%`mRBGRnT@_Z(ma%55C%!Op5*mVZ z>yl>DG_6Px{Zf}QD{3Oe5_+vnB8qr0Hya*h$jp6g3~)%$&>d;yZsHvYwb1O7+&(!R zYLb*DIo~}f6$WLsCo5&La#HOoCzl|k+Qjaexx#22A6?hj)UnL(U)IsoxNda3 z^~#h(U;oJX_(#5e$o8>Tl9sAB1ap{rhkElZO_bFZtzcdf)0iO}lEIv0gYZas4^JdL zJkPmC;s7=XYzGoQBe5U5Lc32XmXBJnAIRU4H)Frs5Z2gctPECymVwrQ79dy>UqR3y zy!Bwjcu4rj*Z@JBim>&ovM0-$tOH?OC4}Tx1cLXFGLTN?_ z>`)AY01E*!U|CcOAVZMD6%|6h#I}6w-0}AI{V4j|Y6Q?mCgyvSRzrUD@oeo!eKmZ%wuCQPX4N+ge+4a>D zbdoz0@Xvs9V1Dkt3;!q$S4hs-9V(|>y4x#u3B>5@Ok zx^2l++WOpcgtN~*C(Ji!6L_y<%%V+R)~5TqZAv9^_voTF(XdS;p?{^IXC+jN01}uB zvIxOjNvK&+MM#o1L3B%4XE403t^J9@guZE$K2b>YZ|yR5jkA$^ws)4OR_FG6Ml^kn zeLuYM&f|mQf3|=1>ivH8NBl1aKP8jqC)p7Xa_WY$Mu6t0c{)Z0(k$S`nx2usB$)cgz>kR2K~h^D{7Y4RVL6i7-@N z9sjE)OMM)PD09%cd|1*Jh*5X9s&;ql8#d_O>2A-n)6I!TqaEvEIaaFc`??I;#aE1T4@rk zAXl~VAU0J5rEfOGTSj)Pu%zqi?va*t<_9NR`}gT$AIb57)dS%+yzS317YEU zcms@sM5GdBk_^3j=b53QGdsKW`e?(ZmX=Ko(R$D!y@)o=iT;B(c68i$u%Azv6HR?e zw7x#7^fj4N7!q*D-jhDokA8$sI4^jq`I59{31W-n&Lq$sM1e{~6cQMuf6S?BuKmQ| z;EDE}s-L{^#*-&+6yd9-7E{Fe`PY}MHlao-HKs5{yM^*zOsLPsU z06R+O84Ge^n@t5*qkqr|(%}Vtg`cs* zxgDGLFbv?64q0xRVU>a&p5Ymt$N98wPE7&Kr>ziyHkf1K&?d#jS zxy|9&`@Gjj>cjEz`tHb=0{NgbD48F~Z`zcHlQBn=aiggF@N)sXMlM%BY3fREwR-vHPsUz z0?5X-+;mQZx5QpggagE0!ZMS7&kdcpi^iFz8%yo>l7VDmMnz5106om+qfM-tr7=cX z9JOFglPa_`aVkT~Sv}9oFcxzFG8s1bs~>m!oDQG6x<+zGJkfNu)8lk{r29U#`}v(_ zqr2Akzj>hzfV~H#mcpazj3~^1?%Z+S8G9rdRAx zc!psSJ0M>@B^%&;2eF;d*oF9u)02L#;@_3)QFA?AgEFZ&NTstCMHbmzS-C3*n+R$6 z_;-=wD=WFsN~wW|8~92Ib3vXu-e1AQ)9YN;AC2}eTd}4+%AL-!>Okbyrd)Gy_1zyHm&C(mIkRPKbJFPe&&B_?kLP5^ zdw=rf_rzCi?HX~{y3<3^=uo<6?;Sfc4l2$AO@Xmx8Fnv$&%|o?t09%676t zz*2Az5*Z0JiMNKqHxP=5v@}VNgnkJNhUfFb^W{}b#_T17Zl+A;b_*s1Lx4M+BRfet z`S;m)EH?TcddIWx8Krk)EY>I;zk2#h18r>s_N_%*S?*L zwQf@_ic_oBM9MRj-T*bV# zr=Q;O?6c+}2Qy(Xk+g+*(#-$n>0M9bFMWfiI%`Nqk>-f$U8_G~cK|u1UPXXj=NbIDw6>BEwv*r$!aCm8 z4$@>fI>g^nrgU@&Ui^&#%+k8yW$oi)`~>MH+dK6oi(aTFf?KOk8M=7MD23`)w^|8! z7Z#X869ebYmHyV4bPT{=YbZ}f@zGK?%3)04rSmkS0yY5H%V3MgXcBZKrmWjpHXxsy zy8zBf6)V@O)UP8QW`R;NuovCHEGeJSz5EDH)dC&2^J|>46y{JHa=n^C20Lu z_Emz`l20o+zlaO{EQHE>TfqLZ^{Qrmwj8pDn`|ZaLUAk{%zO|@m3$ZzD!^sn4_Z0hpZ&$-P5WD=c7ATO4zMB71d4s1B^0sQ-WRqAfQM)JEcUW!}8g{6kXGo^;lDBB82kPknWDtkUBRMce_0{PAH?&>WXs{42A+!7)~T zle4Be+8IQl%IeB$T*?Wy*H_mNe2_jejqywYS}i?m$*r+~Wf3Rcxa4@Hen^vc7*eZs zFH&Z$kR`t_KLv>MLn~w+D1|ua&J=pPm+?rbhC`)IsM4!u<+J>)XS8RA18srBfxvLl zEq`J5X6ck!`3!&S*@0(=1A!yR8ZPR`>9#7)1?PT)v0cR2JZLw;HsEg70d|^wlxPnq zEh*colQzu0|S^jXI^1>D=inT=&) zArk}id1b-m;KG$KRI!XlJ&r3>( zOe7&i+EB43R~Q;z3Au8ZPiy?w=2P51{G;CCPiuwYhaWbd8Xn#-JY0;lxA>~7PolM?W<}_G-upy$?f)deKmQ>;daz`s(m$q0WnM^#9%5Z-$ z)x10v3d_Q_a(Pa z9O@&B`o!83f3YLGbIbb1Pw|QK>4lg%b$-5(97_+jDP%9-@fRo72AAjKRM`Bh`4|e9 zN)UMiPnvr}z(}06Fx)@p8K^9Ia0nb7g%iLi?0XU#3K6sJ-mVnRsBkwkpDHLxsr9{0 zJ#9(v1@oER=ChJ3x-p;Vjocnv*Y?J`nTzsr?%Ms*?))qH-R4)u#vbOmdzv?mjkoN^ zGyErop5BX!0DEvP1*OmQ@J4SAa)=IVDNDAYamc^TKate@itr8k-%E zF5Oi8>`jsZ%Q2>|V*#io4Kx8%9du5?og=d3;bZ_WIk4!4FKmx0PP*g`;bjiTE=1ZX>P7l}c>OZI#<47HKEw6-OT0O{O+jN2{V`k5uLXpXU5b{Wu&688 zZ}ZUVV4G2JB|zsBy2wjBa2A6LRN^Q`PPkzPNyt;PXuhvy3P9-7-!Cccqy%QV7 z2oNe7U-}X^XfCi{U;zzzLf9*^yerpR= z$r9=rGq#*KvBhWznUo&l)1d~Ou;82pU15IME5YxnCsMi>dLz;sfHFOQ(;MVEFS9Kt za7crr7|~Y|t)b0}C$`8sIXHhy6h5uy_^roeibf+&{=<0xKDK=Fcff^kT|56FeUM;tfk8dOHeDVk+Vir`vf1^{v4dsW?vV00D?cDDkiTLSPXfvSFMzWvI|d#w4MdL4;1>GvSa6);5bK1)L!ytH(^G(BeOj6>PbF!bpc&wP39yNyckmqCV1k@NcaeO=eM)z?U|p4k z=!P3R)@?3s-Q97^d+J7SKU63jx_z{+#xI2;bsKM;RMp8_H`YZ$lE3DU6Yn2cabuz~ zRM~#>=7CVN?5zsA1J%v^pVyy#@8QnQ!|y%2zU`J%&*MQwA6TI3TV!Y2@sG~s!#Rsdbm7{wha zjX5z!#ls7*HNor+3l|2D5O_3r2g(^XzehQaZ)p^cOU-t+Ox7u@Ahm}%W80}5zN>IU zQYqz1XccwPH16;+uE|W&u%nP{WY8f{BTaDoC3z$vKt=$0LgNygj(P^_p$CuTK??ma zT>K;eCBov35*h%|0R8h21*IDdwoN{eAq^%Y89EVAofsNt=giOC#`m7XNjZJOBwps! zIrGum_+96a9cP+6Eo*{%(!H3ZQb?BFJxPY`OLIvH_w^3;8*ja3v~AwEa^*fcbJ@4D zgtf9pSozjlrF8O-mJk(#T+|PpSm)iDJRKI7?&gI{mtOePzoQ@8QzmGwSVvfT>bRu| zN*Yel;Rx55;N$jM^FRUuV=3D{>L>jEf&6pX!0Agb8^XB<4%KnXT%2#0hK!SASA?!Y z7kbmYG<^Fso@gETEo^OSQl5S@nDMuDm6n5ioV;^?;Jfvs^)W~BEFF2%fw%2f5vkDi zTfZCdbDYwb)|mXRHh(7gW|JdUKgy-DDxxYkL_I9Q;_c;%5JO_A%_JIQD^YiOzg_gO+EV_qePtb#U28e6xi+V|I`} z;c+Sv*rb{}c^W3FZk(zKp9~&IO}SvJ>cL?xOjl$8v3)!BN(R61O_(Hv9a}D<8)5u$ zifHsI;$pA};3eJP5ex>^+H7rYPz@H(m&K(0NU24RiV_{g^W`xyh}mBr<3C-BW9EeD7F}bDK-cojDL()@5kmwz zdlL>oeX_-v#W^F=q!&6Sy0X1hiI$d=ANu5I(`feg@BHm!sv6DTce|{|;;#M&Kl$hD zM-HrwR%V7{BKh|J{o5hHI)Qa? zf<+eSB7rnj;)=v?E%u1@D$S<_e3`y6BUWFsPJ!>!Z9s8UNf&d-*hLzu*h}g0pAjr^ zo!<4S;%y>oA_@z#Nc>sxHfz(ZGCz|Zx1tyy(L+P{f=okt zQ}AU0VIS@hk$iv`i3`v}xF#7$hn$I{215s(qcoBP2?m7If0F#4ch>a(j#WY6$MbUV z7r!X^bJKG=PH_#yD`-!}gL>jSagaRZzwM|HE!mmEyWeWbN}_5Mhtq7o6fgNlmgFrh zhd6hkOxCV%ENO?z_u6SMEy-&@oE%%?s7_fLS!J04r`tY*KLw}3#o-X=a3Y_4%}QfA z_#Ie@x9vFPy<1mmt5mObaT_GH&bN83Fx5pK*Wvrh%2PVIOH0xWD^7DNx%s)qmz1UY z(!+8{zC(Tl-#5JN7hWCZP5dLYz70E>oM5ZF&RVtK0<)ktlm7-12UD4<3{B`T< z4%hu%-H&6TSWB!wHXgepb~tu6_C)NT>izZ2^*!~UsDHiT_J(^JH#Xke_+;Y?jnhpH zO`8P<+|NEvngyN`rih6B^06<9QiOAEq!IQ}NjICY!^B~G?XUykGj^E1C<)tP7t%-V za3yH>1yBg?@F2y994jm#yx$JPc7U5gR=NY>_uFA7Zob9sunXy1?QkXT{XTa3;L-OT z**git|3P*XAB!CU^Pb!>dGgf3V@Km%*&I#UK1Co#}7_z+|dJ9*WTBgc-Oj_;p5I(c%>>B)WZyWSVywD;K9v13QGkSVC|)98Ia jnmH;)vjEB<5wG8q|kKzxu40~1eAV&{y5e`l1KFoiKNSOWkz C+YCGa diff --git a/cs4teachers/static/tinymce/skins/lightgray/img/loader.gif b/cs4teachers/static/tinymce/skins/lightgray/img/loader.gif deleted file mode 100644 index c69e937232b24ea30f01c68bbd2ebc798dcecfcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2608 zcmdVcdr(tX9tZGC9yiG~=H_*Q-0%n(kWqP*D#hw{AQu8;1%gl-Hrf&{2?48KX;hHy z3Ze*zEz4t3XdUFyLbNPUYlA`|B}P=N1fqtL1*}S;87#|-W9v<#G;ul(e%d3)N(^9c$d2Dz{7}?ErjNd;{EMKkCsk21~b9Gvg zDo<7L=3Z5HNbVlZUcm1eg#o#CZCJU`3IYHwM->zCd?uYrF3vKFeM}v?f+%s?E>ly|3W25ry9#NNbTx-}0ON58dTrs^ix{_1O0Wh~SVSBlH)Ajn zPn^Gbjz}PCtN@#keR&hK&Dhl-b$kZ8^S)x#dh0{7X=X%CCJk7P1PSO>T&S8I4{#Lg zb5#)o=;!ZP*1nM{cI4@(x7o27*SA()NHmrn67aN@Pmi~(i_SnrjYnwh36aG%!@i0d zqbvfa44f|?OG4ntP|nbjhEl1)Yp6ZN@yjy zy4==QmLy%t;ps3R?~f2KfTTI|2?q8dFd6^z5GF+Xa&Y)sjG)hxit80pPcOP zJ z*LW{SyGHD%hUotV+W%I}fBLAIx!8|7#}$;clKQ+{&FjDqGQ2ZNx(lYM3*%~}ILnao zM`aui55~ZFJlu^!5rdA9Q_7H68H_;##u{x(Yn-vSfIRCb^Nqsg zGRS!Egm>h+o<}LeV4&CLReo9FrDjDvs}8?JwC)#Qs|ie=r?~xUh)&*d`Fx>FG}%X# zNdtDHBKhLPC0wpooFDAQKL%*6T|ULH$=wX!NhcasgD3d;-d$I6yRK3yN+E~C1335_iLOt+*9uvSZ`>*KA}vm}08wRq=>5l|t*Na&jR z-C1&C`nkEk#sB|@yyt-#fXngP04My zm7u$Q%EJbHp`>~`5W&L{W!6`y&}LMS;jfUpgO~7TLVMRZ9IC)IZp0A${`yp0{&wco z#1nx@XMkhqeK%7?RE7JdLr1^nwFfaJ0Q&Lv?WNJ%9}VSJsNY2+UYs2%EU0J~ayFXv zi*?7KCXQHkD)O6!0Q%4N+HTODHxJ{kQSuQX$l-rSwkwh(zMkdfzxyGwl@yHC)C4p< z&n2%8#M?)Q@mgHL1ot8`SFdSEj9ye|jHy+U8#@HoUExG=@AVkRAe_qYm4EpzK6L*& zh`)26?V#f4#_h^P9G^%>h2-H3)$QP zQovu6J9qDvsxqweDdNNa!Lb?L4_UF{tLX_nN7r0U_vF14YKcGR-*Gl} zx3oG)bzf|65dBxD-;2ZCp??K;+TuQ9onnK?==5hzbkb^r_g>z4#D8mcv8(+XdoszA zCx-qhdgxMNMotj}SiL_6V(tLcsK7(M(r(%u<}QrVfOvyK6_;~NOTlPGfX@M7S5YQF z&*$(ylJMHJt^_aQeu{C6NaTE$G3HNN@_SnN8YcaKn%`)F@~L1x+ah7-gEJPpc6w%3 zyX}r+Qk$4RHZzfH){e~F*qJ{d*L8a6n4;U?+{de0-t)mal#TVxe)3F}^UBh+zd T)6_**#cgp_+?JL9(ew3BlNF>u diff --git a/cs4teachers/static/tinymce/skins/lightgray/img/object.gif b/cs4teachers/static/tinymce/skins/lightgray/img/object.gif deleted file mode 100644 index cccd7f023fb80908cb33bb7d9604236cd21b7ae7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmV;J0B8S4Nk%w1VG#fg0J9GO<>lo+KR<78Z?v?uS65g4{r%Y3*xlXT%F4>`@9+2b z_ww@cot>Tk|Nk>HGXMYpA^8LW000jFEC2ui01*HU000C<(8)=wd#<&tyXIMjHBV`d zBSi|xsj3(;nD0kQ0aJq8eLH~x02P|t2!_J&Wqb%0io?#xDtr{background-color:#fafafa}.mce-container .mce-table-striped thead>tr th{font-weight:bold}.mce-container .mce-table-striped td,.mce-container .mce-table-striped th{padding:5px}.mce-container .mce-table-striped tr:nth-child(even){background-color:#fafafa}.mce-container .mce-table-striped tbody>tr:hover{background-color:#e1e1e1}.mce-branding-powered-by{background-color:#f0f0f0;position:absolute;right:0;bottom:0;width:91px;height:9px;margin-right:-1px;margin-bottom:-1px;border:1px solid #c5c5c5;border-width:1px 1px 0 1px;padding:6px 6px 0 6px;background-image:url('data:image/gif;base64,R0lGODlhXwAJAIABAIiIiAAAACH5BAEKAAEALAAAAABfAAkAAAJxhBGpy+2PUnzqGNpmPNJqDIZSJY4m+KXLF3At2V6xPFfuvMF6J6fINTnhTr9XcaRC6pKvFYlZjDIszaXRSA3ijlXo9AlWindaldSJthJ55XAz6+ZWbVCOdojP77p8J8vlUSI4SHEnaEiYqOhARdhIWAAAOw');background-repeat:no-repeat;background-position:center center}.mce-croprect-container{position:absolute;top:0;left:0}.mce-croprect-handle{position:absolute;top:0;left:0;width:20px;height:20px;border:2px solid white}.mce-croprect-handle-nw{border-width:2px 0 0 2px;margin:-2px 0 0 -2px;cursor:nw-resize;top:100px;left:100px}.mce-croprect-handle-ne{border-width:2px 2px 0 0;margin:-2px 0 0 -20px;cursor:ne-resize;top:100px;left:200px}.mce-croprect-handle-sw{border-width:0 0 2px 2px;margin:-20px 2px 0 -2px;cursor:sw-resize;top:200px;left:100px}.mce-croprect-handle-se{border-width:0 2px 2px 0;margin:-20px 0 0 -20px;cursor:se-resize;top:200px;left:200px}.mce-croprect-handle-move{position:absolute;cursor:move;border:0}.mce-croprect-block{opacity:.3;filter:alpha(opacity=30);zoom:1;position:absolute;background:black}.mce-croprect-handle:focus{border-color:#3498db}.mce-croprect-handle-move:focus{outline:1px solid #3498db}.mce-imagepanel{overflow:auto;background:black}.mce-imagepanel-bg{position:absolute;background:url('data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==')}.mce-imagepanel img{position:absolute}.mce-imagetool.mce-btn .mce-ico{display:block;width:20px;height:20px;text-align:center;line-height:20px;font-size:20px;padding:5px}.mce-arrow-up{margin-top:12px}.mce-arrow-down{margin-top:-12px}.mce-arrow:before,.mce-arrow:after{position:absolute;left:50%;display:block;width:0;height:0;border-style:solid;border-color:transparent;content:""}.mce-arrow.mce-arrow-up:before{top:-9px;border-bottom-color:rgba(0,0,0,0.2);border-width:0 9px 9px;margin-left:-9px}.mce-arrow.mce-arrow-down:before{bottom:-9px;border-top-color:rgba(0,0,0,0.2);border-width:9px 9px 0;margin-left:-9px}.mce-arrow.mce-arrow-up:after{top:-8px;border-bottom-color:#f0f0f0;border-width:0 8px 8px;margin-left:-8px}.mce-arrow.mce-arrow-down:after{bottom:-8px;border-top-color:#f0f0f0;border-width:8px 8px 0;margin-left:-8px}.mce-arrow.mce-arrow-left:before,.mce-arrow.mce-arrow-left:after{margin:0}.mce-arrow.mce-arrow-left:before{left:8px}.mce-arrow.mce-arrow-left:after{left:9px}.mce-arrow.mce-arrow-right:before,.mce-arrow.mce-arrow-right:after{left:auto;margin:0}.mce-arrow.mce-arrow-right:before{right:8px}.mce-arrow.mce-arrow-right:after{right:9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:before{left:-9px;top:50%;border-right-color:rgba(0,0,0,0.2);border-width:9px 9px 9px 0;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:after{left:-8px;top:50%;border-right-color:#f0f0f0;border-width:8px 8px 8px 0;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left{margin-left:12px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:before{right:-9px;top:50%;border-left-color:rgba(0,0,0,0.2);border-width:9px 0 9px 9px;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:after{right:-8px;top:50%;border-left-color:#f0f0f0;border-width:8px 0 8px 8px;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right{margin-left:-14px}.mce-edit-aria-container>.mce-container-body{display:flex}.mce-edit-aria-container>.mce-container-body .mce-edit-area{flex:1}.mce-edit-aria-container>.mce-container-body .mce-sidebar>.mce-container-body{display:flex;align-items:stretch;height:100%}.mce-edit-aria-container>.mce-container-body .mce-sidebar-panel{min-width:250px;max-width:250px;position:relative}.mce-edit-aria-container>.mce-container-body .mce-sidebar-panel>.mce-container-body{position:absolute;width:100%;height:100%;overflow:auto;top:0;left:0}.mce-sidebar-toolbar{border:0 solid rgba(0,0,0,0.2);border-left-width:1px}.mce-sidebar-toolbar .mce-btn.mce-active,.mce-sidebar-toolbar .mce-btn.mce-active:hover{border:1px solid transparent;border-color:transparent;background-color:#2d8ac7}.mce-sidebar-toolbar .mce-btn.mce-active button,.mce-sidebar-toolbar .mce-btn.mce-active:hover button,.mce-sidebar-toolbar .mce-btn.mce-active button i,.mce-sidebar-toolbar .mce-btn.mce-active:hover button i{color:#fff;text-shadow:1px 1px none}.mce-sidebar-panel{border:0 solid rgba(0,0,0,0.2);border-left-width:1px}.mce-container,.mce-container-body{display:block}.mce-autoscroll{overflow:hidden}.mce-scrollbar{position:absolute;width:7px;height:100%;top:2px;right:2px;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-scrollbar-h{top:auto;right:auto;left:2px;bottom:2px;width:100%;height:7px}.mce-scrollbar-thumb{position:absolute;background-color:#000;border:1px solid #888;border-color:rgba(85,85,85,0.6);width:5px;height:100%}.mce-scrollbar-h .mce-scrollbar-thumb{width:100%;height:5px}.mce-scrollbar:hover,.mce-scrollbar.mce-active{background-color:#AAA;opacity:.6;filter:alpha(opacity=60);zoom:1}.mce-scroll{position:relative}.mce-panel{border:0 solid #cacaca;border:0 solid rgba(0,0,0,0.2);background-color:#f0f0f0}.mce-floatpanel{position:absolute}.mce-floatpanel.mce-fixed{position:fixed}.mce-floatpanel .mce-arrow,.mce-floatpanel .mce-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.mce-floatpanel .mce-arrow{border-width:11px}.mce-floatpanel .mce-arrow:after{border-width:10px;content:""}.mce-floatpanel.mce-popover{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;top:0;left:0;background:#FFF;border:1px solid rgba(0,0,0,0.2);border:1px solid rgba(0,0,0,0.25)}.mce-floatpanel.mce-popover.mce-bottom{margin-top:10px;*margin-top:0}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,0.2);border-bottom-color:rgba(0,0,0,0.25);top:-11px}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#FFF}.mce-floatpanel.mce-popover.mce-bottom.mce-start{margin-left:-22px}.mce-floatpanel.mce-popover.mce-bottom.mce-start>.mce-arrow{left:20px}.mce-floatpanel.mce-popover.mce-bottom.mce-end{margin-left:22px}.mce-floatpanel.mce-popover.mce-bottom.mce-end>.mce-arrow{right:10px;left:auto}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%}div.mce-fullscreen{position:fixed;top:0;left:0}#mce-modal-block{opacity:0;filter:alpha(opacity=0);zoom:1;position:fixed;left:0;top:0;width:100%;height:100%;background:#000}#mce-modal-block.mce-in{opacity:.3;filter:alpha(opacity=30);zoom:1}.mce-window-move{cursor:move}.mce-window{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;background:#FFF;position:fixed;top:0;left:0;opacity:0;transform:scale(.1);transition:transform 100ms ease-in,opacity 150ms ease-in}.mce-window.mce-in{transform:scale(1);opacity:1}.mce-window-head{padding:9px 15px;border-bottom:1px solid #c5c5c5;position:relative}.mce-window-head .mce-close{position:absolute;right:0;top:0;height:38px;width:38px;text-align:center;cursor:pointer}.mce-window-head .mce-close i{color:#858585}.mce-close:hover i{color:#adadad}.mce-window-head .mce-title{line-height:20px;font-size:20px;font-weight:bold;text-rendering:optimizelegibility;padding-right:20px}.mce-window .mce-container-body{display:block}.mce-foot{display:block;background-color:#FFF;border-top:1px solid #c5c5c5}.mce-window-head .mce-dragh{position:absolute;top:0;left:0;cursor:move;width:90%;height:100%}.mce-window iframe{width:100%;height:100%}.mce-window-body .mce-listbox{border-color:#ccc}.mce-rtl .mce-window-head .mce-close{position:absolute;right:auto;left:15px}.mce-rtl .mce-window-head .mce-dragh{left:auto;right:0}.mce-rtl .mce-window-head .mce-title{direction:rtl;text-align:right}.mce-tooltip{position:absolute;padding:5px;opacity:.8;filter:alpha(opacity=80);zoom:1}.mce-tooltip-inner{font-size:11px;background-color:#000;color:white;max-width:200px;padding:5px 8px 4px 8px;text-align:center;white-space:normal}.mce-tooltip-arrow{position:absolute;width:0;height:0;line-height:0;border:5px dashed #000}.mce-tooltip-arrow-n{border-bottom-color:#000}.mce-tooltip-arrow-s{border-top-color:#000}.mce-tooltip-arrow-e{border-left-color:#000}.mce-tooltip-arrow-w{border-right-color:#000}.mce-tooltip-nw,.mce-tooltip-sw{margin-left:-14px}.mce-tooltip-ne,.mce-tooltip-se{margin-left:14px}.mce-tooltip-n .mce-tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-nw .mce-tooltip-arrow{top:0;left:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-ne .mce-tooltip-arrow{top:0;right:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-s .mce-tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-sw .mce-tooltip-arrow{bottom:0;left:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-se .mce-tooltip-arrow{bottom:0;right:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-e .mce-tooltip-arrow{right:0;top:50%;margin-top:-5px;border-left-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent}.mce-tooltip-w .mce-tooltip-arrow{left:0;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent}.mce-progress{display:inline-block;position:relative;height:20px}.mce-progress .mce-bar-container{display:inline-block;width:100px;height:100%;margin-right:8px;border:1px solid #ccc;overflow:hidden}.mce-progress .mce-text{display:inline-block;margin-top:auto;margin-bottom:auto;font-size:14px;width:40px;color:#333}.mce-bar{display:block;width:0;height:100%;background-color:#d7d7d7;-webkit-transition:width .2s ease;transition:width .2s ease}.mce-notification{position:absolute;background-color:#F0F0F0;padding:5px;margin-top:5px;border-width:1px;border-style:solid;border-color:#CCCCCC;transition:transform 100ms ease-in,opacity 150ms ease-in;opacity:0}.mce-notification.mce-in{opacity:1}.mce-notification-success{background-color:#dff0d8;border-color:#d6e9c6}.mce-notification-info{background-color:#d9edf7;border-color:#779ECB}.mce-notification-warning{background-color:#fcf8e3;border-color:#faebcc}.mce-notification-error{background-color:#f2dede;border-color:#ebccd1}.mce-notification.mce-has-close{padding-right:15px}.mce-notification .mce-ico{margin-top:5px}.mce-notification-inner{display:inline-block;font-size:14px;margin:5px 8px 4px 8px;text-align:center;white-space:normal;color:#31708f}.mce-notification-inner a{text-decoration:underline;cursor:pointer}.mce-notification .mce-progress{margin-right:8px}.mce-notification .mce-progress .mce-text{margin-top:5px}.mce-notification *,.mce-notification .mce-progress .mce-text{color:#333333}.mce-notification .mce-progress .mce-bar-container{border-color:#CCCCCC}.mce-notification .mce-progress .mce-bar-container .mce-bar{background-color:#333333}.mce-notification-success *,.mce-notification-success .mce-progress .mce-text{color:#3c763d}.mce-notification-success .mce-progress .mce-bar-container{border-color:#d6e9c6}.mce-notification-success .mce-progress .mce-bar-container .mce-bar{background-color:#3c763d}.mce-notification-info *,.mce-notification-info .mce-progress .mce-text{color:#31708f}.mce-notification-info .mce-progress .mce-bar-container{border-color:#779ECB}.mce-notification-info .mce-progress .mce-bar-container .mce-bar{background-color:#31708f}.mce-notification-warning *,.mce-notification-warning .mce-progress .mce-text{color:#8a6d3b}.mce-notification-warning .mce-progress .mce-bar-container{border-color:#faebcc}.mce-notification-warning .mce-progress .mce-bar-container .mce-bar{background-color:#8a6d3b}.mce-notification-error *,.mce-notification-error .mce-progress .mce-text{color:#a94442}.mce-notification-error .mce-progress .mce-bar-container{border-color:#ebccd1}.mce-notification-error .mce-progress .mce-bar-container .mce-bar{background-color:#a94442}.mce-notification .mce-close{position:absolute;top:6px;right:8px;font-size:20px;font-weight:bold;line-height:20px;color:#858585;cursor:pointer;height:20px;overflow:hidden}.mce-abs-layout{position:relative}body .mce-abs-layout-item,.mce-abs-end{position:absolute}.mce-abs-end{width:1px;height:1px}.mce-container-body.mce-abs-layout{overflow:hidden}.mce-btn{border:1px solid #b1b1b1;border-color:transparent transparent transparent transparent;position:relative;text-shadow:0 1px 1px rgba(255,255,255,0.75);display:inline-block;*display:inline;*zoom:1;background-color:#f0f0f0}.mce-btn:hover,.mce-btn:focus{color:#333;background-color:#e3e3e3;border-color:#ccc}.mce-btn.mce-disabled button,.mce-btn.mce-disabled:hover button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-btn.mce-active,.mce-btn.mce-active:hover{background-color:#dbdbdb;border-color:#ccc}.mce-btn:active{background-color:#e0e0e0;border-color:#ccc}.mce-btn button{padding:4px 8px;font-size:14px;line-height:20px;*line-height:16px;cursor:pointer;color:#333;text-align:center;overflow:visible;-webkit-appearance:none}.mce-btn button::-moz-focus-inner{border:0;padding:0}.mce-btn i{text-shadow:1px 1px none}.mce-primary.mce-btn-has-text{min-width:50px}.mce-primary{color:#fff;border:1px solid transparent;border-color:transparent;background-color:#2d8ac7}.mce-primary:hover,.mce-primary:focus{background-color:#257cb6;border-color:transparent}.mce-primary.mce-disabled button,.mce-primary.mce-disabled:hover button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-primary.mce-active,.mce-primary.mce-active:hover,.mce-primary:not(.mce-disabled):active{background-color:#206ea1}.mce-primary button,.mce-primary button i{color:#fff;text-shadow:1px 1px none}.mce-btn .mce-txt{font-size:inherit;line-height:inherit;color:inherit}.mce-btn-large button{padding:9px 14px;font-size:16px;line-height:normal}.mce-btn-large i{margin-top:2px}.mce-btn-small button{padding:1px 5px;font-size:12px;*padding-bottom:2px}.mce-btn-small i{line-height:20px;vertical-align:top;*line-height:18px}.mce-btn .mce-caret{margin-top:8px;margin-left:0}.mce-btn-small .mce-caret{margin-top:8px;margin-left:0}.mce-caret{display:inline-block;*display:inline;*zoom:1;width:0;height:0;vertical-align:top;border-top:4px solid #333;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.mce-disabled .mce-caret{border-top-color:#aaa}.mce-caret.mce-up{border-bottom:4px solid #333;border-top:0}.mce-btn-flat{border:0;background:transparent;filter:none}.mce-btn-flat:hover,.mce-btn-flat.mce-active,.mce-btn-flat:focus,.mce-btn-flat:active{border:0;background:#e6e6e6;filter:none}.mce-btn-has-text .mce-ico{padding-right:5px}.mce-rtl .mce-btn button{direction:rtl}.mce-btn-group .mce-btn{border-width:1px;margin:0;margin-left:2px}.mce-btn-group:not(:first-child){border-left:1px solid #d9d9d9;padding-left:3px;margin-left:3px}.mce-btn-group .mce-first{margin-left:0}.mce-btn-group .mce-btn.mce-flow-layout-item{margin:0}.mce-rtl .mce-btn-group .mce-btn{margin-left:0;margin-right:2px}.mce-rtl .mce-btn-group .mce-first{margin-right:0}.mce-rtl .mce-btn-group:not(:first-child){border-left:none;border-right:1px solid #d9d9d9;padding-right:4px;margin-right:4px}.mce-checkbox{cursor:pointer}i.mce-i-checkbox{margin:0 3px 0 0;border:1px solid #c5c5c5;background-color:#f0f0f0;text-indent:-10em;*font-size:0;*line-height:0;*text-indent:0;overflow:hidden}.mce-checked i.mce-i-checkbox{color:#333;font-size:16px;line-height:16px;text-indent:0}.mce-checkbox:focus i.mce-i-checkbox,.mce-checkbox.mce-focus i.mce-i-checkbox{border:1px solid rgba(82,168,236,0.8)}.mce-checkbox.mce-disabled .mce-label,.mce-checkbox.mce-disabled i.mce-i-checkbox{color:#acacac}.mce-checkbox .mce-label{vertical-align:middle}.mce-rtl .mce-checkbox{direction:rtl;text-align:right}.mce-rtl i.mce-i-checkbox{margin:0 0 0 3px}.mce-combobox{position:relative;display:inline-block;*display:inline;*zoom:1;*height:32px}.mce-combobox input{border:1px solid #c5c5c5;border-right-color:#c5c5c5;height:28px}.mce-combobox.mce-disabled input{color:#adadad}.mce-combobox .mce-btn{border:1px solid #c5c5c5;border-left:0;margin:0}.mce-combobox button{padding-right:8px;padding-left:8px}.mce-combobox.mce-disabled .mce-btn button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-combobox .mce-status{position:absolute;right:2px;top:50%;line-height:16px;margin-top:-8px;font-size:12px;width:15px;height:15px;text-align:center;cursor:pointer}.mce-combobox.mce-has-status input{padding-right:20px}.mce-combobox.mce-has-open .mce-status{right:37px}.mce-combobox .mce-status.mce-i-warning{color:#c09853}.mce-combobox .mce-status.mce-i-checkmark{color:#468847}.mce-menu.mce-combobox-menu{border-top:0;margin-top:0;max-height:200px}.mce-menu.mce-combobox-menu .mce-menu-item{padding:4px 6px 4px 4px;font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-sep{padding:0}.mce-menu.mce-combobox-menu .mce-text{font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-link,.mce-menu.mce-combobox-menu .mce-menu-item-link b{font-size:11px}.mce-menu.mce-combobox-menu .mce-text b{font-size:11px}.mce-colorbox i{border:1px solid #c5c5c5;width:14px;height:14px}.mce-colorbutton .mce-ico{position:relative}.mce-colorbutton-grid{margin:4px}.mce-colorbutton button{padding-right:6px;padding-left:6px}.mce-colorbutton .mce-preview{padding-right:3px;display:block;position:absolute;left:50%;top:50%;margin-left:-17px;margin-top:7px;background:gray;width:13px;height:2px;overflow:hidden}.mce-colorbutton.mce-btn-small .mce-preview{margin-left:-16px;padding-right:0;width:16px}.mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:1px solid transparent}.mce-colorbutton:hover .mce-open{border-color:#ccc}.mce-colorbutton.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-colorbutton{direction:rtl}.mce-rtl .mce-colorbutton .mce-preview{margin-left:0;padding-right:0;padding-left:3px}.mce-rtl .mce-colorbutton.mce-btn-small .mce-preview{margin-left:0;padding-right:0;padding-left:2px}.mce-rtl .mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:0}.mce-colorpicker{position:relative;width:250px;height:220px}.mce-colorpicker-sv{position:absolute;top:0;left:0;width:90%;height:100%;border:1px solid #c5c5c5;cursor:crosshair;overflow:hidden}.mce-colorpicker-h-chunk{width:100%}.mce-colorpicker-overlay1,.mce-colorpicker-overlay2{width:100%;height:100%;position:absolute;top:0;left:0}.mce-colorpicker-overlay1{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr='#ffffff', endColorstr='#00ffffff');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr='#ffffff', endColorstr='#00ffffff')";background:linear-gradient(to right, #fff, rgba(255,255,255,0))}.mce-colorpicker-overlay2{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#00000000', endColorstr='#000000');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#00000000', endColorstr='#000000')";background:linear-gradient(to bottom, rgba(0,0,0,0), #000)}.mce-colorpicker-selector1{background:none;position:absolute;width:12px;height:12px;margin:-8px 0 0 -8px;border:1px solid black;border-radius:50%}.mce-colorpicker-selector2{position:absolute;width:10px;height:10px;border:1px solid white;border-radius:50%}.mce-colorpicker-h{position:absolute;top:0;right:0;width:6.5%;height:100%;border:1px solid #c5c5c5;cursor:crosshair}.mce-colorpicker-h-marker{margin-top:-4px;position:absolute;top:0;left:-1px;width:100%;border:1px solid #333;background:#fff;height:4px;z-index:100}.mce-path{display:inline-block;*display:inline;*zoom:1;padding:8px;white-space:normal}.mce-path .mce-txt{display:inline-block;padding-right:3px}.mce-path .mce-path-body{display:inline-block}.mce-path-item{display:inline-block;*display:inline;*zoom:1;cursor:pointer;color:#333}.mce-path-item:hover{text-decoration:underline}.mce-path-item:focus{background:#666;color:#fff}.mce-path .mce-divider{display:inline}.mce-disabled .mce-path-item{color:#aaa}.mce-rtl .mce-path{direction:rtl}.mce-fieldset{border:0 solid #9E9E9E}.mce-fieldset>.mce-container-body{margin-top:-15px}.mce-fieldset-title{margin-left:5px;padding:0 5px 0 5px}.mce-fit-layout{display:inline-block;*display:inline;*zoom:1}.mce-fit-layout-item{position:absolute}.mce-flow-layout-item{display:inline-block;*display:inline;*zoom:1}.mce-flow-layout-item{margin:2px 0 2px 2px}.mce-flow-layout-item.mce-last{margin-right:2px}.mce-flow-layout{white-space:normal}.mce-tinymce-inline .mce-flow-layout{white-space:nowrap}.mce-rtl .mce-flow-layout{text-align:right;direction:rtl}.mce-rtl .mce-flow-layout-item{margin:2px 2px 2px 0}.mce-rtl .mce-flow-layout-item.mce-last{margin-left:2px}.mce-iframe{border:0 solid rgba(0,0,0,0.2);width:100%;height:100%}.mce-infobox{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden;border:1px solid red}.mce-infobox div{display:block;margin:5px}.mce-infobox div button{position:absolute;top:50%;right:4px;cursor:pointer;margin-top:-8px;display:none}.mce-infobox div button:focus{outline:2px solid #ccc}.mce-infobox.mce-has-help div{margin-right:25px}.mce-infobox.mce-has-help button{display:block}.mce-infobox.mce-success{background:#dff0d8;border-color:#d6e9c6}.mce-infobox.mce-success div{color:#3c763d}.mce-infobox.mce-warning{background:#fcf8e3;border-color:#faebcc}.mce-infobox.mce-warning div{color:#8a6d3b}.mce-infobox.mce-error{background:#f2dede;border-color:#ebccd1}.mce-infobox.mce-error div{color:#a94442}.mce-rtl .mce-infobox div{text-align:right;direction:rtl}.mce-label{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden}.mce-label.mce-autoscroll{overflow:auto}.mce-label.mce-disabled{color:#aaa}.mce-label.mce-multiline{white-space:pre-wrap}.mce-label.mce-success{color:#468847}.mce-label.mce-warning{color:#c09853}.mce-label.mce-error{color:#b94a48}.mce-rtl .mce-label{text-align:right;direction:rtl}.mce-menubar .mce-menubtn{border-color:transparent;background:transparent;filter:none}.mce-menubar .mce-menubtn button{color:#333}.mce-menubar{border:1px solid rgba(217,217,217,0.52)}.mce-menubar .mce-menubtn button span{color:#333}.mce-menubar .mce-caret{border-top-color:#333}.mce-menubar .mce-menubtn:hover,.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus{border-color:#ccc;background:#fff;filter:none}.mce-menubtn button{color:#333}.mce-menubtn.mce-btn-small span{font-size:12px}.mce-menubtn.mce-fixed-width span{display:inline-block;overflow-x:hidden;text-overflow:ellipsis;width:90px}.mce-menubtn.mce-fixed-width.mce-btn-small span{width:70px}.mce-menubtn .mce-caret{*margin-top:6px}.mce-rtl .mce-menubtn button{direction:rtl;text-align:right}.mce-menu-item{display:block;padding:6px 15px 6px 12px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap;cursor:pointer;line-height:normal;border-left:4px solid transparent;margin-bottom:1px}.mce-menu-item .mce-ico,.mce-menu-item .mce-text{color:#333}.mce-menu-item.mce-disabled .mce-text,.mce-menu-item.mce-disabled .mce-ico{color:#adadad}.mce-menu-item:hover .mce-text,.mce-menu-item.mce-selected .mce-text,.mce-menu-item:focus .mce-text{color:white}.mce-menu-item:hover .mce-ico,.mce-menu-item.mce-selected .mce-ico,.mce-menu-item:focus .mce-ico{color:white}.mce-menu-item.mce-disabled:hover{background:#CCC}.mce-menu-shortcut{display:inline-block;color:#adadad}.mce-menu-shortcut{display:inline-block;*display:inline;*zoom:1;padding:0 15px 0 20px}.mce-menu-item:hover .mce-menu-shortcut,.mce-menu-item.mce-selected .mce-menu-shortcut,.mce-menu-item:focus .mce-menu-shortcut{color:white}.mce-menu-item .mce-caret{margin-top:4px;*margin-top:3px;margin-right:6px;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid #333}.mce-menu-item.mce-selected .mce-caret,.mce-menu-item:focus .mce-caret,.mce-menu-item:hover .mce-caret{border-left-color:white}.mce-menu-align .mce-menu-shortcut{*margin-top:-2px}.mce-menu-align .mce-menu-shortcut,.mce-menu-align .mce-caret{position:absolute;right:0}.mce-menu-item.mce-active i{visibility:visible}.mce-menu-item-normal.mce-active{background-color:#3498db}.mce-menu-item-preview.mce-active{border-left:5px solid #aaa}.mce-menu-item-normal.mce-active .mce-text{color:white}.mce-menu-item-normal.mce-active:hover .mce-text,.mce-menu-item-normal.mce-active:hover .mce-ico{color:white}.mce-menu-item-normal.mce-active:focus .mce-text,.mce-menu-item-normal.mce-active:focus .mce-ico{color:white}.mce-menu-item:hover,.mce-menu-item.mce-selected,.mce-menu-item:focus{text-decoration:none;color:white;background-color:#2d8ac7}.mce-menu-item-link{color:#093;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mce-menu-item-link b{color:#093}.mce-menu-item-ellipsis{display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mce-menu-item:hover *,.mce-menu-item.mce-selected *,.mce-menu-item:focus *{color:white}div.mce-menu .mce-menu-item-sep,.mce-menu-item-sep:hover{border:0;padding:0;height:1px;margin:9px 1px;overflow:hidden;background:transparent;border-bottom:1px solid rgba(0,0,0,0.1);cursor:default;filter:none}div.mce-menu .mce-menu-item b{font-weight:bold}.mce-menu-item-indent-1{padding-left:20px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-3{padding-left:40px}.mce-menu-item-indent-4{padding-left:45px}.mce-menu-item-indent-5{padding-left:50px}.mce-menu-item-indent-6{padding-left:55px}.mce-menu.mce-rtl{direction:rtl}.mce-rtl .mce-menu-item{text-align:right;direction:rtl;padding:6px 12px 6px 15px}.mce-menu-align.mce-rtl .mce-menu-shortcut,.mce-menu-align.mce-rtl .mce-caret{right:auto;left:0}.mce-rtl .mce-menu-item .mce-caret{margin-left:6px;margin-right:0;border-right:4px solid #333;border-left:0}.mce-rtl .mce-menu-item.mce-selected .mce-caret,.mce-rtl .mce-menu-item:focus .mce-caret,.mce-rtl .mce-menu-item:hover .mce-caret{border-left-color:transparent;border-right-color:white}.mce-throbber{position:absolute;top:0;left:0;width:100%;height:100%;opacity:.6;filter:alpha(opacity=60);zoom:1;background:#fff url('img/loader.gif') no-repeat center center}.mce-throbber-inline{position:static;height:50px}.mce-menu .mce-throbber-inline{height:25px;background-size:contain}.mce-menu{position:absolute;left:0;top:0;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;z-index:1000;padding:5px 0 5px 0;margin:-1px 0 0;min-width:160px;background:#fff;border:1px solid #989898;border:1px solid rgba(0,0,0,0.2);z-index:1002;max-height:400px;overflow:auto;overflow-x:hidden}.mce-menu i{display:none}.mce-menu-has-icons i{display:inline-block;*display:inline}.mce-menu-sub-tr-tl{margin:-6px 0 0 -1px}.mce-menu-sub-br-bl{margin:6px 0 0 -1px}.mce-menu-sub-tl-tr{margin:-6px 0 0 1px}.mce-menu-sub-bl-br{margin:6px 0 0 1px}.mce-listbox button{text-align:left;padding-right:20px;position:relative}.mce-listbox .mce-caret{position:absolute;margin-top:-2px;right:8px;top:50%}.mce-rtl .mce-listbox .mce-caret{right:auto;left:8px}.mce-rtl .mce-listbox button{padding-right:10px;padding-left:20px}.mce-container-body .mce-resizehandle{position:absolute;right:0;bottom:0;width:16px;height:16px;visibility:visible;cursor:s-resize;margin:0}.mce-container-body .mce-resizehandle-both{cursor:se-resize}i.mce-i-resize{color:#333}.mce-selectbox{background:#fff;border:1px solid #c5c5c5}.mce-slider{border:1px solid #AAA;background:#EEE;width:100px;height:10px;position:relative;display:block}.mce-slider.mce-vertical{width:10px;height:100px}.mce-slider-handle{border:1px solid #BBB;background:#DDD;display:block;width:13px;height:13px;position:absolute;top:0;left:0;margin-left:-1px;margin-top:-2px}.mce-slider-handle:focus{background:#BBB}.mce-spacer{visibility:hidden}.mce-splitbtn .mce-open{border-left:1px solid transparent}.mce-splitbtn:hover .mce-open{border-left-color:#ccc}.mce-splitbtn button{padding-right:6px;padding-left:6px}.mce-splitbtn .mce-open{padding-right:4px;padding-left:4px}.mce-splitbtn .mce-open.mce-active{background-color:#dbdbdb;outline:1px solid #ccc}.mce-splitbtn.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-splitbtn{direction:rtl;text-align:right}.mce-rtl .mce-splitbtn button{padding-right:4px;padding-left:4px}.mce-rtl .mce-splitbtn .mce-open{border-left:0}.mce-stack-layout-item{display:block}.mce-tabs{display:block;border-bottom:1px solid #c5c5c5}.mce-tabs,.mce-tabs+.mce-container-body{background:#FFF}.mce-tab{display:inline-block;*display:inline;*zoom:1;border:1px solid #c5c5c5;border-width:0 1px 0 0;background:#ffffff;padding:8px;text-shadow:0 1px 1px rgba(255,255,255,0.75);height:13px;cursor:pointer}.mce-tab:hover{background:#FDFDFD}.mce-tab.mce-active{background:#FDFDFD;border-bottom-color:transparent;margin-bottom:-1px;height:14px}.mce-rtl .mce-tabs{text-align:right;direction:rtl}.mce-rtl .mce-tab{border-width:0 0 0 1px}.mce-textbox{background:#fff;border:1px solid #c5c5c5;display:inline-block;-webkit-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;height:28px;resize:none;padding:0 4px 0 4px;white-space:pre-wrap;*white-space:pre;color:#333}.mce-textbox:focus,.mce-textbox.mce-focus{border-color:#3498db}.mce-placeholder .mce-textbox{color:#aaa}.mce-textbox.mce-multiline{padding:4px;height:auto}.mce-textbox.mce-disabled{color:#adadad}.mce-rtl .mce-textbox{text-align:right;direction:rtl}.mce-dropzone{border:3px dashed gray;text-align:center}.mce-dropzone span{color:gray;text-transform:uppercase;font-family:Verdana;display:inline-block;vertical-align:middle}.mce-dropzone:after{content:"";height:100%;display:inline-block;vertical-align:middle}.mce-dropzone.mce-disabled{opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-dropzone.mce-disabled.mce-dragenter{cursor:not-allowed}.mce-browsebutton{position:relative;overflow:hidden}.mce-browsebutton button{position:relative;z-index:1}.mce-browsebutton input{opacity:0;filter:alpha(opacity=0);zoom:1;position:absolute;top:0;left:0;width:100%;height:100%;z-index:0}@font-face{font-family:'tinymce';src:url('fonts/tinymce.eot');src:url('fonts/tinymce.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce.woff') format('woff'),url('fonts/tinymce.ttf') format('truetype'),url('fonts/tinymce.svg#tinymce') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'tinymce-small';src:url('fonts/tinymce-small.eot');src:url('fonts/tinymce-small.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce-small.woff') format('woff'),url('fonts/tinymce-small.ttf') format('truetype'),url('fonts/tinymce-small.svg#tinymce') format('svg');font-weight:normal;font-style:normal}.mce-ico{font-family:'tinymce',Arial;font-style:normal;font-weight:normal;font-variant:normal;font-size:16px;line-height:16px;speak:none;vertical-align:text-top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;background:transparent center center;background-size:cover;width:16px;height:16px;color:#333}.mce-btn-small .mce-ico{font-family:'tinymce-small',Arial}.mce-i-save:before{content:"\e000"}.mce-i-newdocument:before{content:"\e001"}.mce-i-fullpage:before{content:"\e002"}.mce-i-alignleft:before{content:"\e003"}.mce-i-aligncenter:before{content:"\e004"}.mce-i-alignright:before{content:"\e005"}.mce-i-alignjustify:before{content:"\e006"}.mce-i-alignnone:before{content:"\e003"}.mce-i-cut:before{content:"\e007"}.mce-i-paste:before{content:"\e008"}.mce-i-searchreplace:before{content:"\e009"}.mce-i-bullist:before{content:"\e00a"}.mce-i-numlist:before{content:"\e00b"}.mce-i-indent:before{content:"\e00c"}.mce-i-outdent:before{content:"\e00d"}.mce-i-blockquote:before{content:"\e00e"}.mce-i-undo:before{content:"\e00f"}.mce-i-redo:before{content:"\e010"}.mce-i-link:before{content:"\e011"}.mce-i-unlink:before{content:"\e012"}.mce-i-anchor:before{content:"\e013"}.mce-i-image:before{content:"\e014"}.mce-i-media:before{content:"\e015"}.mce-i-help:before{content:"\e016"}.mce-i-code:before{content:"\e017"}.mce-i-insertdatetime:before{content:"\e018"}.mce-i-preview:before{content:"\e019"}.mce-i-forecolor:before{content:"\e01a"}.mce-i-backcolor:before{content:"\e01a"}.mce-i-table:before{content:"\e01b"}.mce-i-hr:before{content:"\e01c"}.mce-i-removeformat:before{content:"\e01d"}.mce-i-subscript:before{content:"\e01e"}.mce-i-superscript:before{content:"\e01f"}.mce-i-charmap:before{content:"\e020"}.mce-i-emoticons:before{content:"\e021"}.mce-i-print:before{content:"\e022"}.mce-i-fullscreen:before{content:"\e023"}.mce-i-spellchecker:before{content:"\e024"}.mce-i-nonbreaking:before{content:"\e025"}.mce-i-template:before{content:"\e026"}.mce-i-pagebreak:before{content:"\e027"}.mce-i-restoredraft:before{content:"\e028"}.mce-i-bold:before{content:"\e02a"}.mce-i-italic:before{content:"\e02b"}.mce-i-underline:before{content:"\e02c"}.mce-i-strikethrough:before{content:"\e02d"}.mce-i-visualchars:before{content:"\e02e"}.mce-i-visualblocks:before{content:"\e02e"}.mce-i-ltr:before{content:"\e02f"}.mce-i-rtl:before{content:"\e030"}.mce-i-copy:before{content:"\e031"}.mce-i-resize:before{content:"\e032"}.mce-i-browse:before{content:"\e034"}.mce-i-pastetext:before{content:"\e035"}.mce-i-rotateleft:before{content:"\eaa8"}.mce-i-rotateright:before{content:"\eaa9"}.mce-i-crop:before{content:"\ee78"}.mce-i-editimage:before{content:"\e915"}.mce-i-options:before{content:"\ec6a"}.mce-i-flipv:before{content:"\eaaa"}.mce-i-fliph:before{content:"\eaac"}.mce-i-zoomin:before{content:"\eb35"}.mce-i-zoomout:before{content:"\eb36"}.mce-i-sun:before{content:"\eccc"}.mce-i-moon:before{content:"\eccd"}.mce-i-arrowleft:before{content:"\edc0"}.mce-i-arrowright:before{content:"\e93c"}.mce-i-drop:before{content:"\e935"}.mce-i-contrast:before{content:"\ecd4"}.mce-i-sharpen:before{content:"\eba7"}.mce-i-resize2:before{content:"\edf9"}.mce-i-orientation:before{content:"\e601"}.mce-i-invert:before{content:"\e602"}.mce-i-gamma:before{content:"\e600"}.mce-i-remove:before{content:"\ed6a"}.mce-i-tablerowprops:before{content:"\e604"}.mce-i-tablecellprops:before{content:"\e605"}.mce-i-table2:before{content:"\e606"}.mce-i-tablemergecells:before{content:"\e607"}.mce-i-tableinsertcolbefore:before{content:"\e608"}.mce-i-tableinsertcolafter:before{content:"\e609"}.mce-i-tableinsertrowbefore:before{content:"\e60a"}.mce-i-tableinsertrowafter:before{content:"\e60b"}.mce-i-tablesplitcells:before{content:"\e60d"}.mce-i-tabledelete:before{content:"\e60e"}.mce-i-tableleftheader:before{content:"\e62a"}.mce-i-tabletopheader:before{content:"\e62b"}.mce-i-tabledeleterow:before{content:"\e800"}.mce-i-tabledeletecol:before{content:"\e801"}.mce-i-codesample:before{content:"\e603"}.mce-i-fill:before{content:"\e902"}.mce-i-borderwidth:before{content:"\e903"}.mce-i-line:before{content:"\e904"}.mce-i-count:before{content:"\e905"}.mce-i-translate:before{content:"\e907"}.mce-i-drag:before{content:"\e908"}.mce-i-home:before{content:"\e90b"}.mce-i-upload:before{content:"\e914"}.mce-i-bubble:before{content:"\e91c"}.mce-i-user:before{content:"\e91d"}.mce-i-lock:before{content:"\e926"}.mce-i-unlock:before{content:"\e927"}.mce-i-settings:before{content:"\e928"}.mce-i-remove2:before{content:"\e92a"}.mce-i-menu:before{content:"\e92d"}.mce-i-warning:before{content:"\e930"}.mce-i-question:before{content:"\e931"}.mce-i-pluscircle:before{content:"\e932"}.mce-i-info:before{content:"\e933"}.mce-i-notice:before{content:"\e934"}.mce-i-arrowup:before{content:"\e93b"}.mce-i-arrowdown:before{content:"\e93d"}.mce-i-arrowup2:before{content:"\e93f"}.mce-i-arrowdown2:before{content:"\e940"}.mce-i-menu2:before{content:"\e941"}.mce-i-newtab:before{content:"\e961"}.mce-i-a11y:before{content:"\e900"}.mce-i-plus:before{content:"\e93a"}.mce-i-insert:before{content:"\e93a"}.mce-i-minus:before{content:"\e939"}.mce-i-books:before{content:"\e911"}.mce-i-reload:before{content:"\e906"}.mce-i-toc:before{content:"\e901"}.mce-i-checkmark:before{content:"\e033"}.mce-i-checkbox:before,.mce-i-selected:before{content:"\e033"}.mce-i-insert{font-size:14px}.mce-i-selected{visibility:hidden}i.mce-i-backcolor{text-shadow:none;background:#BBB} -/* Grappelli fix*/ -.mce-container button:hover{ - border: 0 !important; - background-color: transparent !important; -} diff --git a/cs4teachers/static/tinymce/themes/modern/theme.min.js b/cs4teachers/static/tinymce/themes/modern/theme.min.js deleted file mode 100644 index 524b421e8..000000000 --- a/cs4teachers/static/tinymce/themes/modern/theme.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i=0;c--)for(d=f.length-1;d>=0;d--)if(f[d].predicate(e[c]))return{toolbar:f[d],element:e[c]};return null};a.on("click keyup setContent ObjectResized",function(b){("setcontent"!==b.type||b.selection)&&c.setEditorTimeout(a,function(){var b;b=u(a.selection.getNode()),b?(t(),s(b)):t()})}),a.on("blur hide contextmenu",t),a.on("ObjectResizeStart",function(){var b=u(a.selection.getNode());b&&b.toolbar.panel&&b.toolbar.panel.hide()}),a.on("ResizeEditor ResizeWindow",q(!0)),a.on("nodeChange",q(!1)),a.on("remove",function(){b.each(n(),function(a){a.panel&&a.panel.remove()}),a.contextToolbars={}}),a.shortcuts.add("ctrl+shift+e > ctrl+shift+p","",function(){var b=u(a.selection.getNode());b&&b.toolbar.panel&&b.toolbar.panel.items()[0].focus()})};return{addContextualToolbars:m}}),g("h",["d"],function(a){var b={file:{title:"File",items:"newdocument"},edit:{title:"Edit",items:"undo redo | cut copy paste pastetext | selectall"},insert:{title:"Insert",items:"|"},view:{title:"View",items:"visualaid |"},format:{title:"Format",items:"bold italic underline strikethrough superscript subscript | formats | removeformat"},table:{title:"Table"},tools:{title:"Tools"}},c=function(a,b){var c;return"|"==b?{text:"|"}:c=a[b]},d=function(d,e,f){var g,h,i,j,k;if(k=a.makeMap((e.removed_menuitems||"").split(/[ ,]/)),e.menu?(h=e.menu[f],j=!0):h=b[f],h){g={text:h.title},i=[],a.each((h.items||"").split(/[ ,]/),function(a){var b=c(d,a);b&&!k[a]&&i.push(c(d,a))}),j||a.each(d,function(a){a.context==f&&("before"==a.separator&&i.push({text:"|"}),a.prependToContext?i.unshift(a):i.push(a),"after"==a.separator&&i.push({text:"|"}))});for(var l=0;l=11},k=function(a){return!(!j()||!a.sidebars)&&a.sidebars.length>0},l=function(b){var c=a.map(b.sidebars,function(a){var c=a.settings;return{type:"button",icon:c.icon,image:c.image,tooltip:c.tooltip,onclick:i(b,a.name,b.sidebars)}});return{type:"panel",name:"sidebar",layout:"stack",classes:"sidebar",items:[{type:"toolbar",layout:"stack",classes:"sidebar-toolbar",items:c}]}};return{hasSidebar:k,createSidebar:l}}),g("j",[],function(){var a=function(a){var b=function(){a._skinLoaded=!0,a.fire("SkinLoaded")};return function(){a.initialized?b():a.on("init",b)}};return{fireSkinLoaded:a}}),g("6",["b","c","d","e","f","g","h","9","i","j","k"],function(a,b,c,d,e,f,g,h,i,j,k){var l=a.DOM,m=function(a){return function(b){a.find("*").disabled("readonly"===b.mode)}},n=function(a){return{type:"panel",name:"iframe",layout:"stack",classes:"edit-area",border:a,html:""}},o=function(a){return{type:"panel",layout:"stack",classes:"edit-aria-container",border:"1 0 0 0",items:[n("0"),i.createSidebar(a)]}},p=function(a,c,p){var q,r,s,t=a.settings;return p.skinUiCss&&l.styleSheetLoader.load(p.skinUiCss,j.fireSkinLoaded(a)),q=c.panel=b.create({type:"panel",role:"application",classes:"tinymce",style:"visibility: hidden",layout:"stack",border:1,items:[t.menubar===!1?null:{type:"menubar",border:"0 0 1 0",items:g.createMenuButtons(a)},k.createToolbars(a,t.toolbar_items_size),i.hasSidebar(a)?o(a):n("1 0 0 0")]}),t.resize!==!1&&(r={type:"resizehandle",direction:t.resize,onResizeStart:function(){var b=a.getContentAreaContainer().firstChild;s={width:b.clientWidth,height:b.clientHeight}},onResize:function(b){"both"===t.resize?h.resizeTo(a,s.width+b.deltaX,s.height+b.deltaY):h.resizeTo(a,null,s.height+b.deltaY)}}),t.statusbar!==!1&&q.add({type:"panel",name:"statusbar",classes:"statusbar",layout:"flow",border:"1 0 0 0",ariaRoot:!0,items:[{type:"elementpath",editor:a},r]}),a.fire("BeforeRenderUI"),a.on("SwitchMode",m(q)),q.renderBefore(p.targetNode).reflow(),t.readonly&&a.setMode("readonly"),p.width&&l.setStyle(q.getEl(),"width",p.width),a.on("remove",function(){q.remove(),q=null}),d.addKeys(a,q),f.addContextualToolbars(a),e.setup(a),{iframeContainer:q.find("#iframe")[0].getEl(),editorContainer:q.getEl()}};return{render:p}}),g("l",["a"],function(a){return a("tinymce.ui.FloatPanel")}),g("7",["d","c","b","l","k","h","g","e","j"],function(a,b,c,d,e,f,g,h,i){var j=function(a,j,k){var l,m,n=a.settings,o=c.DOM;n.fixed_toolbar_container&&(m=o.select(n.fixed_toolbar_container)[0]);var p=function(){if(l&&l.moveRel&&l.visible()&&!l._fixed){var b=a.selection.getScrollContainer(),c=a.getBody(),d=0,e=0;if(b){var f=o.getPos(c),g=o.getPos(b);d=Math.max(0,g.x-f.x),e=Math.max(0,g.y-f.y)}l.fixed(!1).moveRel(c,a.rtl?["tr-br","br-tr"]:["tl-bl","bl-tl","tr-br"]).moveBy(d,e)}},q=function(){l&&(l.show(),p(),o.addClass(a.getBody(),"mce-edit-focus"))},r=function(){l&&(l.hide(),d.hideAll(),o.removeClass(a.getBody(),"mce-edit-focus"))},s=function(){return l?void(l.visible()||q()):(l=j.panel=b.create({type:m?"panel":"floatpanel",role:"application",classes:"tinymce tinymce-inline",layout:"flex",direction:"column",align:"stretch",autohide:!1,autofix:!0,fixed:!!m,border:1,items:[n.menubar===!1?null:{type:"menubar",border:"0 0 1 0",items:f.createMenuButtons(a)},e.createToolbars(a,n.toolbar_items_size)]}),a.fire("BeforeRenderUI"),l.renderTo(m||document.body).reflow(),h.addKeys(a,l),q(),g.addContextualToolbars(a),a.on("nodeChange",p),a.on("activate",q),a.on("deactivate",r),void a.nodeChanged())};return n.content_editable=!0,a.on("focus",function(){k.skinUiCss?o.styleSheetLoader.load(k.skinUiCss,s,s):s()}),a.on("blur hide",r),a.on("remove",function(){l&&(l.remove(),l=null)}),k.skinUiCss&&o.styleSheetLoader.load(k.skinUiCss,i.fireSkinLoaded(a)),{}};return{render:j}}),g("m",["a"],function(a){return a("tinymce.ui.Throbber")}),g("8",["m"],function(a){var b=function(b,c){var d;b.on("ProgressState",function(b){d=d||new a(c.panel.getEl("body")),b.state?d.show(b.time):d.hide()})};return{setup:b}}),g("0",["1","2","3","4","5","6","7","8","9"],function(a,b,c,d,e,f,g,h,i){var j=b.ThemeManager;e.appendTo(a.tinymce?a.tinymce:{});var k=function(a,b,d){var e=a.settings,i=e.skin!==!1&&(e.skin||"lightgray");if(i){var j=e.skin_url;j=j?a.documentBaseURI.toAbsolute(j):c.baseURL+"/skins/"+i,d.skinUiCss=j+"/skin.min.css",a.contentCSS.push(j+"/content"+(a.inline?".inline":"")+".min.css")}return h.setup(a,b),e.inline?g.render(a,b,d):f.render(a,b,d)};return j.add("modern",function(a){return{renderUI:function(b){return k(a,this,b)},resizeTo:function(b,c){return i.resizeTo(a,b,c)},resizeBy:function(b,c){return i.resizeBy(a,b,c)}}}),function(){}}),d("0")()}(); \ No newline at end of file diff --git a/cs4teachers/static/tinymce/tinymce.min.js b/cs4teachers/static/tinymce/tinymce.min.js deleted file mode 100644 index 7f314593d..000000000 --- a/cs4teachers/static/tinymce/tinymce.min.js +++ /dev/null @@ -1,16 +0,0 @@ -// 4.6.5 (2017-08-02) -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i=534;return{opera:b,webkit:c,ie:d,gecko:g,mac:h,iOS:i,android:j,contentEditable:q,transparentSrc:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",caretAfter:8!=d,range:window.getSelection&&"Range"in window,documentMode:d&&!f?document.documentMode||7:10,fileApi:k,ceFalse:d===!1||d>8,canHaveCSP:d===!1||d>11,desktop:!l&&!m,windowsPhone:n}}),g("a",["8","9"],function(a,b){"use strict";function c(a,b,c,d){a.addEventListener?a.addEventListener(b,c,d||!1):a.attachEvent&&a.attachEvent("on"+b,c)}function d(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,d||!1):a.detachEvent&&a.detachEvent("on"+b,c)}function e(a,b){var c,d=b;return c=a.path,c&&c.length>0&&(d=c[0]),a.deepPath&&(c=a.deepPath(),c&&c.length>0&&(d=c[0])),d}function f(a,c){var d,f,g=c||{};for(d in a)k[d]||(g[d]=a[d]);if(g.target||(g.target=g.srcElement||document),b.experimentalShadowDom&&(g.target=e(a,g.target)),a&&j.test(a.type)&&a.pageX===f&&a.clientX!==f){var h=g.target.ownerDocument||document,i=h.documentElement,o=h.body;g.pageX=a.clientX+(i&&i.scrollLeft||o&&o.scrollLeft||0)-(i&&i.clientLeft||o&&o.clientLeft||0),g.pageY=a.clientY+(i&&i.scrollTop||o&&o.scrollTop||0)-(i&&i.clientTop||o&&o.clientTop||0)}return g.preventDefault=function(){g.isDefaultPrevented=n,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},g.stopPropagation=function(){g.isPropagationStopped=n,a&&(a.stopPropagation?a.stopPropagation():a.cancelBubble=!0)},g.stopImmediatePropagation=function(){g.isImmediatePropagationStopped=n,g.stopPropagation()},l(g)===!1&&(g.isDefaultPrevented=m,g.isPropagationStopped=m,g.isImmediatePropagationStopped=m),"undefined"==typeof g.metaKey&&(g.metaKey=!1),g}function g(e,f,g){function h(){return"complete"===l.readyState||"interactive"===l.readyState&&l.body}function i(){g.domLoaded||(g.domLoaded=!0,f(m))}function j(){h()&&(d(l,"readystatechange",j),i())}function k(){try{l.documentElement.doScroll("left")}catch(b){return void a.setTimeout(k)}i()}var l=e.document,m={type:"ready"};return g.domLoaded?void f(m):(!l.addEventListener||b.ie&&b.ie<11?(c(l,"readystatechange",j),l.documentElement.doScroll&&e.self===e.top&&k()):h()?i():c(e,"DOMContentLoaded",i),void c(e,"load",i))}function h(){function a(a,b){var c,d,e,f,g=m[b];if(c=g&&g[a.type])for(d=0,e=c.length;dt.cacheLength&&delete a[b.shift()],a[c+" "]=d}var b=[];return a}function c(a){return a[K]=!0,a}function d(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||T)-(~a.sourceIndex||T);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function e(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function f(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function g(a){return c(function(b){return b=+b,c(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function h(a){return a&&typeof a.getElementsByTagName!==S&&a}function i(){}function j(a){for(var b=0,c=a.length,d="";b1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function m(b,c,d){for(var e=0,f=c.length;e-1&&(c[j]=!(g[j]=l))}}else t=n(t===g?t.splice(q,t.length):t),f?f(null,g,t,i):Y.apply(g,t)})}function p(a){for(var b,c,d,e=a.length,f=t.relative[a[0].type],g=f||t.relative[" "],h=f?1:0,i=k(function(a){return a===b},g,!0),m=k(function(a){return $.call(b,a)>-1},g,!0),n=[function(a,c,d){return!f&&(d||c!==z)||((b=c).nodeType?i(a,c,d):m(a,c,d))}];h1&&l(n),h>1&&j(a.slice(0,h-1).concat({value:" "===a[h-2].type?"*":""})).replace(ea,"$1"),c,h0,f=b.length>0,g=function(c,g,h,i,j){var k,l,m,o=0,p="0",q=c&&[],r=[],s=z,u=c||f&&t.find.TAG("*",j),v=M+=null==s?1:Math.random()||.1,w=u.length;for(j&&(z=g!==D&&g);p!==w&&null!=(k=u[p]);p++){if(f&&k){for(l=0;m=b[l++];)if(m(k,g,h)){i.push(k);break}j&&(M=v)}e&&((k=!m&&k)&&o--,c&&q.push(k))}if(o+=p,e&&p!==o){for(l=0;m=d[l++];)m(q,r,g,h);if(c){if(o>0)for(;p--;)q[p]||r[p]||(r[p]=W.call(i));r=n(r)}Y.apply(i,r),j&&!c&&r.length>0&&o+d.length>1&&a.uniqueSort(i)}return j&&(M=v,z=s),q};return e?c(g):g}var r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K="sizzle"+-new Date,L=window.document,M=0,N=0,O=b(),P=b(),Q=b(),R=function(a,b){return a===b&&(B=!0),0},S="undefined",T=1<<31,U={}.hasOwnProperty,V=[],W=V.pop,X=V.push,Y=V.push,Z=V.slice,$=V.indexOf||function(a){for(var b=0,c=this.length;b+~]|"+aa+")"+aa+"*"),ha=new RegExp("="+aa+"*([^\\]'\"]*?)"+aa+"*\\]","g"),ia=new RegExp(da),ja=new RegExp("^"+ba+"$"),ka={ID:new RegExp("^#("+ba+")"),CLASS:new RegExp("^\\.("+ba+")"),TAG:new RegExp("^("+ba+"|[*])"),ATTR:new RegExp("^"+ca),PSEUDO:new RegExp("^"+da),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+aa+"*(even|odd|(([+-]|)(\\d*)n|)"+aa+"*(?:([+-]|)"+aa+"*(\\d+)|))"+aa+"*\\)|)","i"),bool:new RegExp("^(?:"+_+")$","i"),needsContext:new RegExp("^"+aa+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+aa+"*((?:-\\d)?\\d*)"+aa+"*\\)|)(?=[^-]|$)","i")},la=/^(?:input|select|textarea|button)$/i,ma=/^h\d$/i,na=/^[^{]+\{\s*\[native \w/,oa=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,pa=/[+~]/,qa=/'|\\/g,ra=new RegExp("\\\\([\\da-f]{1,6}"+aa+"?|("+aa+")|.)","ig"),sa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{Y.apply(V=Z.call(L.childNodes),L.childNodes),V[L.childNodes.length].nodeType}catch(a){Y={apply:V.length?function(a,b){X.apply(a,Z.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}s=a.support={},v=a.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},C=a.setDocument=function(a){function b(a){try{return a.top}catch(a){}return null}var c,e=a?a.ownerDocument||a:L,f=e.defaultView;return e!==D&&9===e.nodeType&&e.documentElement?(D=e,E=e.documentElement,F=!v(e),f&&f!==b(f)&&(f.addEventListener?f.addEventListener("unload",function(){C()},!1):f.attachEvent&&f.attachEvent("onunload",function(){C()})),s.attributes=!0,s.getElementsByTagName=!0,s.getElementsByClassName=na.test(e.getElementsByClassName),s.getById=!0,t.find.ID=function(a,b){if(typeof b.getElementById!==S&&F){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},t.filter.ID=function(a){var b=a.replace(ra,sa);return function(a){return a.getAttribute("id")===b}},t.find.TAG=s.getElementsByTagName?function(a,b){if(typeof b.getElementsByTagName!==S)return b.getElementsByTagName(a)}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},t.find.CLASS=s.getElementsByClassName&&function(a,b){if(F)return b.getElementsByClassName(a)},H=[],G=[],s.disconnectedMatch=!0,G=G.length&&new RegExp(G.join("|")),H=H.length&&new RegExp(H.join("|")),c=na.test(E.compareDocumentPosition),J=c||na.test(E.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},R=c?function(a,b){if(a===b)return B=!0,0;var c=!a.compareDocumentPosition-!b.compareDocumentPosition;return c?c:(c=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&c||!s.sortDetached&&b.compareDocumentPosition(a)===c?a===e||a.ownerDocument===L&&J(L,a)?-1:b===e||b.ownerDocument===L&&J(L,b)?1:A?$.call(A,a)-$.call(A,b):0:4&c?-1:1)}:function(a,b){if(a===b)return B=!0,0;var c,f=0,g=a.parentNode,h=b.parentNode,i=[a],j=[b];if(!g||!h)return a===e?-1:b===e?1:g?-1:h?1:A?$.call(A,a)-$.call(A,b):0;if(g===h)return d(a,b);for(c=a;c=c.parentNode;)i.unshift(c);for(c=b;c=c.parentNode;)j.unshift(c);for(;i[f]===j[f];)f++;return f?d(i[f],j[f]):i[f]===L?-1:j[f]===L?1:0},e):D},a.matches=function(b,c){return a(b,null,null,c)},a.matchesSelector=function(b,c){if((b.ownerDocument||b)!==D&&C(b),c=c.replace(ha,"='$1']"),s.matchesSelector&&F&&(!H||!H.test(c))&&(!G||!G.test(c)))try{var d=I.call(b,c);if(d||s.disconnectedMatch||b.document&&11!==b.document.nodeType)return d}catch(a){}return a(c,D,null,[b]).length>0},a.contains=function(a,b){return(a.ownerDocument||a)!==D&&C(a),J(a,b)},a.attr=function(a,b){(a.ownerDocument||a)!==D&&C(a);var c=t.attrHandle[b.toLowerCase()],d=c&&U.call(t.attrHandle,b.toLowerCase())?c(a,b,!F):void 0;return void 0!==d?d:s.attributes||!F?a.getAttribute(b):(d=a.getAttributeNode(b))&&d.specified?d.value:null},a.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},a.uniqueSort=function(a){var b,c=[],d=0,e=0;if(B=!s.detectDuplicates,A=!s.sortStable&&a.slice(0),a.sort(R),B){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return A=null,a},u=a.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=u(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d++];)c+=u(b);return c},t=a.selectors={cacheLength:50,createPseudo:c,match:ka,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ra,sa),a[3]=(a[3]||a[4]||a[5]||"").replace(ra,sa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(b){return b[1]=b[1].toLowerCase(),"nth"===b[1].slice(0,3)?(b[3]||a.error(b[0]),b[4]=+(b[4]?b[5]+(b[6]||1):2*("even"===b[3]||"odd"===b[3])),b[5]=+(b[7]+b[8]||"odd"===b[3])):b[3]&&a.error(b[0]),b},PSEUDO:function(a){var b,c=!a[6]&&a[2];return ka.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&ia.test(c)&&(b=w(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ra,sa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=O[a+" "];return b||(b=new RegExp("(^|"+aa+")"+a+"("+aa+"|$)"))&&O(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==S&&a.getAttribute("class")||"")})},ATTR:function(b,c,d){return function(e){var f=a.attr(e,b);return null==f?"!="===c:!c||(f+="","="===c?f===d:"!="===c?f!==d:"^="===c?d&&0===f.indexOf(d):"*="===c?d&&f.indexOf(d)>-1:"$="===c?d&&f.slice(-d.length)===d:"~="===c?(" "+f+" ").indexOf(d)>-1:"|="===c&&(f===d||f.slice(0,d.length+1)===d+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){for(;p;){for(l=b;l=l[p];)if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(k=q[K]||(q[K]={}),j=k[a]||[],n=j[0]===M&&j[1],m=j[0]===M&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[M,n,m];break}}else if(s&&(j=(b[K]||(b[K]={}))[a])&&j[0]===M)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==r:1!==l.nodeType)||!++m||(s&&((l[K]||(l[K]={}))[a]=[M,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(b,d){var e,f=t.pseudos[b]||t.setFilters[b.toLowerCase()]||a.error("unsupported pseudo: "+b);return f[K]?f(d):f.length>1?(e=[b,b,"",d],t.setFilters.hasOwnProperty(b.toLowerCase())?c(function(a,b){for(var c,e=f(a,d),g=e.length;g--;)c=$.call(a,e[g]),a[c]=!(b[c]=e[g])}):function(a){return f(a,0,e)}):f}},pseudos:{not:c(function(a){var b=[],d=[],e=x(a.replace(ea,"$1"));return e[K]?c(function(a,b,c,d){for(var f,g=e(a,null,d,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,c,f){return b[0]=a,e(b,null,f,d),!d.pop()}}),has:c(function(b){return function(c){return a(b,c).length>0}}),contains:c(function(a){return a=a.replace(ra,sa),function(b){return(b.textContent||b.innerText||u(b)).indexOf(a)>-1}}),lang:c(function(b){return ja.test(b||"")||a.error("unsupported lang: "+b),b=b.replace(ra,sa).toLowerCase(),function(a){var c;do if(c=F?a.lang:a.getAttribute("xml:lang")||a.getAttribute("lang"))return c=c.toLowerCase(),c===b||0===c.indexOf(b+"-");while((a=a.parentNode)&&1===a.nodeType);return!1}}),target:function(a){var b=window.location&&window.location.hash;return b&&b.slice(1)===a.id},root:function(a){return a===E},focus:function(a){return a===D.activeElement&&(!D.hasFocus||D.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!t.pseudos.empty(a)},header:function(a){return ma.test(a.nodeName)},input:function(a){return la.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:g(function(){return[0]}),last:g(function(a,b){return[b-1]}),eq:g(function(a,b,c){return[c<0?c+b:c]}),even:g(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:g(function(a,b,c){for(var d=c<0?c+b:c;++d2&&"ID"===(g=f[0]).type&&s.getById&&9===b.nodeType&&F&&t.relative[f[1].type]){if(b=(t.find.ID(g.matches[0].replace(ra,sa),b)||[])[0],!b)return c;l&&(b=b.parentNode),a=a.slice(f.shift().value.length)}for(e=ka.needsContext.test(a)?0:f.length;e--&&(g=f[e],!t.relative[i=g.type]);)if((k=t.find[i])&&(d=k(g.matches[0].replace(ra,sa),pa.test(f[0].type)&&h(b.parentNode)||b))){if(f.splice(e,1),a=d.length&&j(f),!a)return Y.apply(c,d),c;break}}return(l||x(a,m))(d,b,!F,c,pa.test(a)&&h(b.parentNode)||b),c},s.sortStable=K.split("").sort(R).join("")===K,s.detectDuplicates=!!B,C(),s.sortDetached=!0,a}),g("1q",[],function(){function a(a){var b,c,d=a;if(!j(a))for(d=[],b=0,c=a.length;b=0;e--)i(a,b[e],c,d);else for(e=0;e)[^>]*$|#([\w\-]*)$)/,A=a.Event,B=c.makeMap("children,contents,next,prev"),C=c.makeMap("fillOpacity fontWeight lineHeight opacity orphans widows zIndex zoom"," "),D=c.makeMap("checked compact declare defer disabled ismap multiple nohref noshade nowrap readonly selected"," "),E={"for":"htmlFor","class":"className",readonly:"readOnly"},F={"float":"cssFloat"},G={},H={},I=/^\s*|\s*$/g;return l.fn=l.prototype={constructor:l,selector:"",context:null,length:0,init:function(a,b){var c,d,e=this;if(!a)return e;if(a.nodeType)return e.context=e[0]=a,e.length=1,e;if(b&&b.nodeType)e.context=b;else{if(b)return l(a).attr(b);e.context=b=document}if(f(a)){if(e.selector=a,c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c)return l(b).find(a);if(c[1])for(d=h(a,q(b)).firstChild;d;)x.call(e,d),d=d.nextSibling;else{if(d=q(b).getElementById(c[2]),!d)return e;if(d.id!==c[2])return e.find(a);e.length=1,e[0]=d}}else this.add(a,!1);return e},toArray:function(){return c.toArray(this)},add:function(a,b){var c,d,e=this;if(f(a))return e.add(l(a));if(b!==!1)for(c=l.unique(e.toArray().concat(l.makeArray(a))),e.length=c.length,d=0;d1&&(B[a]||(e=l.unique(e)),0===a.indexOf("parents")&&(e=e.reverse())),e=l(e),c?e.filter(c):e}}),o({parentsUntil:function(a,b){return r(a,"parentNode",b)},nextUntil:function(a,b){return s(a,"nextSibling",1,b).slice(1)},prevUntil:function(a,b){return s(a,"previousSibling",1,b).slice(1)}},function(a,b){l.fn[a]=function(c,d){var e=this,f=[];return e.each(function(){var a=b.call(f,this,c,f);a&&(l.isArray(a)?f.push.apply(f,a):f.push(a))}),this.length>1&&(f=l.unique(f),0!==a.indexOf("parents")&&"prevUntil"!==a||(f=f.reverse())),f=l(f),d?f.filter(d):f}}),l.fn.is=function(a){return!!a&&this.filter(a).length>0},l.fn.init.prototype=l.fn,l.overrideDefaults=function(a){function b(d,e){return c=c||a(),0===arguments.length&&(d=c.element),e||(e=c.context),new b.fn.init(d,e)}var c;return l.extend(b,this),b},d.ie&&d.ie<8&&(u(G,"get",{maxlength:function(a){var b=a.maxLength;return 2147483647===b?v:b},size:function(a){var b=a.size;return 20===b?v:b},"class":function(a){return a.className},style:function(a){var b=a.style.cssText;return 0===b.length?v:b}}),u(G,"set",{"class":function(a,b){a.className=b},style:function(a,b){a.style.cssText=b}})),d.ie&&d.ie<9&&(F["float"]="styleFloat",u(H,"set",{opacity:function(a,b){var c=a.style;null===b||""===b?c.removeAttribute("filter"):(c.zoom=1,c.filter="alpha(opacity="+100*b+")")}})),l.attrHooks=G,l.cssHooks=H,l}),g("1r",["c"],function(a){function b(c){function d(){return J.createDocumentFragment()}function e(a,b){x(N,a,b)}function f(a,b){x(O,a,b)}function g(a){e(a.parentNode,U(a))}function h(a){e(a.parentNode,U(a)+1)}function i(a){f(a.parentNode,U(a))}function j(a){f(a.parentNode,U(a)+1)}function k(a){a?(I[R]=I[Q],I[S]=I[P]):(I[Q]=I[R],I[P]=I[S]),I.collapsed=N}function l(a){g(a),j(a)}function m(a){e(a,0),f(a,1===a.nodeType?a.childNodes.length:a.nodeValue.length)}function n(a,b){var c=I[Q],d=I[P],e=I[R],f=I[S],g=b.startContainer,h=b.startOffset,i=b.endContainer,j=b.endOffset;return 0===a?w(c,d,g,h):1===a?w(e,f,g,h):2===a?w(e,f,i,j):3===a?w(c,d,i,j):void 0}function o(){y(M)}function p(){return y(K)}function q(){return y(L)}function r(a){var b,d,e=this[Q],f=this[P];3!==e.nodeType&&4!==e.nodeType||!e.nodeValue?(e.childNodes.length>0&&(d=e.childNodes[f]),d?e.insertBefore(a,d):3==e.nodeType?c.insertAfter(a,e):e.appendChild(a)):f?f>=e.nodeValue.length?c.insertAfter(a,e):(b=e.splitText(f),e.parentNode.insertBefore(a,b)):e.parentNode.insertBefore(a,e)}function s(a){var b=I.extractContents();I.insertNode(a),a.appendChild(b),I.selectNode(a)}function t(){return T(new b(c),{startContainer:I[Q],startOffset:I[P],endContainer:I[R],endOffset:I[S],collapsed:I.collapsed,commonAncestorContainer:I.commonAncestorContainer})}function u(a,b){var c;if(3==a.nodeType)return a;if(b<0)return a;for(c=a.firstChild;c&&b>0;)--b,c=c.nextSibling;return c?c:a}function v(){return I[Q]==I[R]&&I[P]==I[S]}function w(a,b,d,e){var f,g,h,i,j,k;if(a==d)return b==e?0:b0&&I.collapse(a):I.collapse(a),I.collapsed=v(),I.commonAncestorContainer=c.findCommonAncestor(I[Q],I[R])}function y(a){var b,c,d,e,f,g,h,i=0,j=0;if(I[Q]==I[R])return z(a);for(b=I[R],c=b.parentNode;c;b=c,c=c.parentNode){if(c==I[Q])return A(b,a);++i}for(b=I[Q],c=b.parentNode;c;b=c,c=c.parentNode){if(c==I[R])return B(b,a);++j}for(d=j-i,e=I[Q];d>0;)e=e.parentNode,d--;for(f=I[R];d<0;)f=f.parentNode,d++;for(g=e.parentNode,h=f.parentNode;g!=h;g=g.parentNode,h=h.parentNode)e=g,f=h;return C(e,f,a)}function z(a){var b,c,e,f,g,h,i,j,k;if(a!=M&&(b=d()),I[P]==I[S])return b;if(3==I[Q].nodeType){if(c=I[Q].nodeValue,e=c.substring(I[P],I[S]),a!=L&&(f=I[Q],j=I[P],k=I[S]-I[P],0===j&&k>=f.nodeValue.length-1?f.parentNode.removeChild(f):f.deleteData(j,k),I.collapse(N)),a==M)return;return e.length>0&&b.appendChild(J.createTextNode(e)),b}for(f=u(I[Q],I[P]),g=I[S]-I[P];f&&g>0;)h=f.nextSibling,i=G(f,a),b&&b.appendChild(i),--g,f=h;return a!=L&&I.collapse(N),b}function A(a,b){var c,e,f,g,h,i;if(b!=M&&(c=d()),e=D(a,b),c&&c.appendChild(e),f=U(a),g=f-I[P],g<=0)return b!=L&&(I.setEndBefore(a),I.collapse(O)),c;for(e=a.previousSibling;g>0;)h=e.previousSibling,i=G(e,b),c&&c.insertBefore(i,c.firstChild),--g,e=h;return b!=L&&(I.setEndBefore(a),I.collapse(O)),c}function B(a,b){var c,e,f,g,h,i;for(b!=M&&(c=d()),f=E(a,b),c&&c.appendChild(f),e=U(a),++e,g=I[S]-e,f=a.nextSibling;f&&g>0;)h=f.nextSibling,i=G(f,b),c&&c.appendChild(i),--g,f=h;return b!=L&&(I.setStartAfter(a),I.collapse(N)),c}function C(a,b,c){var e,f,g,h,i,j,k;for(c!=M&&(f=d()),e=E(a,c),f&&f.appendChild(e),g=U(a),h=U(b),++g,i=h-g,j=a.nextSibling;i>0;)k=j.nextSibling,e=G(j,c),f&&f.appendChild(e),j=k,--i;return e=D(b,c),f&&f.appendChild(e),c!=L&&(I.setStartAfter(a),I.collapse(N)),f}function D(a,b){var c,d,e,f,g,h=u(I[R],I[S]-1),i=h!=I[R];if(h==a)return F(h,i,O,b);for(c=h.parentNode,d=F(c,O,O,b);c;){for(;h;)e=h.previousSibling,f=F(h,i,O,b),b!=M&&d.insertBefore(f,d.firstChild),i=N,h=e;if(c==a)return d;h=c.previousSibling,c=c.parentNode,g=F(c,O,O,b),b!=M&&g.appendChild(d),d=g}}function E(a,b){var c,d,e,f,g,h=u(I[Q],I[P]),i=h!=I[Q];if(h==a)return F(h,i,N,b);for(c=h.parentNode,d=F(c,O,N,b);c;){for(;h;)e=h.nextSibling,f=F(h,i,N,b),b!=M&&d.appendChild(f),i=N,h=e;if(c==a)return d;h=c.nextSibling,c=c.parentNode,g=F(c,O,N,b),b!=M&&g.appendChild(d),d=g}}function F(a,b,d,e){var f,g,h,i,j;if(b)return G(a,e);if(3==a.nodeType){if(f=a.nodeValue,d?(i=I[P],g=f.substring(i),h=f.substring(0,i)):(i=I[S],g=f.substring(0,i),h=f.substring(i)),e!=L&&(a.nodeValue=h),e==M)return;return j=c.clone(a,O),j.nodeValue=g,j}if(e!=M)return c.clone(a,O)}function G(a,b){return b!=M?b==L?c.clone(a,N):a:void a.parentNode.removeChild(a)}function H(){return c.create("body",null,q()).outerText}var I=this,J=c.doc,K=0,L=1,M=2,N=!0,O=!1,P="startOffset",Q="startContainer",R="endContainer",S="endOffset",T=a.extend,U=c.nodeIndex;return T(I,{startContainer:J,startOffset:0,endContainer:J,endOffset:0,collapsed:N,commonAncestorContainer:J,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:e,setEnd:f,setStartBefore:g,setStartAfter:h,setEndBefore:i,setEndAfter:j,collapse:k,selectNode:l,selectNodeContents:m,compareBoundaryPoints:n,deleteContents:o,extractContents:p,cloneContents:q,insertNode:r,surroundContents:s,cloneRange:t,toStringIE:H}),I}return b.prototype.toString=function(){return this.toStringIE()},b}),h("5h",Object),g("4l",["1","5h"],function(a,b){var c=a.never,d=a.always,e=function(){return f},f=function(){var f=function(a){return a.isNone()},g=function(a){return a()},h=function(a){return a},i=function(){},j={fold:function(a,b){return a()},is:c,isSome:c,isNone:d,getOr:h,getOrThunk:g,getOrDie:function(a){throw new Error(a||"error: getOrDie called on none.")},or:h,orThunk:g,map:e,ap:e,each:i,bind:e,flatten:e,exists:c,forall:d,filter:e,equals:f,equals_:f,toArray:function(){return[]},toString:a.constant("none()")};return b.freeze&&b.freeze(j),j}(),g=function(a){var b=function(){return a},h=function(){return k},i=function(b){return g(b(a))},j=function(b){return b(a)},k={fold:function(b,c){return c(a)},is:function(b){return a===b},isSome:d,isNone:c,getOr:b,getOrThunk:b,getOrDie:b,or:h,orThunk:h,map:i,ap:function(b){return b.fold(e,function(b){return g(b(a))})},each:function(b){b(a)},bind:j,flatten:b,exists:j,forall:j,filter:function(b){return b(a)?k:f},equals:function(b){return b.is(a)},equals_:function(b,d){return b.fold(c,function(b){return d(a,b)})},toArray:function(){return[a]},toString:function(){return"some("+a+")"}};return k},h=function(a){return null===a||void 0===a?f:g(a)};return{some:g,none:e,from:h}}),h("5i",String),g("45",["4l","3","4","5i"],function(a,b,c,d){var e=function(){var a=b.prototype.indexOf,c=function(b,c){return a.call(b,c)},d=function(a,b){return u(a,b)};return void 0===a?d:c}(),f=function(b,c){var d=e(b,c);return d===-1?a.none():a.some(d)},g=function(a,b){return e(a,b)>-1},h=function(a,b){return t(a,b).isSome()},i=function(a,b){for(var c=[],d=0;d=0;c--){var d=a[c];b(d,c,a)}},n=function(a,b){for(var c=[],d=[],e=0,f=a.length;e=b.length&&c(d)}};0===b.length?c([]):a.each(b,function(a,b){a.get(f(b))})})};return{par:b}}),g("47",["45","46","5l"],function(a,b,c){var d=function(a){return c.par(a,b.nu)},e=function(b,c){var e=a.map(b,c);return d(e)},f=function(a,b){return function(c){return b(c).bind(a)}};return{par:d,mapM:e,compose:f}}),g("48",["1","4l"],function(a,b){var c=function(d){var e=function(a){return d===a},f=function(a){return c(d)},g=function(a){return c(d)},h=function(a){return c(a(d))},i=function(a){a(d)},j=function(a){return a(d)},k=function(a,b){return b(d)},l=function(a){return a(d)},m=function(a){return a(d)},n=function(){return b.some(d)};return{is:e,isValue:a.constant(!0),isError:a.constant(!1),getOr:a.constant(d),getOrThunk:a.constant(d),getOrDie:a.constant(d),or:f,orThunk:g,fold:k,map:h,each:i,bind:j,exists:l,forall:m,toOption:n}},d=function(c){var e=function(a){return a()},f=function(){return a.die(c)()},g=function(a){return a},h=function(a){return a()},i=function(a){return d(c)},j=function(a){return d(c)},k=function(a,b){return a(c)};return{is:a.constant(!1),isValue:a.constant(!1),isError:a.constant(!0),getOr:a.identity,getOrThunk:e,getOrDie:f,or:g,orThunk:h,fold:k,map:i,each:a.noop,bind:j,exists:a.constant(!1),forall:a.constant(!0),toOption:b.none}};return{value:c,error:d}}),g("1s",["45","1","46","47","48","8","c"],function(a,b,c,d,e,f,g){"use strict";return function(h,i){function j(a){h.getElementsByTagName("head")[0].appendChild(a)}function k(a,b,c){function d(){for(var a=t.passed,b=a.length;b--;)a[b]();t.status=2,t.passed=[],t.failed=[]}function e(){for(var a=t.failed,b=a.length;b--;)a[b]();t.status=3,t.passed=[],t.failed=[]}function i(){var a=navigator.userAgent.match(/WebKit\/(\d*)/);return!!(a&&a[1]<536)}function k(a,b){a()||((new Date).getTime()-s0)return r=h.createElement("style"),r.textContent='@import "'+a+'"',p(),void j(r);o()}j(q),q.href=a}}var l,m=0,n={};i=i||{},l=i.maxLoadTime||5e3;var o=function(a){return c.nu(function(c){k(a,b.compose(c,b.constant(e.value(a))),b.compose(c,b.constant(e.error(a))))})},p=function(a){return a.fold(b.identity,b.identity)},q=function(b,c,e){d.par(a.map(b,o)).get(function(b){var d=a.partition(b,function(a){return a.isValue()});d.fail.length>0?e(d.fail.map(p)):c(d.pass.map(p))})};return{load:k,loadAll:q}}}),g("f",[],function(){return function(a,b){function c(a,c,d,e){var f,g;if(a){if(!e&&a[c])return a[c];if(a!=b){if(f=a[d])return f;for(g=a.parentNode;g&&g!=b;g=g.parentNode)if(f=g[d])return f}}}function d(a,c,d,e){var f,g,h;if(a){if(f=a[d],b&&f===b)return;if(f){if(!e)for(h=f[c];h;h=h[c])if(!h[c])return h;return f}if(g=a.parentNode,g&&g!==b)return g}}var e=a;this.current=function(){return e},this.next=function(a){return e=c(e,"firstChild","nextSibling",a)},this.prev=function(a){return e=c(e,"lastChild","previousSibling",a)},this.prev2=function(a){return e=d(e,"lastChild","previousSibling",a)}}}),g("g",["c"],function(a){function b(a){var b;return b=document.createElement("div"),b.innerHTML=a,b.textContent||b.innerText||a}function c(a,b){var c,d,f,g={};if(a){for(a=a.split(","),b=b||10,c=0;c\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,i=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,j=/[<>&\"\']/g,k=/&#([a-z0-9]+);?|&([a-z0-9]+);/gi,l={128:"\u20ac",130:"\u201a",131:"\u0192",132:"\u201e",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02c6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017d",145:"\u2018",146:"\u2019",147:"\u201c",148:"\u201d",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02dc",153:"\u2122",154:"\u0161",155:"\u203a",156:"\u0153",158:"\u017e",159:"\u0178"};e={'"':""","'":"'","<":"<",">":">","&":"&","`":"`"},f={"<":"<",">":">","&":"&",""":'"',"'":"'"},d=c("50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,t9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro",32);var m={encodeRaw:function(a,b){return a.replace(b?h:i,function(a){return e[a]||a})},encodeAllRaw:function(a){return(""+a).replace(j,function(a){return e[a]||a})},encodeNumeric:function(a,b){return a.replace(b?h:i,function(a){return a.length>1?"&#"+(1024*(a.charCodeAt(0)-55296)+(a.charCodeAt(1)-56320)+65536)+";":e[a]||"&#"+a.charCodeAt(0)+";"})},encodeNamed:function(a,b,c){return c=c||d,a.replace(b?h:i,function(a){return e[a]||c[a]||a})},getEncodeFunc:function(a,b){function f(a,c){return a.replace(c?h:i,function(a){return void 0!==e[a]?e[a]:void 0!==b[a]?b[a]:a.length>1?"&#"+(1024*(a.charCodeAt(0)-55296)+(a.charCodeAt(1)-56320)+65536)+";":"&#"+a.charCodeAt(0)+";"})}function j(a,c){return m.encodeNamed(a,c,b)}return b=c(b)||d,a=g(a.replace(/\+/g,",")),a.named&&a.numeric?f:a.named?b?j:m.encodeNamed:a.numeric?m.encodeNumeric:m.encodeRaw},decode:function(a){return a.replace(k,function(a,c){return c?(c="x"===c.charAt(0).toLowerCase()?parseInt(c.substr(1),16):parseInt(c,10),c>65535?(c-=65536,String.fromCharCode(55296+(c>>10),56320+(1023&c))):l[c]||String.fromCharCode(c)):f[a]||d[a]||b(a)})}};return m}),g("m",["c"],function(a){function b(b,c){return b=a.trim(b),b?b.split(c||" "):[]}function c(a){function c(a,c,d){function e(a,b){var c,d,e={};for(c=0,d=a.length;c

").html("
"+c).contents().slice(1).appendTo(d)}return c}}):b.html(c)},getOuterHTML:function(b){return b=this.get(b),1==b.nodeType&&"outerHTML"in b?b.outerHTML:a("
").append(a(b).clone()).html()},setOuterHTML:function(b,c){var d=this;d.$$(b).each(function(){try{if("outerHTML"in this)return void(this.outerHTML=c)}catch(a){}d.remove(a(this).html(c),!0)})},decode:h.decode,encode:h.encodeAllRaw,insertAfter:function(a,b){return b=this.get(b),this.run(a,function(a){var c,d;return c=b.parentNode,d=b.nextSibling,d?c.insertBefore(a,d):c.appendChild(a),a})},replace:function(a,b,c){var d=this;return d.run(b,function(b){return q(b,"array")&&(a=a.cloneNode(!0)),c&&p(r(b.childNodes),function(b){a.appendChild(b)}),b.parentNode.replaceChild(a,b)})},rename:function(a,b){var c,d=this;return a.nodeName!=b.toUpperCase()&&(c=d.create(b),p(d.getAttribs(a),function(b){d.setAttrib(c,b.nodeName,d.getAttrib(a,b.nodeName))}),d.replace(c,a,1)),c||a},findCommonAncestor:function(a,b){for(var c,d=a;d;){for(c=b;c&&d!=c;)c=c.parentNode;if(d==c)break;d=d.parentNode}return!d&&a.ownerDocument?a.ownerDocument.documentElement:d},toHex:function(a){return this.styles.toHex(k.trim(a))},run:function(a,b,c){var d,e=this;return"string"==typeof a&&(a=e.get(a)),!!a&&(c=c||this,a.nodeType||!a.length&&0!==a.length?b.call(c,a):(d=[],p(a,function(a,f){a&&("string"==typeof a&&(a=e.get(a)),d.push(b.call(c,a,f)))}),d))},getAttribs:function(a){var b;if(a=this.get(a),!a)return[];if(t){if(b=[],"OBJECT"==a.nodeName)return a.attributes;"OPTION"===a.nodeName&&this.getAttrib(a,"selected")&&b.push({specified:1,nodeName:"selected"});var c=/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi;return a.cloneNode(!1).outerHTML.replace(c,"").replace(/[\w:\-]+/gi,function(a){b.push({specified:1,nodeName:a})}),b}return a.attributes},isEmpty:function(a,b){var c,d,e,g,h,i,j=this,k=0;if(a=a.firstChild){h=new f(a,a.parentNode),b=b||(j.schema?j.schema.getNonEmptyElements():null),g=j.schema?j.schema.getWhiteSpaceElements():{};do{if(e=a.nodeType,1===e){var l=a.getAttribute("data-mce-bogus");if(l){a=h.next("all"===l);continue}if(i=a.nodeName.toLowerCase(),b&&b[i]){if("br"===i){k++,a=h.next();continue}return!1}for(d=j.getAttribs(a),c=d.length;c--;)if(i=d[c].nodeName,"name"===i||"data-mce-bookmark"===i)return!1}if(8==e)return!1;if(3===e&&!v.test(a.nodeValue))return!1;if(3===e&&a.parentNode&&g[a.parentNode.nodeName]&&v.test(a.nodeValue))return!1;a=h.next()}while(a)}return k<=1},createRng:function(){var a=this.doc;return a.createRange?a.createRange():new c(this)},nodeIndex:n,split:function(a,b,c){function d(a){function b(a){var b=a.previousSibling&&"SPAN"==a.previousSibling.nodeName,c=a.nextSibling&&"SPAN"==a.nextSibling.nodeName;return b&&c}var c,e=a.childNodes,f=a.nodeType;if(1!=f||"bookmark"!=a.getAttribute("data-mce-type")){for(c=e.length-1;c>=0;c--)d(e[c]);if(9!=f){if(3==f&&a.nodeValue.length>0){var g=s(a.nodeValue).length;if(!h.isBlock(a.parentNode)||g>0||0===g&&b(a))return}else if(1==f&&(e=a.childNodes,1==e.length&&e[0]&&1==e[0].nodeType&&"bookmark"==e[0].getAttribute("data-mce-type")&&a.parentNode.insertBefore(e[0],a),e.length||/^(br|hr|input|img)$/i.test(a.nodeName)))return;h.remove(a)}return a}}var e,f,g,h=this,i=h.createRng();if(a&&b)return i.setStart(a.parentNode,h.nodeIndex(a)),i.setEnd(b.parentNode,h.nodeIndex(b)),e=i.extractContents(),i=h.createRng(),i.setStart(b.parentNode,h.nodeIndex(b)+1),i.setEnd(a.parentNode,h.nodeIndex(a)+1),f=i.extractContents(),g=a.parentNode,g.insertBefore(d(e),a),c?g.insertBefore(c,a):g.insertBefore(b,a),g.insertBefore(d(f),a),h.remove(a),c||b},bind:function(a,b,c,d){var e=this;if(k.isArray(a)){for(var f=a.length;f--;)a[f]=e.bind(a[f],b,c,d);return a}return!e.settings.collect||a!==e.doc&&a!==e.win||e.boundEvents.push([a,b,c,d]),e.events.bind(a,b,c,d||e)},unbind:function(a,b,c){var d,e=this;if(k.isArray(a)){for(d=a.length;d--;)a[d]=e.unbind(a[d],b,c);return a}if(e.boundEvents&&(a===e.doc||a===e.win))for(d=e.boundEvents.length;d--;){var f=e.boundEvents[d];a!=f[0]||b&&b!=f[1]||c&&c!=f[2]||this.events.unbind(f[0],f[1],f[2])}return this.events.unbind(a,b,c)},fire:function(a,b,c){return this.events.fire(a,b,c)},getContentEditable:function(a){var b;return a&&1==a.nodeType?(b=a.getAttribute("data-mce-contenteditable"),b&&"inherit"!==b?b:"inherit"!==a.contentEditable?a.contentEditable:null):null},getContentEditableParent:function(a){for(var b=this.getRoot(),c=null;a&&a!==b&&(c=this.getContentEditable(a),null===c);a=a.parentNode);return c},destroy:function(){var a=this;if(a.boundEvents){for(var b=a.boundEvents.length;b--;){var c=a.boundEvents[b];this.events.unbind(c[0],c[1],c[2])}a.boundEvents=null}d.setDocument&&d.setDocument(),a.win=a.doc=a.root=a.events=a.frag=null},isChildOf:function(a,b){for(;a;){if(b===a)return!0;a=a.parentNode}return!1},dumpRng:function(a){return"startContainer: "+a.startContainer.nodeName+", startOffset: "+a.startOffset+", endContainer: "+a.endContainer.nodeName+", endOffset: "+a.endOffset},_findSib:function(a,b,c){var d=this,e=b;if(a)for("string"==typeof e&&(e=function(a){return d.is(a,b)}),a=a[c];a;a=a[c])if(e(a))return a;return null}},o.DOM=new o(document),o.nodeIndex=n,o}),g("49",[],function(){function a(a){return function(){return a}}function b(a){return function(b){return!a(b)}}function c(a,b){return function(c){return a(b(c))}}function d(){var a=h.call(arguments);return function(b){for(var c=0;c=a.length?a.apply(this,b.slice(1)):function(){var a=b.concat([].slice.call(arguments));return f.apply(this,a)}}function g(){}var h=[].slice;return{constant:a,negate:b,and:e,or:d,curry:f,compose:c,noop:g}}),g("1v",[],function(){var a="\ufeff",b=function(b){return b===a},c=function(b){return b.replace(new RegExp(a,"g"),"")};return{isZwsp:b,ZWSP:a,trim:c}}),g("1u",["1t","1v"],function(a,b){function c(a){return n(a)&&(a=a.parentNode),m(a)&&a.hasAttribute("data-mce-caret")}function d(a){return n(a)&&b.isZwsp(a.data)}function e(a){return c(a)||d(a)}function f(a,c){var d,f,g,h;if(d=a.ownerDocument,g=d.createTextNode(b.ZWSP),h=a.parentNode,c){if(f=a.previousSibling,n(f)){if(e(f))return f;if(j(f))return f.splitText(f.data.length-1)}h.insertBefore(g,a)}else{if(f=a.nextSibling,n(f)){if(e(f))return f;if(i(f))return f.splitText(1),f}a.nextSibling?h.insertBefore(g,a.nextSibling):h.appendChild(g)}return g}function g(){var a=document.createElement("br");return a.setAttribute("data-mce-bogus","1"),a}function h(a,b,c){var d,e,f;return d=b.ownerDocument,e=d.createElement(a),e.setAttribute("data-mce-caret",c?"before":"after"),e.setAttribute("data-mce-bogus","all"),e.appendChild(g()),f=b.parentNode,c?f.insertBefore(e,b):b.nextSibling?f.insertBefore(e,b.nextSibling):f.appendChild(e),e}function i(a){return n(a)&&a.data[0]==b.ZWSP}function j(a){return n(a)&&a.data[a.data.length-1]==b.ZWSP}function k(b){var c=b.getElementsByTagName("br"),d=c[c.length-1];a.isBogus(d)&&d.parentNode.removeChild(d)}function l(a){return a&&a.hasAttribute("data-mce-caret")?(k(a),a.removeAttribute("data-mce-caret"),a.removeAttribute("data-mce-bogus"),a.removeAttribute("style"),a.removeAttribute("_moz_abspos"),a):null}var m=a.isElement,n=a.isText,o=function(b){return b.firstChild!==b.lastChild||!a.isBr(b.firstChild)},p=function(c){if(a.isText(c)){var d=c.data;return d.length>0&&d.charAt(0)!==b.ZWSP&&c.insertData(0,b.ZWSP),c}return null},q=function(c){if(a.isText(c)){var d=c.data;return d.length>0&&d.charAt(d.length-1)!==b.ZWSP&&c.insertData(d.length,b.ZWSP),c}return null},r=function(c){return c&&a.isText(c.container())&&c.container().data.charAt(c.offset())===b.ZWSP},s=function(c){return c&&a.isText(c.container())&&c.container().data.charAt(c.offset()-1)===b.ZWSP};return{isCaretContainer:e,isCaretContainerBlock:c,isCaretContainerInline:d,showCaretContainerBlock:l,insertInline:f,prependInline:p,appendInline:q,isBeforeInline:r,isAfterInline:s,insertBlock:h,hasContent:o,startsWithCaretContainer:i,endsWithCaretContainer:j}}),g("k",["c","f","1t","1r","1u"],function(a,b,c,d,e){function f(a){return q(a)||r(a)}function g(a,b){var c=a.childNodes;return b--,b>c.length-1?b=c.length-1:b<0&&(b=0),c[b]||a}function h(a,b,c){for(;a&&a!==b;){if(c(a))return a;a=a.parentNode}return null}function i(a,b,c){return null!==h(a,b,c)}function j(a,b,c){return i(a,b,function(a){return a.nodeName===c})}function k(a){return"_mce_caret"===a.id}function l(a,b){return s(a)&&i(a,b,k)===!1}function m(a){this.walk=function(b,c){function d(a){var b;return b=a[0],3===b.nodeType&&b===q&&r>=b.nodeValue.length&&a.splice(0,1),b=a[a.length-1],0===t&&a.length>0&&b===s&&3===b.nodeType&&a.splice(a.length-1,1),a}function e(a,b,c){for(var d=[];a&&a!=c;a=a[b])d.push(a);return d}function f(a,b){do{if(a.parentNode==b)return a;a=a.parentNode}while(a)}function h(a,b,f){var g=f?"nextSibling":"previousSibling";for(l=a,m=l.parentNode;l&&l!=b;l=m)m=l.parentNode,n=e(l==a?l:l[g],g),n.length&&(f||n.reverse(),c(d(n)))}var i,j,k,l,m,n,o,q=b.startContainer,r=b.startOffset,s=b.endContainer,t=b.endOffset;if(o=a.select("td[data-mce-selected],th[data-mce-selected]"),o.length>0)return void p(o,function(a){c([a])});if(1==q.nodeType&&q.hasChildNodes()&&(q=q.childNodes[r]),1==s.nodeType&&s.hasChildNodes()&&(s=g(s,t)),q==s)return c(d([q]));for(i=a.findCommonAncestor(q,s),l=q;l;l=l.parentNode){if(l===s)return h(q,i,!0);if(l===i)break}for(l=s;l;l=l.parentNode){if(l===q)return h(s,i);if(l===i)break}j=f(q,i)||q,k=f(s,i)||s,h(q,j,!0),n=e(j==q?j:j.nextSibling,"nextSibling",k==s?k.nextSibling:k),n.length&&c(d(n)),h(s,k)},this.split=function(a){function b(a,b){return a.splitText(b)}var c=a.startContainer,d=a.startOffset,e=a.endContainer,f=a.endOffset;return c==e&&3==c.nodeType?d>0&&dd?(f-=d,c=e=b(e,f).previousSibling,f=e.nodeValue.length,d=0):f=0):(3==c.nodeType&&d>0&&d0&&f0)return void(j(q,w,"A")===!1&&(n=q,o=c?q.nodeValue.length:0,f=!0));if(a.isBlock(q)||t[q.nodeName.toLowerCase()])return;h=q}e&&h&&(n=h,f=!0,o=0)}var n,o,p,q,t,u,v,w=a.getRoot();if(n=c[(d?"start":"end")+"Container"],o=c[(d?"start":"end")+"Offset"],v=1==n.nodeType&&o===n.childNodes.length,t=a.schema.getNonEmptyElements(),u=d,!s(n)){if(1==n.nodeType&&o>n.childNodes.length-1&&(u=!1),9===n.nodeType&&(n=a.getRoot(),o=0),n===w){if(u&&(q=n.childNodes[o>0?o-1:0])){if(s(q))return;if(t[q.nodeName]||"TABLE"==q.nodeName)return}if(n.hasChildNodes()){if(o=Math.min(!u&&o>0?o-1:o,n.childNodes.length-1),n=n.childNodes[o],o=0,!e&&n===w.lastChild&&"TABLE"===n.nodeName)return;if(i(n)||s(n))return;if(n.hasChildNodes()&&!/TABLE/.test(n.nodeName)){q=n,p=new b(n,w);do{if(r(q)||s(q)){f=!1;break}if(3===q.nodeType&&q.nodeValue.length>0){o=u?0:q.nodeValue.length,n=q,f=!0;break}if(t[q.nodeName.toLowerCase()]&&!g(q)){o=a.nodeIndex(q),n=q.parentNode,"IMG"!==q.nodeName&&"PRE"!==q.nodeName||u||o++,f=!0;break}}while(q=u?p.next():p.prev())}}}e&&(3===n.nodeType&&0===o&&m(!0),1===n.nodeType&&(q=n.childNodes[o],q||(q=n.childNodes[o-1]),!q||"BR"!==q.nodeName||k(q,"A")||h(q)||h(q,!0)||m(!0,q))),u&&!e&&3===n.nodeType&&o===n.nodeValue.length&&m(!1),f&&c["set"+(d?"Start":"End")](n,o)}}var e,f=!1;return e=c.collapsed,d(!0),e||d(),f&&e&&c.collapse(!0),f}}function n(b,c,d){var e,f,g;if(e=d.elementFromPoint(b,c),f=d.body.createTextRange(),e&&"HTML"!=e.tagName||(e=d.body),f.moveToElementText(e),g=a.toArray(f.getClientRects()),g=g.sort(function(a,b){return a=Math.abs(Math.max(a.top-c,a.bottom-c)),b=Math.abs(Math.max(b.top-c,b.bottom-c)),a-b}),g.length>0){c=(g[0].bottom+g[0].top)/2;try{return f.moveToPoint(b,c),f.collapse(!0),f}catch(a){}}return null}function o(a,b){var c=a&&a.parentElement?a.parentElement():null;return r(h(c,b,f))?null:a}var p=a.each,q=c.isContentEditableTrue,r=c.isContentEditableFalse,s=e.isCaretContainer;return m.compareRanges=function(a,b){if(a&&b){if(!a.item&&!a.duplicate)return a.startContainer==b.startContainer&&a.startOffset==b.startOffset;if(a.item&&b.item&&a.item(0)===b.item(0))return!0;if(a.isEqual&&b.isEqual&&b.isEqual(a))return!0}return!1},m.getCaretRangeFromPoint=function(a,b,c){var d,e;if(c.caretPositionFromPoint)e=c.caretPositionFromPoint(a,b),d=c.createRange(),d.setStart(e.offsetNode,e.offset),d.collapse(!0);else if(c.caretRangeFromPoint)d=c.caretRangeFromPoint(a,b);else if(c.body.createTextRange){d=c.body.createTextRange();try{d.moveToPoint(a,b),d.collapse(!0)}catch(e){d=n(a,b,c)}return o(d,c.body)}return d},m.getSelectedNode=function(a){var b=a.startContainer,c=a.startOffset; -return b.hasChildNodes()&&a.endOffset==c+1?b.childNodes[c]:null},m.getNode=function(a,b){return 1==a.nodeType&&a.hasChildNodes()&&(b>=a.childNodes.length&&(b=a.childNodes.length-1),a=a.childNodes[b]),a},m}),g("4a",["1t","1q","1u"],function(a,b,c){function d(a){return!p(a)&&(l(a)?!m(a.parentNode):n(a)||k(a)||o(a)||j(a))}function e(a,b){for(a=a.parentNode;a&&a!=b;a=a.parentNode){if(j(a))return!1;if(i(a))return!0}return!0}function f(a){return!!j(a)&&b.reduce(a.getElementsByTagName("*"),function(a,b){return a||i(b)},!1)!==!0}function g(a){return n(a)||f(a)}function h(a,b){return d(a)&&e(a,b)}var i=a.isContentEditableTrue,j=a.isContentEditableFalse,k=a.isBr,l=a.isText,m=a.matchNodeNames("script style textarea"),n=a.matchNodeNames("img input textarea hr iframe video audio object"),o=a.matchNodeNames("table"),p=c.isCaretContainer;return{isCaretCandidate:d,isInEditable:e,isAtomic:g,isEditableCaretCandidate:h}}),g("4b",[],function(){function a(a){return a?{left:k(a.left),top:k(a.top),bottom:k(a.bottom),right:k(a.right),width:k(a.width),height:k(a.height)}:{left:0,top:0,bottom:0,right:0,width:0,height:0}}function b(b,c){return b=a(b),c?b.right=b.left:(b.left=b.left+b.width,b.right=b.left),b.width=0,b}function c(a,b){return a.left===b.left&&a.top===b.top&&a.bottom===b.bottom&&a.right===b.right}function d(a,b,c){return a>=0&&a<=Math.min(b.height,c.height)/2}function e(a,b){return a.bottom-a.height/2b.bottom)&&d(b.top-a.bottom,a,b)}function f(a,b){return a.top>b.bottom||!(a.bottomb.right}function i(a,b){return e(a,b)?-1:f(a,b)?1:g(a,b)?-1:h(a,b)?1:0}function j(a,b,c){return b>=a.left&&b<=a.right&&c>=a.top&&c<=a.bottom}var k=Math.round;return{clone:a,collapse:b,isEqual:c,isAbove:e,isBelow:f,isLeft:g,isRight:h,compare:i,containsXY:j}}),g("4c",[],function(){function a(a){return"string"==typeof a&&a.charCodeAt(0)>=768&&b.test(a)}var b=new RegExp("[\u0300-\u036f\u0483-\u0487\u0488-\u0489\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e3-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2-\u09e3\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62-\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc-\u0ccd\u0cd5-\u0cd6\u0ce2-\u0ce3\u0d01\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62-\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1abe\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9\u1dc0-\u1df5\u1dfc-\u1dff\u200c-\u200d\u20d0-\u20dc\u20dd-\u20e0\u20e1\u20e2-\u20e4\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u302e-\u302f\u3099-\u309a\ua66f\ua670-\ua672\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1\ua802\ua806\ua80b\ua825-\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\uff9e-\uff9f]");return{isExtendingChar:a}}),g("20",["49","1t","h","k","4a","4b","4c"],function(a,b,c,d,e,f,g){function h(a){return"createRange"in a?a.createRange():c.DOM.createRng()}function i(a){return a&&/[\r\n\t ]/.test(a)}function j(a){var b,c=a.startContainer,d=a.startOffset;return!!(i(a.toString())&&r(c.parentNode)&&(b=c.data,i(b[d-1])||i(b[d+1])))}function k(a){function b(a){var b,c=a.ownerDocument,d=h(c),e=c.createTextNode("\xa0"),g=a.parentNode;return g.insertBefore(e,a),d.setStart(e,0),d.setEnd(e,1),b=f.clone(d.getBoundingClientRect()),g.removeChild(e),b}function c(a){var c,d;return d=a.getClientRects(),c=d.length>0?f.clone(d[0]):f.clone(a.getBoundingClientRect()),t(a)&&0===c.left?b(a):c}function d(a,b){return a=f.collapse(a,b),a.width=1,a.right=a.left+1,a}function e(a){0!==a.height&&(n.length>0&&f.isEqual(a,n[n.length-1])||n.push(a))}function i(a,b){var f=h(a.ownerDocument);if(b0&&(f.setStart(a,b-1),f.setEnd(a,b),j(f)||e(d(c(f),!1))),b=b.data.length:c>=b.childNodes.length}function g(){var a;return a=h(b.ownerDocument),a.setStart(b,c),a.setEnd(b,c),a}function i(){return d||(d=k(new l(b,c))),d}function j(){return i().length>0}function m(a){return a&&b===a.container()&&c===a.offset()}function n(a){return v(b,a?c-1:c)}return{container:a.constant(b),offset:a.constant(c),toRange:g,getClientRects:i,isVisible:j,isAtStart:e,isAtEnd:f,isEqual:m,getNode:n}}var m=b.isElement,n=e.isCaretCandidate,o=b.matchStyleValues("display","block table"),p=b.matchStyleValues("float","left right"),q=a.and(m,n,a.negate(p)),r=a.negate(b.matchStyleValues("white-space","pre pre-line pre-wrap")),s=b.isText,t=b.isBr,u=c.nodeIndex,v=d.getNode;return l.fromRangeStart=function(a){return new l(a.startContainer,a.startOffset)},l.fromRangeEnd=function(a){return new l(a.endContainer,a.endOffset)},l.after=function(a){return new l(a.parentNode,u(a)+1)},l.before=function(a){return new l(a.parentNode,u(a))},l.isAtStart=function(a){return!!a&&a.isAtStart()},l.isAtEnd=function(a){return!!a&&a.isAtEnd()},l.isTextPosition=function(a){return!!a&&b.isText(a.container())},l}),g("1z",["1t","h","49","1q","20"],function(a,b,c,d,e){function f(a){var b=a.parentNode;return r(b)?f(b):b}function g(a){return a?d.reduce(a.childNodes,function(a,b){return r(b)&&"BR"!=b.nodeName?a=a.concat(g(b)):a.push(b),a},[]):[]}function h(a,b){for(;(a=a.previousSibling)&&q(a);)b+=a.data.length;return b}function i(a){return function(b){return a===b}}function j(b){var c,e,h;return c=g(f(b)),e=d.findIndex(c,i(b),b),c=c.slice(0,e+1),h=d.reduce(c,function(a,b,d){return q(b)&&q(c[d-1])&&a++,a},0),c=d.filter(c,a.matchNodeNames(b.nodeName)),e=d.findIndex(c,i(b),b),e-h}function k(a){var b;return b=q(a)?"text()":a.nodeName.toLowerCase(),b+"["+j(a)+"]"}function l(a,b,c){var d=[];for(b=b.parentNode;b!=a&&(!c||!c(b));b=b.parentNode)d.push(b);return d}function m(b,e){var f,g,i,j,m,n=[];return f=e.container(),g=e.offset(),q(f)?i=h(f,g):(j=f.childNodes,g>=j.length?(i="after",g=j.length-1):i="before",f=j[g]),n.push(k(f)),m=l(b,f),m=d.filter(m,c.negate(a.isBogus)),n=n.concat(d.map(m,function(a){return k(a)})),n.reverse().join("/")+","+i}function n(b,c,e){var f=g(b);return f=d.filter(f,function(a,b){return!q(a)||!q(f[b-1])}),f=d.filter(f,a.matchNodeNames(c)),f[e]}function o(a,b){for(var c,d=a,f=0;q(d);){if(c=d.data.length,b>=f&&b<=f+c){a=d,b-=f;break}if(!q(d.nextSibling)){a=d,b=c;break}f+=c,d=d.nextSibling}return b>a.data.length&&(b=a.data.length),new e(a,b)}function p(a,b){var c,f,g;return b?(c=b.split(","),b=c[0].split("/"),g=c.length>1?c[1]:"before",f=d.reduce(b,function(a,b){return(b=/([\w\-\(\)]+)\[([0-9]+)\]/.exec(b))?("text()"===b[1]&&(b[1]="#text"),n(a,b[1],parseInt(b[2],10))):null},a),f?q(f)?o(f,parseInt(g,10)):(g="after"===g?s(f)+1:s(f),new e(f.parentNode,g)):null):null}var q=a.isText,r=a.isBogus,s=b.nodeIndex;return{create:m,resolve:p}}),g("u",["1z","1u","20","1t","k","9","1v","c"],function(a,b,c,d,e,f,g,h){function i(g){var i=g.dom;this.getBookmark=function(f,m){function n(a,b){var c=0;return h.each(i.select(a),function(a){if("all"!==a.getAttribute("data-mce-bogus"))return a!=b&&void c++}),c}function o(a){function b(b){var c,d,e,f=b?"start":"end";c=a[f+"Container"],d=a[f+"Offset"],1==c.nodeType&&"TR"==c.nodeName&&(e=c.childNodes,c=e[Math.min(b?d:d-1,e.length-1)],c&&(d=b?0:c.childNodes.length,a["set"+(b?"Start":"End")](c,d)))}return b(!0),b(),a}function p(a){function b(a,b){var d,e=a[b?"startContainer":"endContainer"],f=a[b?"startOffset":"endOffset"],g=[],h=0;for(3===e.nodeType?g.push(m?k(e,f):f):(d=e.childNodes,f>=d.length&&d.length&&(h=1,f=Math.max(0,d.length-1)),g.push(i.nodeIndex(d[f],m)+h));e&&e!=c;e=e.parentNode)g.push(i.nodeIndex(e,m));return g}var c=i.getRoot(),d={};return d.start=b(a,!0),g.isCollapsed()||(d.end=b(a)),d}function q(a){function c(a,c){var f;if(d.isElement(a)&&(a=e.getNode(a,c),j(a)))return a;if(b.isCaretContainer(a)){if(d.isText(a)&&b.isCaretContainerBlock(a)&&(a=a.parentNode),f=a.previousSibling,j(f))return f;if(f=a.nextSibling,j(f))return f}}return c(a.startContainer,a.startOffset)||c(a.endContainer,a.endOffset)}var r,s,t,u,v,w,x,y="";if(2==f)return w=g.getNode(),v=w?w.nodeName:null,r=g.getRng(),j(w)||"IMG"==v?{name:v,index:n(v,w)}:g.tridentSel?g.tridentSel.getBookmark(f):(w=q(r),w?(v=w.tagName,{name:v,index:n(v,w)}):p(r));if(3==f)return r=g.getRng(),{start:a.create(i.getRoot(),c.fromRangeStart(r)),end:a.create(i.getRoot(),c.fromRangeEnd(r))};if(f)return{rng:g.getRng()};if(r=g.getRng(),t=i.uniqueId(),u=g.isCollapsed(),x="overflow:hidden;line-height:0px",r.duplicate||r.item){if(r.item)return w=r.item(0),v=w.nodeName,{name:v,index:n(v,w)};s=r.duplicate();try{r.collapse(),r.pasteHTML(''+y+""),u||(s.collapse(!1),r.moveToElementText(s.parentElement()),0===r.compareEndPoints("StartToEnd",s)&&s.move("character",-1),s.pasteHTML(''+y+""))}catch(a){return null}}else{if(w=g.getNode(),v=w.nodeName,"IMG"==v)return{name:v,index:n(v,w)};if(s=o(r.cloneRange()),!u){s.collapse(!1);var z=i.create("span",{"data-mce-type":"bookmark",id:t+"_end",style:x},y);s.insertNode(z),l(z.nextSibling)}r=o(r),r.collapse(!0);var A=i.create("span",{"data-mce-type":"bookmark",id:t+"_start",style:x},y);r.insertNode(A),l(A.previousSibling)}return g.moveToBookmark({id:t,keep:1}),{id:t}},this.moveToBookmark=function(b){function c(a){var c,d,e,f,g=b[a?"start":"end"];if(g){for(e=g[0],d=l,c=g.length-1;c>=1;c--){if(f=d.childNodes,g[c]>f.length-1)return;d=f[g[c]]}3===d.nodeType&&(e=Math.min(g[0],d.nodeValue.length)),1===d.nodeType&&(e=Math.min(g[0],d.childNodes.length)),a?k.setStart(d,e):k.setEnd(d,e)}return!0}function d(a){var c,d,e,g,j=i.get(b.id+"_"+a),k=b.keep;if(j&&(c=j.parentNode,"start"==a?(k?(c=j.firstChild,d=1):d=i.nodeIndex(j),m=n=c,o=p=d):(k?(c=j.firstChild,d=1):d=i.nodeIndex(j),n=c,p=d),!k)){for(g=j.previousSibling,e=j.nextSibling,h.each(h.grep(j.childNodes),function(a){3==a.nodeType&&(a.nodeValue=a.nodeValue.replace(/\uFEFF/g,""))});j=i.get(b.id+"_"+a);)i.remove(j,1);g&&e&&g.nodeType==e.nodeType&&3==g.nodeType&&!f.opera&&(d=g.nodeValue.length,g.appendData(e.nodeValue),i.remove(e),"start"==a?(m=n=g,o=p=d):(n=g,p=d))}}function e(a){return!i.isBlock(a)||a.innerHTML||f.ie||(a.innerHTML='
'),a}function j(){var c,d;return c=i.createRng(),d=a.resolve(i.getRoot(),b.start),c.setStart(d.container(),d.offset()),d=a.resolve(i.getRoot(),b.end),c.setEnd(d.container(),d.offset()),c}var k,l,m,n,o,p;if(b)if(h.isArray(b.start)){if(k=i.createRng(),l=i.getRoot(),g.tridentSel)return g.tridentSel.moveToBookmark(b);c(!0)&&c()&&g.setRng(k)}else"string"==typeof b.start?g.setRng(j(b)):b.id?(d("start"),d("end"),m&&(k=i.createRng(),k.setStart(e(m),o),k.setEnd(e(n),p),g.setRng(k))):b.name?g.select(i.select(b.name)[b.index]):b.rng&&g.setRng(b.rng)}}var j=d.isContentEditableFalse,k=function(a,b){var c,d;for(d=g.trim(a.data.slice(0,b)).length,c=a.previousSibling;c&&3===c.nodeType;c=c.previousSibling)d+=g.trim(c.data).length;return d},l=function(a){d.isText(a)&&0===a.data.length&&a.parentNode.removeChild(a)};return i.isBookmarkNode=function(a){return a&&"SPAN"===a.tagName&&"bookmark"===a.getAttribute("data-mce-type")},i}),g("4d",["u","c"],function(a,b){function c(b){this.compare=function(c,e){function f(a){var c={};return d(b.getAttribs(a),function(d){var e=d.nodeName.toLowerCase();0!==e.indexOf("_")&&"style"!==e&&0!==e.indexOf("data-")&&(c[e]=b.getAttrib(a,e))}),c}function g(a,b){var c,d;for(d in a)if(a.hasOwnProperty(d)){if(c=b[d],"undefined"==typeof c)return!1;if(a[d]!=c)return!1;delete b[d]}for(d in b)if(b.hasOwnProperty(d))return!1;return!0}return c.nodeName==e.nodeName&&(!!g(f(c),f(e))&&(!!g(b.parseStyle(b.getAttrib(c,"style")),b.parseStyle(b.getAttrib(e,"style")))&&(!a.isBookmarkNode(c)&&!a.isBookmarkNode(e))))}}var d=b.each;return c}),g("5n",["49","f","1t","20","1u","4a"],function(a,b,c,d,e,f){function g(a){return a>0}function h(a){return a<0}function i(a,b){for(var c;c=a(b);)if(!y(c))return c;return null}function j(a,c,d,e,f){var j=new b(a,e);if(h(c)){if((v(a)||y(a))&&(a=i(j.prev,!0),d(a)))return a;for(;a=i(j.prev,f);)if(d(a))return a}if(g(c)){if((v(a)||y(a))&&(a=i(j.next,!0),d(a)))return a;for(;a=i(j.next,f);)if(d(a))return a}return null}function k(a,b){for(a=a.parentNode;a&&a!=b;a=a.parentNode)if(u(a))return a;return b}function l(a,b){for(;a&&a!=b;){if(w(a))return a;a=a.parentNode}return null}function m(a,b,c){return l(a.container(),c)==l(b.container(),c)}function n(a,b,c){return k(a.container(),c)==k(b.container(),c)}function o(a,b){var c,d;return b?(c=b.container(),d=b.offset(),A(c)?c.childNodes[d+a]:null):null}function p(a,b){var c=b.ownerDocument.createRange();return a?(c.setStartBefore(b),c.setEndBefore(b)):(c.setStartAfter(b),c.setEndAfter(b)),c}function q(a,b,c){return l(b,a)==l(c,a)}function r(a,b,c){var d,e;for(e=a?"previousSibling":"nextSibling";c&&c!=b;){if(d=c[e],x(d)&&(d=d[e]),v(d)){if(q(b,d,c))return d;break}if(B(d))break;c=c.parentNode}return null}function s(a,b,d){var f,g,h,i,j=z(r,!0,b),k=z(r,!1,b);if(g=d.startContainer,h=d.startOffset,e.isCaretContainerBlock(g)){if(A(g)||(g=g.parentNode),i=g.getAttribute("data-mce-caret"),"before"==i&&(f=g.nextSibling,v(f)))return C(f);if("after"==i&&(f=g.previousSibling,v(f)))return D(f)}if(!d.collapsed)return d;if(c.isText(g)){if(x(g)){if(1===a){if(f=k(g))return C(f);if(f=j(g))return D(f)}if(a===-1){if(f=j(g))return D(f);if(f=k(g))return C(f)}return d}if(e.endsWithCaretContainer(g)&&h>=g.data.length-1)return 1===a&&(f=k(g))?C(f):d;if(e.startsWithCaretContainer(g)&&h<=1)return a===-1&&(f=j(g))?D(f):d;if(h===g.data.length)return f=k(g),f?C(f):d;if(0===h)return f=j(g),f?D(f):d}return d}function t(a,b){return v(o(a,b))}var u=c.isContentEditableTrue,v=c.isContentEditableFalse,w=c.matchStyleValues("display","block table table-cell table-caption list-item"),x=e.isCaretContainer,y=e.isCaretContainerBlock,z=a.curry,A=c.isElement,B=f.isCaretCandidate,C=z(p,!0),D=z(p,!1);return{isForwards:g,isBackwards:h,findNode:j,getEditingHost:k,getParentBlock:l,isInSameBlock:m,isInSameEditingHost:n,isBeforeContentEditableFalse:z(t,0),isAfterContentEditableFalse:z(t,-1),normalizeRange:s}}),g("52",["1t","4a","20","5n","1q","49"],function(a,b,c,d,e,f){function g(a,b){for(var c=[];a&&a!=b;)c.push(a),a=a.parentNode;return c}function h(a,b){return a.hasChildNodes()&&b0)return c(v,--w);if(p(a)&&w0&&(y=h(v,w-1),r(y)))return!s(y)&&(z=d.findNode(y,a,t,y))?m(z)?c(z,z.data.length):c.after(z):m(y)?c(y,y.data.length):c.before(y);if(p(a)&&w1)throw c.error("HTML does not have a single root node",a),"HTML must have a single root node";return h(f.childNodes[0])},f=function(a,b){var c=b||d,e=c.createElement(a);return h(e)},g=function(a,b){var c=b||d,e=c.createTextNode(a);return h(e)},h=function(c){if(null===c||void 0===c)throw new b("Node cannot be null or undefined");return{dom:a.constant(c)}};return{fromHtml:e,fromTag:f,fromText:g,fromDom:h}}),g("58",["3","5i"],function(a,b){var c=function(c){if(null===c)return"null";var d=typeof c;return"object"===d&&a.prototype.isPrototypeOf(c)?"array":"object"===d&&b.prototype.isPrototypeOf(c)?"string":d},d=function(a){return function(b){return c(b)===a}};return{isString:d("string"),isObject:d("object"),isArray:d("array"),isNull:d("null"),isBoolean:d("boolean"),isUndefined:d("undefined"),isFunction:d("function"),isNumber:d("number")}}),g("71",["45","1","3","4"],function(a,b,c,d){return function(){var e=arguments;return function(){for(var f=new c(arguments.length),g=0;g0&&e.unsuppMessage(m);var n={};return a.each(h,function(a){n[a]=b.constant(f[a])}),a.each(i,function(a){n[a]=b.constant(g.prototype.hasOwnProperty.call(f,a)?d.some(f[a]):d.none())}),n}}}),g("6d",["71","72"],function(a,b){return{immutable:a,immutableBag:b}}),g("6e",[],function(){var a=function(a,b){var c=[],d=function(a){return c.push(a),b(a)},e=b(a);do e=e.bind(d);while(e.isSome());return c};return{toArray:a}}),g("73",[],function(){return"undefined"!=typeof window?window:Function("return this;")()}),g("6f",["73"],function(a){var b=function(b,c){for(var d=void 0!==c?c:a,e=0;e0&&b0&&b.before(a,d),e(a)};return{empty:d,remove:e,unwrap:f}}),g("4s",["4m"],function(a){var b=function(a){var b=a.dom().nodeName;return b.toLowerCase()},c=function(a){return a.dom().nodeType},d=function(a){return a.dom().nodeValue},e=function(a){return function(b){return c(b)===a}},f=function(d){return c(d)===a.COMMENT||"#comment"===b(d)},g=e(a.ELEMENT),h=e(a.TEXT),i=e(a.DOCUMENT);return{name:b,type:c,value:d,isElement:g,isText:h,isDocument:i,isComment:f}}),g("6n",["5q","1w","4s","28"],function(a,b,c,d){var e=function(a){var b=c.isText(a)?a.dom().parentNode:a.dom();return void 0!==b&&null!==b&&b.ownerDocument.body.contains(b)},f=a.cached(function(){return g(b.fromDom(d))}),g=function(a){var c=a.dom().body;if(null===c||void 0===c)throw"Body is not available yet";return b.fromDom(c)};return{body:f,getBody:g,inBody:e}}),g("6l",["45","6n","5t"],function(a,b,c){var d=function(a){return h(b.body(),a)},e=function(b,d,e){return a.filter(c.parents(b,e),d)},f=function(b,d){return a.filter(c.siblings(b),d)},g=function(b,d){return a.filter(c.children(b),d)},h=function(b,d){var e=[];return a.each(c.children(b),function(a){d(a)&&(e=e.concat([a])),e=e.concat(h(a,d))}),e};return{all:d,ancestors:e,siblings:f,children:g,descendants:h}}),g("62",["6l","1x"],function(a,b){var c=function(a){return b.all(a)},d=function(c,d,e){return a.ancestors(c,function(a){return b.is(a,d)},e)},e=function(c,d){return a.siblings(c,function(a){return b.is(a,d)})},f=function(c,d){return a.children(c,function(a){return b.is(a,d)})},g=function(a,c){return b.all(c,a)};return{all:c,ancestors:d,siblings:e,children:f,descendants:g}}),g("4t",["45","1","4s"],function(a,b,c){var d=["article","aside","details","div","dt","figcaption","footer","form","fieldset","header","hgroup","html","main","nav","section","summary","body","p","dl","multicol","dd","figure","address","center","blockquote","h1","h2","h3","h4","h5","h6","listing","xmp","pre","plaintext","menu","dir","ul","ol","li","hr","table","tbody","thead","tfoot","th","tr","td","caption"],e=["area","base","basefont","br","col","frame","hr","img","input","isindex","link","meta","param","embed","source","wbr","track"],f=["td","th"],g=["h1","h2","h3","h4","h5","h6","p","div","address","pre","form","blockquote","center","dir","fieldset","header","footer","article","section","hgroup","aside","nav","figure"],h=["h1","h2","h3","h4","h5","h6"],i=function(d){var e;return function(f){return e=e?e:a.mapToObject(d,b.constant(!0)),e.hasOwnProperty(c.name(f))}},j=i(h),k=i(d),l=function(a){return c.isElement(a)&&!k(a)},m=function(a){return c.isElement(a)&&"br"===c.name(a)};return{isBlock:k,isInline:l,isHeading:j,isTextBlock:i(g),isVoid:i(e),isTableCell:i(f),isBr:m}}),g("5o",["45","4p","5w","1w","62","4t"],function(a,b,c,d,e,f){var g=function(a){for(var b=[],c=a.dom();c;)b.push(d.fromDom(c)),c=c.lastChild;return b},h=function(b){var d=e.descendants(b,"br"),h=a.filter(g(b).slice(-1),f.isBr);d.length===h.length&&a.each(h,c.remove)},i=function(a){c.empty(a),b.append(a,d.fromHtml('
'))};return{removeTrailingBr:h,fillWithPaddingBr:i}}),g("4h",["f"],function(a){var b=function(a){return a&&/^(IMG)$/.test(a.nodeName)},c=function(c,d,e){var f,h,i,j=e.startContainer,k=e.startOffset;if((e.startContainer!==e.endContainer||!b(e.startContainer.childNodes[e.startOffset]))&&(3===j.nodeType&&k>=j.nodeValue.length&&(k=c.nodeIndex(j),j=j.parentNode),1===j.nodeType))for(i=j.childNodes,k0&&3===c.node.nodeType&&" "===c.node.nodeValue.charAt(c.offset-1)&&c.offset>1&&(a=c.node,a.splitText(c.offset-1))}return a},j=function(a){return"BR"===a.nodeName&&a.getAttribute("data-mce-bogus")&&!a.nextSibling},k=function(a,h,k,l){var m,n,o=h.startContainer,p=h.startOffset,q=h.endContainer,r=h.endOffset,s=a.dom,t=function(a){var b,c,e,g,h;if(b=c=a?o:q,g=a?"previousSibling":"nextSibling",h=s.getRoot(),3===b.nodeType&&!f(b)&&(a?p>0:rm?m:p],3===o.nodeType&&(p=0)),1===q.nodeType&&q.hasChildNodes()&&(m=q.childNodes.length-1,q=q.childNodes[r>m?m:r-1],3===q.nodeType&&(r=q.nodeValue.length));var u=function(a){for(var b=a;b;){if(1===b.nodeType&&s.getContentEditable(b))return"false"===s.getContentEditable(b)?b:a;b=b.parentNode}return a},v=function(c,d,e){var f,g,h,i,j=function(a,b){var c,d,f=a.nodeValue;return"undefined"==typeof b&&(b=e?f.length:0),e?(c=f.lastIndexOf(" ",b),d=f.lastIndexOf("\xa0",b),c=c>d?c:d,c===-1||l||c++):(c=f.indexOf(" ",b),d=f.indexOf("\xa0",b),c=c!==-1&&(d===-1||c=0;g--){if(h=i[g].selector,!h||i[g].defaultBlock)return!0;for(f=e.length-1;f>=0;f--)if(j.is(e[f],h))return!0}return!1};return{matchNode:g,matchName:e,match:h,matchAll:i,canApply:j,matchesUnInheritedFormatSelector:c}}),g("4f",["45","1w","5o","k","f","4g","4h","1l","1v","49","c"],function(a,b,c,d,e,f,g,h,i,j,k){var l=i.ZWSP,m="_mce_caret",n=!1,o=function(a){return 1===a.nodeType&&a.id===m},p=function(a,b){for(;a;){if(3===a.nodeType&&a.nodeValue!==l||a.childNodes.length>1)return!1;b&&1===a.nodeType&&b.push(a),a=a.firstChild}return!0},q=function(a){var b;if(a)for(b=new e(a,a),a=b.current();a;a=b.next())if(3===a.nodeType)return a;return null},r=function(a,b){var c=a.create("span",{id:m,"data-mce-bogus":"1",style:n?"color:red":""});return b&&c.appendChild(a.doc.createTextNode(l)),c},s=function(a){for(;a;){if(a.id===m)return a;a=a.parentNode}},t=function(a,b){var c;c=s(b.getStart()),c&&!a.isEmpty(c)&&k.walk(c,function(b){1!==b.nodeType||b.id===m||a.isEmpty(b)||a.setAttrib(b,"data-mce-bogus",null)},"childNodes")},u=function(a){var b=q(a);return b&&b.nodeValue.charAt(0)===l&&b.deleteData(0,1),b},v=function(a,d,e,f){var g,h,i;g=d.getRng(!0),h=a.getParent(e,a.isBlock),p(e)?(f!==!1&&(g.setStartBefore(e),g.setEndBefore(e)),a.remove(e)):(i=u(e),g.startContainer===i&&g.startOffset>0&&g.setStart(i,g.startOffset-1),g.endContainer===i&&g.endOffset>0&&g.setEnd(i,g.endOffset-1),a.remove(e,!0)),h&&a.isEmpty(h)&&c.fillWithPaddingBr(b.fromDom(h)),d.setRng(g)},w=function(a,b,c,d){if(c)v(a,b,c,d);else if(c=s(b.getStart()),!c)for(;c=a.get(m);)v(a,b,c,!1)},x=function(a,d,e){var f=a.dom,h=f.getParent(e,j.curry(g.isTextBlock,a));h&&f.isEmpty(h)?e.parentNode.replaceChild(d,e):(c.removeTrailingBr(b.fromDom(e)),f.isEmpty(e)?e.parentNode.replaceChild(d,e):f.insertAfter(d,e))},y=function(a,b){return a.appendChild(b),b},z=function(b,c){var d=a.foldr(b,function(a,b){return y(a,b.cloneNode(!1))},c);return y(d,d.ownerDocument.createTextNode(l))},A=function(a){a._hasCaretEvents||(D(a),a._hasCaretEvents=!0)},B=function(a,b,c){var e,g,h,i,j,k,m,n=a.dom,o=a.selection;A(a),e=o.getRng(!0),i=e.startOffset,k=e.startContainer,m=k.nodeValue,g=s(o.getStart()),g&&(h=q(g));var p=/[^\s\u00a0\u00ad\u200b\ufeff]/;m&&i>0&&i
").append(b.childNodes)}var i,j,k=d.selection.getRng();i=b.matchNodeNames("pre"),k.collapsed||(j=d.selection.getSelectedBlocks(),h(g(g(j,i),e),function(a){f(a.previousSibling,a)}))}),{postProcess:e}}),g("1n",["1","u","k","f","4f","4g","4h","1l","c"],function(a,b,c,d,e,f,g,h,i){var j=/^(src|href|style)$/,k=i.each,l=g.isEq,m=function(a){return/^(TH|TD)$/.test(a.nodeName)},n=function(a,b,c){var e,f,g;return e=b[c?"startContainer":"endContainer"],f=b[c?"startOffset":"endOffset"],1===e.nodeType&&(g=e.childNodes.length-1,!c&&f&&f--,e=e.childNodes[f>g?g:f]),3===e.nodeType&&c&&f>=e.nodeValue.length&&(e=new d(e,a.getBody()).next()||e),3!==e.nodeType||c||0!==f||(e=new d(e,a.getBody()).prev()||e),e},o=function(a,b,c,d){var e=a.create(c,d);return b.parentNode.insertBefore(e,b),e.appendChild(b),e},p=function(a,b,c){return!!l(b,c.inline)||(!!l(b,c.block)||(c.selector?1===b.nodeType&&a.is(b,c.selector):void 0))},q=function(a,b){return b.links&&"A"===a.tagName},r=function(a,b,c,d){return b=g.getNonWhiteSpaceSibling(b,c,d),!b||"BR"===b.nodeName||a.isBlock(b)},s=function(a,b,c){var d,e=b.parentNode,f=a.dom,h=a.settings.forced_root_block;c.block&&(h?e===f.getRoot()&&(c.list_block&&l(b,c.list_block)||k(i.grep(b.childNodes),function(b){g.isValid(a,h,b.nodeName.toLowerCase())?d?d.appendChild(b):(d=o(f,b,h),f.setAttribs(d,a.settings.forced_root_block_attrs)):d=0})):f.isBlock(b)&&!f.isBlock(e)&&(r(f,b,!1)||r(f,b.firstChild,!0,1)||b.insertBefore(f.create("br"),b.firstChild),r(f,b,!0)||r(f,b.lastChild,!1,1)||b.appendChild(f.create("br")))),c.selector&&c.inline&&!l(c.inline,b)||f.remove(b,1)},t=function(a,b,c,d,e){var f,h,i,m=a.dom;if(!p(m,d,b)&&!q(d,b))return!1;if("all"!==b.remove)for(k(b.styles,function(a,f){a=g.normalizeStyleValue(m,g.replaceVars(a,c),f),"number"==typeof f&&(f=a,e=0),(b.remove_similar||!e||l(g.getStyle(m,e,f),a))&&m.setStyle(d,f,""),i=1}),i&&""===m.getAttrib(d,"style")&&(d.removeAttribute("style"),d.removeAttribute("data-mce-style")),k(b.attributes,function(a,b){var f;if(a=g.replaceVars(a,c),"number"==typeof b&&(b=a,e=0),!e||l(m.getAttrib(e,b),a)){if("class"===b&&(a=m.getAttrib(d,b),a&&(f="",k(a.split(/\s+/),function(a){/mce\-\w+/.test(a)&&(f+=(f?" ":"")+a)}),f)))return void m.setAttrib(d,b,f);"class"===b&&d.removeAttribute("className"),j.test(b)&&d.removeAttribute("data-mce-"+b),d.removeAttribute(b)}}),k(b.classes,function(a){a=g.replaceVars(a,c),e&&!m.hasClass(e,a)||m.removeClass(d,a)}),h=m.getAttribs(d),f=0;f0)return c;if(c.childNodes.length>1||c===a||"BR"===c.tagName)return c}},y=function(a){var b=d.normalize(a.selection.getRng()),c=b.startContainer,e=b.endContainer;if(c!==e&&0===b.endOffset){var f=x(c,e),g=3===f.nodeType?f.data.length:f.childNodes.length;b.setEnd(f,g)}return b},z=function(b,c,d,f){var v,x,A=b.formatter.get(c),B=A[0],C=!f&&b.selection.isCollapsed(),D=b.dom,E=b.selection,F=function(a,b){if(b=b||B,a){if(b.onformat&&b.onformat(a,b,d,f),o(b.styles,function(b,c){D.setStyle(a,c,i.replaceVars(b,d))}),b.styles){var c=D.getAttrib(a,"style");c&&a.setAttribute("data-mce-style",c)}o(b.attributes,function(b,c){D.setAttrib(a,c,i.replaceVars(b,d))}),o(b.classes,function(b){b=i.replaceVars(b,d),D.hasClass(a,b)||D.addClass(a,b)})}},G=function(a,b){var c=!1;return!!B.selector&&(o(a,function(a){if(!("collapsed"in a&&a.collapsed!==C))return D.is(b,a.selector)&&!g.isCaretNode(b)?(F(b,a),c=!0,!1):void 0}),c)},H=function(f,h,j,m){var q,s,u=[],v=!0;q=B.inline||B.block,s=f.create(q),F(s),new e(f).walk(h,function(a){var e,h=function(a){var j,l,p,r;if(r=v,j=a.nodeName.toLowerCase(),l=a.parentNode.nodeName.toLowerCase(),1===a.nodeType&&f.getContentEditable(a)&&(r=v,v="true"===f.getContentEditable(a),p=!0),i.isEq(j,"br"))return e=0,void(B.block&&f.remove(a));if(B.wrapper&&k.matchNode(b,a,c,d))return void(e=0);if(v&&!p&&B.block&&!B.wrapper&&i.isTextBlock(b,j)&&i.isValid(b,l,q))return a=f.rename(a,q),F(a),u.push(a),void(e=0);if(B.selector){var t=G(A,a);if(!B.inline||t)return void(e=0)}!v||p||!i.isValid(b,q,j)||!i.isValid(b,l,q)||!m&&3===a.nodeType&&1===a.nodeValue.length&&65279===a.nodeValue.charCodeAt(0)||g.isCaretNode(a)||B.inline&&f.isBlock(a)?(e=0,o(n.grep(a.childNodes),h),p&&(v=r),e=0):(e||(e=f.clone(s,!1),a.parentNode.insertBefore(e,a),u.push(e)),e.appendChild(a))};o(a,h)}),B.links===!0&&o(u,function(a){var b=function(a){"A"===a.nodeName&&F(a,B),o(n.grep(a.childNodes),b)};b(a)}),o(u,function(e){var g,h=function(b){var c=0;return o(b.childNodes,function(b){i.isWhiteSpaceNode(b)||a.isBookmarkNode(b)||c++}),c},j=function(a){var b=!1;return o(a.childNodes,function(a){if(p(a))return b=a,!1}),b},m=function(a,b){do{if(1!==h(a))break;if(a=j(a),!a)break;if(b(a))return a}while(a);return null},n=function(b){var c,d;return c=j(b),c&&!a.isBookmarkNode(c)&&k.matchName(f,c,B)&&(d=f.clone(c,!1),F(d),f.replace(d,b,!0),f.remove(c,1)),d||b};if(g=h(e),(u.length>1||!f.isBlock(e))&&0===g)return void f.remove(e,1);if(B.inline||B.wrapper){if(B.exact||1!==g||(e=n(e)),o(A,function(a){o(f.select(a.inline,e),function(c){p(c)&&l.removeFormat(b,a,d,c,a.exact?c:null)}),r(f,a,e)}),k.matchNode(b,e.parentNode,c,d)&&l.removeFormat(b,B,d,e)&&(e=0),B.merge_with_parents&&f.getParent(e.parentNode,function(a){if(k.matchNode(b,a,c,d))return l.removeFormat(b,B,d,e)&&(e=0),!0}),e&&!f.isBlock(e)&&!i.getStyle(f,e,"fontSize")){var q=m(e,t(f,"fontSize"));q&&z(b,"fontsize",{value:i.getStyle(f,q,"fontSize")},e)}e&&B.merge_siblings!==!1&&(e=w(f,i.getNonWhiteSpaceSibling(e),e),e=w(f,e,i.getNonWhiteSpaceSibling(e,!0)))}})};if("false"!==D.getContentEditable(E.getNode())){if(B){if(f)f.nodeType?G(A,f)||(x=D.createRng(),x.setStartBefore(f),x.setEndAfter(f),H(D,h.expandRng(b,x,A),null,!0)):H(D,f,null,!0);else if(C&&B.inline&&!D.select("td[data-mce-selected],th[data-mce-selected]").length)g.applyCaretFormat(b,c,d);else{var I=b.selection.getNode();b.settings.forced_root_block||!A[0].defaultBlock||D.getParent(I,D.isBlock)||z(b,A[0].defaultBlock),b.selection.setRng(y(b)),v=E.getBookmark(),H(D,h.expandRng(b,E.getRng(!0),A),v),B.styles&&((B.styles.color||B.styles.textDecoration)&&(n.walk(I,m.curry(s,D),"childNodes"),s(D,I)),B.styles.backgroundColor&&q(I,t(D,"fontSize"),u(D,"backgroundColor",i.replaceVars(B.styles.backgroundColor,d)))),E.moveToBookmark(v),i.moveStart(D,E,E.getRng(!0)),b.nodeChanged()}j.postProcess(c,b)}}else{f=E.getNode();for(var J=0,K=A.length;J0&&c[0],m=l&&l.name;if(k=g(a,m))m===k?(i=c[0],c=c.slice(1)):i=k;else if(l)i=c[0],c=c.slice(1);else if(!d)return a;return i&&(e=f(i),e.appendChild(a)),d&&(e||(e=j.create("div"),e.appendChild(a)),b.each(d,function(b){var c=f(b);e.insertBefore(c,a)})),h(e,c,i&&i.siblings)}var i,k,l,m=d&&d.schema||new c({});return a&&a.length?(k=a[0],i=f(k),l=j.create("div"),l.appendChild(h(i,a.slice(1),k.siblings)),l):""}function e(a,b){return d(g(a),b)}function f(a){var c,d={classes:[],attrs:{}};return a=d.selector=b.trim(a),"*"!==a&&(c=a.replace(/(?:([#\.]|::?)([\w\-]+)|(\[)([^\]]+)\]?)/g,function(a,c,e,f,g){switch(c){case"#":d.attrs.id=e;break;case".":d.classes.push(e);break;case":":b.inArray("checked disabled enabled read-only required".split(" "),e)!==-1&&(d.attrs[e]=e)}if("["===f){var h=g.match(/([\w\-]+)(?:\=\"([^\"]+))?/);h&&(d.attrs[h[1]]=h[2])}return""})),d.name=c||"div",d}function g(a){return a&&"string"==typeof a?(a=a.split(/\s*,\s*/)[0],a=a.replace(/\s*(~\+|~|\+|>)\s*/g,"$1"),b.map(a.split(/(?:>|\s+(?![^\[\]]+\]))/),function(a){var c=b.map(a.split(/(?:~\+|~|\+)/),f),d=c.pop();return c.length&&(d.siblings=c),d}).reverse()):[]}function h(a,b){function c(a){return a.replace(/%(\w+)/g,"")}var e,f,h,k,l,m,n="";if(m=a.settings.preview_styles,m===!1)return"";if("string"!=typeof m&&(m="font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow"),"string"==typeof b){if(b=a.formatter.get(b),!b)return;b=b[0]}return"preview"in b&&(m=b.preview,m===!1)?"":(e=b.block||b.inline||"span",k=g(b.selector),k.length?(k[0].name||(k[0].name=e),e=b.selector,f=d(k,a)):f=d([e],a),h=j.select(e,f)[0]||f.firstChild,i(b.styles,function(a,b){a=c(a),a&&j.setStyle(h,b,a)}),i(b.attributes,function(a,b){a=c(a),a&&j.setAttrib(h,b,a)}),i(b.classes,function(a){a=c(a),j.hasClass(h,a)||j.addClass(h,a)}),a.fire("PreviewFormats"),j.setStyles(f,{position:"absolute",left:-65535}),a.getBody().appendChild(f),l=j.getStyle(a.getBody(),"fontSize",!0),l=/px$/.test(l)?parseInt(l,10):0,i(m.split(" "),function(b){var c=j.getStyle(h,b,!0);if(!("background-color"===b&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(c)&&(c=j.getStyle(a.getBody(),b,!0),"#ffffff"===j.toHex(c).toLowerCase())||"color"===b&&"#000000"===j.toHex(c).toLowerCase())){if("font-size"===b&&/em|%$/.test(c)){if(0===l)return;c=parseFloat(c,10)/(/%$/.test(c)?100:1),c=c*l+"px"}"border"===b&&c&&(n+="padding:0 2px;"),n+=b+":"+c+";"}}),a.fire("AfterPreviewFormats"),j.remove(f),n)}var i=b.each,j=a.DOM;return{getCssText:h,parseSelector:g,selectorToHtml:e}}),g("1o",["1i","1l","1n"],function(a,b,c){var d=function(d,e,f,g,h){var i=e.get(f);!b.match(d,f,g,h)||"toggle"in i[0]&&!i[0].toggle?a.applyFormat(d,f,g,h):c.remove(d,f,g,h)};return{toggle:d}}),g("1p",[],function(){var a=function(a){a.addShortcut("meta+b","","Bold"),a.addShortcut("meta+i","","Italic"),a.addShortcut("meta+u","","Underline");for(var b=1;b<=6;b++)a.addShortcut("access+"+b,"",["FormatBlock",!1,"h"+b]);a.addShortcut("access+7","",["FormatBlock",!1,"p"]),a.addShortcut("access+8","",["FormatBlock",!1,"div"]),a.addShortcut("access+9","",["FormatBlock",!1,"address"])};return{setup:a}}),g("5",["1h","1","1i","1j","1k","1l","1m","1n","1o","1p"],function(a,b,c,d,e,f,g,h,i,j){return function(k){var l=e(k),m=a(null);return j.setup(k),{get:l.get,register:l.register,unregister:l.unregister,apply:b.curry(c.applyFormat,k),remove:b.curry(h.remove,k),toggle:b.curry(i.toggle,k,l),match:b.curry(f.match,k),matchAll:b.curry(f.matchAll,k),matchNode:b.curry(f.matchNode,k),canApply:b.curry(f.canApply,k),formatChanged:b.curry(d.formatChanged,k,m),getCssText:b.curry(g.getCssText,k)}}}),g("6",[],function(){"use strict";function a(a,b,c){var d,e,g,h,i,k;return d=b.x,e=b.y,g=a.w,h=a.h,i=b.w,k=b.h,c=(c||"").split(""),"b"===c[0]&&(e+=k),"r"===c[1]&&(d+=i),"c"===c[0]&&(e+=j(k/2)),"c"===c[1]&&(d+=j(i/2)),"b"===c[3]&&(e-=h),"r"===c[4]&&(d-=g),"c"===c[3]&&(e-=j(h/2)),"c"===c[4]&&(d-=j(g/2)),f(d,e,g,h)}function b(b,c,d,e){var f,g;for(g=0;g=d.x&&f.x+f.w<=d.w+d.x&&f.y>=d.y&&f.y+f.h<=d.h+d.y)return e[g];return null}function c(a,b,c){return f(a.x-b,a.y-c,a.w+2*b,a.h+2*c)}function d(a,b){var c,d,e,g;return c=i(a.x,b.x),d=i(a.y,b.y),e=h(a.x+a.w,b.x+b.w),g=h(a.y+a.h,b.y+b.h),e-c<0||g-d<0?null:f(c,d,e-c,g-d)}function e(a,b,c){var d,e,g,h,j,k,l,m,n,o;return j=a.x,k=a.y,l=a.x+a.w,m=a.y+a.h,n=b.x+b.w,o=b.y+b.h,d=i(0,b.x-j),e=i(0,b.y-k),g=i(0,l-n),h=i(0,m-o),j+=d,k+=e,c&&(l+=d,m+=e,j-=g,k-=h),l-=g,m-=h,f(j,k,l-j,m-k)}function f(a,b,c,d){return{x:a,y:b,w:c,h:d}}function g(a){return f(a.left,a.top,a.width,a.height)}var h=Math.min,i=Math.max,j=Math.round;return{inflate:c,relativePosition:a,findBestRelativePosition:b,intersect:d,clamp:e,create:f,fromClientRect:g}}),g("i",["h","c"],function(a,b){function c(){function a(a,c,e){function f(){k.remove(j),i&&(i.onreadystatechange=i.onload=i=null),c()}function h(){g(e)?e():"undefined"!=typeof console&&console.log&&console.log("Failed to load script: "+a)}var i,j,k=d;j=k.uniqueId(),i=document.createElement("script"),i.id=j,i.type="text/javascript",i.src=b._addCacheSuffix(a),"onreadystatechange"in i?i.onreadystatechange=function(){/loaded|complete/.test(i.readyState)&&f()}:i.onload=f,i.onerror=h,(document.getElementsByTagName("head")[0]||document.body).appendChild(i)}var c,h=0,i=1,j=2,k=3,l={},m=[],n={},o=[],p=0;this.isDone=function(a){return l[a]==j},this.markDone=function(a){l[a]=j},this.add=this.load=function(a,b,d,e){var f=l[a];f==c&&(m.push(a),l[a]=h),b&&(n[a]||(n[a]=[]),n[a].push({success:b,failure:e,scope:d||this}))},this.remove=function(a){delete l[a],delete n[a]},this.loadQueue=function(a,b,c){this.loadScripts(m,a,b,c)},this.loadScripts=function(b,d,h,m){function q(a,b){e(n[b],function(b){g(b[a])&&b[a].call(b.scope)}),n[b]=c}var r,s=[];o.push({success:d,failure:m,scope:h||this}),(r=function(){var c=f(b);b.length=0,e(c,function(b){return l[b]===j?void q("success",b):l[b]===k?void q("failure",b):void(l[b]!==i&&(l[b]=i,p++,a(b,function(){l[b]=j,p--,q("success",b),r()},function(){l[b]=k,p--,s.push(b),q("failure",b),r()})))}),p||(e(o,function(a){0===s.length?g(a.success)&&a.success.call(a.scope):g(a.failure)&&a.failure.call(a.scope,s)}),o.length=0)})()}}var d=a.DOM,e=b.each,f=b.grep,g=function(a){return"function"==typeof a};return c.ScriptLoader=new c,c}),g("j",["i","c"],function(a,b){function c(){var a=this;a.items=[],a.urls={},a.lookup={}}var d=b.each;return c.prototype={get:function(a){if(this.lookup[a])return this.lookup[a].instance},dependencies:function(a){var b;return this.lookup[a]&&(b=this.lookup[a].dependencies),b||[]},requireLangPack:function(b,d){var e=c.language;if(e&&c.languageLoad!==!1){if(d)if(d=","+d+",",d.indexOf(","+e.substr(0,2)+",")!=-1)e=e.substr(0,2);else if(d.indexOf(","+e+",")==-1)return;a.ScriptLoader.add(this.urls[b]+"/langs/"+e+".js")}},add:function(a,b,c){return this.items.push(b),this.lookup[a]={instance:b,dependencies:c},b},remove:function(a){delete this.urls[a],delete this.lookup[a]},createUrl:function(a,b){return"object"==typeof b?b:{prefix:a.prefix,resource:b,suffix:a.suffix}},addComponents:function(b,c){var e=this.urls[b];d(c,function(b){a.ScriptLoader.add(e+"/"+b)})},load:function(b,e,f,g,h){function i(){var c=j.dependencies(b);d(c,function(a){var b=j.createUrl(e,a);j.load(b.resource,b,void 0,void 0)}),f&&(g?f.call(g):f.call(a))}var j=this,k=e;j.urls[b]||("object"==typeof e&&(k=e.prefix+e.resource+e.suffix),0!==k.indexOf("/")&&k.indexOf("://")==-1&&(k=c.baseURL+"/"+k),j.urls[b]=k.substring(0,k.lastIndexOf("/")),j.lookup[b]?i():a.ScriptLoader.add(k,i,g,h))}},c.PluginManager=new c,c.ThemeManager=new c,c}),g("l",[],function(){function a(a,b,c){var d,e,f=c?"lastChild":"firstChild",g=c?"prev":"next";if(a[f])return a[f];if(a!==b){if(d=a[g])return d;for(e=a.parent;e&&e!==b;e=e.parent)if(d=e[g])return d}}function b(a,b){this.name=a,this.type=b,1===b&&(this.attributes=[],this.attributes.map={})}var c=/^[ \t\r\n]*$/,d={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11};return b.prototype={replace:function(a){var b=this;return a.parent&&a.remove(),b.insert(a,b),b.remove(),b},attr:function(a,b){var c,d,e,f=this;if("string"!=typeof a){for(d in a)f.attr(d,a[d]);return f}if(c=f.attributes){if(b!==e){if(null===b){if(a in c.map)for(delete c.map[a],d=c.length;d--;)if(c[d].name===a)return c=c.splice(d,1),f;return f}if(a in c.map){for(d=c.length;d--;)if(c[d].name===a){c[d].value=b;break}}else c.push({name:a,value:b});return c.map[a]=b,f}return c.map[a]}},clone:function(){var a,c,d,e,f,g=this,h=new b(g.name,g.type);if(d=g.attributes){for(f=[],f.map={},a=0,c=d.length;a]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*|\/|\s+)>/g,f.lastIndex=d=c;e=f.exec(b);){if(d=f.lastIndex,"/"===e[1])h--;else if(!e[1]){if(e[2]in g)continue;h++}if(0===h)break}return d}function e(e,i){function j(){}var k=this;e=e||{},k.schema=i=i||new a,e.fix_self_closing!==!1&&(e.fix_self_closing=!0),f("comment cdata text start end pi doctype".split(" "),function(a){a&&(k[a]=e[a]||j)}),k.parse=function(a){function f(a){var b,c;for(b=Q.length;b--&&Q[b].name!==a;);if(b>=0){for(c=Q.length-1;c>=b;c--)a=Q[c],a.valid&&O.end(a.name);Q.length=b}}function j(a,b,c,d,f){var h,i,j=/[\s\u0000-\u001F]+/g;if(b=b.toLowerCase(),c=b in u?b:S(c||d||f||""),w&&!r&&g(b)===!1){if(h=B[b],!h&&C){for(i=C.length;i--&&(h=C[i],!h.pattern.test(b)););i===-1&&(h=null)}if(!h)return;if(h.validValues&&!(c in h.validValues))return}if(T[b]&&!e.allow_script_urls){var k=c.replace(j,"");try{k=decodeURIComponent(k)}catch(a){k=unescape(k)}if(U.test(k))return;if(!e.allow_html_data_urls&&V.test(k)&&!/^data:image\//i.test(k))return}r&&(b in T||0===b.indexOf("on"))||(n.map[b]=c,n.push({name:b,value:c}))}var k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O=this,P=0,Q=[],R=0,S=b.decode,T=c.makeMap("src,href,data,background,formaction,poster"),U=/((java|vb)script|mhtml):/i,V=/^data:/i;for(J=new RegExp("<(?:(?:!--([\\w\\W]*?)-->)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)>)|(?:([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)((?:\\s+[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*|\\/|\\s+)>))","g"),K=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g,t=i.getShortEndedElements(),I=e.self_closing_elements||i.getSelfClosingElements(),u=i.getBoolAttrs(),w=e.validate,s=e.remove_internals,N=e.fix_self_closing,L=i.getSpecialElements(),G=a+">";k=J.exec(G);){if(Pa.length){O.text(S(a.substr(k.index))),P=k.index+k[0].length;continue}if(l=l.toLowerCase(),":"===l.charAt(0)&&(l=l.substr(1)),v=l in t,N&&I[l]&&Q.length>0&&Q[Q.length-1].name===l&&f(l),!w||(x=i.getElementRule(l))){if(y=!0,w&&(B=x.attributes,C=x.attributePatterns),(A=k[8])?(r=A.indexOf("data-mce-type")!==-1,r&&s&&(y=!1),n=[],n.map={},A.replace(K,j)):(n=[],n.map={}),w&&!r){if(D=x.attributesRequired,E=x.attributesDefault,F=x.attributesForced,H=x.removeEmptyAttrs,H&&!n.length&&(y=!1),F)for(o=F.length;o--;)z=F[o],q=z.name,M=z.value,"{$uid}"===M&&(M="mce_"+R++),n.map[q]=M,n.push({name:q,value:M});if(E)for(o=E.length;o--;)z=E[o],q=z.name,q in n.map||(M=z.value,"{$uid}"===M&&(M="mce_"+R++),n.map[q]=M,n.push({name:q,value:M}));if(D){for(o=D.length;o--&&!(D[o]in n.map););o===-1&&(y=!1)}if(z=n.map["data-mce-bogus"]){if("all"===z){P=d(i,a,J.lastIndex),J.lastIndex=P;continue}y=!1}}y&&O.start(l,n,v)}else y=!1;if(m=L[l]){m.lastIndex=P=k.index+k[0].length,(k=m.exec(a))?(y&&(p=a.substr(P,k.index-P)),P=k.index+k[0].length):(p=a.substr(P),P=a.length),y&&(p.length>0&&O.text(p,!0),O.end(l)),J.lastIndex=P;continue}v||(A&&A.indexOf("/")==A.length-1?y&&O.end(l):Q.push({name:l,valid:y}))}else(l=k[1])?(">"===l.charAt(0)&&(l=" "+l),e.allow_conditional_comments||"[if"!==l.substr(0,3).toLowerCase()||(l=" "+l),O.comment(l)):(l=k[2])?O.cdata(h(l)):(l=k[3])?O.doctype(l):(l=k[4])&&O.pi(l,k[5]);P=k.index+k[0].length}for(P=0;o--)l=Q[o],l.valid&&O.end(l.name)}}var f=c.each,g=function(a){return 0===a.indexOf("data-")||0===a.indexOf("aria-")},h=function(a){return a.replace(//g,"")};return e.findEndTag=d,e}),g("o",["l","m","n","c"],function(a,b,c,d){var e=d.makeMap,f=d.each,g=d.explode,h=d.extend,i=function(b,c){b.padd_empty_with_br?c.empty().append(new a("br","1")).shortEnded=!0:c.empty().append(new a("#text","3")).value="\xa0"},j=function(a,b){return a&&a.firstChild===a.lastChild&&a.firstChild.name===b};return function(k,l){function m(b){var c,d,f,g,h,i,k,m,o,p,q,r,s,t,u,v;for(r=e("tr,td,th,tbody,thead,tfoot,table"),p=l.getNonEmptyElements(),q=l.getWhiteSpaceElements(),s=l.getTextBlockElements(),t=l.getSpecialElements(),c=0;c1){for(g.reverse(),h=i=n.filterNode(g[0].clone()),o=0;o0)return void(b.value=d);if(c=b.next){if(3==c.type&&c.value.length){b=b.prev;continue}if(!f[c.name]&&"script"!=c.name&&"style"!=c.name){b=b.prev;continue}}e=b.prev,b.remove(),b=e}}function n(a){var b,c={};for(b in a)"li"!==b&&"p"!=b&&(c[b]=a[b]);return c}var s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N=[];if(d=d||{},q={},r={},D=h(e("script,style,head,html,body,title,meta,param"),l.getBlockElements()),L=l.getNonEmptyElements(),K=l.children,C=k.validate,M="forced_root_block"in d?d.forced_root_block:k.forced_root_block,J=l.getWhiteSpaceElements(),E=/^[ \t\r\n]+/,G=/[ \t\r\n]+$/,H=/[ \t\r\n]+/g,I=/^[ \t\r\n]+$/,s=new c({validate:C,allow_script_urls:k.allow_script_urls,allow_conditional_comments:k.allow_conditional_comments,self_closing_elements:n(l.getSelfClosingElements()),cdata:function(a){u.append(g("#cdata",4)).value=a},text:function(a,b){var c;F||(a=a.replace(H," "),u.lastChild&&D[u.lastChild.name]&&(a=a.replace(E,""))),0!==a.length&&(c=g("#text",3),c.raw=!!b,u.append(c).value=a)},comment:function(a){u.append(g("#comment",8)).value=a},pi:function(a,b){u.append(g(a,7)).value=b,j(u)},doctype:function(a){var b;b=u.append(g("#doctype",10)),b.value=a,j(u)},start:function(a,b,c){var d,e,f,h,i;if(f=C?l.getElementRule(a):{}){for(d=g(f.outputName||a,1),d.attributes=b,d.shortEnded=c,u.append(d),i=K[u.name],i&&K[d.name]&&!i[d.name]&&N.push(d),e=p.length;e--;)h=p[e].name,h in b.map&&(A=r[h],A?A.push(d):r[h]=[d]);D[a]&&j(d),c||(u=d),!F&&J[a]&&(F=!0)}},end:function(a){var b,c,d,e,f;if(c=C?l.getElementRule(a):{}){if(D[a]&&!F){if(b=u.firstChild,b&&3===b.type)if(d=b.value.replace(E,""),d.length>0)b.value=d,b=b.next;else for(e=b.next,b.remove(),b=e;b&&3===b.type;)d=b.value,e=b.next,(0===d.length||I.test(d))&&(b.remove(),b=e),b=e;if(b=u.lastChild,b&&3===b.type)if(d=b.value.replace(G,""),d.length>0)b.value=d,b=b.prev;else for(e=b.prev,b.remove(),b=e;b&&3===b.type;)d=b.value,e=b.prev,(0===d.length||I.test(d))&&(b.remove(),b=e),b=e}if(F&&J[a]&&(F=!1),(c.removeEmpty||c.paddEmpty)&&u.isEmpty(L,J))if(c.paddEmpty)i(k,u);else if(!u.attributes.map.name&&!u.attributes.map.id)return f=u.parent,D[u.name]?u.empty().remove():u.unwrap(),void(u=f);u=u.parent}}},l),t=u=new a(d.context||k.root_name,11),s.parse(b),C&&N.length&&(d.context?d.invalid=!0:m(N)),M&&("body"==t.name||d.isRootContent)&&f(),!d.invalid){for(B in q){for(A=o[B],v=q[B],y=v.length;y--;)v[y].parent||v.splice(y,1);for(w=0,x=A.length;w0});return b.concat(["noopener"]).sort().join(" ")},f=function(a){var b=a?d.trim(a):"";return/\b(noopener)\b/g.test(b)?b:e(b)};if(!k.allow_unsafe_link_target)for(;c--;)b=a[c],"a"===b.name&&"_blank"===b.attr("target")&&b.attr("rel",f(b.attr("rel")))}),k.allow_html_in_named_anchor||n.addAttributeFilter("id,name",function(a){for(var b,c,d,e,f=a.length;f--;)if(e=a[f],"a"===e.name&&e.firstChild&&!e.attr("href")){d=e.parent,b=e.lastChild;do c=b.prev,d.insert(b,e),b=c;while(b)}}),k.fix_list_elements&&n.addNodeFilter("ul,ol",function(b){for(var c,d,e=b.length;e--;)if(c=b[e],d=c.parent,"ul"===d.name||"ol"===d.name)if(c.prev&&"li"===c.prev.name)c.prev.append(c);else{var f=new a("li",1);f.attr("style","list-style-type: none"),c.wrap(f)}}),k.validate&&l.getValidClasses()&&n.addAttributeFilter("class",function(a){for(var b,c,d,e,f,g,h,i=a.length,j=l.getValidClasses();i--;){for(b=a[i],c=b.attr("class").split(" "),f="",d=0;d0&&(m=i[i.length-1],m.length>0&&"\n"!==m&&i.push("\n")),i.push("<",a),b)for(j=0,k=b.length;j0&&(m=i[i.length-1],m.length>0&&"\n"!==m&&i.push("\n"))},end:function(a){var b;i.push(""),d&&f[a]&&i.length>0&&(b=i[i.length-1],b.length>0&&"\n"!==b&&i.push("\n"))},text:function(a,b){a.length>0&&(i[i.length]=b?a:g(a))},cdata:function(a){i.push("")},comment:function(a){i.push("")},pi:function(a,b){b?i.push(""):i.push(""),d&&i.push("\n")},doctype:function(a){i.push("",d?"\n":"")},reset:function(){i.length=0},getContent:function(){return i.join("").replace(/\n$/,"")}}}}),g("q",["p","m"],function(a,b){return function(c,d){var e=this,f=new a(c);c=c||{},c.validate=!("validate"in c)||c.validate,e.schema=d=d||new b,e.writer=f,e.serialize=function(a){function b(a){var c,h,i,j,k,l,m,n,o,p=e[a.type];if(p)p(a);else{if(c=a.name,h=a.shortEnded,i=a.attributes,g&&i&&i.length>1&&(l=[],l.map={},o=d.getElementRule(a.name))){for(m=0,n=o.attributesOrder.length;m]+data-mce-bogus[^>]+>[\u200b\ufeff]+<\\/span>","\\s?("+v.join("|")+')="[^"]+"'].join("|"),"gi");return a=j.trim(a.replace(b,""))}function p(a){var b,d,e,g,h,i=a,j=/<(\w+) [^>]*data-mce-bogus="all"[^>]*>/g,k=f.schema;for(i=o(i),h=k.getShortEndedElements();g=j.exec(i);)d=j.lastIndex,e=g[0].length,b=h[g[1]]?d:c.findEndTag(k,i,d),i=i.substring(0,d-e)+i.substring(b),j.lastIndex=d-e;return i}function q(){return p(f.getBody().innerHTML)}function r(a){i.inArray(v,a)===-1&&(u.addAttributeFilter(a,function(a,b){for(var c=a.length;c--;)a[c].attr(b,null)}),v.push(a))}var s,t,u,v=["data-mce-selected"];return f&&(s=f.dom,t=f.schema),s=s||n,t=t||new g(a),a.entity_encoding=a.entity_encoding||"named",a.remove_trailing_brs=!("remove_trailing_brs"in a)||a.remove_trailing_brs,u=new b(a,t),u.addAttributeFilter("data-mce-tabindex",function(a,b){for(var c,d=a.length;d--;)c=a[d],c.attr("tabindex",c.attributes.map["data-mce-tabindex"]),c.attr(b,null)}),u.addAttributeFilter("src,href,style",function(b,c){for(var d,e,f,g=b.length,h="data-mce-"+c,i=a.url_converter,j=a.url_converter_scope;g--;)d=b[g],e=d.attributes.map[h],e!==f?(d.attr(c,e.length>0?e:null),d.attr(h,null)):(e=d.attributes.map[c],"style"===c?e=s.serializeStyle(s.parseStyle(e),d.name):i&&(e=i.call(j,e,c,d.name)),d.attr(c,e.length>0?e:null))}),u.addAttributeFilter("class",function(a){for(var b,c,d=a.length;d--;)b=a[d],c=b.attr("class"),c&&(c=b.attr("class").replace(/(?:^|\s)mce-item-\w+(?!\S)/g,""),b.attr("class",c.length>0?c:null))}),u.addAttributeFilter("data-mce-type",function(a,b,c){for(var d,e=a.length;e--;)d=a[e],"bookmark"!==d.attributes.map["data-mce-type"]||c.cleanup||d.remove()}),u.addNodeFilter("noscript",function(a){for(var b,c=a.length;c--;)b=a[c].firstChild,b&&(b.value=d.decode(b.value))}),u.addNodeFilter("script,style",function(a,b){function c(a){return a.replace(/()/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")}for(var d,e,f,g=a.length;g--;)d=a[g],e=d.firstChild?d.firstChild.value:"","script"===b?(f=d.attr("type"),f&&d.attr("type","mce-no/type"==f?null:f.replace(/^mce\-/,"")),e.length>0&&(d.firstChild.value="// ")):e.length>0&&(d.firstChild.value="")}),u.addNodeFilter("#comment",function(a){for(var b,c=a.length;c--;)b=a[c],0===b.value.indexOf("[CDATA[")?(b.name="#cdata",b.type=4,b.value=b.value.replace(/^\[CDATA\[|\]\]$/g,"")):0===b.value.indexOf("mce:protected ")&&(b.name="#text",b.type=3,b.raw=!0,b.value=unescape(b.value).substr(14))}),u.addNodeFilter("xml:namespace,input",function(a,b){for(var c,d=a.length;d--;)c=a[d],7===c.type?c.remove():1===c.type&&("input"!==b||"type"in c.attributes.map||c.attr("type","text"))}),u.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style,data-mce-selected,data-mce-expando,data-mce-type,data-mce-resize",function(a,b){for(var c=a.length;c--;)a[c].attr(b,null)}),{schema:t,addNodeFilter:u.addNodeFilter,addAttributeFilter:u.addAttributeFilter,serialize:function(b,c){var d,f,g,i,n,o,p=this;return h.ie&&s.select("script,style,select,map").length>0?(n=b.innerHTML,b=b.cloneNode(!1),s.setHTML(b,n)):b=b.cloneNode(!0),d=document.implementation,d.createHTMLDocument&&(f=d.createHTMLDocument(""),l("BODY"==b.nodeName?b.childNodes:[b],function(a){f.body.appendChild(f.importNode(a,!0))}),b="BODY"!=b.nodeName?f.body.firstChild:f.body,g=s.doc,s.doc=f),c=c||{},c.format=c.format||"html",c.selection&&(c.forced_root_block=""),c.no_events||(c.node=b,p.onPreProcess(c)),n=j.trim(m(c.getInner?b.innerHTML:s.getOuterHTML(b))),o=u.parse(n,c),k(o),i=new e(a,t),c.content=i.serialize(o),c.no_events||p.onPostProcess(c),g&&(s.doc=g),c.node=null,c.content},addRules:function(a){t.addValidElements(a)},setRules:function(a){t.setValidElements(a)},onPreProcess:function(a){f&&f.fire("PreProcess",a)},onPostProcess:function(a){f&&f.fire("PostProcess",a)},addTempAttr:r,trimHtml:o,getTrimmedContent:q,trimContent:p}}}),g("s",["9"],function(a){return{BACKSPACE:8,DELETE:46,DOWN:40,ENTER:13,LEFT:37,RIGHT:39,SPACEBAR:32,TAB:9,UP:38,modifierPressed:function(a){return a.shiftKey||a.ctrlKey||a.altKey||this.metaKeyPressed(a)},metaKeyPressed:function(b){return a.mac?b.metaKey:b.ctrlKey&&!b.altKey}}}),g("1y",["45","4b"],function(a,b){var c=function(c,d,e){return!e.collapsed&&a.foldl(e.getClientRects(),function(a,e){return a||b.containsXY(e,c,d)},!1)};return{isXYWithinRange:c}}),g("t",["1","1w","1x","1t","1y","9","8","c","s"],function(a,b,c,d,e,f,g,h,i){function j(a,b){for(;b&&b!=a;){if(l(b)||k(b))return b;b=b.parentNode}return null}var k=d.isContentEditableFalse,l=d.isContentEditableTrue,m=function(a){return a&&"IMG"===a.nodeName},n=function(a,b){return m(a.target)&&!e.isXYWithinRange(a.clientX,a.clientY,b)},o=function(a,b){var c=b.target;n(b,a.selection.getRng())&&!b.isDefaultPrevented()&&(b.preventDefault(),a.selection.select(c))};return function(d,e){function l(a){var d=e.settings.object_resizing;return d!==!1&&!f.iOS&&("string"!=typeof d&&(d="table,img,div"),"false"!==a.getAttribute("data-mce-resize")&&(a!=e.getBody()&&c.is(b.fromDom(a),d)))}function m(a){var b,c,d,f,g;b=a.screenX-J,c=a.screenY-K,R=b*H[2]+N,S=c*H[3]+O,R=R<5?5:R,S=S<5?5:S,d="IMG"==D.nodeName&&e.settings.resize_img_proportional!==!1?!i.modifierPressed(a):i.modifierPressed(a)||"IMG"==D.nodeName&&H[2]*H[3]!==0,d&&($(b)>$(c)?(S=_(R*P),R=_(S/P)):(R=_(S/P),S=_(R*P))),V.setStyles(E,{width:R,height:S}),f=H.startPos.x+b,g=H.startPos.y+c,f=f>0?f:0,g=g>0?g:0,V.setStyles(F,{left:f,top:g,display:"block"}),F.innerHTML=R+" × "+S,H[2]<0&&E.clientWidth<=R&&V.setStyle(E,"left",L+(N-R)),H[3]<0&&E.clientHeight<=S&&V.setStyle(E,"top",M+(O-S)),b=aa.scrollWidth-T,c=aa.scrollHeight-U,b+c!==0&&V.setStyles(F,{left:f-b,top:g-c}),Q||(e.fire("ObjectResizeStart",{target:D,width:N,height:O}),Q=!0)}function n(){function a(a,b){b&&(D.style[a]||!e.schema.isValid(D.nodeName.toLowerCase(),a)?V.setStyle(D,a,b):V.setAttrib(D,a,b))}Q=!1,a("width",R),a("height",S),V.unbind(X,"mousemove",m),V.unbind(X,"mouseup",n),Y!=X&&(V.unbind(Y,"mousemove",m),V.unbind(Y,"mouseup",n)),V.remove(E),V.remove(F),Z&&"TABLE"!=D.nodeName||p(D),e.fire("ObjectResized",{target:D,width:R,height:S}),V.setAttrib(D,"style",V.getAttrib(D,"style")),e.nodeChanged()}function p(a,b,c){var d,g,h,i,j;q(),z(),d=V.getPos(a,aa),L=d.x,M=d.y,j=a.getBoundingClientRect(),g=j.width||j.right-j.left,h=j.height||j.bottom-j.top,D!=a&&(y(),D=a,R=S=0),i=e.fire("ObjectSelected",{target:a}),l(a)&&!i.isDefaultPrevented()?W(G,function(a,d){function e(b){J=b.screenX,K=b.screenY,N=D.clientWidth,O=D.clientHeight,P=O/N,H=a,a.startPos={x:g*a[0]+L,y:h*a[1]+M},T=aa.scrollWidth,U=aa.scrollHeight,E=D.cloneNode(!0),V.addClass(E,"mce-clonedresizable"),V.setAttrib(E,"data-mce-bogus","all"),E.contentEditable=!1,E.unSelectabe=!0,V.setStyles(E,{left:L,top:M,margin:0}),E.removeAttribute("data-mce-selected"),aa.appendChild(E),V.bind(X,"mousemove",m),V.bind(X,"mouseup",n),Y!=X&&(V.bind(Y,"mousemove",m),V.bind(Y,"mouseup",n)),F=V.add(aa,"div",{"class":"mce-resize-helper","data-mce-bogus":"all"},N+" × "+O)}var i;return b?void(d==b&&e(c)):(i=V.get("mceResizeHandle"+d),i&&V.remove(i),i=V.add(aa,"div",{id:"mceResizeHandle"+d, -"data-mce-bogus":"all","class":"mce-resizehandle",unselectable:!0,style:"cursor:"+d+"-resize; margin:0; padding:0"}),f.ie&&(i.contentEditable=!1),V.bind(i,"mousedown",function(a){a.stopImmediatePropagation(),a.preventDefault(),e(a)}),a.elm=i,void V.setStyles(i,{left:g*a[0]+L-i.offsetWidth/2,top:h*a[1]+M-i.offsetHeight/2}))}):q(),D.setAttribute("data-mce-selected","1")}function q(){var a,b;z(),D&&D.removeAttribute("data-mce-selected");for(a in G)b=V.get("mceResizeHandle"+a),b&&(V.unbind(b),V.remove(b))}function r(a){function b(a,b){if(a)do if(a===b)return!0;while(a=a.parentNode)}var c,f;if(!Q&&!e.removed)return W(V.select("img[data-mce-selected],hr[data-mce-selected]"),function(a){a.removeAttribute("data-mce-selected")}),f="mousedown"==a.type?a.target:d.getNode(),f=V.$(f).closest(Z?"table":"table,img,hr")[0],b(f,aa)&&(A(),c=d.getStart(!0),b(c,f)&&b(d.getEnd(!0),f)&&(!Z||f!=c&&"IMG"!==c.nodeName))?void p(f):void q()}function s(a,b,c){a&&a.attachEvent&&a.attachEvent("on"+b,c)}function t(a,b,c){a&&a.detachEvent&&a.detachEvent("on"+b,c)}function u(a){var b,c,d,f,g,h,i,j=a.srcElement;b=j.getBoundingClientRect(),h=I.clientX-b.left,i=I.clientY-b.top;for(c in G)if(d=G[c],f=j.offsetWidth*d[0],g=j.offsetHeight*d[1],$(f-h)<8&&$(g-i)<8){H=d;break}Q=!0,e.fire("ObjectResizeStart",{target:D,width:D.clientWidth,height:D.clientHeight}),e.getDoc().selection.empty(),p(j,c,I)}function v(a){a.preventDefault?a.preventDefault():a.returnValue=!1}function w(a){return k(j(e.getBody(),a))}function x(a){var b=a.srcElement;if(w(b))return void v(a);if(b!=D){if(e.fire("ObjectSelected",{target:b}),y(),0===b.id.indexOf("mceResizeHandle"))return void(a.returnValue=!1);"IMG"!=b.nodeName&&"TABLE"!=b.nodeName||(q(),D=b,s(b,"resizestart",u))}}function y(){t(D,"resizestart",u)}function z(){for(var a in G){var b=G[a];b.elm&&(V.unbind(b.elm),delete b.elm)}}function A(){try{e.getDoc().execCommand("enableObjectResizing",!1,!1)}catch(a){}}function B(a){var b;if(Z){b=X.body.createControlRange();try{return b.addElement(a),b.select(),!0}catch(a){}}}function C(){D=E=null,Z&&(y(),t(aa,"controlselect",x))}var D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V=e.dom,W=h.each,X=e.getDoc(),Y=document,Z=f.ie&&f.ie<11,$=Math.abs,_=Math.round,aa=e.getBody();G={nw:[0,0,-1,-1],ne:[1,0,1,-1],se:[1,1,1,1],sw:[0,1,-1,1]};var ba=".mce-content-body";return e.contentStyles.push(ba+" div.mce-resizehandle {position: absolute;border: 1px solid black;box-sizing: box-sizing;background: #FFF;width: 7px;height: 7px;z-index: 10000}"+ba+" .mce-resizehandle:hover {background: #000}"+ba+" img[data-mce-selected],"+ba+" hr[data-mce-selected] {outline: 1px solid black;resize: none}"+ba+" .mce-clonedresizable {position: absolute;"+(f.gecko?"":"outline: 1px dashed black;")+"opacity: .5;filter: alpha(opacity=50);z-index: 10000}"+ba+" .mce-resize-helper {background: #555;background: rgba(0,0,0,0.75);border-radius: 3px;border: 1px;color: white;display: none;font-family: sans-serif;font-size: 12px;white-space: nowrap;line-height: 14px;margin: 5px 10px;padding: 5px;position: absolute;z-index: 10001}"),e.on("init",function(){Z?(e.on("ObjectResized",function(a){"TABLE"!=a.target.nodeName&&(q(),B(a.target))}),s(aa,"controlselect",x),e.on("mousedown",function(a){I=a})):(A(),f.ie>=11&&(e.on("mousedown click",function(a){var b=a.target,c=b.nodeName;Q||!/^(TABLE|IMG|HR)$/.test(c)||w(b)||(2!==a.button&&e.selection.select(b,"TABLE"==c),"mousedown"==a.type&&e.nodeChanged())}),e.dom.bind(aa,"mscontrolselect",function(a){function b(a){g.setEditorTimeout(e,function(){e.selection.select(a)})}return w(a.target)?(a.preventDefault(),void b(a.target)):void(/^(TABLE|IMG|HR)$/.test(a.target.nodeName)&&(a.preventDefault(),"IMG"==a.target.tagName&&b(a.target)))})));var b=g.throttle(function(a){e.composing||r(a)});e.on("nodechange ResizeEditor ResizeWindow drop",b),e.on("keyup compositionend",function(a){D&&"TABLE"==D.nodeName&&b(a)}),e.on("hide blur",q),e.on("contextmenu",a.curry(o,e))}),e.on("remove",z),{isResizable:l,showResizeRect:p,hideResizeRect:q,updateResizeRect:r,controlSelect:B,destroy:C}}}),g("22",["1t"],function(a){var b=function(a){for(var b=0,c=0,d=a;d&&d.nodeType;)b+=d.offsetLeft||0,c+=d.offsetTop||0,d=d.offsetParent;return{x:b,y:c}},c=function(a,b,c){var d={elm:b,alignToTop:c};return a.fire("scrollIntoView",d),d.isDefaultPrevented()},d=function(d,e,f){var g,h,i,j,k=d.dom,l=k.getRoot(),m=0;if(!c(d,e,f)&&a.isElement(e)){if(f===!1&&(m=e.offsetHeight),"BODY"!==l.nodeName){var n=d.selection.getScrollContainer();if(n)return g=b(e).y-b(n).y+m,j=n.clientHeight,i=n.scrollTop,void((gi+j)&&(n.scrollTop=gi+j)&&d.getWin().scrollTo(0,g0)e=j-1;else{if(!(m<0))return{node:h};l=j+1}if(m<0)for(h?d.collapse(!1):(d.moveToElementText(k),d.collapse(!0),h=k,f=!0),i=0;0!==d.compareEndPoints(c?"StartToStart":"StartToEnd",b)&&0!==d.move("character",1)&&k==d.parentElement();)i++;else for(d.collapse(!0),i=0;0!==d.compareEndPoints(c?"StartToStart":"StartToEnd",b)&&0!==d.move("character",-1)&&k==d.parentElement();)i++;return{node:h,position:m,offset:i,inside:f}}}function c(){function c(a){var c,d,e,f,g,h=b(k,a),i=0;if(c=h.node,d=h.offset,h.inside&&!c.hasChildNodes())return void l[a?"setStart":"setEnd"](c,0);if(d===f)return void l[a?"setStartBefore":"setEndAfter"](c);if(h.position<0){if(e=h.inside?c.firstChild:c.nextSibling,!e)return void l[a?"setStartAfter":"setEndAfter"](c);if(!d)return void(3==e.nodeType?l[a?"setStart":"setEnd"](e,0):l[a?"setStartBefore":"setEndBefore"](e));for(;e;){if(3==e.nodeType&&(g=e.nodeValue,i+=g.length,i>=d)){c=e,i-=d,i=g.length-i;break}e=e.nextSibling}}else{if(e=c.previousSibling,!e)return l[a?"setStartBefore":"setEndBefore"](c);if(!d)return void(3==c.nodeType?l[a?"setStart":"setEnd"](e,c.nodeValue.length):l[a?"setStartAfter":"setEndAfter"](e));for(;e;){if(3==e.nodeType&&(i+=e.nodeValue.length,i>=d)){c=e,i-=d;break}e=e.previousSibling}}l[a?"setStart":"setEnd"](c,i)}var f,g,h,i,j,k=a.getRng(),l=e.createRng();if(f=k.item?k.item(0):k.parentElement(),f.ownerDocument!=e.doc)return l;if(g=a.isCollapsed(),k.item)return l.setStart(f.parentNode,e.nodeIndex(f)),l.setEnd(l.startContainer,l.startOffset+1),l;try{c(!0),g||c()}catch(b){if(b.number!=-2147024809)throw b;j=d.getBookmark(2),h=k.duplicate(),h.collapse(!0),f=h.parentElement(),g||(h=k.duplicate(),h.collapse(!1),i=h.parentElement(),i.innerHTML=i.innerHTML),f.innerHTML=f.innerHTML,d.moveToBookmark(j),k=a.getRng(),c(!0),g||c()}return l}var d=this,e=a.dom,f=!1;this.getBookmark=function(c){function d(a){var b,c,d,f,g=[];for(b=a.parentNode,c=e.getRoot().parentNode;b!=c&&9!==b.nodeType;){for(d=b.children,f=d.length;f--;)if(a===d[f]){g.push(f);break}a=b,b=b.parentNode}return g}function f(a){var c;if(c=b(g,a))return{position:c.position,offset:c.offset,indexes:d(c.node),inside:c.inside}}var g=a.getRng(),h={};return 2===c&&(g.item?h.start={ctrl:!0,indexes:d(g.item(0))}:(h.start=f(!0),a.isCollapsed()||(h.end=f()))),h},this.moveToBookmark=function(a){function b(a){var b,c,d,f;for(b=e.getRoot(),c=a.length-1;c>=0;c--)f=b.children,d=a[c],d<=f.length-1&&(b=f[d]);return b}function c(c){var e,g,h,i,j=a[c?"start":"end"];j&&(e=j.position>0,g=f.createTextRange(),g.moveToElementText(b(j.indexes)),i=j.offset,i!==h?(g.collapse(j.inside||e),g.moveStart("character",e?-i:i)):g.collapse(c),d.setEndPoint(c?"StartToStart":"EndToStart",g),c&&d.collapse(!0))}var d,f=e.doc.body;a.start&&(a.start.ctrl?(d=f.createControlRange(),d.addElement(b(a.start.indexes)),d.select()):(d=f.createTextRange(),c(!0),c(),d.select()))},this.addRange=function(b){function c(a){var b,c,g,l,m;g=e.create("a"),b=a?h:j,c=a?i:k,l=d.duplicate(),b!=o&&b!=o.documentElement||(b=p,c=0),3==b.nodeType?(b.parentNode.insertBefore(g,b),l.moveToElementText(g),l.moveStart("character",c),e.remove(g),d.setEndPoint(a?"StartToStart":"EndToEnd",l)):(m=b.childNodes,m.length?(c>=m.length?e.insertAfter(g,m[m.length-1]):b.insertBefore(g,m[c]),l.moveToElementText(g)):b.canHaveHTML&&(b.innerHTML="",g=b.firstChild,l.moveToElementText(g),l.collapse(f)),d.setEndPoint(a?"StartToStart":"EndToEnd",l),e.remove(g))}var d,g,h,i,j,k,l,m,n,o=a.dom.doc,p=o.body;if(h=b.startContainer,i=b.startOffset,j=b.endContainer,k=b.endOffset,d=p.createTextRange(),h==j&&1==h.nodeType){if(i==k&&!h.hasChildNodes()){if(h.canHaveHTML)return l=h.previousSibling,l&&!l.hasChildNodes()&&e.isBlock(l)?l.innerHTML="":l=null,h.innerHTML="",d.moveToElementText(h.lastChild),d.select(),e.doc.selection.clear(),h.innerHTML="",void(l&&(l.innerHTML=""));i=e.nodeIndex(h),h=h.parentNode}if(i==k-1)try{if(n=h.childNodes[i],g=p.createControlRange(),g.addElement(n),g.select(),m=a.getRng(),m.item&&n===m.item(0))return}catch(a){}}c(!0),c(),d.select()},this.getRangeAt=c}return a}),g("5u",["58","45","6m","4s","4","4k"],function(a,b,c,d,e,f){var g=function(b,c,d){if(!(a.isString(d)||a.isBoolean(d)||a.isNumber(d)))throw f.error("Invalid call to Attr.set. Key ",c,":: Value ",d,":: Element ",b),new e("Attribute value was not simple");b.setAttribute(c,d+"")},h=function(a,b,c){g(a.dom(),b,c)},i=function(a,b){var d=a.dom();c.each(b,function(a,b){g(d,b,a)})},j=function(a,b){var c=a.dom().getAttribute(b);return null===c?void 0:c},k=function(a,b){var c=a.dom();return!(!c||!c.hasAttribute)&&c.hasAttribute(b)},l=function(a,b){a.dom().removeAttribute(b)},m=function(a){var b=a.dom().attributes;return void 0===b||null===b||0===b.length},n=function(a){return b.foldl(a.dom().attributes,function(a,b){return a[b.name]=b.value,a},{})},o=function(a,b,c){k(a,c)&&!k(b,c)&&h(b,c,j(a,c))},p=function(a,c,e){d.isElement(a)&&d.isElement(c)&&b.each(e,function(b){o(a,c,b)})};return{clone:n,set:h,setAll:i,get:j,has:k,remove:l,hasNone:m,transfer:p}}),g("4q",["5u","1w","4p","5v","5w","5t"],function(a,b,c,d,e,f){var g=function(a,c){return b.fromDom(a.dom().cloneNode(c))},h=function(a){return g(a,!1)},i=function(a){return g(a,!0)},j=function(c,d){var e=b.fromTag(d),f=a.clone(c);return a.setAll(e,f),e},k=function(a,b){var c=j(a,b),e=f.children(i(a));return d.append(c,e),c},l=function(a,b){var g=j(a,b);c.before(a,g);var h=f.children(a);return d.append(g,h),e.remove(a),g};return{shallow:h,shallowAs:j,deep:i,copy:k,mutate:l}}),g("4r",["45","1w","28"],function(a,b,c){var d=function(d,e){var f=e||c,g=f.createDocumentFragment();return a.each(d,function(a){g.appendChild(a.dom())}),b.fromDom(g)};return{fromElements:d}}),g("4u",["1","21","5t"],function(a,b,c){var d=function(a){return a.slice(0,-1)},e=function(a,e,f){return b.contains(e,a)?d(c.parents(a,function(a){return f(a)||b.eq(a,e)})):[]},f=function(b,c){return e(b,c,a.constant(!1))},g=function(a,b){return[a].concat(f(a,b))};return{parentsUntil:e,parents:f,parentsAndSelf:g}}),g("5x",["4l"],function(a){var b=function(a){for(var b=[],c=function(a){b.push(a)},d=0;d0?f.fromElements([e]):e},n=function(b,c){var f=i.parentsAndSelf(e.fromDom(c.commonAncestorContainer),e.fromDom(b)),g=a.filter(f,function(a){return h.isInline(a)||h.isHeading(a)}),j=l(f,c);return a.map(g.concat(j),d.shallow)},o=function(a,b){return m(e.fromDom(b.cloneContents()),n(a,b))},p=function(a,b){return b.collapsed?f.fromElements([]):o(a,b)};return{read:p}}),g("v",["21","1w","20","u","t","1t","k","22","f","23","9","24","1v","c"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(a,b,c,f){var g=this;g.dom=a,g.win=b,g.serializer=c,g.editor=f,g.bookmarkManager=new d(g),g.controlSelection=new e(g,f),g.win.getSelection||(g.tridentSel=new j(g))}var p=n.each,q=n.trim,r=k.ie,s=function(c){return!(!c||!c.ownerDocument)&&a.contains(b.fromDom(c.ownerDocument),b.fromDom(c))},t=function(a){return!!a&&(!!a.select||s(a.startContainer)&&s(a.endContainer))};return o.prototype={setCursorLocation:function(a,b){var c=this,d=c.dom.createRng();a?(d.setStart(a,b),d.setEnd(a,b),c.setRng(d),c.collapse(!1)):(c._moveEndPoint(d,c.editor.getBody(),!0),c.setRng(d))},getContent:function(a){var b,c,d,e=this,f=e.getRng(),g=e.dom.create("body"),h=e.getSel();return a=a||{},b=c="",a.get=!0,a.format=a.format||"html",a.selection=!0,e.editor.fire("BeforeGetContent",a),"text"===a.format?e.isCollapsed()?"":m.trim(f.text||(h.toString?h.toString():"")):(f.cloneContents?(d=a.contextual?l.read(e.editor.getBody(),f).dom():f.cloneContents(),d&&g.appendChild(d)):void 0!==f.item||void 0!==f.htmlText?(g.innerHTML="
"+(f.item?f.item(0).outerHTML:f.htmlText),g.removeChild(g.firstChild)):g.innerHTML=f.toString(),/^\s/.test(g.innerHTML)&&(b=" "),/\s+$/.test(g.innerHTML)&&(c=" "),a.getInner=!0,a.content=e.isCollapsed()?"":b+e.serializer.serialize(g,a)+c,e.editor.fire("GetContent",a),a.content)},setContent:function(a,b){var c,d,e,f=this,g=f.getRng(),h=f.win.document;if(b=b||{format:"html"},b.set=!0,b.selection=!0,b.content=a,b.no_events||f.editor.fire("BeforeSetContent",b),a=b.content,g.insertNode){a+='_',g.startContainer==h&&g.endContainer==h?h.body.innerHTML=a:(g.deleteContents(),0===h.body.childNodes.length?h.body.innerHTML=a:g.createContextualFragment?g.insertNode(g.createContextualFragment(a)):(d=h.createDocumentFragment(),e=h.createElement("div"),d.appendChild(e),e.outerHTML=a,g.insertNode(d))),c=f.dom.get("__caret"),g=h.createRange(),g.setStartBefore(c),g.setEndBefore(c),f.setRng(g),f.dom.remove("__caret");try{f.setRng(g)}catch(a){}}else g.item&&(h.execCommand("Delete",!1,null),g=f.getRng()),/^\s+/.test(a)?(g.pasteHTML('_'+a),f.dom.remove("__mce_tmp")):g.pasteHTML(a);b.no_events||f.editor.fire("SetContent",b)},getStart:function(a){var b,c,d,e,f=this,g=f.getRng();if(g.duplicate||g.item){if(g.item)return g.item(0);for(d=g.duplicate(),d.collapse(1),b=d.parentElement(),b.ownerDocument!==f.dom.doc&&(b=f.dom.getRoot()),c=e=g.parentElement();e=e.parentNode;)if(e==b){b=c;break}return b}return b=g.startContainer,1==b.nodeType&&b.hasChildNodes()&&(a&&g.collapsed||(b=b.childNodes[Math.min(b.childNodes.length-1,g.startOffset)])),b&&3==b.nodeType?b.parentNode:b},getEnd:function(a){var b,c,d=this,e=d.getRng();return e.duplicate||e.item?e.item?e.item(0):(e=e.duplicate(),e.collapse(0),b=e.parentElement(),b.ownerDocument!==d.dom.doc&&(b=d.dom.getRoot()),b&&"BODY"==b.nodeName?b.lastChild||b:b):(b=e.endContainer,c=e.endOffset,1==b.nodeType&&b.hasChildNodes()&&(a&&e.collapsed||(b=b.childNodes[c>0?c-1:c])),b&&3==b.nodeType?b.parentNode:b)},getBookmark:function(a,b){return this.bookmarkManager.getBookmark(a,b)},moveToBookmark:function(a){return this.bookmarkManager.moveToBookmark(a)},select:function(a,b){var c,d=this,e=d.dom,f=e.createRng();if(d.lastFocusBookmark=null,a){if(!b&&d.controlSelection.controlSelect(a))return;c=e.nodeIndex(a),f.setStart(a.parentNode,c),f.setEnd(a.parentNode,c+1),b&&(d._moveEndPoint(f,a,!0),d._moveEndPoint(f,a)),d.setRng(f)}return a},isCollapsed:function(){var a=this,b=a.getRng(),c=a.getSel();return!(!b||b.item)&&(b.compareEndPoints?0===b.compareEndPoints("StartToEnd",b):!c||b.collapsed)},collapse:function(a){var b,c=this,d=c.getRng();d.item&&(b=d.item(0),d=c.win.document.body.createTextRange(),d.moveToElementText(b)),d.collapse(!!a),c.setRng(d)},getSel:function(){var a=this.win;return a.getSelection?a.getSelection():a.document.selection},getRng:function(a){function b(a,b,c){try{return b.compareBoundaryPoints(a,c)}catch(a){return-1}}var c,d,e,f,g,h,i=this;if(!i.win)return null;if(f=i.win.document,"undefined"==typeof f||null===f)return null;if(!a&&i.lastFocusBookmark){var j=i.lastFocusBookmark;return j.startContainer?(d=f.createRange(),d.setStart(j.startContainer,j.startOffset),d.setEnd(j.endContainer,j.endOffset)):d=j,d}if(a&&i.tridentSel)return i.tridentSel.getRangeAt(0);try{(c=i.getSel())&&(d=c.rangeCount>0?c.getRangeAt(0):c.createRange?c.createRange():f.createRange())}catch(a){}if(h=i.editor.fire("GetSelectionRange",{range:d}),h.range!==d)return h.range;if(r&&d&&d.setStart&&f.selection){try{g=f.selection.createRange()}catch(a){}g&&g.item&&(e=g.item(0),d=f.createRange(),d.setStartBefore(e),d.setEndAfter(e))}return d||(d=f.createRange?f.createRange():f.body.createTextRange()),d.setStart&&9===d.startContainer.nodeType&&d.collapsed&&(e=i.dom.getRoot(),d.setStart(e,0),d.setEnd(e,0)),i.selectedRange&&i.explicitRange&&(0===b(d.START_TO_START,d,i.selectedRange)&&0===b(d.END_TO_END,d,i.selectedRange)?d=i.explicitRange:(i.selectedRange=null,i.explicitRange=null)),d},setRng:function(a,b){var c,d,e,f=this;if(t(a))if(a.select){f.explicitRange=null;try{a.select()}catch(a){}}else if(f.tridentSel){if(a.cloneRange)try{f.tridentSel.addRange(a)}catch(a){}}else{if(c=f.getSel(),e=f.editor.fire("SetSelectionRange",{range:a,forward:b}),a=e.range,c){f.explicitRange=a;try{c.removeAllRanges(),c.addRange(a)}catch(a){}b===!1&&c.extend&&(c.collapse(a.endContainer,a.endOffset),c.extend(a.startContainer,a.startOffset)),f.selectedRange=c.rangeCount>0?c.getRangeAt(0):null}a.collapsed||a.startContainer!==a.endContainer||!c.setBaseAndExtent||k.ie||a.endOffset-a.startOffset<2&&a.startContainer.hasChildNodes()&&(d=a.startContainer.childNodes[a.startOffset],d&&"IMG"===d.tagName&&(c.setBaseAndExtent(a.startContainer,a.startOffset,a.endContainer,a.endOffset),c.anchorNode===a.startContainer&&c.focusNode===a.endContainer||c.setBaseAndExtent(d,0,d,1))),f.editor.fire("AfterSetSelectionRange",{range:a,forward:b})}},setNode:function(a){var b=this;return b.setContent(b.dom.getOuterHTML(a)),a},getNode:function(){function a(a,b){for(var c=a;a&&3===a.nodeType&&0===a.length;)a=b?a.nextSibling:a.previousSibling;return a||c}var b,c,d,e,f,g=this,h=g.getRng(),i=g.dom.getRoot();return h?(c=h.startContainer,d=h.endContainer,e=h.startOffset,f=h.endOffset,h.setStart?(b=h.commonAncestorContainer,!h.collapsed&&(c==d&&f-e<2&&c.hasChildNodes()&&(b=c.childNodes[e]),3===c.nodeType&&3===d.nodeType&&(c=c.length===e?a(c.nextSibling,!0):c.parentNode,d=0===f?a(d.previousSibling,!1):d.parentNode,c&&c===d))?c:b&&3==b.nodeType?b.parentNode:b):(b=h.item?h.item(0):h.parentElement(),b.ownerDocument!==g.win.document&&(b=i),b)):i},getSelectedBlocks:function(a,b){var c,d,e=this,f=e.dom,g=[];if(d=f.getRoot(),a=f.getParent(a||e.getStart(),f.isBlock),b=f.getParent(b||e.getEnd(),f.isBlock),a&&a!=d&&g.push(a),a&&b&&a!=b){c=a;for(var h=new i(a,d);(c=h.next())&&c!=b;)f.isBlock(c)&&g.push(c)}return b&&a!=b&&b!=d&&g.push(b),g},isForward:function(){var a,b,c=this.dom,d=this.getSel();return!(d&&d.anchorNode&&d.focusNode)||(a=c.createRng(),a.setStart(d.anchorNode,d.anchorOffset),a.collapse(!0),b=c.createRng(),b.setStart(d.focusNode,d.focusOffset),b.collapse(!0),a.compareBoundaryPoints(a.START_TO_START,b)<=0)},normalize:function(){var a=this,b=a.getRng();return k.range&&new g(a.dom).normalize(b)&&a.setRng(b,a.isForward()),b},selectorChanged:function(a,b){var c,d=this;return d.selectorChangedData||(d.selectorChangedData={},c={},d.editor.on("NodeChange",function(a){var b=a.element,e=d.dom,f=e.getParents(b,null,e.getRoot()),g={};p(d.selectorChangedData,function(a,b){p(f,function(d){if(e.is(d,b))return c[b]||(p(a,function(a){a(!0,{node:d,selector:b,parents:f})}),c[b]=a),g[b]=a,!1})}),p(c,function(a,d){g[d]||(delete c[d],p(a,function(a){a(!1,{node:b,selector:d,parents:f})}))})})),d.selectorChangedData[a]||(d.selectorChangedData[a]=[]),d.selectorChangedData[a].push(b),d},getScrollContainer:function(){for(var a,b=this.dom.getRoot();b&&"BODY"!=b.nodeName;){if(b.scrollHeight>b.clientHeight){a=b;break}b=b.parentNode}return a},scrollIntoView:function(a,b){h.scrollIntoView(this.editor,a,b)},placeCaretAt:function(a,b){this.setRng(g.getCaretRangeFromPoint(a,b,this.editor.getDoc()))},_moveEndPoint:function(a,b,c){var d=b,e=new i(b,d),f=this.dom.schema.getNonEmptyElements();do{if(3==b.nodeType&&0!==q(b.nodeValue).length)return void(c?a.setStart(b,0):a.setEnd(b,b.nodeValue.length));if(f[b.nodeName]&&!/^(TD|TH)$/.test(b.nodeName))return void(c?a.setStartBefore(b):"BR"==b.nodeName?a.setEndBefore(b):a.setEndAfter(b));if(k.ie&&k.ie<11&&this.dom.isBlock(b)&&this.dom.isEmpty(b))return void(c?a.setStart(b,0):a.setEnd(b,0))}while(b=c?e.next():e.prev());"BODY"==d.nodeName&&(c?a.setStart(d,0):a.setEnd(d,d.childNodes.length))},getBoundingClientRect:function(){var a=this.getRng();return a.collapsed?c.fromRangeStart(a).getClientRects()[0]:a.getBoundingClientRect()},destroy:function(){this.win=null,this.controlSelection.destroy()}},o}),g("5y",[],function(){var a=0,b=1,c=2,d=function(d,e){var f=d.length+e.length+2,g=new Array(f),h=new Array(f),i=function(a,b,c){return{start:a,end:b,diag:c}},j=function(f,g,h,i,k){var m=l(f,g,h,i);if(null===m||m.start===g&&m.diag===g-i||m.end===f&&m.diag===f-h)for(var n=f,o=h;ni-h?(k.push([c,d[n]]),++n):(k.push([b,e[o]]),++o);else{j(f,m.start,h,m.start-m.diag,k);for(var p=m.start;p=a&&s>=c&&d[r]===e[s];)h[q]=r--,s--;if(l%2===0&&-o<=p&&p<=o&&h[q]<=g[q+l])return k(h[q],p+a-c,b,f)}}},m=[];return j(0,d.length,0,e.length,m),m};return{KEEP:a,DELETE:c,INSERT:b,diff:d}}),g("4w",["1q","g","5y"],function(a,b,c){var d=function(a){return 1===a.nodeType?a.outerHTML:3===a.nodeType?b.encodeRaw(a.data,!1):8===a.nodeType?"":""},e=function(a){var b,c,d;for(d=document.createElement("div"),b=document.createDocumentFragment(),a&&(d.innerHTML=a);c=d.firstChild;)b.appendChild(c);return b},f=function(a,b,c){var d=e(b);if(a.hasChildNodes()&&c0})},j=function(b,e){var f=a.map(e.childNodes,d);return h(c.diff(f,b),e),e};return{read:i,write:j}}),g("25",["1q","4w"],function(a,b){var c=function(a){return a.indexOf("")!==-1},d=function(a){return{type:"fragmented",fragments:a,content:"",bookmark:null,beforeBookmark:null}},e=function(a){return{type:"complete",fragments:null,content:a,bookmark:null,beforeBookmark:null}},f=function(f){var g,h,i;return g=b.read(f.getBody()),i=a.map(g,function(a){return f.serializer.trimContent(a)}),h=i.join(""),c(h)?d(i):e(h)},g=function(a,c,d){"fragmented"===c.type?b.write(c.fragments,a.getBody()):a.setContent(c.content,{format:"raw"}),a.selection.moveToBookmark(d?c.beforeBookmark:c.bookmark)},h=function(a){return"fragmented"===a.type?a.fragments.join(""):a.content},i=function(a,b){return!!a&&!!b&&h(a)===h(b)};return{createFragmentedLevel:d,createCompleteLevel:e,createFromEditor:f,applyToEditor:g,isEq:i}}),g("w",["s","c","25"],function(a,b,c){return function(a){function d(b){a.setDirty(b)}function e(a){n(!1),i.add({},a)}function f(){i.typing&&(n(!1),i.add())}var g,h,i=this,j=0,k=[],l=0,m=function(){return 0===l},n=function(a){m()&&(i.typing=a)};return a.on("init",function(){i.add()}),a.on("BeforeExecCommand",function(a){var b=a.command;"Undo"!==b&&"Redo"!==b&&"mceRepaint"!==b&&(f(),i.beforeChange())}),a.on("ExecCommand",function(a){var b=a.command;"Undo"!==b&&"Redo"!==b&&"mceRepaint"!==b&&e(a)}),a.on("ObjectResizeStart Cut",function(){i.beforeChange()}),a.on("SaveContent ObjectResized blur",e),a.on("DragEnd",e),a.on("KeyUp",function(b){var f=b.keyCode;b.isDefaultPrevented()||((f>=33&&f<=36||f>=37&&f<=40||45===f||b.ctrlKey)&&(e(),a.nodeChanged()),46!==f&&8!==f||a.nodeChanged(),h&&i.typing&&c.isEq(c.createFromEditor(a),k[0])===!1&&(a.isDirty()===!1&&(d(!0),a.fire("change",{level:k[0],lastLevel:null})),a.fire("TypingUndo"),h=!1,a.nodeChanged()))}),a.on("KeyDown",function(a){var b=a.keyCode;if(!a.isDefaultPrevented()){if(b>=33&&b<=36||b>=37&&b<=40||45===b)return void(i.typing&&e(a));var c=a.ctrlKey&&!a.altKey||a.metaKey;!(b<16||b>20)||224===b||91===b||i.typing||c||(i.beforeChange(),n(!0),i.add({},a),h=!0)}}),a.on("MouseDown",function(a){i.typing&&e(a)}),a.addShortcut("meta+z","","Undo"),a.addShortcut("meta+y,meta+shift+z","","Redo"),a.on("AddUndo Undo Redo ClearUndos",function(b){b.isDefaultPrevented()||a.nodeChanged()}),i={data:k,typing:!1,beforeChange:function(){m()&&(g=a.selection.getBookmark(2,!0))},add:function(e,f){var h,i,l,n=a.settings;if(l=c.createFromEditor(a),e=e||{},e=b.extend(e,l),m()===!1||a.removed)return null;if(i=k[j],a.fire("BeforeAddUndo",{level:e,lastLevel:i,originalEvent:f}).isDefaultPrevented())return null;if(i&&c.isEq(i,e))return null;if(k[j]&&(k[j].beforeBookmark=g),n.custom_undo_redo_levels&&k.length>n.custom_undo_redo_levels){for(h=0;h0&&(d(!0),a.fire("change",o)),e},undo:function(){var b;return i.typing&&(i.add(),i.typing=!1,n(!1)),j>0&&(b=k[--j],c.applyToEditor(a,b,!0),d(!0),a.fire("undo",{level:b})),b},redo:function(){var b;return j0||i.typing&&k[0]&&!c.isEq(c.createFromEditor(a),k[0])},hasRedo:function(){return j0?b.from(m):b.none()},l=function(a,b,c){return a?i.isEmpty(b)?(d.remove(b),g.positionIn(!0,c.dom())):g.positionIn(!1,b.dom()).bind(function(d){return k(a,c,b,d)}):i.isEmpty(c)?(d.remove(c),g.positionIn(!0,b.dom())):g.positionIn(!1,c.dom()).bind(function(d){return k(a,b,c,d)})};return{mergeBlocks:l}}),g("4x",["5z","60"],function(a,b){var c=function(c,d){var e;return e=a.read(c.getBody(),d,c.selection.getRng()).bind(function(a){return b.mergeBlocks(d,a.from().block(),a.to().block())}),e.each(function(a){c.selection.setRng(a.toRange())}),e.isSome()};return{backspaceDelete:c}}),g("4y",["5x","21","1w","5m","20","50","60"],function(a,b,c,d,e,f,g){var h=function(d,e){var h=e.getRng();return a.liftN([f.getParentTextBlock(d,c.fromDom(h.startContainer)),f.getParentTextBlock(d,c.fromDom(h.endContainer))],function(a,c){return b.eq(a,c)===!1&&(h.deleteContents(),g.mergeBlocks(!0,a,c).each(function(a){e.setRng(a.toRange())}),!0)}).getOr(!1)},i=function(a,b){var c=d.prevPosition(a.dom(),e.fromRangeStart(b)).isNone(),f=d.nextPosition(a.dom(),e.fromRangeEnd(b)).isNone();return c&&f},j=function(a){return a.setContent(""),a.selection.setCursorLocation(),!0},k=function(a){var b=c.fromDom(a.getBody()),d=a.selection.getRng();return i(b,d)?j(a):h(b,a.selection)},l=function(a,b){return!a.selection.isCollapsed()&&k(a,a.selection.getRng())};return{backspaceDelete:l}}),g("6p",["45","6m","58","3","4","4k"],function(a,b,c,d,e,f){var g=function(g){if(!c.isArray(g))throw new e("cases must be an array");if(0===g.length)throw new e("there must be at least one case");var h=[],i={};return a.each(g,function(j,k){var l=b.keys(j);if(1!==l.length)throw new e("one and only one name per case");var m=l[0],n=j[m];if(void 0!==i[m])throw new e("duplicate key detected:"+m);if("cata"===m)throw new e("cannot have a case named cata (sorry)");if(!c.isArray(n))throw new e("case arguments must be an array");h.push(m),i[m]=function(){var c=arguments.length;if(c!==n.length)throw new e("Wrong number of arguments to case "+m+". Expected "+n.length+" ("+n+"), got "+c);for(var i=new d(c),j=0;jl.before(b).offset()},p=function(a,b){return o(b,a)?new l(b.container(),b.offset()-1):b},q=function(a){return n.isText(a)?new l(a,0):l.before(a)},r=function(a){return n.isText(a)?new l(a,a.data.length):l.after(a)},s=function(a){return j.isCaretCandidate(a.previousSibling)?b.some(r(a.previousSibling)):a.previousSibling?k.lastPositionIn(a.previousSibling):b.none()},t=function(a){return j.isCaretCandidate(a.nextSibling)?b.some(q(a.nextSibling)):a.nextSibling?k.firstPositionIn(a.nextSibling):b.none()},u=function(a,c){var d=l.before(c.previousSibling?c.previousSibling:c.parentNode);return k.prevPosition(a,d).fold(function(){return k.nextPosition(a,l.after(c))},b.some)},v=function(a,c){return k.nextPosition(a,l.after(c)).fold(function(){return k.prevPosition(a,l.before(c))},b.some)},w=function(a,b){return s(b).orThunk(function(){return t(b)}).orThunk(function(){return u(a,b)})},x=function(a,b){return t(b).orThunk(function(){return s(b)}).orThunk(function(){return v(a,b)})},y=function(a,b,c){return a?x(b,c):w(b,c)},z=function(b,c,d){return y(b,c,d).map(a.curry(p,d))},A=function(a,b,c){c.fold(function(){a.focus()},function(c){a.selection.setRng(c.toRange(),b)})},B=function(a){return function(b){return b.dom()===a}},C=function(a,b){return b&&a.schema.getBlockElements().hasOwnProperty(g.name(b))},D=function(a){if(m.isEmpty(a)){var c=f.fromHtml('
');return e.empty(a),d.append(a,c),b.some(l.before(c.dom()))}return b.none()},E=function(a,b){return c.liftN([i.prevSibling(a),i.nextSibling(a),b],function(b,c,d){var f,g=b.dom(),h=c.dom();return n.isText(g)&&n.isText(h)?(f=g.data.length,g.appendData(h.data),e.remove(c),e.remove(a),d.container()===h?new l(g,f):d):(e.remove(a),d)}).orThunk(function(){return e.remove(a),b})},F=function(c,d,e){var f=z(d,c.getBody(),e.dom()),g=h.ancestor(e,a.curry(C,c),B(c.getBody())),i=E(e,f);g.bind(D).fold(function(){A(c,d,i)},function(a){A(c,d,b.some(a))})};return{deleteElement:F}}),g("4z",["45","5w","1w","62","20","5n","5z","63","64","50","60","1t"],function(a,b,c,d,e,f,g,h,i,j,k,l){var m=function(a,b){return function(d){return i.deleteElement(a,b,c.fromDom(d)),!0}},n=function(a,b){return function(c){var d=b?e.before(c):e.after(c);return a.selection.setRng(d.toRange()),!0}},o=function(a){return function(b){return a.selection.setRng(b.toRange()),!0}},p=function(a,b){var c=h.read(a.getBody(),b,a.selection.getRng()).map(function(c){return c.fold(m(a,b),n(a,b),o(a))});return c.getOr(!1)},q=function(c){a.each(d.descendants(c,".mce-offscreen-selection"),b.remove)},r=function(a,b){var d=a.selection.getNode();return!!l.isContentEditableFalse(d)&&(q(c.fromDom(a.getBody())),i.deleteElement(a,b,c.fromDom(a.selection.getNode())),j.paddEmptyBody(a),!0)},s=function(a,b){for(;b&&b!==a;){if(l.isContentEditableTrue(b)||l.isContentEditableFalse(b))return b;b=b.parentNode}return null},t=function(a){var b,c=s(a.getBody(),a.selection.getNode());return l.isContentEditableTrue(c)&&a.dom.isBlock(c)&&a.dom.isEmpty(c)&&(b=a.dom.create("br",{"data-mce-bogus":"1"}),a.dom.setHTML(c,""),c.appendChild(b),a.selection.setRng(e.before(b).toRange())),!0},u=function(a,b){return a.selection.isCollapsed()?p(a,b):r(a,b)};return{backspaceDelete:u,paddEmptyElement:t}}),g("6q",["1","1t","1v"],function(a,b,c){var d=b.isText,e=function(a){return d(a)&&a.data[0]===c.ZWSP},f=function(a){return d(a)&&a.data[a.data.length-1]===c.ZWSP},g=function(a){return a.ownerDocument.createTextNode(c.ZWSP)},h=function(a){if(d(a.previousSibling))return f(a.previousSibling)?a.previousSibling:(a.previousSibling.appendData(c.ZWSP),a.previousSibling);if(d(a))return e(a)?a:(a.insertData(0,c.ZWSP),a);var b=g(a);return a.parentNode.insertBefore(b,a),b},i=function(a){if(d(a.nextSibling))return e(a.nextSibling)?a.nextSibling:(a.nextSibling.insertData(0,c.ZWSP),a.nextSibling);if(d(a))return f(a)?a:(a.appendData(c.ZWSP),a);var b=g(a);return a.nextSibling?a.parentNode.insertBefore(b,a.nextSibling):a.parentNode.appendChild(b),b},j=function(a,b){return a?h(b):i(b)};return{insertInline:j,insertInlineBefore:a.curry(j,!0),insertInlineAfter:a.curry(j,!1)}}),g("6r",["45","1u","20","1t","1v","c"],function(a,b,c,d,e,f){var g=d.isElement,h=d.isText,i=function(a){var b=a.parentNode;b&&b.removeChild(a)},j=function(a){try{return a.nodeValue}catch(a){return""}},k=function(a,b){0===b.length?i(a):a.nodeValue=b},l=function(a){var b=e.trim(a);return{count:a.length-b.length,text:b}},m=function(a,b){return s(a),b},n=function(a,b){var d=l(a.data.substr(0,b.offset())),e=l(a.data.substr(b.offset())),f=d.text+e.text;return f.length>0?(k(a,f),new c(a,b.offset()-d.count)):b},o=function(b,d){var e=d.container(),f=a.indexOf(e.childNodes,b).map(function(a){return a",visual:!0,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,padd_empty_editor:!0,render_ui:!0,indentation:"30px",inline_styles:!0,convert_fonts_to_spans:!0,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",entity_encoding:"named",url_converter:a.convertURL,url_converter_scope:a,ie7_compat:!0},e,f,{validate:!0,content_editable:f.inline}),e&&e.external_plugins&&f.external_plugins&&(f.external_plugins=d.extend({},e.external_plugins,f.external_plugins)),f},f=function(a,c){return b.from(a.settings[c])},g=function(a,c,d){return b.from(c.settings[d]).filter(a)};return{getEditorSettings:e,get:f,getString:a.curry(g,c.isString)}}),g("6s",[],function(){var a=/[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/,b=function(b){return a.test(b)};return{hasStrongRtl:b}}),g("68",["45","1","4l","5x","58","1w","1x","1u","5m","20","5n","52","h","1t","2c","6s"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){var q=function(a,b){var c=o.getString(a,"inline_boundaries_selector").getOr("a[href],code");return g.is(f.fromDom(b),c)},r=function(a){return"rtl"===m.DOM.getStyle(a,"direction",!0)||p.hasStrongRtl(a.textContent)},s=function(b,c,d){return a.filter(m.DOM.getParents(d.container(),"*",c),b)},t=function(a,b,d){var e=s(a,b,d);return c.from(e[e.length-1])},u=function(a,b,c){var d=k.getParentBlock(b,a),e=k.getParentBlock(c,a);return d&&d===e},v=function(a){return h.isBeforeInline(a)||h.isAfterInline(a)},w=function(a,b){var c=b.container(),d=b.offset();return a?h.isCaretContainerInline(c)?n.isText(c.nextSibling)?new j(c.nextSibling,0):j.after(c):h.isBeforeInline(b)?new j(c,d+1):b:h.isCaretContainerInline(c)?n.isText(c.previousSibling)?new j(c.previousSibling,c.previousSibling.data.length):j.before(c):h.isAfterInline(b)?new j(c,d-1):b},x=b.curry(w,!0),y=b.curry(w,!1);return{isInlineTarget:q,findRootInline:t,isRtl:r,isAtZwsp:v,normalizePosition:w,normalizeForwards:x,normalizeBackwards:y,hasSameParentBlock:u}}),g("65",["4l","1u","6q","6r","5m","20","1t","68"],function(a,b,c,d,e,f,g,h){var i=function(a,b){return g.isText(a.container())?c.insertInline(b,a.container()):c.insertInline(b,a.getNode())},j=function(a,c){var d=c.get();return d&&a.container()===d&&b.isCaretContainerInline(d)},k=function(b,g){return g.fold(function(e){d.remove(b.get());var g=c.insertInlineBefore(e);return b.set(g),a.some(new f(g,g.length-1))},function(a){return e.firstPositionIn(a).map(function(a){if(j(a,b))return new f(b.get(),1);d.remove(b.get());var c=i(a,!0);return b.set(c),new f(c,1)})},function(a){return e.lastPositionIn(a).map(function(a){if(j(a,b))return new f(b.get(),b.get().length-1);d.remove(b.get());var c=i(a,!1);return b.set(c),new f(c,c.length-1)})},function(e){d.remove(b.get());var g=c.insertInlineAfter(e);return b.set(g),a.some(new f(g,1))})};return{renderCaret:k}}),g("6t",["4l"],function(a){var b=function(b,c){for(var d=0;d0&&h(a[a.length-1])?a.slice(0,-1):a},j=function(a,b){var c=a.getParent(b,a.isBlock);return c&&"LI"===c.nodeName?c:null},k=function(a,b){return!!j(a,b)},l=function(a,b){var c=b.cloneRange(),d=b.cloneRange();return c.setStartBefore(a),d.setEndAfter(a),[c.cloneContents(),d.cloneContents()]},m=function(a,d){var e=c.before(a),f=new b(d),g=f.next(e);return g?g.toRange():null},n=function(a,d){var e=c.after(a),f=new b(d),g=f.prev(e);return g?g.toRange():null},o=function(b,c,d,e){var f=l(b,e),g=b.parentNode;return g.insertBefore(f[0],b),a.each(c,function(a){g.insertBefore(a,b)}),g.insertBefore(f[1],b),g.removeChild(b),n(c[c.length-1],d)},p=function(b,c,d){var e=b.parentNode;return a.each(c,function(a){e.insertBefore(a,b)}),m(b,d)},q=function(a,b,c,d){return d.insertAfter(b.reverse(),a),n(b[0],c)},r=function(a,d,e,h){var k=f(d,a,h),l=j(d,e.startContainer),m=i(g(k.firstChild)),n=1,r=2,s=d.getRoot(),t=function(a){var f=c.fromRangeStart(e),g=new b(d.getRoot()),h=a===n?g.prev(f):g.next(f);return!h||j(d,h.getNode())!==l};return t(n)?p(l,m,s):t(r)?q(l,m,s,d):o(l,m,s,e)};return{isListFragment:d,insertAtCaret:r,isParentBlockLi:k,trimListItems:i,listItems:g}}),g("27",["20","52","4d","1t","4e","9","q","53","c"],function(a,b,c,d,e,f,g,h,i){var j=d.matchNodeNames("td th"),k=function(a,b,c){if("all"===c.getAttribute("data-mce-bogus"))c.parentNode.insertBefore(a.dom.createFragment(b),c);else{var d=c.firstChild,e=c.lastChild;!d||d===e&&"BR"===d.nodeName?a.dom.setHTML(c,b):a.selection.setContent(b)}},l=function(d,l,m){function n(a){function b(a){return d[a]&&3==d[a].nodeType}var c,d,e;return c=I.getRng(!0),d=c.startContainer,e=c.startOffset,3==d.nodeType&&(e>0?a=a.replace(/^ /," "):b("previousSibling")||(a=a.replace(/^ /," ")),e|)$/," "):b("nextSibling")||(a=a.replace(/( | )(
|)$/," "))),a}function o(){var a,b,c;a=I.getRng(!0),b=a.startContainer,c=a.startOffset,3==b.nodeType&&a.collapsed&&("\xa0"===b.data[c]?(b.deleteData(c,1),/[\u00a0| ]$/.test(l)||(l+=" ")):"\xa0"===b.data[c-1]&&(b.deleteData(c-1,1),/[\u00a0| ]$/.test(l)||(l=" "+l)))}function p(){if(G){var a=d.getBody(),b=new c(J);i.each(J.select("*[data-mce-fragment]"),function(c){for(var d=c.parentNode;d&&d!=a;d=d.parentNode)H[c.nodeName.toLowerCase()]&&b.compare(d,c)&&J.remove(c,!0)})}}function q(a){for(var b=a;b=b.walk();)1===b.type&&b.attr("data-mce-fragment","1")}function r(a){i.each(a.getElementsByTagName("*"),function(a){a.removeAttribute("data-mce-fragment")})}function s(a){return!!a.getAttribute("data-mce-fragment")}function t(a){return a&&!d.schema.getShortEndedElements()[a.nodeName]}function u(c){function e(a){for(var b=d.getBody();a&&a!==b;a=a.parentNode)if("false"===d.dom.getContentEditable(a))return a;return null}function g(c){var e=a.fromRangeStart(c),f=new b(d.getBody());if(e=f.next(e))return e.toRange()}var h,i,k;if(c){if(I.scrollIntoView(c),h=e(c))return J.remove(c),void I.select(h);C=J.createRng(),D=c.previousSibling,D&&3==D.nodeType?(C.setStart(D,D.nodeValue.length),f.ie||(E=c.nextSibling,E&&3==E.nodeType&&(D.appendData(E.data),E.parentNode.removeChild(E)))):(C.setStartBefore(c),C.setEndBefore(c)),i=J.getParent(c,J.isBlock),J.remove(c),i&&J.isEmpty(i)&&(d.$(i).empty(),C.setStart(i,0),C.setEnd(i,0),j(i)||s(i)||!(k=g(C))?J.add(i,J.create("br",{"data-mce-bogus":"1"})):(C=k,J.remove(i))),I.setRng(C)}}var v,w,x,y,z,A,B,C,D,E,F,G,H=d.schema.getTextInlineElements(),I=d.selection,J=d.dom;/^ | $/.test(l)&&(l=n(l)),v=d.parser,G=m.merge,w=new g({validate:d.settings.validate},d.schema),F='​',A={content:l,format:"html",selection:!0},d.fire("BeforeSetContent",A),l=A.content,l.indexOf("{$caret}")==-1&&(l+="{$caret}"),l=l.replace(/\{\$caret\}/,F),C=I.getRng();var K=C.startContainer||(C.parentElement?C.parentElement():null),L=d.getBody();K===L&&I.isCollapsed()&&J.isBlock(L.firstChild)&&t(L.firstChild)&&J.isEmpty(L.firstChild)&&(C=J.createRng(),C.setStart(L.firstChild,0),C.setEnd(L.firstChild,0),I.setRng(C)),I.isCollapsed()||(d.selection.setRng(e.normalize(d.selection.getRng())),d.getDoc().execCommand("Delete",!1,null),o()),x=I.getNode();var M={context:x.nodeName.toLowerCase(),data:m.data};if(z=v.parse(l,M),m.paste===!0&&h.isListFragment(z)&&h.isParentBlockLi(J,x))return C=h.insertAtCaret(w,J,d.selection.getRng(!0),z),d.selection.setRng(C),void d.fire("SetContent",A);if(q(z),D=z.lastChild,"mce_marker"==D.attr("id"))for(B=D,D=D.prev;D;D=D.walk(!0))if(3==D.type||!J.isBlock(D.name)){d.schema.isValidChild(D.parent.name,"span")&&D.parent.insert(B,D,"br"===D.name);break}if(d._selectionOverrides.showBlockCaretContainer(x),M.invalid){for(I.setContent(F),x=I.getNode(),y=d.getBody(),9==x.nodeType?x=D=y:D=x;D!==y;)x=D,D=D.parentNode;l=x==y?y.innerHTML:J.getOuterHTML(x),l=w.serialize(v.parse(l.replace(//i,function(){return w.serialize(z)}))),x==y?J.setHTML(y,l):J.setOuterHTML(x,l)}else l=w.serialize(z),k(d,l,x);p(),u(J.get("mce_marker")),r(d.getBody()),d.fire("SetContent",A),d.addVisual()},m=function(a){var b;return"string"!=typeof a?(b=i.extend({paste:a.paste,data:{paste:a.paste}},a),{content:a.content,details:b}):{content:a,details:{}}},n=function(a,b){var c=m(b);l(a,c.content,c.details)};return{insertAtCaret:n}}),g("x",["26","1t","k","f","9","27","c"],function(a,b,c,d,e,f,g){var h=g.each,i=g.extend,j=g.map,k=g.inArray,l=g.explode,m=e.ie&&e.ie<11,n=!0,o=!1;return function(g){function p(a,b,c,d){var e,f,i=0;if(!g.removed){if(/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(a)||d&&d.skip_focus||g.focus(),d=g.fire("BeforeExecCommand",{command:a,ui:b,value:c}),d.isDefaultPrevented())return!1;if(f=a.toLowerCase(),e=H.exec[f])return e(f,b,c),g.fire("ExecCommand",{command:a,ui:b,value:c}),!0;if(h(g.plugins,function(d){if(d.execCommand&&d.execCommand(a,b,c))return g.fire("ExecCommand",{command:a,ui:b,value:c}),i=!0,!1}),i)return i;if(g.theme&&g.theme.execCommand&&g.theme.execCommand(a,b,c))return g.fire("ExecCommand",{command:a,ui:b,value:c}),!0;try{i=g.getDoc().execCommand(a,b,c)}catch(a){}return!!i&&(g.fire("ExecCommand",{command:a,ui:b,value:c}),!0)}}function q(a){var b;if(!g.quirks.isHidden()&&!g.removed){if(a=a.toLowerCase(),b=H.state[a])return b(a);try{return g.getDoc().queryCommandState(a)}catch(a){}return!1}}function r(a){var b;if(!g.quirks.isHidden()&&!g.removed){if(a=a.toLowerCase(),b=H.value[a])return b(a);try{return g.getDoc().queryCommandValue(a)}catch(a){}}}function s(a,b){b=b||"exec",h(a,function(a,c){h(c.toLowerCase().split(","),function(c){H[b][c]=a})})}function t(a,b,c){a=a.toLowerCase(),H.exec[a]=function(a,d,e,f){return b.call(c||g,d,e,f)}}function u(a){if(a=a.toLowerCase(),H.exec[a])return!0;try{return g.getDoc().queryCommandSupported(a)}catch(a){}return!1}function v(a,b,c){a=a.toLowerCase(),H.state[a]=function(){return b.call(c||g)}}function w(a,b,c){a=a.toLowerCase(),H.value[a]=function(){return b.call(c||g)}}function x(a){return a=a.toLowerCase(),!!H.exec[a]}function y(a,b,c){return void 0===b&&(b=o),void 0===c&&(c=null),g.getDoc().execCommand(a,b,c)}function z(a){return F.match(a)}function A(a,b){F.toggle(a,b?{value:b}:void 0),g.nodeChanged()}function B(a){G=E.getBookmark(a)}function C(){E.moveToBookmark(G)}var D,E,F,G,H={state:{},exec:{},value:{}},I=g.settings;g.on("PreInit",function(){D=g.dom,E=g.selection,I=g.settings,F=g.formatter}),i(this,{execCommand:p,queryCommandState:q,queryCommandValue:r,queryCommandSupported:u,addCommands:s,addCommand:t,addQueryStateHandler:v,addQueryValueHandler:w,hasCustomCommand:x}),s({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){g.undoManager.add()},"Cut,Copy,Paste":function(a){var b,c=g.getDoc();try{y(a)}catch(a){b=n}if("paste"!==a||c.queryCommandEnabled(a)||(b=!0),b||!c.queryCommandSupported(a)){var d=g.translate("Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.");e.mac&&(d=d.replace(/Ctrl\+/g,"\u2318+")),g.notificationManager.open({text:d,type:"error"})}},unlink:function(){if(E.isCollapsed()){var a=g.dom.getParent(g.selection.getStart(),"a");return void(a&&g.dom.remove(a,!0))}F.remove("link")},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull,JustifyNone":function(a){var b=a.substring(7);"full"==b&&(b="justify"),h("left,center,right,justify".split(","),function(a){b!=a&&F.remove("align"+a)}),"none"!=b&&A("align"+b)},"InsertUnorderedList,InsertOrderedList":function(a){var b,c;y(a),b=D.getParent(E.getNode(),"ol,ul"),b&&(c=b.parentNode,/^(H[1-6]|P|ADDRESS|PRE)$/.test(c.nodeName)&&(B(),D.split(c,b),C()))},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(a){A(a)},"ForeColor,HiliteColor,FontName":function(a,b,c){A(a,c)},FontSize:function(a,b,c){var d,e;c>=1&&c<=7&&(e=l(I.font_size_style_values),d=l(I.font_size_classes),c=d?d[c-1]||c:e[c-1]||c),A(a,c)},RemoveFormat:function(a){F.remove(a)},mceBlockQuote:function(){A("blockquote")},FormatBlock:function(a,b,c){return A(c||"p")},mceCleanup:function(){var a=E.getBookmark();g.setContent(g.getContent({cleanup:n}),{cleanup:n}),E.moveToBookmark(a)},mceRemoveNode:function(a,b,c){var d=c||E.getNode();d!=g.getBody()&&(B(),g.dom.remove(d,n),C())},mceSelectNodeDepth:function(a,b,c){var d=0;D.getParent(E.getNode(),function(a){if(1==a.nodeType&&d++==c)return E.select(a),o},g.getBody())},mceSelectNode:function(a,b,c){E.select(c)},mceInsertContent:function(a,b,c){f.insertAtCaret(g,c)},mceInsertRawHTML:function(a,b,c){E.setContent("tiny_mce_marker"),g.setContent(g.getContent().replace(/tiny_mce_marker/g,function(){return c}))},mceToggleFormat:function(a,b,c){A(c)},mceSetContent:function(a,b,c){g.setContent(c)},"Indent,Outdent":function(a){var b,c,d;b=I.indentation,c=/[a-z%]+$/i.exec(b),b=parseInt(b,10),q("InsertUnorderedList")||q("InsertOrderedList")?y(a):(I.forced_root_block||D.getParent(E.getNode(),D.isBlock)||F.apply("div"),h(E.getSelectedBlocks(),function(e){if("false"!==D.getContentEditable(e)&&"LI"!==e.nodeName){var f=g.getParam("indent_use_margin",!1)?"margin":"padding";f="TABLE"===e.nodeName?"margin":f,f+="rtl"==D.getStyle(e,"direction",!0)?"Right":"Left","outdent"==a?(d=Math.max(0,parseInt(e.style[f]||0,10)-b),D.setStyle(e,f,d?d+c:"")):(d=parseInt(e.style[f]||0,10)+b+c,D.setStyle(e,f,d))}}))},mceRepaint:function(){},InsertHorizontalRule:function(){g.execCommand("mceInsertContent",!1,"
")},mceToggleVisualAid:function(){g.hasVisual=!g.hasVisual,g.addVisual()},mceReplaceContent:function(a,b,c){g.execCommand("mceInsertContent",!1,c.replace(/\{\$selection\}/g,E.getContent({format:"text"})))},mceInsertLink:function(a,b,c){var d;"string"==typeof c&&(c={href:c}),d=D.getParent(E.getNode(),"a"),c.href=c.href.replace(" ","%20"),d&&c.href||F.remove("link"),c.href&&F.apply("link",c,d)},selectAll:function(){var a,c=D.getRoot();if(E.getRng().setStart){ -var d=D.getParent(E.getStart(),b.isContentEditableTrue);d&&(a=D.createRng(),a.selectNodeContents(d),E.setRng(a))}else a=E.getRng(),a.item||(a.moveToElementText(c),a.select())},"delete":function(){a.deleteCommand(g)},forwardDelete:function(){a.forwardDeleteCommand(g)},mceNewDocument:function(){g.setContent("")},InsertLineBreak:function(a,b,e){function f(){for(var a,b=new d(p,r),c=g.schema.getNonEmptyElements();a=b.next();)if(c[a.nodeName.toLowerCase()]||a.length>0)return!0}var h,i,j,k=e,l=E.getRng(!0);new c(D).normalize(l);var o=l.startOffset,p=l.startContainer;if(1==p.nodeType&&p.hasChildNodes()){var q=o>p.childNodes.length-1;p=p.childNodes[Math.min(o,p.childNodes.length-1)]||p,o=q&&3==p.nodeType?p.nodeValue.length:0}var r=D.getParent(p,D.isBlock),s=r?r.nodeName.toUpperCase():"",t=r?D.getParent(r.parentNode,D.isBlock):null,u=t?t.nodeName.toUpperCase():"",v=k&&k.ctrlKey;"LI"!=u||v||(r=t,s=u),p&&3==p.nodeType&&o>=p.nodeValue.length&&(m||f()||(h=D.create("br"),l.insertNode(h),l.setStartAfter(h),l.setEndAfter(h),i=!0)),h=D.create("br"),l.insertNode(h);var w=D.doc.documentMode;return m&&"PRE"==s&&(!w||w<8)&&h.parentNode.insertBefore(D.doc.createTextNode("\r"),h),j=D.create("span",{}," "),h.parentNode.insertBefore(j,h),E.scrollIntoView(j),D.remove(j),i?(l.setStartBefore(h),l.setEndBefore(h)):(l.setStartAfter(h),l.setEndAfter(h)),E.setRng(l),g.undoManager.add(),n}}),s({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(a){var b="align"+a.substring(7),c=E.isCollapsed()?[D.getParent(E.getNode(),D.isBlock)]:E.getSelectedBlocks(),d=j(c,function(a){return!!F.matchNode(a,b)});return k(d,n)!==-1},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(a){return z(a)},mceBlockQuote:function(){return z("blockquote")},Outdent:function(){var a;if(I.inline_styles){if((a=D.getParent(E.getStart(),D.isBlock))&&parseInt(a.style.paddingLeft,10)>0)return n;if((a=D.getParent(E.getEnd(),D.isBlock))&&parseInt(a.style.paddingLeft,10)>0)return n}return q("InsertUnorderedList")||q("InsertOrderedList")||!I.inline_styles&&!!D.getParent(E.getNode(),"BLOCKQUOTE")},"InsertUnorderedList,InsertOrderedList":function(a){var b=D.getParent(E.getNode(),"ul,ol");return b&&("insertunorderedlist"===a&&"UL"===b.tagName||"insertorderedlist"===a&&"OL"===b.tagName)}},"state"),s({"FontSize,FontName":function(a){var b,c=0;return(b=D.getParent(E.getNode(),"span"))&&(c="fontsize"==a?b.style.fontSize:b.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()),c}},"value"),s({Undo:function(){g.undoManager.undo()},Redo:function(){g.undoManager.redo()}})}}),g("y",["28","c"],function(a,b){function c(b,g){var h,i,j=this;if(b=e(b),g=j.settings=g||{},h=g.base_uri,/^([\w\-]+):([^\/]{2})/i.test(b)||/^\s*#/.test(b))return void(j.source=b);var k=0===b.indexOf("//");0!==b.indexOf("/")||k||(b=(h?h.protocol||"http":"http")+"://mce_host"+b),/^[\w\-]*:?\/\//.test(b)||(i=g.base_uri?g.base_uri.path:new c(a.location.href).directory,""===g.base_uri.protocol?b="//mce_host"+j.toAbsPath(i,b):(b=/([^#?]*)([#?]?.*)/.exec(b),b=(h&&h.protocol||"http")+"://mce_host"+j.toAbsPath(i,b[1])+b[2])),b=b.replace(/@@/g,"(mce_at)"),b=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(b),d(f,function(a,c){var d=b[c];d&&(d=d.replace(/\(mce_at\)/g,"@@")),j[a]=d}),h&&(j.protocol||(j.protocol=h.protocol),j.userInfo||(j.userInfo=h.userInfo),j.port||"mce_host"!==j.host||(j.port=h.port),j.host&&"mce_host"!==j.host||(j.host=h.host),j.source=""),k&&(j.protocol="")}var d=b.each,e=b.trim,f="source protocol authority userInfo user password host port relative path directory file query anchor".split(" "),g={ftp:21,http:80,https:443,mailto:25};return c.prototype={setPath:function(a){var b=this;a=/^(.*?)\/?(\w+)?$/.exec(a),b.path=a[0],b.directory=a[1],b.file=a[2],b.source="",b.getURI()},toRelative:function(a){var b,d=this;if("./"===a)return a;if(a=new c(a,{base_uri:d}),"mce_host"!=a.host&&d.host!=a.host&&a.host||d.port!=a.port||d.protocol!=a.protocol&&""!==a.protocol)return a.getURI();var e=d.getURI(),f=a.getURI();return e==f||"/"==e.charAt(e.length-1)&&e.substr(0,e.length-1)==f?e:(b=d.toRelPath(d.path,a.path),a.query&&(b+="?"+a.query),a.anchor&&(b+="#"+a.anchor),b)},toAbsolute:function(a,b){return a=new c(a,{base_uri:this}),a.getURI(b&&this.isSameOrigin(a))},isSameOrigin:function(a){if(this.host==a.host&&this.protocol==a.protocol){if(this.port==a.port)return!0;var b=g[this.protocol];if(b&&(this.port||b)==(a.port||b))return!0}return!1},toRelPath:function(a,b){var c,d,e,f=0,g="";if(a=a.substring(0,a.lastIndexOf("/")),a=a.split("/"),c=b.split("/"),a.length>=c.length)for(d=0,e=a.length;d=c.length||a[d]!=c[d]){f=d+1;break}if(a.length=a.length||a[d]!=c[d]){f=d+1;break}if(1===f)return b;for(d=0,e=a.length-(f-1);d=0;c--)0!==b[c].length&&"."!==b[c]&&(".."!==b[c]?g>0?g--:h.push(b[c]):g++);return c=a.length-g,f=c<=0?h.reverse().join("/"):a.slice(0,c).join("/")+"/"+h.reverse().join("/"),0!==f.indexOf("/")&&(f="/"+f),e&&f.lastIndexOf("/")!==f.length-1&&(f+=e),f},getURI:function(a){var b,c=this;return c.source&&!a||(b="",a||(b+=c.protocol?c.protocol+"://":"//",c.userInfo&&(b+=c.userInfo+"@"),c.host&&(b+=c.host),c.port&&(b+=":"+c.port)),c.path&&(b+=c.path),c.query&&(b+="?"+c.query),c.anchor&&(b+="#"+c.anchor),c.source=b),c.source}},c.parseDataUri=function(a){var b,c;return a=decodeURIComponent(a).split(","),c=/data:([^;]+)/.exec(a[0]),c&&(b=c[1]),{type:b,data:a[1]}},c.getDocumentBaseUrl=function(a){var b;return b=0!==a.protocol.indexOf("http")&&"file:"!==a.protocol?a.href:a.protocol+"//"+a.host+a.pathname,/^[^:]+:\/\/\/?[^\/]+\//.test(b)&&(b=b.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(b)||(b+="/")),b},c}),g("z",["c"],function(a){function b(){}var c,d,e=a.each,f=a.extend;return b.extend=c=function(a){function b(){var a,b,c,e=this;if(!d&&(e.init&&e.init.apply(e,arguments),b=e.Mixins))for(a=b.length;a--;)c=b[a],c.init&&c.init.apply(e,arguments)}function g(){return this}function h(a,b){return function(){var c,d=this,e=d._super;return d._super=m[a],c=b.apply(d,arguments),d._super=e,c}}var i,j,k,l=this,m=l.prototype;d=!0,i=new l,d=!1,a.Mixins&&(e(a.Mixins,function(b){for(var c in b)"init"!==c&&(a[c]=b[c])}),m.Mixins&&(a.Mixins=m.Mixins.concat(a.Mixins))),a.Methods&&e(a.Methods.split(","),function(b){a[b]=g}),a.Properties&&e(a.Properties.split(","),function(b){var c="_"+b;a[b]=function(a){var b,d=this;return a!==b?(d[c]=a,d):d[c]}}),a.Statics&&e(a.Statics,function(a,c){b[c]=a}),a.Defaults&&m.Defaults&&(a.Defaults=f({},m.Defaults,a.Defaults));for(j in a)k=a[j],"function"==typeof k&&m[j]?i[j]=h(j,k):i[j]=k;return b.prototype=i,b.constructor=b,b.extend=c,b},b}),g("10",["c"],function(a){function b(b){function c(){return!1}function d(){return!0}function e(a,e){var f,h,i,k;if(a=a.toLowerCase(),e=e||{},e.type=a,e.target||(e.target=j),e.preventDefault||(e.preventDefault=function(){e.isDefaultPrevented=d},e.stopPropagation=function(){e.isPropagationStopped=d},e.stopImmediatePropagation=function(){e.isImmediatePropagationStopped=d},e.isDefaultPrevented=c,e.isPropagationStopped=c,e.isImmediatePropagationStopped=c),b.beforeFire&&b.beforeFire(e),f=m[a])for(h=0,i=f.length;h0}function f(a,b){var c,g;if(a===b)return!0;if(null===a||null===b)return a===b;if("object"!=typeof a||"object"!=typeof b)return a===b;if(d.isArray(b)){if(a.length!==b.length)return!1;for(c=a.length;c--;)if(!f(a[c],b[c]))return!1}if(e(a)||e(b))return a===b;g={};for(c in b){if(!f(a[c],b[c]))return!1;g[c]=!0}for(c in a)if(!g[c]&&!f(a[c],b[c]))return!1;return!0}return b.extend({Mixins:[c],init:function(b){var c,d;b=b||{};for(c in b)d=b[c],d instanceof a&&(b[c]=d.create(this,c));this.data=b},set:function(b,c){var d,e,g=this.data[b];if(c instanceof a&&(c=c.create(this,b)),"object"==typeof b){for(d in b)this.set(d,b[d]);return this}return f(g,c)||(this.data[b]=c,e={target:this,name:b,value:c,oldValue:g},this.fire("change:"+b,e),this.fire("change",e)),this},get:function(a){return this.data[a]},has:function(a){return a in this.data},bind:function(b){return a.create(this,b)},destroy:function(){this.fire("destroy")}})}),g("2j",["z"],function(a){"use strict";function b(a){for(var b,c=[],d=a.length;d--;)b=a[d],b.__checked||(c.push(b),b.__checked=1);for(d=c.length;d--;)delete c[d].__checked;return c}var c,d=/^([\w\\*]+)?(?:#([\w\-\\]+))?(?:\.([\w\\\.]+))?(?:\[\@?([\w\\]+)([\^\$\*!~]?=)([\w\\]+)\])?(?:\:(.+))?/i,e=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,f=/^\s*|\s*$/g,g=a.extend({init:function(a){function b(a){if(a)return a=a.toLowerCase(),function(b){return"*"===a||b.type===a}}function c(a){if(a)return function(b){return b._name===a}}function g(a){if(a)return a=a.split("."),function(b){for(var c=a.length;c--;)if(!b.classes.contains(a[c]))return!1;return!0}}function h(a,b,c){if(a)return function(d){var e=d[a]?d[a]():"";return b?"="===b?e===c:"*="===b?e.indexOf(c)>=0:"~="===b?(" "+e+" ").indexOf(" "+c+" ")>=0:"!="===b?e!=c:"^="===b?0===e.indexOf(c):"$="===b&&e.substr(e.length-c.length)===c:!!c}}function i(a){var b;if(a)return a=/(?:not\((.+)\))|(.+)/i.exec(a),a[1]?(b=k(a[1],[]),function(a){return!l(a,b)}):(a=a[2],function(b,c,d){return"first"===a?0===c:"last"===a?c===d-1:"even"===a?c%2===0:"odd"===a?c%2===1:!!b[a]&&b[a]()})}function j(a,e,j){function k(a){a&&e.push(a)}var l;return l=d.exec(a.replace(f,"")),k(b(l[1])),k(c(l[2])),k(g(l[3])),k(h(l[4],l[5],l[6])),k(i(l[7])),e.pseudo=!!l[7],e.direct=j,e}function k(a,b){var c,d,f,g=[];do if(e.exec(""),d=e.exec(a),d&&(a=d[3],g.push(d[1]),d[2])){c=d[3];break}while(d);for(c&&k(c,b),a=[],f=0;f"!=g[f]&&a.push(j(g[f],[],">"===g[f-1]));return b.push(a),b}var l=this.match;this._selectors=k(a,[])},match:function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;for(b=b||this._selectors,c=0,d=b.length;c=0;e--)for(j=g[e];o;){if(j.pseudo)for(m=o.parent().items(),k=l=m.length;k--&&m[k]!==o;);for(h=0,i=j.length;h1&&(h=b(h))}return c||(c=g.Collection),new c(h)}});return g}),g("2k",["c","2j","z"],function(a,b,c){"use strict";var d,e,f=Array.prototype.push,g=Array.prototype.slice;return e={length:0,init:function(a){a&&this.add(a)},add:function(b){var c=this;return a.isArray(b)?f.apply(c,b):b instanceof d?c.add(b.toArray()):f.call(c,b),c},set:function(a){var b,c=this,d=c.length;for(c.length=0,c.add(a),b=c.length;b0&&(a+=" "),a+=this.prefix+this.cls[b];return a},c}),g("2l",["8"],function(a){var b,c={};return{add:function(d){var e=d.parent();if(e){if(!e._layout||e._layout.isNative())return;c[e._id]||(c[e._id]=e),b||(b=!0,a.requestAnimationFrame(function(){var a,d;b=!1;for(a in c)d=c[a],d.state.get("rendered")&&d.reflow();c={}},document.body))}},remove:function(a){c[a._id]&&delete c[a._id]}}}),g("2m",["z","c","10","54","2k","55","d","56","57","2l"],function(a,b,c,d,e,f,g,h,i,j){"use strict";function k(a){return a._eventDispatcher||(a._eventDispatcher=new c({scope:a,toggleEvent:function(b,d){d&&c.isNative(b)&&(a._nativeEvents||(a._nativeEvents={}),a._nativeEvents[b]=!0,a.state.get("rendered")&&l(a))}})),a._eventDispatcher}function l(a){function b(b){var c=a.getParentCtrl(b.target);c&&c.fire(b.type,b)}function c(){var a=j._lastHoverCtrl;a&&(a.fire("mouseleave",{target:a.getEl()}),a.parents().each(function(a){a.fire("mouseleave",{target:a.getEl()})}),j._lastHoverCtrl=null)}function d(b){var c,d,e,f=a.getParentCtrl(b.target),g=j._lastHoverCtrl,h=0;if(f!==g){if(j._lastHoverCtrl=f,d=f.parents().toArray().reverse(),d.push(f),g){for(e=g.parents().toArray().reverse(),e.push(g),h=0;h=h;c--)g=e[c],g.fire("mouseleave",{target:g.getEl()})}for(c=h;ci.maxW?i.maxW:c,i.w=c,i.innerW=c-d),c=a.h,c!==f&&(c=ci.maxH?i.maxH:c,i.h=c,i.innerH=c-e),c=a.innerW,c!==f&&(c=ci.maxW-d?i.maxW-d:c,i.innerW=c,i.w=c+d),c=a.innerH,c!==f&&(c=ci.maxH-e?i.maxH-e:c,i.innerH=c,i.h=c+e),a.contentW!==f&&(i.contentW=a.contentW),a.contentH!==f&&(i.contentH=a.contentH),b=h._lastLayoutRect,b.x===i.x&&b.y===i.y&&b.w===i.w&&b.h===i.h||(g=m.repaintControls,g&&g.map&&!g.map[h._id]&&(g.push(h),g.map[h._id]=!0),b.x=i.x,b.y=i.y,b.w=i.w,b.h=i.h),h):i},repaint:function(){var a,b,c,d,e,f,g,h,i,j,k=this;i=document.createRange?function(a){return a}:Math.round,a=k.getEl().style,d=k._layoutRect,h=k._lastRepaintRect||{},e=k.borderBox,f=e.left+e.right,g=e.top+e.bottom,d.x!==h.x&&(a.left=i(d.x)+"px",h.x=d.x),d.y!==h.y&&(a.top=i(d.y)+"px",h.y=d.y),d.w!==h.w&&(j=i(d.w-f),a.width=(j>=0?j:0)+"px",h.w=d.w),d.h!==h.h&&(j=i(d.h-g),a.height=(j>=0?j:0)+"px",h.h=d.h),k._hasBody&&d.innerW!==h.innerW&&(j=i(d.innerW),c=k.getEl("body"),c&&(b=c.style,b.width=(j>=0?j:0)+"px"),h.innerW=d.innerW),k._hasBody&&d.innerH!==h.innerH&&(j=i(d.innerH),c=c||k.getEl("body"),c&&(b=b||c.style,b.height=(j>=0?j:0)+"px"),h.innerH=d.innerH),k._lastRepaintRect=h,k.fire("repaint",{},!1)},updateLayoutRect:function(){var a=this;a.parent()._lastRect=null,f.css(a.getEl(),{width:"",height:""}),a._layoutRect=a._lastRepaintRect=a._lastLayoutRect=null,a.initLayoutRect()},on:function(a,b){function c(a){var b,c;return"string"!=typeof a?a:function(e){return b||d.parentsAndSelf().each(function(d){var e=d.settings.callbacks;if(e&&(b=e[a]))return c=d,!1}),b?b.call(c,e):(e.action=a,void this.fire("execute",e))}}var d=this;return k(d).on(a,c(b)),d},off:function(a,b){return k(this).off(a,b),this},fire:function(a,b,c){var d=this;if(b=b||{},b.control||(b.control=d),b=k(d).fire(a,b),c!==!1&&d.parent)for(var e=d.parent();e&&!b.isPropagationStopped();)e.fire(a,b,!1),e=e.parent();return b},hasEventListeners:function(a){return k(this).has(a)},parents:function(a){var b,c=this,d=new e;for(b=c.parent();b;b=b.parent())d.add(b);return a&&(d=d.filter(a)),d},parentsAndSelf:function(a){return new e(this).add(this.parents(a))},next:function(){var a=this.parent().items();return a[a.indexOf(this)+1]},prev:function(){var a=this.parent().items();return a[a.indexOf(this)-1]},innerHtml:function(a){return this.$el.html(a),this},getEl:function(a){var b=a?this._id+"-"+a:this._id;return this._elmCache[b]||(this._elmCache[b]=g("#"+b)[0]),this._elmCache[b]},show:function(){return this.visible(!0)},hide:function(){return this.visible(!1)},focus:function(){try{this.getEl().focus()}catch(a){}return this},blur:function(){return this.getEl().blur(),this},aria:function(a,b){var c=this,d=c.getEl(c.ariaTarget);return"undefined"==typeof b?c._aria[a]:(c._aria[a]=b,c.state.get("rendered")&&d.setAttribute("role"==a?a:"aria-"+a,b),c)},encode:function(a,b){return b!==!1&&(a=this.translate(a)),(a||"").replace(/[&<>"]/g,function(a){return"&#"+a.charCodeAt(0)+";"})},translate:function(a){return m.translate?m.translate(a):a},before:function(a){var b=this,c=b.parent();return c&&c.insert(a,c.items().indexOf(b),!0),b},after:function(a){var b=this,c=b.parent();return c&&c.insert(a,c.items().indexOf(b)),b},remove:function(){var a,b,c=this,d=c.getEl(),e=c.parent();if(c.items){var f=c.items().toArray();for(b=f.length;b--;)f[b].remove()}e&&e.items&&(a=[],e.items().each(function(b){b!==c&&a.push(b)}),e.items().set(a),e._lastRect=null),c._eventsRoot&&c._eventsRoot==c&&g(d).off();var h=c.getRoot().controlIdLookup;return h&&delete h[c._id],d&&d.parentNode&&d.parentNode.removeChild(d),c.state.set("rendered",!1),c.state.destroy(),c.fire("remove"),c},renderBefore:function(a){return g(a).before(this.renderHtml()),this.postRender(),this},renderTo:function(a){return g(a||this.getContainerElm()).append(this.renderHtml()),this.postRender(),this},preRender:function(){},render:function(){},renderHtml:function(){return'
'},postRender:function(){var a,b,c,d,e,f=this,h=f.settings;f.$el=g(f.getEl()),f.state.set("rendered",!0);for(d in h)0===d.indexOf("on")&&f.on(d.substr(2),h[d]);if(f._eventsRoot){for(c=f.parent();!e&&c;c=c.parent())e=c._eventsRoot;if(e)for(d in e._nativeEvents)f._nativeEvents[d]=!0}l(f),h.style&&(a=f.getEl(),a&&(a.setAttribute("style",h.style),a.style.cssText=h.style)),f.settings.border&&(b=f.borderBox,f.$el.css({"border-top-width":b.top,"border-right-width":b.right,"border-bottom-width":b.bottom,"border-left-width":b.left}));var i=f.getRoot();i.controlIdLookup||(i.controlIdLookup={}),i.controlIdLookup[f._id]=f;for(var k in f._aria)f.aria(k,f._aria[k]);f.state.get("visible")===!1&&(f.getEl().style.display="none"),f.bindStates(),f.state.on("change:visible",function(a){var b,c=a.value;f.state.get("rendered")&&(f.getEl().style.display=c===!1?"none":"",f.getEl().getBoundingClientRect()),b=f.parent(),b&&(b._lastRect=null),f.fire(c?"show":"hide"),j.add(f)}),f.fire("postrender",{},!1)},bindStates:function(){},scrollIntoView:function(a){function b(a,b){var c,d,e=a;for(c=d=0;e&&e!=b&&e.nodeType;)c+=e.offsetLeft||0,d+=e.offsetTop||0,e=e.offsetParent;return{x:c,y:d}}var c,d,e,f,g,h,i=this.getEl(),j=i.parentNode,k=b(i,j);return c=k.x,d=k.y,e=i.offsetWidth,f=i.offsetHeight,g=j.clientWidth,h=j.clientHeight,"end"==a?(c-=g-e,d-=h-f):"center"==a&&(c-=g/2-e/2,d-=h/2-f/2),j.scrollLeft=c,j.scrollTop=d,this},getRoot:function(){for(var a,b=this,c=[];b;){if(b.rootControl){a=b.rootControl;break}c.push(b),a=b,b=b.parent()}a||(a=this);for(var d=c.length;d--;)c[d].rootControl=a;return a},reflow:function(){j.remove(this);var a=this.parent();return a&&a._layout&&!a._layout.isNative()&&a.reflow(),this}};return b.each("text title visible disabled active value".split(" "),function(a){r[a]=function(b){return 0===arguments.length?this.state.get(a):("undefined"!=typeof b&&this.state.set(a,b),this)}}),m=a.extend(r)}),g("2n",[],function(){"use strict";var a={};return{add:function(b,c){a[b.toLowerCase()]=c},has:function(b){return!!a[b.toLowerCase()]},create:function(b,c){var d;if("string"==typeof b?(c=c||{},c.type=b):(c=b,b=c.type),b=b.toLowerCase(),d=a[b],!d)throw new Error("Could not find control by type: "+b);return d=new d(c),d.type=b,d}}}),g("2o",[],function(){"use strict";var a=function(a){return!!a.getAttribute("data-mce-tabstop")};return function(b){function c(a){return a&&1===a.nodeType}function d(a){return a=a||u,c(a)?a.getAttribute("role"):null}function e(a){for(var b,c=a||u;c=c.parentNode;)if(b=d(c))return b}function f(a){var b=u;if(c(b))return b.getAttribute("aria-"+a)}function g(a){var b=a.tagName.toUpperCase();return"INPUT"==b||"TEXTAREA"==b||"SELECT"==b}function h(b){return!(!g(b)||b.hidden)||(!!a(b)||!!/^(button|menuitem|checkbox|tab|menuitemcheckbox|option|gridcell|slider)$/.test(d(b)))}function i(a){function b(a){if(1==a.nodeType&&"none"!=a.style.display&&!a.disabled){h(a)&&c.push(a);for(var d=0;d=b.length&&(a=0),b[a]&&b[a].focus(),a}function m(a,b){var c=-1,d=j();b=b||i(d.getEl());for(var e=0;e=0&&(c=b.getEl(),c&&c.parentNode.removeChild(c),c=a.getEl(),c&&c.parentNode.removeChild(c)),b.parent(this)},create:function(b){var c,e=this,g=[];return f.isArray(b)||(b=[b]),f.each(b,function(b){b&&(b instanceof a||("string"==typeof b&&(b={type:b}),c=f.extend({},e.settings.defaults,b), -b.type=c.type=c.type||b.type||e.settings.defaultType||(c.defaults?c.defaults.type:null),b=d.create(c)),g.push(b))}),g},renderNew:function(){var a=this;return a.items().each(function(b,c){var d;b.parent(a),b.state.get("rendered")||(d=a.getEl("body"),d.hasChildNodes()&&c<=d.childNodes.length-1?g(d.childNodes[c]).before(b.renderHtml()):g(d).append(b.renderHtml()),b.postRender(),i.add(b))}),a._layout.applyClasses(a.items().filter(":visible")),a._lastRect=null,a},append:function(a){return this.add(a).renderNew()},prepend:function(a){var b=this;return b.items().set(b.create(a).concat(b.items().toArray())),b.renderNew()},insert:function(a,b,c){var d,e,f,g=this;return a=g.create(a),d=g.items(),!c&&b=0&&b
'+(a.settings.html||"")+b.renderHtml(a)+"
"},postRender:function(){var a,b=this;return b.items().exec("postRender"),b._super(),b._layout.postRender(b),b.state.set("rendered",!0),b.settings.style&&b.$el.css(b.settings.style),b.settings.border&&(a=b.borderBox,b.$el.css({"border-top-width":a.top,"border-right-width":a.right,"border-bottom-width":a.bottom,"border-left-width":a.left})),b.parent()||(b.keyboardNav=new e({root:b})),b},initLayoutRect:function(){var a=this,b=a._super();return a._layout.recalc(a),b},recalc:function(){var a=this,b=a._layoutRect,c=a._lastRect;if(!c||c.w!=b.w||c.h!=b.h)return a._layout.recalc(a),b=a.layoutRect(),a._lastRect={x:b.x,y:b.y,w:b.w,h:b.h},!0},reflow:function(){var b;if(i.remove(this),this.visible()){for(a.repaintControls=[],a.repaintControls.map={},this.recalc(),b=a.repaintControls.length;b--;)a.repaintControls[b].repaint();"flow"!==this.settings.layout&&"stack"!==this.settings.layout&&this.repaint(),a.repaintControls=[]}return this}})}),g("2q",["d"],function(a){"use strict";function b(a){var b,c,d,e,f,g,h,i,j=Math.max;return b=a.documentElement,c=a.body,d=j(b.scrollWidth,c.scrollWidth),e=j(b.clientWidth,c.clientWidth),f=j(b.offsetWidth,c.offsetWidth),g=j(b.scrollHeight,c.scrollHeight),h=j(b.clientHeight,c.clientHeight),i=j(b.offsetHeight,c.offsetHeight),{width:d").css({position:"absolute",top:0,left:0,width:p.width,height:p.height,zIndex:2147483647,opacity:1e-4,cursor:o}).appendTo(n.body),a(n).on("mousemove touchmove",k).on("mouseup touchend",j),e.start(d)},k=function(a){return c(a),a.button!==h?j(a):(a.deltaX=a.screenX-l,a.deltaY=a.screenY-m,a.preventDefault(),void e.drag(a))},j=function(b){c(b),a(n).off("mousemove touchmove",k).off("mouseup touchend",j),g.remove(),e.stop&&e.stop(b)},this.destroy=function(){a(f()).off()},a(f()).on("mousedown touchstart",i)}}),g("2r",["d","2q"],function(a,b){"use strict";return{init:function(){var a=this;a.on("repaint",a.renderScroll)},renderScroll:function(){function c(){function b(b,g,h,i,j,k){var l,m,n,o,p,q,r,s,t;if(m=e.getEl("scroll"+b)){if(s=g.toLowerCase(),t=h.toLowerCase(),a(e.getEl("absend")).css(s,e.layoutRect()[i]-1),!j)return void a(m).css("display","none");a(m).css("display","block"),l=e.getEl("body"),n=e.getEl("scroll"+b+"t"),o=l["client"+h]-2*f,o-=c&&d?m["client"+k]:0,p=l["scroll"+h],q=o/p,r={},r[s]=l["offset"+g]+f,r[t]=o,a(m).css(r),r={},r[s]=l["scroll"+g]*q,r[t]=o*q,a(n).css(r)}}var c,d,g;g=e.getEl("body"),c=g.scrollWidth>g.clientWidth,d=g.scrollHeight>g.clientHeight,b("h","Left","Width","contentW",c,"Height"),b("v","Top","Height","contentH",d,"Width")}function d(){function c(c,d,g,h,i){var j,k=e._id+"-scroll"+c,l=e.classPrefix;a(e.getEl()).append('
'),e.draghelper=new b(k+"t",{start:function(){j=e.getEl("body")["scroll"+d],a("#"+k).addClass(l+"active")},drag:function(a){var b,k,l,m,n=e.layoutRect();k=n.contentW>n.innerW,l=n.contentH>n.innerH,m=e.getEl("body")["client"+g]-2*f,m-=k&&l?e.getEl("scroll"+c)["client"+i]:0,b=m/e.getEl("body")["scroll"+g],e.getEl("body")["scroll"+d]=j+a["delta"+h]/b},stop:function(){a("#"+k).removeClass(l+"active")}})}e.classes.add("scroll"),c("v","Top","Height","Y","Width"),c("h","Left","Width","X","Height")}var e=this,f=2;e.settings.autoScroll&&(e._hasScroll||(e._hasScroll=!0,d(),e.on("wheel",function(a){var b=e.getEl("body");b.scrollLeft+=10*(a.deltaX||0),b.scrollTop+=10*a.deltaY,c()}),a(e.getEl("body")).on("scroll",c)),c())}}}),g("2s",["2p","2r"],function(a,b){"use strict";return a.extend({Defaults:{layout:"fit",containerCls:"panel"},Mixins:[b],renderHtml:function(){var a=this,b=a._layout,c=a.settings.html;return a.preRender(),b.preRender(a),"undefined"==typeof c?c='
'+b.renderHtml(a)+"
":("function"==typeof c&&(c=c.call(a)),a._hasBody=!1),'
'+(a._preBodyHtml||"")+c+"
"}})}),g("2t",["55"],function(a){"use strict";function b(b,c,d){var e,f,g,h,i,j,k,l,m,n;return m=a.getViewPort(),f=a.getPos(c),g=f.x,h=f.y,b.state.get("fixed")&&"static"==a.getRuntimeStyle(document.body,"position")&&(g-=m.x,h-=m.y),e=b.getEl(),n=a.getSize(e),i=n.width,j=n.height,n=a.getSize(c),k=n.width,l=n.height,d=(d||"").split(""),"b"===d[0]&&(h+=l),"r"===d[1]&&(g+=k),"c"===d[0]&&(h+=Math.round(l/2)),"c"===d[1]&&(g+=Math.round(k/2)),"b"===d[3]&&(h-=j),"r"===d[4]&&(g-=i),"c"===d[3]&&(h-=Math.round(j/2)),"c"===d[4]&&(g-=Math.round(i/2)),{x:g,y:h,w:i,h:j}}return{testMoveRel:function(c,d){for(var e=a.getViewPort(),f=0;f0&&g.x+g.w0&&g.y+g.he.x&&g.x+g.we.y&&g.y+g.hb?(a=b-c,a<0?0:a):a}var e=this;if(e.settings.constrainToViewport){var f=a.getViewPort(window),g=e.layoutRect();b=d(b,f.w+f.x,g.w),c=d(c,f.h+f.y,g.h)}return e.state.get("rendered")?e.layoutRect({x:b,y:c}).repaint():(e.settings.x=b,e.settings.y=c),e.fire("move",{x:b,y:c}),e}}}),g("2u",["55"],function(a){"use strict";return{resizeToContent:function(){this._layoutRect.autoResize=!0,this._lastRect=null,this.reflow()},resizeTo:function(b,c){if(b<=1||c<=1){var d=a.getWindowSize();b=b<=1?b*d.w:b,c=c<=1?c*d.h:c}return this._layoutRect.autoResize=!1,this.layoutRect({minW:b,minH:c,w:b,h:c}).reflow()},resizeBy:function(a,b){var c=this,d=c.layoutRect();return c.resizeTo(d.w+a,d.h+b)}}}),g("2v",["2s","2t","2u","55","d","8"],function(a,b,c,d,e,f){"use strict";function g(a,b){for(;a;){if(a==b)return!0;a=a.parent()}}function h(a){for(var b=s.length;b--;){var c=s[b],d=c.getParentCtrl(a.target);if(c.settings.autohide){if(d&&(g(d,c)||c.parent()===d))continue;a=c.fire("autohide",{target:a.target}),a.isDefaultPrevented()||c.hide()}}}function i(){o||(o=function(a){2!=a.button&&h(a)},e(document).on("click touchstart",o))}function j(){p||(p=function(){var a;for(a=s.length;a--;)l(s[a])},e(window).on("scroll",p))}function k(){if(!q){var a=document.documentElement,b=a.clientWidth,c=a.clientHeight;q=function(){document.all&&b==a.clientWidth&&c==a.clientHeight||(b=a.clientWidth,c=a.clientHeight,u.hideAll())},e(window).on("resize",q)}}function l(a){function b(b,c){for(var d,e=0;ec&&(a.fixed(!1).layoutRect({y:a._autoFixY}).repaint(),b(!1,a._autoFixY-c)):(a._autoFixY=a.layoutRect().y,a._autoFixY').appendTo(b.getContainerElm())),f.setTimeout(function(){c.addClass(d+"in"),e(b.getEl()).addClass(d+"in")}),r=!0),m(!0,b)}}),b.on("show",function(){b.parents().each(function(a){if(a.state.get("fixed"))return b.fixed(!0),!1})}),a.popover&&(b._preBodyHtml='
',b.classes.add("popover").add("bottom").add(b.isRtl()?"end":"start")),b.aria("label",a.ariaLabel),b.aria("labelledby",b._id),b.aria("describedby",b.describedBy||b._id+"-none")},fixed:function(a){var b=this;if(b.state.get("fixed")!=a){if(b.state.get("rendered")){var c=d.getViewPort();a?b.layoutRect().y-=c.y:b.layoutRect().y+=c.y}b.classes.toggle("fixed",a),b.state.set("fixed",a)}return b},show:function(){var a,b=this,c=b._super();for(a=s.length;a--&&s[a]!==b;);return a===-1&&s.push(b),c},hide:function(){return n(this),m(!1,this),this._super()},hideAll:function(){u.hideAll()},close:function(){var a=this;return a.fire("close").isDefaultPrevented()||(a.remove(),m(!1,a)),a},remove:function(){n(this),this._super()},postRender:function(){var a=this;return a.settings.bodyRole&&this.getEl("body").setAttribute("role",a.settings.bodyRole),a._super()}});return u.hideAll=function(){for(var a=s.length;a--;){var b=s[a];b&&b.settings.autohide&&(b.hide(),s.splice(a,1))}},u}),g("29",["2v","2s","55","d","2q","56","9","8"],function(a,b,c,d,e,f,g,h){"use strict";function i(a){var b,c="width=device-width,initial-scale=1.0,user-scalable=0,minimum-scale=1.0,maximum-scale=1.0",e=d("meta[name=viewport]")[0];g.overrideViewPort!==!1&&(e||(e=document.createElement("meta"),e.setAttribute("name","viewport"),document.getElementsByTagName("head")[0].appendChild(e)),b=e.getAttribute("content"),b&&"undefined"!=typeof n&&(n=b),e.setAttribute("content",a?c:n))}function j(a,b){k()&&b===!1&&d([document.documentElement,document.body]).removeClass(a+"fullscreen")}function k(){for(var a=0;aa.w&&(d=a.x-Math.max(0,b/2),f.layoutRect({w:b,x:d}),e=!0)),g&&(g.layoutRect({w:f.layoutRect().innerW}).recalc(),b=g.layoutRect().minW+a.deltaW,b>a.w&&(d=a.x-Math.max(0,b-a.w),f.layoutRect({w:b,x:d}),e=!0)),e&&f.recalc()},initLayoutRect:function(){var a,b=this,d=b._super(),e=0;if(b.settings.title&&!b._fullscreen){a=b.getEl("head");var f=c.getSize(a);d.headerW=f.width,d.headerH=f.height,e+=d.headerH}b.statusbar&&(e+=b.statusbar.layoutRect().h),d.deltaH+=e,d.minH+=e,d.h+=e;var g=c.getWindowSize();return d.x=b.settings.x||Math.max(0,g.w/2-d.w/2),d.y=b.settings.y||Math.max(0,g.h/2-d.h/2),d},renderHtml:function(){var a=this,b=a._layout,c=a._id,d=a.classPrefix,e=a.settings,f="",g="",h=e.html;return a.preRender(),b.preRender(a),e.title&&(f='
'+a.encode(e.title)+'
'),e.url&&(h=''),"undefined"==typeof h&&(h=b.renderHtml(a)),a.statusbar&&(g=a.statusbar.renderHtml()),'
'+f+'
'+h+"
"+g+"
"},fullscreen:function(a){var b,e,g=this,i=document.documentElement,j=g.classPrefix;if(a!=g._fullscreen)if(d(window).on("resize",function(){var a;if(g._fullscreen)if(b)g._timer||(g._timer=h.setTimeout(function(){var a=c.getWindowSize();g.moveTo(0,0).resizeTo(a.w,a.h),g._timer=0},50));else{a=(new Date).getTime();var d=c.getWindowSize();g.moveTo(0,0).resizeTo(d.w,d.h),(new Date).getTime()-a>50&&(b=!0)}}),e=g.layoutRect(),g._fullscreen=a,a){g._initial={x:e.x,y:e.y,w:e.w,h:e.h},g.borderBox=f.parseBox("0"),g.getEl("head").style.display="none",e.deltaH-=e.headerH+2,d([i,document.body]).addClass(j+"fullscreen"),g.classes.add("fullscreen");var k=c.getWindowSize();g.moveTo(0,0).resizeTo(k.w,k.h)}else g.borderBox=f.parseBox(g.settings.border),g.getEl("head").style.display="",e.deltaH+=e.headerH,d([i,document.body]).removeClass(j+"fullscreen"),g.classes.remove("fullscreen"),g.moveTo(g._initial.x,g._initial.y).resizeTo(g._initial.w,g._initial.h);return g.reflow()},postRender:function(){var a,b=this;setTimeout(function(){b.classes.add("in"),b.fire("open")},0),b._super(),b.statusbar&&b.statusbar.postRender(),b.focus(),this.dragHelper=new e(b._id+"-dragh",{start:function(){a={x:b.layoutRect().x,y:b.layoutRect().y}},drag:function(c){b.moveTo(a.x+c.deltaX,a.y+c.deltaY)}}),b.on("submit",function(a){a.isDefaultPrevented()||b.close()}),m.push(b),i(!0)},submit:function(){return this.fire("submit",{data:this.toJSON()})},remove:function(){var a,b=this;for(b.dragHelper.destroy(),b._super(),b.statusbar&&this.statusbar.remove(),j(b.classPrefix,!1),a=m.length;a--;)m[a]===b&&m.splice(a,1);i(m.length>0)},getContentWindow:function(){var a=this.getEl().getElementsByTagName("iframe")[0];return a?a.contentWindow:null}});return l(),o}),g("2a",["29"],function(a){"use strict";var b=a.extend({init:function(a){a={border:1,padding:20,layout:"flex",pack:"center",align:"center",containerCls:"panel",autoScroll:!0,buttons:{type:"button",text:"Ok",action:"ok"},items:{type:"label",multiline:!0,maxWidth:500,maxHeight:200}},this._super(a)},Statics:{OK:1,OK_CANCEL:2,YES_NO:3,YES_NO_CANCEL:4,msgBox:function(c){function d(a,b,c){return{type:"button",text:a,subtype:c?"primary":"",onClick:function(a){a.control.parents()[1].close(),f(b)}}}var e,f=c.callback||function(){};switch(c.buttons){case b.OK_CANCEL:e=[d("Ok",!0,!0),d("Cancel",!1)];break;case b.YES_NO:case b.YES_NO_CANCEL:e=[d("Yes",1,!0),d("No",0)],c.buttons==b.YES_NO_CANCEL&&e.push(d("Cancel",-1));break;default:e=[d("Ok",!0,!0)]}return new a({padding:20,x:c.x,y:c.y,minWidth:300,minHeight:100,layout:"flex",pack:"center",align:"center",buttons:e,title:c.title,role:"alertdialog",items:{type:"label",multiline:!0,maxWidth:500,maxHeight:200,text:c.text},onPostRender:function(){this.aria("describedby",this.items()[0]._id)},onClose:c.onClose,onCancel:function(){f(!1)}}).renderTo(document.body).reflow()},alert:function(a,c){return"string"==typeof a&&(a={text:a}),a.callback=c,b.msgBox(a)},confirm:function(a,c){return"string"==typeof a&&(a={text:a}),a.callback=c,a.buttons=b.OK_CANCEL,b.msgBox(a)}}});return b}),g("12",["29","2a"],function(a,b){return function(c){function d(){if(h.length)return h[h.length-1]}function e(a){c.fire("OpenWindow",{win:a})}function f(a){c.fire("CloseWindow",{win:a})}var g=this,h=[];g.windows=h,c.on("remove",function(){for(var a=h.length;a--;)h[a].close()}),g.open=function(b,d){var g;return c.editorManager.setActive(c),b.title=b.title||" ",b.url=b.url||b.file,b.url&&(b.width=parseInt(b.width||320,10),b.height=parseInt(b.height||240,10)),b.body&&(b.items={defaults:b.defaults,type:b.bodyType||"form",items:b.body,data:b.data,callbacks:b.commands}),b.url||b.buttons||(b.buttons=[{text:"Ok",subtype:"primary",onclick:function(){g.find("form")[0].submit()}},{text:"Cancel",onclick:function(){g.close()}}]),g=new a(b),h.push(g),g.on("close",function(){for(var a=h.length;a--;)h[a]===g&&h.splice(a,1);h.length||c.focus(),f(g)}),b.data&&g.on("postRender",function(){this.find("*").each(function(a){var c=a.name();c in b.data&&a.value(b.data[c])})}),g.features=b||{},g.params=d||{},1===h.length&&c.nodeChanged(),g=g.renderTo().reflow(),e(g),g},g.alert=function(a,d,g){var h;h=b.alert(a,function(){d?d.call(g||this):c.focus()}),h.on("close",function(){f(h)}),e(h)},g.confirm=function(a,c,d){var g;g=b.confirm(a,function(a){c.call(d||this,a)}),g.on("close",function(){f(g)}),e(g)},g.close=function(){d()&&d().close()},g.getParams=function(){return d()?d().params:null},g.setParams=function(a){d()&&(d().params=a)},g.getWindows=function(){return h}}}),g("2w",["2m","2t"],function(a,b){return a.extend({Mixins:[b],Defaults:{classes:"widget tooltip tooltip-n"},renderHtml:function(){var a=this,b=a.classPrefix;return'"},bindStates:function(){var a=this;return a.state.on("change:text",function(b){a.getEl().lastChild.innerHTML=a.encode(b.value)}),a._super()},repaint:function(){var a,b,c=this;a=c.getEl().style,b=c._layoutRect,a.left=b.x+"px",a.top=b.y+"px",a.zIndex=131070}})}),g("2x",["2m","2w"],function(a,b){"use strict";var c,d=a.extend({init:function(a){var b=this;b._super(a),a=b.settings,b.canFocus=!0,a.tooltip&&d.tooltips!==!1&&(b.on("mouseenter",function(c){var d=b.tooltip().moveTo(-65535);if(c.control==b){var e=d.text(a.tooltip).show().testMoveRel(b.getEl(),["bc-tc","bc-tl","bc-tr"]);d.classes.toggle("tooltip-n","bc-tc"==e),d.classes.toggle("tooltip-nw","bc-tl"==e),d.classes.toggle("tooltip-ne","bc-tr"==e),d.moveRel(b.getEl(),e)}else d.hide()}),b.on("mouseleave mousedown click",function(){b.tooltip().hide()})),b.aria("label",a.ariaLabel||a.tooltip)},tooltip:function(){return c||(c=new b({type:"tooltip"}),c.renderTo()),c},postRender:function(){var a=this,b=a.settings;a._super(),a.parent()||!b.width&&!b.height||(a.initLayoutRect(),a.repaint()),b.autofocus&&a.focus()},bindStates:function(){function a(a){c.aria("disabled",a),c.classes.toggle("disabled",a)}function b(a){c.aria("pressed",a),c.classes.toggle("active",a)}var c=this;return c.state.on("change:disabled",function(b){a(b.value)}),c.state.on("change:active",function(a){b(a.value)}),c.state.get("disabled")&&a(!0),c.state.get("active")&&b(!0),c._super()},remove:function(){this._super(),c&&(c.remove(),c=null)}});return d}),g("2y",["2x"],function(a){"use strict";return a.extend({Defaults:{value:0},init:function(a){var b=this;b._super(a),b.classes.add("progress"),b.settings.filter||(b.settings.filter=function(a){return Math.round(a)})},renderHtml:function(){var a=this,b=a._id,c=this.classPrefix;return'
0%
'},postRender:function(){var a=this;return a._super(),a.value(a.settings.value),a},bindStates:function(){function a(a){a=b.settings.filter(a),b.getEl().lastChild.innerHTML=a+"%",b.getEl().firstChild.firstChild.style.width=a+"%"}var b=this;return b.state.on("change:value",function(b){a(b.value)}),a(b.state.get("value")),b._super()}})}),g("2b",["2m","2t","2y","8"],function(a,b,c,d){var e=function(a,b){a.getEl().lastChild.textContent=b+(a.progressBar?" "+a.progressBar.value()+"%":"")};return a.extend({Mixins:[b],Defaults:{classes:"widget notification"},init:function(a){var b=this;b._super(a),a.text&&b.text(a.text),a.icon&&(b.icon=a.icon),a.color&&(b.color=a.color),a.type&&b.classes.add("notification-"+a.type),a.timeout&&(a.timeout<0||a.timeout>0)&&!a.closeButton?b.closeButton=!1:(b.classes.add("has-close"),b.closeButton=!0),a.progressBar&&(b.progressBar=new c),b.on("click",function(a){a.target.className.indexOf(b.classPrefix+"close")!=-1&&b.close()})},renderHtml:function(){var a=this,b=a.classPrefix,c="",d="",e="",f="";return a.icon&&(c=''),a.color&&(f=' style="background-color: '+a.color+'"'),a.closeButton&&(d=''),a.progressBar&&(e=a.progressBar.renderHtml()),''},postRender:function(){var a=this;return d.setTimeout(function(){a.$el.addClass(a.classPrefix+"in"),e(a,a.state.get("text"))},100),a._super()},bindStates:function(){var a=this;return a.state.on("change:text",function(b){a.getEl().firstChild.innerHTML=b.value,e(a,b.value)}),a.progressBar&&(a.progressBar.bindStates(),a.progressBar.state.on("change:value",function(b){e(a,a.state.get("text"))})),a._super()},close:function(){var a=this;return a.fire("close").isDefaultPrevented()||a.remove(),a},repaint:function(){var a,b,c=this;a=c.getEl().style,b=c._layoutRect,a.left=b.x+"px",a.top=b.y+"px",a.zIndex=65534}})}),g("13",["2b","8","c"],function(a,b,c){return function(d){function e(){if(m.length)return m[m.length-1]}function f(){b.requestAnimationFrame(function(){g(),h()})}function g(){for(var a=0;a0){var a=m.slice(0,1)[0],b=d.inline?d.getElement():d.getContentAreaContainer();if(a.moveRel(b,"tc-tc"),m.length>1)for(var c=1;c0&&(c.timer=setTimeout(function(){c.close()},b.timeout)),c.on("close",function(){var a=m.length;for(c.timer&&d.getWin().clearTimeout(c.timer);a--;)m[a]===c&&m.splice(a,1);h()}),c.renderTo(),h()):c=e,c}},l.close=function(){e()&&e().close()},l.getNotifications=function(){return m},d.on("SkinLoaded",function(){var a=d.settings.service_message;a&&d.notificationManager.open({text:a,type:"warning",timeout:0,icon:""})})}}),g("14",["11","h","c"],function(a,b,c){function d(a,b){return"selectionchange"==b?a.getDoc():!a.inline&&/^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(b)?a.getDoc().documentElement:a.settings.event_root?(a.eventRoot||(a.eventRoot=g.select(a.settings.event_root)[0]),a.eventRoot):a.getBody()}function e(a,b){function c(a){return!a.hidden&&!a.readonly}var e,h;if(a.delegates||(a.delegates={}),!a.delegates[b]&&!a.removed)if(e=d(a,b),a.settings.event_root){if(f||(f={},a.editorManager.on("removeEditor",function(){var b;if(!a.editorManager.activeEditor&&f){for(b in f)a.dom.unbind(d(a,b));f=null}})),f[b])return;h=function(d){for(var e=d.target,f=a.editorManager.editors,h=f.length;h--;){var i=f[h].getBody();(i===e||g.isChildOf(e,i))&&c(f[h])&&f[h].fire(b,d)}},f[b]=h,g.bind(e,b,h)}else h=function(d){c(a)&&a.fire(b,d)},g.bind(e,b,h),a.delegates[b]=h}var f,g=b.DOM,h={bindPendingEventDelegates:function(){var a=this;c.each(a._pendingNativeEvents,function(b){e(a,b)})},toggleNativeEvent:function(a,b){var c=this;"focus"!=a&&"blur"!=a&&(b?c.initialized?e(c,a):c._pendingNativeEvents?c._pendingNativeEvents.push(a):c._pendingNativeEvents=[a]:c.initialized&&(c.dom.unbind(d(c,a),a,c.delegates[a]),delete c.delegates[a]))},unbindAllNativeEvents:function(){var a,b=this;if(b.delegates){for(a in b.delegates)b.dom.unbind(d(b,a),a,b.delegates[a]);delete b.delegates}b.inline||(b.getBody().onload=null,b.dom.unbind(b.getWin()),b.dom.unbind(b.getDoc())),b.dom.unbind(b.getBody()),b.dom.unbind(b.getContainer())}};return h=c.extend({},a,h)}),g("15",["c","9"],function(a,b){var c=a.each,d=a.explode,e={f9:120,f10:121,f11:122},f=a.makeMap("alt,ctrl,shift,meta,access");return function(g){function h(a){var g,h,i={};c(d(a,"+"),function(a){a in f?i[a]=!0:/^[0-9]{2,}$/.test(a)?i.keyCode=parseInt(a,10):(i.charCode=a.charCodeAt(0),i.keyCode=e[a]||a.toUpperCase().charCodeAt(0))}),g=[i.keyCode];for(h in f)i[h]?g.push(h):i[h]=!1;return i.id=g.join(","),i.access&&(i.alt=!0,b.mac?i.ctrl=!0:i.shift=!0),i.meta&&(b.mac?i.meta=!0:(i.ctrl=!0,i.meta=!1)),i}function i(b,c,e,f){var i;return i=a.map(d(b,">"),h),i[i.length-1]=a.extend(i[i.length-1],{func:e,scope:f||g}),a.extend(i[0],{desc:g.translate(c),subpatterns:i.slice(1)})}function j(a){return a.altKey||a.ctrlKey||a.metaKey}function k(a){return"keydown"===a.type&&a.keyCode>=112&&a.keyCode<=123}function l(a,b){return!!b&&(b.ctrl==a.ctrlKey&&b.meta==a.metaKey&&(b.alt==a.altKey&&b.shift==a.shiftKey&&(!!(a.keyCode==b.keyCode||a.charCode&&a.charCode==b.charCode)&&(a.preventDefault(),!0))))}function m(a){return a.func?a.func.call(a.scope):null}var n=this,o={},p=[];g.on("keyup keypress keydown",function(a){!j(a)&&!k(a)||a.isDefaultPrevented()||(c(o,function(b){if(l(a,b))return p=b.subpatterns.slice(0),"keydown"==a.type&&m(b),!0}),l(a,p[0])&&(1===p.length&&"keydown"==a.type&&m(p[0]),p.shift()))}),n.add=function(b,e,f,h){var j;return j=f,"string"==typeof f?f=function(){g.execCommand(j,!1,null)}:a.isArray(j)&&(f=function(){g.execCommand(j[0],j[1],j[2])}),c(d(a.trim(b.toLowerCase())),function(a){var b=i(a,e,f,h);o[b.id]=b}),!0},n.remove=function(a){var b=i(a);return!!o[b.id]&&(delete o[b.id],!0)}}}),h("59",window),g("2h",["j"],function(a){var b=a.PluginManager,c=function(a,c){for(var d in b.urls){var e=b.urls[d]+"/plugin"+c+".js";if(e===a)return d}return null},d=function(a,b){var d=c(b,a.suffix);return d?"Failed to load plugin: "+d+" from url "+b:"Failed to load plugin url: "+b},e=function(a,b){a.notificationManager.open({type:"error",text:b})},f=function(a,b){a._skinLoaded?e(a,b):a.on("SkinLoaded",function(){e(a,b)})},g=function(a,b){f(a,"Failed to upload image: "+b)},h=function(a,b){f(a,d(a,b))},i=function(a,b){f(a,"Failed to load content css: "+b[0])},j=function(a){var b=window.console;b&&!window.test&&(b.error?b.error.apply(b,arguments):b.log.apply(b,arguments))};return{pluginLoadError:h,uploadError:g,displayError:f,contentCssError:i,initError:j}}),g("6u",["1","1w","5e","1u"],function(a,b,c,d){var e=function(d){return c.descendant(b.fromDom(d.getBody()),"*[data-mce-caret]").fold(a.constant(null),function(a){return a.dom()})},f=function(a){a.selection.setRng(a.selection.getRng())},g=function(a,b){b.hasAttribute("data-mce-caret")&&(d.showCaretContainerBlock(b),f(a),a.selection.scrollIntoView(b))},h=function(a,b){var c=e(a);if(c)return"compositionstart"===b.type?(b.preventDefault(),b.stopPropagation(),void g(c)):void(d.hasContent(c)&&g(a,c))},i=function(b){b.on("keyup compositionstart",a.curry(h,b))};return{setup:i}}),g("77",["7","c","49"],function(a,b,c){return function(c,d){function e(a,b){return a?a.replace(/\/$/,"")+"/"+b.replace(/^\//,""):b}function f(a,b,c,f){var g,h;g=new XMLHttpRequest,g.open("POST",d.url),g.withCredentials=d.credentials,g.upload.onprogress=function(a){f(a.loaded/a.total*100)},g.onerror=function(){c("Image upload failed due to a XHR Transport error. Code: "+g.status)},g.onload=function(){var a;return g.status<200||g.status>=300?void c("HTTP Error: "+g.status):(a=JSON.parse(g.responseText),a&&"string"==typeof a.location?void b(e(d.basePath,a.location)):void c("Invalid JSON: "+g.responseText))},h=new FormData,h.append("file",a.blob(),a.filename()),g.send(h)}function g(){return new a(function(a){a([])})}function h(a,b){return{url:b,blobInfo:a,status:!0}}function i(a,b){return{url:"",blobInfo:a,status:!1,error:b}}function j(a,c){b.each(p[a],function(a){a(c)}),delete p[a]}function k(b,d,e){return c.markPending(b.blobUri()),new a(function(a){var f,g,k=function(){};try{var l=function(){f&&(f.close(),g=k)},m=function(d){l(),c.markUploaded(b.blobUri(),d),j(b.blobUri(),h(b,d)),a(h(b,d))},n=function(d){l(),c.removeFailed(b.blobUri()),j(b.blobUri(),i(b,d)),a(i(b,d))};g=function(a){a<0||a>100||(f||(f=e()),f.progressBar.value(a))},d(b,m,n,g)}catch(c){a(i(b,c.message))}})}function l(a){return a===f}function m(b){var c=b.blobUri();return new a(function(a){p[c]=p[c]||[],p[c].push(a)})}function n(e,f){return e=b.grep(e,function(a){return!c.isUploaded(a.blobUri())}),a.all(b.map(e,function(a){return c.isPending(a.blobUri())?m(a):k(a,d.handler,f)}))}function o(a,b){return!d.url&&l(d.handler)?g():n(a,b)}var p={};return d=b.extend({credentials:!1,handler:f},d),{upload:o}}}),g("7p",["7"],function(a){function b(b){return new a(function(a,c){var d=function(){c("Cannot convert "+b+" to Blob. Resource might not exist or is inaccessible.")};try{var e=new XMLHttpRequest;e.open("GET",b,!0),e.responseType="blob",e.onload=function(){200==this.status?a(this.response):d()},e.onerror=d,e.send()}catch(a){d()}})}function c(a){var b,c;return a=decodeURIComponent(a).split(","),c=/data:([^;]+)/.exec(a[0]),c&&(b=c[1]),{type:b,data:a[1]}}function d(b){return new a(function(a){var d,e,f;b=c(b);try{d=atob(b.data)}catch(b){return void a(new Blob([]))}for(e=new Uint8Array(d.length),f=0;f0&&b.moveEnd("character",f),b.select()}catch(a){}a.nodeChanged()}}},c=function(c){c.settings.forced_root_block&&c.on("NodeChange",a.curry(b,c))};return{setup:c}}),g("7u",["1q","1t","4b"],function(a,b,c){function d(e){function f(b){return a.map(b,function(a){return a=c.clone(a),a.node=e,a})}if(a.isArray(e))return a.reduce(e,function(a,b){return a.concat(d(b))},[]);if(b.isElement(e))return f(e.getClientRects());if(b.isText(e)){var g=e.ownerDocument.createRange();return g.setStart(e,0),g.setEnd(e,e.data.length),f(g.getClientRects())}}return{getClientRects:d}});g("7g",["49","1q","1t","7u","4b","5n","4a"],function(a,b,c,d,e,f,g){function h(a,b){return Math.abs(a.left-b)}function i(a,b){return Math.abs(a.right-b)}function j(a,c){function d(a,b){return a>=b.left&&a<=b.right}return b.reduce(a,function(a,b){var e,f;return e=Math.min(h(a,c),i(a,c)),f=Math.min(h(b,c),i(b,c)),d(c,b)?b:d(c,a)?a:f==e&&p(b.node)?b:f=a.top&&e<=a.bottom}),g=j(f,c),g&&(g=j(l(a,g),c),g&&p(g.node))?n(g,c):null}var p=c.isContentEditableFalse,q=f.findNode,r=a.curry;return{findClosestClientRect:j,findLineNodeRects:l,closestCaret:o}});g("7x",["49","1q","7u","4a","5n","52","20","4b"],function(a,b,c,d,e,f,g,h){function i(a,b,c,f){for(;f=e.findNode(f,a,d.isEditableCaretCandidate,b);)if(c(f))return}function j(a,d,e,f,g,h){function j(f){var h,i,j;for(j=c.getClientRects(f),a==-1&&(j=j.reverse()),h=0;h0&&d(i,b.last(n))&&m++,i.line=m,g(i))return!0;n.push(i)}}var k,l,m=0,n=[];return(l=b.last(h.getClientRects()))?(k=h.getNode(),j(k),i(a,f,j,k),n):n}function k(a,b){return b.line>a}function l(a,b){return b.line===a}function m(a,c,d,e){function i(c){return 1==a?b.last(c.getClientRects()):b.last(c.getClientRects())}var j,k,l,m,n,o,p=new f(c),q=[],r=0;1==a?(j=p.next,k=h.isBelow,l=h.isAbove,m=g.after(e)):(j=p.prev,k=h.isAbove,l=h.isBelow,m=g.before(e)),o=i(m);do if(m.isVisible()&&(n=i(m),!l(n,o))){if(q.length>0&&k(n,b.last(q))&&r++,n=h.clone(n),n.position=m,n.line=r,d(n))return q;q.push(n)}while(m=j(m));return q}var n=a.curry,o=n(j,-1,h.isAbove,h.isBelow),p=n(j,1,h.isBelow,h.isAbove);return{upUntil:o,downUntil:p,positionsUntil:m,isAboveLine:n(k),isLine:n(l)}}),g("7j",["20","5n","1t","49"],function(a,b,c,d){var e=c.isContentEditableTrue,f=c.isContentEditableFalse,g=function(a,b,c,d){return b._selectionOverrides.showCaret(a,c,d)},h=function(a){var b=a.ownerDocument.createRange();return b.selectNode(a),b},i=function(a,b){var c;return c=a.fire("BeforeObjectSelected",{target:b}),c.isDefaultPrevented()?null:h(b)},j=function(c,h){var i,j;return h=b.normalizeRange(1,c.getBody(),h),i=a.fromRangeStart(h),f(i.getNode())?g(1,c,i.getNode(),!i.isAtEnd()):f(i.getNode(!0))?g(1,c,i.getNode(!0),!1):(j=c.dom.getParent(i.getNode(),d.or(f,e)),f(j)?g(1,c,j,!1):null)},k=function(a,b){var c;return b&&b.collapsed?(c=j(a,b),c?c:b):b};return{showCaret:g,selectNode:i,renderCaretAtRange:j,renderRangeCaret:k}}),g("7r",["1u","20","5n","52","7g","7x","1t","k","9","7j","1q","49"],function(a,b,c,d,e,f,g,h,i,j,k,l){var m=g.isContentEditableFalse,n=h.getSelectedNode,o=c.isAfterContentEditableFalse,p=c.isBeforeContentEditableFalse,q=function(a,b){for(;b=a(b);)if(b.isVisible())return b;return b},r=function(a,b){var d=c.isInSameBlock(a,b);return!(d||!g.isBr(a.getNode()))||d},s=function(b){return a.isCaretContainerBlock(b.startContainer)},t=function(a,d,e){return e=c.normalizeRange(a,d,e),a===-1?b.fromRangeStart(e):b.fromRangeEnd(e)},u=function(a,b,c,d,e){var f,g,h,i;return!e.collapsed&&(f=n(e),m(f))?j.showCaret(a,b,f,a===-1):(i=s(e),g=t(a,b.getBody(),e),d(g)?j.selectNode(b,g.getNode(a===-1)):(g=c(g))?d(g)?j.showCaret(a,b,g.getNode(a===-1),1===a):(h=c(g),d(h)&&r(g,h)?j.showCaret(a,b,h.getNode(a===-1),1===a):i?j.renderRangeCaret(b,g.toRange()):null):i?e:null)},v=function(a,b,c,d){var g,h,i,l,q,r,s,u,v;if(v=n(d),g=t(a,b.getBody(),d),h=c(b.getBody(),f.isAboveLine(1),g),i=k.filter(h,f.isLine(1)),q=k.last(g.getClientRects()),p(g)&&(v=g.getNode()),o(g)&&(v=g.getNode(!0)),!q)return null;if(r=q.left,l=e.findClosestClientRect(i,r),l&&m(l.node))return s=Math.abs(r-l.left),u=Math.abs(r-l.right),j.showCaret(a,b,l.node,s=11)&&(b.innerHTML='
'),b},x=function(a,c,e){var f,g,h,i=new d(a.getBody()),j=l.curry(q,i.next),k=l.curry(q,i.prev);if(e.collapsed&&a.settings.forced_root_block){if(f=a.dom.getParent(e.startContainer,"PRE"),!f)return;g=1===c?j(b.fromRangeStart(e)):k(b.fromRangeStart(e)),g||(h=w(a),1===c?a.$(f).after(h):a.$(f).before(h),a.selection.select(h,!0),a.selection.collapse())}},y=function(a,b){var c,e=new d(a.getBody()),f=l.curry(q,e.next),g=l.curry(q,e.prev),h=b?1:-1,i=b?f:g,j=b?p:o,k=a.selection.getRng();return(c=u(h,a,i,j,k))?c:(c=x(a,h,k),c?c:null)},z=function(a,b){var c,d=b?1:-1,e=b?f.downUntil:f.upUntil,g=a.selection.getRng();return(c=v(d,a,e,g))?c:(c=x(a,d,g),c?c:null)},A=function(a,b){return function(){var c=y(a,b);return!!c&&(a.selection.setRng(c),!0)}},B=function(a,b){return function(){var c=z(a,b);return!!c&&(a.selection.setRng(c),!0)}};return{moveH:A,moveV:B}}),g("7y",["58","3","4"],function(a,b,c){var d=function(a,b){return b},e=function(b,c){var d=a.isObject(b)&&a.isObject(c);return d?g(b,c):c},f=function(a){return function(){for(var d=new b(arguments.length),e=0;e'},n=function(a,b){return a.nodeName===b||a.previousSibling&&a.previousSibling.nodeName===b},o=function(a){return a&&/^(OL|UL|LI)$/.test(a.nodeName)},p=function(a){return o(a)&&o(a.parentNode)},q=function(a,b){return b&&a.isBlock(b)&&!/^(TD|TH|CAPTION|FORM)$/.test(b.nodeName)&&!/^(fixed|absolute)/i.test(b.style.position)&&"true"!==a.getContentEditable(b)},r=function(a,b,c){var d;a.isBlock(c)&&(d=b.getRng(),c.appendChild(a.create("span",null,"\xa0")),b.select(c),c.lastChild.outerHTML="",b.setRng(d))},s=function(a,b,c){var d,e=c,f=[];if(e){for(;e=e.firstChild;){if(a.isBlock(e))return;1!=e.nodeType||b[e.nodeName.toLowerCase()]||f.push(e)}for(d=f.length;d--;)e=f[d],!e.hasChildNodes()||e.firstChild==e.lastChild&&""===e.firstChild.nodeValue?a.remove(e):i(e)&&a.remove(e)}},t=function(a,c,d){return b.isText(c)===!1?d:a?1===d&&c.data.charAt(d-1)===f.ZWSP?0:d:d===c.data.length-1&&c.data.charAt(d)===f.ZWSP?c.data.length:d},u=function(a){var b=a.cloneRange();return b.setStart(a.startContainer,t(!0,a.startContainer,a.startOffset)),b.setEnd(a.endContainer,t(!1,a.endContainer,a.endOffset)),b},v=function(a){for(;a;){if(1===a.nodeType||3===a.nodeType&&a.data&&/[\r\n\s]/.test(a.data))return a;a=a.nextSibling}},w=function(b){function f(f){function A(a){var b,c,f,h,j=a;if(a){if(e.ie&&e.ie<9&&Q&&Q.firstChild&&Q.firstChild==Q.lastChild&&"BR"==Q.firstChild.tagName&&g.remove(Q.firstChild),/^(LI|DT|DD)$/.test(a.nodeName)){var k=v(a.firstChild);k&&/^(UL|OL|DL)$/.test(k.nodeName)&&a.insertBefore(g.doc.createTextNode("\xa0"),a.firstChild)}if(f=g.createRng(),e.ie||a.normalize(),a.hasChildNodes()){for(b=new d(a,a);c=b.current();){if(3==c.nodeType){f.setStart(c,0),f.setEnd(c,0);break}if(z[c.nodeName.toLowerCase()]){f.setStartBefore(c),f.setEndBefore(c);break}j=c,c=b.next()}c||(f.setStart(j,0),f.setEnd(j,0))}else"BR"==a.nodeName?a.nextSibling&&g.isBlock(a.nextSibling)?((!R||R<9)&&(h=g.create("br"),a.parentNode.insertBefore(h,a)),f.setStartBefore(a),f.setEndBefore(a)):(f.setStartAfter(a),f.setEndAfter(a)):(f.setStart(a,0),f.setEnd(a,0));i.setRng(f),g.remove(h),i.scrollIntoView(a)}}function B(a){var b=o.forced_root_block;b&&b.toLowerCase()===a.tagName.toLowerCase()&&g.setAttribs(a,o.forced_root_block_attrs)}function C(a){var b,c,d,e=O,f=x.getTextInlineElements();if(a||"TABLE"==W||"HR"==W?(b=g.create(a||Y),B(b)):b=Q.cloneNode(!1),d=b,o.keep_styles===!1)g.setAttrib(b,"style",null),g.setAttrib(b,"class",null);else do if(f[e.nodeName]){if("_mce_caret"==e.id)continue;c=e.cloneNode(!1),g.setAttrib(c,"id",""),b.hasChildNodes()?(c.appendChild(b.firstChild),b.appendChild(c)):(d=c,b.appendChild(c))}while((e=e.parentNode)&&e!=N);return h||(d.innerHTML='
'),b}function D(a){var b,c,e,f;if(f=t(a,O,P),3==O.nodeType&&(a?f>0:fO.childNodes.length-1,O=O.childNodes[Math.min(P,O.childNodes.length-1)]||O,P=Z&&3==O.nodeType?O.nodeValue.length:0),N=I(O)){if(w.beforeChange(),!g.isBlock(N)&&N!=g.getRoot())return void(Y&&!S||G());if((Y&&!S||!Y&&S)&&(O=E(O,P)),Q=g.getParent(O,g.isBlock),V=Q?g.getParent(Q.parentNode,g.isBlock):null,W=Q?Q.nodeName.toUpperCase():"",X=V?V.nodeName.toUpperCase():"","LI"!=X||f.ctrlKey||(Q=V,V=V.parentNode,W=X),b.undoManager.typing&&(b.undoManager.typing=!1,b.undoManager.add()),/^(LI|DT|DD)$/.test(W)){if(!Y&&S)return void G();if(g.isEmpty(Q))return void F()}if("PRE"==W&&o.br_in_pre!==!1){if(!S)return void G()}else if(!Y&&!S&&"LI"!=W||Y&&S)return void G();Y&&Q===b.getBody()||(Y=Y||"P",a.isCaretContainerBlock(Q)?(T=a.showCaretContainerBlock(Q),g.isEmpty(Q)&&m(Q),A(T)):D()?K():D(!0)?(T=Q.parentNode.insertBefore(C(),Q),r(g,i,T),A(n(Q,"HR")?T:Q)):(M=u(L).cloneRange(),M.setEndAfter(Q),U=M.extractContents(),H(U),T=U.firstChild,g.insertAfter(U,Q),s(g,y,T),J(Q),g.isEmpty(Q)&&m(Q),T.normalize(),g.isEmpty(T)?(g.remove(T),K()):A(T)),g.setAttrib(T,"id",""),b.fire("NewBlock",{newBlock:T}),w.typing=!1,w.add())}}}var g=b.dom,i=b.selection,o=b.settings,w=b.undoManager,x=b.schema,y=x.getNonEmptyElements(),z=x.getMoveCaretBeforeOnEnterElements();b.on("keydown",function(a){13==a.keyCode&&f(a)!==!1&&a.preventDefault()})};return{setup:w}}),g("7t",["1","20","1t","66","68"],function(a,b,c,d,e){var f=function(a,b){return j(a)&&c.isText(b.container())},g=function(a,b){var c=b.container(),d=b.offset();c.insertData(d,"\xa0"),a.selection.setCursorLocation(c,d+1)},h=function(a,b,c){return!!f(c,b)&&(g(a,b),!0)},i=function(c){var f=a.curry(e.isInlineTarget,c),g=b.fromRangeStart(c.selection.getRng()),i=d.readLocation(f,c.getBody(),g);return i.map(a.curry(h,c,g)).getOr(!1)},j=function(b){return b.fold(a.constant(!1),a.constant(!0),a.constant(!0),a.constant(!1))},k=function(a){return!!a.selection.isCollapsed()&&i(a)};return{insertAtSelection:k}}),g("7e",["7t","7s","s"],function(a,b,c){var d=function(d,e){b.execute([{keyCode:c.SPACEBAR,action:b.action(a.insertAtSelection,d)}],e).each(function(a){e.preventDefault()})},e=function(a){a.on("keydown",function(b){b.isDefaultPrevented()===!1&&d(a,b)})};return{setup:e}}),g("6x",["7b","67","7c","7d","7e"],function(a,b,c,d,e){var f=function(f){var g=b.setupSelectedState(f);a.setup(f,g),c.setup(f,g),d.setup(f),e.setup(f)};return{setup:f}}),g("6y",["k","9","8"],function(a,b,c){return function(d){function e(a){var b,c;if(c=d.$(a).parentsUntil(d.getBody()).add(a),c.length===g.length){for(b=c.length;b>=0&&c[b]===g[b];b--);if(b===-1)return g=c,!0}return g=c,!1}var f,g=[];"onselectionchange"in d.getDoc()||d.on("NodeChange Click MouseUp KeyUp Focus",function(b){var c,e;c=d.selection.getRng(),e={startContainer:c.startContainer,startOffset:c.startOffset,endContainer:c.endContainer,endOffset:c.endOffset},"nodechange"!=b.type&&a.compareRanges(e,f)||d.fire("SelectionChange"),f=e}),d.on("contextmenu",function(){d.fire("SelectionChange")}),d.on("SelectionChange",function(){var a=d.selection.getStart(!0);!a||!b.range&&d.selection.isCollapsed()||!e(a)&&d.dom.isChildOf(a,d.getBody())&&d.nodeChanged({selectionChange:!0})}),d.on("MouseUp",function(a){a.isDefaultPrevented()||("IMG"==d.selection.getNode().nodeName?c.setEditorTimeout(d,function(){d.nodeChanged()}):d.nodeChanged())}),this.nodeChanged=function(a){var b,c,e,f=d.selection;d.initialized&&f&&!d.settings.disable_nodechange&&!d.readonly&&(e=d.getBody(),b=f.getStart(!0)||e,b.ownerDocument==d.getDoc()&&d.dom.isChildOf(b,e)||(b=e),c=[],d.dom.getParent(b,function(a){return a===e||void c.push(a)}),a=a||{},a.element=b,a.parents=c,d.fire("NodeChange",a))}}}),g("7f",["1u","6r","20","d","1t","k","4b","8"],function(a,b,c,d,e,f,g,h){var i=e.isContentEditableFalse,j=function(a){return a&&/^(TD|TH)$/i.test(a.nodeName)};return function(c,e){function f(a,b){var d,e,f,h,i,j=g.collapse(a.getBoundingClientRect(),b);return"BODY"==c.tagName?(d=c.ownerDocument.documentElement,e=c.scrollLeft||d.scrollLeft,f=c.scrollTop||d.scrollTop):(i=c.getBoundingClientRect(),e=c.scrollLeft-i.left,f=c.scrollTop-i.top),j.left+=e,j.right+=e,j.top+=f,j.bottom+=f,j.width=1,h=a.offsetWidth-a.clientWidth,h>0&&(b&&(h*=-1),j.left+=h,j.right+=h),j}function k(){var b,e,f,g,h;for(b=d("*[contentEditable=false]",c),g=0;g').css(h).appendTo(c),b&&r.addClass("mce-visual-caret-before"),n(),k=g.ownerDocument.createRange(),k.setStart(s,0),k.setEnd(s,0),k):(s=a.insertInline(g,b),k=g.ownerDocument.createRange(),i(s.nextSibling)?(k.setStart(s,0),k.setEnd(s,0)):(k.setStart(s,1),k.setEnd(s,1)),k)}function m(){k(),s&&(b.remove(s),s=null),r&&(r.remove(),r=null),clearInterval(q)}function n(){q=h.setInterval(function(){d("div.mce-visual-caret",c).toggleClass("mce-visual-caret-hidden")},500)}function o(){h.clearInterval(q)}function p(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"}var q,r,s;return{show:l,hide:m,getCss:p,destroy:o}}}),g("7v",[],function(){var a=function(a){var b,c,d,e;return e=a.getBoundingClientRect(),b=a.ownerDocument,c=b.documentElement,d=b.defaultView,{top:e.top+d.pageYOffset-c.clientTop,left:e.left+d.pageXOffset-c.clientLeft}},b=function(b){return b.inline?a(b.getBody()):{left:0,top:0}},c=function(a){var b=a.getBody();return a.inline?{left:b.scrollLeft,top:b.scrollTop}:{left:0,top:0}},d=function(a){var b=a.getBody(),c=a.getDoc().documentElement,d={left:b.scrollLeft,top:b.scrollTop},e={left:b.scrollLeft||c.scrollLeft,top:b.scrollTop||c.scrollTop};return a.inline?d:e},e=function(b,c){if(c.target.ownerDocument!==b.getDoc()){var e=a(b.getContentAreaContainer()),f=d(b);return{left:c.pageX-e.left+f.left,top:c.pageY-e.top+f.top}}return{left:c.pageX,top:c.pageY}},f=function(a,b,c){return{pageX:c.left-a.left+b.left,pageY:c.top-a.top+b.top}},g=function(a,d){return f(b(a),c(a),e(a,d))};return{calc:g}}),g("7h",["1t","1q","49","8","h","7v"],function(a,b,c,d,e,f){var g=a.isContentEditableFalse,h=a.isContentEditableTrue,i=function(a,b){return g(b)&&b!==a},j=function(a,b,c){return b!==c&&!a.dom.isChildOf(b,c)&&!g(b)},k=function(a){var b=a.cloneNode(!0);return b.removeAttribute("data-mce-selected"),b},l=function(a,b,c,d){var e=b.cloneNode(!0);a.dom.setStyles(e,{width:c,height:d}),a.dom.setAttrib(e,"data-mce-selected",null);var f=a.dom.create("div",{"class":"mce-drag-container","data-mce-bogus":"all",unselectable:"on",contenteditable:"false"});return a.dom.setStyles(f,{position:"absolute",opacity:.5,overflow:"hidden",border:0,padding:0,margin:0,width:c,height:d}),a.dom.setStyles(e,{margin:0,boxSizing:"border-box"}),f.appendChild(e),f},m=function(a,b){a.parentNode!==b&&b.appendChild(a)},n=function(a,b,c,d,e,f){var g=0,h=0;a.style.left=b.pageX+"px",a.style.top=b.pageY+"px",b.pageX+c>e&&(g=b.pageX+c-e),b.pageY+d>f&&(h=b.pageY+d-f),a.style.width=c-g+"px",a.style.height=d-h+"px"},o=function(a){a&&a.parentNode&&a.parentNode.removeChild(a)},p=function(a){return 0===a.button},q=function(a){return a.element},r=function(a,b){return{pageX:b.pageX-a.relX,pageY:b.pageY+5}},s=function(a,d){return function(e){if(p(e)){var f=b.find(d.dom.getParents(e.target),c.or(g,h));if(i(d.getBody(),f)){var j=d.dom.getPos(f),k=d.getBody(),m=d.getDoc().documentElement;a.element=f,a.screenX=e.screenX,a.screenY=e.screenY,a.maxX=(d.inline?k.scrollWidth:m.offsetWidth)-2,a.maxY=(d.inline?k.scrollHeight:m.offsetHeight)-2,a.relX=e.pageX-j.x,a.relY=e.pageY-j.y,a.width=f.offsetWidth,a.height=f.offsetHeight,a.ghost=l(d,f,a.width,a.height)}}}},t=function(a,b){var c=d.throttle(function(a,c){b._selectionOverrides.hideFakeCaret(),b.selection.placeCaretAt(a,c)},0);return function(d){var e=Math.max(Math.abs(d.screenX-a.screenX),Math.abs(d.screenY-a.screenY));if(q(a)&&!a.dragging&&e>10){var g=b.fire("dragstart",{target:a.element});if(g.isDefaultPrevented())return;a.dragging=!0,b.focus()}if(a.dragging){var h=r(a,f.calc(b,d));m(a.ghost,b.getBody()),n(a.ghost,h,a.width,a.height,a.maxX,a.maxY),c(d.clientX,d.clientY)}}},u=function(a){var b=a.getSel().getRangeAt(0),c=b.startContainer;return 3===c.nodeType?c.parentNode:c},v=function(a,b){return function(c){if(a.dragging&&j(b,u(b.selection),a.element)){var d=k(a.element),e=b.fire("drop",{targetClone:d,clientX:c.clientX,clientY:c.clientY});e.isDefaultPrevented()||(d=e.targetClone,b.undoManager.transact(function(){o(a.element),b.insertContent(b.dom.getOuterHTML(d)),b._selectionOverrides.hideFakeCaret()}))}x(a)}},w=function(a,b){return function(){x(a),a.dragging&&b.fire("dragend")}},x=function(a){a.dragging=!1,a.element=null,o(a.ghost)},y=function(a){var b,c,d,f,g,h,i={};b=e.DOM,h=document,c=s(i,a),d=t(i,a),f=v(i,a),g=w(i,a),a.on("mousedown",c),a.on("mousemove",d),a.on("mouseup",f),b.bind(h,"mousemove",d),b.bind(h,"mouseup",g),a.on("remove",function(){b.unbind(h,"mousemove",d),b.unbind(h,"mouseup",g)})},z=function(a){a.on("drop",function(b){var c="undefined"!=typeof b.clientX?a.getDoc().elementFromPoint(b.clientX,b.clientY):null;(g(c)||g(a.dom.getContentEditableParent(c)))&&b.preventDefault()})},A=function(a){y(a),z(a)};return{init:A}}),g("7z",[],function(){var a=function(a){return void 0!==a.style};return{isSupported:a}}),g("7w",["58","45","6m","4l","5u","6n","1w","4s","7z","75","4","4k","59"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){var n=function(b,c,d){if(!a.isString(d))throw l.error("Invalid call to CSS.set. Property ",c,":: Value ",d,":: Element ",b),new k("CSS value must be a string: "+d);i.isSupported(b)&&b.style.setProperty(c,d)},o=function(a,b){i.isSupported(a)&&a.style.removeProperty(b)},p=function(a,b,c){var d=a.dom();n(d,b,c)},q=function(a,b){var d=a.dom();c.each(b,function(a,b){n(d,b,a)})},r=function(a,b){var d=a.dom();c.each(b,function(a,b){a.fold(function(){o(d,b)},function(a){n(d,b,a)})})},s=function(a,b){var c=a.dom(),d=m.getComputedStyle(c),e=d.getPropertyValue(b),g=""!==e||f.inBody(a)?e:t(c,b);return null===g?void 0:g},t=function(a,b){return i.isSupported(a)?a.style.getPropertyValue(b):""},u=function(a,b){var c=a.dom(),e=t(c,b);return d.from(e).filter(function(a){return a.length>0})},v=function(a,b,c){var d=g.fromTag(a);p(d,b,c);var e=u(d,b);return e.isSome()},w=function(a,b){var c=a.dom();o(c,b),e.has(a,"style")&&""===j.trim(e.get(a,"style"))&&e.remove(a,"style")},x=function(a,b){var c=e.get(a,"style"),d=b(a),f=void 0===c?e.remove:e.set;return f(a,"style",c),d},y=function(a,b){var c=a.dom(),d=b.dom();i.isSupported(c)&&i.isSupported(d)&&(d.style.cssText=c.style.cssText); -},z=function(a){return a.dom().offsetWidth},A=function(a,b,c){u(a,c).each(function(a){u(b,c).isNone()&&p(b,c,a)})},B=function(a,c,d){h.isElement(a)&&h.isElement(c)&&b.each(d,function(b){A(a,c,b)})};return{copy:y,set:p,preserve:x,setAll:q,setOptions:r,remove:w,get:s,getRaw:u,isValidValue:v,reflow:z,transfer:B}}),g("7i",["1","1w","7w","5t"],function(a,b,c,d){var e=function(a,b){var c=b.dom();return c[a]},f=function(a,b){return parseInt(c.get(b,a),10)},g=a.curry(e,"clientWidth"),h=a.curry(e,"clientHeight"),i=a.curry(f,"margin-top"),j=a.curry(f,"margin-left"),k=function(a){return a.dom().getBoundingClientRect()},l=function(a,b,c){var d=g(a),e=h(a);return b>=0&&c>=0&&b<=d&&c<=e},m=function(a,b,c,d){var e=k(b),f=a?e.left+b.dom().clientLeft+j(b):0,g=a?e.top+b.dom().clientTop+i(b):0,h=c-f,l=d-g;return{x:h,y:l}},n=function(a,c,e){var f=b.fromDom(a.getBody()),g=a.inline?f:d.documentElement(f),h=m(a.inline,g,c,e);return l(g,h.x,h.y)};return{isXYInContentArea:n}}),g("6z",["45","5w","1w","5u","62","5e","1u","20","5n","52","7f","7g","1t","1y","7h","7i","9","7j","8","s"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){function u(m){function u(a){return m.dom.hasClass(a,"mce-offscreen-selection")}function z(){var a=m.dom.get(S);return a?a.getElementsByTagName("*")[0]:a}function A(a){return m.dom.isBlock(a)}function B(a){a&&m.selection.setRng(a)}function C(){return m.selection.getRng()}function D(a,b){m.selection.scrollIntoView(a,b)}function E(a,b,c){var d;return d=m.fire("ShowCaret",{target:b,direction:a,before:c}),d.isDefaultPrevented()?null:(D(b,a===-1),R.show(c,b))}function F(a,b){return b=i.normalizeRange(a,Q,b),a==-1?h.fromRangeStart(b):h.fromRangeEnd(b)}function G(a){a.hasAttribute("data-mce-caret")&&(g.showCaretContainerBlock(a),B(C()),D(a[0]))}function H(){function a(a){for(var b=m.getBody();a&&a!=b;){if(v(a)||w(a))return a;a=a.parentNode}return null}function b(b){var c=!1;b.on("touchstart",function(){c=!1}),b.on("touchmove",function(){c=!0}),b.on("touchend",function(d){var e=a(d.target);w(e)&&(c||(d.preventDefault(),L(r.selectNode(b,e))))})}m.on("mouseup",function(a){var b=C();b.collapsed&&p.isXYInContentArea(m,a.clientX,a.clientY)&&B(r.renderCaretAtRange(m,b))}),m.on("click",function(b){var c;c=a(b.target),c&&(w(c)&&(b.preventDefault(),m.focus()),v(c)&&m.dom.isChildOf(c,m.selection.getNode())&&M())}),m.on("blur NewBlock",function(){M(),O()});var c=function(a){var b=new j(a);if(!a.firstChild)return!1;var c=h.before(a.firstChild),d=b.next(c);return d&&!y(d)&&!x(d)},d=function(a,b){var c=m.dom.getParent(a,m.dom.isBlock),d=m.dom.getParent(b,m.dom.isBlock);return c===d},e=function(a,b){var e=m.dom.getParent(a,m.dom.isBlock),f=m.dom.getParent(b,m.dom.isBlock);return e&&!d(e,f)&&c(e)};b(m),m.on("mousedown",function(b){var c;if(p.isXYInContentArea(m,b.clientX,b.clientY)!==!1)if(c=a(b.target))w(c)?(b.preventDefault(),L(r.selectNode(m,c))):(M(),v(c)&&b.shiftKey||n.isXYWithinRange(b.clientX,b.clientY,m.selection.getRng())||m.selection.placeCaretAt(b.clientX,b.clientY));else{M(),O();var d=l.closestCaret(Q,b.clientX,b.clientY);d&&(e(b.target,d.node)||(b.preventDefault(),m.getBody().focus(),B(E(1,d.node,d.before))))}}),m.on("keypress",function(a){if(!t.modifierPressed(a))switch(a.keyCode){default:w(m.selection.getNode())&&a.preventDefault()}}),m.on("getSelectionRange",function(a){var b=a.range;if(P){if(!P.parentNode)return void(P=null);b=b.cloneRange(),b.selectNode(P),a.range=b}}),m.on("setSelectionRange",function(a){var b;b=L(a.range,a.forward),b&&(a.range=b)}),m.on("AfterSetSelectionRange",function(a){var b=a.range;K(b)||O(),u(b.startContainer.parentNode)||M()}),m.on("focus",function(){s.setEditorTimeout(m,function(){m.selection.setRng(r.renderRangeCaret(m,m.selection.getRng()))},0)}),m.on("copy",function(a){var b=a.clipboardData;if(!a.isDefaultPrevented()&&a.clipboardData&&!q.ie){var c=z();c&&(a.preventDefault(),b.clearData(),b.setData("text/html",c.outerHTML),b.setData("text/plain",c.outerText))}}),o.init(m)}function I(){var a=m.contentStyles,b=".mce-content-body";a.push(R.getCss()),a.push(b+" .mce-offscreen-selection {position: absolute;left: -9999999999px;max-width: 1000000px;}"+b+" *[contentEditable=false] {cursor: default;}"+b+" *[contentEditable=true] {cursor: text;}")}function J(a){return g.isCaretContainer(a)||g.startsWithCaretContainer(a)||g.endsWithCaretContainer(a)}function K(a){return J(a.startContainer)||J(a.endContainer)}function L(b,g){var h,i,j,k,l,n,o,p,r,s,t=m.$,u=m.dom;if(!b)return null;if(b.collapsed){if(!K(b))if(g===!1){if(p=F(-1,b),w(p.getNode(!0)))return E(-1,p.getNode(!0),!1);if(w(p.getNode()))return E(-1,p.getNode(),!p.isAtEnd())}else{if(p=F(1,b),w(p.getNode()))return E(1,p.getNode(),!p.isAtEnd());if(w(p.getNode(!0)))return E(1,p.getNode(!0),!1)}return null}return k=b.startContainer,l=b.startOffset,n=b.endOffset,3==k.nodeType&&0==l&&w(k.parentNode)&&(k=k.parentNode,l=u.nodeIndex(k),k=k.parentNode),1!=k.nodeType?null:(n==l+1&&(h=k.childNodes[l]),w(h)?(r=s=h.cloneNode(!0),o=m.fire("ObjectSelected",{target:h,targetClone:r}),o.isDefaultPrevented()?null:(i=f.descendant(c.fromDom(m.getBody()),"#"+S).fold(function(){return t([])},function(a){return t([a.dom()])}),r=o.targetClone,0===i.length&&(i=t('
').attr("id",S),i.appendTo(m.getBody())),b=m.dom.createRng(),r===s&&q.ie?(i.empty().append('

\xa0

').append(r),b.setStartAfter(i[0].firstChild.firstChild),b.setEndAfter(r)):(i.empty().append("\xa0").append(r).append("\xa0"),b.setStart(i[0].firstChild,1),b.setEnd(i[0].lastChild,0)),i.css({top:u.getPos(h,m.getBody()).y}),i[0].focus(),j=m.selection.getSel(),j.removeAllRanges(),j.addRange(b),a.each(e.descendants(c.fromDom(m.getBody()),"*[data-mce-selected]"),function(a){d.remove(a,"data-mce-selected")}),h.setAttribute("data-mce-selected",1),P=h,O(),b)):null)}function M(){P&&(P.removeAttribute("data-mce-selected"),f.descendant(c.fromDom(m.getBody()),"#"+S).each(b.remove),P=null)}function N(){R.destroy(),P=null}function O(){R.hide()}var P,Q=m.getBody(),R=new k(m.getBody(),A),S="sel-"+m.dom.uniqueId();return q.ceFalse&&(H(),I()),{showCaret:E,showBlockCaretContainer:G,hideFakeCaret:O,destroy:N}}var v=m.isContentEditableTrue,w=m.isContentEditableFalse,x=i.isAfterContentEditableFalse,y=i.isBeforeContentEditableFalse;return u}),g("7k",["h"],function(a){function b(b,c,d){for(var e=[];c&&c!=b;c=c.parentNode)e.push(a.nodeIndex(c,d));return e}function c(a,b){var c,d,e;for(d=a,c=b.length-1;c>=0;c--){if(e=d.childNodes,b[c]>e.length-1)return null;d=e[b[c]]}return d}return{create:b,resolve:c}}),g("70",["s","k","f","7k","l","g","9","c","8","1u","20","52"],function(a,b,c,d,e,f,g,h,i,j,k,l){return function(c){function d(a,b){try{c.getDoc().execCommand(a,!1,b)}catch(a){}}function k(){var a=c.getDoc().documentMode;return a?a:6}function l(a){return a.isDefaultPrevented()}function m(a){var b,d;a.dataTransfer&&(c.selection.isCollapsed()&&"IMG"==a.target.tagName&&Y.select(a.target),b=c.selection.getContent(),b.length>0&&(d=da+escape(c.id)+","+escape(b),a.dataTransfer.setData(ea,d)))}function n(a){var b;return a.dataTransfer&&(b=a.dataTransfer.getData(ea),b&&b.indexOf(da)>=0)?(b=b.substr(da.length).split(","),{id:unescape(b[0]),html:unescape(b[1])}):null}function o(a,b){c.queryCommandSupported("mceInsertClipboardContent")?c.execCommand("mceInsertClipboardContent",!1,{content:a,internal:b}):c.execCommand("mceInsertContent",!1,a)}function p(){function a(a){var b=X.create("body"),c=a.cloneContents();return b.appendChild(c),Y.serializer.serialize(b,{format:"html"})}function d(d){if(!d.setStart){if(d.item)return!1;var e=d.duplicate();return e.moveToElementText(c.getBody()),b.compareRanges(d,e)}var f=a(d),g=X.createRng();g.selectNode(c.getBody());var h=a(g);return f===h}c.on("keydown",function(a){var b,e,f=a.keyCode;if(!l(a)&&(f==W||f==V)){if(b=c.selection.isCollapsed(),e=c.getBody(),b&&!X.isEmpty(e))return;if(!b&&!d(c.selection.getRng()))return;a.preventDefault(),c.setContent(""),e.firstChild&&X.isBlock(e.firstChild)?c.selection.setCursorLocation(e.firstChild,0):c.selection.setCursorLocation(e,0),c.nodeChanged()}})}function q(){c.shortcuts.add("meta+a",null,"SelectAll")}function r(){c.settings.content_editable||X.bind(c.getDoc(),"mousedown mouseup",function(a){var b;if(a.target==c.getDoc().documentElement)if(b=Y.getRng(),c.getBody().focus(),"mousedown"==a.type){if(j.isCaretContainer(b.startContainer))return;Y.placeCaretAt(a.clientX,a.clientY)}else Y.setRng(b)})}function s(){c.on("keydown",function(a){if(!l(a)&&a.keyCode===V){if(!c.getBody().getElementsByTagName("hr").length)return;if(Y.isCollapsed()&&0===Y.getRng(!0).startOffset){var b=Y.getNode(),d=b.previousSibling;if("HR"==b.nodeName)return X.remove(b),void a.preventDefault();d&&d.nodeName&&"hr"===d.nodeName.toLowerCase()&&(X.remove(d),a.preventDefault())}}})}function t(){window.Range.prototype.getClientRects||c.on("mousedown",function(a){if(!l(a)&&"HTML"===a.target.nodeName){var b=c.getBody();b.blur(),i.setEditorTimeout(c,function(){b.focus()})}})}function u(){c.on("click",function(a){var b=a.target;/^(IMG|HR)$/.test(b.nodeName)&&"false"!==X.getContentEditableParent(b)&&(a.preventDefault(),c.selection.select(b),c.nodeChanged()),"A"==b.nodeName&&X.hasClass(b,"mce-item-anchor")&&(a.preventDefault(),Y.select(b))})}function v(){function a(){var a=X.getAttribs(Y.getStart().cloneNode(!1));return function(){var b=Y.getStart();b!==c.getBody()&&(X.setAttrib(b,"style",null),U(a,function(a){b.setAttributeNode(a.cloneNode(!0))}))}}function b(){return!Y.isCollapsed()&&X.getParent(Y.getStart(),X.isBlock)!=X.getParent(Y.getEnd(),X.isBlock)}c.on("keypress",function(d){var e;if(!l(d)&&(8==d.keyCode||46==d.keyCode)&&b())return e=a(),c.getDoc().execCommand("delete",!1,null),e(),d.preventDefault(),!1}),X.bind(c.getDoc(),"cut",function(d){var e;!l(d)&&b()&&(e=a(),i.setEditorTimeout(c,function(){e()}))})}function w(){document.body.setAttribute("role","application")}function x(){c.on("keydown",function(a){if(!l(a)&&a.keyCode===V&&Y.isCollapsed()&&0===Y.getRng(!0).startOffset){var b=Y.getNode().previousSibling;if(b&&b.nodeName&&"table"===b.nodeName.toLowerCase())return a.preventDefault(),!1}})}function y(){k()>7||(d("RespectVisibilityInDesign",!0),c.contentStyles.push(".mceHideBrInPre pre br {display: none}"),X.addClass(c.getBody(),"mceHideBrInPre"),$.addNodeFilter("pre",function(a){for(var b,c,d,f,g=a.length;g--;)for(b=a[g].getAll("br"),c=b.length;c--;)d=b[c],f=d.prev,f&&3===f.type&&"\n"!=f.value.charAt(f.value-1)?f.value+="\n":d.parent.insert(new e("#text",3),d,!0).value="\n"}),_.addNodeFilter("pre",function(a){for(var b,c,d,e,f=a.length;f--;)for(b=a[f].getAll("br"),c=b.length;c--;)d=b[c],e=d.prev,e&&3==e.type&&(e.value=e.value.replace(/\r?\n$/,""))}))}function z(){X.bind(c.getBody(),"mouseup",function(){var a,b=Y.getNode();"IMG"==b.nodeName&&((a=X.getStyle(b,"width"))&&(X.setAttrib(b,"width",a.replace(/[^0-9%]+/g,"")),X.setStyle(b,"width","")),(a=X.getStyle(b,"height"))&&(X.setAttrib(b,"height",a.replace(/[^0-9%]+/g,"")),X.setStyle(b,"height","")))})}function A(){c.on("keydown",function(b){var d,e,f,g,h;if(!l(b)&&b.keyCode==a.BACKSPACE&&(d=Y.getRng(),e=d.startContainer,f=d.startOffset,g=X.getRoot(),h=e,d.collapsed&&0===f)){for(;h&&h.parentNode&&h.parentNode.firstChild==h&&h.parentNode!=g;)h=h.parentNode;"BLOCKQUOTE"===h.tagName&&(c.formatter.toggle("blockquote",null,h),d=X.createRng(),d.setStart(e,0),d.setEnd(e,0),Y.setRng(d))}})}function B(){function a(){S(),d("StyleWithCSS",!1),d("enableInlineTableEditing",!1),Z.object_resizing||d("enableObjectResizing",!1)}Z.readonly||c.on("BeforeExecCommand MouseDown",a)}function C(){function a(){U(X.select("a"),function(a){var b=a.parentNode,c=X.getRoot();if(b.lastChild===a){for(;b&&!X.isBlock(b);){if(b.parentNode.lastChild!==b||b===c)return;b=b.parentNode}X.add(b,"br",{"data-mce-bogus":1})}})}c.on("SetContent ExecCommand",function(b){"setcontent"!=b.type&&"mceInsertLink"!==b.command||a()})}function D(){Z.forced_root_block&&c.on("init",function(){d("DefaultParagraphSeparator",Z.forced_root_block)})}function E(){c.on("keydown",function(a){var b;l(a)||a.keyCode!=V||(b=c.getDoc().selection.createRange(),b&&b.item&&(a.preventDefault(),c.undoManager.beforeChange(),X.remove(b.item(0)),c.undoManager.add()))})}function F(){var a;k()>=10&&(a="",U("p div h1 h2 h3 h4 h5 h6".split(" "),function(b,c){a+=(c>0?",":"")+b+":empty"}),c.contentStyles.push(a+"{padding-right: 1px !important}"))}function G(){k()<9&&($.addNodeFilter("noscript",function(a){for(var b,c,d=a.length;d--;)b=a[d],c=b.firstChild,c&&b.attr("data-mce-innertext",c.value)}),_.addNodeFilter("noscript",function(a){for(var b,c,d,g=a.length;g--;)b=a[g],c=a[g].firstChild,c?c.value=f.decode(c.value):(d=b.attributes.map["data-mce-innertext"],d&&(b.attr("data-mce-innertext",null),c=new e("#text",3),c.value=d,c.raw=!0,b.append(c)))}))}function H(){function a(a,b){var c=h.createTextRange();try{c.moveToPoint(a,b)}catch(a){c=null}return c}function b(b){var d;b.button?(d=a(b.x,b.y),d&&(d.compareEndPoints("StartToStart",e)>0?d.setEndPoint("StartToStart",e):d.setEndPoint("EndToEnd",e),d.select())):c()}function c(){var a=g.selection.createRange();e&&!a.item&&0===a.compareEndPoints("StartToEnd",a)&&e.select(),X.unbind(g,"mouseup",c),X.unbind(g,"mousemove",b),e=d=0}var d,e,f,g=X.doc,h=g.body;g.documentElement.unselectable=!0,X.bind(g,"mousedown contextmenu",function(h){if("HTML"===h.target.nodeName){if(d&&c(),f=g.documentElement,f.scrollHeight>f.clientHeight)return;d=1,e=a(h.x,h.y),e&&(X.bind(g,"mouseup",c),X.bind(g,"mousemove",b),X.getRoot().focus(),e.select())}})}function I(){c.on("keyup focusin mouseup",function(b){65==b.keyCode&&a.metaKeyPressed(b)||Y.normalize()},!0)}function J(){c.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")}function K(){c.inline||c.on("keydown",function(){document.activeElement==document.body&&c.getWin().focus()})}function L(){c.inline||(c.contentStyles.push("body {min-height: 150px}"),c.on("click",function(a){var b;if("HTML"==a.target.nodeName){if(g.ie>11)return void c.getBody().focus();b=c.selection.getRng(),c.getBody().focus(),c.selection.setRng(b),c.selection.normalize(),c.nodeChanged()}}))}function M(){g.mac&&c.on("keydown",function(b){!a.metaKeyPressed(b)||b.shiftKey||37!=b.keyCode&&39!=b.keyCode||(b.preventDefault(),c.selection.getSel().modify("move",37==b.keyCode?"backward":"forward","lineboundary"))})}function N(){d("AutoUrlDetect",!1)}function O(){c.on("click",function(a){var b=a.target;do if("A"===b.tagName)return void a.preventDefault();while(b=b.parentNode)}),c.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")}function P(){c.on("init",function(){c.dom.bind(c.getBody(),"submit",function(a){a.preventDefault()})})}function Q(){$.addNodeFilter("br",function(a){for(var b=a.length;b--;)"Apple-interchange-newline"==a[b].attr("class")&&a[b].remove()})}function R(){c.on("dragstart",function(a){m(a)}),c.on("drop",function(a){if(!l(a)){var d=n(a);if(d&&d.id!=c.id){a.preventDefault();var e=b.getCaretRangeFromPoint(a.x,a.y,c.getDoc());Y.setRng(e),o(d.html,!0)}}})}function S(){}function T(){var a;return!aa||c.removed?0:(a=c.selection.getSel(),!a||!a.rangeCount||0===a.rangeCount)}var U=h.each,V=a.BACKSPACE,W=a.DELETE,X=c.dom,Y=c.selection,Z=c.settings,$=c.parser,_=c.serializer,aa=g.gecko,ba=g.ie,ca=g.webkit,da="data:text/mce-internal,",ea=ba?"Text":"URL";return A(),p(),g.windowsPhone||I(),ca&&(r(),u(),D(),P(),x(),Q(),g.iOS?(K(),L(),O()):q()),ba&&g.ie<11&&(s(),w(),y(),z(),E(),F(),G(),H()),g.ie>=11&&(L(),x()),g.ie&&(q(),N(),R()),aa&&(s(),t(),v(),B(),C(),J(),M(),x()),{refreshContentEditable:S,isHidden:T}}}),g("6a",["28","59","5","6u","h","v","r","6v","2h","6w","o","l","m","6x","6y","6z","w","8","70","c"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){var u=e.DOM,v=function(a){var b=new k(a.settings,a.schema);return b.addAttributeFilter("src,href,style,tabindex",function(b,c){for(var d,e,f,g=b.length,h=a.dom;g--;)if(d=b[g],e=d.attr(c),f="data-mce-"+c,!d.attributes.map[f]){if(0===e.indexOf("data:")||0===e.indexOf("blob:"))continue;"style"===c?(e=h.serializeStyle(h.parseStyle(e),d.name),e.length||(e=null),d.attr(f,e),d.attr(c,e)):"tabindex"===c?(d.attr(f,e),d.attr(c,null)):d.attr(f,a.convertURL(e,c,d.name))}}),b.addNodeFilter("script",function(a){for(var b,c,d=a.length;d--;)b=a[d],c=b.attr("type")||"no/type",0!==c.indexOf("mce-")&&b.attr("type","mce-"+c)}),b.addNodeFilter("#cdata",function(a){for(var b,c=a.length;c--;)b=a[c],b.type=8,b.name="#comment",b.value="[CDATA["+b.value+"]]"}),b.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(b){for(var c,d=b.length,e=a.schema.getNonEmptyElements();d--;)c=b[d],c.isEmpty(e)&&0===c.getAll("br").length&&(c.append(new l("br",1)).shortEnded=!0)}),b},w=function(a){a.settings.auto_focus&&r.setEditorTimeout(a,function(){var b;b=a.settings.auto_focus===!0?a:a.editorManager.get(a.settings.auto_focus),b.destroyed||b.focus()},100)},x=function(a){a.bindPendingEventDelegates(),a.initialized=!0,a.fire("init"),a.focus(!0),a.nodeChanged({initial:!0}),a.execCallback("init_instance_callback",a),w(a)},y=function(a){return a.inline?u.styleSheetLoader:a.dom.styleSheetLoader},z=function(k,l){var r,w,z=k.settings,A=k.getElement(),B=k.getDoc();z.inline||(k.getElement().style.visibility=k.orgVisibility),l||z.content_editable||(B.open(),B.write(k.iframeHTML),B.close()),z.content_editable&&(k.on("remove",function(){var a=this.getBody();u.removeClass(a,"mce-content-body"),u.removeClass(a,"mce-edit-focus"),u.setAttrib(a,"contentEditable",null)}),u.addClass(A,"mce-content-body"),k.contentDocument=B=z.content_document||a,k.contentWindow=z.content_window||b,k.bodyElement=A,z.content_document=z.content_window=null,z.root_name=A.nodeName.toLowerCase()),r=k.getBody(),r.disabled=!0,k.readonly=z.readonly,k.readonly||(k.inline&&"static"===u.getStyle(r,"position",!0)&&(r.style.position="relative"),r.contentEditable=k.getParam("content_editable_state",!0)),r.disabled=!1,k.editorUpload=new h(k),k.schema=new m(z),k.dom=new e(B,{keep_values:!0,url_converter:k.convertURL,url_converter_scope:k,hex_colors:z.force_hex_style_colors,class_filter:z.class_filter,update_styles:!0,root_element:k.inline?k.getBody():null,collect:z.content_editable,schema:k.schema,onSetAttrib:function(a){k.fire("SetAttrib",a)}}),k.parser=v(k),k.serializer=new g(z,k),k.selection=new f(k.dom,k.getWin(),k.serializer,k),k.formatter=new c(k),k.undoManager=new q(k),k._nodeChangeDispatcher=new o(k),k._selectionOverrides=new p(k),d.setup(k),n.setup(k),j.setup(k),k.fire("PreInit"),z.browser_spellcheck||z.gecko_spellcheck||(B.body.spellcheck=!1,u.setAttrib(r,"spellcheck","false")),k.quirks=new s(k),k.fire("PostRender"),z.directionality&&(r.dir=z.directionality),z.nowrap&&(r.style.whiteSpace="nowrap"),z.protect&&k.on("BeforeSetContent",function(a){t.each(z.protect,function(b){a.content=a.content.replace(b,function(a){return""})})}),k.on("SetContent",function(){k.addVisual(k.getBody())}),z.padd_empty_editor&&k.on("PostProcess",function(a){a.content=a.content.replace(/^(]*>( | |\s|\u00a0|
|)<\/p>[\r\n]*|
[\r\n]*)$/,"")}),k.load({initial:!0,format:"html"}),k.startContent=k.getContent({format:"raw"}),k.on("compositionstart compositionend",function(a){k.composing="compositionstart"===a.type}),k.contentStyles.length>0&&(w="",t.each(k.contentStyles,function(a){w+=a+"\r\n"}),k.dom.addStyle(w)),y(k).loadAll(k.contentCSS,function(a){x(k)},function(a){x(k),i.contentCssError(k,a)})};return{initContentBody:z}}),g("5b",["j"],function(a){return a.PluginManager}),g("5c",["j"],function(a){return a.ThemeManager}),g("5a",["28","59","h","9","6a","5b","5c","c","2g"],function(a,b,c,d,e,f,g,h,i){var j=c.DOM,k=function(a,b,c){var d,e,g=f.get(c);if(d=f.urls[c]||a.documentBaseUrl.replace(/\/$/,""),c=h.trim(c),g&&h.inArray(b,c)===-1){if(h.each(f.dependencies(c),function(c){k(a,b,c)}),a.plugins[c])return;e=new g(a,d,a.$),a.plugins[c]=e,e.init&&(e.init(a,d),b.push(c))}},l=function(a){var b=[];h.each(a.settings.plugins.replace(/\-/g,"").split(/[ ,]/),function(c){k(a,b,c)})},m=function(a){var b,c=a.settings;c.theme&&("function"!=typeof c.theme?(c.theme=c.theme.replace(/-/,""),b=g.get(c.theme),a.theme=new b(a,g.urls[c.theme]),a.theme.init&&a.theme.init(a,g.urls[c.theme]||a.documentBaseUrl.replace(/\/$/,""),a.$)):a.theme=c.theme)},n=function(a){var b,c,d,e,f,g=a.settings,h=a.getElement();return g.render_ui&&a.theme&&(a.orgDisplay=h.style.display,"function"!=typeof g.theme?(b=g.width||j.getStyle(h,"width")||"100%",c=g.height||j.getStyle(h,"height")||h.offsetHeight,d=g.min_height||100,e=/^[0-9\.]+(|px)$/i,e.test(""+b)&&(b=Math.max(parseInt(b,10),100)),e.test(""+c)&&(c=Math.max(parseInt(c,10),d)),f=a.theme.renderUI({targetNode:h,width:b,height:c,deltaWidth:g.delta_width,deltaHeight:g.delta_height}),g.content_editable||(c=(f.iframeHeight||c)+("number"==typeof c?f.deltaHeight||0:""),c",f.document_base_url!=a.documentBaseUrl&&(a.iframeHTML+=''),!d.caretAfter&&f.ie7_compat&&(a.iframeHTML+=''),a.iframeHTML+='',c=f.body_id||"tinymce",c.indexOf("=")!=-1&&(c=a.getParam("body_id","","hash"),c=c[a.id]||c),e=f.body_class||"",e.indexOf("=")!=-1&&(e=a.getParam("body_class","","hash"),e=e[a.id]||""),f.content_security_policy&&(a.iframeHTML+=''),a.iframeHTML+='
';var g=j.create("iframe",{id:a.id+"_ifr",frameBorder:"0",allowTransparency:"true",title:a.editorManager.translate("Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help"),style:{width:"100%",height:b.height,display:"block"}});g.onload=function(){g.onload=null,a.fire("load")};var h=o(a,g);return a.contentAreaContainer=b.iframeContainer,a.iframeElement=g,j.add(b.iframeContainer,g),h},q=function(a){var b,c=a.settings,d=a.getElement();if(a.rtl=c.rtl_ui||a.editorManager.i18n.rtl,a.editorManager.i18n.setCode(c.language),c.aria_label=c.aria_label||j.getAttrib(d,"aria-label",a.getLang("aria.rich_text_area")),a.fire("ScriptsLoaded"),m(a),l(a),b=n(a),c.content_css&&h.each(h.explode(c.content_css),function(b){a.contentCSS.push(a.documentBaseURI.toAbsolute(b))}),c.content_style&&a.contentStyles.push(c.content_style),c.content_editable)return e.initContentBody(a);var f=p(a,b);b.editorContainer&&(j.get(b.editorContainer).style.display=a.orgDisplay,a.hidden=j.isHidden(b.editorContainer)),a.getElement().style.display="none",j.setAttrib(a.id,"aria-hidden",!0),f||e.initContentBody(a)};return{init:q}}),g("2d",["59","h","a","i","9","2h","5a","13","5b","5c","c","12"],function(a,b,c,d,e,f,g,h,i,j,k,l){var m=b.DOM,n=function(a,b){var c=a.settings,e=d.ScriptLoader;if(c.language&&"en"!=c.language&&!c.language_url&&(c.language_url=a.editorManager.baseURL+"/langs/"+c.language+".js"),c.language_url&&e.add(c.language_url),c.theme&&"function"!=typeof c.theme&&"-"!=c.theme.charAt(0)&&!j.urls[c.theme]){var h=c.theme_url;h=h?a.documentBaseURI.toAbsolute(h):"themes/"+c.theme+"/theme"+b+".js",j.load(c.theme,h)}k.isArray(c.plugins)&&(c.plugins=c.plugins.join(" ")),k.each(c.external_plugins,function(a,b){i.load(b,a),c.plugins+=" "+b}),k.each(c.plugins.split(/[ ,]/),function(a){if(a=k.trim(a),a&&!i.urls[a])if("-"===a.charAt(0)){a=a.substr(1,a.length);var c=i.dependencies(a);k.each(c,function(a){var c={prefix:"plugins/",resource:a,suffix:"/plugin"+b+".js"};a=i.createUrl(c,a),i.load(a.resource,a)})}else i.load(a,{prefix:"plugins/",resource:a,suffix:"/plugin"+b+".js"})}),e.loadQueue(function(){a.removed||g.init(a)},a,function(b){f.pluginLoadError(a,b[0]),a.removed||g.init(a)})},o=function(b){function d(){m.unbind(a,"ready",d),b.render()}var f=b.settings,g=b.id;if(!c.Event.domLoaded)return void m.bind(a,"ready",d);if(b.getElement()&&e.contentEditable){f.inline?b.inline=!0:(b.orgVisibility=b.getElement().style.visibility,b.getElement().style.visibility="hidden");var i=b.getElement().form||m.getParent(g,"form");i&&(b.formElement=i,f.hidden_input&&!/TEXTAREA|INPUT/i.test(b.getElement().nodeName)&&(m.insertAfter(m.create("input",{type:"hidden",name:g}),g),b.hasHiddenInput=!0),b.formEventDelegate=function(a){b.fire(a.type,a)},m.bind(i,"submit reset",b.formEventDelegate),b.on("reset",function(){b.setContent(b.startContent,{format:"raw"})}),!f.submit_patch||i.submit.nodeType||i.submit.length||i._mceOldSubmit||(i._mceOldSubmit=i.submit,i.submit=function(){return b.editorManager.triggerSave(),b.setDirty(!1),i._mceOldSubmit(i)})),b.windowManager=new l(b),b.notificationManager=new h(b),"xml"===f.encoding&&b.on("GetContent",function(a){a.save&&(a.content=m.encode(a.content))}),f.add_form_submit_trigger&&b.on("submit",function(){b.initialized&&b.save()}),f.add_unload_trigger&&(b._beforeUnload=function(){!b.initialized||b.destroyed||b.isHidden()||b.save({format:"raw",no_events:!0,set_dirty:!1})},b.editorManager.on("BeforeUnload",b._beforeUnload)),b.editorManager.add(b),n(b,b.suffix)}};return{render:o}}),g("2e",[],function(){function a(a,b,c){try{a.getDoc().execCommand(b,!1,c)}catch(a){}}function b(a){var b,c;return b=a.getBody(),c=function(b){a.dom.getParents(b.target,"a").length>0&&b.preventDefault()},a.dom.bind(b,"click",c),{unbind:function(){a.dom.unbind(b,"click",c)}}}function c(c,d){c._clickBlocker&&(c._clickBlocker.unbind(),c._clickBlocker=null),d?(c._clickBlocker=b(c),c.selection.controlSelection.hideResizeRect(),c.readonly=!0,c.getBody().contentEditable=!1):(c.readonly=!1,c.getBody().contentEditable=!0,a(c,"StyleWithCSS",!1),a(c,"enableInlineTableEditing",!1),a(c,"enableObjectResizing",!1),c.focus(),c.nodeChanged())}function d(a,b){var d=a.readonly?"readonly":"design";b!=d&&(a.initialized?c(a,"readonly"==b):a.on("init",function(){c(a,"readonly"==b)}),a.fire("SwitchMode",{mode:b}))}return{setMode:d}}),g("2f",[],function(){var a=function(a,b,c){var d=a.sidebars?a.sidebars:[];d.push({name:b,settings:c}),a.sidebars=d};return{add:a}}),g("16",["j","d","h","x","14","2c","9","q","2d","2e","15","2f","c","y","2g"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){function p(c,e,h){var i,j,l=this;i=l.documentBaseUrl=h.documentBaseURL,j=h.baseURI,e=f.getEditorSettings(l,c,i,h.defaultSettings,e),l.settings=e,a.language=e.language||"en",a.languageLoad=e.language_load,a.baseURL=h.baseURL,l.id=c,l.setDirty(!1),l.plugins={},l.documentBaseURI=new n(e.document_base_url,{base_uri:j}),l.baseURI=j,l.contentCSS=[],l.contentStyles=[],l.shortcuts=new k(l),l.loadedCSS={},l.editorCommands=new d(l),l.suffix=h.suffix,l.editorManager=h,l.inline=e.inline,e.cache_suffix&&(g.cacheSuffix=e.cache_suffix.replace(/^[\?\&]+/,"")),e.override_viewport===!1&&(g.overrideViewPort=!1),h.fire("SetupEditor",l),l.execCallback("setup",l),l.$=b.overrideDefaults(function(){return{context:l.inline?l.getBody():l.getDoc(),element:l.getBody()}})}var q=c.DOM,r=m.extend,s=m.each,t=m.trim,u=m.resolve,v=g.gecko,w=g.ie;return p.prototype={render:function(){i.render(this)},focus:function(a){function b(a){return f.dom.getParent(a,function(a){return"true"===f.dom.getContentEditable(a)})}var c,d,e,f=this,h=f.selection,i=f.settings.content_editable,j=f.getDoc(),k=f.getBody();if(!f.removed){if(!a){if(c=h.getRng(),c.item&&(d=c.item(0)),f.quirks.refreshContentEditable(),e=b(h.getNode()),f.$.contains(k,e))return e.focus(),h.normalize(),void f.editorManager.setActive(f);if(i||(g.opera||f.getBody().focus(),f.getWin().focus()),v||i){if(k.setActive)try{k.setActive()}catch(a){k.focus()}else f.inline&&document.activeElement!==k&&f.selection.setRng(f.lastRng),k.focus();i&&h.normalize()}d&&d.ownerDocument==j&&(c=j.body.createControlRange(),c.addElement(d),c.select())}f.editorManager.setActive(f)}},execCallback:function(a){var b,c=this,d=c.settings[a];if(d)return c.callbackLookup&&(b=c.callbackLookup[a])&&(d=b.func,b=b.scope),"string"==typeof d&&(b=d.replace(/\.\w+$/,""),b=b?u(b):0,d=u(d),c.callbackLookup=c.callbackLookup||{},c.callbackLookup[a]={func:d,scope:b}),d.apply(b||c,Array.prototype.slice.call(arguments,1))},translate:function(a){if(a&&m.is(a,"string")){var b=this.settings.language||"en",c=this.editorManager.i18n;a=c.data[b+"."+a]||a.replace(/\{\#([^\}]+)\}/g,function(a,d){return c.data[b+"."+d]||"{#"+d+"}"})}return this.editorManager.translate(a)},getLang:function(a,b){return this.editorManager.i18n.data[(this.settings.language||"en")+"."+a]||(void 0!==b?b:"{#"+a+"}")},getParam:function(a,b,c){var d,e=a in this.settings?this.settings[a]:b;return"hash"===c?(d={},"string"==typeof e?s(e.indexOf("=")>0?e.split(/[;,](?![^=;,]*(?:[;,]|$))/):e.split(","),function(a){a=a.split("="),a.length>1?d[t(a[0])]=t(a[1]):d[t(a[0])]=t(a)}):d=e,d):e},nodeChanged:function(a){this._nodeChangeDispatcher.nodeChanged(a)},addButton:function(a,b){var c=this;b.cmd&&(b.onclick=function(){c.execCommand(b.cmd)}),b.text||b.icon||(b.icon=a),c.buttons=c.buttons||{},b.tooltip=b.tooltip||b.title,c.buttons[a]=b},addSidebar:function(a,b){return l.add(this,a,b)},addMenuItem:function(a,b){var c=this;b.cmd&&(b.onclick=function(){c.execCommand(b.cmd)}),c.menuItems=c.menuItems||{},c.menuItems[a]=b},addContextToolbar:function(a,b){var c,d=this;d.contextToolbars=d.contextToolbars||[],"string"==typeof a&&(c=a,a=function(a){return d.dom.is(a,c)}),d.contextToolbars.push({id:o.uuid("mcet"),predicate:a,items:b})},addCommand:function(a,b,c){this.editorCommands.addCommand(a,b,c)},addQueryStateHandler:function(a,b,c){this.editorCommands.addQueryStateHandler(a,b,c)},addQueryValueHandler:function(a,b,c){this.editorCommands.addQueryValueHandler(a,b,c)},addShortcut:function(a,b,c,d){this.shortcuts.add(a,b,c,d)},execCommand:function(a,b,c,d){return this.editorCommands.execCommand(a,b,c,d)},queryCommandState:function(a){return this.editorCommands.queryCommandState(a)},queryCommandValue:function(a){return this.editorCommands.queryCommandValue(a)},queryCommandSupported:function(a){return this.editorCommands.queryCommandSupported(a)},show:function(){var a=this;a.hidden&&(a.hidden=!1,a.inline?a.getBody().contentEditable=!0:(q.show(a.getContainer()),q.hide(a.id)),a.load(),a.fire("show"))},hide:function(){var a=this,b=a.getDoc();a.hidden||(w&&b&&!a.inline&&b.execCommand("SelectAll"),a.save(),a.inline?(a.getBody().contentEditable=!1,a==a.editorManager.focusedEditor&&(a.editorManager.focusedEditor=null)):(q.hide(a.getContainer()),q.setStyle(a.id,"display",a.orgDisplay)),a.hidden=!0,a.fire("hide"))},isHidden:function(){return!!this.hidden},setProgressState:function(a,b){this.fire("ProgressState",{state:a,time:b})},load:function(a){var b,c=this,d=c.getElement();return c.removed?"":d?(a=a||{},a.load=!0,b=c.setContent(void 0!==d.value?d.value:d.innerHTML,a),a.element=d,a.no_events||c.fire("LoadContent",a),a.element=d=null,b):void 0},save:function(a){var b,c,d=this,e=d.getElement();if(e&&d.initialized&&!d.removed)return a=a||{},a.save=!0,a.element=e,b=a.content=d.getContent(a),a.no_events||d.fire("SaveContent",a),"raw"==a.format&&d.fire("RawSaveContent",a),b=a.content,/TEXTAREA|INPUT/i.test(e.nodeName)?e.value=b:(d.inline||(e.innerHTML=b),(c=q.getParent(d.id,"form"))&&s(c.elements,function(a){ -if(a.name==d.id)return a.value=b,!1})),a.element=e=null,a.set_dirty!==!1&&d.setDirty(!1),b},setContent:function(a,b){var c,d,e=this,f=e.getBody();return b=b||{},b.format=b.format||"html",b.set=!0,b.content=a,b.no_events||e.fire("BeforeSetContent",b),a=b.content,0===a.length||/^\s+$/.test(a)?(d=w&&w<11?"":'
',"TABLE"==f.nodeName?a="
":/^(UL|OL)$/.test(f.nodeName)&&(a="
  • "+d+"
  • "),c=e.settings.forced_root_block,c&&e.schema.isValidChild(f.nodeName.toLowerCase(),c.toLowerCase())?(a=d,a=e.dom.createHTML(c,e.settings.forced_root_block_attrs,a)):w||a||(a='
    '),e.dom.setHTML(f,a),e.fire("SetContent",b)):("raw"!==b.format&&(a=new h({validate:e.validate},e.schema).serialize(e.parser.parse(a,{isRootContent:!0}))),b.content=t(a),e.dom.setHTML(f,b.content),b.no_events||e.fire("SetContent",b)),b.content},getContent:function(a){var b,c=this,d=c.getBody();return c.removed?"":(a=a||{},a.format=a.format||"html",a.get=!0,a.getInner=!0,a.no_events||c.fire("BeforeGetContent",a),b="raw"==a.format?m.trim(c.serializer.getTrimmedContent()):"text"==a.format?d.innerText||d.textContent:c.serializer.serialize(d,a),"text"!=a.format?a.content=t(b):a.content=b,a.no_events||c.fire("GetContent",a),a.content)},insertContent:function(a,b){b&&(a=r({content:a},b)),this.execCommand("mceInsertContent",!1,a)},isDirty:function(){return!this.isNotDirty},setDirty:function(a){var b=!this.isNotDirty;this.isNotDirty=!a,a&&a!=b&&this.fire("dirty")},setMode:function(a){j.setMode(this,a)},getContainer:function(){var a=this;return a.container||(a.container=q.get(a.editorContainer||a.id+"_parent")),a.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return this.targetElm||(this.targetElm=q.get(this.id)),this.targetElm},getWin:function(){var a,b=this;return b.contentWindow||(a=b.iframeElement,a&&(b.contentWindow=a.contentWindow)),b.contentWindow},getDoc:function(){var a,b=this;return b.contentDocument||(a=b.getWin(),a&&(b.contentDocument=a.document)),b.contentDocument},getBody:function(){var a=this.getDoc();return this.bodyElement||(a?a.body:null)},convertURL:function(a,b,c){var d=this,e=d.settings;return e.urlconverter_callback?d.execCallback("urlconverter_callback",a,c,!0,b):!e.convert_urls||c&&"LINK"==c.nodeName||0===a.indexOf("file:")||0===a.length?a:e.relative_urls?d.documentBaseURI.toRelative(a):a=d.documentBaseURI.toAbsolute(a,e.remove_script_host)},addVisual:function(a){var b,c=this,d=c.settings,e=c.dom;a=a||c.getBody(),void 0===c.hasVisual&&(c.hasVisual=d.visual),s(e.select("table,a",a),function(a){var f;switch(a.nodeName){case"TABLE":return b=d.visual_table_class||"mce-item-table",f=e.getAttrib(a,"border"),void(f&&"0"!=f||!c.hasVisual?e.removeClass(a,b):e.addClass(a,b));case"A":return void(e.getAttrib(a,"href",!1)||(f=e.getAttrib(a,"name")||a.id,b=d.visual_anchor_class||"mce-item-anchor",f&&c.hasVisual?e.addClass(a,b):e.removeClass(a,b)))}}),c.fire("VisualAid",{element:a,hasVisual:c.hasVisual})},remove:function(){var a=this;a.removed||(a.save(),a.removed=1,a.unbindAllNativeEvents(),a.hasHiddenInput&&q.remove(a.getElement().nextSibling),a.inline||(w&&w<10&&a.getDoc().execCommand("SelectAll",!1,null),q.setStyle(a.id,"display",a.orgDisplay),a.getBody().onload=null),a.fire("remove"),a.editorManager.remove(a),q.remove(a.getContainer()),a._selectionOverrides.destroy(),a.editorUpload.destroy(),a.destroy())},destroy:function(a){var b,c=this;if(!c.destroyed){if(!a&&!c.removed)return void c.remove();a||(c.editorManager.off("beforeunload",c._beforeUnload),c.theme&&c.theme.destroy&&c.theme.destroy(),c.selection.destroy(),c.dom.destroy()),b=c.formElement,b&&(b._mceOldSubmit&&(b.submit=b._mceOldSubmit,b._mceOldSubmit=null),q.unbind(b,"submit reset",c.formEventDelegate)),c.contentAreaContainer=c.formElement=c.container=c.editorContainer=null,c.bodyElement=c.contentDocument=c.contentWindow=null,c.iframeElement=c.targetElm=null,c.selection&&(c.selection=c.selection.win=c.selection.dom=c.selection.dom.doc=null),c.destroyed=1}},uploadImages:function(a){return this.editorUpload.uploadImages(a)},_scanForImages:function(){return this.editorUpload.scanForImages()}},r(p.prototype,e),p}),g("17",["c"],function(a){"use strict";var b={},c="en";return{setCode:function(a){a&&(c=a,this.rtl=!!this.data[a]&&"rtl"===this.data[a]._dir)},getCode:function(){return c},rtl:!1,add:function(a,c){var d=b[a];d||(b[a]=d={});for(var e in c)d[e]=c[e];this.setCode(a)},translate:function(d){function e(b){return a.is(b,"function")?Object.prototype.toString.call(b):f(b)?"":""+b}function f(b){return""===b||null===b||a.is(b,"undefined")}function g(b){return b=e(b),a.hasOwn(h,b)?e(h[b]):b}var h=b[c]||{};if(f(d))return"";if(a.is(d,"object")&&a.hasOwn(d,"raw"))return e(d.raw);if(a.is(d,"array")){var i=d.slice(1);d=g(d[0]).replace(/\{([0-9]+)\}/g,function(b,c){return a.hasOwn(i,c)?e(i[c]):b})}return g(d).replace(/{context:\w+}$/,"")},data:b}}),g("18",["h","8","9"],function(a,b,c){function d(a){function d(){try{return document.activeElement}catch(a){return document.body}}function j(a,b){if(b&&b.startContainer){if(!a.isChildOf(b.startContainer,a.getRoot())||!a.isChildOf(b.endContainer,a.getRoot()))return;return{startContainer:b.startContainer,startOffset:b.startOffset,endContainer:b.endContainer,endOffset:b.endOffset}}return b}function l(a,b){var c;return b.startContainer?(c=a.getDoc().createRange(),c.setStart(b.startContainer,b.startOffset),c.setEnd(b.endContainer,b.endOffset)):c=b,c}function m(e){var m=e.editor;m.on("init",function(){(m.inline||c.ie)&&("onbeforedeactivate"in document&&c.ie<9?m.dom.bind(m.getBody(),"beforedeactivate",function(a){if(a.target==m.getBody())try{m.lastRng=m.selection.getRng()}catch(a){}}):m.on("nodechange mouseup keyup",function(a){var b=d();"nodechange"==a.type&&a.selectionChange||(b&&b.id==m.id+"_ifr"&&(b=m.getBody()),m.dom.isChildOf(b,m.getBody())&&(m.lastRng=m.selection.getRng()))}))}),m.on("setcontent",function(){m.lastRng=null}),m.on("mousedown",function(){m.selection.lastFocusBookmark=null}),m.on("focusin",function(){var b,c=a.focusedEditor;m.selection.lastFocusBookmark&&(b=l(m,m.selection.lastFocusBookmark),m.selection.lastFocusBookmark=null,m.selection.setRng(b)),c!=m&&(c&&c.fire("blur",{focusedEditor:m}),a.setActive(m),a.focusedEditor=m,m.fire("focus",{blurredEditor:c}),m.focus(!0)),m.lastRng=null}),m.on("focusout",function(){b.setEditorTimeout(m,function(){var b=a.focusedEditor;i(m,d())||b!=m||(m.fire("blur",{focusedEditor:null}),a.focusedEditor=null,m.selection&&(m.selection.lastFocusBookmark=null))})}),f||(f=function(b){var c,d=a.activeEditor;c=b.target,d&&c.ownerDocument===document&&(d.selection&&c!==d.getBody()&&k(m,c)&&(d.selection.lastFocusBookmark=j(d.dom,d.lastRng)),c===document.body||i(d,c)||a.focusedEditor!==d||(d.fire("blur",{focusedEditor:null}),a.focusedEditor=null))},h.bind(document,"focusin",f)),m.inline&&!g&&(g=function(b){var c=a.activeEditor,d=c.dom;if(c.inline&&d&&!d.isChildOf(b.target,c.getBody())){var e=c.selection.getRng();e.collapsed||(c.lastRng=e)}},h.bind(document,"mouseup",g))}function n(b){a.focusedEditor==b.editor&&(a.focusedEditor=null),a.activeEditor||(h.unbind(document,"selectionchange",e),h.unbind(document,"focusin",f),h.unbind(document,"mouseup",g),e=f=g=null)}a.on("AddEditor",m),a.on("RemoveEditor",n)}var e,f,g,h=a.DOM,i=function(a,b){var c=a?a.settings.custom_ui_selector:"",e=h.getParent(b,function(b){return d.isEditorUIElement(b)||!!c&&a.dom.is(b,c)});return null!==e},j=function(a){return a.inline===!0},k=function(a,b){return j(a)===!1||a.dom.isChildOf(b,a.getBody())===!1};return d.isEditorUIElement=function(a){return a.className.toString().indexOf("mce-")!==-1},d._isUIElement=i,d}),g("2i",["c"],function(a){var b=a.each,c=a.explode,d=function(a){a.on("AddEditor",function(a){var d=a.editor;d.on("preInit",function(){function a(a,c){b(c,function(b,c){b&&h.setStyle(a,c,b)}),h.rename(a,"span")}function e(a){h=d.dom,i.convert_fonts_to_spans&&b(h.select("font,u,strike",a.node),function(a){f[a.nodeName.toLowerCase()](h,a)})}var f,g,h,i=d.settings;i.inline_styles&&(g=c(i.font_size_legacy_values),f={font:function(b,c){a(c,{backgroundColor:c.style.backgroundColor,color:c.color,fontFamily:c.face,fontSize:g[parseInt(c.size,10)-1]})},u:function(b,c){"html4"===d.settings.schema&&a(c,{textDecoration:"underline"})},strike:function(b,c){a(c,{textDecoration:"line-through"})}},d.on("PreProcess SetContent",e))})})};return{register:d}}),g("19",["j","d","h","16","9","2h","18","2i","17","11","7","c","y"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(a){v(s.editors,function(b){"scroll"===a.type?b.fire("ScrollWindow",a):b.fire("ResizeWindow",a)})}function o(a,c){c!==y&&(c?b(window).on("resize scroll",n):b(window).off("resize scroll",n),y=c)}function p(a){var b,c=s.editors;delete c[a.id];for(var d=0;d0&&v(u(b),function(a){var b;(b=t.get(a))?c.push(b):v(document.forms,function(b){v(b.elements,function(b){b.name===a&&(a="mce_editor_"+x++,t.setAttrib(b,"id",a),c.push(b))})})});break;case"textareas":case"specific_textareas":v(t.select("textarea"),function(b){a.editor_deselector&&i(b,a.editor_deselector)||a.editor_selector&&!i(b,a.editor_selector)||c.push(b)})}return c}function m(){function e(a,b,c){var e=new d(a,b,p);n.push(e),e.on("init",function(){++k===i.length&&r(n)}),e.targetElm=e.targetElm||c,e.render()}var i,k=0,n=[];return t.unbind(window,"ready",m),h("onpageload"),i=b.unique(j(a)),a.types?void v(a.types,function(b){l.each(i,function(c){return!t.is(c,b.selector)||(e(g(c),w({},a,b),c),!1)})}):(l.each(i,function(a){q(p.get(a.id))}),i=l.grep(i,function(a){return!p.get(a.id)}),void(0===i.length?r([]):v(i,function(b){c(a,b)?f.initError("Could not initialize inline editor on invalid inline target element",b):e(g(b),a,b)})))}var n,o,p=this;o=l.makeMap("area base basefont br col frame hr img input isindex link meta param embed source wbr track colgroup option tbody tfoot thead tr script noscript style textarea video audio iframe object menu"," ");var r=function(a){n=a};return p.settings=a,t.bind(window,"ready",m),new k(function(a){n?a(n):r=function(b){a(b)}})},get:function(a){return arguments.length?a in this.editors?this.editors[a]:null:this.editors},add:function(a){var b=this,c=b.editors;return c[a.id]=a,c.push(a),o(c,!0),b.activeEditor=a,b.fire("AddEditor",{editor:a}),r||(r=function(){b.fire("BeforeUnload")},t.bind(window,"beforeunload",r)),a},createEditor:function(a,b){return this.add(new d(a,b,this))},remove:function(a){var b,c,d=this,e=d.editors;{if(a)return"string"==typeof a?(a=a.selector||a,void v(t.select(a),function(a){c=e[a.id],c&&d.remove(c)})):(c=a,e[c.id]?(p(c)&&d.fire("RemoveEditor",{editor:c}),e.length||t.unbind(window,"beforeunload",r),c.remove(),o(e,e.length>0),c):null);for(b=e.length-1;b>=0;b--)d.remove(e[b])}},execCommand:function(a,b,c){var e=this,f=e.get(c);switch(a){case"mceAddEditor":return e.get(c)||new d(c,e.settings,e).render(),!0;case"mceRemoveEditor":return f&&f.remove(),!0;case"mceToggleEditor":return f?(f.isHidden()?f.show():f.hide(),!0):(e.execCommand("mceAddEditor",0,c),!0)}return!!e.activeEditor&&e.activeEditor.execCommand(a,b,c)},triggerSave:function(){v(this.editors,function(a){a.save()})},addI18n:function(a,b){i.add(a,b)},translate:function(a){return i.translate(a)},setActive:function(a){var b=this.activeEditor;this.activeEditor!=a&&(b&&b.fire("deactivate",{relatedTarget:a}),a.fire("activate",{relatedTarget:b})),this.activeEditor=a}},w(s,j),s.setup(),h.register(s),s}),g("1a",["11","c"],function(a,b){var c={send:function(a){function d(){!a.async||4==e.readyState||f++>1e4?(a.success&&f<1e4&&200==e.status?a.success.call(a.success_scope,""+e.responseText,e,a):a.error&&a.error.call(a.error_scope,f>1e4?"TIMED_OUT":"GENERAL",e,a),e=null):setTimeout(d,10)}var e,f=0;if(a.scope=a.scope||this,a.success_scope=a.success_scope||a.scope,a.error_scope=a.error_scope||a.scope,a.async=a.async!==!1,a.data=a.data||"",c.fire("beforeInitialize",{settings:a}),e=new XMLHttpRequest){if(e.overrideMimeType&&e.overrideMimeType(a.content_type),e.open(a.type||(a.data?"POST":"GET"),a.url,a.async),a.crossDomain&&(e.withCredentials=!0),a.content_type&&e.setRequestHeader("Content-Type",a.content_type),a.requestheaders&&b.each(a.requestheaders,function(a){e.setRequestHeader(a.key,a.value)}),e.setRequestHeader("X-Requested-With","XMLHttpRequest"),e=c.fire("beforeSend",{xhr:e,settings:a}).xhr,e.send(a.data),!a.async)return d();setTimeout(d,10)}}};return b.extend(c,a),c}),g("1b",[],function(){function a(b,c){var d,e,f,g;if(c=c||'"',null===b)return"null";if(f=typeof b,"string"==f)return e="\bb\tt\nn\ff\rr\"\"''\\\\",c+b.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(a,b){return'"'===c&&"'"===a?a:(d=e.indexOf(b),d+1?"\\"+e.charAt(d+1):(a=b.charCodeAt().toString(16),"\\u"+"0000".substring(a.length)+a))})+c;if("object"==f){if(b.hasOwnProperty&&"[object Array]"===Object.prototype.toString.call(b)){for(d=0,e="[";d0?",":"")+a(b[d],c);return e+"]"}e="{";for(g in b)b.hasOwnProperty(g)&&(e+="function"!=typeof b[g]?(e.length>1?","+c:c)+g+c+":"+a(b[g],c):"");return e+"}"}return""+b}return{serialize:a,parse:function(a){try{return window[String.fromCharCode(101)+"val"]("("+a+")")}catch(a){}}}}),g("1c",["1b","1a","c"],function(a,b,c){function d(a){this.settings=e({},a),this.count=0}var e=c.extend;return d.sendRPC=function(a){return(new d).send(a)},d.prototype={send:function(c){var d=c.error,f=c.success;c=e(this.settings,c),c.success=function(b,e){b=a.parse(b),"undefined"==typeof b&&(b={error:"JSON Parse error."}),b.error?d.call(c.error_scope||c.scope,b.error,e):f.call(c.success_scope||c.scope,b.result)},c.error=function(a,b){d&&d.call(c.error_scope||c.scope,a,b)},c.data=a.serialize({id:c.id||"c"+this.count++,method:c.method,params:c.params}),c.content_type="application/json",b.send(c)}},d}),g("1d",["h"],function(a){return{callbacks:{},count:0,send:function(b){var c=this,d=a.DOM,e=void 0!==b.count?b.count:c.count,f="tinymce_jsonp_"+e;c.callbacks[e]=function(a){d.remove(f),delete c.callbacks[e],b.callback(a)},d.add(d.doc.body,"script",{id:f,src:b.url,type:"text/javascript"}),c.count++}}}),g("1e",[],function(){function a(){g=[];for(var a in f)g.push(a);d.length=g.length}function b(){function b(a){var b,c;return c=void 0!==a?j+a:d.indexOf(",",j),c===-1||c>d.length?null:(b=d.substring(j,c),j=c+1,b)}var c,d,g,j=0;if(f={},i){e.load(h),d=e.getAttribute(h)||"";do{var k=b();if(null===k)break;if(c=b(parseInt(k,32)||0),null!==c){if(k=b(),null===k)break;g=b(parseInt(k,32)||0),c&&(f[c]=g)}}while(null!==c);a()}}function c(){var b,c="";if(i){for(var d in f)b=f[d],c+=(c?",":"")+d.length.toString(32)+","+d+","+b.length.toString(32)+","+b;e.setAttribute(h,c);try{e.save(h)}catch(a){}a()}}var d,e,f,g,h,i;try{if(window.localStorage)return localStorage}catch(a){}return h="tinymce",e=document.documentElement,i=!!e.addBehavior,i&&e.addBehavior("#default#userData"),d={key:function(a){return g[a]},getItem:function(a){return a in f?f[a]:null},setItem:function(a,b){f[a]=""+b,c()},removeItem:function(a){delete f[a],c()},clear:function(){f={},c()}},b(),d}),g("1f",[],function(){function a(a){function e(a,e,f){var g,h,i,j,k,l;return g=0,h=0,i=0,a/=255,e/=255,f/=255,k=b(a,b(e,f)),l=c(a,c(e,f)),k==l?(i=k,{h:0,s:0,v:100*i}):(j=a==k?e-f:f==k?a-e:f-a,g=a==k?3:f==k?1:5,g=60*(g-j/(l-k)),h=(l-k)/l,i=l,{h:d(g),s:d(100*h),v:d(100*i)})}function f(a,e,f){var g,h,i,j;if(a=(parseInt(a,10)||0)%360,e=parseInt(e,10)/100,f=parseInt(f,10)/100,e=c(0,b(e,1)),f=c(0,b(f,1)),0===e)return void(l=m=n=d(255*f));switch(g=a/60,h=f*e,i=h*(1-Math.abs(g%2-1)),j=f-h,Math.floor(g)){case 0:l=h,m=i,n=0;break;case 1:l=i,m=h,n=0;break;case 2:l=0,m=h,n=i;break;case 3:l=0,m=i,n=h;break;case 4:l=i,m=0,n=h;break;case 5:l=h,m=0,n=i;break;default:l=m=n=0}l=d(255*(l+j)),m=d(255*(m+j)),n=d(255*(n+j))}function g(){function a(a){return a=parseInt(a,10).toString(16),a.length>1?a:"0"+a}return"#"+a(l)+a(m)+a(n)}function h(){return{r:l,g:m,b:n}}function i(){return e(l,m,n)}function j(a){var b;return"object"==typeof a?"r"in a?(l=a.r,m=a.g,n=a.b):"v"in a&&f(a.h,a.s,a.v):(b=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)[^\)]*\)/gi.exec(a))?(l=parseInt(b[1],10),m=parseInt(b[2],10),n=parseInt(b[3],10)):(b=/#([0-F]{2})([0-F]{2})([0-F]{2})/gi.exec(a))?(l=parseInt(b[1],16),m=parseInt(b[2],16),n=parseInt(b[3],16)):(b=/#([0-F])([0-F])([0-F])/gi.exec(a))&&(l=parseInt(b[1]+b[1],16),m=parseInt(b[2]+b[2],16),n=parseInt(b[3]+b[3],16)),l=l<0?0:l>255?255:l,m=m<0?0:m>255?255:m,n=n<0?0:n>255?255:n,k}var k=this,l=0,m=0,n=0;a&&j(a),k.toRgb=h,k.toHsv=i,k.toHex=g,k.parse=j}var b=Math.min,c=Math.max,d=Math.round;return a}),g("2z",["z","c"],function(a,b){"use strict";return a.extend({Defaults:{firstControlClass:"first",lastControlClass:"last"},init:function(a){this.settings=b.extend({},this.Defaults,a)},preRender:function(a){a.bodyClasses.add(this.settings.containerClass)},applyClasses:function(a){var b,c,d,e,f=this,g=f.settings;b=g.firstControlClass,c=g.lastControlClass,a.each(function(a){a.classes.remove(b).remove(c).add(g.controlClass),a.visible()&&(d||(d=a),e=a)}),d&&d.classes.add(b),e&&e.classes.add(c)},renderHtml:function(a){var b=this,c="";return b.applyClasses(a.items()),a.items().each(function(a){c+=a.renderHtml()}),c},recalc:function(){},postRender:function(){},isNative:function(){return!1}})}),g("30",["2z"],function(a){"use strict";return a.extend({Defaults:{containerClass:"abs-layout",controlClass:"abs-layout-item"},recalc:function(a){a.items().filter(":visible").each(function(a){var b=a.settings;a.layoutRect({x:b.x,y:b.y,w:b.w,h:b.h}),a.recalc&&a.recalc()})},renderHtml:function(a){return'
    '+this._super(a)}})}),g("31",["2x"],function(a){"use strict";return a.extend({Defaults:{classes:"widget btn",role:"button"},init:function(a){var b,c=this;c._super(a),a=c.settings,b=c.settings.size,c.on("click mousedown",function(a){a.preventDefault()}),c.on("touchstart",function(a){c.fire("click",a),a.preventDefault()}),a.subtype&&c.classes.add(a.subtype),b&&c.classes.add("btn-"+b),a.icon&&c.icon(a.icon)},icon:function(a){return arguments.length?(this.state.set("icon",a),this):this.state.get("icon")},repaint:function(){var a,b=this.getEl().firstChild;b&&(a=b.style,a.width=a.height="100%"),this._super()},renderHtml:function(){var a,b=this,c=b._id,d=b.classPrefix,e=b.state.get("icon"),f=b.state.get("text"),g="";return a=b.settings.image,a?(e="none","string"!=typeof a&&(a=window.getSelection?a[0]:a[1]),a=" style=\"background-image: url('"+a+"')\""):a="",f&&(b.classes.add("btn-has-text"),g=''+b.encode(f)+""),e=e?d+"ico "+d+"i-"+e:"",'
    "},bindStates:function(){function a(a){var e=c("span."+d,b.getEl());a?(e[0]||(c("button:first",b.getEl()).append(''),e=c("span."+d,b.getEl())),e.html(b.encode(a))):e.remove(),b.classes.toggle("btn-has-text",!!a)}var b=this,c=b.$,d=b.classPrefix+"txt";return b.state.on("change:text",function(b){a(b.value)}),b.state.on("change:icon",function(c){var d=c.value,e=b.classPrefix;b.settings.icon=d,d=d?e+"ico "+e+"i-"+b.settings.icon:"";var f=b.getEl().firstChild,g=f.getElementsByTagName("i")[0];d?(g&&g==f.firstChild||(g=document.createElement("i"),f.insertBefore(g,f.firstChild)),g.className=d):g&&f.removeChild(g),a(b.state.get("text"))}),b._super()}})}),g("32",["2p"],function(a){"use strict";return a.extend({Defaults:{defaultType:"button",role:"group"},renderHtml:function(){var a=this,b=a._layout;return a.classes.add("btn-group"),a.preRender(),b.preRender(a),'
    '+(a.settings.html||"")+b.renderHtml(a)+"
    "}})}),g("33",["2x"],function(a){"use strict";return a.extend({Defaults:{classes:"checkbox",role:"checkbox",checked:!1},init:function(a){var b=this;b._super(a),b.on("click mousedown",function(a){a.preventDefault()}),b.on("click",function(a){a.preventDefault(),b.disabled()||b.checked(!b.checked())}),b.checked(b.settings.checked)},checked:function(a){return arguments.length?(this.state.set("checked",a),this):this.state.get("checked")},value:function(a){return arguments.length?this.checked(a):this.checked()},renderHtml:function(){var a=this,b=a._id,c=a.classPrefix;return'
    '+a.encode(a.state.get("text"))+"
    "},bindStates:function(){function a(a){b.classes.toggle("checked",a),b.aria("checked",a)}var b=this;return b.state.on("change:text",function(a){b.getEl("al").firstChild.data=b.translate(a.value)}),b.state.on("change:checked change:value",function(c){b.fire("change"),a(c.value)}),b.state.on("change:icon",function(a){var c=a.value,d=b.classPrefix;if("undefined"==typeof c)return b.settings.icon;b.settings.icon=c,c=c?d+"ico "+d+"i-"+b.settings.icon:"";var e=b.getEl().firstChild,f=e.getElementsByTagName("i")[0];c?(f&&f==e.firstChild||(f=document.createElement("i"),e.insertBefore(f,e.firstChild)),f.className=c):f&&e.removeChild(f)}),b.state.get("checked")&&a(!0),b._super()}})}),g("34",["2x","2n","55","d","s","c"],function(a,b,c,d,e,f){"use strict";return a.extend({init:function(a){var b=this;b._super(a),a=b.settings,b.classes.add("combobox"),b.subinput=!0,b.ariaTarget="inp",a.menu=a.menu||a.values,a.menu&&(a.icon="caret"),b.on("click",function(c){var e=c.target,f=b.getEl();if(d.contains(f,e)||e==f)for(;e&&e!=f;)e.id&&e.id.indexOf("-open")!=-1&&(b.fire("action"),a.menu&&(b.showMenu(),c.aria&&b.menu.items()[0].focus())),e=e.parentNode}),b.on("keydown",function(a){var c;13==a.keyCode&&"INPUT"===a.target.nodeName&&(a.preventDefault(),b.parents().reverse().each(function(a){if(a.toJSON)return c=a,!1}),b.fire("submit",{data:c.toJSON()}))}),b.on("keyup",function(a){if("INPUT"==a.target.nodeName){var c=b.state.get("value"),d=a.target.value;d!==c&&(b.state.set("value",d),b.fire("autocomplete",a))}}),b.on("mouseover",function(a){var c=b.tooltip().moveTo(-65535);if(b.statusLevel()&&a.target.className.indexOf(b.classPrefix+"status")!==-1){var d=b.statusMessage()||"Ok",e=c.text(d).show().testMoveRel(a.target,["bc-tc","bc-tl","bc-tr"]);c.classes.toggle("tooltip-n","bc-tc"==e),c.classes.toggle("tooltip-nw","bc-tl"==e),c.classes.toggle("tooltip-ne","bc-tr"==e),c.moveRel(a.target,e)}})},statusLevel:function(a){return arguments.length>0&&this.state.set("statusLevel",a),this.state.get("statusLevel")},statusMessage:function(a){return arguments.length>0&&this.state.set("statusMessage",a),this.state.get("statusMessage")},showMenu:function(){var a,c=this,d=c.settings;c.menu||(a=d.menu||[],a.length?a={type:"menu",items:a}:a.type=a.type||"menu",c.menu=b.create(a).parent(c).renderTo(c.getContainerElm()),c.fire("createmenu"),c.menu.reflow(),c.menu.on("cancel",function(a){a.control===c.menu&&c.focus()}),c.menu.on("show hide",function(a){a.control.items().each(function(a){a.active(a.value()==c.value())})}).fire("show"),c.menu.on("select",function(a){c.value(a.control.value())}),c.on("focusin",function(a){"INPUT"==a.target.tagName.toUpperCase()&&c.menu.hide()}),c.aria("expanded",!0)),c.menu.show(),c.menu.layoutRect({w:c.layoutRect().w}),c.menu.moveRel(c.getEl(),c.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"])},focus:function(){this.getEl("inp").focus()},repaint:function(){var a,b,e=this,f=e.getEl(),g=e.getEl("open"),h=e.layoutRect(),i=0,j=f.firstChild;e.statusLevel()&&"none"!==e.statusLevel()&&(i=parseInt(c.getRuntimeStyle(j,"padding-right"),10)-parseInt(c.getRuntimeStyle(j,"padding-left"),10)),a=g?h.w-c.getSize(g).width-10:h.w-10;var k=document;return k.all&&(!k.documentMode||k.documentMode<=8)&&(b=e.layoutRect().h-2+"px"),d(j).css({width:a-i,lineHeight:b}),e._super(),e},postRender:function(){var a=this;return d(this.getEl("inp")).on("change",function(b){a.state.set("value",b.target.value),a.fire("change",b)}),a._super()},renderHtml:function(){var a,b,c=this,d=c._id,e=c.settings,f=c.classPrefix,g=c.state.get("value")||"",h="",i="",j="";return"spellcheck"in e&&(i+=' spellcheck="'+e.spellcheck+'"'),e.maxLength&&(i+=' maxlength="'+e.maxLength+'"'),e.size&&(i+=' size="'+e.size+'"'),e.subtype&&(i+=' type="'+e.subtype+'"'),j='',c.disabled()&&(i+=' disabled="disabled"'),a=e.icon,a&&"caret"!=a&&(a=f+"ico "+f+"i-"+e.icon),b=c.state.get("text"),(a||b)&&(h='
    ",c.classes.add("has-open")),'
    '+j+h+"
    "},value:function(a){return arguments.length?(this.state.set("value",a),this):(this.state.get("rendered")&&this.state.set("value",this.getEl("inp").value),this.state.get("value"))},showAutoComplete:function(a,c){var d=this;if(0===a.length)return void d.hideMenu();var e=function(a,b){return function(){d.fire("selectitem",{title:b,value:a})}};d.menu?d.menu.items().remove():d.menu=b.create({type:"menu",classes:"combobox-menu",layout:"flow"}).parent(d).renderTo(),f.each(a,function(a){d.menu.add({text:a.title,url:a.previewUrl,match:c,classes:"menu-item-ellipsis",onclick:e(a.value,a.title)})}),d.menu.renderNew(),d.hideMenu(),d.menu.on("cancel",function(a){a.control.parent()===d.menu&&(a.stopPropagation(),d.focus(),d.hideMenu())}),d.menu.on("select",function(){d.focus()});var g=d.layoutRect().w;d.menu.layoutRect({w:g,minW:0,maxW:g}),d.menu.reflow(),d.menu.show(),d.menu.moveRel(d.getEl(),d.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"])},hideMenu:function(){this.menu&&this.menu.hide()},bindStates:function(){var a=this;a.state.on("change:value",function(b){a.getEl("inp").value!=b.value&&(a.getEl("inp").value=b.value)}),a.state.on("change:disabled",function(b){a.getEl("inp").disabled=b.value}),a.state.on("change:statusLevel",function(b){var d=a.getEl("status"),e=a.classPrefix,f=b.value;c.css(d,"display","none"===f?"none":""),c.toggleClass(d,e+"i-checkmark","ok"===f),c.toggleClass(d,e+"i-warning","warn"===f),c.toggleClass(d,e+"i-error","error"===f),a.classes.toggle("has-status","none"!==f),a.repaint()}),c.on(a.getEl("status"),"mouseleave",function(){a.tooltip().hide()}),a.on("cancel",function(b){a.menu&&a.menu.visible()&&(b.stopPropagation(),a.hideMenu())});var b=function(a,b){b&&b.items().length>0&&b.items().eq(a)[0].focus()};return a.on("keydown",function(c){var d=c.keyCode;"INPUT"===c.target.nodeName&&(d===e.DOWN?(c.preventDefault(),a.fire("autocomplete"),b(0,a.menu)):d===e.UP&&(c.preventDefault(),b(-1,a.menu)))}),a._super()},remove:function(){d(this.getEl("inp")).off(),this.menu&&this.menu.remove(),this._super()}})}),g("35",["34"],function(a){"use strict";return a.extend({init:function(a){var b=this;a.spellcheck=!1,a.onaction&&(a.icon="none"),b._super(a),b.classes.add("colorbox"),b.on("change keyup postrender",function(){b.repaintColor(b.value())})},repaintColor:function(a){var b=this.getEl("open"),c=b?b.getElementsByTagName("i")[0]:null;if(c)try{c.style.background=a}catch(a){}},bindStates:function(){var a=this;return a.state.on("change:value",function(b){a.state.get("rendered")&&a.repaintColor(b.value)}),a._super()}})}),g("36",["31","2v"],function(a,b){"use strict";return a.extend({showPanel:function(){var a=this,c=a.settings;if(a.active(!0),a.panel)a.panel.show();else{var d=c.panel;d.type&&(d={layout:"grid",items:d}),d.role=d.role||"dialog",d.popover=!0,d.autohide=!0,d.ariaRoot=!0,a.panel=new b(d).on("hide",function(){a.active(!1)}).on("cancel",function(b){b.stopPropagation(),a.focus(),a.hidePanel()}).parent(a).renderTo(a.getContainerElm()),a.panel.fire("show"),a.panel.reflow()}var e=a.panel.testMoveRel(a.getEl(),c.popoverAlign||(a.isRtl()?["bc-tc","bc-tl","bc-tr"]:["bc-tc","bc-tr","bc-tl"]));a.panel.classes.toggle("start","bc-tl"===e),a.panel.classes.toggle("end","bc-tr"===e),a.panel.moveRel(a.getEl(),e)},hidePanel:function(){var a=this;a.panel&&a.panel.hide()},postRender:function(){var a=this;return a.aria("haspopup",!0),a.on("click",function(b){b.control===a&&(a.panel&&a.panel.visible()?a.hidePanel():(a.showPanel(),a.panel.focus(!!b.aria)))}),a._super()},remove:function(){return this.panel&&(this.panel.remove(),this.panel=null),this._super()}})}),g("37",["36","h"],function(a,b){"use strict";var c=b.DOM;return a.extend({init:function(a){this._super(a),this.classes.add("colorbutton")},color:function(a){return a?(this._color=a,this.getEl("preview").style.backgroundColor=a,this):this._color},resetColor:function(){return this._color=null,this.getEl("preview").style.backgroundColor=null,this},renderHtml:function(){var a=this,b=a._id,c=a.classPrefix,d=a.state.get("text"),e=a.settings.icon?c+"ico "+c+"i-"+a.settings.icon:"",f=a.settings.image?" style=\"background-image: url('"+a.settings.image+"')\"":"",g="";return d&&(a.classes.add("btn-has-text"),g=''+a.encode(d)+""),'
    '; -},postRender:function(){var a=this,b=a.settings.onclick;return a.on("click",function(d){d.aria&&"down"==d.aria.key||d.control!=a||c.getParent(d.target,"."+a.classPrefix+"open")||(d.stopImmediatePropagation(),b.call(a,d))}),delete a.settings.onclick,a._super()}})}),g("38",["2x","2q","55","1f"],function(a,b,c,d){"use strict";return a.extend({Defaults:{classes:"widget colorpicker"},init:function(a){this._super(a)},postRender:function(){function a(a,b){var d,e,f=c.getPos(a);return d=b.pageX-f.x,e=b.pageY-f.y,d=Math.max(0,Math.min(d/a.clientWidth,1)),e=Math.max(0,Math.min(e/a.clientHeight,1)),{x:d,y:e}}function e(a,b){var e=(360-a.h)/360;c.css(j,{top:100*e+"%"}),b||c.css(l,{left:a.s+"%",top:100-a.v+"%"}),k.style.background=new d({s:100,v:100,h:a.h}).toHex(),m.color().parse({s:a.s,v:a.v,h:a.h})}function f(b){var c;c=a(k,b),h.s=100*c.x,h.v=100*(1-c.y),e(h),m.fire("change")}function g(b){var c;c=a(i,b),h=n.toHsv(),h.h=360*(1-c.y),e(h,!0),m.fire("change")}var h,i,j,k,l,m=this,n=m.color();i=m.getEl("h"),j=m.getEl("hp"),k=m.getEl("sv"),l=m.getEl("svp"),m._repaint=function(){h=n.toHsv(),e(h)},m._super(),m._svdraghelper=new b(m._id+"-sv",{start:f,drag:f}),m._hdraghelper=new b(m._id+"-h",{start:g,drag:g}),m._repaint()},rgb:function(){return this.color().toRgb()},value:function(a){var b=this;return arguments.length?(b.color().parse(a),void(b._rendered&&b._repaint())):b.color().toHex()},color:function(){return this._color||(this._color=new d),this._color},renderHtml:function(){function a(){var a,b,c,d,g="";for(c="filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=",d=f.split(","),a=0,b=d.length-1;a';return g}var b,c=this,d=c._id,e=c.classPrefix,f="#ff0000,#ff0080,#ff00ff,#8000ff,#0000ff,#0080ff,#00ffff,#00ff80,#00ff00,#80ff00,#ffff00,#ff8000,#ff0000",g="background: -ms-linear-gradient(top,"+f+");background: linear-gradient(to bottom,"+f+");";return b='
    '+a()+'
    ','
    '+b+"
    "}})}),g("39",["2x"],function(a){"use strict";return a.extend({init:function(a){var b=this;a.delimiter||(a.delimiter="\xbb"),b._super(a),b.classes.add("path"),b.canFocus=!0,b.on("click",function(a){var c,d=a.target;(c=d.getAttribute("data-index"))&&b.fire("select",{value:b.row()[c],index:c})}),b.row(b.settings.row)},focus:function(){var a=this;return a.getEl().firstChild.focus(),a},row:function(a){return arguments.length?(this.state.set("row",a),this):this.state.get("row")},renderHtml:function(){var a=this;return'
    '+a._getDataPathHtml(a.state.get("row"))+"
    "},bindStates:function(){var a=this;return a.state.on("change:row",function(b){a.innerHtml(a._getDataPathHtml(b.value))}),a._super()},_getDataPathHtml:function(a){var b,c,d=this,e=a||[],f="",g=d.classPrefix;for(b=0,c=e.length;b0?'":"")+'
    '+e[b].name+"
    ";return f||(f='
    \xa0
    '),f}})}),g("3a",["39"],function(a){return a.extend({postRender:function(){function a(a){if(1===a.nodeType){if("BR"==a.nodeName||a.getAttribute("data-mce-bogus"))return!0;if("bookmark"===a.getAttribute("data-mce-type"))return!0}return!1}var b=this,c=b.settings.editor;return c.settings.elementpath!==!1&&(b.on("select",function(a){c.focus(),c.selection.select(this.row()[a.index].element),c.nodeChanged()}),c.on("nodeChange",function(d){for(var e=[],f=d.parents,g=f.length;g--;)if(1==f[g].nodeType&&!a(f[g])){var h=c.fire("ResolveName",{name:f[g].nodeName.toLowerCase(),target:f[g]});if(h.isDefaultPrevented()||e.push({name:h.name,element:f[g]}),h.isPropagationStopped())break}b.row(e)})),b._super()}})}),g("3b",["2p"],function(a){"use strict";return a.extend({Defaults:{layout:"flex",align:"center",defaults:{flex:1}},renderHtml:function(){var a=this,b=a._layout,c=a.classPrefix;return a.classes.add("formitem"),b.preRender(a),'
    '+(a.settings.title?'
    '+a.settings.title+"
    ":"")+'
    '+(a.settings.html||"")+b.renderHtml(a)+"
    "}})}),g("3c",["2p","3b","c"],function(a,b,c){"use strict";return a.extend({Defaults:{containerCls:"form",layout:"flex",direction:"column",align:"stretch",flex:1,padding:20,labelGap:30,spacing:10,callbacks:{submit:function(){this.submit()}}},preRender:function(){var a=this,d=a.items();a.settings.formItemDefaults||(a.settings.formItemDefaults={layout:"flex",autoResize:"overflow",defaults:{flex:1}}),d.each(function(d){var e,f=d.settings.label;f&&(e=new b(c.extend({items:{type:"label",id:d._id+"-l",text:f,flex:0,forId:d._id,disabled:d.disabled()}},a.settings.formItemDefaults)),e.type="formitem",d.aria("labelledby",d._id+"-l"),"undefined"==typeof d.settings.flex&&(d.settings.flex=1),a.replace(d,e),e.add(d))})},submit:function(){return this.fire("submit",{data:this.toJSON()})},postRender:function(){var a=this;a._super(),a.fromJSON(a.settings.data)},bindStates:function(){function a(){var a,c,d,e=0,f=[];if(b.settings.labelGapCalc!==!1)for(d="children"==b.settings.labelGapCalc?b.find("formitem"):b.items(),d.filter("formitem").each(function(a){var b=a.items()[0],c=b.getEl().clientWidth;e=c>e?c:e,f.push(b)}),c=b.settings.labelGap||0,a=f.length;a--;)f[a].settings.minWidth=e+c}var b=this;b._super(),b.on("show",a),a()}})}),g("3d",["3c"],function(a){"use strict";return a.extend({Defaults:{containerCls:"fieldset",layout:"flex",direction:"column",align:"stretch",flex:1,padding:"25 15 5 15",labelGap:30,spacing:10,border:1},renderHtml:function(){var a=this,b=a._layout,c=a.classPrefix;return a.preRender(),b.preRender(a),'
    '+(a.settings.title?''+a.settings.title+"":"")+'
    '+(a.settings.html||"")+b.renderHtml(a)+"
    "}})}),g("5d",["1w","62","h","1t","1q","49","c","2g"],function(a,b,c,d,e,f,g,h){var i=g.trim,j=function(a,b,c,d,e){return{type:a,title:b,url:c,level:d,attach:e}},k=function(a){for(;a=a.parentNode;){var b=a.contentEditable;if(b&&"inherit"!==b)return d.isContentEditableTrue(a)}return!1},l=function(c,d){return e.map(b.descendants(a.fromDom(d),c),function(a){return a.dom()})},m=function(a){return a.innerText||a.textContent},n=function(a){return a.id?a.id:h.uuid("h")},o=function(a){return a&&"A"===a.nodeName&&(a.id||a.name)},p=function(a){return o(a)&&r(a)},q=function(a){return a&&/^(H[1-6])$/.test(a.nodeName)},r=function(a){return k(a)&&!d.isContentEditableFalse(a)},s=function(a){return q(a)&&r(a)},t=function(a){return q(a)?parseInt(a.nodeName.substr(1),10):0},u=function(a){var b=n(a),c=function(){a.id=b};return j("header",m(a),"#"+b,t(a),c)},v=function(a){var b=a.id||a.name,c=m(a);return j("anchor",c?c:"#"+b,"#"+b,0,f.noop)},w=function(a){return e.map(e.filter(a,s),u)},x=function(a){return e.map(e.filter(a,p),v)},y=function(a){var b=l("h1,h2,h3,h4,h5,h6,a:not([href])",a);return b},z=function(a){return i(a.title).length>0},A=function(a){var b=y(a);return e.filter(w(b).concat(x(b)),z)};return{find:A}}),g("3e",["59","5d","19","34","1q","49","c"],function(a,b,c,d,e,f,g){"use strict";var h=function(){return a.tinymce?a.tinymce.activeEditor:c.activeEditor},i={},j=5,k=function(a){return{title:a.title,value:{title:{raw:a.title},url:a.url,attach:a.attach}}},l=function(a){return g.map(a,k)},m=function(a,b){return{title:a,value:{title:a,url:b,attach:f.noop}}},n=function(a,b){var c=e.find(b,function(b){return b.url===a});return!c},o=function(a,b,c){var d=b in a?a[b]:c;return d===!1?null:d},p=function(a,b,c,d){var h={title:"-"},j=function(a){var d=e.filter(a[c],function(a){return n(a,b)});return g.map(d,function(a){return{title:a,value:{title:a,url:a,attach:f.noop}}})},k=function(a){var c=e.filter(b,function(b){return b.type==a});return l(c)},p=function(){var a=k("anchor"),b=o(d,"anchor_top","#top"),c=o(d,"anchor_bottom","#bottom");return null!==b&&a.unshift(m("",b)),null!==c&&a.push(m("",c)),a},q=function(a){return e.reduce(a,function(a,b){var c=0===a.length||0===b.length;return c?a.concat(b):a.concat(h,b)},[])};return d.typeahead_urls===!1?[]:"file"===c?q([r(a,j(i)),r(a,k("header")),r(a,p())]):r(a,j(i))},q=function(a,b){var c=i[b];/^https?/.test(a)&&(c?e.indexOf(c,a)===-1&&(i[b]=c.slice(0,j).concat(a)):i[b]=[a])},r=function(a,b){var c=a.toLowerCase(),d=g.grep(b,function(a){return a.title.toLowerCase().indexOf(c)!==-1});return 1===d.length&&d[0].title===a?[]:d},s=function(a){var b=a.title;return b.raw?b.raw:b},t=function(a,c,d,e){var f=function(f){var g=b.find(d),h=p(f,g,e,c);a.showAutoComplete(h,f)};a.on("autocomplete",function(){f(a.value())}),a.on("selectitem",function(b){var c=b.value;a.value(c.url);var d=s(c);"image"===e?a.fire("change",{meta:{alt:d,attach:c.attach}}):a.fire("change",{meta:{text:d,attach:c.attach}}),a.focus()}),a.on("click",function(b){0===a.value().length&&"INPUT"===b.target.nodeName&&f("")}),a.on("PostRender",function(){a.getRoot().on("submit",function(b){b.isDefaultPrevented()||q(a.value(),e)})})},u=function(a){var b=a.status,c=a.message;return"valid"===b?{status:"ok",message:c}:"unknown"===b?{status:"warn",message:c}:"invalid"===b?{status:"warn",message:c}:{status:"none",message:""}},v=function(a,b,c){var d=b.filepicker_validator_handler;if(d){var e=function(b){return 0===b.length?void a.statusLevel("none"):void d({url:b,type:c},function(b){var c=u(b);a.statusMessage(c.message),a.statusLevel(c.status)})};a.state.on("change:value",function(a){e(a.value)})}};return d.extend({init:function(b){var c,d,e,f=this,i=h(),j=i.settings,k=b.filetype;b.spellcheck=!1,e=j.file_picker_types||j.file_browser_callback_types,e&&(e=g.makeMap(e,/[, ]/)),e&&!e[k]||(d=j.file_picker_callback,!d||e&&!e[k]?(d=j.file_browser_callback,!d||e&&!e[k]||(c=function(){d(f.getEl("inp").id,f.value(),k,a)})):c=function(){var a=f.fire("beforecall").meta;a=g.extend({filetype:k},a),d.call(i,function(a,b){f.value(a).fire("change",{meta:b})},f.value(),a)}),c&&(b.icon="browse",b.onaction=c),f._super(b),t(f,j,i.getBody(),k),v(f,j,k)}})}),g("3f",["30"],function(a){"use strict";return a.extend({recalc:function(a){var b=a.layoutRect(),c=a.paddingBox;a.items().filter(":visible").each(function(a){a.layoutRect({x:c.left,y:c.top,w:b.innerW-c.right-c.left,h:b.innerH-c.top-c.bottom}),a.recalc&&a.recalc()})}})}),g("3g",["30"],function(a){"use strict";return a.extend({recalc:function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N=[],O=Math.max,P=Math.min;for(d=a.items().filter(":visible"),e=a.layoutRect(),f=a.paddingBox,g=a.settings,m=a.isRtl()?g.direction||"row-reversed":g.direction,h=g.align,i=a.isRtl()?g.pack||"end":g.pack,j=g.spacing||0,"row-reversed"!=m&&"column-reverse"!=m||(d=d.set(d.toArray().reverse()),m=m.split("-")[0]),"column"==m?(z="y",x="h",y="minH",A="maxH",C="innerH",B="top",D="deltaH",E="contentH",J="left",H="w",F="x",G="innerW",I="minW",K="right",L="deltaW",M="contentW"):(z="x",x="w",y="minW",A="maxW",C="innerW",B="left",D="deltaW",E="contentW",J="top",H="h",F="y",G="innerH",I="minH",K="bottom",L="deltaH",M="contentH"),l=e[C]-f[B]-f[B],w=k=0,b=0,c=d.length;b0&&(k+=q,o[A]&&N.push(n),o.flex=q),l-=o[y],r=f[J]+o[I]+f[K],r>w&&(w=r);if(u={},l<0?u[y]=e[y]-l+e[D]:u[y]=e[C]-l+e[D],u[I]=w+e[L],u[E]=e[C]-l,u[M]=w,u.minW=P(u.minW,e.maxW),u.minH=P(u.minH,e.maxH),u.minW=O(u.minW,e.startMinWidth),u.minH=O(u.minH,e.startMinHeight),!e.autoResize||u.minW==e.minW&&u.minH==e.minH){for(t=l/k,b=0,c=N.length;bs?(l-=o[A]-o[y],k-=o.flex,o.flex=0,o.maxFlexSize=s):o.maxFlexSize=0;for(t=l/k,v=f[B],u={},0===k&&("end"==i?v=l+f[B]:"center"==i?(v=Math.round(e[C]/2-(e[C]-l)/2)+f[B],v<0&&(v=f[B])):"justify"==i&&(v=f[B],j=Math.floor(l/(d.length-1)))),u[F]=f[J],b=0,c=d.length;b0&&(r+=o.flex*t),u[x]=r,u[z]=v,n.layoutRect(u),n.recalc&&n.recalc(),v+=r+j}else if(u.w=u.minW,u.h=u.minH,a.layoutRect(u),this.recalc(a),null===a._lastRect){var Q=a.parent();Q&&(Q._lastRect=null,Q.recalc())}}})}),g("3h",["2z"],function(a){return a.extend({Defaults:{containerClass:"flow-layout",controlClass:"flow-layout-item",endClass:"break"},recalc:function(a){a.items().filter(":visible").each(function(a){a.recalc&&a.recalc()})},isNative:function(){return!0}})}),g("5f",["1","4l","1w","4s","h"],function(a,b,c,d,e){var f=function(a,c,d){for(;d!==c;){if(d.style[a]){var e=d.style[a];return""!==e?b.some(e):b.none()}d=d.parentNode}return b.none()},g=function(a){return/[0-9.]+px$/.test(a)?Math.round(72*parseInt(a,10)/96)+"pt":a},h=function(a){return a.replace(/[\'\"]/g,"").replace(/,\s+/g,",")},i=function(a,c){return b.from(e.DOM.getStyle(c,a,!0))},j=function(a){return function(e,g){return b.from(g).map(c.fromDom).filter(d.isElement).bind(function(b){return f(a,e,b.dom()).or(i(a,b.dom()))}).getOr("")}};return{getFontSize:j("fontSize"),getFontFamily:a.compose(h,j("fontFamily")),toPt:g}}),g("3i",["1","1w","5e","h","19","9","5f","2m","2v","2x","1q","c"],function(a,b,c,d,e,f,g,h,i,j,k,l){function m(d){d.settings.ui_container&&(f.container=c.descendant(b.fromDom(document.body),d.settings.ui_container).fold(a.constant(null),function(a){return a.dom()}))}function n(a){a.on("ScriptsLoaded",function(){a.rtl&&(h.rtl=!0)})}function o(a){function b(b,c){return function(){var d=this;a.on("nodeChange",function(e){var f=a.formatter,g=null;p(e.parents,function(a){if(p(b,function(b){if(c?f.matchNode(a,c,{value:b.value})&&(g=b.value):f.matchNode(a,b.value)&&(g=b.value),g)return!1}),g)return!1}),d.value(g)})}}function c(b){return function(){var c=this,d=function(a){return a?a.split(",")[0]:""};a.on("init nodeChange",function(e){var f,h=null;f=g.getFontFamily(a.getBody(),e.element),p(b,function(a){a.value.toLowerCase()===f.toLowerCase()&&(h=a.value)}),p(b,function(a){h||d(a.value).toLowerCase()!==d(f).toLowerCase()||(h=a.value)}),c.value(h),!h&&f&&c.text(d(f))})}}function d(b){return function(){var c=this;a.on("init nodeChange",function(d){var e,f,h=null;e=g.getFontSize(a.getBody(),d.element),f=g.toPt(e),p(b,function(a){a.value===e?h=e:a.value===f&&(h=f)}),c.value(h),h||c.text(f)})}}function e(a){a=a.replace(/;$/,"").split(";");for(var b=a.length;b--;)a[b]=a[b].split("=");return a}function f(){function b(a){var c=[];if(a)return p(a,function(a){var f={text:a.title,icon:a.icon};if(a.items)f.menu=b(a.items);else{var g=a.format||"custom"+d++;a.format||(a.name=g,e.push(a)),f.format=g,f.cmd=a.cmd}c.push(f)}),c}function c(){var c;return c=b(a.settings.style_formats_merge?a.settings.style_formats?f.concat(a.settings.style_formats):f:a.settings.style_formats||f)}var d=0,e=[],f=[{title:"Headings",items:[{title:"Heading 1",format:"h1"},{title:"Heading 2",format:"h2"},{title:"Heading 3",format:"h3"},{title:"Heading 4",format:"h4"},{title:"Heading 5",format:"h5"},{title:"Heading 6",format:"h6"}]},{title:"Inline",items:[{title:"Bold",icon:"bold",format:"bold"},{title:"Italic",icon:"italic",format:"italic"},{title:"Underline",icon:"underline",format:"underline"},{title:"Strikethrough",icon:"strikethrough",format:"strikethrough"},{title:"Superscript",icon:"superscript",format:"superscript"},{title:"Subscript",icon:"subscript",format:"subscript"},{title:"Code",icon:"code",format:"code"}]},{title:"Blocks",items:[{title:"Paragraph",format:"p"},{title:"Blockquote",format:"blockquote"},{title:"Div",format:"div"},{title:"Pre",format:"pre"}]},{title:"Alignment",items:[{title:"Left",icon:"alignleft",format:"alignleft"},{title:"Center",icon:"aligncenter",format:"aligncenter"},{title:"Right",icon:"alignright",format:"alignright"},{title:"Justify",icon:"alignjustify",format:"alignjustify"}]}];return a.on("init",function(){p(e,function(b){a.formatter.register(b.name,b)})}),{type:"menu",items:c(),onPostRender:function(b){a.fire("renderFormatsMenu",{control:b.control})},itemDefaults:{preview:!0,textStyle:function(){if(this.settings.format)return a.formatter.getCssText(this.settings.format)},onPostRender:function(){var b=this;b.parent().on("show",function(){var c,d;c=b.settings.format,c&&(b.disabled(!a.formatter.canApply(c)),b.active(a.formatter.match(c))),d=b.settings.cmd,d&&b.active(a.queryCommandState(d))})},onclick:function(){this.settings.format&&m(this.settings.format),this.settings.cmd&&a.execCommand(this.settings.cmd)}}}}function h(b){return function(){var c=this;a.formatter?a.formatter.formatChanged(b,function(a){c.active(a)}):a.on("init",function(){a.formatter.formatChanged(b,function(a){c.active(a)})})}}function j(b){return function(){function c(){var c="redo"==b?"hasRedo":"hasUndo";return!!a.undoManager&&a.undoManager[c]()}var d=this;d.disabled(!c()),a.on("Undo Redo AddUndo TypingUndo ClearUndos SwitchMode",function(){d.disabled(a.readonly||!c())})}}function k(){var b=this;a.on("VisualAid",function(a){b.active(a.hasVisual)}),b.active(a.hasVisual)}function m(b){b.control&&(b=b.control.value()),b&&a.execCommand("mceToggleFormat",!1,b)}function n(b){var c=b.length;return l.each(b,function(b){b.menu&&(b.hidden=0===n(b.menu));var d=b.format;d&&(b.hidden=!a.formatter.canApply(d)),b.hidden&&c--}),c}function o(b){var c=b.items().length;return b.items().each(function(b){b.menu&&b.visible(o(b.menu)>0),!b.menu&&b.settings.menu&&b.visible(n(b.settings.menu)>0);var d=b.settings.format;d&&b.visible(a.formatter.canApply(d)),b.visible()||c--}),c}var r;r=f(),p({bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",subscript:"Subscript",superscript:"Superscript"},function(b,c){a.addButton(c,{tooltip:b,onPostRender:h(c),onclick:function(){m(c)}})}),p({outdent:["Decrease indent","Outdent"],indent:["Increase indent","Indent"],cut:["Cut","Cut"],copy:["Copy","Copy"],paste:["Paste","Paste"],help:["Help","mceHelp"],selectall:["Select all","SelectAll"],removeformat:["Clear formatting","RemoveFormat"],visualaid:["Visual aids","mceToggleVisualAid"],newdocument:["New document","mceNewDocument"]},function(b,c){a.addButton(c,{tooltip:b[0],cmd:b[1]})}),p({blockquote:["Blockquote","mceBlockQuote"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],alignleft:["Align left","JustifyLeft"],aligncenter:["Align center","JustifyCenter"],alignright:["Align right","JustifyRight"],alignjustify:["Justify","JustifyFull"],alignnone:["No alignment","JustifyNone"]},function(b,c){a.addButton(c,{tooltip:b[0],cmd:b[1],onPostRender:h(c)})});var s=function(a){var b=a;return b.length>0&&"-"===b[0].text&&(b=b.slice(1)),b.length>0&&"-"===b[b.length-1].text&&(b=b.slice(0,b.length-1)),b},t=function(b){var c,d;if("string"==typeof b)d=b.split(" ");else if(l.isArray(b))return q(l.map(b,t));return c=l.grep(d,function(b){return"|"===b||b in a.menuItems}),l.map(c,function(b){return"|"===b?{text:"-"}:a.menuItems[b]})},u=function(b){var c=[{text:"-"}],d=l.grep(a.menuItems,function(a){return a.context===b});return l.each(d,function(a){"before"==a.separator&&c.push({text:"|"}),a.prependToContext?c.unshift(a):c.push(a),"after"==a.separator&&c.push({text:"|"})}),c},v=function(a){return s(a.insert_button_items?t(a.insert_button_items):u("insert"))};a.addButton("undo",{tooltip:"Undo",onPostRender:j("undo"),cmd:"undo"}),a.addButton("redo",{tooltip:"Redo",onPostRender:j("redo"),cmd:"redo"}),a.addMenuItem("newdocument",{text:"New document",icon:"newdocument",cmd:"mceNewDocument"}),a.addMenuItem("undo",{text:"Undo",icon:"undo",shortcut:"Meta+Z",onPostRender:j("undo"),cmd:"undo"}),a.addMenuItem("redo",{text:"Redo",icon:"redo",shortcut:"Meta+Y",onPostRender:j("redo"),cmd:"redo"}),a.addMenuItem("visualaid",{text:"Visual aids",selectable:!0,onPostRender:k,cmd:"mceToggleVisualAid"}),a.addButton("remove",{tooltip:"Remove",icon:"remove",cmd:"Delete"}),a.addButton("insert",{type:"menubutton",icon:"insert",menu:[],oncreatemenu:function(){this.menu.add(v(a.settings)),this.menu.renderNew()}}),p({cut:["Cut","Cut","Meta+X"],copy:["Copy","Copy","Meta+C"],paste:["Paste","Paste","Meta+V"],selectall:["Select all","SelectAll","Meta+A"],bold:["Bold","Bold","Meta+B"],italic:["Italic","Italic","Meta+I"],underline:["Underline","Underline","Meta+U"],strikethrough:["Strikethrough","Strikethrough"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],removeformat:["Clear formatting","RemoveFormat"]},function(b,c){a.addMenuItem(c,{text:b[0],icon:c,shortcut:b[2],cmd:b[1]})}),a.on("mousedown",function(){i.hideAll()}),a.addButton("styleselect",{type:"menubutton",text:"Formats",menu:r,onShowMenu:function(){a.settings.style_formats_autohide&&o(this.menu)}}),a.addButton("formatselect",function(){var c=[],d=e(a.settings.block_formats||"Paragraph=p;Heading 1=h1;Heading 2=h2;Heading 3=h3;Heading 4=h4;Heading 5=h5;Heading 6=h6;Preformatted=pre");return p(d,function(b){c.push({text:b[0],value:b[1],textStyle:function(){return a.formatter.getCssText(b[1])}})}),{type:"listbox",text:d[0][0],values:c,fixedWidth:!0,onselect:m,onPostRender:b(c)}}),a.addButton("fontselect",function(){var b="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats",d=[],f=e(a.settings.font_formats||b);return p(f,function(a){d.push({text:{raw:a[0]},value:a[1],textStyle:a[1].indexOf("dings")==-1?"font-family:"+a[1]:""})}),{type:"listbox",text:"Font Family",tooltip:"Font Family",values:d,fixedWidth:!0,onPostRender:c(d),onselect:function(b){b.control.settings.value&&a.execCommand("FontName",!1,b.control.settings.value)}}}),a.addButton("fontsizeselect",function(){var b=[],c="8pt 10pt 12pt 14pt 18pt 24pt 36pt",e=a.settings.fontsize_formats||c;return p(e.split(" "),function(a){var c=a,d=a,e=a.split("=");e.length>1&&(c=e[0],d=e[1]),b.push({text:c,value:d})}),{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:b,fixedWidth:!0,onPostRender:d(b),onclick:function(b){b.control.settings.value&&a.execCommand("FontSize",!1,b.control.settings.value)}}}),a.addMenuItem("formats",{text:"Formats",menu:r})}var p=l.each,q=function(a){return k.reduce(a,function(a,b){return a.concat(b)},[])};return e.on("AddEditor",function(a){var b=a.editor;n(b),o(b),m(b)}),h.translate=function(a){return e.translate(a)},j.tooltips=!f.iOS,{}}),g("3j",["30"],function(a){"use strict";return a.extend({recalc:function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E=[],F=[];b=a.settings,e=a.items().filter(":visible"),f=a.layoutRect(),d=b.columns||Math.ceil(Math.sqrt(e.length)),c=Math.ceil(e.length/d),s=b.spacingH||b.spacing||0,t=b.spacingV||b.spacing||0,u=b.alignH||b.align,v=b.alignV||b.align,q=a.paddingBox,C="reverseRows"in b?b.reverseRows:a.isRtl(),u&&"string"==typeof u&&(u=[u]),v&&"string"==typeof v&&(v=[v]);for(l=0;lE[l]?y:E[l],F[m]=z>F[m]?z:F[m];for(A=f.innerW-q.left-q.right,w=0,l=0;l0?s:0),A-=(l>0?s:0)+E[l];for(B=f.innerH-q.top-q.bottom,x=0,m=0;m0?t:0),B-=(m>0?t:0)+F[m];if(w+=q.left+q.right,x+=q.top+q.bottom,i={},i.minW=w+(f.w-f.innerW),i.minH=x+(f.h-f.innerH),i.contentW=i.minW-f.deltaW,i.contentH=i.minH-f.deltaH,i.minW=Math.min(i.minW,f.maxW),i.minH=Math.min(i.minH,f.maxH),i.minW=Math.max(i.minW,f.startMinWidth),i.minH=Math.max(i.minH,f.startMinHeight),!f.autoResize||i.minW==f.minW&&i.minH==f.minH){f.autoResize&&(i=a.layoutRect(i),i.contentW=i.minW-f.deltaW,i.contentH=i.minH-f.deltaH);var G;G="start"==b.packV?0:B>0?Math.floor(B/c):0;var H=0,I=b.flexWidths;if(I)for(l=0;l'},src:function(a){this.getEl().src=a},html:function(a,c){var d=this,e=this.getEl().contentWindow.document.body;return e?(e.innerHTML=a,c&&c()):b.setTimeout(function(){d.html(a)}),this}})}),g("3l",["2x"],function(a){"use strict";return a.extend({init:function(a){var b=this;b._super(a),b.classes.add("widget").add("infobox"),b.canFocus=!1},severity:function(a){this.classes.remove("error"),this.classes.remove("warning"),this.classes.remove("success"),this.classes.add(a)},help:function(a){this.state.set("help",a)},renderHtml:function(){var a=this,b=a.classPrefix;return'
    '+a.encode(a.state.get("text"))+'
    '},bindStates:function(){var a=this;return a.state.on("change:text",function(b){a.getEl("body").firstChild.data=a.encode(b.value),a.state.get("rendered")&&a.updateLayoutRect()}),a.state.on("change:help",function(b){a.classes.toggle("has-help",b.value),a.state.get("rendered")&&a.updateLayoutRect()}),a._super()}})}),g("3m",["2x","55"],function(a,b){"use strict";return a.extend({init:function(a){var b=this;b._super(a),b.classes.add("widget").add("label"),b.canFocus=!1,a.multiline&&b.classes.add("autoscroll"),a.strong&&b.classes.add("strong")},initLayoutRect:function(){var a=this,c=a._super();if(a.settings.multiline){var d=b.getSize(a.getEl());d.width>c.maxW&&(c.minW=c.maxW,a.classes.add("multiline")),a.getEl().style.width=c.minW+"px",c.startMinH=c.h=c.minH=Math.min(c.maxH,b.getSize(a.getEl()).height)}return c},repaint:function(){var a=this;return a.settings.multiline||(a.getEl().style.lineHeight=a.layoutRect().h+"px"),a._super()},severity:function(a){this.classes.remove("error"),this.classes.remove("warning"),this.classes.remove("success"),this.classes.add(a)},renderHtml:function(){var a,b,c=this,d=c.settings.forId,e=c.settings.html?c.settings.html:c.encode(c.state.get("text"));return!d&&(b=c.settings.forName)&&(a=c.getRoot().find("#"+b)[0],a&&(d=a._id)),d?'":''+e+""},bindStates:function(){var a=this;return a.state.on("change:text",function(b){a.innerHtml(a.encode(b.value)),a.state.get("rendered")&&a.updateLayoutRect()}),a._super()}})}),g("3n",["2p"],function(a){"use strict";return a.extend({Defaults:{role:"toolbar",layout:"flow"},init:function(a){var b=this;b._super(a),b.classes.add("toolbar")},postRender:function(){var a=this;return a.items().each(function(a){a.classes.add("toolbar-item")}),a._super()}})}),g("3o",["3n"],function(a){"use strict";return a.extend({Defaults:{role:"menubar",containerCls:"menubar",ariaRoot:!0,defaults:{type:"menubutton"}}})}),g("3p",["31","2n","3o"],function(a,b,c){"use strict";function d(a,b){for(;a;){if(b===a)return!0;a=a.parentNode}return!1}var e=a.extend({init:function(a){var b=this;b._renderOpen=!0,b._super(a),a=b.settings,b.classes.add("menubtn"),a.fixedWidth&&b.classes.add("fixed-width"),b.aria("haspopup",!0),b.state.set("menu",a.menu||b.render())},showMenu:function(a){var c,d=this;return d.menu&&d.menu.visible()&&a!==!1?d.hideMenu():(d.menu||(c=d.state.get("menu")||[],c.length?c={type:"menu",items:c}:c.type=c.type||"menu",c.renderTo?d.menu=c.parent(d).show().renderTo():d.menu=b.create(c).parent(d).renderTo(),d.fire("createmenu"),d.menu.reflow(),d.menu.on("cancel",function(a){a.control.parent()===d.menu&&(a.stopPropagation(),d.focus(),d.hideMenu())}),d.menu.on("select",function(){d.focus()}),d.menu.on("show hide",function(a){a.control==d.menu&&d.activeMenu("show"==a.type),d.aria("expanded","show"==a.type)}).fire("show")),d.menu.show(),d.menu.layoutRect({w:d.layoutRect().w}),d.menu.moveRel(d.getEl(),d.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"]),void d.fire("showmenu"))},hideMenu:function(){var a=this;a.menu&&(a.menu.items().each(function(a){a.hideMenu&&a.hideMenu()}),a.menu.hide())},activeMenu:function(a){this.classes.toggle("active",a)},renderHtml:function(){var a,b=this,d=b._id,e=b.classPrefix,f=b.settings.icon,g=b.state.get("text"),h="";return a=b.settings.image,a?(f="none","string"!=typeof a&&(a=window.getSelection?a[0]:a[1]),a=" style=\"background-image: url('"+a+"')\""):a="",g&&(b.classes.add("btn-has-text"),h=''+b.encode(g)+""),f=b.settings.icon?e+"ico "+e+"i-"+f:"",b.aria("role",b.parent()instanceof c?"menuitem":"button"),'
    '},postRender:function(){var a=this;return a.on("click",function(b){b.control===a&&d(b.target,a.getEl())&&(a.focus(),a.showMenu(!b.aria),b.aria&&a.menu.items().filter(":visible")[0].focus())}),a.on("mouseenter",function(b){var c,d=b.control,f=a.parent();d&&f&&d instanceof e&&d.parent()==f&&(f.items().filter("MenuButton").each(function(a){a.hideMenu&&a!=d&&(a.menu&&a.menu.visible()&&(c=!0),a.hideMenu())}),c&&(d.focus(),d.showMenu()))}),a._super()},bindStates:function(){var a=this;return a.state.on("change:menu",function(){a.menu&&a.menu.remove(),a.menu=null}),a._super()},remove:function(){this._super(),this.menu&&this.menu.remove()}});return e}),g("3q",["2x","2n","9","8"],function(a,b,c,d){"use strict";return a.extend({Defaults:{border:0,role:"menuitem"},init:function(a){var b,c=this;c._super(a),a=c.settings,c.classes.add("menu-item"),a.menu&&c.classes.add("menu-item-expand"),a.preview&&c.classes.add("menu-item-preview"),b=c.state.get("text"),"-"!==b&&"|"!==b||(c.classes.add("menu-item-sep"),c.aria("role","separator"),c.state.set("text","-")),a.selectable&&(c.aria("role","menuitemcheckbox"),c.classes.add("menu-item-checkbox"),a.icon="selected"),a.preview||a.selectable||c.classes.add("menu-item-normal"),c.on("mousedown",function(a){a.preventDefault()}),a.menu&&!a.ariaHideMenu&&c.aria("haspopup",!0)},hasMenus:function(){return!!this.settings.menu},showMenu:function(){var a,c=this,d=c.settings,e=c.parent();if(e.items().each(function(a){a!==c&&a.hideMenu()}), -d.menu){a=c.menu,a?a.show():(a=d.menu,a.length?a={type:"menu",items:a}:a.type=a.type||"menu",e.settings.itemDefaults&&(a.itemDefaults=e.settings.itemDefaults),a=c.menu=b.create(a).parent(c).renderTo(),a.reflow(),a.on("cancel",function(b){b.stopPropagation(),c.focus(),a.hide()}),a.on("show hide",function(a){a.control.items&&a.control.items().each(function(a){a.active(a.settings.selected)})}).fire("show"),a.on("hide",function(b){b.control===a&&c.classes.remove("selected")}),a.submenu=!0),a._parentMenu=e,a.classes.add("menu-sub");var f=a.testMoveRel(c.getEl(),c.isRtl()?["tl-tr","bl-br","tr-tl","br-bl"]:["tr-tl","br-bl","tl-tr","bl-br"]);a.moveRel(c.getEl(),f),a.rel=f,f="menu-sub-"+f,a.classes.remove(a._lastRel).add(f),a._lastRel=f,c.classes.add("selected"),c.aria("expanded",!0)}},hideMenu:function(){var a=this;return a.menu&&(a.menu.items().each(function(a){a.hideMenu&&a.hideMenu()}),a.menu.hide(),a.aria("expanded",!1)),a},renderHtml:function(){function a(a){var b,d,e={};for(e=c.mac?{alt:"⌥",ctrl:"⌘",shift:"⇧",meta:"⌘"}:{meta:"Ctrl"},a=a.split("+"),b=0;b").replace(new RegExp(b("]mce~match!"),"g"),"
    ")}var f=this,g=f._id,h=f.settings,i=f.classPrefix,j=f.state.get("text"),k=f.settings.icon,l="",m=h.shortcut,n=f.encode(h.url),o="";return k&&f.parent().classes.add("menu-has-icons"),h.image&&(l=" style=\"background-image: url('"+h.image+"')\""),m&&(m=a(m)),k=i+"ico "+i+"i-"+(f.settings.icon||"none"),o="-"!==j?'\xa0":"",j=e(f.encode(d(j))),n=e(f.encode(d(n))),'
    '+o+("-"!==j?''+j+"":"")+(m?'
    '+m+"
    ":"")+(h.menu?'
    ':"")+(n?'":"")+"
    "},postRender:function(){var a=this,b=a.settings,c=b.textStyle;if("function"==typeof c&&(c=c.call(this)),c){var e=a.getEl("text");e&&e.setAttribute("style",c)}return a.on("mouseenter click",function(c){c.control===a&&(b.menu||"click"!==c.type?(a.showMenu(),c.aria&&a.menu.focus(!0)):(a.fire("select"),d.requestAnimationFrame(function(){a.parent().hideAll()})))}),a._super(),a},hover:function(){var a=this;return a.parent().items().each(function(a){a.classes.remove("selected")}),a.classes.toggle("selected",!0),a},active:function(a){return"undefined"!=typeof a&&this.aria("checked",a),this._super(a)},remove:function(){this._super(),this.menu&&this.menu.remove()}})}),g("3r",["d","2m","8"],function(a,b,c){"use strict";return function(d,e){var f,g,h=this,i=b.classPrefix;h.show=function(b,j){function k(){f&&(a(d).append('
    '),j&&j())}return h.hide(),f=!0,b?g=c.setTimeout(k,b):k(),h},h.hide=function(){var a=d.lastChild;return c.clearTimeout(g),a&&a.className.indexOf("throbber")!=-1&&a.parentNode.removeChild(a),f=!1,h}}}),g("3s",["2v","3q","3r","c"],function(a,b,c,d){"use strict";return a.extend({Defaults:{defaultType:"menuitem",border:1,layout:"stack",role:"application",bodyRole:"menu",ariaRoot:!0},init:function(a){var b=this;if(a.autohide=!0,a.constrainToViewport=!0,"function"==typeof a.items&&(a.itemsFactory=a.items,a.items=[]),a.itemDefaults)for(var c=a.items,e=c.length;e--;)c[e]=d.extend({},a.itemDefaults,c[e]);b._super(a),b.classes.add("menu")},repaint:function(){return this.classes.toggle("menu-align",!0),this._super(),this.getEl().style.height="",this.getEl("body").style.height="",this},cancel:function(){var a=this;a.hideAll(),a.fire("select")},load:function(){function a(){e.throbber&&(e.throbber.hide(),e.throbber=null)}var b,d,e=this;d=e.settings.itemsFactory,d&&(e.throbber||(e.throbber=new c(e.getEl("body"),!0),0===e.items().length?(e.throbber.show(),e.fire("loading")):e.throbber.show(100,function(){e.items().remove(),e.fire("loading")}),e.on("hide close",a)),e.requestTime=b=(new Date).getTime(),e.settings.itemsFactory(function(c){return 0===c.length?void e.hide():void(e.requestTime===b&&(e.getEl().style.width="",e.getEl("body").style.width="",a(),e.items().remove(),e.getEl("body").innerHTML="",e.add(c),e.renderNew(),e.fire("loaded")))}))},hideAll:function(){var a=this;return this.find("menuitem").exec("hideMenu"),a._super()},preRender:function(){var a=this;return a.items().each(function(b){var c=b.settings;if(c.icon||c.image||c.selectable)return a._hasIcons=!0,!1}),a.settings.itemsFactory&&a.on("postrender",function(){a.settings.itemsFactory&&a.load()}),a._super()}})}),g("3t",["3p","3s"],function(a,b){"use strict";return a.extend({init:function(a){function b(c){for(var f=0;f0&&(e=c[0].text,g.state.set("value",c[0].value)),g.state.set("menu",c)),g.state.set("text",a.text||e),g.classes.add("listbox"),g.on("select",function(b){var c=b.control;f&&(b.lastControl=f),a.multiple?c.active(!c.active()):g.value(b.control.value()),f=c})},bindStates:function(){function a(a,c){a instanceof b&&a.items().each(function(a){a.hasMenus()||a.active(a.value()===c)})}function c(a,b){var d;if(a)for(var e=0;e'},postRender:function(){var a=this;a._super(),a.resizeDragHelper=new b(this._id,{start:function(){a.fire("ResizeStart")},drag:function(b){"both"!=a.settings.direction&&(b.deltaX=0),a.fire("Resize",b)},stop:function(){a.fire("ResizeEnd")}})},remove:function(){return this.resizeDragHelper&&this.resizeDragHelper.destroy(),this._super()}})}),g("3w",["2x"],function(a){"use strict";function b(a){var b="";if(a)for(var c=0;c'+a[c]+"";return b}return a.extend({Defaults:{classes:"selectbox",role:"selectbox",options:[]},init:function(a){var b=this;b._super(a),b.settings.size&&(b.size=b.settings.size),b.settings.options&&(b._options=b.settings.options),b.on("keydown",function(a){var c;13==a.keyCode&&(a.preventDefault(),b.parents().reverse().each(function(a){if(a.toJSON)return c=a,!1}),b.fire("submit",{data:c.toJSON()}))})},options:function(a){return arguments.length?(this.state.set("options",a),this):this.state.get("options")},renderHtml:function(){var a,c=this,d="";return a=b(c._options),c.size&&(d=' size = "'+c.size+'"'),'"},bindStates:function(){var a=this;return a.state.on("change:options",function(c){a.getEl().innerHTML=b(c.value)}),a._super()}})}),g("3x",["2x","2q","55"],function(a,b,c){"use strict";function d(a,b,c){return ac&&(a=c),a}function e(a,b,c){a.setAttribute("aria-"+b,c)}function f(a,b){var d,f,g,h,i,j;"v"==a.settings.orientation?(h="top",g="height",f="h"):(h="left",g="width",f="w"),j=a.getEl("handle"),d=(a.layoutRect()[f]||100)-c.getSize(j)[g],i=d*((b-a._minValue)/(a._maxValue-a._minValue))+"px",j.style[h]=i,j.style.height=a.layoutRect().h+"px",e(j,"valuenow",b),e(j,"valuetext",""+a.settings.previewFilter(b)),e(j,"valuemin",a._minValue),e(j,"valuemax",a._maxValue)}return a.extend({init:function(a){var b=this;a.previewFilter||(a.previewFilter=function(a){return Math.round(100*a)/100}),b._super(a),b.classes.add("slider"),"v"==a.orientation&&b.classes.add("vertical"),b._minValue=a.minValue||0,b._maxValue=a.maxValue||100,b._initValue=b.state.get("value")},renderHtml:function(){var a=this,b=a._id,c=a.classPrefix;return'
    '},reset:function(){this.value(this._initValue).repaint()},postRender:function(){function a(a,b,c){return(c+a)/(b-a)}function e(a,b,c){return c*(b-a)-a}function f(b,c){function f(f){var g;g=n.value(),g=e(b,c,a(b,c,g)+.05*f),g=d(g,b,c),n.value(g),n.fire("dragstart",{value:g}),n.fire("drag",{value:g}),n.fire("dragend",{value:g})}n.on("keydown",function(a){switch(a.keyCode){case 37:case 38:f(-1);break;case 39:case 40:f(1)}})}function g(a,e,f){var g,h,i,o,p;n._dragHelper=new b(n._id,{handle:n._id+"-handle",start:function(a){g=a[j],h=parseInt(n.getEl("handle").style[k],10),i=(n.layoutRect()[m]||100)-c.getSize(f)[l],n.fire("dragstart",{value:p})},drag:function(b){var c=b[j]-g;o=d(h+c,0,i),f.style[k]=o+"px",p=a+o/i*(e-a),n.value(p),n.tooltip().text(""+n.settings.previewFilter(p)).show().moveRel(f,"bc tc"),n.fire("drag",{value:p})},stop:function(){n.tooltip().hide(),n.fire("dragend",{value:p})}})}var h,i,j,k,l,m,n=this;h=n._minValue,i=n._maxValue,"v"==n.settings.orientation?(j="screenY",k="top",l="height",m="h"):(j="screenX",k="left",l="width",m="w"),n._super(),f(h,i,n.getEl("handle")),g(h,i,n.getEl("handle"))},repaint:function(){this._super(),f(this,this.value())},bindStates:function(){var a=this;return a.state.on("change:value",function(b){f(a,b.value)}),a._super()}})}),g("3y",["2x"],function(a){"use strict";return a.extend({renderHtml:function(){var a=this;return a.classes.add("spacer"),a.canFocus=!1,'
    '}})}),g("3z",["3p","55","d"],function(a,b,c){return a.extend({Defaults:{classes:"widget btn splitbtn",role:"button"},repaint:function(){var a,d,e=this,f=e.getEl(),g=e.layoutRect();return e._super(),a=f.firstChild,d=f.lastChild,c(a).css({width:g.w-b.getSize(d).width,height:g.h-2}),c(d).css({height:g.h-2}),e},activeMenu:function(a){var b=this;c(b.getEl().lastChild).toggleClass(b.classPrefix+"active",a)},renderHtml:function(){var a,b=this,c=b._id,d=b.classPrefix,e=b.state.get("icon"),f=b.state.get("text"),g="";return a=b.settings.image,a?(e="none","string"!=typeof a&&(a=window.getSelection?a[0]:a[1]),a=" style=\"background-image: url('"+a+"')\""):a="",e=b.settings.icon?d+"ico "+d+"i-"+e:"",f&&(b.classes.add("btn-has-text"),g=''+b.encode(f)+""),'
    '},postRender:function(){var a=this,b=a.settings.onclick;return a.on("click",function(a){var c=a.target;if(a.control==this)for(;c;){if(a.aria&&"down"!=a.aria.key||"BUTTON"==c.nodeName&&c.className.indexOf("open")==-1)return a.stopImmediatePropagation(),void(b&&b.call(this,a));c=c.parentNode}}),delete a.settings.onclick,a._super()}})}),g("40",["3h"],function(a){"use strict";return a.extend({Defaults:{containerClass:"stack-layout",controlClass:"stack-layout-item",endClass:"break"},isNative:function(){return!0}})}),g("41",["2s","d","55"],function(a,b,c){"use strict";return a.extend({Defaults:{layout:"absolute",defaults:{type:"panel"}},activateTab:function(a){var c;this.activeTabId&&(c=this.getEl(this.activeTabId),b(c).removeClass(this.classPrefix+"active"),c.setAttribute("aria-selected","false")),this.activeTabId="t"+a,c=this.getEl("t"+a),c.setAttribute("aria-selected","true"),b(c).addClass(this.classPrefix+"active"),this.items()[a].show().fire("showtab"),this.reflow(),this.items().each(function(b,c){a!=c&&b.hide()})},renderHtml:function(){var a=this,b=a._layout,c="",d=a.classPrefix;return a.preRender(),b.preRender(a),a.items().each(function(b,e){var f=a._id+"-t"+e;b.aria("role","tabpanel"),b.aria("labelledby",f),c+='"}),'
    '+c+'
    '+b.renderHtml(a)+"
    "},postRender:function(){var a=this;a._super(),a.settings.activeTab=a.settings.activeTab||0,a.activateTab(a.settings.activeTab),this.on("click",function(b){var c=b.target.parentNode;if(c&&c.id==a._id+"-head")for(var d=c.childNodes.length;d--;)c.childNodes[d]==b.target&&a.activateTab(d)})},initLayoutRect:function(){var a,b,d,e=this;b=c.getSize(e.getEl("head")).width,b=b<0?0:b,d=0,e.items().each(function(a){b=Math.max(b,a.layoutRect().minW),d=Math.max(d,a.layoutRect().minH)}),e.items().each(function(a){a.settings.x=0,a.settings.y=0,a.settings.w=b,a.settings.h=d,a.layoutRect({x:0,y:0,w:b,h:d})});var f=c.getSize(e.getEl("head")).height;return e.settings.minWidth=b,e.settings.minHeight=d+f,a=e._super(),a.deltaH+=f,a.innerH=a.h-a.deltaH,a}})}),g("42",["2x","c","55"],function(a,b,c){return a.extend({init:function(a){var b=this;b._super(a),b.classes.add("textbox"),a.multiline?b.classes.add("multiline"):(b.on("keydown",function(a){var c;13==a.keyCode&&(a.preventDefault(),b.parents().reverse().each(function(a){if(a.toJSON)return c=a,!1}),b.fire("submit",{data:c.toJSON()}))}),b.on("keyup",function(a){b.state.set("value",a.target.value)}))},repaint:function(){var a,b,c,d,e,f=this,g=0;a=f.getEl().style,b=f._layoutRect,e=f._lastRepaintRect||{};var h=document;return!f.settings.multiline&&h.all&&(!h.documentMode||h.documentMode<=8)&&(a.lineHeight=b.h-g+"px"),c=f.borderBox,d=c.left+c.right+8,g=c.top+c.bottom+(f.settings.multiline?8:0),b.x!==e.x&&(a.left=b.x+"px",e.x=b.x),b.y!==e.y&&(a.top=b.y+"px",e.y=b.y),b.w!==e.w&&(a.width=b.w-d+"px",e.w=b.w),b.h!==e.h&&(a.height=b.h-g+"px",e.h=b.h),f._lastRepaintRect=e,f.fire("repaint",{},!1),f},renderHtml:function(){var a,d,e=this,f=e.settings;return a={id:e._id,hidefocus:"1"},b.each(["rows","spellcheck","maxLength","size","readonly","min","max","step","list","pattern","placeholder","required","multiple"],function(b){a[b]=f[b]}),e.disabled()&&(a.disabled="disabled"),f.subtype&&(a.type=f.subtype),d=c.create(f.multiline?"textarea":"input",a),d.value=e.state.get("value"),d.className=e.classes,d.outerHTML},value:function(a){return arguments.length?(this.state.set("value",a),this):(this.state.get("rendered")&&this.state.set("value",this.getEl().value),this.state.get("value"))},postRender:function(){var a=this;a.getEl().value=a.state.get("value"),a._super(),a.$el.on("change",function(b){a.state.set("value",b.target.value),a.fire("change",b)})},bindStates:function(){var a=this;return a.state.on("change:value",function(b){a.getEl().value!=b.value&&(a.getEl().value=b.value)}),a.state.on("change:disabled",function(b){a.getEl().disabled=b.value}),a._super()},remove:function(){this.$el.off(),this._super()}})}),h("5g",RegExp),g("43",["2x","c","55","5g"],function(a,b,c,d){return a.extend({init:function(a){var c=this;a=b.extend({height:100,text:"Drop an image here",multiple:!1,accept:null},a),c._super(a),c.classes.add("dropzone"),a.multiple&&c.classes.add("multiple")},renderHtml:function(){var a,b,d=this,e=d.settings;return a={id:d._id,hidefocus:"1"},b=c.create("div",a,""+e.text+""),e.height&&c.css(b,"height",e.height+"px"),e.width&&c.css(b,"width",e.width+"px"),b.className=d.classes,b.outerHTML},postRender:function(){var a=this,c=function(b){b.preventDefault(),a.classes.toggle("dragenter"),a.getEl().className=a.classes},e=function(c){var e=a.settings.accept;if("string"!=typeof e)return c;var f=new d("("+e.split(/\s*,\s*/).join("|")+")$","i");return b.grep(c,function(a){return f.test(a.name)})};a._super(),a.$el.on("dragover",function(a){a.preventDefault()}),a.$el.on("dragenter",c),a.$el.on("dragleave",c),a.$el.on("drop",function(b){if(b.preventDefault(),!a.state.get("disabled")){var c=e(b.dataTransfer.files);a.value=function(){return c.length?a.settings.multiple?c:c[0]:null},c.length&&a.fire("change",b)}})},remove:function(){this.$el.off(),this._super()}})}),g("44",["31","c","55","d","5g"],function(a,b,c,d,e){return a.extend({init:function(a){var c=this;a=b.extend({text:"Browse...",multiple:!1,accept:null},a),c._super(a),c.classes.add("browsebutton"),a.multiple&&c.classes.add("multiple")},postRender:function(){var a=this,b=c.create("input",{type:"file",id:a._id+"-browse",accept:a.settings.accept});a._super(),d(b).on("change",function(b){var c=b.target.files;a.value=function(){return c.length?a.settings.multiple?c:c[0]:null},b.preventDefault(),c.length&&a.fire("change",b)}),d(b).on("click",function(a){a.stopPropagation()}),d(a.getEl("button")).on("click",function(a){a.stopPropagation(),b.click()}),a.getEl().appendChild(b)},remove:function(){d(this.getEl("button")).off(),d(this.getEl("input")).off(),this._super()}})}),g("1g",["2j","2k","2l","2m","2n","2o","2p","2q","2r","2s","2t","2u","2v","29","2a","2w","2x","2y","2b","2z","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","3g","3h","3i","3j","3k","3l","3m","3n","3o","3p","3q","3r","3s","3t","3u","3v","3w","3x","3y","3z","40","41","42","43","44"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,_,aa,ba,ca,da,ea,fa,ga){"use strict";var ha=function(a,b){e.add(a.split(".").pop(),b)},ia=function(a,b,c){var d,e;for(e=b.split(/[.\/]/),d=0;d - - - - - - - {% block custom_title %}{% block title %}Welcome{% endblock title %} - cs4teachers{% endblock custom_title %} - - - - - - - - - - - - - - - - {% block body_container %} -
    -

    {% block page_heading %}{% endblock page_heading %}

    -
    - {% block content_container %} -
    - {% block content %} - {% endblock content %} -
    - {% endblock content_container %} -
    -
    - {% endblock body_container %} - - - - - - - - {% block scripts %} - {% endblock scripts %} - - diff --git a/cs4teachers/templates/events/event.html b/cs4teachers/templates/events/event.html deleted file mode 100644 index 7c23a8803..000000000 --- a/cs4teachers/templates/events/event.html +++ /dev/null @@ -1,127 +0,0 @@ -{% extends "base.html" %} - -{% load static %} - -{% block title %} - {% if event.series.logo %} - {{ event.series.name }}: - {% endif %} - {{ event.name }} -{% endblock title %} - -{% block page_heading %} - {% if event.series %} - {% if event.series.logo %} - {{ event.series.name }} - {% else %} - {{ event.series.name }}: - {% endif %} - {% endif %} - {{ event.name }} -{% endblock page_heading %} - -{% block content_container %} -
    -

    Starts: {{ event.start_date|date:"l j F, Y" }}

    -

    Ends: {{ event.end_date|date:"l j F, Y" }}

    - {% if event.location %} -

    Location: {{ event.location.name }}

    - {% endif %} -
    - -
    - {% if event.series %} -
    -
    - This event is part of the {{ event.series.name }} series, click here for more information. -
    -
    - {% endif %} - - {% if event.description %} -

    Description

    - {{ event.description|safe }} - {% endif %} - - {% if sponsors %} -

    Sponsor{{ sponsors.count|pluralize }}

    - - {% endif %} -
    - -
    - {% with ratio='1by1' %} - {% include "generic/map-element.html" %} - {% endwith %} -
    - -
    - {% if sessions %} -

    Schedule

    - - {% for session in sessions %} - {% ifchanged session.start_datetime|date:"d" %} -

    {{ session.start_datetime|date:"l j F, Y" }}

    - {% endifchanged %} - -
    - {% ifchanged session.start_datetime|time session.end_datetime|time %} -
    -
    -

    - {{ session.start_datetime|time }} -
    - until {{ session.end_datetime|time }} -

    -
    - {% else %} -
    -
    - {% endifchanged %} - -
    -

    - - {{ session.name|safe }} - -

    - {{ session.description|safe }} - - {% if session.resources.count > 0 %} -

    Includes {{ session.resources.count }} resource{{ session.resources.count|pluralize }}

    - {% endif %} -
    - -
    - {% if session.locations.all %} -
    Location{{ session.locations.count|pluralize }}
    - - {% endif %} -
    -
    - {% endfor %} - {% endif %} -
    -{% endblock content_container %} - -{% block scripts %} - {% with location=event.location map_zoom=5 map_lat=-41.3 map_lng=173.3 %} - {% include "generic/map-script.html" %} - {% endwith %} -{% endblock scripts %} diff --git a/cs4teachers/templates/events/events-table.html b/cs4teachers/templates/events/events-table.html deleted file mode 100644 index fc47be1ff..000000000 --- a/cs4teachers/templates/events/events-table.html +++ /dev/null @@ -1,46 +0,0 @@ -{% load static %} - -
    "+d+"
    - - - - - - - - - {% for event in events %} - - - - - - {% endfor %} - -
    DateEventLocation
    - {% if event.start_date|date:"j" != event.end_date|date:"j" %} - {% if event.start_date|date:"F" == event.end_date|date:"F" %} - {{ event.start_date|date:"j" }} - {% else %} - {{ event.start_date|date:"j F" }} - {% endif %} - to - {% endif %} - {{ event.end_date|date:" j F, Y" }} - - - {% if event.series %} - {% if event.series.logo %} - {{ event.series.name }} - {% else %} - {{ event.series.name }}: - {% endif %} - {% endif %} - {{ event.name }} - - {% if event.third_party %} - {% include "events/third-party-badge.html" %} - {% endif %} - - {{ event.location.name }} -
    diff --git a/cs4teachers/templates/events/index.html b/cs4teachers/templates/events/index.html deleted file mode 100644 index 12e7e0f60..000000000 --- a/cs4teachers/templates/events/index.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends "base.html" %} - -{% block title %}Events{% endblock title %} -{% block page_heading %}Events{% endblock page_heading %} - -{% block content %} - {% include 'events/events-table.html' %} -{% endblock content %} diff --git a/cs4teachers/templates/events/location.html b/cs4teachers/templates/events/location.html deleted file mode 100644 index c81803c58..000000000 --- a/cs4teachers/templates/events/location.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ location.name }}{% endblock title %} - -{% block page_heading %}{{ location.name }}{% endblock page_heading %} - -{% block content %} -
    {{ location.address|linebreaks }}
    - - {% if location.description %} -

    Description

    - {{ location.description|safe }} - {% endif %} - - {% include "generic/map-element.html" %} - -{% endblock content %} - -{% block scripts %} - {% include "generic/map-script.html" %} -{% endblock scripts %} diff --git a/cs4teachers/templates/events/resources.html b/cs4teachers/templates/events/resources.html deleted file mode 100644 index 3adf9e174..000000000 --- a/cs4teachers/templates/events/resources.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "base.html" %} - -{% block title %}Resources{% endblock title %} -{% block page_heading %}Resources{% endblock page_heading %} - -{% block content %} -
      - {% for resource in resources %} -
    • -
      - {{ resource.name }} -
      - {% if resource.description %} -

      {{ resource.description }}

      - {% endif %} -
    • - {% endfor %} -
    -{% endblock content %} diff --git a/cs4teachers/templates/events/series.html b/cs4teachers/templates/events/series.html deleted file mode 100644 index f2f326409..000000000 --- a/cs4teachers/templates/events/series.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends "base.html" %} - -{% load static %} - -{% block title %}{{ series.name }}{% endblock title %} - -{% block page_heading %} - {% if series.logo %} - {{ series.name }} - {% else %} - {{ series.name }} - {% endif %} - {{ series.subtitle }} -{% endblock page_heading %} - -{% block content %} - {{ series.description|safe|linebreaks }} - - {% include 'events/events-table.html' %} -{% endblock content %} diff --git a/cs4teachers/templates/events/series_list.html b/cs4teachers/templates/events/series_list.html deleted file mode 100644 index c5fefbf7f..000000000 --- a/cs4teachers/templates/events/series_list.html +++ /dev/null @@ -1,40 +0,0 @@ -{% extends "base.html" %} - -{% load static %} - -{% block title %}Series{% endblock title %} - -{% block page_heading %}Series{% endblock page_heading %} - -{% block content %} -
    - {% for series in series_list %} -
    -
    -
    - {% if series.logo %} - {{ series.name }} - {% else %} - {{ series.name }} - {% endif %} -
    -
    -

    {{ series.subtitle }}

    - View events in this series -
    - -
    -
    - {% endfor %} -
    -{% endblock content %} diff --git a/cs4teachers/templates/events/session.html b/cs4teachers/templates/events/session.html deleted file mode 100644 index cb5759c50..000000000 --- a/cs4teachers/templates/events/session.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ session.name }}{% endblock title %} - -{% block page_heading %} - {{ session.name }} {{ event.name }} -{% endblock page_heading %} - -{% block content_container %} -
    -

    {{ session.start_datetime }} to {{ session.end_datetime }}

    -
    - -
    - {% if locations %} -

    Location{{ locations.count|pluralize }}

    - - {% endif %} - - {% if session.description %} -

    Description

    - {{ session.description|safe }} - {% endif %} - - {% if resources %} -

    Resource{{ resources.count|pluralize }}

    - - {% endif %} -
    - -
    - {% if session.image %} - - {% endif %} -
    -{% endblock content_container %} diff --git a/cs4teachers/templates/events/third-party-badge.html b/cs4teachers/templates/events/third-party-badge.html deleted file mode 100644 index ad2052871..000000000 --- a/cs4teachers/templates/events/third-party-badge.html +++ /dev/null @@ -1 +0,0 @@ -Third party event diff --git a/cs4teachers/templates/events/third-party-event.html b/cs4teachers/templates/events/third-party-event.html deleted file mode 100644 index 671c1480e..000000000 --- a/cs4teachers/templates/events/third-party-event.html +++ /dev/null @@ -1,42 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ event.name }}{% endblock title %} - -{% block page_heading %}{{ event.name }}{% endblock page_heading %} - -{% block content_container %} -
    - -
    - -
    -

    Starts: {{ event.start_date|date:"l j F, Y" }}

    -

    Ends: {{ event.end_date|date:"l j F, Y" }}

    -

    Location: {{ event.location.name }}

    -
    - - -
    - {% if event.description %} -

    Description

    - {{ event.description|safe }} - {% endif %} -
    - -
    - {% if locations %} -

    Location{{ locations.count|pluralize }}

    -
      - {% for location in locations %} -
    • {{ location.name }}
    • - {% endfor %} -
    - {% endif %} -
    -{% endblock content_container %} diff --git a/cs4teachers/templates/flatpages/default.html b/cs4teachers/templates/flatpages/default.html deleted file mode 100644 index 0438f0efb..000000000 --- a/cs4teachers/templates/flatpages/default.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends "base.html" %} - -{% load static %} - -{% block title %}{{ flatpage.title }}{% endblock title %} - -{% block page_heading %}{{ flatpage.title }}{% endblock page_heading %} - -{% block content %} - {{ flatpage.content }} -{% endblock content %} diff --git a/cs4teachers/templates/general/index.html b/cs4teachers/templates/general/index.html deleted file mode 100644 index dd16f0b02..000000000 --- a/cs4teachers/templates/general/index.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "base.html" %} - -{% load static %} - -{% block body_container %} -
    -
    - -

    Computer Science for teachers

    -
    -
    - -
    -
    -
    -

    - Professional development events either held by or attended by the University of Canterbury Computer Science Education Research Group (creators of CS Unplugged and the CS Field Guide). -

    -

    - We also list related third party events that also offer professional development opportunities. -

    - - - - {% if events %} -

    Upcoming events

    - {% include 'events/events-table.html' %} - {% endif %} - -

    - View all events -

    -
    -
    -
    -{% endblock body_container %} diff --git a/cs4teachers/templates/generic/map-element.html b/cs4teachers/templates/generic/map-element.html deleted file mode 100644 index f124738e1..000000000 --- a/cs4teachers/templates/generic/map-element.html +++ /dev/null @@ -1 +0,0 @@ -
    diff --git a/cs4teachers/templates/generic/map-script.html b/cs4teachers/templates/generic/map-script.html deleted file mode 100644 index c117f2c8c..000000000 --- a/cs4teachers/templates/generic/map-script.html +++ /dev/null @@ -1,22 +0,0 @@ - - diff --git a/cs4teachers/tests/BaseTest.py b/cs4teachers/tests/BaseTest.py deleted file mode 100644 index 648a34b31..000000000 --- a/cs4teachers/tests/BaseTest.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Base test class with methods implemented for Django testing.""" - -from django.test import TestCase -from tests.events.EventDataGenerator import EventDataGenerator - - -class BaseTest(TestCase): - """Base test class for Django testing.""" - - def __init__(self, *args, **kwargs): - """Create a BaseTest object.""" - super().__init__(*args, **kwargs) - self.event_data = EventDataGenerator() diff --git a/cs4teachers/tests/__init__.py b/cs4teachers/tests/__init__.py deleted file mode 100644 index 63495f9fd..000000000 --- a/cs4teachers/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Module for test cases for Django system.""" diff --git a/cs4teachers/tests/events/EventDataGenerator.py b/cs4teachers/tests/events/EventDataGenerator.py deleted file mode 100644 index b7604cfa9..000000000 --- a/cs4teachers/tests/events/EventDataGenerator.py +++ /dev/null @@ -1,148 +0,0 @@ -"""Create test data of event models.""" - -from datetime import date -from unittest.mock import MagicMock -from django.core.files import File -from events.models import ( - Series, - Event, - Location, - Sponsor, - Resource, - ThirdPartyEvent, -) - - -class EventDataGenerator: - """Class for generating test data for events.""" - - def create_series(self, number): - """Create series object. - - Args: - number: Identifier of the series (int). - - Returns: - Series object. - """ - logo = MagicMock(spec=File, name="ImageMock") - logo.name = "Logo for Series {}".format(number) - series = Series( - name="Series {}".format(number), - description="Description for Series {}".format(number), - logo=logo, - ) - series.save() - return series - - def create_event(self, number, series=None, location=None, start_date=None, end_date=None, is_published=True): - """Create event object. - - Args: - number: Identifier of the event (int). - location: Location of the event (Location). - start_date: Date of the event start (Date). - end_date: Date of the event end (Date). - is_published: Boolean if event is public (bool). - - Returns: - Event object. - """ - if start_date is None: - start_date = date.today() - if end_date is None: - end_date = date.today() - event = Event( - name="Event {}".format(number), - series=series, - description="Description for Event {}".format(number), - start_date=start_date, - end_date=end_date, - location=location, - is_published=is_published, - ) - event.save() - return event - - def create_location(self, number): - """Create location object. - - Args: - number: Identifier of the location (int). - - Returns: - Location object. - """ - location = Location( - name="Location {}".format(number), - address="Erskine Building, Science Rd, Ilam, Christchurch", - geolocation="-43.5225594,172.5811949", - description="Description for Location {}".format(number), - ) - location.save() - return location - - def create_resource(self, number): - """Create resource object. - - Args: - number: Identifier of the resource (int). - - Returns: - Resource object. - """ - resource = Resource( - name="Resource {}".format(number), - url="https://www.{}.com/".format(number), - description="Description for Resource {}".format(number), - ) - resource.save() - return resource - - def create_sponsor(self, number): - """Create sponsor object. - - Args: - number: Identifier of the sponsor (int). - - Returns: - Sponsor object. - """ - logo = MagicMock(spec=File, name="ImageMock") - logo.name = "Logo for Sponsor {}".format(number) - sponsor = Sponsor( - name="Sponsor {}".format(number), - url="https://www.{}.com/".format(number), - logo=logo, - ) - sponsor.save() - return sponsor - - def create_third_party_event(self, number, location=None, start_date=None, end_date=None, is_published=True): - """Create third party event object. - - Args: - number: Identifier of the event (int). - location: Location of the event (Location). - start_date: Date of the event start (Date). - end_date: Date of the event end (Date). - is_published: Boolean if event is public (bool). - - Returns: - ThirdPartyEvent object. - """ - if start_date is None: - start_date = date.today() - if end_date is None: - end_date = date.today() - third_party_event = ThirdPartyEvent( - name="Third Party Event {}".format(number), - description="Description for Third Party Event {}".format(number), - start_date=start_date, - end_date=end_date, - location=location, - url="https://www.{}.com/".format(number), - is_published=is_published, - ) - third_party_event.save() - return third_party_event diff --git a/cs4teachers/tests/events/__init__.py b/cs4teachers/tests/events/__init__.py deleted file mode 100644 index ae7c2c7bb..000000000 --- a/cs4teachers/tests/events/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Module for tests of the events application.""" diff --git a/cs4teachers/tests/events/models/__init__.py b/cs4teachers/tests/events/models/__init__.py deleted file mode 100644 index 6de612037..000000000 --- a/cs4teachers/tests/events/models/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Module for tests of the models of the events application.""" diff --git a/cs4teachers/tests/events/models/test_event.py b/cs4teachers/tests/events/models/test_event.py deleted file mode 100644 index 498397c5b..000000000 --- a/cs4teachers/tests/events/models/test_event.py +++ /dev/null @@ -1,50 +0,0 @@ -from tests.BaseTest import BaseTest -from events.models import Event - - -class EventModelTest(BaseTest): - - def setUp(self, *args, **kwargs): - self.location = self.event_data.create_location(1) - - def test_event(self): - event = self.event_data.create_event(1, location=self.location) - query_result = Event.objects.get(slug="event-1") - self.assertEqual( - query_result, - event - ) - - def test_event_slug(self): - self.event_data.create_event(1, location=self.location) - query_result = Event.objects.get(slug="event-1") - self.assertEqual( - query_result.slug, - "event-1" - ) - - def test_event_with_series_slug(self): - series = self.event_data.create_series(1) - self.event_data.create_event(1, series=series, location=self.location) - query_result = Event.objects.get(slug="series-1-event-1") - self.assertEqual( - query_result.slug, - "series-1-event-1" - ) - - def test_event_slug_unique(self): - self.event_data.create_event(1, location=self.location) - self.event_data.create_event(1, location=self.location) - self.event_data.create_event(1, location=self.location) - Event.objects.get(slug="event-1") - Event.objects.get(slug="event-1-2") - Event.objects.get(slug="event-1-3") - - def test_event_with_series_slug_unique(self): - series = self.event_data.create_series(1) - self.event_data.create_event(1, series=series, location=self.location) - self.event_data.create_event(1, series=series, location=self.location) - self.event_data.create_event(1, series=series, location=self.location) - Event.objects.get(slug="series-1-event-1") - Event.objects.get(slug="series-1-event-1-2") - Event.objects.get(slug="series-1-event-1-3") diff --git a/cs4teachers/tests/events/models/test_location.py b/cs4teachers/tests/events/models/test_location.py deleted file mode 100644 index a4b216115..000000000 --- a/cs4teachers/tests/events/models/test_location.py +++ /dev/null @@ -1,57 +0,0 @@ -from tests.BaseTest import BaseTest -from events.models import Location - - -class LocationModelTest(BaseTest): - - def test_location(self): - location = self.event_data.create_location(1) - query_result = Location.objects.get(slug="location-1") - self.assertEqual( - query_result, - location - ) - - def test_location_slug(self): - self.event_data.create_location(1) - query_result = Location.objects.get(slug="location-1") - self.assertEqual( - query_result.slug, - "location-1" - ) - - def test_location_slug_unique(self): - self.event_data.create_location(1) - self.event_data.create_location(1) - self.event_data.create_location(1) - Location.objects.get(slug="location-1") - Location.objects.get(slug="location-1-2") - Location.objects.get(slug="location-1-3") - - def test_location_name(self): - self.event_data.create_location(1) - query_result = Location.objects.get(slug="location-1") - self.assertEqual( - query_result.name, - "Location 1" - ) - - def test_location_description(self): - self.event_data.create_location(1) - query_result = Location.objects.get(slug="location-1") - self.assertEqual( - query_result.description, - "Description for Location 1" - ) - - def test_location_absolute_url(self): - self.event_data.create_location(1) - query_result = Location.objects.get(slug="location-1") - self.assertEqual( - query_result.get_absolute_url(), - "/events/location/location-1/" - ) - - def test_location_str(self): - location = self.event_data.create_location(1) - self.assertEqual(location.__str__(), "Location 1") diff --git a/cs4teachers/tests/events/models/test_resource.py b/cs4teachers/tests/events/models/test_resource.py deleted file mode 100644 index f94bdd09e..000000000 --- a/cs4teachers/tests/events/models/test_resource.py +++ /dev/null @@ -1,57 +0,0 @@ -from tests.BaseTest import BaseTest -from events.models import Resource - - -class ResourceModelTest(BaseTest): - - def test_resource(self): - resource = self.event_data.create_resource(1) - query_result = Resource.objects.get(slug="resource-1") - self.assertEqual( - query_result, - resource - ) - - def test_resource_slug(self): - self.event_data.create_resource(1) - query_result = Resource.objects.get(slug="resource-1") - self.assertEqual( - query_result.slug, - "resource-1" - ) - - def test_resource_slug_unique(self): - self.event_data.create_resource(1) - self.event_data.create_resource(1) - self.event_data.create_resource(1) - Resource.objects.get(slug="resource-1") - Resource.objects.get(slug="resource-1-2") - Resource.objects.get(slug="resource-1-3") - - def test_resource_name(self): - self.event_data.create_resource(1) - query_result = Resource.objects.get(slug="resource-1") - self.assertEqual( - query_result.name, - "Resource 1" - ) - - def test_resource_url(self): - self.event_data.create_resource(1) - query_result = Resource.objects.get(slug="resource-1") - self.assertEqual( - query_result.url, - "https://www.1.com/" - ) - - def test_resource_description(self): - self.event_data.create_resource(1) - query_result = Resource.objects.get(slug="resource-1") - self.assertEqual( - query_result.description, - "Description for Resource 1" - ) - - def test_resource_str(self): - resource = self.event_data.create_resource(1) - self.assertEqual(resource.__str__(), "Resource 1") diff --git a/cs4teachers/tests/events/models/test_sponsor.py b/cs4teachers/tests/events/models/test_sponsor.py deleted file mode 100644 index e50374cee..000000000 --- a/cs4teachers/tests/events/models/test_sponsor.py +++ /dev/null @@ -1,42 +0,0 @@ -from django.db import utils -from tests.BaseTest import BaseTest -from events.models import Sponsor - - -class SponsorModelTest(BaseTest): - - def test_sponsor(self): - sponsor = self.event_data.create_sponsor(1) - query_result = Sponsor.objects.get(name="Sponsor 1") - self.assertEqual( - query_result, - sponsor - ) - - def test_sponsor_slug_must_be_unique(self): - self.event_data.create_sponsor(1) - self.assertRaises( - utils.IntegrityError, - self.event_data.create_sponsor, - 1 - ) - - def test_sponsor_name(self): - self.event_data.create_sponsor(1) - query_result = Sponsor.objects.get(name="Sponsor 1") - self.assertEqual( - query_result.name, - "Sponsor 1" - ) - - def test_sponsor_url(self): - self.event_data.create_sponsor(1) - query_result = Sponsor.objects.get(name="Sponsor 1") - self.assertEqual( - query_result.url, - "https://www.1.com/" - ) - - def test_sponsor_str(self): - sponsor = self.event_data.create_sponsor(1) - self.assertEqual(sponsor.__str__(), "Sponsor 1") diff --git a/cs4teachers/tests/events/models/test_third_party_event.py b/cs4teachers/tests/events/models/test_third_party_event.py deleted file mode 100644 index c45602341..000000000 --- a/cs4teachers/tests/events/models/test_third_party_event.py +++ /dev/null @@ -1,32 +0,0 @@ -from tests.BaseTest import BaseTest -from events.models import ThirdPartyEvent - - -class ThirdPartyEventModelTest(BaseTest): - - def setUp(self, *args, **kwargs): - self.location = self.event_data.create_location(1) - - def test_third_party_event(self): - third_party_event = self.event_data.create_third_party_event(1, location=self.location) - query_result = ThirdPartyEvent.objects.get(slug="third-party-event-1") - self.assertEqual( - query_result, - third_party_event - ) - - def test_third_party_event_slug(self): - self.event_data.create_third_party_event(1, location=self.location) - query_result = ThirdPartyEvent.objects.get(slug="third-party-event-1") - self.assertEqual( - query_result.slug, - "third-party-event-1" - ) - - def test_third_party_event_slug_unique(self): - self.event_data.create_third_party_event(1, location=self.location) - self.event_data.create_third_party_event(1, location=self.location) - self.event_data.create_third_party_event(1, location=self.location) - ThirdPartyEvent.objects.get(slug="third-party-event-1") - ThirdPartyEvent.objects.get(slug="third-party-event-1-2") - ThirdPartyEvent.objects.get(slug="third-party-event-1-3") diff --git a/cs4teachers/tests/general/__init__.py b/cs4teachers/tests/general/__init__.py deleted file mode 100644 index f0a4ac5ab..000000000 --- a/cs4teachers/tests/general/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Module for tests of the general application.""" diff --git a/cs4teachers/tests/general/urls/__init__.py b/cs4teachers/tests/general/urls/__init__.py deleted file mode 100644 index 106b86b8b..000000000 --- a/cs4teachers/tests/general/urls/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Module for tests of the URL routing in the general application.""" diff --git a/cs4teachers/tests/general/urls/test_index_url.py b/cs4teachers/tests/general/urls/test_index_url.py deleted file mode 100644 index 97106d705..000000000 --- a/cs4teachers/tests/general/urls/test_index_url.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.test import TestCase -from django.urls import reverse - - -class IndexURLTest(TestCase): - - def test_valid_index_request(self): - url = reverse("general:home") - self.assertEqual(url, "/") - - response = self.client.get(url) - self.assertEqual(200, response.status_code) diff --git a/helper b/dev similarity index 86% rename from helper rename to dev index ef6371900..8c600743b 100755 --- a/helper +++ b/dev @@ -1,5 +1,5 @@ #!/bin/bash -# Helper script for commands related to the cs4teachers repository. +# Helper script for commands related to this repository. # # Notes: # - Changes to template only require user to refresh browser. @@ -17,19 +17,11 @@ cmd_helps=() dev_cmd_helps=() defhelp() { - if [ "$1" = '-dev' ]; then - local command="${2?}" - local text="${3?}" - local help_str - help_str="$(printf ' %-24s %s' "$command" "$text")" - dev_cmd_helps+=("$help_str") - else - local command="${1?}" - local text="${2?}" - local help_str - help_str="$(printf ' %-24s %s' "$command" "$text")" - cmd_helps+=("$help_str") - fi + local command="${1?}" + local text="${2?}" + local help_str + help_str="$(printf ' %-28s %s' "$command" "$text")" + cmd_helps+=("$help_str") } # Print out help information @@ -43,11 +35,6 @@ cmd_help() { for str in "${cmd_helps[@]}"; do echo -e "$str" done - echo - echo "DEV_COMMAND list:" - for str in "${dev_cmd_helps[@]}"; do - echo -e "$str" - done } defhelp help 'View all help.' @@ -86,13 +73,13 @@ defhelp restart 'Stop and then restart development environment.' # Run Django migrate and updatedata commands cmd_update() { - dev_static + cmd_static echo "" - dev_migrate + cmd_migrate echo "" - dev_collect_static + cmd_collect_static echo "" echo -e "\n${GREEN}Content is loaded!${NC}" echo "Open your preferred web browser to the URL 'localhost:82'" @@ -100,7 +87,7 @@ cmd_update() { defhelp update 'Update system ready for use.' # Collecting static files -dev_collect_static() { +cmd_collect_static() { echo echo "Collecting static files..." docker-compose exec django /docker_venv/bin/python3 ./manage.py collectstatic --no-input --clear @@ -108,27 +95,27 @@ dev_collect_static() { defhelp -dev collect_static "Collecting static files." # Run Django flush command -dev_flush() { +cmd_flush() { docker-compose exec django /docker_venv/bin/python3 ./manage.py flush } defhelp -dev flush 'Run Django flush command.' # Run Django makemigrations command -dev_makemigrations() { +cmd_makemigrations() { echo "Creating database migrations..." docker-compose exec django /docker_venv/bin/python3 ./manage.py makemigrations } defhelp -dev makemigrations 'Run Django makemigrations command.' # Run Django migrate command -dev_migrate() { +cmd_migrate() { echo "Applying database migrations..." docker-compose exec django /docker_venv/bin/python3 ./manage.py migrate } defhelp -dev migrate 'Run Django migrate command.' # Build Docker images -dev_build() { +cmd_build() { echo "Building Docker images..." docker-compose build echo @@ -141,44 +128,44 @@ dev_build() { defhelp -dev build 'Build or rebuild Docker images.' # Build static files -dev_static() { +cmd_static() { echo "Building static files..." docker-compose exec nginx gulp build } defhelp -dev static 'Build static files.' # Build production static files -dev_static_prod() { +cmd_static_prod() { echo "Building production static files..." docker-compose exec nginx gulp build --production } defhelp -dev static_prod 'Build production static files.' # Run shell -dev_shell() { +cmd_shell() { docker-compose exec django bash } defhelp -dev shell "Open shell to Django folder." -dev_createsuperuser() { +cmd_createsuperuser() { docker-compose exec django /docker_venv/bin/python3 ./manage.py createsuperuser } defhelp -dev createsuperuser "Create superuser in Django system." -dev_sampledata() { +cmd_sampledata() { docker-compose exec django /docker_venv/bin/python3 ./manage.py shell -c "from django.contrib.auth.models import User; User.objects.filter(email='admin@example.com').delete(); User.objects.create_superuser('admin', 'admin@example.com', 'password')" } defhelp -dev sampledata "Add sample data to website." # Reboot Django Docker container -dev_reboot_django() { +cmd_reboot_django() { echo "Rebooting Django Docker container..." docker-compose restart django } defhelp -dev reboot_django 'Reboot Django Docker container.' # Run style checks -dev_style() { +cmd_style() { echo "Running PEP8 style checker..." docker-compose exec django /docker_venv/bin/flake8 pep8_status=$? @@ -191,21 +178,21 @@ dev_style() { defhelp -dev style 'Run style checks.' # Run test suite -dev_test_suite() { +cmd_test_suite() { echo "Running test suite..." - docker-compose exec django /docker_venv/bin/coverage run --rcfile=/cs4teachers/.coveragerc ./manage.py test --settings=config.settings.testing --pattern "test_*.py" -v 3 --nomigrations + docker-compose exec django /docker_venv/bin/coverage run --rcfile=/dthm4kaiako/.coveragerc ./manage.py test --settings=config.settings.testing --pattern "test_*.py" -v 3 --nomigrations } defhelp -dev test_suite 'Run test suite with code coverage.' # Run specific test suite -dev_test_specific() { +cmd_test_specific() { echo "Running specific test suite..." docker-compose exec django /docker_venv/bin/python3 ./manage.py test --settings=config.settings.testing "${1}" -v 3 --nomigrations } defhelp -dev test_specific 'Run specific test suite. Pass in parameter of Python test module.' # Display test coverage table -dev_test_coverage() { +cmd_test_coverage() { echo "Displaying test suite coverage..." docker-compose exec django /docker_venv/bin/coverage xml -i docker-compose exec django /docker_venv/bin/coverage report -m --skip-covered @@ -213,7 +200,7 @@ dev_test_coverage() { defhelp -dev test_coverage 'Display code coverage report.' # Run test suite backwards for CI testing -dev_test_backwards() { +cmd_test_backwards() { echo "Running test suite backwards..." docker-compose exec django /docker_venv/bin/python3 ./manage.py test --settings=config.settings.testing --pattern "test_*.py" --reverse -v 0 --nomigrations } @@ -261,24 +248,24 @@ cmd_logs() { defhelp logs 'View logs.' ci_test_suite() { - dev_static - dev_collect_static - dev_test_suite + cmd_static + cmd_collect_static + cmd_test_suite test_status=$? - dev_test_coverage + cmd_test_coverage coverage_status=$? bash <(curl -s https://codecov.io/bash) ! (( $test_status || $coverage_status )) } ci_style() { - dev_style + cmd_style } ci_test_backwards() { - dev_static - dev_collect_static - dev_test_backwards + cmd_static + cmd_collect_static + cmd_test_backwards } cmd_ci() { @@ -308,12 +295,12 @@ cmd_dev() { local cmd="$1" shift if [ -z "$cmd" ]; then - echo -e "${RED}ERROR: dev command requires one parameter!${NC}" + echo -e "${RED}ERROR: command requires one parameter!${NC}" cmd_help return 1 fi - if silent type "dev_$cmd"; then - "dev_$cmd" "$@" + if silent type "cmd_$cmd"; then + "cmd_$cmd" "$@" exit $? else echo -e "${RED}ERROR: Unknown command!${NC}" diff --git a/docker-compose.yml b/docker-compose.yml index 380207193..7b57f2675 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: '3' services: postgres: restart: always - image: postgres:9.6.8 + image: postgres:9.6.11 # Set port to non-standard value to not use Travis CI Postgres server. command: postgres -p 5434 @@ -10,14 +10,15 @@ services: build: context: . dockerfile: ./Dockerfile-local - command: /cs4teachers/cs4teachers/docker-development-entrypoint.sh + command: /dthm4kaiako/dthm4kaiako/docker-development-entrypoint.sh volumes: - - .:/cs4teachers + - .:/dthm4kaiako environment: - PORT=8080 - USE_DOCKER=yes - DATABASE_URL=postgres://postgres@postgres:5434/postgres - DJANGO_SETTINGS_MODULE=config.settings.local + - INCLUDE_INCONTEXT_L10N=False depends_on: - postgres @@ -26,7 +27,7 @@ services: context: . dockerfile: ./infrastructure/nginx/Dockerfile volumes: - - ./cs4teachers/:/app/ + - ./dthm4kaiako/:/app/ - /app/node_modules depends_on: - django diff --git a/dthm4kaiako/__init__.py b/dthm4kaiako/__init__.py new file mode 100644 index 000000000..3ff4c16dd --- /dev/null +++ b/dthm4kaiako/__init__.py @@ -0,0 +1,7 @@ +__version__ = "0.6.0" +__version_info__ = tuple( + [ + int(num) if num.isdigit() else num + for num in __version__.replace("-", ".", 1).split(".") + ] +) diff --git a/cs4teachers/config/__init__.py b/dthm4kaiako/config/__init__.py similarity index 64% rename from cs4teachers/config/__init__.py rename to dthm4kaiako/config/__init__.py index 120169145..04cd80cc8 100644 --- a/cs4teachers/config/__init__.py +++ b/dthm4kaiako/config/__init__.py @@ -1,3 +1,3 @@ """Configuration for Django system.""" -__version__ = "0.5.3" +__version__ = "0.6.0" diff --git a/cs4teachers/config/context_processors/version_number.py b/dthm4kaiako/config/context_processors/version_number.py similarity index 100% rename from cs4teachers/config/context_processors/version_number.py rename to dthm4kaiako/config/context_processors/version_number.py diff --git a/cs4teachers/events/migrations/__init__.py b/dthm4kaiako/config/settings/__init__.py similarity index 100% rename from cs4teachers/events/migrations/__init__.py rename to dthm4kaiako/config/settings/__init__.py diff --git a/dthm4kaiako/config/settings/base.py b/dthm4kaiako/config/settings/base.py new file mode 100644 index 000000000..1c71b4b05 --- /dev/null +++ b/dthm4kaiako/config/settings/base.py @@ -0,0 +1,254 @@ +""" +Base settings to build other settings files upon. +""" + +import os.path +import environ + +# dthm4kaiako/dthm4kaiako/config/settings/base.py - 3 = dthm4kaiako/dthm4kaiako/ +ROOT_DIR = environ.Path(__file__) - 3 + +env = environ.Env() + +# GENERAL +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#debug +DEBUG = env.bool('DJANGO_DEBUG', False) + +# Local time zone. Choices are +# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name +# though not all of them may be available with every OS. +# In Windows, this must be set to your system time zone. +TIME_ZONE = 'UTC' +# https://docs.djangoproject.com/en/dev/ref/settings/#language-code +LANGUAGE_CODE = 'en-NZ' +# https://docs.djangoproject.com/en/dev/ref/settings/#site-id +SITE_ID = 1 +# https://docs.djangoproject.com/en/dev/ref/settings/#use-i18n +USE_I18N = True +# https://docs.djangoproject.com/en/dev/ref/settings/#use-l10n +USE_L10N = True +# https://docs.djangoproject.com/en/dev/ref/settings/#use-tz +USE_TZ = True + +# DATABASES +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#databases + +DATABASES = { + 'default': env.db('DATABASE_URL', default='postgres:///dthm4kaiako'), +} +DATABASES['default']['ATOMIC_REQUESTS'] = True + +# URLS +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#root-urlconf +ROOT_URLCONF = 'config.urls' +# https://docs.djangoproject.com/en/dev/ref/settings/#wsgi-application +WSGI_APPLICATION = 'config.wsgi.application' + +# APPS +# ------------------------------------------------------------------------------ +DJANGO_APPS = [ + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'django.contrib.flatpages', + # Handy template tags + 'django.contrib.humanize', + 'django.contrib.admin', +] +THIRD_PARTY_APPS = [ + 'crispy_forms', + 'allauth', + 'allauth.account', + 'allauth.socialaccount', + 'rest_framework', +] +LOCAL_APPS = [ + 'users.apps.UsersAppConfig', + # Your stuff: custom apps go here +] +# https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps +INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS + +# MIGRATIONS +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#migration-modules +MIGRATION_MODULES = { + 'sites': 'contrib.sites.migrations' +} + +# AUTHENTICATION +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#authentication-backends +AUTHENTICATION_BACKENDS = [ + 'django.contrib.auth.backends.ModelBackend', + 'allauth.account.auth_backends.AuthenticationBackend', +] +# https://docs.djangoproject.com/en/dev/ref/settings/#auth-user-model +AUTH_USER_MODEL = 'users.User' +# https://docs.djangoproject.com/en/dev/ref/settings/#login-redirect-url +LOGIN_REDIRECT_URL = 'users:redirect' +# https://docs.djangoproject.com/en/dev/ref/settings/#login-url +LOGIN_URL = 'account_login' + +# PASSWORDS +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#password-hashers +PASSWORD_HASHERS = [ + # https://docs.djangoproject.com/en/dev/topics/auth/passwords/#using-argon2-with-django + 'django.contrib.auth.hashers.Argon2PasswordHasher', + 'django.contrib.auth.hashers.PBKDF2PasswordHasher', + 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', + 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', + 'django.contrib.auth.hashers.BCryptPasswordHasher', +] +# https://docs.djangoproject.com/en/dev/ref/settings/#auth-password-validators +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + +# MIDDLEWARE +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#middleware +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +# STATIC +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#static-root +STATIC_ROOT = os.path.join(str(ROOT_DIR.path('staticfiles')), '') + +# https://docs.djangoproject.com/en/dev/ref/settings/#static-url +STATIC_URL = '/staticfiles/' +# https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS +BUILD_ROOT = os.path.join(str(ROOT_DIR.path('build')), '') +STATICFILES_DIRS = [ + BUILD_ROOT, +] +# https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders +STATICFILES_FINDERS = [ + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', +] + +# MEDIA +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#media-root +MEDIA_ROOT = os.path.join(str(ROOT_DIR.path('media')), '') +# https://docs.djangoproject.com/en/dev/ref/settings/#media-url +MEDIA_URL = '/media/' + +# TEMPLATES +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#templates +TEMPLATES = [ + { + # https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-TEMPLATES-BACKEND + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + # https://docs.djangoproject.com/en/dev/ref/settings/#template-dirs + 'DIRS': [ + str(ROOT_DIR.path('templates')), + ], + 'OPTIONS': { + # https://docs.djangoproject.com/en/dev/ref/settings/#template-debug + 'debug': DEBUG, + # https://docs.djangoproject.com/en/dev/ref/settings/#template-loaders + # https://docs.djangoproject.com/en/dev/ref/templates/api/#loader-types + 'loaders': [ + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + ], + # https://docs.djangoproject.com/en/dev/ref/settings/#template-context-processors + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.template.context_processors.i18n', + 'django.template.context_processors.media', + 'django.template.context_processors.static', + 'django.template.context_processors.tz', + 'django.contrib.messages.context_processors.messages', + 'config.context_processors.version_number.version_number', + ], + }, + }, +] +# http://django-crispy-forms.readthedocs.io/en/latest/install.html#template-packs +CRISPY_TEMPLATE_PACK = 'bootstrap4' + +# FIXTURES +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#fixture-dirs +FIXTURE_DIRS = ( + str(ROOT_DIR.path('fixtures')), +) + +# SECURITY +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#session-cookie-httponly +SESSION_COOKIE_HTTPONLY = True +# https://docs.djangoproject.com/en/dev/ref/settings/#csrf-cookie-httponly +CSRF_COOKIE_HTTPONLY = True +# https://docs.djangoproject.com/en/dev/ref/settings/#secure-browser-xss-filter +SECURE_BROWSER_XSS_FILTER = True +# https://docs.djangoproject.com/en/dev/ref/settings/#x-frame-options +X_FRAME_OPTIONS = 'DENY' + +# EMAIL +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#email-backend +EMAIL_BACKEND = env('DJANGO_EMAIL_BACKEND', default='django.core.mail.backends.smtp.EmailBackend') + +# ADMIN +# ------------------------------------------------------------------------------ +# Django Admin URL. +ADMIN_URL = 'admin/' +# https://docs.djangoproject.com/en/dev/ref/settings/#admins +ADMINS = [ + ("""UCCSER""", 'csse-education-research@canterbury.ac.nz'), +] +# https://docs.djangoproject.com/en/dev/ref/settings/#managers +MANAGERS = ADMINS + + +# django-allauth +# ------------------------------------------------------------------------------ +ACCOUNT_ALLOW_REGISTRATION = env.bool('DJANGO_ACCOUNT_ALLOW_REGISTRATION', True) +# https://django-allauth.readthedocs.io/en/latest/configuration.html +ACCOUNT_AUTHENTICATION_METHOD = 'username' +# https://django-allauth.readthedocs.io/en/latest/configuration.html +ACCOUNT_EMAIL_REQUIRED = True +# https://django-allauth.readthedocs.io/en/latest/configuration.html +ACCOUNT_EMAIL_VERIFICATION = 'mandatory' +# https://django-allauth.readthedocs.io/en/latest/configuration.html +ACCOUNT_ADAPTER = 'users.adapters.AccountAdapter' +# https://django-allauth.readthedocs.io/en/latest/configuration.html +SOCIALACCOUNT_ADAPTER = 'users.adapters.SocialAccountAdapter' + + +# Your stuff... +# ------------------------------------------------------------------------------ +ACCOUNT_ALLOW_REGISTRATION = False diff --git a/dthm4kaiako/config/settings/local.py b/dthm4kaiako/config/settings/local.py new file mode 100644 index 000000000..f7e776889 --- /dev/null +++ b/dthm4kaiako/config/settings/local.py @@ -0,0 +1,76 @@ +from .base import * # noqa +from .base import env + +# GENERAL +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#debug +DEBUG = True +# https://docs.djangoproject.com/en/dev/ref/settings/#secret-key +SECRET_KEY = env('DJANGO_SECRET_KEY', default='HU69v4L0rrfp4JtAwZ9CXbDosJVCGwCsOevBSmIyZ9cLFidFtFnrXIStbFCVYF7P') +# https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts +ALLOWED_HOSTS = [ + "localhost", + "0.0.0.0", + "127.0.0.1", +] + +# CACHES +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#caches +CACHES = { + 'default': { + 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', + 'LOCATION': '' + } +} + +# TEMPLATES +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#templates +TEMPLATES[0]['OPTIONS']['debug'] = DEBUG # noqa F405 + +# EMAIL +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#email-backend +EMAIL_BACKEND = env('DJANGO_EMAIL_BACKEND', default='django.core.mail.backends.console.EmailBackend') +# https://docs.djangoproject.com/en/dev/ref/settings/#email-host +EMAIL_HOST = 'localhost' +# https://docs.djangoproject.com/en/dev/ref/settings/#email-port +EMAIL_PORT = 1025 + +# django-debug-toolbar +# ------------------------------------------------------------------------------ +# https://django-debug-toolbar.readthedocs.io/en/latest/installation.html#prerequisites +INSTALLED_APPS += ['debug_toolbar'] # noqa F405 +# https://django-debug-toolbar.readthedocs.io/en/latest/installation.html#middleware +MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware'] # noqa F405 +# https://django-debug-toolbar.readthedocs.io/en/latest/configuration.html#debug-toolbar-config + + +def show_django_debug_toolbar(request): + """Show Django Debug Toolbar in every request when running locally. + + Args: + request: The request object. + """ + return True + + +DEBUG_TOOLBAR_CONFIG = { + 'DISABLE_PANELS': [ + 'debug_toolbar.panels.redirects.RedirectsPanel', + ], + 'SHOW_TEMPLATE_CONTEXT': True, + 'SHOW_TOOLBAR_CALLBACK': show_django_debug_toolbar, +} +# https://django-debug-toolbar.readthedocs.io/en/latest/installation.html#internal-ips +INTERNAL_IPS = ['127.0.0.1', '10.0.2.2'] + + +# django-extensions +# ------------------------------------------------------------------------------ +# https://django-extensions.readthedocs.io/en/latest/installation_instructions.html#configuration +INSTALLED_APPS += ['django_extensions'] # noqa F405 + +# Your stuff... +# ------------------------------------------------------------------------------ diff --git a/dthm4kaiako/config/settings/production.py b/dthm4kaiako/config/settings/production.py new file mode 100644 index 000000000..9ead034b8 --- /dev/null +++ b/dthm4kaiako/config/settings/production.py @@ -0,0 +1,201 @@ +from .base import * # noqa +from .base import env + +# GENERAL +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#secret-key +SECRET_KEY = env('DJANGO_SECRET_KEY') +# https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts +ALLOWED_HOSTS = env.list('DJANGO_ALLOWED_HOSTS', default=['dthm4kaiako.ac.nz']) + +# DATABASES +# ------------------------------------------------------------------------------ +DATABASES['default'] = env.db('DATABASE_URL') # noqa F405 +DATABASES['default']['ATOMIC_REQUESTS'] = True # noqa F405 +DATABASES['default']['CONN_MAX_AGE'] = env.int('CONN_MAX_AGE', default=60) # noqa F405 + +# CACHES +# ------------------------------------------------------------------------------ +CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': env('REDIS_URL'), + 'OPTIONS': { + 'CLIENT_CLASS': 'django_redis.client.DefaultClient', + # Mimicing memcache behavior. + # http://niwinz.github.io/django-redis/latest/#_memcached_exceptions_behavior + 'IGNORE_EXCEPTIONS': True, + } + } +} + +# SECURITY +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#secure-proxy-ssl-header +SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') +# https://docs.djangoproject.com/en/dev/ref/settings/#secure-ssl-redirect +SECURE_SSL_REDIRECT = env.bool('DJANGO_SECURE_SSL_REDIRECT', default=True) +# https://docs.djangoproject.com/en/dev/ref/settings/#session-cookie-secure +SESSION_COOKIE_SECURE = True +# https://docs.djangoproject.com/en/dev/ref/settings/#csrf-cookie-secure +CSRF_COOKIE_SECURE = True +# https://docs.djangoproject.com/en/dev/topics/security/#ssl-https +# https://docs.djangoproject.com/en/dev/ref/settings/#secure-hsts-seconds +# TODO: set this to 60 seconds first and then to 518400 once you prove the former works +SECURE_HSTS_SECONDS = 60 +# https://docs.djangoproject.com/en/dev/ref/settings/#secure-hsts-include-subdomains +SECURE_HSTS_INCLUDE_SUBDOMAINS = env.bool('DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS', default=True) +# https://docs.djangoproject.com/en/dev/ref/settings/#secure-hsts-preload +SECURE_HSTS_PRELOAD = env.bool('DJANGO_SECURE_HSTS_PRELOAD', default=True) +# https://docs.djangoproject.com/en/dev/ref/middleware/#x-content-type-options-nosniff +SECURE_CONTENT_TYPE_NOSNIFF = env.bool('DJANGO_SECURE_CONTENT_TYPE_NOSNIFF', default=True) + +# STORAGES +# ------------------------------------------------------------------------------ +# https://django-storages.readthedocs.io/en/latest/#installation +INSTALLED_APPS += ['storages'] # noqa F405 +# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings +AWS_ACCESS_KEY_ID = env('DJANGO_AWS_ACCESS_KEY_ID') +# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings +AWS_SECRET_ACCESS_KEY = env('DJANGO_AWS_SECRET_ACCESS_KEY') +# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings +AWS_STORAGE_BUCKET_NAME = env('DJANGO_AWS_STORAGE_BUCKET_NAME') +# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings +AWS_QUERYSTRING_AUTH = False +# DO NOT change these unless you know what you're doing. +_AWS_EXPIRY = 60 * 60 * 24 * 7 +# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings +AWS_S3_OBJECT_PARAMETERS = { + 'CacheControl': f'max-age={_AWS_EXPIRY}, s-maxage={_AWS_EXPIRY}, must-revalidate', +} + +# STATIC +# ------------------------ + +STATICFILES_STORAGE = 'config.settings.production.StaticRootS3Boto3Storage' +STATIC_URL = f'https://{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/static/' + +# MEDIA +# ------------------------------------------------------------------------------ + +# region http://stackoverflow.com/questions/10390244/ +# Full-fledge class: https://stackoverflow.com/a/18046120/104731 +from storages.backends.s3boto3 import S3Boto3Storage # noqa E402 + + +class StaticRootS3Boto3Storage(S3Boto3Storage): + location = 'static' + + +class MediaRootS3Boto3Storage(S3Boto3Storage): + location = 'media' + file_overwrite = False + + +# endregion +DEFAULT_FILE_STORAGE = 'config.settings.production.MediaRootS3Boto3Storage' +MEDIA_URL = f'https://{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/media/' + +# TEMPLATES +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#templates +TEMPLATES[0]['OPTIONS']['loaders'] = [ # noqa F405 + ( + 'django.template.loaders.cached.Loader', + [ + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + ] + ), +] + +# EMAIL +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#default-from-email +DEFAULT_FROM_EMAIL = env( + 'DJANGO_DEFAULT_FROM_EMAIL', + default='dthm4kaiako ' +) +# https://docs.djangoproject.com/en/dev/ref/settings/#server-email +SERVER_EMAIL = env('DJANGO_SERVER_EMAIL', default=DEFAULT_FROM_EMAIL) +# https://docs.djangoproject.com/en/dev/ref/settings/#email-subject-prefix +EMAIL_SUBJECT_PREFIX = env('DJANGO_EMAIL_SUBJECT_PREFIX', default='[dthm4kaiako]') + +# ADMIN +# ------------------------------------------------------------------------------ +# Django Admin URL regex. +ADMIN_URL = env('DJANGO_ADMIN_URL') + +# Anymail (Mailgun) +# ------------------------------------------------------------------------------ +# https://anymail.readthedocs.io/en/stable/installation/#installing-anymail +INSTALLED_APPS += ['anymail'] # noqa F405 +EMAIL_BACKEND = 'anymail.backends.mailgun.EmailBackend' +# https://anymail.readthedocs.io/en/stable/installation/#anymail-settings-reference +ANYMAIL = { + 'MAILGUN_API_KEY': env('MAILGUN_API_KEY'), + 'MAILGUN_SENDER_DOMAIN': env('MAILGUN_DOMAIN') +} + +# Gunicorn +# ------------------------------------------------------------------------------ +INSTALLED_APPS += ['gunicorn'] # noqa F405 + +# Collectfast +# ------------------------------------------------------------------------------ +# https://github.com/antonagestam/collectfast#installation +INSTALLED_APPS = ['collectfast'] + INSTALLED_APPS # noqa F405 +AWS_PRELOAD_METADATA = True + + +# LOGGING +# ------------------------------------------------------------------------------ +# See: https://docs.djangoproject.com/en/dev/ref/settings/#logging +# A sample logging configuration. The only tangible logging +# performed by this configuration is to send an email to +# the site admins on every HTTP 500 error when DEBUG=False. +# See https://docs.djangoproject.com/en/dev/topics/logging for +# more details on how to customize your logging configuration. +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'filters': { + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse' + } + }, + 'formatters': { + 'verbose': { + 'format': '%(levelname)s %(asctime)s %(module)s ' + '%(process)d %(thread)d %(message)s' + }, + }, + 'handlers': { + 'mail_admins': { + 'level': 'ERROR', + 'filters': ['require_debug_false'], + 'class': 'django.utils.log.AdminEmailHandler' + }, + 'console': { + 'level': 'DEBUG', + 'class': 'logging.StreamHandler', + 'formatter': 'verbose', + }, + }, + 'loggers': { + 'django.request': { + 'handlers': ['mail_admins'], + 'level': 'ERROR', + 'propagate': True + }, + 'django.security.DisallowedHost': { + 'level': 'ERROR', + 'handlers': ['console', 'mail_admins'], + 'propagate': True + } + } +} + + +# Your stuff... +# ------------------------------------------------------------------------------ diff --git a/dthm4kaiako/config/settings/test.py b/dthm4kaiako/config/settings/test.py new file mode 100644 index 000000000..81d0d57a5 --- /dev/null +++ b/dthm4kaiako/config/settings/test.py @@ -0,0 +1,55 @@ +""" +With these settings, tests run faster. +""" + +from .base import * # noqa +from .base import env + +# GENERAL +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#debug +DEBUG = False +# https://docs.djangoproject.com/en/dev/ref/settings/#secret-key +SECRET_KEY = env("DJANGO_SECRET_KEY", default="d9sx4GjhdHEG1tiId9RvLCkKRtzPh5vAlQRWDL4Nn4JqRd1xugrVVpBxdZGNTTQh") +# https://docs.djangoproject.com/en/dev/ref/settings/#test-runner +TEST_RUNNER = "django.test.runner.DiscoverRunner" + +# CACHES +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#caches +CACHES = { + "default": { + "BACKEND": "django.core.cache.backends.locmem.LocMemCache", "LOCATION": "" + } +} + +# PASSWORDS +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#password-hashers +PASSWORD_HASHERS = ["django.contrib.auth.hashers.MD5PasswordHasher"] + +# TEMPLATES +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#templates +TEMPLATES[0]["OPTIONS"]["debug"] = DEBUG # noqa F405 +TEMPLATES[0]["OPTIONS"]["loaders"] = [ # noqa F405 + ( + "django.template.loaders.cached.Loader", + [ + "django.template.loaders.filesystem.Loader", + "django.template.loaders.app_directories.Loader", + ], + ) +] + +# EMAIL +# ------------------------------------------------------------------------------ +# https://docs.djangoproject.com/en/dev/ref/settings/#email-backend +EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend" +# https://docs.djangoproject.com/en/dev/ref/settings/#email-host +EMAIL_HOST = "localhost" +# https://docs.djangoproject.com/en/dev/ref/settings/#email-port +EMAIL_PORT = 1025 + +# Your stuff... +# ------------------------------------------------------------------------------ diff --git a/dthm4kaiako/config/urls.py b/dthm4kaiako/config/urls.py new file mode 100644 index 000000000..179dde94e --- /dev/null +++ b/dthm4kaiako/config/urls.py @@ -0,0 +1,54 @@ +from django.conf import settings +from django.urls import include, path +from django.conf.urls.static import static +from django.contrib import admin +from django.views.generic import TemplateView +from django.views import defaults as default_views + + +admin.site.site_header = "dthm4kaiako.ac.nz" +urlpatterns = [ + path("", TemplateView.as_view(template_name="pages/home.html"), name="home"), + path( + "about/", + TemplateView.as_view(template_name="pages/about.html"), + name="about", + ), + # Django Admin, use {% url 'admin:index' %} + path(settings.ADMIN_URL, admin.site.urls), + # User management + path( + "users/", + include("users.urls", namespace="users"), + ), + path("accounts/", include("allauth.urls")), + # Your stuff: custom urls includes go here +] + static( + settings.MEDIA_URL, document_root=settings.MEDIA_ROOT +) + +if settings.DEBUG: + # This allows the error pages to be debugged during development, just visit + # these url in browser to see how these error pages look like. + urlpatterns += [ + path( + "400/", + default_views.bad_request, + kwargs={"exception": Exception("Bad Request!")}, + ), + path( + "403/", + default_views.permission_denied, + kwargs={"exception": Exception("Permission Denied")}, + ), + path( + "404/", + default_views.page_not_found, + kwargs={"exception": Exception("Page not Found")}, + ), + path("500/", default_views.server_error), + ] + if "debug_toolbar" in settings.INSTALLED_APPS: + import debug_toolbar + + urlpatterns = [path("__debug__/", include(debug_toolbar.urls))] + urlpatterns diff --git a/dthm4kaiako/config/wsgi.py b/dthm4kaiako/config/wsgi.py new file mode 100644 index 000000000..4f9d94963 --- /dev/null +++ b/dthm4kaiako/config/wsgi.py @@ -0,0 +1,29 @@ +""" +WSGI config for dthm4kaiako project. + +This module contains the WSGI application used by Django's development server +and any production WSGI deployments. It should expose a module-level variable +named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover +this application via the ``WSGI_APPLICATION`` setting. + +Usually you will have the standard Django WSGI application here, but it also +might make sense to replace the whole Django WSGI application with a custom one +that later delegates to the Django one. For example, you could introduce WSGI +middleware here, or combine a Django application with an application of another +framework. + +""" +import os +import sys +from django.core.wsgi import get_wsgi_application + +# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks +# if running multiple sites in the same mod_wsgi process. To fix this, use +# mod_wsgi daemon mode with each site in its own daemon process, or use +# os.environ["DJANGO_SETTINGS_MODULE"] = "config.settings.production" +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production") + +# This application object is used by any WSGI server configured to use this +# file. This includes Django's development server, if the WSGI_APPLICATION +# setting points here. +application = get_wsgi_application() diff --git a/dthm4kaiako/conftest.py b/dthm4kaiako/conftest.py new file mode 100644 index 000000000..427272eee --- /dev/null +++ b/dthm4kaiako/conftest.py @@ -0,0 +1,20 @@ +import pytest +from django.conf import settings +from django.test import RequestFactory + +from users.tests.factories import UserFactory + + +@pytest.fixture(autouse=True) +def media_storage(settings, tmpdir): + settings.MEDIA_ROOT = tmpdir.strpath + + +@pytest.fixture +def user() -> settings.AUTH_USER_MODEL: + return UserFactory() + + +@pytest.fixture +def request_factory() -> RequestFactory: + return RequestFactory() diff --git a/dthm4kaiako/contrib/__init__.py b/dthm4kaiako/contrib/__init__.py new file mode 100644 index 000000000..1c7ecc894 --- /dev/null +++ b/dthm4kaiako/contrib/__init__.py @@ -0,0 +1,5 @@ +""" +To understand why this file is here, please read: + +http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django +""" diff --git a/dthm4kaiako/contrib/sites/__init__.py b/dthm4kaiako/contrib/sites/__init__.py new file mode 100644 index 000000000..1c7ecc894 --- /dev/null +++ b/dthm4kaiako/contrib/sites/__init__.py @@ -0,0 +1,5 @@ +""" +To understand why this file is here, please read: + +http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django +""" diff --git a/dthm4kaiako/contrib/sites/migrations/0001_initial.py b/dthm4kaiako/contrib/sites/migrations/0001_initial.py new file mode 100644 index 000000000..304cd6d7c --- /dev/null +++ b/dthm4kaiako/contrib/sites/migrations/0001_initial.py @@ -0,0 +1,42 @@ +import django.contrib.sites.models +from django.contrib.sites.models import _simple_domain_name_validator +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="Site", + fields=[ + ( + "id", + models.AutoField( + verbose_name="ID", + serialize=False, + auto_created=True, + primary_key=True, + ), + ), + ( + "domain", + models.CharField( + max_length=100, + verbose_name="domain name", + validators=[_simple_domain_name_validator], + ), + ), + ("name", models.CharField(max_length=50, verbose_name="display name")), + ], + options={ + "ordering": ("domain",), + "db_table": "django_site", + "verbose_name": "site", + "verbose_name_plural": "sites", + }, + bases=(models.Model,), + managers=[("objects", django.contrib.sites.models.SiteManager())], + ) + ] diff --git a/dthm4kaiako/contrib/sites/migrations/0002_alter_domain_unique.py b/dthm4kaiako/contrib/sites/migrations/0002_alter_domain_unique.py new file mode 100644 index 000000000..2c8d6dac0 --- /dev/null +++ b/dthm4kaiako/contrib/sites/migrations/0002_alter_domain_unique.py @@ -0,0 +1,20 @@ +import django.contrib.sites.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [("sites", "0001_initial")] + + operations = [ + migrations.AlterField( + model_name="site", + name="domain", + field=models.CharField( + max_length=100, + unique=True, + validators=[django.contrib.sites.models._simple_domain_name_validator], + verbose_name="domain name", + ), + ) + ] diff --git a/dthm4kaiako/contrib/sites/migrations/0003_set_site_domain_and_name.py b/dthm4kaiako/contrib/sites/migrations/0003_set_site_domain_and_name.py new file mode 100644 index 000000000..5c11ce7e4 --- /dev/null +++ b/dthm4kaiako/contrib/sites/migrations/0003_set_site_domain_and_name.py @@ -0,0 +1,34 @@ +""" +To understand why this file is here, please read: + +http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django +""" +from django.conf import settings +from django.db import migrations + + +def update_site_forward(apps, schema_editor): + """Set site domain and name.""" + Site = apps.get_model("sites", "Site") + Site.objects.update_or_create( + id=settings.SITE_ID, + defaults={ + "domain": "dthm4kaiako.ac.nz", + "name": "dthm4kaiako", + }, + ) + + +def update_site_backward(apps, schema_editor): + """Revert site domain and name to default.""" + Site = apps.get_model("sites", "Site") + Site.objects.update_or_create( + id=settings.SITE_ID, defaults={"domain": "example.com", "name": "example.com"} + ) + + +class Migration(migrations.Migration): + + dependencies = [("sites", "0002_alter_domain_unique")] + + operations = [migrations.RunPython(update_site_forward, update_site_backward)] diff --git a/dthm4kaiako/contrib/sites/migrations/__init__.py b/dthm4kaiako/contrib/sites/migrations/__init__.py new file mode 100644 index 000000000..1c7ecc894 --- /dev/null +++ b/dthm4kaiako/contrib/sites/migrations/__init__.py @@ -0,0 +1,5 @@ +""" +To understand why this file is here, please read: + +http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django +""" diff --git a/cs4teachers/docker-development-entrypoint.sh b/dthm4kaiako/docker-development-entrypoint.sh similarity index 100% rename from cs4teachers/docker-development-entrypoint.sh rename to dthm4kaiako/docker-development-entrypoint.sh diff --git a/cs4teachers/docker-production-entrypoint.sh b/dthm4kaiako/docker-production-entrypoint.sh similarity index 100% rename from cs4teachers/docker-production-entrypoint.sh rename to dthm4kaiako/docker-production-entrypoint.sh diff --git a/cs4teachers/gulpfile.js b/dthm4kaiako/gulpfile.js similarity index 100% rename from cs4teachers/gulpfile.js rename to dthm4kaiako/gulpfile.js diff --git a/cs4teachers/gunicorn.conf.py b/dthm4kaiako/gunicorn.conf.py similarity index 100% rename from cs4teachers/gunicorn.conf.py rename to dthm4kaiako/gunicorn.conf.py diff --git a/dthm4kaiako/locale/README.rst b/dthm4kaiako/locale/README.rst new file mode 100644 index 000000000..c2f1dcd6f --- /dev/null +++ b/dthm4kaiako/locale/README.rst @@ -0,0 +1,6 @@ +Translations +============ + +Translations will be placed in this folder when running:: + + python manage.py makemessages diff --git a/cs4teachers/manage.py b/dthm4kaiako/manage.py similarity index 90% rename from cs4teachers/manage.py rename to dthm4kaiako/manage.py index 2a0efe264..f1c84cace 100755 --- a/cs4teachers/manage.py +++ b/dthm4kaiako/manage.py @@ -1,11 +1,10 @@ #!/usr/bin/env python -"""Command-line utility for Django administrative tasks.""" - import os import sys if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local") + try: from django.core.management import execute_from_command_line except ImportError: @@ -13,12 +12,14 @@ # issue is really that Django is missing to avoid masking other # exceptions on Python 2. try: - import django + import django # noqa except ImportError: raise ImportError( "Couldn't import Django. Are you sure it's installed and " "available on your PYTHONPATH environment variable? Did you " "forget to activate a virtual environment?" ) + raise + execute_from_command_line(sys.argv) diff --git a/cs4teachers/package.json b/dthm4kaiako/package.json similarity index 94% rename from cs4teachers/package.json rename to dthm4kaiako/package.json index bc210005b..06364659a 100644 --- a/cs4teachers/package.json +++ b/dthm4kaiako/package.json @@ -1,5 +1,5 @@ { - "name": "cs4teachers-assets", + "name": "dthm4kaiako-assets", "version": "0.0.1", "main": "gulpfile.js", "private": true, diff --git a/cs4teachers/general/migrations/__init__.py b/dthm4kaiako/static/fonts/.gitkeep similarity index 100% rename from cs4teachers/general/migrations/__init__.py rename to dthm4kaiako/static/fonts/.gitkeep diff --git a/dthm4kaiako/static/img/favicons/favicon.ico b/dthm4kaiako/static/img/favicons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e1c1dd1a32a3a077c41a21e52bc7fb5ac90d3afb GIT binary patch literal 8348 zcmeHLX-gGh6rQ3V&`92%;lcmGu`Jl^WK@OV`^XKh08PZoaH%l?rdiiWq>kJ2@6vM zhAH8L6=kTRD1!xR`-2o^hS&}loN!U1#gF+=YxEq~uqf5#iBw%p0;w;5ehm+6a!sSu zh;X+$+}oF$X1Q6DwS~>Y_Hpw^(&QvJO<5ZCPrn5laNp%s{B3x1hf%*?eW>oS{<{4s^u_yG zpDyG!_iV#~G=q<~slG@0Sx47XXQ%O;HY7ILVf}B-)R$6GV^A78)t0tN9`tu3r9Z+xM?NgUd8geu=c`0?r;-KR&IQjKs zSB#VCpg8CPW&M}$sth@H=VS%t;23!!j};F)bb;W3EkA!4QmCsY_p81^TK0{;$g>e1Hl998^0M+r0-7ZSN+l_cMSRuEALTE@|d6+3{GMP^;_|<yhubb{FF1IPgH|0>SH%pC!c)uFI)H z?jv4y0uO{P5WE>~I<$r!RFo0lN4r{xm;Jy4p$h~b3S*a#)$Z*nI}&Kc_C+*zZHz1v zIR8TBVH7Y?Mp~ zofpsr+SP@>EX4e*bQ{nAUYtKrQ&-5d4j;FF{^-^Dt2^5I`HSb!|22PN26n3>hKPOy zW2D*A*v+c{bFKCwozbB{dObp~e&1Nxrj<4Ih4~w)M`nl08o}Wq2 z#Jt(k+M>+}JY(=2gm(gdUq)^@e%tX(F)RBtotnB2^y>YKz-5eg_qO&n%lJ1nuQmTY zxmyE1NWjl1EGvD?Z|n;neT;sa?Q;Ef-#%$BYxXAhD4xF+@M>*qrR!x^sPN98|BX4; z!$NJcKF`^C7f(<_vlp%b>`pxL^8Y<&?KFx{n_!5C9VqLA*CP@zhXs2t#dmrAKu?d_ y^&_r5_e@uesG}CO*g!3o?-kB+I^cA`>44J#rvpw0oDMi0a5~_0!0Eu>4*Uj$LD0AW literal 0 HcmV?d00001 diff --git a/dthm4kaiako/static/js/project.js b/dthm4kaiako/static/js/project.js new file mode 100644 index 000000000..d26d23b9b --- /dev/null +++ b/dthm4kaiako/static/js/project.js @@ -0,0 +1 @@ +/* Project specific Javascript goes here. */ diff --git a/dthm4kaiako/static/scss/project.scss b/dthm4kaiako/static/scss/project.scss new file mode 100644 index 000000000..3c8f26169 --- /dev/null +++ b/dthm4kaiako/static/scss/project.scss @@ -0,0 +1,37 @@ + + + + +// project specific CSS goes here + +//////////////////////////////// + //Variables// +//////////////////////////////// + +// Alert colors + +$white: #fff; +$mint-green: #d6e9c6; +$black: #000; +$pink: #f2dede; +$dark-pink: #eed3d7; +$red: #b94a48; + +//////////////////////////////// + //Alerts// +//////////////////////////////// + +// bootstrap alert CSS, translated to the django-standard levels of +// debug, info, success, warning, error + +.alert-debug { + background-color: $white; + border-color: $mint-green; + color: $black; +} + +.alert-error { + background-color: $pink; + border-color: $dark-pink; + color: $red; +} diff --git a/dthm4kaiako/templates/403_csrf.html b/dthm4kaiako/templates/403_csrf.html new file mode 100644 index 000000000..77db8ae73 --- /dev/null +++ b/dthm4kaiako/templates/403_csrf.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} + +{% block title %}Forbidden (403){% endblock %} + +{% block content %} +

    Forbidden (403)

    + +

    CSRF verification failed. Request aborted.

    +{% endblock content %} diff --git a/dthm4kaiako/templates/404.html b/dthm4kaiako/templates/404.html new file mode 100644 index 000000000..98327cdae --- /dev/null +++ b/dthm4kaiako/templates/404.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} + +{% block title %}Page not found{% endblock %} + +{% block content %} +

    Page not found

    + +

    This is not the page you were looking for.

    +{% endblock content %} diff --git a/dthm4kaiako/templates/500.html b/dthm4kaiako/templates/500.html new file mode 100644 index 000000000..21df60665 --- /dev/null +++ b/dthm4kaiako/templates/500.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} + +{% block title %}Server Error{% endblock %} + +{% block content %} +

    Ooops!!! 500

    + +

    Looks like something went wrong!

    + +

    We track these errors automatically, but if the problem persists feel free to contact us. In the meantime, try refreshing.

    +{% endblock content %} + + diff --git a/dthm4kaiako/templates/account/account_inactive.html b/dthm4kaiako/templates/account/account_inactive.html new file mode 100644 index 000000000..17c21577a --- /dev/null +++ b/dthm4kaiako/templates/account/account_inactive.html @@ -0,0 +1,12 @@ +{% extends "account/base.html" %} + +{% load i18n %} + +{% block head_title %}{% trans "Account Inactive" %}{% endblock %} + +{% block inner %} +

    {% trans "Account Inactive" %}

    + +

    {% trans "This account is inactive." %}

    +{% endblock %} + diff --git a/dthm4kaiako/templates/account/base.html b/dthm4kaiako/templates/account/base.html new file mode 100644 index 000000000..8e1f260ea --- /dev/null +++ b/dthm4kaiako/templates/account/base.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} +{% block title %}{% block head_title %}{% endblock head_title %}{% endblock title %} + +{% block content %} +
    +
    + {% block inner %}{% endblock %} +
    +
    +{% endblock %} diff --git a/dthm4kaiako/templates/account/email.html b/dthm4kaiako/templates/account/email.html new file mode 100644 index 000000000..0dc8d145f --- /dev/null +++ b/dthm4kaiako/templates/account/email.html @@ -0,0 +1,80 @@ + +{% extends "account/base.html" %} + +{% load i18n %} +{% load crispy_forms_tags %} + +{% block head_title %}{% trans "Account" %}{% endblock %} + +{% block inner %} +

    {% trans "E-mail Addresses" %}

    + +{% if user.emailaddress_set.all %} +

    {% trans 'The following e-mail addresses are associated with your account:' %}

    + + + +{% else %} +

    {% trans 'Warning:'%} {% trans "You currently do not have any e-mail address set up. You should really add an e-mail address so you can receive notifications, reset your password, etc." %}

    + +{% endif %} + + +

    {% trans "Add E-mail Address" %}

    + +
    + {% csrf_token %} + {{ form|crispy }} + +
    + +{% endblock %} + + +{% block javascript %} +{{ block.super }} + +{% endblock %} + diff --git a/dthm4kaiako/templates/account/email_confirm.html b/dthm4kaiako/templates/account/email_confirm.html new file mode 100644 index 000000000..46c781263 --- /dev/null +++ b/dthm4kaiako/templates/account/email_confirm.html @@ -0,0 +1,32 @@ +{% extends "account/base.html" %} + +{% load i18n %} +{% load account %} + +{% block head_title %}{% trans "Confirm E-mail Address" %}{% endblock %} + + +{% block inner %} +

    {% trans "Confirm E-mail Address" %}

    + +{% if confirmation %} + +{% user_display confirmation.email_address.user as user_display %} + +

    {% blocktrans with confirmation.email_address.email as email %}Please confirm that {{ email }} is an e-mail address for user {{ user_display }}.{% endblocktrans %}

    + +
    +{% csrf_token %} + +
    + +{% else %} + +{% url 'account_email' as email_url %} + +

    {% blocktrans %}This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request.{% endblocktrans %}

    + +{% endif %} + +{% endblock %} + diff --git a/dthm4kaiako/templates/account/login.html b/dthm4kaiako/templates/account/login.html new file mode 100644 index 000000000..2cadea6a0 --- /dev/null +++ b/dthm4kaiako/templates/account/login.html @@ -0,0 +1,48 @@ +{% extends "account/base.html" %} + +{% load i18n %} +{% load account socialaccount %} +{% load crispy_forms_tags %} + +{% block head_title %}{% trans "Sign In" %}{% endblock %} + +{% block inner %} + +

    {% trans "Sign In" %}

    + +{% get_providers as socialaccount_providers %} + +{% if socialaccount_providers %} +

    {% blocktrans with site.name as site_name %}Please sign in with one +of your existing third party accounts. Or, sign up +for a {{ site_name }} account and sign in below:{% endblocktrans %}

    + +
    + +
      + {% include "socialaccount/snippets/provider_list.html" with process="login" %} +
    + + + +
    + +{% include "socialaccount/snippets/login_extra.html" %} + +{% else %} +

    {% blocktrans %}If you have not created an account yet, then please +sign up first.{% endblocktrans %}

    +{% endif %} + + + +{% endblock %} + diff --git a/dthm4kaiako/templates/account/logout.html b/dthm4kaiako/templates/account/logout.html new file mode 100644 index 000000000..8e2e67548 --- /dev/null +++ b/dthm4kaiako/templates/account/logout.html @@ -0,0 +1,22 @@ +{% extends "account/base.html" %} + +{% load i18n %} + +{% block head_title %}{% trans "Sign Out" %}{% endblock %} + +{% block inner %} +

    {% trans "Sign Out" %}

    + +

    {% trans 'Are you sure you want to sign out?' %}

    + +
    + {% csrf_token %} + {% if redirect_field_value %} + + {% endif %} + +
    + + +{% endblock %} + diff --git a/dthm4kaiako/templates/account/password_change.html b/dthm4kaiako/templates/account/password_change.html new file mode 100644 index 000000000..b72ca068b --- /dev/null +++ b/dthm4kaiako/templates/account/password_change.html @@ -0,0 +1,17 @@ +{% extends "account/base.html" %} + +{% load i18n %} +{% load crispy_forms_tags %} + +{% block head_title %}{% trans "Change Password" %}{% endblock %} + +{% block inner %} +

    {% trans "Change Password" %}

    + +
    + {% csrf_token %} + {{ form|crispy }} + +
    +{% endblock %} + diff --git a/dthm4kaiako/templates/account/password_reset.html b/dthm4kaiako/templates/account/password_reset.html new file mode 100644 index 000000000..845bbda73 --- /dev/null +++ b/dthm4kaiako/templates/account/password_reset.html @@ -0,0 +1,26 @@ +{% extends "account/base.html" %} + +{% load i18n %} +{% load account %} +{% load crispy_forms_tags %} + +{% block head_title %}{% trans "Password Reset" %}{% endblock %} + +{% block inner %} + +

    {% trans "Password Reset" %}

    + {% if user.is_authenticated %} + {% include "account/snippets/already_logged_in.html" %} + {% endif %} + +

    {% trans "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it." %}

    + +
    + {% csrf_token %} + {{ form|crispy }} + +
    + +

    {% blocktrans %}Please contact us if you have any trouble resetting your password.{% endblocktrans %}

    +{% endblock %} + diff --git a/dthm4kaiako/templates/account/password_reset_done.html b/dthm4kaiako/templates/account/password_reset_done.html new file mode 100644 index 000000000..c59534afc --- /dev/null +++ b/dthm4kaiako/templates/account/password_reset_done.html @@ -0,0 +1,17 @@ +{% extends "account/base.html" %} + +{% load i18n %} +{% load account %} + +{% block head_title %}{% trans "Password Reset" %}{% endblock %} + +{% block inner %} +

    {% trans "Password Reset" %}

    + + {% if user.is_authenticated %} + {% include "account/snippets/already_logged_in.html" %} + {% endif %} + +

    {% blocktrans %}We have sent you an e-mail. Please contact us if you do not receive it within a few minutes.{% endblocktrans %}

    +{% endblock %} + diff --git a/dthm4kaiako/templates/account/password_reset_from_key.html b/dthm4kaiako/templates/account/password_reset_from_key.html new file mode 100644 index 000000000..0bd60d690 --- /dev/null +++ b/dthm4kaiako/templates/account/password_reset_from_key.html @@ -0,0 +1,25 @@ +{% extends "account/base.html" %} + +{% load i18n %} +{% load crispy_forms_tags %} +{% block head_title %}{% trans "Change Password" %}{% endblock %} + +{% block inner %} +

    {% if token_fail %}{% trans "Bad Token" %}{% else %}{% trans "Change Password" %}{% endif %}

    + + {% if token_fail %} + {% url 'account_reset_password' as passwd_reset_url %} +

    {% blocktrans %}The password reset link was invalid, possibly because it has already been used. Please request a new password reset.{% endblocktrans %}

    + {% else %} + {% if form %} +
    + {% csrf_token %} + {{ form|crispy }} + +
    + {% else %} +

    {% trans 'Your password is now changed.' %}

    + {% endif %} + {% endif %} +{% endblock %} + diff --git a/dthm4kaiako/templates/account/password_reset_from_key_done.html b/dthm4kaiako/templates/account/password_reset_from_key_done.html new file mode 100644 index 000000000..89be086f1 --- /dev/null +++ b/dthm4kaiako/templates/account/password_reset_from_key_done.html @@ -0,0 +1,10 @@ +{% extends "account/base.html" %} + +{% load i18n %} +{% block head_title %}{% trans "Change Password" %}{% endblock %} + +{% block inner %} +

    {% trans "Change Password" %}

    +

    {% trans 'Your password is now changed.' %}

    +{% endblock %} + diff --git a/dthm4kaiako/templates/account/password_set.html b/dthm4kaiako/templates/account/password_set.html new file mode 100644 index 000000000..7786e9e53 --- /dev/null +++ b/dthm4kaiako/templates/account/password_set.html @@ -0,0 +1,17 @@ +{% extends "account/base.html" %} + +{% load i18n %} +{% load crispy_forms_tags %} + +{% block head_title %}{% trans "Set Password" %}{% endblock %} + +{% block inner %} +

    {% trans "Set Password" %}

    + +
    + {% csrf_token %} + {{ form|crispy }} + +
    +{% endblock %} + diff --git a/dthm4kaiako/templates/account/signup.html b/dthm4kaiako/templates/account/signup.html new file mode 100644 index 000000000..6a2954eb7 --- /dev/null +++ b/dthm4kaiako/templates/account/signup.html @@ -0,0 +1,23 @@ +{% extends "account/base.html" %} + +{% load i18n %} +{% load crispy_forms_tags %} + +{% block head_title %}{% trans "Signup" %}{% endblock %} + +{% block inner %} +

    {% trans "Sign Up" %}

    + +

    {% blocktrans %}Already have an account? Then please sign in.{% endblocktrans %}

    + + + +{% endblock %} + diff --git a/dthm4kaiako/templates/account/signup_closed.html b/dthm4kaiako/templates/account/signup_closed.html new file mode 100644 index 000000000..2322f176f --- /dev/null +++ b/dthm4kaiako/templates/account/signup_closed.html @@ -0,0 +1,12 @@ +{% extends "account/base.html" %} + +{% load i18n %} + +{% block head_title %}{% trans "Sign Up Closed" %}{% endblock %} + +{% block inner %} +

    {% trans "Sign Up Closed" %}

    + +

    {% trans "We are sorry, but the sign up is currently closed." %}

    +{% endblock %} + diff --git a/dthm4kaiako/templates/account/verification_sent.html b/dthm4kaiako/templates/account/verification_sent.html new file mode 100644 index 000000000..ad093fd44 --- /dev/null +++ b/dthm4kaiako/templates/account/verification_sent.html @@ -0,0 +1,13 @@ +{% extends "account/base.html" %} + +{% load i18n %} + +{% block head_title %}{% trans "Verify Your E-mail Address" %}{% endblock %} + +{% block inner %} +

    {% trans "Verify Your E-mail Address" %}

    + +

    {% blocktrans %}We have sent an e-mail to you for verification. Follow the link provided to finalize the signup process. Please contact us if you do not receive it within a few minutes.{% endblocktrans %}

    + +{% endblock %} + diff --git a/dthm4kaiako/templates/account/verified_email_required.html b/dthm4kaiako/templates/account/verified_email_required.html new file mode 100644 index 000000000..09d4fde79 --- /dev/null +++ b/dthm4kaiako/templates/account/verified_email_required.html @@ -0,0 +1,24 @@ +{% extends "account/base.html" %} + +{% load i18n %} + +{% block head_title %}{% trans "Verify Your E-mail Address" %}{% endblock %} + +{% block inner %} +

    {% trans "Verify Your E-mail Address" %}

    + +{% url 'account_email' as email_url %} + +

    {% blocktrans %}This part of the site requires us to verify that +you are who you claim to be. For this purpose, we require that you +verify ownership of your e-mail address. {% endblocktrans %}

    + +

    {% blocktrans %}We have sent an e-mail to you for +verification. Please click on the link inside this e-mail. Please +contact us if you do not receive it within a few minutes.{% endblocktrans %}

    + +

    {% blocktrans %}Note: you can still change your e-mail address.{% endblocktrans %}

    + + +{% endblock %} + diff --git a/dthm4kaiako/templates/base.html b/dthm4kaiako/templates/base.html new file mode 100644 index 000000000..068be30a7 --- /dev/null +++ b/dthm4kaiako/templates/base.html @@ -0,0 +1,90 @@ +{% load static i18n %} + + + + + + + + {% block title %}dthm4kaiako.ac.nz{% endblock title %} + + + + + + + + + + + + +
    + + +
    + +
    + + {% if messages %} + {% for message in messages %} +
    {{ message }}
    + {% endfor %} + {% endif %} + + {% block content %} +

    Hello, world!

    + {% endblock content %} + +
    + + {% block modal %}{% endblock modal %} + + + + + + + + diff --git a/dthm4kaiako/templates/pages/about.html b/dthm4kaiako/templates/pages/about.html new file mode 100644 index 000000000..63913c188 --- /dev/null +++ b/dthm4kaiako/templates/pages/about.html @@ -0,0 +1 @@ +{% extends "base.html" %} \ No newline at end of file diff --git a/dthm4kaiako/templates/pages/home.html b/dthm4kaiako/templates/pages/home.html new file mode 100644 index 000000000..63913c188 --- /dev/null +++ b/dthm4kaiako/templates/pages/home.html @@ -0,0 +1 @@ +{% extends "base.html" %} \ No newline at end of file diff --git a/dthm4kaiako/templates/users/user_detail.html b/dthm4kaiako/templates/users/user_detail.html new file mode 100644 index 000000000..e86eda114 --- /dev/null +++ b/dthm4kaiako/templates/users/user_detail.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %}User: {{ object.username }}{% endblock %} + +{% block content %} +
    + +
    +
    + +

    {{ object.username }}

    + {% if object.name %} +

    {{ object.name }}

    + {% endif %} +
    +
    + +{% if object == request.user %} + +
    + +
    + My Info + E-Mail + +
    + +
    + +{% endif %} + + +
    +{% endblock content %} + diff --git a/dthm4kaiako/templates/users/user_form.html b/dthm4kaiako/templates/users/user_form.html new file mode 100644 index 000000000..a054047b9 --- /dev/null +++ b/dthm4kaiako/templates/users/user_form.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} +{% load crispy_forms_tags %} + +{% block title %}{{ user.username }}{% endblock %} + +{% block content %} +

    {{ user.username }}

    +
    + {% csrf_token %} + {{ form|crispy }} +
    +
    + +
    +
    +
    +{% endblock %} diff --git a/dthm4kaiako/templates/users/user_list.html b/dthm4kaiako/templates/users/user_list.html new file mode 100644 index 000000000..47d3f8599 --- /dev/null +++ b/dthm4kaiako/templates/users/user_list.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} +{% load static i18n %} +{% block title %}Members{% endblock %} + +{% block content %} +
    +

    Users

    + +
    + {% for user in user_list %} + +

    {{ user.username }}

    +
    + {% endfor %} +
    +
    +{% endblock content %} diff --git a/dthm4kaiako/users/__init__.py b/dthm4kaiako/users/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/dthm4kaiako/users/adapters.py b/dthm4kaiako/users/adapters.py new file mode 100644 index 000000000..9361d6eca --- /dev/null +++ b/dthm4kaiako/users/adapters.py @@ -0,0 +1,18 @@ +from typing import Any + +from allauth.account.adapter import DefaultAccountAdapter +from allauth.socialaccount.adapter import DefaultSocialAccountAdapter +from django.conf import settings +from django.http import HttpRequest + + +class AccountAdapter(DefaultAccountAdapter): + + def is_open_for_signup(self, request: HttpRequest): + return getattr(settings, "ACCOUNT_ALLOW_REGISTRATION", True) + + +class SocialAccountAdapter(DefaultSocialAccountAdapter): + + def is_open_for_signup(self, request: HttpRequest, sociallogin: Any): + return getattr(settings, "ACCOUNT_ALLOW_REGISTRATION", True) diff --git a/dthm4kaiako/users/admin.py b/dthm4kaiako/users/admin.py new file mode 100644 index 000000000..1b8e658a9 --- /dev/null +++ b/dthm4kaiako/users/admin.py @@ -0,0 +1,17 @@ +from django.contrib import admin +from django.contrib.auth import admin as auth_admin +from django.contrib.auth import get_user_model + +from users.forms import UserChangeForm, UserCreationForm + +User = get_user_model() + + +@admin.register(User) +class UserAdmin(auth_admin.UserAdmin): + + form = UserChangeForm + add_form = UserCreationForm + fieldsets = (("User", {"fields": ("name",)}),) + auth_admin.UserAdmin.fieldsets + list_display = ["username", "name", "is_superuser"] + search_fields = ["name"] diff --git a/dthm4kaiako/users/apps.py b/dthm4kaiako/users/apps.py new file mode 100644 index 000000000..62d4968eb --- /dev/null +++ b/dthm4kaiako/users/apps.py @@ -0,0 +1,13 @@ +from django.apps import AppConfig + + +class UsersAppConfig(AppConfig): + + name = "users" + verbose_name = "Users" + + def ready(self): + try: + import users.signals # noqa F401 + except ImportError: + pass diff --git a/dthm4kaiako/users/forms.py b/dthm4kaiako/users/forms.py new file mode 100644 index 000000000..7bba81ff3 --- /dev/null +++ b/dthm4kaiako/users/forms.py @@ -0,0 +1,31 @@ +from django.contrib.auth import get_user_model, forms +from django.core.exceptions import ValidationError +from django.utils.translation import ugettext_lazy as _ + +User = get_user_model() + + +class UserChangeForm(forms.UserChangeForm): + + class Meta(forms.UserChangeForm.Meta): + model = User + + +class UserCreationForm(forms.UserCreationForm): + + error_message = forms.UserCreationForm.error_messages.update( + {"duplicate_username": _("This username has already been taken.")} + ) + + class Meta(forms.UserCreationForm.Meta): + model = User + + def clean_username(self): + username = self.cleaned_data["username"] + + try: + User.objects.get(username=username) + except User.DoesNotExist: + return username + + raise ValidationError(self.error_messages["duplicate_username"]) diff --git a/dthm4kaiako/users/migrations/0001_initial.py b/dthm4kaiako/users/migrations/0001_initial.py new file mode 100644 index 000000000..c9d890568 --- /dev/null +++ b/dthm4kaiako/users/migrations/0001_initial.py @@ -0,0 +1,132 @@ +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [("auth", "0008_alter_user_username_max_length")] + + operations = [ + migrations.CreateModel( + name="User", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("password", models.CharField(max_length=128, verbose_name="password")), + ( + "last_login", + models.DateTimeField( + blank=True, null=True, 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( + error_messages={ + "unique": "A user with that username already exists." + }, + help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", + max_length=150, + unique=True, + validators=[ + django.contrib.auth.validators.UnicodeUsernameValidator() + ], + verbose_name="username", + ), + ), + ( + "first_name", + models.CharField( + blank=True, max_length=30, verbose_name="first name" + ), + ), + ( + "last_name", + models.CharField( + blank=True, max_length=150, verbose_name="last name" + ), + ), + ( + "email", + models.EmailField( + blank=True, max_length=254, verbose_name="email address" + ), + ), + ( + "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" + ), + ), + ( + "name", + models.CharField( + blank=True, max_length=255, verbose_name="Name of User" + ), + ), + ( + "groups", + models.ManyToManyField( + blank=True, + help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.", + related_name="user_set", + related_query_name="user", + to="auth.Group", + verbose_name="groups", + ), + ), + ( + "user_permissions", + models.ManyToManyField( + blank=True, + help_text="Specific permissions for this user.", + related_name="user_set", + related_query_name="user", + to="auth.Permission", + verbose_name="user permissions", + ), + ), + ], + options={ + "verbose_name_plural": "users", + "verbose_name": "user", + "abstract": False, + }, + managers=[("objects", django.contrib.auth.models.UserManager())], + ) + ] diff --git a/dthm4kaiako/users/migrations/__init__.py b/dthm4kaiako/users/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/dthm4kaiako/users/models.py b/dthm4kaiako/users/models.py new file mode 100644 index 000000000..8f07b15a1 --- /dev/null +++ b/dthm4kaiako/users/models.py @@ -0,0 +1,14 @@ +from django.contrib.auth.models import AbstractUser +from django.db.models import CharField +from django.urls import reverse +from django.utils.translation import ugettext_lazy as _ + + +class User(AbstractUser): + + # First Name and Last Name do not cover name patterns + # around the globe. + name = CharField(_("Name of User"), blank=True, max_length=255) + + def get_absolute_url(self): + return reverse("users:detail", kwargs={"username": self.username}) diff --git a/dthm4kaiako/users/tests/__init__.py b/dthm4kaiako/users/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/dthm4kaiako/users/tests/factories.py b/dthm4kaiako/users/tests/factories.py new file mode 100644 index 000000000..009905768 --- /dev/null +++ b/dthm4kaiako/users/tests/factories.py @@ -0,0 +1,29 @@ +from typing import Any, Sequence + +from django.contrib.auth import get_user_model +from factory import DjangoModelFactory, Faker, post_generation + + +class UserFactory(DjangoModelFactory): + + username = Faker("user_name") + email = Faker("email") + name = Faker("name") + + @post_generation + def password(self, create: bool, extracted: Sequence[Any], **kwargs): + password = Faker( + "password", + length=42, + special_chars=True, + digits=True, + upper_case=True, + lower_case=True, + ).generate( + extra_kwargs={} + ) + self.set_password(password) + + class Meta: + model = get_user_model() + django_get_or_create = ["username"] diff --git a/dthm4kaiako/users/tests/test_forms.py b/dthm4kaiako/users/tests/test_forms.py new file mode 100644 index 000000000..3825f56a3 --- /dev/null +++ b/dthm4kaiako/users/tests/test_forms.py @@ -0,0 +1,41 @@ +import pytest + +from users.forms import UserCreationForm +from users.tests.factories import UserFactory + +pytestmark = pytest.mark.django_db + + +class TestUserCreationForm: + + def test_clean_username(self): + # A user with proto_user params does not exist yet. + proto_user = UserFactory.build() + + form = UserCreationForm( + { + "username": proto_user.username, + "password1": proto_user._password, + "password2": proto_user._password, + } + ) + + assert form.is_valid() + assert form.clean_username() == proto_user.username + + # Creating a user. + form.save() + + # The user with proto_user params already exists, + # hence cannot be created. + form = UserCreationForm( + { + "username": proto_user.username, + "password1": proto_user._password, + "password2": proto_user._password, + } + ) + + assert not form.is_valid() + assert len(form.errors) == 1 + assert "username" in form.errors diff --git a/dthm4kaiako/users/tests/test_models.py b/dthm4kaiako/users/tests/test_models.py new file mode 100644 index 000000000..548636323 --- /dev/null +++ b/dthm4kaiako/users/tests/test_models.py @@ -0,0 +1,8 @@ +import pytest +from django.conf import settings + +pytestmark = pytest.mark.django_db + + +def test_user_get_absolute_url(user: settings.AUTH_USER_MODEL): + assert user.get_absolute_url() == f"/users/{user.username}/" diff --git a/dthm4kaiako/users/tests/test_urls.py b/dthm4kaiako/users/tests/test_urls.py new file mode 100644 index 000000000..20bd3dbad --- /dev/null +++ b/dthm4kaiako/users/tests/test_urls.py @@ -0,0 +1,28 @@ +import pytest +from django.conf import settings +from django.urls import reverse, resolve + +pytestmark = pytest.mark.django_db + + +def test_detail(user: settings.AUTH_USER_MODEL): + assert ( + reverse("users:detail", kwargs={"username": user.username}) + == f"/users/{user.username}/" + ) + assert resolve(f"/users/{user.username}/").view_name == "users:detail" + + +def test_list(): + assert reverse("users:list") == "/users/" + assert resolve("/users/").view_name == "users:list" + + +def test_update(): + assert reverse("users:update") == "/users/~update/" + assert resolve("/users/~update/").view_name == "users:update" + + +def test_redirect(): + assert reverse("users:redirect") == "/users/~redirect/" + assert resolve("/users/~redirect/").view_name == "users:redirect" diff --git a/dthm4kaiako/users/tests/test_views.py b/dthm4kaiako/users/tests/test_views.py new file mode 100644 index 000000000..f37d7ff4e --- /dev/null +++ b/dthm4kaiako/users/tests/test_views.py @@ -0,0 +1,53 @@ +import pytest +from django.conf import settings +from django.test import RequestFactory + +from users.views import UserRedirectView, UserUpdateView + +pytestmark = pytest.mark.django_db + + +class TestUserUpdateView: + """ + TODO: + extracting view initialization code as class-scoped fixture + would be great if only pytest-django supported non-function-scoped + fixture db access -- this is a work-in-progress for now: + https://github.com/pytest-dev/pytest-django/pull/258 + """ + + def test_get_success_url( + self, user: settings.AUTH_USER_MODEL, request_factory: RequestFactory + ): + view = UserUpdateView() + request = request_factory.get("/fake-url/") + request.user = user + + view.request = request + + assert view.get_success_url() == f"/users/{user.username}/" + + def test_get_object( + self, user: settings.AUTH_USER_MODEL, request_factory: RequestFactory + ): + view = UserUpdateView() + request = request_factory.get("/fake-url/") + request.user = user + + view.request = request + + assert view.get_object() == user + + +class TestUserRedirectView: + + def test_get_redirect_url( + self, user: settings.AUTH_USER_MODEL, request_factory: RequestFactory + ): + view = UserRedirectView() + request = request_factory.get("/fake-url") + request.user = user + + view.request = request + + assert view.get_redirect_url() == f"/users/{user.username}/" diff --git a/dthm4kaiako/users/urls.py b/dthm4kaiako/users/urls.py new file mode 100644 index 000000000..90ca5d545 --- /dev/null +++ b/dthm4kaiako/users/urls.py @@ -0,0 +1,16 @@ +from django.urls import path + +from users.views import ( + user_list_view, + user_redirect_view, + user_update_view, + user_detail_view, +) + +app_name = "users" +urlpatterns = [ + path("", view=user_list_view, name="list"), + path("~redirect/", view=user_redirect_view, name="redirect"), + path("~update/", view=user_update_view, name="update"), + path("/", view=user_detail_view, name="detail"), +] diff --git a/dthm4kaiako/users/views.py b/dthm4kaiako/users/views.py new file mode 100644 index 000000000..35e26e94f --- /dev/null +++ b/dthm4kaiako/users/views.py @@ -0,0 +1,52 @@ +from django.contrib.auth import get_user_model +from django.contrib.auth.mixins import LoginRequiredMixin +from django.urls import reverse +from django.views.generic import DetailView, ListView, RedirectView, UpdateView + +User = get_user_model() + + +class UserDetailView(LoginRequiredMixin, DetailView): + + model = User + slug_field = "username" + slug_url_kwarg = "username" + + +user_detail_view = UserDetailView.as_view() + + +class UserListView(LoginRequiredMixin, ListView): + + model = User + slug_field = "username" + slug_url_kwarg = "username" + + +user_list_view = UserListView.as_view() + + +class UserUpdateView(LoginRequiredMixin, UpdateView): + + model = User + fields = ["name"] + + def get_success_url(self): + return reverse("users:detail", kwargs={"username": self.request.user.username}) + + def get_object(self): + return User.objects.get(username=self.request.user.username) + + +user_update_view = UserUpdateView.as_view() + + +class UserRedirectView(LoginRequiredMixin, RedirectView): + + permanent = False + + def get_redirect_url(self): + return reverse("users:detail", kwargs={"username": self.request.user.username}) + + +user_redirect_view = UserRedirectView.as_view() diff --git a/infrastructure/nginx/Dockerfile b/infrastructure/nginx/Dockerfile index 5d2199e2c..dcb4696d2 100644 --- a/infrastructure/nginx/Dockerfile +++ b/infrastructure/nginx/Dockerfile @@ -8,7 +8,7 @@ RUN apt-get update \ libgif-dev \ && rm -rf /var/lib/apt/lists/* -ADD cs4teachers/package.json /app/ +ADD dthm4kaiako/package.json /app/ RUN npm install -ADD ./cs4teachers/ /app/ +ADD ./dthm4kaiako/ /app/ ADD infrastructure/nginx/nginx.conf /etc/nginx/nginx.conf diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 000000000..5b4369b89 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +DJANGO_SETTINGS_MODULE=config.settings.test diff --git a/requirements/base.txt b/requirements/base.txt index 45a6f2457..09ae2dcd6 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,27 +1,16 @@ -# Wheel 0.25+ needed to install certain packages on CPython 3.5+ -# like Pillow and psycopg2 -# See http://bitly.com/wheel-building-fails-CPython-35 -# Verified bug on Python 3.5.1 -wheel==0.30.0 +pytz==2018.9 # https://github.com/stub42/pytz +python-slugify==2.0.1 # https://github.com/un33k/python-slugify +Pillow==5.4.1 # https://github.com/python-pillow/Pillow +argon2-cffi==18.3.0 # https://github.com/hynek/argon2_cffi +redis>=2.10.6, < 3 # pyup: < 3 # https://github.com/antirez/redis # Django -django-autoslug==1.9.3 -django-grappelli==2.11.1 +# ------------------------------------------------------------------------------ +django-model-utils==3.1.2 # https://github.com/jazzband/django-model-utils +django-allauth==0.38.0 # https://github.com/pennersr/django-allauth +django-crispy-forms==1.7.2 # https://github.com/django-crispy-forms/django-crispy-forms +django-redis==4.10.0 # https://github.com/niwinz/django-redis -# Required for ImageField on models -Pillow==5.0.0 - -# Users -django-allauth==0.35.0 - -# Password storage -argon2-cffi==18.1.0 - -# Maps -django-google-maps==0.10.1 - -# Text editor -django-tinymce==2.7.0 - -# Email -django-anymail==2.0 +# Django REST Framework +djangorestframework==3.9.0 # https://github.com/encode/django-rest-framework +coreapi==2.3.3 # https://github.com/core-api/python-client diff --git a/requirements/local.txt b/requirements/local.txt index c0254a6cb..dd04559b1 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -1,6 +1,27 @@ -# Local development dependencies go here --r base.txt --r testing.txt +-r ./base.txt -# Debugging Tools -django-debug-toolbar==1.9.1 +Werkzeug==0.14.1 # https://github.com/pallets/werkzeug +ipdb==0.11 # https://github.com/gotcha/ipdb +Sphinx==1.8.3 # https://github.com/sphinx-doc/sphinx +psycopg2-binary==2.7.6.1 # https://github.com/psycopg/psycopg2 + +# Testing +# ------------------------------------------------------------------------------ +mypy==0.650 # https://github.com/python/mypy +pytest==4.1.1 # https://github.com/pytest-dev/pytest +pytest-sugar==0.9.2 # https://github.com/Frozenball/pytest-sugar + +# Code quality +# ------------------------------------------------------------------------------ +flake8==3.6.0 # https://github.com/PyCQA/flake8 +coverage==4.5.2 # https://github.com/nedbat/coveragepy +pydocstyle==2.1.1 + +# Django +# ------------------------------------------------------------------------------ +factory-boy==2.11.1 # https://github.com/FactoryBoy/factory_boy + +django-debug-toolbar==1.11 # https://github.com/jazzband/django-debug-toolbar +django-extensions==2.1.4 # https://github.com/django-extensions/django-extensions +django-coverage-plugin==1.6.0 # https://github.com/nedbat/django_coverage_plugin +pytest-django==3.4.5 # https://github.com/pytest-dev/pytest-django diff --git a/requirements/production.txt b/requirements/production.txt index 143679667..ae96ad072 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -1,5 +1,10 @@ -# Pro-tip: Try not to put anything here. Avoid dependencies in -# production that aren't in development. --r base.txt +# PRECAUTION: avoid production dependencies that aren't in development -django-storages==1.6.5 +-r ./base.txt + +Collectfast==0.6.2 # https://github.com/antonagestam/collectfast + +# Django +# ------------------------------------------------------------------------------ +django-storages[google]==1.7.1 # https://github.com/jschneier/django-storages +django-anymail[mailgun]==5.0 # https://github.com/anymail/django-anymail diff --git a/requirements/testing.txt b/requirements/testing.txt deleted file mode 100644 index 539356482..000000000 --- a/requirements/testing.txt +++ /dev/null @@ -1,12 +0,0 @@ -# Testing development dependencies go here --r base.txt - -# Check Python style -flake8==3.5.0 -pydocstyle==2.1.1 - -# Coverage Tools -coverage==4.5.1 - -# Skip migration files for local testing -django-test-without-migrations==0.6 diff --git a/setup.cfg b/setup.cfg index 7f73dc29c..0473b6348 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,30 +1,31 @@ [flake8] +max-line-length = 119 exclude = - # No need to traverse our git or venv directories + .tox, .git, - venv, - docker_venv, - - # There's no value in checking cache directories - __pycache__, - - # These files are mostly or completely autogenerated - migrations, - manage.py, - cs4teachers/manage.py, - - # This contains our built project files and documentation - build, - - # This contains node_modules that we don't want to check + */migrations/*, + */static/CACHE/*, + docs, node_modules, + build, + temp, + */manage.py, -show-source = True -statistics = True -count = True +[pycodestyle] max-line-length = 119 - -[pydocstyle] -# Ignore following rules to allow Google Python Style docstrings add_ignore = D407,D413 -match_dir = (?!migrations|node_modules).* +exclude = .tox,.git,*/migrations/*,*/static/CACHE/*,docs,node_modules + +[mypy] +python_version = 3.6 +check_untyped_defs = True +ignore_errors = False +ignore_missing_imports = True +strict_optional = True +warn_unused_ignores = True +warn_redundant_casts = True +warn_unused_configs = True + +[mypy-*.migrations.*] +# Django migrations should not produce any errors: +ignore_errors = True From 8787a781f06ca7bd6c0f068f81adb64431044c74 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Thu, 17 Jan 2019 09:26:35 +1300 Subject: [PATCH 20/82] Create superuser account programmatically --- dev | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev b/dev index 8c600743b..9f0a3a1f1 100755 --- a/dev +++ b/dev @@ -153,7 +153,7 @@ cmd_createsuperuser() { defhelp -dev createsuperuser "Create superuser in Django system." cmd_sampledata() { - docker-compose exec django /docker_venv/bin/python3 ./manage.py shell -c "from django.contrib.auth.models import User; User.objects.filter(email='admin@example.com').delete(); User.objects.create_superuser('admin', 'admin@example.com', 'password')" + docker-compose exec django /docker_venv/bin/python3 ./manage.py shell -c "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.filter(email='admin@example.com').delete(); User.objects.create_superuser('admin', 'admin@example.com', 'password')" } defhelp -dev sampledata "Add sample data to website." From edf8022ea6a0e25c2c44eea29918383f41920a46 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Thu, 17 Jan 2019 09:28:54 +1300 Subject: [PATCH 21/82] Git ignore all vscode files --- .gitignore | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.gitignore b/.gitignore index a95e80ecf..c49b0ff69 100644 --- a/.gitignore +++ b/.gitignore @@ -152,13 +152,6 @@ typings/ ### VisualStudioCode template .vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - - - ### Windows template From 0b4e1e2f8278a0c9917534a2b5ed83445b1b1c28 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Thu, 17 Jan 2019 11:00:19 +1300 Subject: [PATCH 22/82] Add standard website layout --- .../scss/{project.scss => website.scss} | 10 ++- dthm4kaiako/templates/base.html | 65 ++++++++----------- 2 files changed, 31 insertions(+), 44 deletions(-) rename dthm4kaiako/static/scss/{project.scss => website.scss} (93%) diff --git a/dthm4kaiako/static/scss/project.scss b/dthm4kaiako/static/scss/website.scss similarity index 93% rename from dthm4kaiako/static/scss/project.scss rename to dthm4kaiako/static/scss/website.scss index 3c8f26169..a93c937d5 100644 --- a/dthm4kaiako/static/scss/project.scss +++ b/dthm4kaiako/static/scss/website.scss @@ -1,9 +1,3 @@ - - - - -// project specific CSS goes here - //////////////////////////////// //Variables// //////////////////////////////// @@ -35,3 +29,7 @@ $red: #b94a48; border-color: $dark-pink; color: $red; } + +body { + padding-top: 4.5rem; +} diff --git a/dthm4kaiako/templates/base.html b/dthm4kaiako/templates/base.html index 068be30a7..618c10d92 100644 --- a/dthm4kaiako/templates/base.html +++ b/dthm4kaiako/templates/base.html @@ -14,54 +14,43 @@ - + -
    -
    -
    {% if messages %} From 18ce4e7b9c01152142029640cb71de596106d0f9 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Thu, 17 Jan 2019 12:54:47 +1300 Subject: [PATCH 23/82] Create DTTA application with NewsArticle model --- dthm4kaiako/config/settings/base.py | 3 +- dthm4kaiako/config/urls.py | 35 +++++++++++---------- dthm4kaiako/dtta/__init__.py | 0 dthm4kaiako/dtta/admin.py | 5 +++ dthm4kaiako/dtta/apps.py | 6 ++++ dthm4kaiako/dtta/migrations/0001_initial.py | 24 ++++++++++++++ dthm4kaiako/dtta/migrations/__init__.py | 0 dthm4kaiako/dtta/models.py | 7 +++++ dthm4kaiako/dtta/views.py | 3 ++ dthm4kaiako/templates/base.html | 4 +-- requirements/base.txt | 1 + 11 files changed, 68 insertions(+), 20 deletions(-) create mode 100644 dthm4kaiako/dtta/__init__.py create mode 100644 dthm4kaiako/dtta/admin.py create mode 100644 dthm4kaiako/dtta/apps.py create mode 100644 dthm4kaiako/dtta/migrations/0001_initial.py create mode 100644 dthm4kaiako/dtta/migrations/__init__.py create mode 100644 dthm4kaiako/dtta/models.py create mode 100644 dthm4kaiako/dtta/views.py diff --git a/dthm4kaiako/config/settings/base.py b/dthm4kaiako/config/settings/base.py index 1c71b4b05..5f9f14216 100644 --- a/dthm4kaiako/config/settings/base.py +++ b/dthm4kaiako/config/settings/base.py @@ -67,10 +67,11 @@ 'allauth.account', 'allauth.socialaccount', 'rest_framework', + 'markdownx', ] LOCAL_APPS = [ 'users.apps.UsersAppConfig', - # Your stuff: custom apps go here + 'dtta.apps.DttaAppConfig', ] # https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS diff --git a/dthm4kaiako/config/urls.py b/dthm4kaiako/config/urls.py index 179dde94e..bbbc712c5 100644 --- a/dthm4kaiako/config/urls.py +++ b/dthm4kaiako/config/urls.py @@ -6,22 +6,23 @@ from django.views import defaults as default_views -admin.site.site_header = "dthm4kaiako.ac.nz" +admin.site.site_header = 'dthm4kaiako.ac.nz' urlpatterns = [ - path("", TemplateView.as_view(template_name="pages/home.html"), name="home"), + path('', TemplateView.as_view(template_name='pages/home.html'), name='home'), path( - "about/", - TemplateView.as_view(template_name="pages/about.html"), - name="about", + 'about/', + TemplateView.as_view(template_name='pages/about.html'), + name='about', ), # Django Admin, use {% url 'admin:index' %} path(settings.ADMIN_URL, admin.site.urls), # User management path( - "users/", - include("users.urls", namespace="users"), + 'users/', + include('users.urls', namespace='users'), ), - path("accounts/", include("allauth.urls")), + path('accounts/', include('allauth.urls')), + path('markdownx/', include('markdownx.urls')), # Your stuff: custom urls includes go here ] + static( settings.MEDIA_URL, document_root=settings.MEDIA_ROOT @@ -32,23 +33,23 @@ # these url in browser to see how these error pages look like. urlpatterns += [ path( - "400/", + '400/', default_views.bad_request, - kwargs={"exception": Exception("Bad Request!")}, + kwargs={'exception': Exception('Bad Request!')}, ), path( - "403/", + '403/', default_views.permission_denied, - kwargs={"exception": Exception("Permission Denied")}, + kwargs={'exception': Exception('Permission Denied')}, ), path( - "404/", + '404/', default_views.page_not_found, - kwargs={"exception": Exception("Page not Found")}, + kwargs={'exception': Exception('Page not Found')}, ), - path("500/", default_views.server_error), + path('500/', default_views.server_error), ] - if "debug_toolbar" in settings.INSTALLED_APPS: + if 'debug_toolbar' in settings.INSTALLED_APPS: import debug_toolbar - urlpatterns = [path("__debug__/", include(debug_toolbar.urls))] + urlpatterns + urlpatterns = [path('__debug__/', include(debug_toolbar.urls))] + urlpatterns diff --git a/dthm4kaiako/dtta/__init__.py b/dthm4kaiako/dtta/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/dthm4kaiako/dtta/admin.py b/dthm4kaiako/dtta/admin.py new file mode 100644 index 000000000..99ad796ec --- /dev/null +++ b/dthm4kaiako/dtta/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +from dtta.models import NewsArticle +from markdownx.admin import MarkdownxModelAdmin + +admin.site.register(NewsArticle, MarkdownxModelAdmin) diff --git a/dthm4kaiako/dtta/apps.py b/dthm4kaiako/dtta/apps.py new file mode 100644 index 000000000..dfef3b3c8 --- /dev/null +++ b/dthm4kaiako/dtta/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class DttaAppConfig(AppConfig): + name = 'dtta' + verbose_name = 'DTTA' diff --git a/dthm4kaiako/dtta/migrations/0001_initial.py b/dthm4kaiako/dtta/migrations/0001_initial.py new file mode 100644 index 000000000..758315004 --- /dev/null +++ b/dthm4kaiako/dtta/migrations/0001_initial.py @@ -0,0 +1,24 @@ +# Generated by Django 2.1.5 on 2019-01-16 23:45 + +from django.db import migrations, models +import markdownx.models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NewsArticle', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200)), + ('datetime', models.DateTimeField()), + ('content', markdownx.models.MarkdownxField()), + ], + ), + ] diff --git a/dthm4kaiako/dtta/migrations/__init__.py b/dthm4kaiako/dtta/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/dthm4kaiako/dtta/models.py b/dthm4kaiako/dtta/models.py new file mode 100644 index 000000000..301fe819b --- /dev/null +++ b/dthm4kaiako/dtta/models.py @@ -0,0 +1,7 @@ +from django.db import models +from markdownx.models import MarkdownxField + +class NewsArticle(models.Model): + title = models.CharField(max_length=200) + datetime = models.DateTimeField() + content = MarkdownxField() diff --git a/dthm4kaiako/dtta/views.py b/dthm4kaiako/dtta/views.py new file mode 100644 index 000000000..91ea44a21 --- /dev/null +++ b/dthm4kaiako/dtta/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/dthm4kaiako/templates/base.html b/dthm4kaiako/templates/base.html index 618c10d92..c95b5ff77 100644 --- a/dthm4kaiako/templates/base.html +++ b/dthm4kaiako/templates/base.html @@ -42,9 +42,9 @@ {% trans "Sign Out" %} {% else %} {# URL provided by django-allauth/account/urls.py #} - {% trans "Sign Up" %} + {# URL provided by django-allauth/account/urls.py #} - {% trans "Sign In" %} + {% endif %}
    diff --git a/requirements/base.txt b/requirements/base.txt index 09ae2dcd6..af001659f 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -10,6 +10,7 @@ django-model-utils==3.1.2 # https://github.com/jazzband/django-model-utils django-allauth==0.38.0 # https://github.com/pennersr/django-allauth django-crispy-forms==1.7.2 # https://github.com/django-crispy-forms/django-crispy-forms django-redis==4.10.0 # https://github.com/niwinz/django-redis +django-markdownx==2.0.28 # https://github.com/neutronX/django-markdownx # Django REST Framework djangorestframework==3.9.0 # https://github.com/encode/django-rest-framework From 964b2af70877c5ee9974b1074cbc85781867695c Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Thu, 17 Jan 2019 17:03:32 +1300 Subject: [PATCH 24/82] Add detail page for news articles --- dev | 6 ++-- .../tests => config/filters}/__init__.py | 0 dthm4kaiako/config/filters/markdown.py | 12 ++++++++ dthm4kaiako/config/settings/base.py | 5 +++- dthm4kaiako/config/urls.py | 15 ++-------- dthm4kaiako/config/wsgi.py | 1 - dthm4kaiako/dtta/models.py | 1 + dthm4kaiako/dtta/urls.py | 8 ++++++ dthm4kaiako/dtta/views.py | 28 +++++++++++++++++-- dthm4kaiako/templates/base.html | 4 +-- dthm4kaiako/templates/dtta/index.html | 26 +++++++++++++++++ .../templates/dtta/newsarticle_detail.html | 9 ++++++ dthm4kaiako/tests/__init__.py | 0 dthm4kaiako/tests/users/__init__.py | 0 .../{users/tests => tests/users}/factories.py | 0 .../tests => tests/users}/test_forms.py | 2 +- .../tests => tests/users}/test_models.py | 0 .../{users/tests => tests/users}/test_urls.py | 0 .../tests => tests/users}/test_views.py | 0 setup.cfg | 11 +++++++- 20 files changed, 105 insertions(+), 23 deletions(-) rename dthm4kaiako/{users/tests => config/filters}/__init__.py (100%) create mode 100644 dthm4kaiako/config/filters/markdown.py create mode 100644 dthm4kaiako/dtta/urls.py create mode 100644 dthm4kaiako/templates/dtta/index.html create mode 100644 dthm4kaiako/templates/dtta/newsarticle_detail.html create mode 100644 dthm4kaiako/tests/__init__.py create mode 100644 dthm4kaiako/tests/users/__init__.py rename dthm4kaiako/{users/tests => tests/users}/factories.py (100%) rename dthm4kaiako/{users/tests => tests/users}/test_forms.py (95%) rename dthm4kaiako/{users/tests => tests/users}/test_models.py (100%) rename dthm4kaiako/{users/tests => tests/users}/test_urls.py (100%) rename dthm4kaiako/{users/tests => tests/users}/test_views.py (100%) diff --git a/dev b/dev index 9f0a3a1f1..f2b299c7f 100755 --- a/dev +++ b/dev @@ -180,14 +180,14 @@ defhelp -dev style 'Run style checks.' # Run test suite cmd_test_suite() { echo "Running test suite..." - docker-compose exec django /docker_venv/bin/coverage run --rcfile=/dthm4kaiako/.coveragerc ./manage.py test --settings=config.settings.testing --pattern "test_*.py" -v 3 --nomigrations + docker-compose exec django /docker_venv/bin/coverage run --rcfile=/dthm4kaiako/.coveragerc ./manage.py test --settings=config.settings.test --pattern "test_*.py" -v 3 } defhelp -dev test_suite 'Run test suite with code coverage.' # Run specific test suite cmd_test_specific() { echo "Running specific test suite..." - docker-compose exec django /docker_venv/bin/python3 ./manage.py test --settings=config.settings.testing "${1}" -v 3 --nomigrations + docker-compose exec django /docker_venv/bin/python3 ./manage.py test --settings=config.settings.test "${1}" -v 3 } defhelp -dev test_specific 'Run specific test suite. Pass in parameter of Python test module.' @@ -202,7 +202,7 @@ defhelp -dev test_coverage 'Display code coverage report.' # Run test suite backwards for CI testing cmd_test_backwards() { echo "Running test suite backwards..." - docker-compose exec django /docker_venv/bin/python3 ./manage.py test --settings=config.settings.testing --pattern "test_*.py" --reverse -v 0 --nomigrations + docker-compose exec django /docker_venv/bin/python3 ./manage.py test --settings=config.settings.test --pattern "test_*.py" --reverse -v 0 } defhelp -dev test_backwards 'Run test suite backwards.' diff --git a/dthm4kaiako/users/tests/__init__.py b/dthm4kaiako/config/filters/__init__.py similarity index 100% rename from dthm4kaiako/users/tests/__init__.py rename to dthm4kaiako/config/filters/__init__.py diff --git a/dthm4kaiako/config/filters/markdown.py b/dthm4kaiako/config/filters/markdown.py new file mode 100644 index 000000000..8dbc3e69a --- /dev/null +++ b/dthm4kaiako/config/filters/markdown.py @@ -0,0 +1,12 @@ +from django import template +from django.utils.safestring import mark_safe +from django.template.defaultfilters import stringfilter +from markdownx.utils import markdownify + +register = template.Library() + + +@register.filter +@stringfilter +def markdown(raw_markdown): + return mark_safe(markdownify(raw_markdown)) diff --git a/dthm4kaiako/config/settings/base.py b/dthm4kaiako/config/settings/base.py index 5f9f14216..c89d2d7a8 100644 --- a/dthm4kaiako/config/settings/base.py +++ b/dthm4kaiako/config/settings/base.py @@ -19,7 +19,7 @@ # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name # though not all of them may be available with every OS. # In Windows, this must be set to your system time zone. -TIME_ZONE = 'UTC' +TIME_ZONE = 'NZ' # https://docs.djangoproject.com/en/dev/ref/settings/#language-code LANGUAGE_CODE = 'en-NZ' # https://docs.djangoproject.com/en/dev/ref/settings/#site-id @@ -194,6 +194,9 @@ 'django.contrib.messages.context_processors.messages', 'config.context_processors.version_number.version_number', ], + 'libraries': { + 'markdown': 'config.filters.markdown', + }, }, }, ] diff --git a/dthm4kaiako/config/urls.py b/dthm4kaiako/config/urls.py index bbbc712c5..1ff5d1784 100644 --- a/dthm4kaiako/config/urls.py +++ b/dthm4kaiako/config/urls.py @@ -9,21 +9,12 @@ admin.site.site_header = 'dthm4kaiako.ac.nz' urlpatterns = [ path('', TemplateView.as_view(template_name='pages/home.html'), name='home'), - path( - 'about/', - TemplateView.as_view(template_name='pages/about.html'), - name='about', - ), - # Django Admin, use {% url 'admin:index' %} + path('about/', TemplateView.as_view(template_name='pages/about.html'), name='about',), path(settings.ADMIN_URL, admin.site.urls), - # User management - path( - 'users/', - include('users.urls', namespace='users'), - ), + path('dtta/', include('dtta.urls', namespace='dtta')), + path('users/', include('users.urls', namespace='users'),), path('accounts/', include('allauth.urls')), path('markdownx/', include('markdownx.urls')), - # Your stuff: custom urls includes go here ] + static( settings.MEDIA_URL, document_root=settings.MEDIA_ROOT ) diff --git a/dthm4kaiako/config/wsgi.py b/dthm4kaiako/config/wsgi.py index 4f9d94963..824091218 100644 --- a/dthm4kaiako/config/wsgi.py +++ b/dthm4kaiako/config/wsgi.py @@ -14,7 +14,6 @@ """ import os -import sys from django.core.wsgi import get_wsgi_application # We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks diff --git a/dthm4kaiako/dtta/models.py b/dthm4kaiako/dtta/models.py index 301fe819b..e57ce927e 100644 --- a/dthm4kaiako/dtta/models.py +++ b/dthm4kaiako/dtta/models.py @@ -1,6 +1,7 @@ from django.db import models from markdownx.models import MarkdownxField + class NewsArticle(models.Model): title = models.CharField(max_length=200) datetime = models.DateTimeField() diff --git a/dthm4kaiako/dtta/urls.py b/dthm4kaiako/dtta/urls.py new file mode 100644 index 000000000..24d9524e3 --- /dev/null +++ b/dthm4kaiako/dtta/urls.py @@ -0,0 +1,8 @@ +from django.urls import path +from . import views + +app_name = 'dtta' +urlpatterns = [ + path('', views.IndexView.as_view(), name='index'), + path('news//', views.NewsArticleDetailView.as_view(), name='news_article'), +] diff --git a/dthm4kaiako/dtta/views.py b/dthm4kaiako/dtta/views.py index 91ea44a21..359b1f6cd 100644 --- a/dthm4kaiako/dtta/views.py +++ b/dthm4kaiako/dtta/views.py @@ -1,3 +1,27 @@ -from django.shortcuts import render +from django.views import generic +from django.utils import timezone +from dtta.models import NewsArticle -# Create your views here. + +class IndexView(generic.base.TemplateView): + """View for DTTA homepage.""" + + template_name = 'dtta/index.html' + + def get_context_data(self, **kwargs): + """Provide the context data for the DTTA index view. + + Returns: + Dictionary of context data. + """ + context = super().get_context_data(**kwargs) + now = timezone.now() + context['latest_news_articles'] = NewsArticle.objects.filter(datetime__lte=now).order_by('-datetime') + return context + + +class NewsArticleDetailView(generic.DetailView): + """View for DTTA news article.""" + + model = NewsArticle + context_object_name = 'news_article' diff --git a/dthm4kaiako/templates/base.html b/dthm4kaiako/templates/base.html index c95b5ff77..cf9ef11bd 100644 --- a/dthm4kaiako/templates/base.html +++ b/dthm4kaiako/templates/base.html @@ -33,7 +33,7 @@ diff --git a/dthm4kaiako/templates/dtta/index.html b/dthm4kaiako/templates/dtta/index.html new file mode 100644 index 000000000..a26e0f08e --- /dev/null +++ b/dthm4kaiako/templates/dtta/index.html @@ -0,0 +1,26 @@ +{% extends "base.html" %} + +{% load markdown %} + +{% block content %} +

    DTTA

    + +

    + The Digital Technologies Teachers Aotearoa is an association with the goal of advocating for our subjects. + The aim of the association is to create a community of teachers where we can share resources, communicate and speak with one voice to get our subject area recognised and supported. +

    + + {% if latest_news_articles %} +

    Latest news

    + {% for news_article in latest_news_articles %} +
    +
    +
    {{ news_article.title }}
    +
    {{ news_article.datetime }}
    + {{ news_article.content|markdown|truncatewords_html:30 }} + Read more... +
    +
    + {% endfor %} + {% endif %} +{% endblock content %} diff --git a/dthm4kaiako/templates/dtta/newsarticle_detail.html b/dthm4kaiako/templates/dtta/newsarticle_detail.html new file mode 100644 index 000000000..4d81782d6 --- /dev/null +++ b/dthm4kaiako/templates/dtta/newsarticle_detail.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} + +{% load markdown %} + +{% block content %} +

    {{ news_article.title }}

    +

    {{ news_article.datetime }}

    + {{ news_article.content|markdown }} +{% endblock content %} diff --git a/dthm4kaiako/tests/__init__.py b/dthm4kaiako/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/dthm4kaiako/tests/users/__init__.py b/dthm4kaiako/tests/users/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/dthm4kaiako/users/tests/factories.py b/dthm4kaiako/tests/users/factories.py similarity index 100% rename from dthm4kaiako/users/tests/factories.py rename to dthm4kaiako/tests/users/factories.py diff --git a/dthm4kaiako/users/tests/test_forms.py b/dthm4kaiako/tests/users/test_forms.py similarity index 95% rename from dthm4kaiako/users/tests/test_forms.py rename to dthm4kaiako/tests/users/test_forms.py index 3825f56a3..79397eee1 100644 --- a/dthm4kaiako/users/tests/test_forms.py +++ b/dthm4kaiako/tests/users/test_forms.py @@ -1,7 +1,7 @@ import pytest from users.forms import UserCreationForm -from users.tests.factories import UserFactory +from tests.users.factories import UserFactory pytestmark = pytest.mark.django_db diff --git a/dthm4kaiako/users/tests/test_models.py b/dthm4kaiako/tests/users/test_models.py similarity index 100% rename from dthm4kaiako/users/tests/test_models.py rename to dthm4kaiako/tests/users/test_models.py diff --git a/dthm4kaiako/users/tests/test_urls.py b/dthm4kaiako/tests/users/test_urls.py similarity index 100% rename from dthm4kaiako/users/tests/test_urls.py rename to dthm4kaiako/tests/users/test_urls.py diff --git a/dthm4kaiako/users/tests/test_views.py b/dthm4kaiako/tests/users/test_views.py similarity index 100% rename from dthm4kaiako/users/tests/test_views.py rename to dthm4kaiako/tests/users/test_views.py diff --git a/setup.cfg b/setup.cfg index 0473b6348..5200f1b98 100644 --- a/setup.cfg +++ b/setup.cfg @@ -10,11 +10,20 @@ exclude = build, temp, */manage.py, +show-source = True +statistics = True +count = True [pycodestyle] max-line-length = 119 add_ignore = D407,D413 -exclude = .tox,.git,*/migrations/*,*/static/CACHE/*,docs,node_modules +exclude = + .tox, + .git, + **/migrations/*, + */static/CACHE/*, + docs, + node_modules, [mypy] python_version = 3.6 From b9ebdfe0c9fc4833c1b07ba44d89f0de5afa3366 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Thu, 17 Jan 2019 20:49:00 +1300 Subject: [PATCH 25/82] Docstring fixes --- dthm4kaiako/__init__.py | 7 ------- dthm4kaiako/config/__init__.py | 6 ++++++ .../config/context_processors/__init__.py | 1 + dthm4kaiako/config/filters/__init__.py | 1 + dthm4kaiako/config/filters/markdown.py | 10 +++++++++ dthm4kaiako/config/settings/__init__.py | 1 + dthm4kaiako/config/settings/base.py | 4 +--- dthm4kaiako/config/settings/local.py | 2 ++ dthm4kaiako/config/settings/production.py | 6 ++++++ dthm4kaiako/config/settings/test.py | 5 +++-- dthm4kaiako/config/urls.py | 2 ++ dthm4kaiako/conftest.py | 5 +++++ dthm4kaiako/contrib/__init__.py | 3 ++- dthm4kaiako/contrib/sites/__init__.py | 3 ++- dthm4kaiako/dtta/__init__.py | 1 + dthm4kaiako/dtta/admin.py | 2 ++ dthm4kaiako/dtta/apps.py | 4 ++++ dthm4kaiako/dtta/models.py | 4 ++++ dthm4kaiako/dtta/urls.py | 2 ++ dthm4kaiako/dtta/views.py | 2 ++ dthm4kaiako/manage.py | 2 ++ dthm4kaiako/tests/__init__.py | 1 + dthm4kaiako/tests/users/__init__.py | 1 + dthm4kaiako/tests/users/factories.py | 7 ++++++- dthm4kaiako/users/__init__.py | 1 + dthm4kaiako/users/adapters.py | 7 ++++++- dthm4kaiako/users/admin.py | 4 +++- dthm4kaiako/users/apps.py | 4 ++++ dthm4kaiako/users/forms.py | 9 ++++++++ dthm4kaiako/users/models.py | 4 ++++ dthm4kaiako/users/urls.py | 17 +++++++-------- dthm4kaiako/users/views.py | 21 ++++++++----------- setup.cfg | 12 +++-------- 33 files changed, 113 insertions(+), 48 deletions(-) delete mode 100644 dthm4kaiako/__init__.py create mode 100644 dthm4kaiako/config/context_processors/__init__.py diff --git a/dthm4kaiako/__init__.py b/dthm4kaiako/__init__.py deleted file mode 100644 index 3ff4c16dd..000000000 --- a/dthm4kaiako/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -__version__ = "0.6.0" -__version_info__ = tuple( - [ - int(num) if num.isdigit() else num - for num in __version__.replace("-", ".", 1).split(".") - ] -) diff --git a/dthm4kaiako/config/__init__.py b/dthm4kaiako/config/__init__.py index 04cd80cc8..32ab03649 100644 --- a/dthm4kaiako/config/__init__.py +++ b/dthm4kaiako/config/__init__.py @@ -1,3 +1,9 @@ """Configuration for Django system.""" __version__ = "0.6.0" +__version_info__ = tuple( + [ + int(num) if num.isdigit() else num + for num in __version__.replace("-", ".", 1).split(".") + ] +) diff --git a/dthm4kaiako/config/context_processors/__init__.py b/dthm4kaiako/config/context_processors/__init__.py new file mode 100644 index 000000000..2c23316b5 --- /dev/null +++ b/dthm4kaiako/config/context_processors/__init__.py @@ -0,0 +1 @@ +"""Module for custom context processors.""" diff --git a/dthm4kaiako/config/filters/__init__.py b/dthm4kaiako/config/filters/__init__.py index e69de29bb..ded057569 100644 --- a/dthm4kaiako/config/filters/__init__.py +++ b/dthm4kaiako/config/filters/__init__.py @@ -0,0 +1 @@ +"""Module for custom template filters.""" diff --git a/dthm4kaiako/config/filters/markdown.py b/dthm4kaiako/config/filters/markdown.py index 8dbc3e69a..bfc30a77b 100644 --- a/dthm4kaiako/config/filters/markdown.py +++ b/dthm4kaiako/config/filters/markdown.py @@ -1,3 +1,5 @@ +"""Template filter for rendering Markdown to HTML.""" + from django import template from django.utils.safestring import mark_safe from django.template.defaultfilters import stringfilter @@ -9,4 +11,12 @@ @register.filter @stringfilter def markdown(raw_markdown): + """Render Markdown as HTML. + + Args: + raw_markdown (str): Text of raw Markdown. + + Returns: + HTML string of rendered Markdown marked as safe. + """ return mark_safe(markdownify(raw_markdown)) diff --git a/dthm4kaiako/config/settings/__init__.py b/dthm4kaiako/config/settings/__init__.py index e69de29bb..848233f14 100644 --- a/dthm4kaiako/config/settings/__init__.py +++ b/dthm4kaiako/config/settings/__init__.py @@ -0,0 +1 @@ +"""Module for settings for Django application.""" diff --git a/dthm4kaiako/config/settings/base.py b/dthm4kaiako/config/settings/base.py index c89d2d7a8..9c56e4337 100644 --- a/dthm4kaiako/config/settings/base.py +++ b/dthm4kaiako/config/settings/base.py @@ -1,6 +1,4 @@ -""" -Base settings to build other settings files upon. -""" +"""Base settings to build other settings files upon.""" import os.path import environ diff --git a/dthm4kaiako/config/settings/local.py b/dthm4kaiako/config/settings/local.py index f7e776889..0d62ca57a 100644 --- a/dthm4kaiako/config/settings/local.py +++ b/dthm4kaiako/config/settings/local.py @@ -1,3 +1,5 @@ +"""Settings for local environment, built upon base settings.""" + from .base import * # noqa from .base import env diff --git a/dthm4kaiako/config/settings/production.py b/dthm4kaiako/config/settings/production.py index 9ead034b8..b0a9b555f 100644 --- a/dthm4kaiako/config/settings/production.py +++ b/dthm4kaiako/config/settings/production.py @@ -1,3 +1,5 @@ +"""Settings for production environment, built upon base settings.""" + from .base import * # noqa from .base import env @@ -84,10 +86,14 @@ class StaticRootS3Boto3Storage(S3Boto3Storage): + """Data for storing static files with django-storages.""" + location = 'static' class MediaRootS3Boto3Storage(S3Boto3Storage): + """Data for storing media files with django-storages.""" + location = 'media' file_overwrite = False diff --git a/dthm4kaiako/config/settings/test.py b/dthm4kaiako/config/settings/test.py index 81d0d57a5..b162058f1 100644 --- a/dthm4kaiako/config/settings/test.py +++ b/dthm4kaiako/config/settings/test.py @@ -1,5 +1,6 @@ -""" -With these settings, tests run faster. +"""Settings for tesing environment, built upon base settings. + +Tests run faster with these settings. """ from .base import * # noqa diff --git a/dthm4kaiako/config/urls.py b/dthm4kaiako/config/urls.py index 1ff5d1784..e522fdec7 100644 --- a/dthm4kaiako/config/urls.py +++ b/dthm4kaiako/config/urls.py @@ -1,3 +1,5 @@ +"""Core URL routing for Django system.""" + from django.conf import settings from django.urls import include, path from django.conf.urls.static import static diff --git a/dthm4kaiako/conftest.py b/dthm4kaiako/conftest.py index 427272eee..f6ce04368 100644 --- a/dthm4kaiako/conftest.py +++ b/dthm4kaiako/conftest.py @@ -1,3 +1,5 @@ +"""Module for configuring pytest.""" + import pytest from django.conf import settings from django.test import RequestFactory @@ -7,14 +9,17 @@ @pytest.fixture(autouse=True) def media_storage(settings, tmpdir): + """Pytest setup for media storage.""" settings.MEDIA_ROOT = tmpdir.strpath @pytest.fixture def user() -> settings.AUTH_USER_MODEL: + """Pytest setup for user model.""" return UserFactory() @pytest.fixture def request_factory() -> RequestFactory: + """Pytest setup for factory.""" return RequestFactory() diff --git a/dthm4kaiako/contrib/__init__.py b/dthm4kaiako/contrib/__init__.py index 1c7ecc894..b18196cf8 100644 --- a/dthm4kaiako/contrib/__init__.py +++ b/dthm4kaiako/contrib/__init__.py @@ -1,4 +1,5 @@ -""" +"""Module for setting up Django site. + To understand why this file is here, please read: http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django diff --git a/dthm4kaiako/contrib/sites/__init__.py b/dthm4kaiako/contrib/sites/__init__.py index 1c7ecc894..b18196cf8 100644 --- a/dthm4kaiako/contrib/sites/__init__.py +++ b/dthm4kaiako/contrib/sites/__init__.py @@ -1,4 +1,5 @@ -""" +"""Module for setting up Django site. + To understand why this file is here, please read: http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django diff --git a/dthm4kaiako/dtta/__init__.py b/dthm4kaiako/dtta/__init__.py index e69de29bb..34e7249d5 100644 --- a/dthm4kaiako/dtta/__init__.py +++ b/dthm4kaiako/dtta/__init__.py @@ -0,0 +1 @@ +"""Module for DTTA application.""" diff --git a/dthm4kaiako/dtta/admin.py b/dthm4kaiako/dtta/admin.py index 99ad796ec..15dbd29de 100644 --- a/dthm4kaiako/dtta/admin.py +++ b/dthm4kaiako/dtta/admin.py @@ -1,3 +1,5 @@ +"""Module for admin configuration for the DTTA application.""" + from django.contrib import admin from dtta.models import NewsArticle from markdownx.admin import MarkdownxModelAdmin diff --git a/dthm4kaiako/dtta/apps.py b/dthm4kaiako/dtta/apps.py index dfef3b3c8..50f8bd6fc 100644 --- a/dthm4kaiako/dtta/apps.py +++ b/dthm4kaiako/dtta/apps.py @@ -1,6 +1,10 @@ +"""Application configuration for DTTA application.""" + from django.apps import AppConfig class DttaAppConfig(AppConfig): + """Application configuration for DTTA application.""" + name = 'dtta' verbose_name = 'DTTA' diff --git a/dthm4kaiako/dtta/models.py b/dthm4kaiako/dtta/models.py index e57ce927e..7e4482fc9 100644 --- a/dthm4kaiako/dtta/models.py +++ b/dthm4kaiako/dtta/models.py @@ -1,8 +1,12 @@ +"""Models for DTTA application.""" + from django.db import models from markdownx.models import MarkdownxField class NewsArticle(models.Model): + """Model for a news article published by DTTA.""" + title = models.CharField(max_length=200) datetime = models.DateTimeField() content = MarkdownxField() diff --git a/dthm4kaiako/dtta/urls.py b/dthm4kaiako/dtta/urls.py index 24d9524e3..b5f59b12d 100644 --- a/dthm4kaiako/dtta/urls.py +++ b/dthm4kaiako/dtta/urls.py @@ -1,3 +1,5 @@ +"""URL routing for DTTA application.""" + from django.urls import path from . import views diff --git a/dthm4kaiako/dtta/views.py b/dthm4kaiako/dtta/views.py index 359b1f6cd..7714a243b 100644 --- a/dthm4kaiako/dtta/views.py +++ b/dthm4kaiako/dtta/views.py @@ -1,3 +1,5 @@ +"""Views for DTTA application.""" + from django.views import generic from django.utils import timezone from dtta.models import NewsArticle diff --git a/dthm4kaiako/manage.py b/dthm4kaiako/manage.py index f1c84cace..4ae1c6d67 100755 --- a/dthm4kaiako/manage.py +++ b/dthm4kaiako/manage.py @@ -1,4 +1,6 @@ #!/usr/bin/env python +"""Command-line utility for Django administrative tasks.""" + import os import sys diff --git a/dthm4kaiako/tests/__init__.py b/dthm4kaiako/tests/__init__.py index e69de29bb..147200d75 100644 --- a/dthm4kaiako/tests/__init__.py +++ b/dthm4kaiako/tests/__init__.py @@ -0,0 +1 @@ +"""Module for tests for Django applications.""" diff --git a/dthm4kaiako/tests/users/__init__.py b/dthm4kaiako/tests/users/__init__.py index e69de29bb..6f65b1bca 100644 --- a/dthm4kaiako/tests/users/__init__.py +++ b/dthm4kaiako/tests/users/__init__.py @@ -0,0 +1 @@ +"""Module for testing user application.""" diff --git a/dthm4kaiako/tests/users/factories.py b/dthm4kaiako/tests/users/factories.py index 009905768..8fb46b319 100644 --- a/dthm4kaiako/tests/users/factories.py +++ b/dthm4kaiako/tests/users/factories.py @@ -1,10 +1,12 @@ -from typing import Any, Sequence +"""Module for factories for tesing user application.""" +from typing import Any, Sequence from django.contrib.auth import get_user_model from factory import DjangoModelFactory, Faker, post_generation class UserFactory(DjangoModelFactory): + """Factory for generating users.""" username = Faker("user_name") email = Faker("email") @@ -12,6 +14,7 @@ class UserFactory(DjangoModelFactory): @post_generation def password(self, create: bool, extracted: Sequence[Any], **kwargs): + """Create password for user.""" password = Faker( "password", length=42, @@ -25,5 +28,7 @@ def password(self, create: bool, extracted: Sequence[Any], **kwargs): self.set_password(password) class Meta: + """Metadata for UserFactory class.""" + model = get_user_model() django_get_or_create = ["username"] diff --git a/dthm4kaiako/users/__init__.py b/dthm4kaiako/users/__init__.py index e69de29bb..eca794871 100644 --- a/dthm4kaiako/users/__init__.py +++ b/dthm4kaiako/users/__init__.py @@ -0,0 +1 @@ +"""Module for users application.""" diff --git a/dthm4kaiako/users/adapters.py b/dthm4kaiako/users/adapters.py index 9361d6eca..89ef91b0a 100644 --- a/dthm4kaiako/users/adapters.py +++ b/dthm4kaiako/users/adapters.py @@ -1,5 +1,6 @@ -from typing import Any +"""Adapters for the user application.""" +from typing import Any from allauth.account.adapter import DefaultAccountAdapter from allauth.socialaccount.adapter import DefaultSocialAccountAdapter from django.conf import settings @@ -7,12 +8,16 @@ class AccountAdapter(DefaultAccountAdapter): + """Custom adapter for normal accounts.""" def is_open_for_signup(self, request: HttpRequest): + """Check if registrations are allowed for normal accounts.""" return getattr(settings, "ACCOUNT_ALLOW_REGISTRATION", True) class SocialAccountAdapter(DefaultSocialAccountAdapter): + """Custom adapter for social accounts.""" def is_open_for_signup(self, request: HttpRequest, sociallogin: Any): + """Check if registrations are allowed for social accounts.""" return getattr(settings, "ACCOUNT_ALLOW_REGISTRATION", True) diff --git a/dthm4kaiako/users/admin.py b/dthm4kaiako/users/admin.py index 1b8e658a9..676e1ab73 100644 --- a/dthm4kaiako/users/admin.py +++ b/dthm4kaiako/users/admin.py @@ -1,7 +1,8 @@ +"""Module for admin configuration for the users application.""" + from django.contrib import admin from django.contrib.auth import admin as auth_admin from django.contrib.auth import get_user_model - from users.forms import UserChangeForm, UserCreationForm User = get_user_model() @@ -9,6 +10,7 @@ @admin.register(User) class UserAdmin(auth_admin.UserAdmin): + """Custom user admin class.""" form = UserChangeForm add_form = UserCreationForm diff --git a/dthm4kaiako/users/apps.py b/dthm4kaiako/users/apps.py index 62d4968eb..67129eb22 100644 --- a/dthm4kaiako/users/apps.py +++ b/dthm4kaiako/users/apps.py @@ -1,12 +1,16 @@ +"""Application configuration for the chapters application.""" + from django.apps import AppConfig class UsersAppConfig(AppConfig): + """Configuration object for the chapters application.""" name = "users" verbose_name = "Users" def ready(self): + """Import signals upon intialising application.""" try: import users.signals # noqa F401 except ImportError: diff --git a/dthm4kaiako/users/forms.py b/dthm4kaiako/users/forms.py index 7bba81ff3..5bdd3730d 100644 --- a/dthm4kaiako/users/forms.py +++ b/dthm4kaiako/users/forms.py @@ -1,3 +1,5 @@ +"""Forms for user application.""" + from django.contrib.auth import get_user_model, forms from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ @@ -6,21 +8,28 @@ class UserChangeForm(forms.UserChangeForm): + """Form class for changing user.""" class Meta(forms.UserChangeForm.Meta): + """Metadata for UserChangeForm class.""" + model = User class UserCreationForm(forms.UserCreationForm): + """Form class for creating user.""" error_message = forms.UserCreationForm.error_messages.update( {"duplicate_username": _("This username has already been taken.")} ) class Meta(forms.UserCreationForm.Meta): + """Metadata for UserCreationForm class.""" + model = User def clean_username(self): + """Check username does not already exist.""" username = self.cleaned_data["username"] try: diff --git a/dthm4kaiako/users/models.py b/dthm4kaiako/users/models.py index 8f07b15a1..8f071aad6 100644 --- a/dthm4kaiako/users/models.py +++ b/dthm4kaiako/users/models.py @@ -1,3 +1,5 @@ +"""Models for user application.""" + from django.contrib.auth.models import AbstractUser from django.db.models import CharField from django.urls import reverse @@ -5,10 +7,12 @@ class User(AbstractUser): + """User of website.""" # First Name and Last Name do not cover name patterns # around the globe. name = CharField(_("Name of User"), blank=True, max_length=255) def get_absolute_url(self): + """Return URL for user's webpage.""" return reverse("users:detail", kwargs={"username": self.username}) diff --git a/dthm4kaiako/users/urls.py b/dthm4kaiako/users/urls.py index 90ca5d545..fca1eb1e0 100644 --- a/dthm4kaiako/users/urls.py +++ b/dthm4kaiako/users/urls.py @@ -1,16 +1,13 @@ +"""URL routing for users application.""" + from django.urls import path +from . import views -from users.views import ( - user_list_view, - user_redirect_view, - user_update_view, - user_detail_view, -) app_name = "users" urlpatterns = [ - path("", view=user_list_view, name="list"), - path("~redirect/", view=user_redirect_view, name="redirect"), - path("~update/", view=user_update_view, name="update"), - path("/", view=user_detail_view, name="detail"), + path("", view=views.UserListView.as_view(), name="list"), + path("~redirect/", view=views.UserRedirectView.as_view(), name="redirect"), + path("~update/", view=views.UserUpdateView.as_view(), name="update"), + path("/", view=views.UserDetailView.as_view(), name="detail"), ] diff --git a/dthm4kaiako/users/views.py b/dthm4kaiako/users/views.py index 35e26e94f..4f0203b28 100644 --- a/dthm4kaiako/users/views.py +++ b/dthm4kaiako/users/views.py @@ -1,3 +1,5 @@ +"""Views for users application.""" + from django.contrib.auth import get_user_model from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse @@ -7,46 +9,41 @@ class UserDetailView(LoginRequiredMixin, DetailView): + """View for a single user.""" model = User slug_field = "username" slug_url_kwarg = "username" -user_detail_view = UserDetailView.as_view() - - class UserListView(LoginRequiredMixin, ListView): + """View for a list of users.""" model = User slug_field = "username" slug_url_kwarg = "username" -user_list_view = UserListView.as_view() - - class UserUpdateView(LoginRequiredMixin, UpdateView): + """View for updating user data.""" model = User fields = ["name"] def get_success_url(self): + """URL to route to on successful update.""" return reverse("users:detail", kwargs={"username": self.request.user.username}) def get_object(self): + """Object to perform update with.""" return User.objects.get(username=self.request.user.username) -user_update_view = UserUpdateView.as_view() - - class UserRedirectView(LoginRequiredMixin, RedirectView): + """View for redirecting to a user's webpage.""" permanent = False def get_redirect_url(self): + """URL to redirect to.""" return reverse("users:detail", kwargs={"username": self.request.user.username}) - - -user_redirect_view = UserRedirectView.as_view() diff --git a/setup.cfg b/setup.cfg index 5200f1b98..45fece815 100644 --- a/setup.cfg +++ b/setup.cfg @@ -14,16 +14,10 @@ show-source = True statistics = True count = True -[pycodestyle] -max-line-length = 119 +[pydocstyle] +# Ignore following rules to allow Google Python Style docstrings add_ignore = D407,D413 -exclude = - .tox, - .git, - **/migrations/*, - */static/CACHE/*, - docs, - node_modules, +match_dir = (?!migrations|node_modules|files|build|staticfiles).* [mypy] python_version = 3.6 From cf8af608b630d4d0504a1cfa1f034b2c0e44911c Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Thu, 17 Jan 2019 21:23:44 +1300 Subject: [PATCH 26/82] Update dev script to use pytest --- .coveragerc | 4 +--- .travis.yml | 2 -- dev | 11 ++--------- dthm4kaiako/conftest.py | 2 +- pytest.ini | 2 -- 5 files changed, 4 insertions(+), 17 deletions(-) delete mode 100644 pytest.ini diff --git a/.coveragerc b/.coveragerc index 2a1c2497e..e0cb42e12 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,8 +1,6 @@ [run] -include = dthm4kaiako/* +include = */dthm4kaiako/* omit = *migrations*, *tests* -plugins = - django_coverage_plugin branch = True [report] diff --git a/.travis.yml b/.travis.yml index 84401cb23..00f9d3206 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,8 +14,6 @@ jobs: include: - stage: test script: ./dev ci test_suite - - script: ./dev ci test_backwards - if: type = pull_request - script: ./dev ci style notifications: email: false diff --git a/dev b/dev index f2b299c7f..5d3629335 100755 --- a/dev +++ b/dev @@ -180,14 +180,14 @@ defhelp -dev style 'Run style checks.' # Run test suite cmd_test_suite() { echo "Running test suite..." - docker-compose exec django /docker_venv/bin/coverage run --rcfile=/dthm4kaiako/.coveragerc ./manage.py test --settings=config.settings.test --pattern "test_*.py" -v 3 + docker-compose exec django /docker_venv/bin/coverage run --rcfile=/dthm4kaiako/.coveragerc -m pytest --ds=config.settings.test } defhelp -dev test_suite 'Run test suite with code coverage.' # Run specific test suite cmd_test_specific() { echo "Running specific test suite..." - docker-compose exec django /docker_venv/bin/python3 ./manage.py test --settings=config.settings.test "${1}" -v 3 + docker-compose exec django /docker_venv/bin/pytest --ds=config.settings.test "${1}" } defhelp -dev test_specific 'Run specific test suite. Pass in parameter of Python test module.' @@ -199,13 +199,6 @@ cmd_test_coverage() { } defhelp -dev test_coverage 'Display code coverage report.' -# Run test suite backwards for CI testing -cmd_test_backwards() { - echo "Running test suite backwards..." - docker-compose exec django /docker_venv/bin/python3 ./manage.py test --settings=config.settings.test --pattern "test_*.py" --reverse -v 0 -} -defhelp -dev test_backwards 'Run test suite backwards.' - # Delete all untagged dangling Docker images cmd_clean() { echo "If the following commands return an argument not found error," diff --git a/dthm4kaiako/conftest.py b/dthm4kaiako/conftest.py index f6ce04368..94bf94b8f 100644 --- a/dthm4kaiako/conftest.py +++ b/dthm4kaiako/conftest.py @@ -4,7 +4,7 @@ from django.conf import settings from django.test import RequestFactory -from users.tests.factories import UserFactory +from tests.users.factories import UserFactory @pytest.fixture(autouse=True) diff --git a/pytest.ini b/pytest.ini deleted file mode 100644 index 5b4369b89..000000000 --- a/pytest.ini +++ /dev/null @@ -1,2 +0,0 @@ -[pytest] -DJANGO_SETTINGS_MODULE=config.settings.test From 064ab1f18be6087a31d63dd7a2f2242511d13356 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Thu, 17 Jan 2019 22:10:51 +1300 Subject: [PATCH 27/82] Enable django template coverage plugin --- .coveragerc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.coveragerc b/.coveragerc index e0cb42e12..959527f2e 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,6 +1,8 @@ [run] include = */dthm4kaiako/* omit = *migrations*, *tests* +plugins = + django_coverage_plugin branch = True [report] From 13b3967e55b236cf8f9fb17b2739556dc6f6abd3 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Thu, 17 Jan 2019 22:43:20 +1300 Subject: [PATCH 28/82] Tidy coverage output --- .coveragerc | 2 +- dev | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.coveragerc b/.coveragerc index 959527f2e..cd0cd4ea5 100644 --- a/.coveragerc +++ b/.coveragerc @@ -6,4 +6,4 @@ plugins = branch = True [report] -fail_under=20 +fail_under = 20 diff --git a/dev b/dev index 5d3629335..f1a78d6e5 100755 --- a/dev +++ b/dev @@ -195,7 +195,7 @@ defhelp -dev test_specific 'Run specific test suite. Pass in parameter of Python cmd_test_coverage() { echo "Displaying test suite coverage..." docker-compose exec django /docker_venv/bin/coverage xml -i - docker-compose exec django /docker_venv/bin/coverage report -m --skip-covered + docker-compose exec django /docker_venv/bin/coverage report -m } defhelp -dev test_coverage 'Display code coverage report.' From b9cb776cac795ce206b6946aa0988b2e15446f3f Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 17 Jan 2019 22:49:07 +1300 Subject: [PATCH 29/82] Update djangorestframework from 3.9.0 to 3.9.1 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index af001659f..6dd5a993f 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -13,5 +13,5 @@ django-redis==4.10.0 # https://github.com/niwinz/django-redis django-markdownx==2.0.28 # https://github.com/neutronX/django-markdownx # Django REST Framework -djangorestframework==3.9.0 # https://github.com/encode/django-rest-framework +djangorestframework==3.9.1 # https://github.com/encode/django-rest-framework coreapi==2.3.3 # https://github.com/core-api/python-client From 8b25009cd5e6767059954624f65e1f5fe1c3d8b0 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 17 Jan 2019 22:49:13 +1300 Subject: [PATCH 30/82] Update mypy from 0.650 to 0.660 --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index dd04559b1..6ea65b63e 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -7,7 +7,7 @@ psycopg2-binary==2.7.6.1 # https://github.com/psycopg/psycopg2 # Testing # ------------------------------------------------------------------------------ -mypy==0.650 # https://github.com/python/mypy +mypy==0.660 # https://github.com/python/mypy pytest==4.1.1 # https://github.com/pytest-dev/pytest pytest-sugar==0.9.2 # https://github.com/Frozenball/pytest-sugar From 749bf401e3f4fe5b6000e8c99b10bc5c37fbd151 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Thu, 17 Jan 2019 23:05:25 +1300 Subject: [PATCH 31/82] Add future commented command if testing mypy --- dev | 1 + 1 file changed, 1 insertion(+) diff --git a/dev b/dev index f1a78d6e5..19ff774b6 100755 --- a/dev +++ b/dev @@ -181,6 +181,7 @@ defhelp -dev style 'Run style checks.' cmd_test_suite() { echo "Running test suite..." docker-compose exec django /docker_venv/bin/coverage run --rcfile=/dthm4kaiako/.coveragerc -m pytest --ds=config.settings.test + # docker-compose exec django /docker_venv/bin/mypy /dthm4kaiako/dthm4kaiako/ } defhelp -dev test_suite 'Run test suite with code coverage.' From a971f363e278abda1ae1d84dc70c7ece90d86fc7 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 18 Jan 2019 05:47:12 +1300 Subject: [PATCH 32/82] Update argon2-cffi from 18.3.0 to 19.1.0 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 6dd5a993f..1329def96 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,7 +1,7 @@ pytz==2018.9 # https://github.com/stub42/pytz python-slugify==2.0.1 # https://github.com/un33k/python-slugify Pillow==5.4.1 # https://github.com/python-pillow/Pillow -argon2-cffi==18.3.0 # https://github.com/hynek/argon2_cffi +argon2-cffi==19.1.0 # https://github.com/hynek/argon2_cffi redis>=2.10.6, < 3 # pyup: < 3 # https://github.com/antirez/redis # Django From 4849743a8a6437c9fac30f80f93c3ad4bec33cdf Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Fri, 18 Jan 2019 12:07:34 +1300 Subject: [PATCH 33/82] Add directories to ignore in Docker images --- .dockerignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.dockerignore b/.dockerignore index d046494af..f4b46706b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,6 @@ dthm4kaiako/build/* dthm4kaiako/temp/* dthm4kaiako/node_modules/* +**/__pycache__/** +**/.mypy_cache__/** +**/.pytest_cache__/** From 4c5d3009c5ba8ee5372c14d2d0f1690e7a099f75 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Fri, 18 Jan 2019 12:20:29 +1300 Subject: [PATCH 34/82] Add markdown settings --- dthm4kaiako/config/settings/base.py | 17 ++++++++++++++--- infrastructure/nginx/nginx.conf | 3 +++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/dthm4kaiako/config/settings/base.py b/dthm4kaiako/config/settings/base.py index 9c56e4337..e25192932 100644 --- a/dthm4kaiako/config/settings/base.py +++ b/dthm4kaiako/config/settings/base.py @@ -2,6 +2,9 @@ import os.path import environ +from datetime import datetime +import pytz + # dthm4kaiako/dthm4kaiako/config/settings/base.py - 3 = dthm4kaiako/dthm4kaiako/ ROOT_DIR = environ.Path(__file__) - 3 @@ -238,7 +241,8 @@ # django-allauth # ------------------------------------------------------------------------------ -ACCOUNT_ALLOW_REGISTRATION = env.bool('DJANGO_ACCOUNT_ALLOW_REGISTRATION', True) +# ACCOUNT_ALLOW_REGISTRATION = env.bool('DJANGO_ACCOUNT_ALLOW_REGISTRATION', True) +ACCOUNT_ALLOW_REGISTRATION = False # https://django-allauth.readthedocs.io/en/latest/configuration.html ACCOUNT_AUTHENTICATION_METHOD = 'username' # https://django-allauth.readthedocs.io/en/latest/configuration.html @@ -251,6 +255,13 @@ SOCIALACCOUNT_ADAPTER = 'users.adapters.SocialAccountAdapter' -# Your stuff... +# markdownx # ------------------------------------------------------------------------------ -ACCOUNT_ALLOW_REGISTRATION = False +timezone = pytz.timezone(TIME_ZONE) +MARKDOWNX_MEDIA_PATH = datetime.now(timezone).strftime('markdown/%Y/%m/%d') +MARKDOWNX_UPLOAD_MAX_SIZE = 25 * 1024 * 1024 # 25 MB +MARKDOWNX_UPLOAD_CONTENT_TYPES = [ + 'image/jpeg', + 'image/png', + 'image/svg+xml', +] diff --git a/infrastructure/nginx/nginx.conf b/infrastructure/nginx/nginx.conf index 1b1862045..343d248de 100644 --- a/infrastructure/nginx/nginx.conf +++ b/infrastructure/nginx/nginx.conf @@ -6,6 +6,9 @@ events { http { include mime.types; + # set client body size to 50MB + client_max_body_size 50M; + server { listen 80; server_name example.org; From 21dbf298ee45d72c519eb0cdf1c74b466b015c5b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 18 Jan 2019 19:13:21 +1300 Subject: [PATCH 35/82] Update pydocstyle from 2.1.1 to 3.0.0 --- requirements/local.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/local.txt b/requirements/local.txt index 6ea65b63e..92d3e9e1f 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -15,7 +15,7 @@ pytest-sugar==0.9.2 # https://github.com/Frozenball/pytest-sugar # ------------------------------------------------------------------------------ flake8==3.6.0 # https://github.com/PyCQA/flake8 coverage==4.5.2 # https://github.com/nedbat/coveragepy -pydocstyle==2.1.1 +pydocstyle==3.0.0 # Django # ------------------------------------------------------------------------------ From 224971f6afea5f34263944bdae2b37503177310d Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Sun, 20 Jan 2019 14:02:08 +1300 Subject: [PATCH 36/82] Add data for deployment to Google Cloud Platform --- Dockerfile | 3 +- dthm4kaiako/config/settings/base.py | 2 +- dthm4kaiako/config/settings/database_proxy.py | 19 ++++ dthm4kaiako/config/settings/production.py | 107 ++++++------------ dthm4kaiako/config/storages.py | 21 ++++ dthm4kaiako/docker-production-entrypoint.sh | 4 + .../cloud-sql-proxy/docker-compose.yml | 36 ++++++ infrastructure/install_google_cloud_sdk.sh | 23 ++++ infrastructure/prod-deploy/app.yaml | 23 ++++ .../prod-deploy/decrypt-prod-secrets.sh | 11 ++ infrastructure/prod-deploy/deploy-app.sh | 42 +++++++ .../load-prod-deploy-config-envs.sh | 4 + .../prod-deploy/prod-deploy-secrets.tar.enc | Bin 0 -> 10256 bytes infrastructure/prod-deploy/update-content.sh | 18 +++ infrastructure/replace_envs.py | 51 +++++++++ requirements/production.txt | 3 +- 16 files changed, 290 insertions(+), 77 deletions(-) create mode 100644 dthm4kaiako/config/settings/database_proxy.py create mode 100644 dthm4kaiako/config/storages.py create mode 100644 infrastructure/cloud-sql-proxy/docker-compose.yml create mode 100644 infrastructure/install_google_cloud_sdk.sh create mode 100644 infrastructure/prod-deploy/app.yaml create mode 100755 infrastructure/prod-deploy/decrypt-prod-secrets.sh create mode 100644 infrastructure/prod-deploy/deploy-app.sh create mode 100644 infrastructure/prod-deploy/load-prod-deploy-config-envs.sh create mode 100644 infrastructure/prod-deploy/prod-deploy-secrets.tar.enc create mode 100644 infrastructure/prod-deploy/update-content.sh create mode 100644 infrastructure/replace_envs.py diff --git a/Dockerfile b/Dockerfile index 21e141987..d01f70103 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,4 +18,5 @@ COPY requirements /requirements RUN /docker_venv/bin/pip3 install -r /requirements/production.txt ADD ./dthm4kaiako /dthm4kaiako/ -CMD /docker_venv/bin/gunicorn -c gunicorn.conf.py -b :8080 config.wsgi + +CMD /dthm4kaiako/docker-production-entrypoint.sh diff --git a/dthm4kaiako/config/settings/base.py b/dthm4kaiako/config/settings/base.py index e25192932..52c1bc47f 100644 --- a/dthm4kaiako/config/settings/base.py +++ b/dthm4kaiako/config/settings/base.py @@ -258,7 +258,7 @@ # markdownx # ------------------------------------------------------------------------------ timezone = pytz.timezone(TIME_ZONE) -MARKDOWNX_MEDIA_PATH = datetime.now(timezone).strftime('markdown/%Y/%m/%d') +MARKDOWNX_MEDIA_PATH = os.path.join(MEDIA_URL, datetime.now(timezone).strftime('%Y/%m/%d')) MARKDOWNX_UPLOAD_MAX_SIZE = 25 * 1024 * 1024 # 25 MB MARKDOWNX_UPLOAD_CONTENT_TYPES = [ 'image/jpeg', diff --git a/dthm4kaiako/config/settings/database_proxy.py b/dthm4kaiako/config/settings/database_proxy.py new file mode 100644 index 000000000..b7cbd5a34 --- /dev/null +++ b/dthm4kaiako/config/settings/database_proxy.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +"""Django settings for connecting via Google Cloud SQL Proxy.""" + +from .production import * # noqa: F403 + +# DATABASE CONFIGURATION +# ---------------------------------------------------------------------------- +# See: https://docs.djangoproject.com/en/dev/ref/settings/#databases +DATABASES = { + "default": { + "ENGINE": "django.db.backends.postgresql", + "HOST": "cloud_sql_proxy", + "PORT": "5432", + "NAME": "dthm4kaiako", + "USER": env("GOOGLE_CLOUD_SQL_DATABASE_USERNAME"), # noqa: F405 + "PASSWORD": env("GOOGLE_CLOUD_SQL_DATABASE_PASSWORD"), # noqa: F405 + "ATOMIC_REQUESTS": True, + } +} diff --git a/dthm4kaiako/config/settings/production.py b/dthm4kaiako/config/settings/production.py index b0a9b555f..3020a8b6f 100644 --- a/dthm4kaiako/config/settings/production.py +++ b/dthm4kaiako/config/settings/production.py @@ -2,34 +2,32 @@ from .base import * # noqa from .base import env +from google.oauth2 import service_account # GENERAL # ------------------------------------------------------------------------------ # https://docs.djangoproject.com/en/dev/ref/settings/#secret-key SECRET_KEY = env('DJANGO_SECRET_KEY') -# https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts -ALLOWED_HOSTS = env.list('DJANGO_ALLOWED_HOSTS', default=['dthm4kaiako.ac.nz']) +# SECURITY WARNING: App Engine's security features ensure that it is safe to +# have ALLOWED_HOSTS = ['*'] when the app is deployed. If you deploy a Django +# app not on App Engine, make sure to set an appropriate host here. +# See https://docs.djangoproject.com/en/1.10/ref/settings/ +ALLOWED_HOSTS = ['*'] # DATABASES # ------------------------------------------------------------------------------ -DATABASES['default'] = env.db('DATABASE_URL') # noqa F405 -DATABASES['default']['ATOMIC_REQUESTS'] = True # noqa F405 -DATABASES['default']['CONN_MAX_AGE'] = env.int('CONN_MAX_AGE', default=60) # noqa F405 - -# CACHES -# ------------------------------------------------------------------------------ -CACHES = { +# See: https://docs.djangoproject.com/en/dev/ref/settings/#databases +DATABASES = { 'default': { - 'BACKEND': 'django_redis.cache.RedisCache', - 'LOCATION': env('REDIS_URL'), - 'OPTIONS': { - 'CLIENT_CLASS': 'django_redis.client.DefaultClient', - # Mimicing memcache behavior. - # http://niwinz.github.io/django-redis/latest/#_memcached_exceptions_behavior - 'IGNORE_EXCEPTIONS': True, - } + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': 'dthm4kaiako', + 'USER': env('GOOGLE_CLOUD_SQL_DATABASE_USERNAME'), # noqa: F405 + 'PASSWORD': env('GOOGLE_CLOUD_SQL_DATABASE_PASSWORD'), # noqa: F405 + 'HOST': '/cloudsql/' + env('GOOGLE_CLOUD_SQL_CONNECTION_NAME'), # noqa: F405 } } +DATABASES['default']['ATOMIC_REQUESTS'] = True +DATABASES['default']['CONN_MAX_AGE'] = env.int('CONN_MAX_AGE', default=60) # noqa F405 # SECURITY # ------------------------------------------------------------------------------ @@ -56,51 +54,21 @@ # ------------------------------------------------------------------------------ # https://django-storages.readthedocs.io/en/latest/#installation INSTALLED_APPS += ['storages'] # noqa F405 -# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings -AWS_ACCESS_KEY_ID = env('DJANGO_AWS_ACCESS_KEY_ID') -# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings -AWS_SECRET_ACCESS_KEY = env('DJANGO_AWS_SECRET_ACCESS_KEY') -# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings -AWS_STORAGE_BUCKET_NAME = env('DJANGO_AWS_STORAGE_BUCKET_NAME') -# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings -AWS_QUERYSTRING_AUTH = False -# DO NOT change these unless you know what you're doing. -_AWS_EXPIRY = 60 * 60 * 24 * 7 -# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings -AWS_S3_OBJECT_PARAMETERS = { - 'CacheControl': f'max-age={_AWS_EXPIRY}, s-maxage={_AWS_EXPIRY}, must-revalidate', -} - -# STATIC -# ------------------------ - -STATICFILES_STORAGE = 'config.settings.production.StaticRootS3Boto3Storage' -STATIC_URL = f'https://{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/static/' +# https://django-storages.readthedocs.io/en/latest/backends/gcloud.html +GS_BUCKET_NAME = env('GOOGLE_CLOUD_STORAGE_BUCKET_NAME') +GS_CREDENTIALS = service_account.Credentials.from_service_account_file(env('GOOGLE_APPLICATION_CREDENTIALS')) +GS_DEFAULT_ACL = 'publicRead' +GS_FILE_OVERWRITE = False -# MEDIA +# STATIC and MEDIA # ------------------------------------------------------------------------------ -# region http://stackoverflow.com/questions/10390244/ -# Full-fledge class: https://stackoverflow.com/a/18046120/104731 -from storages.backends.s3boto3 import S3Boto3Storage # noqa E402 - - -class StaticRootS3Boto3Storage(S3Boto3Storage): - """Data for storing static files with django-storages.""" +STATICFILES_STORAGE = 'config.storages.StaticRootGoogleCloudStorage' +STATIC_URL = 'https://storage.googleapis.com/' + env('GOOGLE_CLOUD_STORAGE_BUCKET_NAME') + '/static/' # noqa: F405 - location = 'static' - - -class MediaRootS3Boto3Storage(S3Boto3Storage): - """Data for storing media files with django-storages.""" - - location = 'media' - file_overwrite = False - - -# endregion -DEFAULT_FILE_STORAGE = 'config.settings.production.MediaRootS3Boto3Storage' -MEDIA_URL = f'https://{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/media/' +DEFAULT_FILE_STORAGE = 'config.storages.MediaRootGoogleCloudStorage' +DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage' +MEDIA_URL = 'https://storage.googleapis.com/' + env('GOOGLE_CLOUD_STORAGE_BUCKET_NAME') + '/media/' # noqa: F405 # TEMPLATES # ------------------------------------------------------------------------------ @@ -130,30 +98,23 @@ class MediaRootS3Boto3Storage(S3Boto3Storage): # ADMIN # ------------------------------------------------------------------------------ # Django Admin URL regex. -ADMIN_URL = env('DJANGO_ADMIN_URL') +# ADMIN_URL = env('DJANGO_ADMIN_URL') # Anymail (Mailgun) # ------------------------------------------------------------------------------ # https://anymail.readthedocs.io/en/stable/installation/#installing-anymail -INSTALLED_APPS += ['anymail'] # noqa F405 -EMAIL_BACKEND = 'anymail.backends.mailgun.EmailBackend' -# https://anymail.readthedocs.io/en/stable/installation/#anymail-settings-reference -ANYMAIL = { - 'MAILGUN_API_KEY': env('MAILGUN_API_KEY'), - 'MAILGUN_SENDER_DOMAIN': env('MAILGUN_DOMAIN') -} +# INSTALLED_APPS += ['anymail'] # noqa F405 +# EMAIL_BACKEND = 'anymail.backends.mailgun.EmailBackend' +# # https://anymail.readthedocs.io/en/stable/installation/#anymail-settings-reference +# ANYMAIL = { +# 'MAILGUN_API_KEY': env('MAILGUN_API_KEY'), +# 'MAILGUN_SENDER_DOMAIN': env('MAILGUN_DOMAIN') +# } # Gunicorn # ------------------------------------------------------------------------------ INSTALLED_APPS += ['gunicorn'] # noqa F405 -# Collectfast -# ------------------------------------------------------------------------------ -# https://github.com/antonagestam/collectfast#installation -INSTALLED_APPS = ['collectfast'] + INSTALLED_APPS # noqa F405 -AWS_PRELOAD_METADATA = True - - # LOGGING # ------------------------------------------------------------------------------ # See: https://docs.djangoproject.com/en/dev/ref/settings/#logging diff --git a/dthm4kaiako/config/storages.py b/dthm4kaiako/config/storages.py new file mode 100644 index 000000000..179e55ebb --- /dev/null +++ b/dthm4kaiako/config/storages.py @@ -0,0 +1,21 @@ +"""Custom storages for seperating static and media files on Google Cloud Platform. + +See: +- http://stackoverflow.com/questions/10390244/ +- https://stackoverflow.com/a/18046120/104731 +""" + +from storages.backends.gcloud import GoogleCloudStorage + + +class StaticRootGoogleCloudStorage(GoogleCloudStorage): + """Data for storing static files with django-storages.""" + + location = 'static' + + +class MediaRootGoogleCloudStorage(GoogleCloudStorage): + """Data for storing media files with django-storages.""" + + location = 'media' + file_overwrite = False diff --git a/dthm4kaiako/docker-production-entrypoint.sh b/dthm4kaiako/docker-production-entrypoint.sh index b25354d4b..5908dcf5e 100755 --- a/dthm4kaiako/docker-production-entrypoint.sh +++ b/dthm4kaiako/docker-production-entrypoint.sh @@ -1,5 +1,9 @@ +#!/bin/bash + export DJANGO_SETTINGS_MODULE="config.settings.production" +source ./dthm4kaiako/load-prod-envs.sh + echo "Compiling message files" /docker_venv/bin/python3 ./manage.py compilemessages diff --git a/infrastructure/cloud-sql-proxy/docker-compose.yml b/infrastructure/cloud-sql-proxy/docker-compose.yml new file mode 100644 index 000000000..17a6eeb0c --- /dev/null +++ b/infrastructure/cloud-sql-proxy/docker-compose.yml @@ -0,0 +1,36 @@ +version: '3' +services: + cloud_sql_proxy: + image: gcr.io/cloudsql-docker/gce-proxy:1.11 + volumes: + - .:/dthm4kaiako + command: /cloud_sql_proxy -instances=${GOOGLE_CLOUD_SQL_CONNECTION_NAME}=tcp:0.0.0.0:5432 -credential_file=/dthm4kaiako/${GOOGLE_APPLICATION_CREDENTIALS} + + django: + build: + context: . + dockerfile: ./Dockerfile + volumes: + - ./dthm4kaiako:/dthm4kaiako/ + environment: + - USE_DOCKER=yes + - DJANGO_SETTINGS_MODULE=config.settings.database_proxy + - GOOGLE_CLOUD_SQL_DATABASE_USERNAME=${GOOGLE_CLOUD_SQL_DATABASE_USERNAME} + - GOOGLE_CLOUD_SQL_DATABASE_PASSWORD=${GOOGLE_CLOUD_SQL_DATABASE_PASSWORD} + - GOOGLE_CLOUD_SQL_CONNECTION_NAME=${GOOGLE_CLOUD_SQL_CONNECTION_NAME} + - GOOGLE_CLOUD_STORAGE_BUCKET_NAME=${GOOGLE_CLOUD_STORAGE_BUCKET_NAME} + - GOOGLE_APPLICATION_CREDENTIALS=${GOOGLE_APPLICATION_CREDENTIALS} + - DJANGO_SECRET_KEY=${DJANGO_SECRET_KEY} + - INCLUDE_INCONTEXT_L10N=${INCLUDE_INCONTEXT_L10N} + depends_on: + - cloud_sql_proxy + + nginx: + build: + context: . + dockerfile: ./infrastructure/nginx/Dockerfile + volumes: + - ./dthm4kaiako/:/app/ + - /app/node_modules + depends_on: + - django diff --git a/infrastructure/install_google_cloud_sdk.sh b/infrastructure/install_google_cloud_sdk.sh new file mode 100644 index 000000000..48c93f57e --- /dev/null +++ b/infrastructure/install_google_cloud_sdk.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Install Google Cloud SDK + +# Set the environment variable for Google Cloud SDK to disable prompts +# and choose default settings. +export CLOUDSDK_CORE_DISABLE_PROMPTS=1; + +# Create an environment variable for the correct distribution. +export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)" + +# Add the Cloud SDK distribution URI as a package source. +echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list + +# Import the Google Cloud Platform public key. +curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - + +# Update the package list and install the Cloud SDK. +sudo apt-get update && sudo apt-get install google-cloud-sdk + +# Display the gcloud version, useful for debugging purposes. +# See: https://cloud.google.com/sdk/gcloud/reference/version +gcloud version diff --git a/infrastructure/prod-deploy/app.yaml b/infrastructure/prod-deploy/app.yaml new file mode 100644 index 000000000..556fa0887 --- /dev/null +++ b/infrastructure/prod-deploy/app.yaml @@ -0,0 +1,23 @@ +runtime: custom +env: flex + +beta_settings: + cloud_sql_instances: ${GOOGLE_CLOUD_SQL_CONNECTION_NAME} + +env_variables: + INCLUDE_INCONTEXT_L10N: ${INCLUDE_INCONTEXT_L10N} + DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY} + GOOGLE_CLOUD_SQL_DATABASE_USERNAME: ${GOOGLE_CLOUD_SQL_DATABASE_USERNAME} + GOOGLE_CLOUD_SQL_DATABASE_PASSWORD: ${GOOGLE_CLOUD_SQL_DATABASE_PASSWORD} + GOOGLE_CLOUD_SQL_CONNECTION_NAME: ${GOOGLE_CLOUD_SQL_CONNECTION_NAME} + GOOGLE_CLOUD_STORAGE_BUCKET_NAME: ${GOOGLE_CLOUD_STORAGE_BUCKET_NAME} + GOOGLE_APPLICATION_CREDENTIALS: ${GOOGLE_APPLICATION_CREDENTIALS} + +resources: + cpu: 1 + memory_gb: 3.75 + +health_check: + enable_health_check: True + check_interval_sec: 5 + timeout_sec: 4 diff --git a/infrastructure/prod-deploy/decrypt-prod-secrets.sh b/infrastructure/prod-deploy/decrypt-prod-secrets.sh new file mode 100755 index 000000000..1e8cf6d73 --- /dev/null +++ b/infrastructure/prod-deploy/decrypt-prod-secrets.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# Decrypt secret files archive that contain credentials. +# +# This includes: +# - Google Cloud Platform Service Account for using gcloud. +# - Script tp load environment variables used for running Django in production. +openssl aes-256-cbc -K "${encrypted_adab45d1d2ed_key}" -iv "${encrypted_adab45d1d2ed_iv}" -in ./infrastructure/prod-deploy/prod-deploy-secrets.tar.enc -out prod-deploy-secrets.tar -d + +# Unzip the decrypted secret archive. +tar -C ./dthm4kaiako/dthm4kaiako/ -xf dev-deploy-secrets.tar diff --git a/infrastructure/prod-deploy/deploy-app.sh b/infrastructure/prod-deploy/deploy-app.sh new file mode 100644 index 000000000..fa7c7440e --- /dev/null +++ b/infrastructure/prod-deploy/deploy-app.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +source ./infrastructure/prod-deploy/load-prod-deploy-config-envs.sh + +# Deploys the application to Google App Engine + +# Install Google Cloud SDK +./infrastructure/install_google_cloud_sdk.sh + +# Decrypt secret files archive that contain credentials. +./infrastructure/prod-deploy/decrypt-prod-secrets.sh + +# Load environment variables. +source ./load-prod-envs.sh + +# Authenticate with gcloud tool using the decrypted service account credentials. +# See: https://cloud.google.com/sdk/gcloud/reference/auth/activate-service-account +gcloud auth activate-service-account --key-file ${GOOGLE_APPLICATION_CREDENTIALS} + +# Create empty SSH keys with an empty passphrase, for Google Cloud SDK to +# copy files to a VM for building the Docker image. +# Only required for deploying to Google App Engine flexible environment. +# See: https://cloud.google.com/solutions/continuous-delivery-with-travis-ci#continuous_deployment_on_app_engine_flexible_environment_instances +ssh-keygen -q -N "" -f ~/.ssh/google_compute_engine + +# Create app.yaml file using environment variables. +python ./infrastructure/replace_envs.py ./infrastructure/prod-deploy/app.yaml + +# Start system +./dev start +./dev update + +# Publish Django system to Google App Engine. +# +# This deploys using the 'app.yaml' completed earlier that contains +# secret environment variables to use within the application. +# Project is specified to ensure correct project deployment. +# Runs with '--quiet' to skip prompt of confirmation. +# If multiple services are deployed at a later stage, these should be checked +# that the apps deploy to the correct services. +# See: https://cloud.google.com/sdk/gcloud/reference/app/deploy +gcloud app deploy ./app.yaml --quiet --project=dthm4kaiako diff --git a/infrastructure/prod-deploy/load-prod-deploy-config-envs.sh b/infrastructure/prod-deploy/load-prod-deploy-config-envs.sh new file mode 100644 index 000000000..a03e329d5 --- /dev/null +++ b/infrastructure/prod-deploy/load-prod-deploy-config-envs.sh @@ -0,0 +1,4 @@ +# Configuration options for production deployment + +export DEPLOYMENT=prod +export INCLUDE_INCONTEXT_L10N=false diff --git a/infrastructure/prod-deploy/prod-deploy-secrets.tar.enc b/infrastructure/prod-deploy/prod-deploy-secrets.tar.enc new file mode 100644 index 0000000000000000000000000000000000000000..b8ca12fd2f65c8699796b3e5815c39dea58ea947 GIT binary patch literal 10256 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 W0`&b60!YBut9?@H1a}B%$O_1 Date: Sun, 20 Jan 2019 19:57:33 +1300 Subject: [PATCH 37/82] Fix help text for dev commands --- dev | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/dev b/dev index 19ff774b6..9dc339439 100755 --- a/dev +++ b/dev @@ -92,27 +92,27 @@ cmd_collect_static() { echo "Collecting static files..." docker-compose exec django /docker_venv/bin/python3 ./manage.py collectstatic --no-input --clear } -defhelp -dev collect_static "Collecting static files." +defhelp collect_static "Collecting static files." # Run Django flush command cmd_flush() { docker-compose exec django /docker_venv/bin/python3 ./manage.py flush } -defhelp -dev flush 'Run Django flush command.' +defhelp flush 'Run Django flush command.' # Run Django makemigrations command cmd_makemigrations() { echo "Creating database migrations..." docker-compose exec django /docker_venv/bin/python3 ./manage.py makemigrations } -defhelp -dev makemigrations 'Run Django makemigrations command.' +defhelp makemigrations 'Run Django makemigrations command.' # Run Django migrate command cmd_migrate() { echo "Applying database migrations..." docker-compose exec django /docker_venv/bin/python3 ./manage.py migrate } -defhelp -dev migrate 'Run Django migrate command.' +defhelp migrate 'Run Django migrate command.' # Build Docker images cmd_build() { @@ -125,44 +125,44 @@ cmd_build() { docker rmi "${untagged_images[@]}" fi } -defhelp -dev build 'Build or rebuild Docker images.' +defhelp build 'Build or rebuild Docker images.' # Build static files cmd_static() { echo "Building static files..." docker-compose exec nginx gulp build } -defhelp -dev static 'Build static files.' +defhelp static 'Build static files.' # Build production static files cmd_static_prod() { echo "Building production static files..." docker-compose exec nginx gulp build --production } -defhelp -dev static_prod 'Build production static files.' +defhelp static_prod 'Build production static files.' # Run shell cmd_shell() { docker-compose exec django bash } -defhelp -dev shell "Open shell to Django folder." +defhelp shell "Open shell to Django folder." cmd_createsuperuser() { docker-compose exec django /docker_venv/bin/python3 ./manage.py createsuperuser } -defhelp -dev createsuperuser "Create superuser in Django system." +defhelp createsuperuser "Create superuser in Django system." cmd_sampledata() { docker-compose exec django /docker_venv/bin/python3 ./manage.py shell -c "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.filter(email='admin@example.com').delete(); User.objects.create_superuser('admin', 'admin@example.com', 'password')" } -defhelp -dev sampledata "Add sample data to website." +defhelp sampledata "Add sample data to website." # Reboot Django Docker container cmd_reboot_django() { echo "Rebooting Django Docker container..." docker-compose restart django } -defhelp -dev reboot_django 'Reboot Django Docker container.' +defhelp reboot_django 'Reboot Django Docker container.' # Run style checks cmd_style() { @@ -175,7 +175,7 @@ cmd_style() { pydocstyle_status=$? ! (( pep8_status || pydocstyle_status )) } -defhelp -dev style 'Run style checks.' +defhelp style 'Run style checks.' # Run test suite cmd_test_suite() { @@ -183,14 +183,14 @@ cmd_test_suite() { docker-compose exec django /docker_venv/bin/coverage run --rcfile=/dthm4kaiako/.coveragerc -m pytest --ds=config.settings.test # docker-compose exec django /docker_venv/bin/mypy /dthm4kaiako/dthm4kaiako/ } -defhelp -dev test_suite 'Run test suite with code coverage.' +defhelp test_suite 'Run test suite with code coverage.' # Run specific test suite cmd_test_specific() { echo "Running specific test suite..." docker-compose exec django /docker_venv/bin/pytest --ds=config.settings.test "${1}" } -defhelp -dev test_specific 'Run specific test suite. Pass in parameter of Python test module.' +defhelp test_specific 'Run specific test suite. Pass in parameter of Python test module.' # Display test coverage table cmd_test_coverage() { @@ -198,7 +198,7 @@ cmd_test_coverage() { docker-compose exec django /docker_venv/bin/coverage xml -i docker-compose exec django /docker_venv/bin/coverage report -m } -defhelp -dev test_coverage 'Display code coverage report.' +defhelp test_coverage 'Display code coverage report.' # Delete all untagged dangling Docker images cmd_clean() { From d48777161518df5b417cbfb4203faa65320f3039 Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Sun, 20 Jan 2019 19:58:03 +1300 Subject: [PATCH 38/82] Update homepage and base layout --- dthm4kaiako/static/img/logos/aatea-logo.png | Bin 0 -> 49767 bytes .../img/logos/dtta-logo-black-bullet.jpg | Bin 0 -> 20863 bytes .../static/img/logos/dtta-logo-red-bullet.jpg | Bin 0 -> 32294 bytes .../static/img/logos/dtta-logo-white-back.jpg | Bin 0 -> 67899 bytes dthm4kaiako/static/img/logos/dtta-logo.png | Bin 0 -> 25149 bytes .../uc-computer-science-education-logo.png | Bin 0 -> 10461 bytes dthm4kaiako/static/scss/_core-variables.scss | 6 + dthm4kaiako/static/scss/_footer.scss | 16 ++ dthm4kaiako/static/scss/_homepage.scss | 10 + dthm4kaiako/static/scss/_navbar.scss | 7 + dthm4kaiako/static/scss/website.scss | 16 +- dthm4kaiako/templates/base.html | 199 +++++++++++++++--- dthm4kaiako/templates/pages/home.html | 28 ++- 13 files changed, 242 insertions(+), 40 deletions(-) create mode 100644 dthm4kaiako/static/img/logos/aatea-logo.png create mode 100644 dthm4kaiako/static/img/logos/dtta-logo-black-bullet.jpg create mode 100644 dthm4kaiako/static/img/logos/dtta-logo-red-bullet.jpg create mode 100644 dthm4kaiako/static/img/logos/dtta-logo-white-back.jpg create mode 100644 dthm4kaiako/static/img/logos/dtta-logo.png create mode 100644 dthm4kaiako/static/img/logos/uc-computer-science-education-logo.png create mode 100644 dthm4kaiako/static/scss/_core-variables.scss create mode 100644 dthm4kaiako/static/scss/_footer.scss create mode 100644 dthm4kaiako/static/scss/_homepage.scss create mode 100644 dthm4kaiako/static/scss/_navbar.scss diff --git a/dthm4kaiako/static/img/logos/aatea-logo.png b/dthm4kaiako/static/img/logos/aatea-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4adfa53cb2cbbdfc946abd681f5ca64f01472bc5 GIT binary patch literal 49767 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�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 Cmujm3 literal 0 HcmV?d00001 diff --git a/dthm4kaiako/static/img/logos/dtta-logo-white-back.jpg b/dthm4kaiako/static/img/logos/dtta-logo-white-back.jpg new file mode 100644 index 0000000000000000000000000000000000000000..987022c4c8155ba2b09d3cc9a326f149119858da GIT binary patch literal 67899 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%0ATn@Amdm2gX-^k!OebVfr)rBdl7BTX;W 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 TaQ|Np|AH3#x3y0A%h+E59n7Q1 literal 0 HcmV?d00001 diff --git a/dthm4kaiako/static/img/logos/dtta-logo.png b/dthm4kaiako/static/img/logos/dtta-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ff6bf78241228bdd436cbb838dce45899a70503c GIT binary patch literal 25149 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 aH8uaR*_N)-0eK@LimH;PVx7E2#Qy-w#$zl1 literal 0 HcmV?d00001 diff --git a/dthm4kaiako/static/scss/_core-variables.scss b/dthm4kaiako/static/scss/_core-variables.scss new file mode 100644 index 000000000..95e496707 --- /dev/null +++ b/dthm4kaiako/static/scss/_core-variables.scss @@ -0,0 +1,6 @@ +$brand-colour: #22466c; +$brand-colour-light: lighten($brand-colour, 15%); +$brand-colour-dark: darken($brand-colour, 5%); +$navbar-height: 56px; +$text-color: #000; +$white: #fff; diff --git a/dthm4kaiako/static/scss/_footer.scss b/dthm4kaiako/static/scss/_footer.scss new file mode 100644 index 000000000..ae2a1f112 --- /dev/null +++ b/dthm4kaiako/static/scss/_footer.scss @@ -0,0 +1,16 @@ +.white-footer { + border-top: 2px $brand-colour solid; +} +#page-footer { + background-color: $brand-colour; + color: rgba($white, 0.6); + a { + color: $white; + // @include hover-focus { + // color: $white; + // } + } + .footer-statement { + border-top: 1px $white solid; + } +} diff --git a/dthm4kaiako/static/scss/_homepage.scss b/dthm4kaiako/static/scss/_homepage.scss new file mode 100644 index 000000000..a87b9fe9f --- /dev/null +++ b/dthm4kaiako/static/scss/_homepage.scss @@ -0,0 +1,10 @@ +#welcome-jumbotron { + background-color: $brand-colour-light; + color: #fff !important; + padding: 1.5rem; + + .alert { + color: #ffffff; + background-color: #a51c29; + } +} diff --git a/dthm4kaiako/static/scss/_navbar.scss b/dthm4kaiako/static/scss/_navbar.scss new file mode 100644 index 000000000..55b041115 --- /dev/null +++ b/dthm4kaiako/static/scss/_navbar.scss @@ -0,0 +1,7 @@ +#primary-navbar { + background-color: $brand-colour !important; +} + +.navbar-nav .nav-link:hover { + text-decoration: underline; +} diff --git a/dthm4kaiako/static/scss/website.scss b/dthm4kaiako/static/scss/website.scss index a93c937d5..314fb5faa 100644 --- a/dthm4kaiako/static/scss/website.scss +++ b/dthm4kaiako/static/scss/website.scss @@ -1,3 +1,15 @@ +@import "core-variables"; +@import "navbar"; +@import "homepage"; +@import "footer"; + +@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700'); + +body { + padding-top: $navbar-height; + font-family: 'Open Sans', sans-serif !important; +} + //////////////////////////////// //Variables// //////////////////////////////// @@ -29,7 +41,3 @@ $red: #b94a48; border-color: $dark-pink; color: $red; } - -body { - padding-top: 4.5rem; -} diff --git a/dthm4kaiako/templates/base.html b/dthm4kaiako/templates/base.html index cf9ef11bd..bd2095b70 100644 --- a/dthm4kaiako/templates/base.html +++ b/dthm4kaiako/templates/base.html @@ -21,49 +21,178 @@ - - {% if messages %} + {% if messages %} {% for message in messages %} -
    {{ message }}
    +
    {{ message }}
    {% endfor %} - {% endif %} + {% endif %} + + {% block body_container %} + +
    +
    + {% block content_container %} +
    + {% block content %} + {% endblock content %} +
    + {% endblock content_container %} +
    + {% block end_content %} + {% endblock end_content %} +
    +
    +
    + {% endblock body_container %} - {% block content %} -

    Hello, world!

    - {% endblock content %} +
    +
    +
    + + + +
    +
    + + + +
    +
    + + + +
    +
    +
    + + {% block modal %}{% endblock modal %} diff --git a/dthm4kaiako/templates/pages/home.html b/dthm4kaiako/templates/pages/home.html index 63913c188..dd33ea906 100644 --- a/dthm4kaiako/templates/pages/home.html +++ b/dthm4kaiako/templates/pages/home.html @@ -1 +1,27 @@ -{% extends "base.html" %} \ No newline at end of file +{% extends "base.html" %} + +{% load static %} + +{% block body_container %} +
    +
    +
    +

    DTHM for kaiako

    +

    + A website for all New Zealand Digital Techology educators, where we aim to inform and equip you for teaching the Digital Technologies & Hangarau Matihiko curricula. +

    + +
    +
    +
    +{% endblock body_container %} From 5f94ea96ec486369746dd3c116ab4ff3c9abb81d Mon Sep 17 00:00:00 2001 From: Jack Morgan Date: Sun, 20 Jan 2019 21:43:38 +1300 Subject: [PATCH 39/82] Navbar improvements for handling multiple navbars Removed fixed position to readd later --- dthm4kaiako/static/scss/_core-variables.scss | 3 +-- dthm4kaiako/static/scss/_homepage.scss | 2 +- dthm4kaiako/static/scss/_navbar.scss | 9 +++++++-- dthm4kaiako/static/scss/website.scss | 1 - dthm4kaiako/templates/base.html | 2 +- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/dthm4kaiako/static/scss/_core-variables.scss b/dthm4kaiako/static/scss/_core-variables.scss index 95e496707..cc71bab5a 100644 --- a/dthm4kaiako/static/scss/_core-variables.scss +++ b/dthm4kaiako/static/scss/_core-variables.scss @@ -1,6 +1,5 @@ -$brand-colour: #22466c; +$brand-colour: #242b33; $brand-colour-light: lighten($brand-colour, 15%); $brand-colour-dark: darken($brand-colour, 5%); -$navbar-height: 56px; $text-color: #000; $white: #fff; diff --git a/dthm4kaiako/static/scss/_homepage.scss b/dthm4kaiako/static/scss/_homepage.scss index a87b9fe9f..0b67bc937 100644 --- a/dthm4kaiako/static/scss/_homepage.scss +++ b/dthm4kaiako/static/scss/_homepage.scss @@ -1,5 +1,5 @@ #welcome-jumbotron { - background-color: $brand-colour-light; + background-color: #1a538d; color: #fff !important; padding: 1.5rem; diff --git a/dthm4kaiako/static/scss/_navbar.scss b/dthm4kaiako/static/scss/_navbar.scss index 55b041115..8b4137996 100644 --- a/dthm4kaiako/static/scss/_navbar.scss +++ b/dthm4kaiako/static/scss/_navbar.scss @@ -1,7 +1,12 @@ +.navbar { + padding-top: 0; + padding-bottom: 0; +} + #primary-navbar { background-color: $brand-colour !important; } -.navbar-nav .nav-link:hover { - text-decoration: underline; +.nav-link:hover { + background-color: lighten($brand-colour, 10%); } diff --git a/dthm4kaiako/static/scss/website.scss b/dthm4kaiako/static/scss/website.scss index 314fb5faa..640e97812 100644 --- a/dthm4kaiako/static/scss/website.scss +++ b/dthm4kaiako/static/scss/website.scss @@ -6,7 +6,6 @@ @import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700'); body { - padding-top: $navbar-height; font-family: 'Open Sans', sans-serif !important; } diff --git a/dthm4kaiako/templates/base.html b/dthm4kaiako/templates/base.html index bd2095b70..0e5528998 100644 --- a/dthm4kaiako/templates/base.html +++ b/dthm4kaiako/templates/base.html @@ -21,7 +21,7 @@ -