From e68f54c79f61f2cafa65e5ad693605d1deeeaa11 Mon Sep 17 00:00:00 2001 From: squidfunk Date: Fri, 13 Jan 2017 17:34:39 +0100 Subject: [PATCH 01/40] Setup Gemini for visual regression testing --- .gemini.yml | 28 +++++++++++++++++++ .../tests/regression => servers}/selenium.js | 12 +++----- package.json | 1 + 3 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 .gemini.yml rename lib/{tasks/tests/regression => servers}/selenium.js (87%) diff --git a/.gemini.yml b/.gemini.yml new file mode 100644 index 000000000..2a068b35b --- /dev/null +++ b/.gemini.yml @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2017 Martin Donath + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +rootUrl: http://localhost:8000/ +gridUrl: http://localhost:4444/wd/hub + +# Browsers to run tests on +browsers: + chrome: + desiredCapabilities: + browserName: chrome diff --git a/lib/tasks/tests/regression/selenium.js b/lib/servers/selenium.js similarity index 87% rename from lib/tasks/tests/regression/selenium.js rename to lib/servers/selenium.js index 8c16f7df3..f8df471c6 100644 --- a/lib/tasks/tests/regression/selenium.js +++ b/lib/servers/selenium.js @@ -52,6 +52,10 @@ export const start = done => { } } + /* Register signal handler for all relevant events */ + for (const signal of ["SIGTERM", "SIGINT", "exit"]) + process.on(signal, stop) + /* Remember process handle */ server = server || proc done() @@ -62,11 +66,3 @@ export const stop = () => { if (server) server.kill() } - -/* ---------------------------------------------------------------------------- - * Signal handler - * ------------------------------------------------------------------------- */ - -/* Register signal handler for all relevant events */ -for (const signal of ["SIGTERM", "SIGINT", "exit"]) - process.on(signal, stop) diff --git a/package.json b/package.json index 0bd7876a6..f53fda25b 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "eslint": "^3.13.1", "eslint-plugin-mocha": "^4.8.0", "fastclick": "^1.0.6", + "gemini": "^4.14.3", "git-hooks": "^1.1.7", "gulp": "^3.9.1", "gulp-changed": "^1.3.2", From 203087bcb146a228800c53d5b5320125280b53d3 Mon Sep 17 00:00:00 2001 From: squidfunk Date: Wed, 18 Jan 2017 23:23:45 +0100 Subject: [PATCH 02/40] Initial setup of Gemini and first testcases --- .eslintignore | 3 + .gemini.yml => .githooks/pre-commit/branch.sh | 20 ++- .gitignore | 3 + Gulpfile.babel.js | 28 ++-- lib/servers/selenium.js | 11 +- lib/tasks/assets/javascripts/lint.js | 1 + lib/tasks/assets/stylesheets/build.js | 5 +- lib/tasks/mkdocs/serve.js | 2 +- lib/tasks/tests/visual/run.js | 81 +++++++++++ mkdocs.yml | 2 +- package.json | 1 + src/assets/stylesheets/layout/_footer.scss | 8 +- tests/visual/.eslintrc | 8 ++ tests/visual/.gemini-local.json | 15 ++ tests/visual/break.json | 39 ++++++ .../visual/fixtures/extensions/admonition.md | 107 ++++++++++++++ tests/visual/generate.js | 87 ++++++++++++ tests/visual/mkdocs.yml | 75 ++++++++++ tests/visual/suites/extensions/admonition.js | 132 ++++++++++++++++++ 19 files changed, 601 insertions(+), 27 deletions(-) rename .gemini.yml => .githooks/pre-commit/branch.sh (78%) mode change 100644 => 100755 create mode 100644 lib/tasks/tests/visual/run.js create mode 100644 tests/visual/.eslintrc create mode 100644 tests/visual/.gemini-local.json create mode 100644 tests/visual/break.json create mode 100644 tests/visual/fixtures/extensions/admonition.md create mode 100644 tests/visual/generate.js create mode 100644 tests/visual/mkdocs.yml create mode 100644 tests/visual/suites/extensions/admonition.js diff --git a/.eslintignore b/.eslintignore index 747746059..72c56284a 100644 --- a/.eslintignore +++ b/.eslintignore @@ -22,3 +22,6 @@ /build /material /site + +# Gemini reports +/gemini-report diff --git a/.gemini.yml b/.githooks/pre-commit/branch.sh old mode 100644 new mode 100755 similarity index 78% rename from .gemini.yml rename to .githooks/pre-commit/branch.sh index 2a068b35b..1ca662f87 --- a/.gemini.yml +++ b/.githooks/pre-commit/branch.sh @@ -1,3 +1,5 @@ +#!/bin/bash + # Copyright (c) 2016-2017 Martin Donath # Permission is hereby granted, free of charge, to any person obtaining a copy @@ -18,11 +20,15 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. -rootUrl: http://localhost:8000/ -gridUrl: http://localhost:4444/wd/hub +# Determine current branch +BRANCH=`git rev-parse --abbrev-ref HEAD` +echo -n "Hook[pre-commit]: Checking branch..." -# Browsers to run tests on -browsers: - chrome: - desiredCapabilities: - browserName: chrome +# If we're on master, abort commit +if [[ "$BRANCH" == "master" ]]; then + echo "Commits on master are only allowed via Pull Requests. Aborting." + exit 1 +fi + +# We're good +exit 0 diff --git a/.gitignore b/.gitignore index c6cfbd09f..999388163 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,9 @@ /MANIFEST /site +# Gemini reports +/gemini-report + # Distribution files /dist /mkdocs_material.egg-info diff --git a/Gulpfile.babel.js b/Gulpfile.babel.js index 5fefcc60a..64c581b88 100755 --- a/Gulpfile.babel.js +++ b/Gulpfile.babel.js @@ -35,7 +35,10 @@ const config = { src: "src/assets", /* Source directory for assets */ build: "material/assets" /* Target directory for assets */ }, - lib: "lib", /* Libraries */ + lib: "lib", /* Libraries and tasks */ + tests: { + visual: "tests/visual" /* Visual regression tests */ + }, views: { src: "src", /* Source directory for views */ build: "material" /* Target directory for views */ @@ -228,12 +231,11 @@ gulp.task("assets:clean", [ * Minify views */ gulp.task("views:build", (args.revision ? [ - "assets:images:build", - "assets:stylesheets:build", - "assets:javascripts:build" + "assets:build" ] : []).concat(args.clean ? [ "views:clean" -] : []), load("views/build")) +] : []), + load("views/build")) /* * Clean views @@ -270,11 +272,19 @@ gulp.task("mkdocs:serve", * Tests * ------------------------------------------------------------------------- */ +/* + * Run visual tests + */ +gulp.task("tests:visual:run", [ + // "assets:build", + // "views:build" +], load("tests/visual/run")) + /* * Start karma test runner */ gulp.task("tests:unit:watch", - load("tests/unit/watch")) + () => {}) /* ---------------------------------------------------------------------------- * Interface @@ -286,9 +296,9 @@ gulp.task("tests:unit:watch", gulp.task("build", [ "assets:build", "views:build" -].concat(args.mkdocs - ? "mkdocs:build" - : [])) +].concat(args.mkdocs ? [ + "mkdocs:build" +] : [])) /* * Clean assets and documentation diff --git a/lib/servers/selenium.js b/lib/servers/selenium.js index f8df471c6..641237612 100644 --- a/lib/servers/selenium.js +++ b/lib/servers/selenium.js @@ -52,10 +52,6 @@ export const start = done => { } } - /* Register signal handler for all relevant events */ - for (const signal of ["SIGTERM", "SIGINT", "exit"]) - process.on(signal, stop) - /* Remember process handle */ server = server || proc done() @@ -66,3 +62,10 @@ export const stop = () => { if (server) server.kill() } + +/* ---------------------------------------------------------------------------- + * Signals + * ------------------------------------------------------------------------- */ + +for (const signal of ["SIGTERM", "SIGINT", "exit"]) + process.on(signal, stop) diff --git a/lib/tasks/assets/javascripts/lint.js b/lib/tasks/assets/javascripts/lint.js index ffcd5a06b..f71250ecb 100644 --- a/lib/tasks/assets/javascripts/lint.js +++ b/lib/tasks/assets/javascripts/lint.js @@ -23,6 +23,7 @@ import path from "path" import through from "through2" import util from "gulp-util" + import { CLIEngine } from "eslint" /* ---------------------------------------------------------------------------- diff --git a/lib/tasks/assets/stylesheets/build.js b/lib/tasks/assets/stylesheets/build.js index 2f78f1843..622001788 100644 --- a/lib/tasks/assets/stylesheets/build.js +++ b/lib/tasks/assets/stylesheets/build.js @@ -25,6 +25,7 @@ import gulpif from "gulp-if" import mincss from "gulp-cssnano" import mqpacker from "css-mqpacker" import postcss from "gulp-postcss" +import pseudoclasses from "postcss-pseudo-classes" import rev from "gulp-rev" import sass from "gulp-sass" import sourcemaps from "gulp-sourcemaps" @@ -54,7 +55,9 @@ export default (gulp, config, args) => { postcss([ autoprefixer(), mqpacker - ])) + ].concat(!args.optimize ? [ + pseudoclasses() + ] : []))) /* Minify sources */ .pipe(gulpif(args.optimize, mincss())) diff --git a/lib/tasks/mkdocs/serve.js b/lib/tasks/mkdocs/serve.js index 102c2c8b9..14ace0aad 100644 --- a/lib/tasks/mkdocs/serve.js +++ b/lib/tasks/mkdocs/serve.js @@ -39,7 +39,7 @@ export default () => { server.kill() /* Spawn MkDocs server */ - server = child.spawn("mkdocs", ["serve", "-a", "0.0.0.0:8000"], { + server = child.spawn("mkdocs", ["serve", "--dev-addr", "0.0.0.0:8000"], { stdio: "inherit" }) } diff --git a/lib/tasks/tests/visual/run.js b/lib/tasks/tests/visual/run.js new file mode 100644 index 000000000..4cc8d2810 --- /dev/null +++ b/lib/tasks/tests/visual/run.js @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2016-2017 Martin Donath + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +import child from "child_process" +import path from "path" +import * as selenium from "~/lib/servers/selenium" + +import Gemini from "gemini" + +/* ---------------------------------------------------------------------------- + * Task: start test runner + * ------------------------------------------------------------------------- */ + +/* MkDocs server */ +let server = null + +/* ---------------------------------------------------------------------------- + * Task: start test runner + * ------------------------------------------------------------------------- */ + +export default (gulp, config) => { + return () => { + + /* Start MkDocs server */ + return new Promise(resolve => { + server = child.spawn("mkdocs", [ + "serve", "--dev-addr", "127.0.0.1:8000" + ], { + cwd: config.tests.visual, + stdio: [process.stdin, process.stdout, "pipe"] + }) + + /* Wait for MkDocs server and resolve promise */ + server.stderr.on("data", data => { + if (data.toString().match("Serving")) { + server.stderr.removeAllListeners("data") + resolve() + } + }) + + /* Start Selenium */ + }).then(() => { + return new Promise(resolve => { + selenium.start(() => resolve()) + + /* Start Gemini test runner depending on environment */ + }).then(() => { + const gemini = require(path.join( + process.cwd(), `${config.tests.visual}/.gemini-local.json`)) + return new Gemini(gemini).test("tests/visual/suites", { + reporters: ["html"] + }) + }) + .then(() => { + selenium.stop() + }) + }) + .then(() => { + server.kill() + }) + } +} diff --git a/mkdocs.yml b/mkdocs.yml index e60f188ad..2d9040979 100755 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -31,7 +31,7 @@ repo_url: https://github.com/squidfunk/mkdocs-material # Copyright copyright: 'Copyright © 2016 Martin Donath' -# Documentation and theme +# Theme directory theme_dir: material # Options diff --git a/package.json b/package.json index f53fda25b..0ed8d2653 100644 --- a/package.json +++ b/package.json @@ -85,6 +85,7 @@ "mocha": "^3.2.0", "modularscale-sass": "^2.1.1", "node-notifier": "^4.6.1", + "postcss-pseudo-classes": "^0.1.0", "selenium-standalone": "^5.9.1", "stylelint": "^7.7.1", "stylelint-config-standard": "^15.0.1", diff --git a/src/assets/stylesheets/layout/_footer.scss b/src/assets/stylesheets/layout/_footer.scss index f30f2aeb3..de0b65449 100644 --- a/src/assets/stylesheets/layout/_footer.scss +++ b/src/assets/stylesheets/layout/_footer.scss @@ -50,8 +50,8 @@ padding-bottom: 0.8rem; transition: opacity 0.25s; - // [mobile landscape +]: Set proportional width - @include break-from-device(mobile landscape) { + // [tablet +]: Set proportional width + @include break-from-device(tablet) { width: 50%; } @@ -68,8 +68,8 @@ // Title .md-footer-nav__title { - // [mobile portrait -]: Hide title for previous page - @include break-to-device(mobile portrait) { + // [mobile -]: Hide title for previous page + @include break-to-device(mobile) { display: none; } } diff --git a/tests/visual/.eslintrc b/tests/visual/.eslintrc new file mode 100644 index 000000000..fab56404b --- /dev/null +++ b/tests/visual/.eslintrc @@ -0,0 +1,8 @@ +{ + "globals": { + "gemini": true + }, + "rules": { + "no-loop-func": 0 + } +} diff --git a/tests/visual/.gemini-local.json b/tests/visual/.gemini-local.json new file mode 100644 index 000000000..706e5f900 --- /dev/null +++ b/tests/visual/.gemini-local.json @@ -0,0 +1,15 @@ +{ + "rootUrl": "http://localhost:8000", + "screenshotsDir": "./tests/visual/baseline", + "browsers": { + "local-chrome": { + "desiredCapabilities": { + "browserName": "chrome" + } + } + }, + "system": { + "projectRoot": "./", + "sourceRoot": "src/assets/stylesheets" + } +} diff --git a/tests/visual/break.json b/tests/visual/break.json new file mode 100644 index 000000000..de9bc12a0 --- /dev/null +++ b/tests/visual/break.json @@ -0,0 +1,39 @@ +{ + "breakpoints": [ + { + "name": "mobile-portrait", + "size": { + "width": 320, + "height": 600 + } + }, + { + "name": "mobile-landscape", + "size": { + "width": 480, + "height": 600 + } + }, + { + "name": "tablet-portrait", + "size": { + "width": 720, + "height": 600 + } + }, + { + "name": "tablet-landscape", + "size": { + "width": 960, + "height": 600 + } + }, + { + "name": "screen", + "size": { + "width": 1220, + "height": 600 + } + } + ] +} diff --git a/tests/visual/fixtures/extensions/admonition.md b/tests/visual/fixtures/extensions/admonition.md new file mode 100644 index 000000000..903bcdee6 --- /dev/null +++ b/tests/visual/fixtures/extensions/admonition.md @@ -0,0 +1,107 @@ +# Admonition Tests + + + +## Default + +!!! note + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +## Format + +### Custom title + +!!! note "Phasellus posuere in sem ut cursus" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Long title + +!!! note "Phasellus posuere in sem ut cursus. Nullam sit amet tincidunt ipsum, sit amet elementum turpis. Etiam ipsum quam, mattis in purus vitae, lacinia fermentum enim." + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Empty title + +!!! note "" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +## Types + +### Note + +!!! note + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Summary + +!!! summary + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Tip + +!!! tip + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Success + +!!! success + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Warning + +!!! warning + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Failure + +!!! failure + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Danger + +!!! danger + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Bug + +!!! bug + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. diff --git a/tests/visual/generate.js b/tests/visual/generate.js new file mode 100644 index 000000000..a462c803a --- /dev/null +++ b/tests/visual/generate.js @@ -0,0 +1,87 @@ + +const config = require("./break.json") + +// TODO: also pass breakpoints to function! + +const generate = components => { + for (const c of Object.keys(components)) { + const component = components[c] + + // TODO: check states and generate a suite for each state! + // TODO: check name variants! + // TODO: build nested suites only once + // TODO: handle waiting/js + + const states = component.states ? component.states : + [{ name: "", wait: 0 }] + + let done = 0 + for (const state of states) { + gemini.suite(`${c}${state.name}`, suite => { + + /* Set URL of page to capture */ + if (component.url) + suite.setUrl(component.url) + + /* Set elements to capture */ + if (component.capture) + suite.setCaptureElements(component.capture) + + // TODO: otherwise throw error + if (component.break) { + const [mode, name] = component.break.split("@") + + // get matching breakpoint. TODO: handle non-existent!!! + const b = config.breakpoints.findIndex(bp => { + return bp.name === name + }) + + // now split according to method + let breakpoints = [] + switch (mode) { + case "": + breakpoints = config.breakpoints.slice(b, b + 1) + break + case "+": + breakpoints = config.breakpoints.slice( + b, config.breakpoints.length + 1) + break + case "-": + breakpoints = config.breakpoints.slice(0, b + 1) + break + } + + // iterate breakpoints + for (const breakpoint of breakpoints) { + suite.capture(`@${breakpoint.name}`, actions => { + actions.setWindowSize( + breakpoint.size.width, breakpoint.size.height) + if (state.wait) + actions.wait(state.wait) + if (state.name) { + // eval, as its executed at the frontend + if (typeof state.name === "string") { + actions.executeJS(new Function(` + document.querySelector( + "${component.capture}" + ).classList.add("${state.name}") + `) + ) + } else { + actions.executeJS(state.name) + } + } + }) + } + } + + // nested suites + if (!done && component.suite) { + done = 1 + generate(component.suite) + } + }) + } + } +} +export default generate diff --git a/tests/visual/mkdocs.yml b/tests/visual/mkdocs.yml new file mode 100644 index 000000000..a4d5de5e0 --- /dev/null +++ b/tests/visual/mkdocs.yml @@ -0,0 +1,75 @@ +# Copyright (c) 2016-2017 Martin Donath + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +# Project information +site_name: Material for MkDocs Tests +site_description: A Material Design theme for MkDocs +site_author: Martin Donath +site_url: http://squidfunk.github.io/mkdocs-material/ + +# Repository +repo_name: squidfunk/mkdocs-material +repo_url: https://github.com/squidfunk/mkdocs-material + +# Copyright +copyright: 'Copyright © 2016 Martin Donath' + +# Documentation and theme directories +docs_dir: fixtures +theme_dir: ../../material + +# Options +extra: + palette: + primary: indigo + accent: indigo + social: + - type: github-alt + link: https://github.com/squidfunk + - type: twitter + link: https://twitter.com/squidfunk + - type: linkedin + link: https://de.linkedin.com/in/martin-donath-20a95039 + +# Extensions +markdown_extensions: + - markdown.extensions.admonition + - markdown.extensions.codehilite(guess_lang=false) + - markdown.extensions.footnotes + - markdown.extensions.meta + - markdown.extensions.toc(permalink=true) + - pymdownx.arithmatex + - pymdownx.betterem(smart_enable=all) + - pymdownx.caret + - pymdownx.critic + - pymdownx.emoji: + emoji_generator: !!python/name:pymdownx.emoji.to_svg + - pymdownx.inlinehilite + - pymdownx.magiclink + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.superfences + - pymdownx.tasklist(custom_checkbox=true) + - pymdownx.tilde + +# Page tree +pages: + - Extensions: + - Admonition: extensions/admonition.md diff --git a/tests/visual/suites/extensions/admonition.js b/tests/visual/suites/extensions/admonition.js new file mode 100644 index 000000000..b9c810cf8 --- /dev/null +++ b/tests/visual/suites/extensions/admonition.js @@ -0,0 +1,132 @@ +/* +* Copyright (c) 2016-2017 Martin Donath +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to +* deal in the Software without restriction, including without limitation the +* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +* sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +* IN THE SOFTWARE. +*/ + +import generate from "../../generate.js" + +/* ---------------------------------------------------------------------------- + * Tests + * ------------------------------------------------------------------------- */ + +generate({ + + /* + * Admonition block + * + * The admonition block looks the same on everything above tablet + * portrait, so we can save a few testcases. + */ + ".admonition": { + "url": "/extensions/admonition", + "capture": "#default + .admonition", + "break": "-@tablet-portrait", + "suite": { + + /* + * Admonition block with a custom title + */ + "#custom-title": { + "capture": "#custom-title + .admonition", + "break": "@screen" + }, + + /* + * Admonition block with a long title + */ + "#long-title": { + "capture": "#long-title + .admonition", + "break": "@screen" + }, + + /* + * Admonition block with an empty title + */ + "#empty-title": { + "capture": "#empty-title + .admonition", + "break": "@screen" + }, + + /* + * Admonition block with style "note" + */ + "#note": { + "capture": "#note + .admonition", + "break": "@screen" + }, + + /* + * Admonition block with style "summary" + */ + "#summary": { + "capture": "#summary + .admonition", + "break": "@screen" + }, + + /* + * Admonition block with style "tip" + */ + "#tip": { + "capture": "#tip + .admonition", + "break": "@screen" + }, + + /* + * Admonition block with style "success" + */ + "#success": { + "capture": "#success + .admonition", + "break": "@screen" + }, + + /* + * Admonition block with style "warning" + */ + "#warning": { + "capture": "#warning + .admonition", + "break": "@screen" + }, + + /* + * Admonition block with style "failure" + */ + "#failure": { + "capture": "#failure + .admonition", + "break": "@screen" + }, + + /* + * Admonition block with style "danger" + */ + "#danger": { + "capture": "#danger + .admonition", + "break": "@screen" + }, + + /* + * Admonition block with style "bug" + */ + "#bug": { + "capture": "#bug + .admonition", + "break": "@screen" + } + } + } +}) From 28d024af2f4f25bb7e2fed5825b9c0ee85caa95c Mon Sep 17 00:00:00 2001 From: squidfunk Date: Wed, 18 Jan 2017 23:32:56 +0100 Subject: [PATCH 03/40] Try to fix travis --- .travis.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.travis.yml b/.travis.yml index b616c0470..e4380c2f4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,6 +27,19 @@ node_js: - 5 - 6 +# Install a C++11 compatible compiler +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-4.8 + - g++-4.8 + +# Set C++ compiler as default +env: + - CXX=g++-4.8 + # Cache dependencies cache: pip: true From 8f46cc6f09a8a1477984ce64840ea0f2c9185347 Mon Sep 17 00:00:00 2001 From: squidfunk Date: Sat, 28 Jan 2017 19:18:15 +0100 Subject: [PATCH 04/40] Removed static test fixtures --- .../visual/fixtures/extensions/admonition.md | 107 ------------------ 1 file changed, 107 deletions(-) delete mode 100644 tests/visual/fixtures/extensions/admonition.md diff --git a/tests/visual/fixtures/extensions/admonition.md b/tests/visual/fixtures/extensions/admonition.md deleted file mode 100644 index 903bcdee6..000000000 --- a/tests/visual/fixtures/extensions/admonition.md +++ /dev/null @@ -1,107 +0,0 @@ -# Admonition Tests - - - -## Default - -!!! note - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod - nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor - massa, nec semper lorem quam in massa. - -## Format - -### Custom title - -!!! note "Phasellus posuere in sem ut cursus" - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod - nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor - massa, nec semper lorem quam in massa. - -### Long title - -!!! note "Phasellus posuere in sem ut cursus. Nullam sit amet tincidunt ipsum, sit amet elementum turpis. Etiam ipsum quam, mattis in purus vitae, lacinia fermentum enim." - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod - nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor - massa, nec semper lorem quam in massa. - -### Empty title - -!!! note "" - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod - nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor - massa, nec semper lorem quam in massa. - -## Types - -### Note - -!!! note - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod - nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor - massa, nec semper lorem quam in massa. - -### Summary - -!!! summary - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod - nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor - massa, nec semper lorem quam in massa. - -### Tip - -!!! tip - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod - nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor - massa, nec semper lorem quam in massa. - -### Success - -!!! success - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod - nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor - massa, nec semper lorem quam in massa. - -### Warning - -!!! warning - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod - nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor - massa, nec semper lorem quam in massa. - -### Failure - -!!! failure - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod - nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor - massa, nec semper lorem quam in massa. - -### Danger - -!!! danger - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod - nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor - massa, nec semper lorem quam in massa. - -### Bug - -!!! bug - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod - nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor - massa, nec semper lorem quam in massa. From 3783eceb099b65d51169e4f4bc2ae9b5822dcea2 Mon Sep 17 00:00:00 2001 From: squidfunk Date: Sat, 28 Jan 2017 20:25:30 +0100 Subject: [PATCH 05/40] Implemented Gemini screenshot testing base --- .eslintignore | 5 +- .gitignore | 6 +- Gulpfile.babel.js | 34 ++++-- lib/servers/ecstatic.js | 50 ++++++++ lib/servers/selenium.js | 38 ++++--- lib/tasks/tests/visual/clean.js | 38 +++++++ lib/tasks/tests/visual/generate.js | 63 +++++++++++ lib/tasks/tests/visual/run.js | 101 +++++++++++------ lib/tasks/tests/visual/update.js | 72 ++++++++++++ ...99a55ca.css => application-e21055ee85.css} | 2 +- material/base.html | 2 +- package.json | 4 +- scripts/build | 2 +- scripts/clean | 2 +- scripts/start | 2 +- scripts/test/visual/run | 31 +++++ scripts/{test => test/visual/update} | 2 +- .../gemini-local.json} | 4 +- tests/visual/mkdocs.yml | 75 ------------ .../extensions/admonition/docs/index.md | 107 ++++++++++++++++++ .../suites/extensions/admonition/mkdocs.yml | 24 ++++ .../{admonition.js => admonition/suite.js} | 8 +- 22 files changed, 521 insertions(+), 151 deletions(-) create mode 100644 lib/servers/ecstatic.js create mode 100644 lib/tasks/tests/visual/clean.js create mode 100644 lib/tasks/tests/visual/generate.js create mode 100644 lib/tasks/tests/visual/update.js rename material/assets/stylesheets/{application-bc099a55ca.css => application-e21055ee85.css} (65%) create mode 100755 scripts/test/visual/run rename scripts/{test => test/visual/update} (97%) rename tests/visual/{.gemini-local.json => config/gemini-local.json} (67%) delete mode 100644 tests/visual/mkdocs.yml create mode 100644 tests/visual/suites/extensions/admonition/docs/index.md create mode 100644 tests/visual/suites/extensions/admonition/mkdocs.yml rename tests/visual/suites/extensions/{admonition.js => admonition/suite.js} (95%) diff --git a/.eslintignore b/.eslintignore index 72c56284a..3728be369 100644 --- a/.eslintignore +++ b/.eslintignore @@ -18,10 +18,11 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. -# Build files +# Files generated by build /build /material /site -# Gemini reports +# Files generated by visual tests /gemini-report +/tests/visual/data diff --git a/.gitignore b/.gitignore index 999388163..a5e126103 100644 --- a/.gitignore +++ b/.gitignore @@ -25,14 +25,16 @@ /node_modules /npm-debug.log -# Build files +# Files generated by build /build /manifest.json /MANIFEST /site -# Gemini reports +# Files generated by visual tests /gemini-report +/tests/visual/baseline/local +/tests/visual/data # Distribution files /dist diff --git a/Gulpfile.babel.js b/Gulpfile.babel.js index 64c581b88..5aa515544 100755 --- a/Gulpfile.babel.js +++ b/Gulpfile.babel.js @@ -37,7 +37,7 @@ const config = { }, lib: "lib", /* Libraries and tasks */ tests: { - visual: "tests/visual" /* Visual regression tests */ + visual: "tests/visual" /* Base directory for visual tests */ }, views: { src: "src", /* Source directory for views */ @@ -95,7 +95,10 @@ gulp.src = (...glob) => { * Helper function to load a task */ const load = task => { - return require(`./${config.lib}/tasks/${task}`)(gulp, config, args) + return done => { + return require(`./${config.lib}/tasks/${task}`) + .call(gulp, gulp, config, args)(done) + } } /* ---------------------------------------------------------------------------- @@ -269,22 +272,37 @@ gulp.task("mkdocs:serve", load("mkdocs/serve")) /* ---------------------------------------------------------------------------- - * Tests + * Visual tests * ------------------------------------------------------------------------- */ +/* + * Generate visual tests + */ +gulp.task("tests:visual:generate", (args.clean ? [ + // "assets:build", // TODO: only commented out for dev + // "views:build", + "tests:visual:clean" +] : []), + load("tests/visual/generate")) + /* * Run visual tests */ gulp.task("tests:visual:run", [ - // "assets:build", - // "views:build" + "tests:visual:generate" ], load("tests/visual/run")) /* - * Start karma test runner + * Update reference images for visual tests */ -gulp.task("tests:unit:watch", - () => {}) +gulp.task("tests:visual:update", + load("tests/visual/update")) + +/* + * Clean files generated by visual tests + */ +gulp.task("tests:visual:clean", + load("tests/visual/clean")) /* ---------------------------------------------------------------------------- * Interface diff --git a/lib/servers/ecstatic.js b/lib/servers/ecstatic.js new file mode 100644 index 000000000..cfb2df0cf --- /dev/null +++ b/lib/servers/ecstatic.js @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2016-2017 Martin Donath + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +import ecstatic from "ecstatic" +import * as http from "http" + +/* ---------------------------------------------------------------------------- + * Locals + * ------------------------------------------------------------------------- */ + +/* Static file server */ +let server = null + +/* ---------------------------------------------------------------------------- + * Functions + * ------------------------------------------------------------------------- */ + +export const start = (directory, port, done) => { + server = http.createServer(ecstatic({ + root: directory + })) + + /* Listen and register signal handlers */ + server.listen(port, "127.0.0.1", done) + for (const signal of ["SIGTERM", "SIGINT", "exit"]) + process.on(signal, stop) +} + +export const stop = done => { + server.close(done) +} diff --git a/lib/servers/selenium.js b/lib/servers/selenium.js index 641237612..81d705c5a 100644 --- a/lib/servers/selenium.js +++ b/lib/servers/selenium.js @@ -35,17 +35,26 @@ let server = null export const start = done => { selenium.start({}, (err, proc) => { + + /* Register signal handlers */ + for (const signal of ["SIGTERM", "SIGINT", "exit"]) + process.on(signal, stop) if (err) { /* Install selenium, if not present */ if (/^Missing(.*)chromedriver$/.test(err.message)) { - selenium.install(done) - - /* Start selenium again */ - selenium.start({}, (err_, proc_) => { - server = proc_ + new Promise(resolve => { + selenium.install({}, resolve) }) + /* Start selenium again */ + .then(() => { + selenium.start({}, (err_, proc_) => { + server = proc_ + done() + }) + }) + /* Otherwise, throw error */ } else { throw err @@ -53,19 +62,18 @@ export const start = done => { } /* Remember process handle */ - server = server || proc + server = proc done() }) } -export const stop = () => { - if (server) +export const stop = done => { + if (server) { + if (typeof done === "function") + server.on("exit", done) server.kill() + + /* Unset, so we don't try to kill the server twice */ + server = null + } } - -/* ---------------------------------------------------------------------------- - * Signals - * ------------------------------------------------------------------------- */ - -for (const signal of ["SIGTERM", "SIGINT", "exit"]) - process.on(signal, stop) diff --git a/lib/tasks/tests/visual/clean.js b/lib/tasks/tests/visual/clean.js new file mode 100644 index 000000000..238d548ab --- /dev/null +++ b/lib/tasks/tests/visual/clean.js @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2016-2017 Martin Donath + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +import clean from "del" +import vinyl from "vinyl-paths" + +/* ---------------------------------------------------------------------------- + * Task: clean files generated by visual tests + * ------------------------------------------------------------------------- */ + +export default (gulp, config) => { + return () => { + return gulp.src([ + `${config.tests.visual}/data`, + "./gemini-report" + ]) + .pipe(vinyl(clean)) + } +} diff --git a/lib/tasks/tests/visual/generate.js b/lib/tasks/tests/visual/generate.js new file mode 100644 index 000000000..ca0dea700 --- /dev/null +++ b/lib/tasks/tests/visual/generate.js @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2016-2017 Martin Donath + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +import child from "child_process" +import path from "path" +import through from "through2" +import util from "gulp-util" + +/* ---------------------------------------------------------------------------- + * Task: generate visual tests + * ------------------------------------------------------------------------- */ + +export default (gulp, config) => { + const theme = path.resolve(process.cwd(), config.views.build) + return () => { + return gulp.src(`${config.tests.visual}/suites/**/mkdocs.yml`) + .pipe( + through.obj(function(file, enc, done) { + if (file.isNull() || file.isStream()) + return done() + + /* Resolve test name and destination */ + const name = path.relative(`${config.tests.visual}/suites`, + path.dirname(file.path)) + const site = path.resolve(process.cwd(), + `${config.tests.visual}/data`, name, "_") + + /* Generate test fixtures with freshly built theme */ + const proc = child.spawnSync("mkdocs", [ + "build", "--site-dir", site, "--theme-dir", theme + ], { + cwd: path.dirname(file.path) + }) + + /* Emit error, if any */ + if (proc.status) + this.emit("error", new util.PluginError("mkdocs", + `Terminated with errors: ${proc.stderr.toString()}`)) + + /* Terminate */ + done() + })) + } +} diff --git a/lib/tasks/tests/visual/run.js b/lib/tasks/tests/visual/run.js index 4cc8d2810..16f52d19c 100644 --- a/lib/tasks/tests/visual/run.js +++ b/lib/tasks/tests/visual/run.js @@ -20,62 +20,91 @@ * IN THE SOFTWARE. */ -import child from "child_process" import path from "path" +import * as ecstatic from "~/lib/servers/ecstatic" import * as selenium from "~/lib/servers/selenium" import Gemini from "gemini" /* ---------------------------------------------------------------------------- - * Task: start test runner + * Test runner: Selenium * ------------------------------------------------------------------------- */ -/* MkDocs server */ -let server = null +class SeleniumTestRunner { + + /** + * Start Selenium + * + * @param {Function} done - Resolve callback + */ + start(done) { + selenium.start(done) + } + + /** + * Stop Selenium + * + * @param {Function} done - Resolve callback + */ + stop(done) { + selenium.stop(done) + } +} /* ---------------------------------------------------------------------------- - * Task: start test runner + * Task: run visual tests * ------------------------------------------------------------------------- */ -export default (gulp, config) => { - return () => { +export default (gulp, config, args) => { + return done => { - /* Start MkDocs server */ - return new Promise(resolve => { - server = child.spawn("mkdocs", [ - "serve", "--dev-addr", "127.0.0.1:8000" - ], { - cwd: config.tests.visual, - stdio: [process.stdin, process.stdout, "pipe"] - }) + /* Start static file server */ + new Promise(resolve => { + ecstatic.start(`${config.tests.visual}/data`, 8000, resolve) - /* Wait for MkDocs server and resolve promise */ - server.stderr.on("data", data => { - if (data.toString().match("Serving")) { - server.stderr.removeAllListeners("data") - resolve() - } - }) - - /* Start Selenium */ + /* Create and start test runner */ }).then(() => { - return new Promise(resolve => { - selenium.start(() => resolve()) - - /* Start Gemini test runner depending on environment */ - }).then(() => { - const gemini = require(path.join( - process.cwd(), `${config.tests.visual}/.gemini-local.json`)) - return new Gemini(gemini).test("tests/visual/suites", { - reporters: ["html"] + return new Promise((resolve, reject) => { + const runner = new SeleniumTestRunner() + runner.start(err => { + return err ? reject(err) : resolve(runner) }) }) - .then(() => { - selenium.stop() + + /* Setup and run Gemini */ + .then(runner => { + const gemini = require( + path.join(process.cwd(), `${config.tests.visual}/config`, + process.env.CI || process.env.SAUCE + ? "gemini-sauce.json" + : "gemini-local.json")) + + /* Start Gemini and return runner upon finish */ + return new Gemini(gemini).test(`${config.tests.visual}/suites`, { + reporters: [process.env.CI ? "flat" : "html"], + grep: args.grep ? new RegExp(args.grep, "i") : null, + browsers: args.browsers ? [].concat(args.browsers) : null + }) + + /* Return runner for graceful stop */ + .then(() => { + return runner + }) }) + + /* Stop test runner */ + .then(runner => { + return new Promise(resolve => { + runner.stop(resolve) + }) + }) + + /* Stop static file server */ }) .then(() => { - server.kill() + ecstatic.stop(done) + }, err => { + return done(err) }) } } diff --git a/lib/tasks/tests/visual/update.js b/lib/tasks/tests/visual/update.js new file mode 100644 index 000000000..ec5a4cc1a --- /dev/null +++ b/lib/tasks/tests/visual/update.js @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2016-2017 Martin Donath + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +import fs from "fs" +import path from "path" +import through from "through2" + +/* ---------------------------------------------------------------------------- + * Task: update reference images for visual tests + * ------------------------------------------------------------------------- */ + +export default (gulp, config) => { + return () => { + const base = path.join( + process.cwd(), `${config.tests.visual}/config`) + + /* Read Gemini configs and map browsers to screenshot directories */ + const mapping = fs.readdirSync(base) + .reduce((result, filename) => { + return Object.assign(result, (gemini => { + return Object.keys(gemini.browsers) + .reduce((browsers, name) => { + browsers[name] = gemini.screenshotsDir + return browsers + }, {}) + })(require(path.join(base, filename)))) + }, {}) + + /* Prepare filenames */ + const dest = path.join(process.cwd(), `${config.tests.visual}/baseline`) + return gulp.src("gemini-report/images/**/*~current.png") + .pipe( + through.obj(function(file, enc, done) { + if (file.isNull() || file.isStream()) + return done() + + /* Remove the state from the filename */ + file.path = file.path.replace("~current", "") + + /* Retrieve the folder for the environment of the baseline */ + const folder = path.relative(dest, + mapping[path.basename(file.path, ".png")]) + file.path = file.path.replace("images", `images/${folder}`) + + /* Push file to next stage */ + this.push(file) + done() + })) + + /* Update reference images */ + .pipe(gulp.dest(dest)) + } +} diff --git a/material/assets/stylesheets/application-bc099a55ca.css b/material/assets/stylesheets/application-e21055ee85.css similarity index 65% rename from material/assets/stylesheets/application-bc099a55ca.css rename to material/assets/stylesheets/application-e21055ee85.css index 9eb7ec3c9..e4b177f64 100644 --- a/material/assets/stylesheets/application-bc099a55ca.css +++ b/material/assets/stylesheets/application-e21055ee85.css @@ -1 +1 @@ -html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}html{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none}body{margin:0}hr{overflow:visible;box-sizing:content-box}a{-webkit-text-decoration-skip:objects}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}a:active,a:hover{outline-width:0}small,sub,sup{font-size:80%}sub,sup{position:relative;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}table{border-collapse:collapse;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{padding:0;background:transparent;font-size:inherit}button,input{border:0;outline:0}.admonition:before,.md-icon,.md-nav__button,.md-nav__link:after,.md-nav__title:before,.md-typeset .critic.comment:before,.md-typeset .footnote-backref,.md-typeset .task-list-control .task-list-indicator:before{font-family:Material Icons;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;white-space:nowrap;speak:none;word-wrap:normal;direction:ltr}.md-content__edit,.md-footer-nav__button,.md-header-nav__button,.md-nav__button,.md-nav__title:before{display:inline-block;margin:.4rem;padding:.8rem;font-size:2.4rem;cursor:pointer}.md-icon--arrow-back:before{content:"arrow_back"}.md-icon--arrow-forward:before{content:"arrow_forward"}.md-icon--menu:before{content:"menu"}.md-icon--search:before{content:"search"}.md-icon--home:before{content:"school"}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,input{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","onum","liga";font-feature-settings:"kern","onum","liga";font-weight:400}.no-fontface body,.no-fontface input{font-family:Helvetica Neue,Helvetica,Arial,sans-serif}code,kbd,pre{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","onum","liga";font-feature-settings:"kern","onum","liga";font-weight:400}.no-fontface code,.no-fontface kbd,.no-fontface pre{font-family:Courier New,Courier,monospace}.md-typeset{font-size:1.6rem;line-height:1.6;-webkit-print-color-adjust:exact}.md-typeset blockquote,.md-typeset ol,.md-typeset p,.md-typeset ul{margin:1em 0}.md-typeset h1{margin:0 0 4rem;color:rgba(0,0,0,.54);font-size:3.125rem;line-height:1.3}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{margin:4rem 0 1.6rem;font-size:2.5rem;line-height:1.4}.md-typeset h3{margin:3.2rem 0 1.6rem;font-size:2rem;font-weight:400;letter-spacing:-.01em;line-height:1.5}.md-typeset h2+h3{margin-top:1.6rem}.md-typeset h4{font-size:1.6rem}.md-typeset h4,.md-typeset h5,.md-typeset h6{margin:1.6rem 0;font-weight:700;letter-spacing:-.01em}.md-typeset h5,.md-typeset h6{color:rgba(0,0,0,.54);font-size:1.28rem}.md-typeset h5{text-transform:uppercase}.md-typeset hr{margin:1.5em 0;border-bottom:.1rem dotted rgba(0,0,0,.26)}.md-typeset a{color:#3f51b5;word-break:break-word}.md-typeset a,.md-typeset a:before{-webkit-transition:color .125s;transition:color .125s}.md-typeset a:active,.md-typeset a:hover{color:#536dfe}.md-typeset code,.md-typeset pre{background-color:hsla(0,0%,93%,.5);color:#37474f;font-size:85%}.md-typeset code{margin:0 .29412em;padding:.07353em 0;border-radius:.2rem;box-shadow:.29412em 0 0 hsla(0,0%,93%,.5),-.29412em 0 0 hsla(0,0%,93%,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{margin:0;background-color:transparent;box-shadow:none}.md-typeset a>code{margin:inherit;padding:inherit;border-radius:none;background-color:inherit;color:inherit;box-shadow:none}.md-typeset pre{margin:1em 0;padding:1rem 1.2rem;border-radius:.2rem;line-height:1.4;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset pre::-webkit-scrollbar{width:.4rem;height:.4rem}.md-typeset pre::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset pre>code{margin:0;background-color:transparent;font-size:inherit;box-shadow:none;-webkit-box-decoration-break:none;box-decoration-break:none}.md-typeset kbd{padding:0 .29412em;border:.1rem solid #c9c9c9;border-radius:.2rem;border-bottom-color:#bcbcbc;background-color:#fcfcfc;color:#555;font-size:85%;box-shadow:0 .1rem 0 #b0b0b0;word-break:break-word}.md-typeset mark{margin:0 .25em;padding:.0625em 0;border-radius:.2rem;background-color:rgba(255,235,59,.5);box-shadow:.25em 0 0 rgba(255,235,59,.5),-.25em 0 0 rgba(255,235,59,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset abbr{border-bottom:.1rem dotted rgba(0,0,0,.54);cursor:help}.md-typeset small{opacity:.75}.md-typeset sub,.md-typeset sup{margin-left:.07812em}.md-typeset blockquote{padding-left:1.2rem;border-left:.4rem solid rgba(0,0,0,.26);color:rgba(0,0,0,.54)}.md-typeset ul{list-style-type:disc}.md-typeset ol,.md-typeset ul{margin-left:.625em;padding:0}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em;margin-left:1.25em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin:.5em 0 .5em .625em}.md-typeset iframe,.md-typeset img,.md-typeset svg{max-width:100%}.md-typeset table:not([class]){box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);margin:2em 0;border-radius:.2rem;font-size:1.28rem;overflow:hidden}.no-js .md-typeset table:not([class]){display:inline-block;max-width:100%;margin:.8em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}.md-typeset table:not([class]) th{min-width:10rem;padding:1.2rem 1.6rem;background-color:rgba(0,0,0,.54);color:#fff;vertical-align:top}.md-typeset table:not([class]) td{padding:1.2rem 1.6rem;border-top:.1rem solid rgba(0,0,0,.07);vertical-align:top}.md-typeset table:not([class]) tr:first-child td{border-top:0}.md-typeset table:not([class]) a{word-break:normal}.md-typeset .md-typeset__table{margin:1.6em -1.6rem;overflow-x:auto;-webkit-overflow-scrolling:touch}.md-typeset .md-typeset__table table{display:inline-block;margin:0 1.6rem}html{font-size:62.5%}body,html{height:100%}body{position:relative}hr{display:block;height:.1rem;padding:0;border:0}.md-svg{display:none}.md-grid{max-width:122rem;margin-right:auto;margin-left:auto}.md-container,.md-main{overflow:auto}.md-container{display:table;width:100%;height:100%;table-layout:fixed}.md-main{display:table-row;height:100%}.md-main__inner{margin-top:5.6rem;padding-top:3rem;overflow:auto}.csscalc .md-main__inner{min-height:calc(100% - 2.6rem)}@-moz-document url-prefix(){.csscalc .md-main__inner{min-height:calc(100% - 5.6rem)}}.md-toggle{display:none}.md-overlay{position:fixed;top:0;width:0;height:0;-webkit-transition:width 0s .25s,height 0s .25s,opacity .25s;transition:width 0s .25s,height 0s .25s,opacity .25s;background-color:rgba(0,0,0,.54);opacity:0;z-index:2}.md-flex{display:table}.md-flex__cell{display:table-cell;position:relative;vertical-align:top}.md-flex__cell--shrink{width:0}.md-flex__cell--stretch{display:table;width:100%;table-layout:fixed}.md-flex__ellipsis{display:table-cell;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}@page{margin:25mm}.md-content__inner{margin:2.4rem 1.6rem}.md-content__edit{float:right}.md-header{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:fixed;top:0;right:0;left:0;height:5.6rem;-webkit-transition:background-color .25s;transition:background-color .25s;background-color:#3f51b5;color:#fff;z-index:1}.md-header-nav{padding:.4rem}.md-header-nav__button{position:relative;-webkit-transition:opacity .25s;transition:opacity .25s;z-index:1}.md-header-nav__button:hover{opacity:.7}.md-header-nav__button.md-logo img{display:block}.no-js .md-header-nav__button.md-icon--search{display:none}.md-header-nav__title{padding:0 2rem;font-size:1.8rem;line-height:4.8rem}.md-header-nav__parent{color:hsla(0,0%,100%,.7)}.md-header-nav__parent:after{display:inline;color:hsla(0,0%,100%,.3);content:"/"}.md-header-nav__source{display:none}.md-footer-nav{background-color:rgba(0,0,0,.87);color:#fff}.md-footer-nav__inner{padding:.4rem;overflow:auto}.md-footer-nav__link{padding-top:2.8rem;padding-bottom:.8rem;-webkit-transition:opacity .25s;transition:opacity .25s}.md-footer-nav__link:hover{opacity:.7}.md-footer-nav__link--prev{width:25%;float:left}.md-footer-nav__link--next{width:75%;float:right;text-align:right}.md-footer-nav__button{-webkit-transition:background .25s;transition:background .25s}.md-footer-nav__title{position:relative;padding:0 2rem;font-size:1.8rem;line-height:4.8rem}.md-footer-nav__direction{position:absolute;right:0;left:0;margin-top:-2rem;padding:0 2rem;color:hsla(0,0%,100%,.7);font-size:1.5rem}.md-footer-meta{background:rgba(0,0,0,.895)}.md-footer-meta__inner{padding:.4rem;overflow:auto}html .md-footer-meta.md-typeset a{color:hsla(0,0%,100%,.7)}.md-footer-copyright{margin:0 1.2rem;padding:.8rem 0;color:hsla(0,0%,100%,.3);font-size:1.28rem}.md-footer-copyright__highlight{color:hsla(0,0%,100%,.7)}.md-footer-social{margin:0 .8rem;padding:.4rem 0 1.2rem}.md-footer-social__link{display:inline-block;width:3.2rem;height:3.2rem;border:.1rem solid hsla(0,0%,100%,.12);border-radius:100%;color:hsla(0,0%,100%,.7);font-size:1.6rem;text-align:center}.md-footer-social__link:before{line-height:1.9}.md-nav{font-size:1.4rem;line-height:1.3}.md-nav--secondary{-webkit-transition:border-left .25s;transition:border-left .25s;border-left:.4rem solid #3f51b5}.md-nav__title{display:block;padding:1.2rem 1.2rem 0;font-weight:700;text-overflow:ellipsis;overflow:hidden}.md-nav__title:before{display:none;content:"arrow_back"}.md-nav__title .md-nav__button{display:none}.md-nav__list{margin:0;padding:0;list-style:none}.md-nav__item{padding:.625em 1.2rem 0}.md-nav__item:last-child{padding-bottom:1.2rem}.md-nav__item .md-nav__item{padding-right:0}.md-nav__item .md-nav__item:last-child{padding-bottom:0}.md-nav__button img{width:100%;height:auto}.md-nav__link{display:block;-webkit-transition:color .125s;transition:color .125s;text-overflow:ellipsis;cursor:pointer;overflow:hidden}.md-nav__item--nested>.md-nav__link:after{content:"keyboard_arrow_down"}html .md-nav__link[for=toc],html .md-nav__link[for=toc]+.md-nav__link:after,html .md-nav__link[for=toc]~.md-nav{display:none}.md-nav__link[data-md-state=blur]{color:rgba(0,0,0,.54)}.md-nav__link--active,.md-nav__link:active{color:#3f51b5}.md-nav__link:hover{color:#536dfe}.md-nav__source,.no-js .md-search{display:none}.md-search__overlay{display:none;pointer-events:none}.md-search__inner{width:100%}.md-search__form{position:relative}.md-search__input{position:relative;padding:0 1.6rem 0 7.2rem;text-overflow:ellipsis;z-index:1}.md-search__input+.md-search__icon,.md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__input::-ms-clear{display:none}.md-search__icon{position:absolute;top:.8rem;left:1.2rem;-webkit-transition:color .25s;transition:color .25s;font-size:2.4rem;cursor:pointer;z-index:1}.md-search__icon:before{content:"search"}.md-search__output{position:absolute;width:100%;border-radius:0 0 .2rem .2rem;overflow:hidden}.md-search__scrollwrap{height:100%;background:-webkit-linear-gradient(top,#fff 10%,hsla(0,0%,100%,0)),-webkit-linear-gradient(top,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background:linear-gradient(180deg,#fff 10%,hsla(0,0%,100%,0)),linear-gradient(180deg,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background-attachment:local,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100% 2rem,100% 1rem;box-shadow:inset 0 .1rem 0 rgba(0,0,0,.07);overflow-y:auto;-webkit-overflow-scrolling:touch}.md-search-result__meta{padding:0 1.6rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-size:1.28rem;line-height:4rem}.md-search-result__list{margin:0;padding:0;border-top:.1rem solid rgba(0,0,0,.07);list-style:none}.md-search-result__item{box-shadow:0 -.1rem 0 rgba(0,0,0,.07)}.md-search-result__link{display:block;padding:0 1.6rem;-webkit-transition:background .25s;transition:background .25s;overflow:auto}.md-search-result__link:hover{background-color:rgba(83,109,254,.1)}.md-search-result__article{margin:1em 0}.md-search-result__title{margin-top:.5em;margin-bottom:0;color:rgba(0,0,0,.87);font-size:1.6rem;font-weight:400;line-height:1.4}.md-search-result__teaser{margin:.5em 0;color:rgba(0,0,0,.54);font-size:1.28rem;line-height:1.4;word-break:break-word}.md-sidebar{position:relative;width:24.2rem;padding:2.4rem 0;float:left;overflow:visible}.md-sidebar[data-md-state=lock]{position:fixed;top:5.6rem;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-sidebar--secondary{display:none}.md-sidebar__scrollwrap{max-height:100%;margin:0 .4rem;overflow-y:auto}.md-sidebar__scrollwrap::-webkit-scrollbar{width:.4rem;height:.4rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}@-webkit-keyframes a{0%{height:0}to{height:1.3rem}}@keyframes a{0%{height:0}to{height:1.3rem}}@-webkit-keyframes b{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes b{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}.md-source{display:block;-webkit-transition:opacity .25s;transition:opacity .25s;font-size:1.3rem;line-height:1.2;white-space:nowrap}.md-source:hover{opacity:.7}.md-source:after,.md-source__icon{display:inline-block;height:4.8rem;content:"";vertical-align:middle}.md-source__icon{width:4.8rem}.md-source__icon svg{margin-top:1.2rem;margin-left:1.2rem}.md-source__icon+.md-source__repository{margin-left:-4.4rem;padding-left:4rem}.md-source__repository{display:inline-block;max-width:100%;margin-left:1.2rem;font-weight:700;text-overflow:ellipsis;overflow:hidden;vertical-align:middle}.md-source__facts{margin:0;padding:0;font-size:1.1rem;font-weight:700;list-style-type:none;opacity:.75;overflow:hidden}[data-md-state=done] .md-source__facts{-webkit-animation:a .25s ease-in;animation:a .25s ease-in}.md-source__fact{float:left}[data-md-state=done] .md-source__fact{-webkit-animation:b .4s ease-out;animation:b .4s ease-out}.md-source__fact:before{margin:0 .2rem;content:"\00B7"}.md-source__fact:first-child:before{display:none}.admonition{position:relative;margin:1.5625em 0;padding:.8rem 1.2rem;border-left:3.2rem solid rgba(68,138,255,.4);border-radius:.2rem;background-color:rgba(68,138,255,.15);font-size:1.28rem}.admonition:before{position:absolute;left:-2.6rem;color:#fff;font-size:2rem;content:"edit";vertical-align:-.25em}.admonition :first-child{margin-top:0}.admonition :last-child{margin-bottom:0}.admonition.summary,.admonition.tldr{border-color:rgba(0,176,255,.4);background-color:rgba(0,176,255,.15)}.admonition.summary:before,.admonition.tldr:before{content:"subject"}.admonition.hint,.admonition.important,.admonition.tip{border-color:rgba(0,191,165,.4);background-color:rgba(0,191,165,.15)}.admonition.hint:before,.admonition.important:before,.admonition.tip:before{content:"whatshot"}.admonition.check,.admonition.done,.admonition.success{border-color:rgba(0,230,118,.4);background-color:rgba(0,230,118,.15)}.admonition.check:before,.admonition.done:before,.admonition.success:before{content:"done"}.admonition.attention,.admonition.caution,.admonition.warning{border-color:rgba(255,145,0,.4);background-color:rgba(255,145,0,.15)}.admonition.attention:before,.admonition.caution:before,.admonition.warning:before{content:"warning"}.admonition.fail,.admonition.failure,.admonition.missing{border-color:rgba(255,82,82,.4);background-color:rgba(255,82,82,.15)}.admonition.fail:before,.admonition.failure:before,.admonition.missing:before{content:"clear"}.admonition.danger,.admonition.error{border-color:rgba(255,23,68,.4);background-color:rgba(255,23,68,.15)}.admonition.danger:before,.admonition.error:before{content:"flash_on"}.admonition.bug{border-color:rgba(245,0,87,.4);background-color:rgba(245,0,87,.15)}.admonition.bug:before{content:"bug_report"}.admonition-title{font-weight:700}html .admonition-title{margin-bottom:0}html .admonition-title+*{margin-top:0}.codehilite .o,.codehilite .ow{color:inherit}.codehilite .ge{color:#000}.codehilite .gr{color:#a00}.codehilite .gh{color:#999}.codehilite .go{color:#888}.codehilite .gp{color:#555}.codehilite .gs{color:inherit}.codehilite .gu{color:#aaa}.codehilite .gt{color:#a00}.codehilite .gd{background-color:#fdd}.codehilite .gi{background-color:#dfd}.codehilite .k{color:#3b78e7}.codehilite .kc{color:#a71d5d}.codehilite .kd,.codehilite .kn{color:#3b78e7}.codehilite .kp{color:#a71d5d}.codehilite .kr,.codehilite .kt{color:#3e61a2}.codehilite .c,.codehilite .cm{color:#999}.codehilite .cp{color:#666}.codehilite .c1,.codehilite .ch,.codehilite .cs{color:#999}.codehilite .na,.codehilite .nb{color:#c2185b}.codehilite .bp{color:#3e61a2}.codehilite .nc{color:#c2185b}.codehilite .no{color:#3e61a2}.codehilite .nd,.codehilite .ni{color:#666}.codehilite .ne,.codehilite .nf{color:#c2185b}.codehilite .nl{color:#3b5179}.codehilite .nn{color:#ec407a}.codehilite .nt{color:#3b78e7}.codehilite .nv,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#3e61a2}.codehilite .nx{color:#ec407a}.codehilite .il,.codehilite .m,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#e74c3c}.codehilite .s,.codehilite .sb,.codehilite .sc{color:#0d904f}.codehilite .sd{color:#999}.codehilite .s2{color:#0d904f}.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sx{color:#183691}.codehilite .sr{color:#009926}.codehilite .s1,.codehilite .ss{color:#0d904f}.codehilite .err{color:#a61717}.codehilite .w{color:transparent}.codehilite .hll{display:block;margin:0 -1.2rem;padding:0 1.2rem;background-color:rgba(255,235,59,.5)}.md-typeset .codehilite{margin:1em 0;padding:1rem 1.2rem .8rem;border-radius:.2rem;background-color:hsla(0,0%,93%,.5);color:#37474f;line-height:1.4;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .codehilite::-webkit-scrollbar{width:.4rem;height:.4rem}.md-typeset .codehilite::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset .codehilite::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset .codehilite pre{display:inline-block;min-width:100%;margin:0;padding:0;background-color:transparent;overflow:visible;vertical-align:top}.md-typeset .codehilitetable{display:block;margin:1em 0;border-radius:.2em;font-size:1.6rem;overflow:hidden}.md-typeset .codehilitetable tbody,.md-typeset .codehilitetable td{display:block;padding:0}.md-typeset .codehilitetable tr{display:-webkit-box;display:-ms-flexbox;display:flex}.md-typeset .codehilitetable .codehilite,.md-typeset .codehilitetable .linenodiv{margin:0;border-radius:0}.md-typeset .codehilitetable .linenodiv{padding:1rem 1.2rem .8rem}.md-typeset .codehilitetable .linenodiv,.md-typeset .codehilitetable .linenodiv>pre{height:100%}.md-typeset .codehilitetable .linenos{background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.26);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-typeset .codehilitetable .linenos pre{margin:0;padding:0;background-color:transparent;color:inherit;text-align:right}.md-typeset .codehilitetable .code{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.md-typeset>.codehilitetable{box-shadow:none}.md-typeset .footnote{color:rgba(0,0,0,.54);font-size:1.28rem}.md-typeset .footnote ol{margin-left:0}.md-typeset .footnote li{-webkit-transition:color .25s;transition:color .25s}.md-typeset .footnote li:before{display:block;height:0}.md-typeset .footnote li:target{color:rgba(0,0,0,.87)}.md-typeset .footnote li:target:before{margin-top:-9rem;padding-top:9rem;pointer-events:none}.md-typeset .footnote li :first-child{margin-top:0}.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}.md-typeset .footnote li:hover .footnote-backref:hover,.md-typeset .footnote li:target .footnote-backref{color:#536dfe}.md-typeset .footnote-backref{display:inline-block;-webkit-transform:translateX(.5rem);transform:translateX(.5rem);-webkit-transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s,-webkit-transform .25s .125s;color:rgba(0,0,0,.26);font-size:0;opacity:0;vertical-align:text-bottom}.md-typeset .footnote-backref:before{font-size:1.6rem;content:"keyboard_return"}.md-typeset .headerlink{display:inline-block;margin-left:1rem;-webkit-transform:translateY(.5rem);transform:translateY(.5rem);-webkit-transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s,-webkit-transform .25s .25s;opacity:0}html body .md-typeset .headerlink{color:rgba(0,0,0,.26)}.md-typeset [id]:before{display:inline-block;content:""}.md-typeset [id]:target:before{margin-top:-9.8rem;padding-top:9.8rem}.md-typeset [id] .headerlink:focus,.md-typeset [id]:hover .headerlink,.md-typeset [id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset [id] .headerlink:focus,.md-typeset [id]:hover .headerlink:hover,.md-typeset [id]:target .headerlink{color:#536dfe}.md-typeset h1[id]{padding-top:.8rem}.md-typeset h1[id].headerlink{display:none}.md-typeset h2[id]:before{display:block;margin-top:-.4rem;padding-top:.4rem}.md-typeset h2[id]:target:before{margin-top:-8.4rem;padding-top:8.4rem}.md-typeset h3[id]:before{display:block;margin-top:-.7rem;padding-top:.7rem}.md-typeset h3[id]:target:before{margin-top:-8.7rem;padding-top:8.7rem}.md-typeset h4[id]:before{display:block;margin-top:-.8rem;padding-top:.8rem}.md-typeset h4[id]:target:before{margin-top:-8.8rem;padding-top:8.8rem}.md-typeset h5[id]:before{display:block;margin-top:-1.1rem;padding-top:1.1rem}.md-typeset h5[id]:target:before{margin-top:-9.1rem;padding-top:9.1rem}.md-typeset h6[id]:before{display:block;margin-top:-1.1rem;padding-top:1.1rem}.md-typeset h6[id]:target:before{margin-top:-9.1rem;padding-top:9.1rem}.md-typeset .MJXc-display{margin:.75em 0;padding:.25em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .MathJax_CHTML{outline:0}.md-typeset .comment.critic,.md-typeset del.critic,.md-typeset ins.critic{margin:0 .25em;padding:.0625em 0;border-radius:.2rem;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:#fdd;box-shadow:.25em 0 0 #fdd,-.25em 0 0 #fdd}.md-typeset ins.critic{background-color:#dfd;box-shadow:.25em 0 0 #dfd,-.25em 0 0 #dfd}.md-typeset .critic.comment{background-color:hsla(0,0%,93%,.5);color:#37474f;box-shadow:.25em 0 0 hsla(0,0%,93%,.5),-.25em 0 0 hsla(0,0%,93%,.5)}.md-typeset .critic.comment:before{padding-right:.125em;color:rgba(0,0,0,.26);content:"chat";vertical-align:-.125em}.md-typeset .critic.block{display:block;margin:1em 0;padding-right:1.6rem;padding-left:1.6rem;box-shadow:none}.md-typeset .critic.block :first-child{margin-top:.5em}.md-typeset .critic.block :last-child{margin-bottom:.5em}.md-typeset .emojione{width:2rem;vertical-align:text-top}.md-typeset code.codehilite{margin:0 .29412em;padding:.07353em 0}.md-typeset .task-list-item{position:relative;list-style-type:none}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em;left:-2em}.md-typeset .task-list-control .task-list-indicator:before{position:absolute;top:.05em;left:-1.25em;color:rgba(0,0,0,.26);font-size:1.5em;content:"check_box_outline_blank";vertical-align:-.25em}.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator:before{content:"check_box"}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}@media print{.md-typeset a:after{color:rgba(0,0,0,.54);content:" [" attr(href) "]"}.md-typeset code{box-shadow:none;-webkit-box-decoration-break:initial;box-decoration-break:slice}.md-content__edit,.md-footer,.md-header,.md-sidebar,.md-typeset .headerlink{display:none}}@media only screen and (max-width:44.9375em){.md-typeset pre{margin:1em -1.6rem;padding:1rem 1.6rem;border-radius:0}.codehilite .hll{margin:0 -1.6rem;padding:0 1.6rem}.md-typeset>.codehilite{padding:1rem 1.6rem .8rem}.md-typeset>.codehilite,.md-typeset>.codehilitetable{margin:1em -1.6rem;border-radius:0}.md-typeset>.codehilitetable .codehilite,.md-typeset>.codehilitetable .linenodiv{padding:1rem 1.6rem}.md-typeset>p>.MJXc-display{margin:.75em -1.6rem;padding:.25em 1.6rem}}@media only screen and (min-width:100em){html{font-size:68.75%}}@media only screen and (min-width:125em){html{font-size:75%}}@media only screen and (max-width:59.9375em){body[data-md-state=lock]{overflow:hidden}.ios body[data-md-state=lock] .md-container{display:none}.md-content__edit{margin-right:-.8rem}.md-nav--secondary{border-left:0}html .md-nav__link[for=toc]{display:block;padding-right:4.8rem}html .md-nav__link[for=toc]:after{color:inherit;content:"toc"}html .md-nav__link[for=toc]+.md-nav__link{display:none}html .md-nav__link[for=toc]~.md-nav{display:-webkit-box;display:-ms-flexbox;display:flex}.md-nav__source{display:block;padding:.4rem;background-color:rgba(50,64,144,.9675);color:#fff}.md-search__overlay{display:block;position:absolute;top:.4rem;left:.4rem;width:4rem;height:4rem;-webkit-transform-origin:center;transform-origin:center;-webkit-transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:transform .3s .1s,opacity .2s .2s;transition:transform .3s .1s,opacity .2s .2s,-webkit-transform .3s .1s;border-radius:2rem;background-color:#fff;opacity:0;overflow:hidden;z-index:1}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transition:opacity .1s,-webkit-transform .4s;transition:opacity .1s,-webkit-transform .4s;transition:transform .4s,opacity .1s;transition:transform .4s,opacity .1s,-webkit-transform .4s;opacity:1}.md-search__inner{position:fixed;top:0;left:100%;height:100%;-webkit-transform:translateX(5%);transform:translateX(5%);-webkit-transition:left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;transition:left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;opacity:0;z-index:2}[data-md-toggle=search]:checked~.md-header .md-search__inner{left:0;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;transition:left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;opacity:1}.md-search__input{width:100%;height:5.6rem;font-size:1.8rem}.md-search__icon{top:1.6rem;left:1.6rem}.md-search__icon:before{content:"arrow_back"}.md-search__output{top:5.6rem;bottom:0}}@media only screen and (max-width:76.1875em){[data-md-toggle=drawer]:checked~.md-overlay{width:100%;height:100%;-webkit-transition:width 0s,height 0s,opacity .25s;transition:width 0s,height 0s,opacity .25s;opacity:1}.md-header-nav__button.md-icon--home,.md-header-nav__button.md-logo{display:none}.md-nav--primary,.md-nav--primary .md-nav{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;top:0;right:0;left:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;z-index:1}.md-nav--primary{background-color:#fff}.md-nav--primary .md-nav__toggle~.md-nav{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.4);background-color:#fff}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:1.6rem;line-height:1.5}html .md-nav--primary .md-nav__title{position:relative;height:11.2rem;padding:6rem 1.6rem .4rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-weight:400;line-height:4.8rem;white-space:nowrap;cursor:pointer}html .md-nav--primary .md-nav__title:before{display:block;position:absolute;top:.4rem;left:.4rem;width:4rem;height:4rem;color:rgba(0,0,0,.54)}html .md-nav--primary .md-nav__title~.md-nav__list{background:-webkit-linear-gradient(top,#fff 10%,hsla(0,0%,100%,0)),-webkit-linear-gradient(top,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background:linear-gradient(180deg,#fff 10%,hsla(0,0%,100%,0)),linear-gradient(180deg,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background-attachment:local,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100% 2rem,100% 1rem;box-shadow:inset 0 .1rem 0 rgba(0,0,0,.07)}html .md-nav--primary .md-nav__title~.md-nav__list>.md-nav__item:first-child{border-top:0}html .md-nav--primary .md-nav__title--site{position:relative;background-color:#3f51b5;color:#fff}html .md-nav--primary .md-nav__title--site .md-nav__button{display:block;position:absolute;top:.4rem;left:.4rem;width:6.4rem;height:6.4rem;font-size:4.8rem}html .md-nav--primary .md-nav__title--site:before{display:none}.md-nav--primary .md-nav__list{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto}.md-nav--primary .md-nav__item{padding:0;border-top:.1rem solid rgba(0,0,0,.07)}.md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:4.8rem}.md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"keyboard_arrow_right"}.md-nav--primary .md-nav__link{position:relative;padding:1.6rem}.md-nav--primary .md-nav__link:after{position:absolute;top:50%;right:1.2rem;margin-top:-1.2rem;color:rgba(0,0,0,.54);font-size:2.4rem}.md-nav--primary .md-nav__link:hover:after{color:inherit}.md-nav--primary .md-nav--secondary .md-nav{position:static}.md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:2.8rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:4rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:5.2rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:6.4rem}.md-nav__toggle~.md-nav{display:none}.csstransforms3d .md-nav__toggle~.md-nav{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s;transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);opacity:0}.csstransforms3d .md-nav__toggle~.md-nav,.md-nav__toggle:checked~.md-nav{display:-webkit-box;display:-ms-flexbox;display:flex}.csstransforms3d .md-nav__toggle:checked~.md-nav{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1}.md-sidebar--primary{position:fixed;top:0;left:-24.2rem;width:24.2rem;height:100%;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);background-color:#fff;z-index:2}.no-csstransforms3d .md-sidebar--primary{display:none}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4);-webkit-transform:translateX(24.2rem);transform:translateX(24.2rem)}.no-csstransforms3d [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{display:block}.md-sidebar--primary .md-sidebar__scrollwrap{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;margin:0}}@media only screen and (min-width:60em){.md-content{margin-right:24.2rem}.md-header-nav__button.md-icon--search{display:none}.md-header-nav__source{display:block;width:23rem;max-width:23rem;padding-right:1.2rem}.md-search{margin-right:2.8rem;padding:.4rem}.md-search__inner{display:table;position:relative;clear:both}.md-search__form{width:23rem;float:right;-webkit-transition:width .25s cubic-bezier(.1,.7,.1,1);transition:width .25s cubic-bezier(.1,.7,.1,1);border-radius:.2rem}.md-search__input{width:100%;height:4rem;padding-left:4.8rem;-webkit-transition:background-color .25s,color .25s;transition:background-color .25s,color .25s;border-radius:.2rem;background-color:rgba(0,0,0,.26);color:#fff;font-size:1.6rem}.md-search__input+.md-search__icon,.md-search__input::-webkit-input-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input::-moz-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input:-ms-input-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input::placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input:hover{background-color:hsla(0,0%,100%,.12)}[data-md-toggle=search]:checked~.md-header .md-search__input{border-radius:.2rem .2rem 0 0;background-color:#fff;color:rgba(0,0,0,.87);text-overflow:none}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__output{top:4rem;-webkit-transition:opacity .4s;transition:opacity .4s;opacity:0}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4);opacity:1}.md-search__scrollwrap{max-height:0}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap::-webkit-scrollbar{width:.4rem;height:.4rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-search-result__link,.md-search-result__meta{padding-left:4.8rem}.md-sidebar--secondary{display:block;float:right}.md-sidebar--secondary[data-md-state=lock]{margin-left:100%;-webkit-transform:translate(-100%);transform:translate(-100%)}}@media only screen and (min-width:76.25em){.md-content{margin-left:24.2rem;overflow:auto}.md-content__inner{margin:2.4rem}.md-content__inner :last-child{margin-bottom:0}.md-header-nav__button.md-icon--menu{display:none}.md-nav[data-md-state=animate]{-webkit-transition:max-height .25s cubic-bezier(.86,0,.07,1);transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav__toggle~.md-nav{max-height:0;overflow:hidden}.md-nav[data-md-state=expand],.md-nav__toggle:checked~.md-nav{max-height:100%}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--nested>.md-nav__link:after{display:inline-block;-webkit-transform-origin:.45em .45em;transform-origin:.45em .45em;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;vertical-align:-.125em}.js .md-nav__item--nested>.md-nav__link:after{-webkit-transition:-webkit-transform .4s;transition:-webkit-transform .4s;transition:transform .4s;transition:transform .4s,-webkit-transform .4s}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link:after{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__form{width:68.8rem}.md-sidebar__inner{border-right:.1rem solid rgba(0,0,0,.07)}}@media only screen and (max-width:29.9375em){.md-footer-nav__link--prev .md-footer-nav__title,.md-header-nav__parent{display:none}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(45);transform:scale(45)}}@media only screen and (min-width:30em){.md-footer-nav__link{width:50%}}@media only screen and (min-width:45em){.md-footer-copyright{max-width:75%;float:left}.md-footer-social{padding:1.2rem 0;float:right}}@media only screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(60);transform:scale(60)}}@media only screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(75);transform:scale(75)}}@media only screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__form{width:46.8rem}}@media only screen and (min-width:60em) and (min-width:76.25em){.md-sidebar--secondary[data-md-state=lock]{margin-left:122rem}} \ No newline at end of file +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}html{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none}body{margin:0}hr{overflow:visible;box-sizing:content-box}a{-webkit-text-decoration-skip:objects}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}a:active,a:hover{outline-width:0}small,sub,sup{font-size:80%}sub,sup{position:relative;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}table{border-collapse:collapse;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{padding:0;background:transparent;font-size:inherit}button,input{border:0;outline:0}.admonition:before,.md-icon,.md-nav__button,.md-nav__link:after,.md-nav__title:before,.md-typeset .critic.comment:before,.md-typeset .footnote-backref,.md-typeset .task-list-control .task-list-indicator:before{font-family:Material Icons;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;white-space:nowrap;speak:none;word-wrap:normal;direction:ltr}.md-content__edit,.md-footer-nav__button,.md-header-nav__button,.md-nav__button,.md-nav__title:before{display:inline-block;margin:.4rem;padding:.8rem;font-size:2.4rem;cursor:pointer}.md-icon--arrow-back:before{content:"arrow_back"}.md-icon--arrow-forward:before{content:"arrow_forward"}.md-icon--menu:before{content:"menu"}.md-icon--search:before{content:"search"}.md-icon--home:before{content:"school"}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,input{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","onum","liga";font-feature-settings:"kern","onum","liga";font-weight:400}.no-fontface body,.no-fontface input{font-family:Helvetica Neue,Helvetica,Arial,sans-serif}code,kbd,pre{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","onum","liga";font-feature-settings:"kern","onum","liga";font-weight:400}.no-fontface code,.no-fontface kbd,.no-fontface pre{font-family:Courier New,Courier,monospace}.md-typeset{font-size:1.6rem;line-height:1.6;-webkit-print-color-adjust:exact}.md-typeset blockquote,.md-typeset ol,.md-typeset p,.md-typeset ul{margin:1em 0}.md-typeset h1{margin:0 0 4rem;color:rgba(0,0,0,.54);font-size:3.125rem;line-height:1.3}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{margin:4rem 0 1.6rem;font-size:2.5rem;line-height:1.4}.md-typeset h3{margin:3.2rem 0 1.6rem;font-size:2rem;font-weight:400;letter-spacing:-.01em;line-height:1.5}.md-typeset h2+h3{margin-top:1.6rem}.md-typeset h4{font-size:1.6rem}.md-typeset h4,.md-typeset h5,.md-typeset h6{margin:1.6rem 0;font-weight:700;letter-spacing:-.01em}.md-typeset h5,.md-typeset h6{color:rgba(0,0,0,.54);font-size:1.28rem}.md-typeset h5{text-transform:uppercase}.md-typeset hr{margin:1.5em 0;border-bottom:.1rem dotted rgba(0,0,0,.26)}.md-typeset a{color:#3f51b5;word-break:break-word}.md-typeset a,.md-typeset a:before{-webkit-transition:color .125s;transition:color .125s}.md-typeset a:active,.md-typeset a:hover{color:#536dfe}.md-typeset code,.md-typeset pre{background-color:hsla(0,0%,93%,.5);color:#37474f;font-size:85%}.md-typeset code{margin:0 .29412em;padding:.07353em 0;border-radius:.2rem;box-shadow:.29412em 0 0 hsla(0,0%,93%,.5),-.29412em 0 0 hsla(0,0%,93%,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{margin:0;background-color:transparent;box-shadow:none}.md-typeset a>code{margin:inherit;padding:inherit;border-radius:none;background-color:inherit;color:inherit;box-shadow:none}.md-typeset pre{margin:1em 0;padding:1rem 1.2rem;border-radius:.2rem;line-height:1.4;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset pre::-webkit-scrollbar{width:.4rem;height:.4rem}.md-typeset pre::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset pre>code{margin:0;background-color:transparent;font-size:inherit;box-shadow:none;-webkit-box-decoration-break:none;box-decoration-break:none}.md-typeset kbd{padding:0 .29412em;border:.1rem solid #c9c9c9;border-radius:.2rem;border-bottom-color:#bcbcbc;background-color:#fcfcfc;color:#555;font-size:85%;box-shadow:0 .1rem 0 #b0b0b0;word-break:break-word}.md-typeset mark{margin:0 .25em;padding:.0625em 0;border-radius:.2rem;background-color:rgba(255,235,59,.5);box-shadow:.25em 0 0 rgba(255,235,59,.5),-.25em 0 0 rgba(255,235,59,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset abbr{border-bottom:.1rem dotted rgba(0,0,0,.54);cursor:help}.md-typeset small{opacity:.75}.md-typeset sub,.md-typeset sup{margin-left:.07812em}.md-typeset blockquote{padding-left:1.2rem;border-left:.4rem solid rgba(0,0,0,.26);color:rgba(0,0,0,.54)}.md-typeset ul{list-style-type:disc}.md-typeset ol,.md-typeset ul{margin-left:.625em;padding:0}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em;margin-left:1.25em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin:.5em 0 .5em .625em}.md-typeset iframe,.md-typeset img,.md-typeset svg{max-width:100%}.md-typeset table:not([class]){box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);margin:2em 0;border-radius:.2rem;font-size:1.28rem;overflow:hidden}.no-js .md-typeset table:not([class]){display:inline-block;max-width:100%;margin:.8em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}.md-typeset table:not([class]) th{min-width:10rem;padding:1.2rem 1.6rem;background-color:rgba(0,0,0,.54);color:#fff;vertical-align:top}.md-typeset table:not([class]) td{padding:1.2rem 1.6rem;border-top:.1rem solid rgba(0,0,0,.07);vertical-align:top}.md-typeset table:not([class]) tr:first-child td{border-top:0}.md-typeset table:not([class]) a{word-break:normal}.md-typeset .md-typeset__table{margin:1.6em -1.6rem;overflow-x:auto;-webkit-overflow-scrolling:touch}.md-typeset .md-typeset__table table{display:inline-block;margin:0 1.6rem}html{font-size:62.5%}body,html{height:100%}body{position:relative}hr{display:block;height:.1rem;padding:0;border:0}.md-svg{display:none}.md-grid{max-width:122rem;margin-right:auto;margin-left:auto}.md-container,.md-main{overflow:auto}.md-container{display:table;width:100%;height:100%;table-layout:fixed}.md-main{display:table-row;height:100%}.md-main__inner{margin-top:5.6rem;padding-top:3rem;overflow:auto}.csscalc .md-main__inner{min-height:calc(100% - 2.6rem)}@-moz-document url-prefix(){.csscalc .md-main__inner{min-height:calc(100% - 5.6rem)}}.md-toggle{display:none}.md-overlay{position:fixed;top:0;width:0;height:0;-webkit-transition:width 0s .25s,height 0s .25s,opacity .25s;transition:width 0s .25s,height 0s .25s,opacity .25s;background-color:rgba(0,0,0,.54);opacity:0;z-index:2}.md-flex{display:table}.md-flex__cell{display:table-cell;position:relative;vertical-align:top}.md-flex__cell--shrink{width:0}.md-flex__cell--stretch{display:table;width:100%;table-layout:fixed}.md-flex__ellipsis{display:table-cell;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}@page{margin:25mm}.md-content__inner{margin:2.4rem 1.6rem}.md-content__edit{float:right}.md-header{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:fixed;top:0;right:0;left:0;height:5.6rem;-webkit-transition:background-color .25s;transition:background-color .25s;background-color:#3f51b5;color:#fff;z-index:1}.md-header-nav{padding:.4rem}.md-header-nav__button{position:relative;-webkit-transition:opacity .25s;transition:opacity .25s;z-index:1}.md-header-nav__button:hover{opacity:.7}.md-header-nav__button.md-logo img{display:block}.no-js .md-header-nav__button.md-icon--search{display:none}.md-header-nav__title{padding:0 2rem;font-size:1.8rem;line-height:4.8rem}.md-header-nav__parent{color:hsla(0,0%,100%,.7)}.md-header-nav__parent:after{display:inline;color:hsla(0,0%,100%,.3);content:"/"}.md-header-nav__source{display:none}.md-footer-nav{background-color:rgba(0,0,0,.87);color:#fff}.md-footer-nav__inner{padding:.4rem;overflow:auto}.md-footer-nav__link{padding-top:2.8rem;padding-bottom:.8rem;-webkit-transition:opacity .25s;transition:opacity .25s}.md-footer-nav__link:hover{opacity:.7}.md-footer-nav__link--prev{width:25%;float:left}.md-footer-nav__link--next{width:75%;float:right;text-align:right}.md-footer-nav__button{-webkit-transition:background .25s;transition:background .25s}.md-footer-nav__title{position:relative;padding:0 2rem;font-size:1.8rem;line-height:4.8rem}.md-footer-nav__direction{position:absolute;right:0;left:0;margin-top:-2rem;padding:0 2rem;color:hsla(0,0%,100%,.7);font-size:1.5rem}.md-footer-meta{background:rgba(0,0,0,.895)}.md-footer-meta__inner{padding:.4rem;overflow:auto}html .md-footer-meta.md-typeset a{color:hsla(0,0%,100%,.7)}.md-footer-copyright{margin:0 1.2rem;padding:.8rem 0;color:hsla(0,0%,100%,.3);font-size:1.28rem}.md-footer-copyright__highlight{color:hsla(0,0%,100%,.7)}.md-footer-social{margin:0 .8rem;padding:.4rem 0 1.2rem}.md-footer-social__link{display:inline-block;width:3.2rem;height:3.2rem;border:.1rem solid hsla(0,0%,100%,.12);border-radius:100%;color:hsla(0,0%,100%,.7);font-size:1.6rem;text-align:center}.md-footer-social__link:before{line-height:1.9}.md-nav{font-size:1.4rem;line-height:1.3}.md-nav--secondary{-webkit-transition:border-left .25s;transition:border-left .25s;border-left:.4rem solid #3f51b5}.md-nav__title{display:block;padding:1.2rem 1.2rem 0;font-weight:700;text-overflow:ellipsis;overflow:hidden}.md-nav__title:before{display:none;content:"arrow_back"}.md-nav__title .md-nav__button{display:none}.md-nav__list{margin:0;padding:0;list-style:none}.md-nav__item{padding:.625em 1.2rem 0}.md-nav__item:last-child{padding-bottom:1.2rem}.md-nav__item .md-nav__item{padding-right:0}.md-nav__item .md-nav__item:last-child{padding-bottom:0}.md-nav__button img{width:100%;height:auto}.md-nav__link{display:block;-webkit-transition:color .125s;transition:color .125s;text-overflow:ellipsis;cursor:pointer;overflow:hidden}.md-nav__item--nested>.md-nav__link:after{content:"keyboard_arrow_down"}html .md-nav__link[for=toc],html .md-nav__link[for=toc]+.md-nav__link:after,html .md-nav__link[for=toc]~.md-nav{display:none}.md-nav__link[data-md-state=blur]{color:rgba(0,0,0,.54)}.md-nav__link--active,.md-nav__link:active{color:#3f51b5}.md-nav__link:hover{color:#536dfe}.md-nav__source,.no-js .md-search{display:none}.md-search__overlay{display:none;pointer-events:none}.md-search__inner{width:100%}.md-search__form{position:relative}.md-search__input{position:relative;padding:0 1.6rem 0 7.2rem;text-overflow:ellipsis;z-index:1}.md-search__input+.md-search__icon,.md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__input::-ms-clear{display:none}.md-search__icon{position:absolute;top:.8rem;left:1.2rem;-webkit-transition:color .25s;transition:color .25s;font-size:2.4rem;cursor:pointer;z-index:1}.md-search__icon:before{content:"search"}.md-search__output{position:absolute;width:100%;border-radius:0 0 .2rem .2rem;overflow:hidden}.md-search__scrollwrap{height:100%;background:-webkit-linear-gradient(top,#fff 10%,hsla(0,0%,100%,0)),-webkit-linear-gradient(top,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background:linear-gradient(180deg,#fff 10%,hsla(0,0%,100%,0)),linear-gradient(180deg,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background-attachment:local,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100% 2rem,100% 1rem;box-shadow:inset 0 .1rem 0 rgba(0,0,0,.07);overflow-y:auto;-webkit-overflow-scrolling:touch}.md-search-result__meta{padding:0 1.6rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-size:1.28rem;line-height:4rem}.md-search-result__list{margin:0;padding:0;border-top:.1rem solid rgba(0,0,0,.07);list-style:none}.md-search-result__item{box-shadow:0 -.1rem 0 rgba(0,0,0,.07)}.md-search-result__link{display:block;padding:0 1.6rem;-webkit-transition:background .25s;transition:background .25s;overflow:auto}.md-search-result__link:hover{background-color:rgba(83,109,254,.1)}.md-search-result__article{margin:1em 0}.md-search-result__title{margin-top:.5em;margin-bottom:0;color:rgba(0,0,0,.87);font-size:1.6rem;font-weight:400;line-height:1.4}.md-search-result__teaser{margin:.5em 0;color:rgba(0,0,0,.54);font-size:1.28rem;line-height:1.4;word-break:break-word}.md-sidebar{position:relative;width:24.2rem;padding:2.4rem 0;float:left;overflow:visible}.md-sidebar[data-md-state=lock]{position:fixed;top:5.6rem;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-sidebar--secondary{display:none}.md-sidebar__scrollwrap{max-height:100%;margin:0 .4rem;overflow-y:auto}.md-sidebar__scrollwrap::-webkit-scrollbar{width:.4rem;height:.4rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}@-webkit-keyframes a{0%{height:0}to{height:1.3rem}}@keyframes a{0%{height:0}to{height:1.3rem}}@-webkit-keyframes b{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes b{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}.md-source{display:block;-webkit-transition:opacity .25s;transition:opacity .25s;font-size:1.3rem;line-height:1.2;white-space:nowrap}.md-source:hover{opacity:.7}.md-source:after,.md-source__icon{display:inline-block;height:4.8rem;content:"";vertical-align:middle}.md-source__icon{width:4.8rem}.md-source__icon svg{margin-top:1.2rem;margin-left:1.2rem}.md-source__icon+.md-source__repository{margin-left:-4.4rem;padding-left:4rem}.md-source__repository{display:inline-block;max-width:100%;margin-left:1.2rem;font-weight:700;text-overflow:ellipsis;overflow:hidden;vertical-align:middle}.md-source__facts{margin:0;padding:0;font-size:1.1rem;font-weight:700;list-style-type:none;opacity:.75;overflow:hidden}[data-md-state=done] .md-source__facts{-webkit-animation:a .25s ease-in;animation:a .25s ease-in}.md-source__fact{float:left}[data-md-state=done] .md-source__fact{-webkit-animation:b .4s ease-out;animation:b .4s ease-out}.md-source__fact:before{margin:0 .2rem;content:"\00B7"}.md-source__fact:first-child:before{display:none}.admonition{position:relative;margin:1.5625em 0;padding:.8rem 1.2rem;border-left:3.2rem solid rgba(68,138,255,.4);border-radius:.2rem;background-color:rgba(68,138,255,.15);font-size:1.28rem}.admonition:before{position:absolute;left:-2.6rem;color:#fff;font-size:2rem;content:"edit";vertical-align:-.25em}.admonition :first-child{margin-top:0}.admonition :last-child{margin-bottom:0}.admonition.summary,.admonition.tldr{border-color:rgba(0,176,255,.4);background-color:rgba(0,176,255,.15)}.admonition.summary:before,.admonition.tldr:before{content:"subject"}.admonition.hint,.admonition.important,.admonition.tip{border-color:rgba(0,191,165,.4);background-color:rgba(0,191,165,.15)}.admonition.hint:before,.admonition.important:before,.admonition.tip:before{content:"whatshot"}.admonition.check,.admonition.done,.admonition.success{border-color:rgba(0,230,118,.4);background-color:rgba(0,230,118,.15)}.admonition.check:before,.admonition.done:before,.admonition.success:before{content:"done"}.admonition.attention,.admonition.caution,.admonition.warning{border-color:rgba(255,145,0,.4);background-color:rgba(255,145,0,.15)}.admonition.attention:before,.admonition.caution:before,.admonition.warning:before{content:"warning"}.admonition.fail,.admonition.failure,.admonition.missing{border-color:rgba(255,82,82,.4);background-color:rgba(255,82,82,.15)}.admonition.fail:before,.admonition.failure:before,.admonition.missing:before{content:"clear"}.admonition.danger,.admonition.error{border-color:rgba(255,23,68,.4);background-color:rgba(255,23,68,.15)}.admonition.danger:before,.admonition.error:before{content:"flash_on"}.admonition.bug{border-color:rgba(245,0,87,.4);background-color:rgba(245,0,87,.15)}.admonition.bug:before{content:"bug_report"}.admonition-title{font-weight:700}html .admonition-title{margin-bottom:0}html .admonition-title+*{margin-top:0}.codehilite .o,.codehilite .ow{color:inherit}.codehilite .ge{color:#000}.codehilite .gr{color:#a00}.codehilite .gh{color:#999}.codehilite .go{color:#888}.codehilite .gp{color:#555}.codehilite .gs{color:inherit}.codehilite .gu{color:#aaa}.codehilite .gt{color:#a00}.codehilite .gd{background-color:#fdd}.codehilite .gi{background-color:#dfd}.codehilite .k{color:#3b78e7}.codehilite .kc{color:#a71d5d}.codehilite .kd,.codehilite .kn{color:#3b78e7}.codehilite .kp{color:#a71d5d}.codehilite .kr,.codehilite .kt{color:#3e61a2}.codehilite .c,.codehilite .cm{color:#999}.codehilite .cp{color:#666}.codehilite .c1,.codehilite .ch,.codehilite .cs{color:#999}.codehilite .na,.codehilite .nb{color:#c2185b}.codehilite .bp{color:#3e61a2}.codehilite .nc{color:#c2185b}.codehilite .no{color:#3e61a2}.codehilite .nd,.codehilite .ni{color:#666}.codehilite .ne,.codehilite .nf{color:#c2185b}.codehilite .nl{color:#3b5179}.codehilite .nn{color:#ec407a}.codehilite .nt{color:#3b78e7}.codehilite .nv,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#3e61a2}.codehilite .nx{color:#ec407a}.codehilite .il,.codehilite .m,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#e74c3c}.codehilite .s,.codehilite .sb,.codehilite .sc{color:#0d904f}.codehilite .sd{color:#999}.codehilite .s2{color:#0d904f}.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sx{color:#183691}.codehilite .sr{color:#009926}.codehilite .s1,.codehilite .ss{color:#0d904f}.codehilite .err{color:#a61717}.codehilite .w{color:transparent}.codehilite .hll{display:block;margin:0 -1.2rem;padding:0 1.2rem;background-color:rgba(255,235,59,.5)}.md-typeset .codehilite{margin:1em 0;padding:1rem 1.2rem .8rem;border-radius:.2rem;background-color:hsla(0,0%,93%,.5);color:#37474f;line-height:1.4;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .codehilite::-webkit-scrollbar{width:.4rem;height:.4rem}.md-typeset .codehilite::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset .codehilite::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset .codehilite pre{display:inline-block;min-width:100%;margin:0;padding:0;background-color:transparent;overflow:visible;vertical-align:top}.md-typeset .codehilitetable{display:block;margin:1em 0;border-radius:.2em;font-size:1.6rem;overflow:hidden}.md-typeset .codehilitetable tbody,.md-typeset .codehilitetable td{display:block;padding:0}.md-typeset .codehilitetable tr{display:-webkit-box;display:-ms-flexbox;display:flex}.md-typeset .codehilitetable .codehilite,.md-typeset .codehilitetable .linenodiv{margin:0;border-radius:0}.md-typeset .codehilitetable .linenodiv{padding:1rem 1.2rem .8rem}.md-typeset .codehilitetable .linenodiv,.md-typeset .codehilitetable .linenodiv>pre{height:100%}.md-typeset .codehilitetable .linenos{background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.26);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-typeset .codehilitetable .linenos pre{margin:0;padding:0;background-color:transparent;color:inherit;text-align:right}.md-typeset .codehilitetable .code{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.md-typeset>.codehilitetable{box-shadow:none}.md-typeset .footnote{color:rgba(0,0,0,.54);font-size:1.28rem}.md-typeset .footnote ol{margin-left:0}.md-typeset .footnote li{-webkit-transition:color .25s;transition:color .25s}.md-typeset .footnote li:before{display:block;height:0}.md-typeset .footnote li:target{color:rgba(0,0,0,.87)}.md-typeset .footnote li:target:before{margin-top:-9rem;padding-top:9rem;pointer-events:none}.md-typeset .footnote li :first-child{margin-top:0}.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}.md-typeset .footnote li:hover .footnote-backref:hover,.md-typeset .footnote li:target .footnote-backref{color:#536dfe}.md-typeset .footnote-backref{display:inline-block;-webkit-transform:translateX(.5rem);transform:translateX(.5rem);-webkit-transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s,-webkit-transform .25s .125s;color:rgba(0,0,0,.26);font-size:0;opacity:0;vertical-align:text-bottom}.md-typeset .footnote-backref:before{font-size:1.6rem;content:"keyboard_return"}.md-typeset .headerlink{display:inline-block;margin-left:1rem;-webkit-transform:translateY(.5rem);transform:translateY(.5rem);-webkit-transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s,-webkit-transform .25s .25s;opacity:0}html body .md-typeset .headerlink{color:rgba(0,0,0,.26)}.md-typeset [id]:before{display:inline-block;content:""}.md-typeset [id]:target:before{margin-top:-9.8rem;padding-top:9.8rem}.md-typeset [id] .headerlink:focus,.md-typeset [id]:hover .headerlink,.md-typeset [id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset [id] .headerlink:focus,.md-typeset [id]:hover .headerlink:hover,.md-typeset [id]:target .headerlink{color:#536dfe}.md-typeset h1[id]{padding-top:.8rem}.md-typeset h1[id].headerlink{display:none}.md-typeset h2[id]:before{display:block;margin-top:-.4rem;padding-top:.4rem}.md-typeset h2[id]:target:before{margin-top:-8.4rem;padding-top:8.4rem}.md-typeset h3[id]:before{display:block;margin-top:-.7rem;padding-top:.7rem}.md-typeset h3[id]:target:before{margin-top:-8.7rem;padding-top:8.7rem}.md-typeset h4[id]:before{display:block;margin-top:-.8rem;padding-top:.8rem}.md-typeset h4[id]:target:before{margin-top:-8.8rem;padding-top:8.8rem}.md-typeset h5[id]:before{display:block;margin-top:-1.1rem;padding-top:1.1rem}.md-typeset h5[id]:target:before{margin-top:-9.1rem;padding-top:9.1rem}.md-typeset h6[id]:before{display:block;margin-top:-1.1rem;padding-top:1.1rem}.md-typeset h6[id]:target:before{margin-top:-9.1rem;padding-top:9.1rem}.md-typeset .MJXc-display{margin:.75em 0;padding:.25em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .MathJax_CHTML{outline:0}.md-typeset .comment.critic,.md-typeset del.critic,.md-typeset ins.critic{margin:0 .25em;padding:.0625em 0;border-radius:.2rem;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:#fdd;box-shadow:.25em 0 0 #fdd,-.25em 0 0 #fdd}.md-typeset ins.critic{background-color:#dfd;box-shadow:.25em 0 0 #dfd,-.25em 0 0 #dfd}.md-typeset .critic.comment{background-color:hsla(0,0%,93%,.5);color:#37474f;box-shadow:.25em 0 0 hsla(0,0%,93%,.5),-.25em 0 0 hsla(0,0%,93%,.5)}.md-typeset .critic.comment:before{padding-right:.125em;color:rgba(0,0,0,.26);content:"chat";vertical-align:-.125em}.md-typeset .critic.block{display:block;margin:1em 0;padding-right:1.6rem;padding-left:1.6rem;box-shadow:none}.md-typeset .critic.block :first-child{margin-top:.5em}.md-typeset .critic.block :last-child{margin-bottom:.5em}.md-typeset .emojione{width:2rem;vertical-align:text-top}.md-typeset code.codehilite{margin:0 .29412em;padding:.07353em 0}.md-typeset .task-list-item{position:relative;list-style-type:none}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em;left:-2em}.md-typeset .task-list-control .task-list-indicator:before{position:absolute;top:.05em;left:-1.25em;color:rgba(0,0,0,.26);font-size:1.5em;content:"check_box_outline_blank";vertical-align:-.25em}.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator:before{content:"check_box"}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}@media print{.md-typeset a:after{color:rgba(0,0,0,.54);content:" [" attr(href) "]"}.md-typeset code{box-shadow:none;-webkit-box-decoration-break:initial;box-decoration-break:slice}.md-content__edit,.md-footer,.md-header,.md-sidebar,.md-typeset .headerlink{display:none}}@media only screen and (max-width:44.9375em){.md-typeset pre{margin:1em -1.6rem;padding:1rem 1.6rem;border-radius:0}.md-footer-nav__link--prev .md-footer-nav__title{display:none}.codehilite .hll{margin:0 -1.6rem;padding:0 1.6rem}.md-typeset>.codehilite{padding:1rem 1.6rem .8rem}.md-typeset>.codehilite,.md-typeset>.codehilitetable{margin:1em -1.6rem;border-radius:0}.md-typeset>.codehilitetable .codehilite,.md-typeset>.codehilitetable .linenodiv{padding:1rem 1.6rem}.md-typeset>p>.MJXc-display{margin:.75em -1.6rem;padding:.25em 1.6rem}}@media only screen and (min-width:100em){html{font-size:68.75%}}@media only screen and (min-width:125em){html{font-size:75%}}@media only screen and (max-width:59.9375em){body[data-md-state=lock]{overflow:hidden}.ios body[data-md-state=lock] .md-container{display:none}.md-content__edit{margin-right:-.8rem}.md-nav--secondary{border-left:0}html .md-nav__link[for=toc]{display:block;padding-right:4.8rem}html .md-nav__link[for=toc]:after{color:inherit;content:"toc"}html .md-nav__link[for=toc]+.md-nav__link{display:none}html .md-nav__link[for=toc]~.md-nav{display:-webkit-box;display:-ms-flexbox;display:flex}.md-nav__source{display:block;padding:.4rem;background-color:rgba(50,64,144,.9675);color:#fff}.md-search__overlay{display:block;position:absolute;top:.4rem;left:.4rem;width:4rem;height:4rem;-webkit-transform-origin:center;transform-origin:center;-webkit-transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:transform .3s .1s,opacity .2s .2s;transition:transform .3s .1s,opacity .2s .2s,-webkit-transform .3s .1s;border-radius:2rem;background-color:#fff;opacity:0;overflow:hidden;z-index:1}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transition:opacity .1s,-webkit-transform .4s;transition:opacity .1s,-webkit-transform .4s;transition:transform .4s,opacity .1s;transition:transform .4s,opacity .1s,-webkit-transform .4s;opacity:1}.md-search__inner{position:fixed;top:0;left:100%;height:100%;-webkit-transform:translateX(5%);transform:translateX(5%);-webkit-transition:left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;transition:left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;opacity:0;z-index:2}[data-md-toggle=search]:checked~.md-header .md-search__inner{left:0;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;transition:left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;opacity:1}.md-search__input{width:100%;height:5.6rem;font-size:1.8rem}.md-search__icon{top:1.6rem;left:1.6rem}.md-search__icon:before{content:"arrow_back"}.md-search__output{top:5.6rem;bottom:0}}@media only screen and (max-width:76.1875em){[data-md-toggle=drawer]:checked~.md-overlay{width:100%;height:100%;-webkit-transition:width 0s,height 0s,opacity .25s;transition:width 0s,height 0s,opacity .25s;opacity:1}.md-header-nav__button.md-icon--home,.md-header-nav__button.md-logo{display:none}.md-nav--primary,.md-nav--primary .md-nav{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;top:0;right:0;left:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;z-index:1}.md-nav--primary{background-color:#fff}.md-nav--primary .md-nav__toggle~.md-nav{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.4);background-color:#fff}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:1.6rem;line-height:1.5}html .md-nav--primary .md-nav__title{position:relative;height:11.2rem;padding:6rem 1.6rem .4rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-weight:400;line-height:4.8rem;white-space:nowrap;cursor:pointer}html .md-nav--primary .md-nav__title:before{display:block;position:absolute;top:.4rem;left:.4rem;width:4rem;height:4rem;color:rgba(0,0,0,.54)}html .md-nav--primary .md-nav__title~.md-nav__list{background:-webkit-linear-gradient(top,#fff 10%,hsla(0,0%,100%,0)),-webkit-linear-gradient(top,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background:linear-gradient(180deg,#fff 10%,hsla(0,0%,100%,0)),linear-gradient(180deg,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background-attachment:local,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100% 2rem,100% 1rem;box-shadow:inset 0 .1rem 0 rgba(0,0,0,.07)}html .md-nav--primary .md-nav__title~.md-nav__list>.md-nav__item:first-child{border-top:0}html .md-nav--primary .md-nav__title--site{position:relative;background-color:#3f51b5;color:#fff}html .md-nav--primary .md-nav__title--site .md-nav__button{display:block;position:absolute;top:.4rem;left:.4rem;width:6.4rem;height:6.4rem;font-size:4.8rem}html .md-nav--primary .md-nav__title--site:before{display:none}.md-nav--primary .md-nav__list{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto}.md-nav--primary .md-nav__item{padding:0;border-top:.1rem solid rgba(0,0,0,.07)}.md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:4.8rem}.md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"keyboard_arrow_right"}.md-nav--primary .md-nav__link{position:relative;padding:1.6rem}.md-nav--primary .md-nav__link:after{position:absolute;top:50%;right:1.2rem;margin-top:-1.2rem;color:rgba(0,0,0,.54);font-size:2.4rem}.md-nav--primary .md-nav__link:hover:after{color:inherit}.md-nav--primary .md-nav--secondary .md-nav{position:static}.md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:2.8rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:4rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:5.2rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:6.4rem}.md-nav__toggle~.md-nav{display:none}.csstransforms3d .md-nav__toggle~.md-nav{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s;transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);opacity:0}.csstransforms3d .md-nav__toggle~.md-nav,.md-nav__toggle:checked~.md-nav{display:-webkit-box;display:-ms-flexbox;display:flex}.csstransforms3d .md-nav__toggle:checked~.md-nav{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1}.md-sidebar--primary{position:fixed;top:0;left:-24.2rem;width:24.2rem;height:100%;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);background-color:#fff;z-index:2}.no-csstransforms3d .md-sidebar--primary{display:none}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4);-webkit-transform:translateX(24.2rem);transform:translateX(24.2rem)}.no-csstransforms3d [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{display:block}.md-sidebar--primary .md-sidebar__scrollwrap{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;margin:0}}@media only screen and (min-width:60em){.md-content{margin-right:24.2rem}.md-header-nav__button.md-icon--search{display:none}.md-header-nav__source{display:block;width:23rem;max-width:23rem;padding-right:1.2rem}.md-search{margin-right:2.8rem;padding:.4rem}.md-search__inner{display:table;position:relative;clear:both}.md-search__form{width:23rem;float:right;-webkit-transition:width .25s cubic-bezier(.1,.7,.1,1);transition:width .25s cubic-bezier(.1,.7,.1,1);border-radius:.2rem}.md-search__input{width:100%;height:4rem;padding-left:4.8rem;-webkit-transition:background-color .25s,color .25s;transition:background-color .25s,color .25s;border-radius:.2rem;background-color:rgba(0,0,0,.26);color:#fff;font-size:1.6rem}.md-search__input+.md-search__icon,.md-search__input::-webkit-input-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input::-moz-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input:-ms-input-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input::placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input:hover{background-color:hsla(0,0%,100%,.12)}[data-md-toggle=search]:checked~.md-header .md-search__input{border-radius:.2rem .2rem 0 0;background-color:#fff;color:rgba(0,0,0,.87);text-overflow:none}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__output{top:4rem;-webkit-transition:opacity .4s;transition:opacity .4s;opacity:0}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4);opacity:1}.md-search__scrollwrap{max-height:0}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap::-webkit-scrollbar{width:.4rem;height:.4rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-search-result__link,.md-search-result__meta{padding-left:4.8rem}.md-sidebar--secondary{display:block;float:right}.md-sidebar--secondary[data-md-state=lock]{margin-left:100%;-webkit-transform:translate(-100%);transform:translate(-100%)}}@media only screen and (min-width:76.25em){.md-content{margin-left:24.2rem;overflow:auto}.md-content__inner{margin:2.4rem}.md-content__inner :last-child{margin-bottom:0}.md-header-nav__button.md-icon--menu{display:none}.md-nav[data-md-state=animate]{-webkit-transition:max-height .25s cubic-bezier(.86,0,.07,1);transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav__toggle~.md-nav{max-height:0;overflow:hidden}.md-nav[data-md-state=expand],.md-nav__toggle:checked~.md-nav{max-height:100%}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--nested>.md-nav__link:after{display:inline-block;-webkit-transform-origin:.45em .45em;transform-origin:.45em .45em;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;vertical-align:-.125em}.js .md-nav__item--nested>.md-nav__link:after{-webkit-transition:-webkit-transform .4s;transition:-webkit-transform .4s;transition:transform .4s;transition:transform .4s,-webkit-transform .4s}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link:after{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__form{width:68.8rem}.md-sidebar__inner{border-right:.1rem solid rgba(0,0,0,.07)}}@media only screen and (max-width:29.9375em){.md-header-nav__parent{display:none}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(45);transform:scale(45)}}@media only screen and (min-width:45em){.md-footer-nav__link{width:50%}.md-footer-copyright{max-width:75%;float:left}.md-footer-social{padding:1.2rem 0;float:right}}@media only screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(60);transform:scale(60)}}@media only screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(75);transform:scale(75)}}@media only screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__form{width:46.8rem}}@media only screen and (min-width:60em) and (min-width:76.25em){.md-sidebar--secondary[data-md-state=lock]{margin-left:122rem}} \ No newline at end of file diff --git a/material/base.html b/material/base.html index 756151c69..cdff4edaf 100644 --- a/material/base.html +++ b/material/base.html @@ -45,7 +45,7 @@ {% endblock %} {% block styles %} - + {% if config.extra.palette %} {% endif %} diff --git a/package.json b/package.json index 06c5dc092..0d7e0ea9b 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "clean": "scripts/clean", "lint": "scripts/lint", "start": "scripts/start", - "test": "scripts/test" + "test:visual:run": "scripts/test/visual/run", + "test:visual:update": "scripts/test/visual/update" }, "dependencies": {}, "devDependencies": { @@ -45,6 +46,7 @@ "css-mqpacker": "^5.0.1", "custom-event-polyfill": "^0.3.0", "del": "^2.2.2", + "ecstatic": "^2.1.0", "eslint": "^3.14.0", "eslint-plugin-mocha": "^4.8.0", "fastclick": "^1.0.6", diff --git a/scripts/build b/scripts/build index f3fff3648..1f77f8097 100755 --- a/scripts/build +++ b/scripts/build @@ -28,4 +28,4 @@ if [[ ! -d `npm bin` ]]; then fi # Run command -`npm bin`/gulp build --clean --optimize --revision +`npm bin`/gulp build --clean --optimize --revision $@ diff --git a/scripts/clean b/scripts/clean index 1b3cb6417..9cb9d0f33 100755 --- a/scripts/clean +++ b/scripts/clean @@ -28,4 +28,4 @@ if [[ ! -d `npm bin` ]]; then fi # Run command -`npm bin`/gulp clean +`npm bin`/gulp clean $@ diff --git a/scripts/start b/scripts/start index d3e0db297..385e72923 100755 --- a/scripts/start +++ b/scripts/start @@ -28,4 +28,4 @@ if [[ ! -d `npm bin` ]]; then fi # Run command -`npm bin`/gulp watch --no-lint +`npm bin`/gulp watch --no-lint $@ diff --git a/scripts/test/visual/run b/scripts/test/visual/run new file mode 100755 index 000000000..3d1d805d7 --- /dev/null +++ b/scripts/test/visual/run @@ -0,0 +1,31 @@ +#!/bin/bash + +# Copyright (c) 2016-2017 Martin Donath + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +# Check if "npm install" was executed +if [[ ! -d `npm bin` ]]; then + echo "\"node_modules\" not found:" + echo "npm install" + exit 1 +fi + +# Run command +`npm bin`/gulp tests:visual:run --clean --optimize --revision $@ diff --git a/scripts/test b/scripts/test/visual/update similarity index 97% rename from scripts/test rename to scripts/test/visual/update index e6f32df17..eabae85b3 100755 --- a/scripts/test +++ b/scripts/test/visual/update @@ -28,4 +28,4 @@ if [[ ! -d `npm bin` ]]; then fi # Run command -`npm bin`/gulp test +`npm bin`/gulp tests:visual:update $@ diff --git a/tests/visual/.gemini-local.json b/tests/visual/config/gemini-local.json similarity index 67% rename from tests/visual/.gemini-local.json rename to tests/visual/config/gemini-local.json index 706e5f900..cc8127f58 100644 --- a/tests/visual/.gemini-local.json +++ b/tests/visual/config/gemini-local.json @@ -1,6 +1,6 @@ { "rootUrl": "http://localhost:8000", - "screenshotsDir": "./tests/visual/baseline", + "screenshotsDir": "./tests/visual/baseline/local", "browsers": { "local-chrome": { "desiredCapabilities": { @@ -10,6 +10,6 @@ }, "system": { "projectRoot": "./", - "sourceRoot": "src/assets/stylesheets" + "sourceRoot": "./src/assets/stylesheets" } } diff --git a/tests/visual/mkdocs.yml b/tests/visual/mkdocs.yml deleted file mode 100644 index a4d5de5e0..000000000 --- a/tests/visual/mkdocs.yml +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright (c) 2016-2017 Martin Donath - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -# IN THE SOFTWARE. - -# Project information -site_name: Material for MkDocs Tests -site_description: A Material Design theme for MkDocs -site_author: Martin Donath -site_url: http://squidfunk.github.io/mkdocs-material/ - -# Repository -repo_name: squidfunk/mkdocs-material -repo_url: https://github.com/squidfunk/mkdocs-material - -# Copyright -copyright: 'Copyright © 2016 Martin Donath' - -# Documentation and theme directories -docs_dir: fixtures -theme_dir: ../../material - -# Options -extra: - palette: - primary: indigo - accent: indigo - social: - - type: github-alt - link: https://github.com/squidfunk - - type: twitter - link: https://twitter.com/squidfunk - - type: linkedin - link: https://de.linkedin.com/in/martin-donath-20a95039 - -# Extensions -markdown_extensions: - - markdown.extensions.admonition - - markdown.extensions.codehilite(guess_lang=false) - - markdown.extensions.footnotes - - markdown.extensions.meta - - markdown.extensions.toc(permalink=true) - - pymdownx.arithmatex - - pymdownx.betterem(smart_enable=all) - - pymdownx.caret - - pymdownx.critic - - pymdownx.emoji: - emoji_generator: !!python/name:pymdownx.emoji.to_svg - - pymdownx.inlinehilite - - pymdownx.magiclink - - pymdownx.mark - - pymdownx.smartsymbols - - pymdownx.superfences - - pymdownx.tasklist(custom_checkbox=true) - - pymdownx.tilde - -# Page tree -pages: - - Extensions: - - Admonition: extensions/admonition.md diff --git a/tests/visual/suites/extensions/admonition/docs/index.md b/tests/visual/suites/extensions/admonition/docs/index.md new file mode 100644 index 000000000..903bcdee6 --- /dev/null +++ b/tests/visual/suites/extensions/admonition/docs/index.md @@ -0,0 +1,107 @@ +# Admonition Tests + + + +## Default + +!!! note + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +## Format + +### Custom title + +!!! note "Phasellus posuere in sem ut cursus" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Long title + +!!! note "Phasellus posuere in sem ut cursus. Nullam sit amet tincidunt ipsum, sit amet elementum turpis. Etiam ipsum quam, mattis in purus vitae, lacinia fermentum enim." + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Empty title + +!!! note "" + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +## Types + +### Note + +!!! note + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Summary + +!!! summary + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Tip + +!!! tip + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Success + +!!! success + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Warning + +!!! warning + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Failure + +!!! failure + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Danger + +!!! danger + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. + +### Bug + +!!! bug + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod + nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor + massa, nec semper lorem quam in massa. diff --git a/tests/visual/suites/extensions/admonition/mkdocs.yml b/tests/visual/suites/extensions/admonition/mkdocs.yml new file mode 100644 index 000000000..83858b4f8 --- /dev/null +++ b/tests/visual/suites/extensions/admonition/mkdocs.yml @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017 Martin Donath + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +# Test suite +site_name: Admonition Test +markdown_extensions: + - markdown.extensions.admonition diff --git a/tests/visual/suites/extensions/admonition.js b/tests/visual/suites/extensions/admonition/suite.js similarity index 95% rename from tests/visual/suites/extensions/admonition.js rename to tests/visual/suites/extensions/admonition/suite.js index b9c810cf8..fe7ae8f45 100644 --- a/tests/visual/suites/extensions/admonition.js +++ b/tests/visual/suites/extensions/admonition/suite.js @@ -20,7 +20,7 @@ * IN THE SOFTWARE. */ -import generate from "../../generate.js" +import generate from "../../../generate.js" /* ---------------------------------------------------------------------------- * Tests @@ -32,10 +32,10 @@ generate({ * Admonition block * * The admonition block looks the same on everything above tablet - * portrait, so we can save a few testcases. + * portrait, so we can save a few test cases. */ - ".admonition": { - "url": "/extensions/admonition", + "admonition": { + "url": "/extensions/admonition/_", "capture": "#default + .admonition", "break": "-@tablet-portrait", "suite": { From 7d46ed2a857148c47d2c396b3bddb28cd9295efd Mon Sep 17 00:00:00 2001 From: squidfunk Date: Sat, 28 Jan 2017 20:32:13 +0100 Subject: [PATCH 06/40] Set PyMdown requirement to 1.2 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b1b14a966..2109c3ede 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,4 +20,4 @@ mkdocs>=0.16 pygments -pymdown-extensions +pymdown-extensions>=1.2 From 17808d964d881d5c8ab24174b9c5af4a31d8f70c Mon Sep 17 00:00:00 2001 From: squidfunk Date: Sat, 28 Jan 2017 23:50:33 +0100 Subject: [PATCH 07/40] Visual test setup up and running --- lib/providers/jsx.js | 2 +- lib/tasks/tests/visual/generate.js | 23 +-- lib/tasks/tests/visual/run.js | 4 +- tests/visual/{break.json => config.json} | 0 .../{gemini-local.json => gemini.local.json} | 0 tests/visual/generate.js | 87 ---------- tests/visual/helpers/spec.js | 152 ++++++++++++++++++ .../extensions/admonition/docs/index.md | 2 +- .../suites/extensions/admonition/suite.js | 61 +++---- tests/visual/suites/layout/nav/docs/empty.md | 0 tests/visual/suites/layout/nav/docs/index.md | 58 +++++++ tests/visual/suites/layout/nav/mkdocs.yml | 26 +++ tests/visual/suites/layout/nav/suite.js | 37 +++++ 13 files changed, 309 insertions(+), 143 deletions(-) rename tests/visual/{break.json => config.json} (100%) rename tests/visual/config/{gemini-local.json => gemini.local.json} (100%) delete mode 100644 tests/visual/generate.js create mode 100644 tests/visual/helpers/spec.js create mode 100644 tests/visual/suites/layout/nav/docs/empty.md create mode 100644 tests/visual/suites/layout/nav/docs/index.md create mode 100644 tests/visual/suites/layout/nav/mkdocs.yml create mode 100644 tests/visual/suites/layout/nav/suite.js diff --git a/lib/providers/jsx.js b/lib/providers/jsx.js index 371f7c8fe..d34995729 100644 --- a/lib/providers/jsx.js +++ b/lib/providers/jsx.js @@ -21,7 +21,7 @@ */ /* ---------------------------------------------------------------------------- - * Definition + * Module * ------------------------------------------------------------------------- */ export default /* JSX */ { diff --git a/lib/tasks/tests/visual/generate.js b/lib/tasks/tests/visual/generate.js index ca0dea700..7b319bc71 100644 --- a/lib/tasks/tests/visual/generate.js +++ b/lib/tasks/tests/visual/generate.js @@ -29,8 +29,9 @@ import util from "gulp-util" * Task: generate visual tests * ------------------------------------------------------------------------- */ -export default (gulp, config) => { +export default (gulp, config, args) => { const theme = path.resolve(process.cwd(), config.views.build) + const match = new RegExp(args.grep || "", "i") return () => { return gulp.src(`${config.tests.visual}/suites/**/mkdocs.yml`) .pipe( @@ -45,16 +46,18 @@ export default (gulp, config) => { `${config.tests.visual}/data`, name, "_") /* Generate test fixtures with freshly built theme */ - const proc = child.spawnSync("mkdocs", [ - "build", "--site-dir", site, "--theme-dir", theme - ], { - cwd: path.dirname(file.path) - }) + if (match.test(name)) { + const proc = child.spawnSync("mkdocs", [ + "build", "--site-dir", site, "--theme-dir", theme + ], { + cwd: path.dirname(file.path) + }) - /* Emit error, if any */ - if (proc.status) - this.emit("error", new util.PluginError("mkdocs", - `Terminated with errors: ${proc.stderr.toString()}`)) + /* Emit error, if any */ + if (proc.status) + this.emit("error", new util.PluginError("mkdocs", + `Terminated with errors: ${proc.stderr.toString()}`)) + } /* Terminate */ done() diff --git a/lib/tasks/tests/visual/run.js b/lib/tasks/tests/visual/run.js index 16f52d19c..19624a5f3 100644 --- a/lib/tasks/tests/visual/run.js +++ b/lib/tasks/tests/visual/run.js @@ -76,8 +76,8 @@ export default (gulp, config, args) => { const gemini = require( path.join(process.cwd(), `${config.tests.visual}/config`, process.env.CI || process.env.SAUCE - ? "gemini-sauce.json" - : "gemini-local.json")) + ? "gemini.sauce.json" + : "gemini.local.json")) /* Start Gemini and return runner upon finish */ return new Gemini(gemini).test(`${config.tests.visual}/suites`, { diff --git a/tests/visual/break.json b/tests/visual/config.json similarity index 100% rename from tests/visual/break.json rename to tests/visual/config.json diff --git a/tests/visual/config/gemini-local.json b/tests/visual/config/gemini.local.json similarity index 100% rename from tests/visual/config/gemini-local.json rename to tests/visual/config/gemini.local.json diff --git a/tests/visual/generate.js b/tests/visual/generate.js deleted file mode 100644 index a462c803a..000000000 --- a/tests/visual/generate.js +++ /dev/null @@ -1,87 +0,0 @@ - -const config = require("./break.json") - -// TODO: also pass breakpoints to function! - -const generate = components => { - for (const c of Object.keys(components)) { - const component = components[c] - - // TODO: check states and generate a suite for each state! - // TODO: check name variants! - // TODO: build nested suites only once - // TODO: handle waiting/js - - const states = component.states ? component.states : - [{ name: "", wait: 0 }] - - let done = 0 - for (const state of states) { - gemini.suite(`${c}${state.name}`, suite => { - - /* Set URL of page to capture */ - if (component.url) - suite.setUrl(component.url) - - /* Set elements to capture */ - if (component.capture) - suite.setCaptureElements(component.capture) - - // TODO: otherwise throw error - if (component.break) { - const [mode, name] = component.break.split("@") - - // get matching breakpoint. TODO: handle non-existent!!! - const b = config.breakpoints.findIndex(bp => { - return bp.name === name - }) - - // now split according to method - let breakpoints = [] - switch (mode) { - case "": - breakpoints = config.breakpoints.slice(b, b + 1) - break - case "+": - breakpoints = config.breakpoints.slice( - b, config.breakpoints.length + 1) - break - case "-": - breakpoints = config.breakpoints.slice(0, b + 1) - break - } - - // iterate breakpoints - for (const breakpoint of breakpoints) { - suite.capture(`@${breakpoint.name}`, actions => { - actions.setWindowSize( - breakpoint.size.width, breakpoint.size.height) - if (state.wait) - actions.wait(state.wait) - if (state.name) { - // eval, as its executed at the frontend - if (typeof state.name === "string") { - actions.executeJS(new Function(` - document.querySelector( - "${component.capture}" - ).classList.add("${state.name}") - `) - ) - } else { - actions.executeJS(state.name) - } - } - }) - } - } - - // nested suites - if (!done && component.suite) { - done = 1 - generate(component.suite) - } - }) - } - } -} -export default generate diff --git a/tests/visual/helpers/spec.js b/tests/visual/helpers/spec.js new file mode 100644 index 000000000..284e84f1f --- /dev/null +++ b/tests/visual/helpers/spec.js @@ -0,0 +1,152 @@ +/* +* Copyright (c) 2016-2017 Martin Donath +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to +* deal in the Software without restriction, including without limitation the +* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +* sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +* IN THE SOFTWARE. +*/ + +import config from "../config.json" + +/* ---------------------------------------------------------------------------- + * Helper + * ------------------------------------------------------------------------- */ + +/** + * Resolve relevant breakpoints matching expression + * + * The breakpoints are assumed to be specified by their names set in the + * configuration file, prefixed with an "@" character. + * + * There are three selection modes: + * + * 1. -@bp: The specified breakpoint and all preceding + * 2. @bp: Only the specified breakpoint + * 3. +@bp: The specified breakpoint and all following + * + * @param {Array.} breakpoints - Breakpoints + * @param {string} expr - Expression + * @return {Array.} Selected breakpoints + */ +const resolve = (breakpoints, expr) => { + if (typeof expr === "undefined") + return breakpoints + + /* Split expression and find the offset of the specified breakpoint */ + const [mode, name] = expr.split("@") + const index = breakpoints.findIndex( + breakpoint => breakpoint.name === name) + + /* Determine whether to go up or down */ + const from = mode !== "-" ? index : 0 + const to = mode !== "+" ? index + 1 : breakpoints.length + + /* Return relevant breakpoints */ + return breakpoints.slice(from, to) +} + +/* ---------------------------------------------------------------------------- + * Functions + * ------------------------------------------------------------------------- */ + +/** + * TODO + */ +const generate = components => { + + /* Generate a suite for every component */ + for (const name of Object.keys(components)) { + const component = components[name] + + /* Create suite */ + gemini.suite(name, suite => { + if (component.url) + suite.setUrl(component.url) + + /* The capture selector is assumed to exist */ + suite.setCaptureElements(component.capture) + + /* Resolve and apply relevant breakpoints */ + const breakpoints = resolve(config.breakpoints, component.break) + for (const breakpoint of breakpoints) { + suite.capture(`@${breakpoint.name}`, actions => { + actions.setWindowSize(breakpoint.size.width, breakpoint.size.height) + }) + } + + /* Generate sub-suites */ + generate(component.suite || {}) + }) + + /* Set component states to default, if none given */ + // const states = component.states + // ? component.states + // : [{ name: "", wait: 0 }] + // + // let done = 0 + // for (const state of states) { + // gemini.suite(`${name}${state.name}`, suite => { + // + // /* Set URL of page to capture */ + // if (component.url) + // suite.setUrl(component.url) + // + // /* Set elements to capture */ + // if (component.capture) + // suite.setCaptureElements(component.capture) + // + // // TODO: otherwise throw error + // if (component.break) { + // const breakpoints = resolve(config.breakpoints, component.break) + // + // // iterate breakpoints + // for (const breakpoint of breakpoints) { + // suite.capture(`@${breakpoint.name}`, actions => { + // actions.setWindowSize( + // breakpoint.size.width, breakpoint.size.height) + // if (state.wait) + // actions.wait(state.wait) + // if (state.name) { + // // eval, as its executed at the frontend + // if (typeof state.name === "string") { + // actions.executeJS(new Function(` + // document.querySelector( + // "${component.capture}" + // ).classList.add("${state.name}") + // `) + // ) + // } else { + // actions.executeJS(state.name) + // } + // } + // }) + // } + // } + // + // // nested suites + // if (!done && component.suite) { + // done = 1 + // generate(component.suite) + // } + // }) + // } + } +} + +export default { + generate +} diff --git a/tests/visual/suites/extensions/admonition/docs/index.md b/tests/visual/suites/extensions/admonition/docs/index.md index 903bcdee6..572e14f97 100644 --- a/tests/visual/suites/extensions/admonition/docs/index.md +++ b/tests/visual/suites/extensions/admonition/docs/index.md @@ -1,4 +1,4 @@ -# Admonition Tests +# Suite diff --git a/tests/visual/suites/layout/nav/_overflow/docs/index.md b/tests/visual/suites/layout/nav/_overflow/docs/index.md index 61e6cb31f..89967d7e7 100644 --- a/tests/visual/suites/layout/nav/_overflow/docs/index.md +++ b/tests/visual/suites/layout/nav/_overflow/docs/index.md @@ -1 +1,9 @@ # Suite + + diff --git a/tests/visual/suites/layout/nav/docs/default.md b/tests/visual/suites/layout/nav/docs/default.md index e69de29bb..89967d7e7 100644 --- a/tests/visual/suites/layout/nav/docs/default.md +++ b/tests/visual/suites/layout/nav/docs/default.md @@ -0,0 +1,9 @@ +# Suite + + diff --git a/tests/visual/suites/layout/nav/docs/index.md b/tests/visual/suites/layout/nav/docs/index.md index 61e6cb31f..89967d7e7 100644 --- a/tests/visual/suites/layout/nav/docs/index.md +++ b/tests/visual/suites/layout/nav/docs/index.md @@ -1 +1,9 @@ # Suite + + From 885053bfbdf9edda7bce47e824438618d76ef9bc Mon Sep 17 00:00:00 2001 From: squidfunk Date: Fri, 10 Feb 2017 16:43:32 +0100 Subject: [PATCH 39/40] Removed webfonts for visual tests --- .../javascripts/modernizr-5b0c41c2b5.js | 1 + .../javascripts/modernizr-facb31f4a3.js | 1 - .../stylesheets/application-180dae0b60.css | 1 - .../stylesheets/application-ee6a3f36b0.css | 1 + material/base.html | 20 +++++----- src/assets/stylesheets/base/_typeset.scss | 14 +------ src/base.html | 36 +++++++++--------- .../ci/admonition/#bug/@screen/chrome.png | Bin 8952 -> 5839 bytes .../ci/admonition/#bug/@screen/edge.png | Bin 11652 -> 7433 bytes .../ci/admonition/#bug/@screen/firefox.png | Bin 5038 -> 5097 bytes .../ci/admonition/#bug/@screen/ie11.png | Bin 11803 -> 7347 bytes .../#custom-title/@screen/chrome.png | Bin 9964 -> 6448 bytes .../admonition/#custom-title/@screen/edge.png | Bin 13423 -> 8401 bytes .../#custom-title/@screen/firefox.png | Bin 5547 -> 5661 bytes .../admonition/#custom-title/@screen/ie11.png | Bin 13860 -> 8268 bytes .../ci/admonition/#danger/@screen/chrome.png | Bin 8780 -> 5749 bytes .../ci/admonition/#danger/@screen/edge.png | Bin 11872 -> 7476 bytes .../ci/admonition/#danger/@screen/firefox.png | Bin 5120 -> 5142 bytes .../ci/admonition/#danger/@screen/ie11.png | Bin 11964 -> 7373 bytes .../#empty-title/@screen/chrome.png | Bin 7897 -> 4957 bytes .../admonition/#empty-title/@screen/edge.png | Bin 10899 -> 6810 bytes .../#empty-title/@screen/firefox.png | Bin 4424 -> 4466 bytes .../admonition/#empty-title/@screen/ie11.png | Bin 10993 -> 6648 bytes .../ci/admonition/#failure/@screen/chrome.png | Bin 8341 -> 5412 bytes .../ci/admonition/#failure/@screen/edge.png | Bin 11572 -> 7067 bytes .../admonition/#failure/@screen/firefox.png | Bin 4894 -> 4945 bytes .../ci/admonition/#failure/@screen/ie11.png | Bin 11675 -> 6926 bytes .../admonition/#long-title/@screen/chrome.png | Bin 14827 -> 9050 bytes .../admonition/#long-title/@screen/edge.png | Bin 20015 -> 11639 bytes .../#long-title/@screen/firefox.png | Bin 7770 -> 7866 bytes .../admonition/#long-title/@screen/ie11.png | Bin 20765 -> 11686 bytes .../ci/admonition/#note/@screen/chrome.png | Bin 8522 -> 5548 bytes .../ci/admonition/#note/@screen/edge.png | Bin 11654 -> 7394 bytes .../ci/admonition/#note/@screen/firefox.png | Bin 4953 -> 5024 bytes .../ci/admonition/#note/@screen/ie11.png | Bin 11788 -> 7274 bytes .../ci/admonition/#success/@screen/chrome.png | Bin 9226 -> 5814 bytes .../ci/admonition/#success/@screen/edge.png | Bin 12210 -> 7651 bytes .../admonition/#success/@screen/firefox.png | Bin 5112 -> 5168 bytes .../ci/admonition/#success/@screen/ie11.png | Bin 12338 -> 7350 bytes .../ci/admonition/#summary/@screen/chrome.png | Bin 8725 -> 5694 bytes .../ci/admonition/#summary/@screen/edge.png | Bin 11892 -> 7480 bytes .../admonition/#summary/@screen/firefox.png | Bin 5068 -> 5139 bytes .../ci/admonition/#summary/@screen/ie11.png | Bin 11912 -> 7307 bytes .../ci/admonition/#tip/@screen/chrome.png | Bin 8874 -> 5729 bytes .../ci/admonition/#tip/@screen/edge.png | Bin 11573 -> 7439 bytes .../ci/admonition/#tip/@screen/firefox.png | Bin 4991 -> 5093 bytes .../ci/admonition/#tip/@screen/ie11.png | Bin 11730 -> 7337 bytes .../ci/admonition/#warning/@screen/chrome.png | Bin 9019 -> 5947 bytes .../ci/admonition/#warning/@screen/edge.png | Bin 12134 -> 7766 bytes .../admonition/#warning/@screen/firefox.png | Bin 5286 -> 5373 bytes .../ci/admonition/#warning/@screen/ie11.png | Bin 12181 -> 7615 bytes .../admonition/@mobile-landscape/chrome.png | Bin 7840 -> 5036 bytes .../ci/admonition/@mobile-landscape/edge.png | Bin 12820 -> 7935 bytes .../admonition/@mobile-landscape/firefox.png | Bin 5527 -> 5571 bytes .../ci/admonition/@mobile-landscape/ie11.png | Bin 12870 -> 7802 bytes .../ci/admonition/@mobile-portrait/chrome.png | Bin 8065 -> 5080 bytes .../ci/admonition/@mobile-portrait/edge.png | Bin 12675 -> 7494 bytes .../admonition/@mobile-portrait/firefox.png | Bin 4883 -> 4982 bytes .../ci/admonition/@mobile-portrait/ie11.png | Bin 12254 -> 7454 bytes .../ci/admonition/@tablet-portrait/chrome.png | Bin 8493 -> 5605 bytes .../ci/admonition/@tablet-portrait/edge.png | Bin 11891 -> 7383 bytes .../admonition/@tablet-portrait/firefox.png | Bin 4974 -> 5073 bytes .../ci/admonition/@tablet-portrait/ie11.png | Bin 12011 -> 7292 bytes .../ci/md-nav--primary/@screen/chrome.png | Bin 8227 -> 7173 bytes .../ci/md-nav--primary/@screen/edge.png | Bin 13672 -> 7989 bytes .../ci/md-nav--primary/@screen/firefox.png | Bin 5878 -> 6285 bytes .../ci/md-nav--primary/@screen/ie11.png | Bin 13641 -> 8071 bytes .../@tablet-landscape/chrome.png | Bin 13777 -> 14441 bytes .../@tablet-landscape/edge.png | Bin 15263 -> 13035 bytes .../@tablet-landscape/firefox.png | Bin 9992 -> 10175 bytes .../@tablet-landscape/ie11.png | Bin 19988 -> 13581 bytes .../md-nav__item--nested/@screen/chrome.png | Bin 1380 -> 1245 bytes .../md-nav__item--nested/@screen/edge.png | Bin 2497 -> 1396 bytes .../md-nav__item--nested/@screen/firefox.png | Bin 1131 -> 1178 bytes .../md-nav__item--nested/@screen/ie11.png | Bin 2287 -> 1469 bytes .../@tablet-landscape/chrome.png | Bin 2059 -> 2034 bytes .../@tablet-landscape/edge.png | Bin 2693 -> 2158 bytes .../@tablet-landscape/firefox.png | Bin 1712 -> 1502 bytes .../@tablet-landscape/ie11.png | Bin 3393 -> 2255 bytes .../md-nav__link/:focus/@screen/chrome.png | Bin 1702 -> 1440 bytes .../md-nav__link/:focus/@screen/edge.png | Bin 2194 -> 1369 bytes .../md-nav__link/:focus/@screen/firefox.png | Bin 1083 -> 1108 bytes .../md-nav__link/:focus/@screen/ie11.png | Bin 1996 -> 1439 bytes .../:focus/@tablet-landscape/chrome.png | Bin 2634 -> 2561 bytes .../:focus/@tablet-landscape/edge.png | Bin 2455 -> 2125 bytes .../:focus/@tablet-landscape/firefox.png | Bin 1708 -> 1567 bytes .../:focus/@tablet-landscape/ie11.png | Bin 3068 -> 2262 bytes .../md-nav__link/:hover/@screen/chrome.png | Bin 1702 -> 1440 bytes .../md-nav__link/:hover/@screen/edge.png | Bin 2194 -> 1369 bytes .../md-nav__link/:hover/@screen/firefox.png | Bin 1083 -> 1108 bytes .../md-nav__link/:hover/@screen/ie11.png | Bin 1996 -> 1439 bytes .../:hover/@tablet-landscape/chrome.png | Bin 2618 -> 2548 bytes .../:hover/@tablet-landscape/edge.png | Bin 2416 -> 2097 bytes .../:hover/@tablet-landscape/firefox.png | Bin 1656 -> 1507 bytes .../:hover/@tablet-landscape/ie11.png | Bin 3036 -> 2219 bytes .../md-nav__link/@screen/chrome.png | Bin 1328 -> 1186 bytes .../md-nav__link/@screen/edge.png | Bin 2439 -> 1332 bytes .../md-nav__link/@screen/firefox.png | Bin 1077 -> 1112 bytes .../md-nav__link/@screen/ie11.png | Bin 2216 -> 1402 bytes .../md-nav__link/@tablet-landscape/chrome.png | Bin 2049 -> 2024 bytes .../md-nav__link/@tablet-landscape/edge.png | Bin 2683 -> 2148 bytes .../@tablet-landscape/firefox.png | Bin 1704 -> 1493 bytes .../md-nav__link/@tablet-landscape/ie11.png | Bin 3384 -> 2248 bytes .../:last-child/@screen/chrome.png | Bin 1461 -> 1232 bytes .../md-nav__item/:last-child/@screen/edge.png | Bin 2539 -> 1477 bytes .../:last-child/@screen/firefox.png | Bin 1145 -> 1181 bytes .../md-nav__item/:last-child/@screen/ie11.png | Bin 2510 -> 1361 bytes .../:last-child/@tablet-landscape/chrome.png | Bin 1670 -> 1603 bytes .../:last-child/@tablet-landscape/edge.png | Bin 2245 -> 1799 bytes .../:last-child/@tablet-landscape/firefox.png | Bin 1343 -> 1388 bytes .../:last-child/@tablet-landscape/ie11.png | Bin 2881 -> 1883 bytes .../md-nav__item/@screen/chrome.png | Bin 1852 -> 1580 bytes .../md-nav__item/@screen/edge.png | Bin 2124 -> 1554 bytes .../md-nav__item/@screen/firefox.png | Bin 1175 -> 1244 bytes .../md-nav__item/@screen/ie11.png | Bin 2528 -> 1517 bytes .../md-nav__item/@tablet-landscape/chrome.png | Bin 2271 -> 2701 bytes .../md-nav__item/@tablet-landscape/edge.png | Bin 2118 -> 1901 bytes .../@tablet-landscape/firefox.png | Bin 1436 -> 1521 bytes .../md-nav__item/@tablet-landscape/ie11.png | Bin 2809 -> 1879 bytes .../:focus/@screen/chrome.png | Bin 1573 -> 1370 bytes .../:focus/@screen/edge.png | Bin 1755 -> 1334 bytes .../:focus/@screen/firefox.png | Bin 997 -> 1054 bytes .../:focus/@screen/ie11.png | Bin 2092 -> 1326 bytes .../:focus/@tablet-landscape/chrome.png | Bin 2001 -> 2357 bytes .../:focus/@tablet-landscape/edge.png | Bin 1848 -> 1722 bytes .../:focus/@tablet-landscape/firefox.png | Bin 1295 -> 1366 bytes .../:focus/@tablet-landscape/ie11.png | Bin 2440 -> 1670 bytes .../:hover/@screen/chrome.png | Bin 1573 -> 1370 bytes .../:hover/@screen/edge.png | Bin 1755 -> 1334 bytes .../:hover/@screen/firefox.png | Bin 997 -> 1054 bytes .../:hover/@screen/ie11.png | Bin 2092 -> 1326 bytes .../:hover/@tablet-landscape/chrome.png | Bin 2001 -> 2357 bytes .../:hover/@tablet-landscape/edge.png | Bin 1848 -> 1722 bytes .../:hover/@tablet-landscape/firefox.png | Bin 1295 -> 1366 bytes .../:hover/@tablet-landscape/ie11.png | Bin 2440 -> 1670 bytes .../md-nav__link--active/@screen/chrome.png | Bin 1798 -> 1532 bytes .../md-nav__link--active/@screen/edge.png | Bin 2068 -> 1498 bytes .../md-nav__link--active/@screen/firefox.png | Bin 1127 -> 1196 bytes .../md-nav__link--active/@screen/ie11.png | Bin 2469 -> 1458 bytes .../@tablet-landscape/chrome.png | Bin 2271 -> 2701 bytes .../@tablet-landscape/edge.png | Bin 2118 -> 1901 bytes .../@tablet-landscape/firefox.png | Bin 1436 -> 1521 bytes .../@tablet-landscape/ie11.png | Bin 2809 -> 1879 bytes .../md-nav__link/:focus/@screen/chrome.png | Bin 1989 -> 1713 bytes .../md-nav__link/:focus/@screen/edge.png | Bin 2355 -> 1467 bytes .../md-nav__link/:focus/@screen/firefox.png | Bin 1167 -> 1240 bytes .../md-nav__link/:focus/@screen/ie11.png | Bin 2317 -> 1527 bytes .../:focus/@tablet-landscape/chrome.png | Bin 2556 -> 2602 bytes .../:focus/@tablet-landscape/edge.png | Bin 2324 -> 1890 bytes .../:focus/@tablet-landscape/firefox.png | Bin 1512 -> 1613 bytes .../:focus/@tablet-landscape/ie11.png | Bin 3080 -> 1935 bytes .../md-nav__link/:hover/@screen/chrome.png | Bin 1989 -> 1713 bytes .../md-nav__link/:hover/@screen/edge.png | Bin 2355 -> 1467 bytes .../md-nav__link/:hover/@screen/firefox.png | Bin 1167 -> 1240 bytes .../md-nav__link/:hover/@screen/ie11.png | Bin 2317 -> 1527 bytes .../:hover/@tablet-landscape/chrome.png | Bin 2556 -> 2602 bytes .../:hover/@tablet-landscape/edge.png | Bin 2324 -> 1890 bytes .../:hover/@tablet-landscape/firefox.png | Bin 1512 -> 1613 bytes .../:hover/@tablet-landscape/ie11.png | Bin 3080 -> 1935 bytes .../md-nav__link/@screen/chrome.png | Bin 1450 -> 1461 bytes .../md-nav__link/@screen/edge.png | Bin 2687 -> 1453 bytes .../md-nav__link/@screen/firefox.png | Bin 1175 -> 1268 bytes .../md-nav__link/@screen/ie11.png | Bin 2647 -> 1496 bytes .../md-nav__link/@tablet-landscape/chrome.png | Bin 1865 -> 2093 bytes .../md-nav__link/@tablet-landscape/edge.png | Bin 2371 -> 1835 bytes .../@tablet-landscape/firefox.png | Bin 1549 -> 1558 bytes .../md-nav__link/@tablet-landscape/ie11.png | Bin 3248 -> 1896 bytes .../md-nav__title/@screen/chrome.png | Bin 1258 -> 1220 bytes .../md-nav__title/@screen/edge.png | Bin 1995 -> 1121 bytes .../md-nav__title/@screen/firefox.png | Bin 1050 -> 1131 bytes .../md-nav__title/@screen/ie11.png | Bin 2019 -> 1180 bytes .../@tablet-landscape/chrome.png | Bin 3083 -> 3104 bytes .../md-nav__title/@tablet-landscape/edge.png | Bin 2900 -> 2784 bytes .../@tablet-landscape/firefox.png | Bin 2176 -> 2191 bytes .../md-nav__title/@tablet-landscape/ie11.png | Bin 3547 -> 2949 bytes .../~overflow/@screen/chrome.png | Bin 1610 -> 1323 bytes .../md-nav__title/~overflow/@screen/edge.png | Bin 2965 -> 1554 bytes .../~overflow/@screen/firefox.png | Bin 1147 -> 1175 bytes .../md-nav__title/~overflow/@screen/ie11.png | Bin 2868 -> 1460 bytes .../~overflow/@tablet-landscape/chrome.png | Bin 3465 -> 3570 bytes .../~overflow/@tablet-landscape/edge.png | Bin 3255 -> 2739 bytes .../~overflow/@tablet-landscape/firefox.png | Bin 2224 -> 2243 bytes .../~overflow/@tablet-landscape/ie11.png | Bin 4708 -> 3274 bytes .../suites/extensions/admonition/mkdocs.yml | 4 ++ .../suites/layout/nav/_overflow/mkdocs.yml | 4 ++ tests/visual/suites/layout/nav/mkdocs.yml | 4 ++ 186 files changed, 44 insertions(+), 42 deletions(-) create mode 100644 material/assets/javascripts/modernizr-5b0c41c2b5.js delete mode 100644 material/assets/javascripts/modernizr-facb31f4a3.js delete mode 100644 material/assets/stylesheets/application-180dae0b60.css create mode 100644 material/assets/stylesheets/application-ee6a3f36b0.css diff --git a/material/assets/javascripts/modernizr-5b0c41c2b5.js b/material/assets/javascripts/modernizr-5b0c41c2b5.js new file mode 100644 index 000000000..9bf1df9fe --- /dev/null +++ b/material/assets/javascripts/modernizr-5b0c41c2b5.js @@ -0,0 +1 @@ +!function(e,n,t){function r(e,n){return typeof e===n}function o(){var e,n,t,o,s,i,f;for(var a in w)if(w.hasOwnProperty(a)){if(e=[],n=w[a],n.name&&(e.push(n.name.toLowerCase()),n.options&&n.options.aliases&&n.options.aliases.length))for(t=0;t=9,r=t<533&&e.match(/android/gi);return n||r||s}();E?_.addTest("fontface",!1):z('@font-face {font-family:"font";src:url("https://")}',function(e,n){var s=t.getElementById("smodernizr"),r=s.sheet||s.styleSheet,o=r?r.cssRules&&r.cssRules[0]?r.cssRules[0].cssText:r.cssText||"":"",i=/src/i.test(o)&&0===o.indexOf(n.split(" ")[0]);_.addTest("fontface",i)});var j="Moz O ms Webkit",k=x._config.usePrefixes?j.split(" "):[];x._cssomPrefixes=k;var N={elem:a("modernizr")};_._q.push(function(){delete N.elem});var A={style:N.elem.style};_._q.unshift(function(){delete A.style});var R=x._config.usePrefixes?j.toLowerCase().split(" "):[];x._domPrefixes=R,x.testAllProps=v,x.testAllProps=y;var q="CSS"in e&&"supports"in e.CSS,L="supportsCSS"in e;_.addTest("supports",q||L),_.addTest("csstransforms3d",function(){var e=!!y("perspective","1px",!0),t=_._config.usePrefixes;if(e&&(!t||"webkitPerspective"in b.style)){var n,s="#modernizr{width:0;height:0}";_.supports?n="@supports (perspective: 1px)":(n="@media (transform-3d)",t&&(n+=",(-webkit-transform-3d)")),n+="{#modernizr{width:7px;height:18px;margin:0;padding:0;border:0}}",z(s+n,function(t){e=7===t.offsetWidth&&18===t.offsetHeight})}return e}),r(),o(S),delete x.addTest,delete x.addAsyncTest;for(var O=0;O<_._q.length;O++)_._q[O]();e.Modernizr=_}(window,document); \ No newline at end of file diff --git a/material/assets/stylesheets/application-180dae0b60.css b/material/assets/stylesheets/application-180dae0b60.css deleted file mode 100644 index 9cd2d2e8d..000000000 --- a/material/assets/stylesheets/application-180dae0b60.css +++ /dev/null @@ -1 +0,0 @@ -html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}html{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none}body{margin:0}hr{overflow:visible;box-sizing:content-box}a{-webkit-text-decoration-skip:objects}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}a:active,a:hover{outline-width:0}small,sub,sup{font-size:80%}sub,sup{position:relative;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}table{border-collapse:collapse;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{padding:0;background:transparent;font-size:inherit}button,input{border:0;outline:0}.admonition:before,.md-icon,.md-nav__button,.md-nav__link:after,.md-nav__title:before,.md-typeset .critic.comment:before,.md-typeset .footnote-backref,.md-typeset .task-list-control .task-list-indicator:before{font-family:Material Icons;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;white-space:nowrap;speak:none;word-wrap:normal;direction:ltr}.md-content__edit,.md-footer-nav__button,.md-header-nav__button,.md-nav__button,.md-nav__title:before{display:inline-block;margin:.4rem;padding:.8rem;font-size:2.4rem;cursor:pointer}.md-icon--arrow-back:before{content:"arrow_back"}.md-icon--arrow-forward:before{content:"arrow_forward"}.md-icon--menu:before{content:"menu"}.md-icon--search:before{content:"search"}.md-icon--home:before{content:"school"}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,input{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","onum","liga";font-feature-settings:"kern","onum","liga";font-weight:400}.no-fontface body,.no-fontface input{font-family:Helvetica Neue,Helvetica,Arial,sans-serif}code,kbd,pre{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","onum","liga";font-feature-settings:"kern","onum","liga";font-weight:400}.no-fontface code,.no-fontface kbd,.no-fontface pre{font-family:Courier New,Courier,monospace}.md-typeset{font-size:1.6rem;line-height:1.6;-webkit-print-color-adjust:exact}.md-typeset blockquote,.md-typeset ol,.md-typeset p,.md-typeset ul{margin:1em 0}.md-typeset h1{margin:0 0 4rem;color:rgba(0,0,0,.54);font-size:3.125rem;line-height:1.3}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{margin:4rem 0 1.6rem;font-size:2.5rem;line-height:1.4}.md-typeset h3{margin:3.2rem 0 1.6rem;font-size:2rem;font-weight:400;letter-spacing:-.01em;line-height:1.5}.md-typeset h2+h3{margin-top:1.6rem}.md-typeset h4{font-size:1.6rem}.md-typeset h4,.md-typeset h5,.md-typeset h6{margin:1.6rem 0;font-weight:700;letter-spacing:-.01em}.md-typeset h5,.md-typeset h6{color:rgba(0,0,0,.54);font-size:1.28rem}.md-typeset h5{text-transform:uppercase}.md-typeset hr{margin:1.5em 0;border-bottom:.1rem dotted rgba(0,0,0,.26)}.md-typeset a{color:#3f51b5;word-break:break-word}.md-typeset a,.md-typeset a:before{-webkit-transition:color .125s;transition:color .125s}.md-typeset a:active,.md-typeset a:hover{color:#536dfe}.md-typeset code,.md-typeset pre{background-color:hsla(0,0%,93%,.5);color:#37474f;font-size:85%}.md-typeset code{margin:0 .29412em;padding:.07353em 0;border-radius:.2rem;box-shadow:.29412em 0 0 hsla(0,0%,93%,.5),-.29412em 0 0 hsla(0,0%,93%,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{margin:0;background-color:transparent;box-shadow:none}.md-typeset a>code{margin:inherit;padding:inherit;border-radius:none;background-color:inherit;color:inherit;box-shadow:none}.md-typeset pre{margin:1em 0;padding:1rem 1.2rem;border-radius:.2rem;line-height:1.4;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset pre::-webkit-scrollbar{width:.4rem;height:.4rem}.md-typeset pre::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset pre>code{margin:0;background-color:transparent;font-size:inherit;box-shadow:none;-webkit-box-decoration-break:none;box-decoration-break:none}.md-typeset kbd{padding:0 .29412em;border:.1rem solid #c9c9c9;border-radius:.2rem;border-bottom-color:#bcbcbc;background-color:#fcfcfc;color:#555;font-size:85%;box-shadow:0 .1rem 0 #b0b0b0;word-break:break-word}.md-typeset mark{margin:0 .25em;padding:.0625em 0;border-radius:.2rem;background-color:rgba(255,235,59,.5);box-shadow:.25em 0 0 rgba(255,235,59,.5),-.25em 0 0 rgba(255,235,59,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset abbr{border-bottom:.1rem dotted rgba(0,0,0,.54);cursor:help}.md-typeset small{opacity:.75}.md-typeset sub,.md-typeset sup{margin-left:.07812em}.md-typeset blockquote{padding-left:1.2rem;border-left:.4rem solid rgba(0,0,0,.26);color:rgba(0,0,0,.54)}.md-typeset ul{list-style-type:disc}.md-typeset ol,.md-typeset ul{margin-left:.625em;padding:0}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em;margin-left:1.25em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin:.5em 0 .5em .625em}.md-typeset iframe,.md-typeset img,.md-typeset svg{max-width:100%}.md-typeset table:not([class]){box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);margin:2em 0;border-radius:.2rem;font-size:1.28rem;overflow:hidden}.no-js .md-typeset table:not([class]){display:inline-block;max-width:100%;margin:.8em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}.md-typeset table:not([class]) th{min-width:10rem;padding:1.2rem 1.6rem;background-color:rgba(0,0,0,.54);color:#fff;vertical-align:top}.md-typeset table:not([class]) td{padding:1.2rem 1.6rem;border-top:.1rem solid rgba(0,0,0,.07);vertical-align:top}.md-typeset table:not([class]) tr:first-child td{border-top:0}.md-typeset table:not([class]) a{word-break:normal}.md-typeset .md-typeset__table{margin:1.6em -1.6rem;overflow-x:auto;-webkit-overflow-scrolling:touch}.md-typeset .md-typeset__table table{display:inline-block;margin:0 1.6rem}html{font-size:62.5%}body,html{height:100%}body{position:relative}hr{display:block;height:.1rem;padding:0;border:0}.md-svg{display:none}.md-grid{max-width:122rem;margin-right:auto;margin-left:auto}.md-container,.md-main{overflow:auto}.md-container{display:table;width:100%;height:100%;table-layout:fixed}.md-main{display:table-row;height:100%}.md-main__inner{margin-top:5.6rem;padding-top:3rem;overflow:auto}.csscalc .md-main__inner{min-height:calc(100% - 2.6rem)}@-moz-document url-prefix(){.csscalc .md-main__inner{min-height:calc(100% - 5.6rem)}}.md-toggle{display:none}.md-overlay{position:fixed;top:0;width:0;height:0;-webkit-transition:width 0s .25s,height 0s .25s,opacity .25s;transition:width 0s .25s,height 0s .25s,opacity .25s;background-color:rgba(0,0,0,.54);opacity:0;z-index:2}.md-flex{display:table}.md-flex__cell{display:table-cell;position:relative;vertical-align:top}.md-flex__cell--shrink{width:0}.md-flex__cell--stretch{display:table;width:100%;table-layout:fixed}.md-flex__ellipsis{display:table-cell;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}@page{margin:25mm}.md-content__inner{margin:2.4rem 1.6rem}.md-content__edit{float:right}.md-header{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:fixed;top:0;right:0;left:0;height:5.6rem;-webkit-transition:background-color .25s;transition:background-color .25s;background-color:#3f51b5;color:#fff;z-index:1}.md-header-nav{padding:.4rem}.md-header-nav__button{position:relative;-webkit-transition:opacity .25s;transition:opacity .25s;z-index:1}.md-header-nav__button:hover{opacity:.7}.md-header-nav__button.md-logo img{display:block}.no-js .md-header-nav__button.md-icon--search{display:none}.md-header-nav__title{padding:0 2rem;font-size:1.8rem;line-height:4.8rem}.md-header-nav__parent{color:hsla(0,0%,100%,.7)}.md-header-nav__parent:after{display:inline;color:hsla(0,0%,100%,.3);content:"/"}.md-header-nav__source{display:none}.md-footer-nav{background-color:rgba(0,0,0,.87);color:#fff}.md-footer-nav__inner{padding:.4rem;overflow:auto}.md-footer-nav__link{padding-top:2.8rem;padding-bottom:.8rem;-webkit-transition:opacity .25s;transition:opacity .25s}.md-footer-nav__link:hover{opacity:.7}.md-footer-nav__link--prev{width:25%;float:left}.md-footer-nav__link--next{width:75%;float:right;text-align:right}.md-footer-nav__button{-webkit-transition:background .25s;transition:background .25s}.md-footer-nav__title{position:relative;padding:0 2rem;font-size:1.8rem;line-height:4.8rem}.md-footer-nav__direction{position:absolute;right:0;left:0;margin-top:-2rem;padding:0 2rem;color:hsla(0,0%,100%,.7);font-size:1.5rem}.md-footer-meta{background:rgba(0,0,0,.895)}.md-footer-meta__inner{padding:.4rem;overflow:auto}html .md-footer-meta.md-typeset a{color:hsla(0,0%,100%,.7)}.md-footer-copyright{margin:0 1.2rem;padding:.8rem 0;color:hsla(0,0%,100%,.3);font-size:1.28rem}.md-footer-copyright__highlight{color:hsla(0,0%,100%,.7)}.md-footer-social{margin:0 .8rem;padding:.4rem 0 1.2rem}.md-footer-social__link{display:inline-block;width:3.2rem;height:3.2rem;border:.1rem solid hsla(0,0%,100%,.12);border-radius:100%;color:hsla(0,0%,100%,.7);font-size:1.6rem;text-align:center}.md-footer-social__link:before{line-height:1.9}.md-nav{font-size:1.4rem;line-height:1.3}.md-nav--secondary{-webkit-transition:border-left .25s;transition:border-left .25s;border-left:.4rem solid #3f51b5}.md-nav__title{display:block;padding:1.2rem 1.2rem 0;font-weight:700;text-overflow:ellipsis;overflow:hidden}.md-nav__title:before{display:none;content:"arrow_back"}.md-nav__title .md-nav__button{display:none}.md-nav__list{margin:0;padding:0;list-style:none}.md-nav__item{padding:.625em 1.2rem 0}.md-nav__item:last-child{padding-bottom:1.2rem}.md-nav__item .md-nav__item{padding-right:0}.md-nav__item .md-nav__item:last-child{padding-bottom:0}.md-nav__button img{width:100%;height:auto}.md-nav__link{display:block;-webkit-transition:color .125s;transition:color .125s;text-overflow:ellipsis;cursor:pointer;overflow:hidden}.md-nav__item--nested>.md-nav__link:after{content:"keyboard_arrow_down"}html .md-nav__link[for=toc],html .md-nav__link[for=toc]+.md-nav__link:after,html .md-nav__link[for=toc]~.md-nav{display:none}.md-nav__link[data-md-state=blur]{color:rgba(0,0,0,.54)}.md-nav__link--active,.md-nav__link:active{color:#3f51b5}.md-nav__link:focus,.md-nav__link:hover{color:#536dfe}.md-nav__source,.no-js .md-search{display:none}.md-search__overlay{display:none;pointer-events:none}.md-search__inner{width:100%}.md-search__form{position:relative}.md-search__input{position:relative;padding:0 1.6rem 0 7.2rem;text-overflow:ellipsis;z-index:1}.md-search__input+.md-search__icon,.md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__input::-ms-clear{display:none}.md-search__icon{position:absolute;top:.8rem;left:1.2rem;-webkit-transition:color .25s;transition:color .25s;font-size:2.4rem;cursor:pointer;z-index:1}.md-search__icon:before{content:"search"}.md-search__output{position:absolute;width:100%;border-radius:0 0 .2rem .2rem;overflow:hidden}.md-search__scrollwrap{height:100%;background:-webkit-linear-gradient(top,#fff 10%,hsla(0,0%,100%,0)),-webkit-linear-gradient(top,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background:linear-gradient(180deg,#fff 10%,hsla(0,0%,100%,0)),linear-gradient(180deg,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background-attachment:local,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100% 2rem,100% 1rem;box-shadow:inset 0 .1rem 0 rgba(0,0,0,.07);overflow-y:auto;-webkit-overflow-scrolling:touch}.md-search-result__meta{padding:0 1.6rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-size:1.28rem;line-height:4rem}.md-search-result__list{margin:0;padding:0;border-top:.1rem solid rgba(0,0,0,.07);list-style:none}.md-search-result__item{box-shadow:0 -.1rem 0 rgba(0,0,0,.07)}.md-search-result__link{display:block;padding:0 1.6rem;-webkit-transition:background .25s;transition:background .25s;overflow:auto}.md-search-result__link:hover{background-color:rgba(83,109,254,.1)}.md-search-result__article{margin:1em 0}.md-search-result__title{margin-top:.5em;margin-bottom:0;color:rgba(0,0,0,.87);font-size:1.6rem;font-weight:400;line-height:1.4}.md-search-result__teaser{margin:.5em 0;color:rgba(0,0,0,.54);font-size:1.28rem;line-height:1.4;word-break:break-word}.md-sidebar{position:relative;width:24.2rem;padding:2.4rem 0;float:left;overflow:visible}.md-sidebar[data-md-state=lock]{position:fixed;top:5.6rem;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-sidebar--secondary{display:none}.md-sidebar__scrollwrap{max-height:100%;margin:0 .4rem;overflow-y:auto}.md-sidebar__scrollwrap::-webkit-scrollbar{width:.4rem;height:.4rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}@-webkit-keyframes a{0%{height:0}to{height:1.3rem}}@keyframes a{0%{height:0}to{height:1.3rem}}@-webkit-keyframes b{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes b{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}.md-source{display:block;-webkit-transition:opacity .25s;transition:opacity .25s;font-size:1.3rem;line-height:1.2;white-space:nowrap}.md-source:hover{opacity:.7}.md-source:after,.md-source__icon{display:inline-block;height:4.8rem;content:"";vertical-align:middle}.md-source__icon{width:4.8rem}.md-source__icon svg{margin-top:1.2rem;margin-left:1.2rem}.md-source__icon+.md-source__repository{margin-left:-4.4rem;padding-left:4rem}.md-source__repository{display:inline-block;max-width:100%;margin-left:1.2rem;font-weight:700;text-overflow:ellipsis;overflow:hidden;vertical-align:middle}.md-source__facts{margin:0;padding:0;font-size:1.1rem;font-weight:700;list-style-type:none;opacity:.75;overflow:hidden}[data-md-state=done] .md-source__facts{-webkit-animation:a .25s ease-in;animation:a .25s ease-in}.md-source__fact{float:left}[data-md-state=done] .md-source__fact{-webkit-animation:b .4s ease-out;animation:b .4s ease-out}.md-source__fact:before{margin:0 .2rem;content:"\00B7"}.md-source__fact:first-child:before{display:none}.admonition{position:relative;margin:1.5625em 0;padding:.8rem 1.2rem;border-left:3.2rem solid rgba(68,138,255,.4);border-radius:.2rem;background-color:rgba(68,138,255,.15);font-size:1.28rem}.admonition:before{position:absolute;left:-2.6rem;color:#fff;font-size:2rem;content:"edit";vertical-align:-.25em}.admonition :first-child{margin-top:0}.admonition :last-child{margin-bottom:0}.admonition.summary,.admonition.tldr{border-color:rgba(0,176,255,.4);background-color:rgba(0,176,255,.15)}.admonition.summary:before,.admonition.tldr:before{content:"subject"}.admonition.hint,.admonition.important,.admonition.tip{border-color:rgba(0,191,165,.4);background-color:rgba(0,191,165,.15)}.admonition.hint:before,.admonition.important:before,.admonition.tip:before{content:"whatshot"}.admonition.check,.admonition.done,.admonition.success{border-color:rgba(0,230,118,.4);background-color:rgba(0,230,118,.15)}.admonition.check:before,.admonition.done:before,.admonition.success:before{content:"done"}.admonition.attention,.admonition.caution,.admonition.warning{border-color:rgba(255,145,0,.4);background-color:rgba(255,145,0,.15)}.admonition.attention:before,.admonition.caution:before,.admonition.warning:before{content:"warning"}.admonition.fail,.admonition.failure,.admonition.missing{border-color:rgba(255,82,82,.4);background-color:rgba(255,82,82,.15)}.admonition.fail:before,.admonition.failure:before,.admonition.missing:before{content:"clear"}.admonition.danger,.admonition.error{border-color:rgba(255,23,68,.4);background-color:rgba(255,23,68,.15)}.admonition.danger:before,.admonition.error:before{content:"flash_on"}.admonition.bug{border-color:rgba(245,0,87,.4);background-color:rgba(245,0,87,.15)}.admonition.bug:before{content:"bug_report"}.admonition-title{font-weight:700}html .admonition-title{margin-bottom:0}html .admonition-title+*{margin-top:0}.codehilite .o,.codehilite .ow{color:inherit}.codehilite .ge{color:#000}.codehilite .gr{color:#a00}.codehilite .gh{color:#999}.codehilite .go{color:#888}.codehilite .gp{color:#555}.codehilite .gs{color:inherit}.codehilite .gu{color:#aaa}.codehilite .gt{color:#a00}.codehilite .gd{background-color:#fdd}.codehilite .gi{background-color:#dfd}.codehilite .k{color:#3b78e7}.codehilite .kc{color:#a71d5d}.codehilite .kd,.codehilite .kn{color:#3b78e7}.codehilite .kp{color:#a71d5d}.codehilite .kr,.codehilite .kt{color:#3e61a2}.codehilite .c,.codehilite .cm{color:#999}.codehilite .cp{color:#666}.codehilite .c1,.codehilite .ch,.codehilite .cs{color:#999}.codehilite .na,.codehilite .nb{color:#c2185b}.codehilite .bp{color:#3e61a2}.codehilite .nc{color:#c2185b}.codehilite .no{color:#3e61a2}.codehilite .nd,.codehilite .ni{color:#666}.codehilite .ne,.codehilite .nf{color:#c2185b}.codehilite .nl{color:#3b5179}.codehilite .nn{color:#ec407a}.codehilite .nt{color:#3b78e7}.codehilite .nv,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#3e61a2}.codehilite .nx{color:#ec407a}.codehilite .il,.codehilite .m,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#e74c3c}.codehilite .s,.codehilite .sb,.codehilite .sc{color:#0d904f}.codehilite .sd{color:#999}.codehilite .s2{color:#0d904f}.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sx{color:#183691}.codehilite .sr{color:#009926}.codehilite .s1,.codehilite .ss{color:#0d904f}.codehilite .err{color:#a61717}.codehilite .w{color:transparent}.codehilite .hll{display:block;margin:0 -1.2rem;padding:0 1.2rem;background-color:rgba(255,235,59,.5)}.md-typeset .codehilite{margin:1em 0;padding:1rem 1.2rem .8rem;border-radius:.2rem;background-color:hsla(0,0%,93%,.5);color:#37474f;line-height:1.4;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .codehilite::-webkit-scrollbar{width:.4rem;height:.4rem}.md-typeset .codehilite::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset .codehilite::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset .codehilite pre{display:inline-block;min-width:100%;margin:0;padding:0;background-color:transparent;overflow:visible;vertical-align:top}.md-typeset .codehilitetable{display:block;margin:1em 0;border-radius:.2em;font-size:1.6rem;overflow:hidden}.md-typeset .codehilitetable tbody,.md-typeset .codehilitetable td{display:block;padding:0}.md-typeset .codehilitetable tr{display:-webkit-box;display:-ms-flexbox;display:flex}.md-typeset .codehilitetable .codehilite,.md-typeset .codehilitetable .linenodiv{margin:0;border-radius:0}.md-typeset .codehilitetable .linenodiv{padding:1rem 1.2rem .8rem}.md-typeset .codehilitetable .linenodiv,.md-typeset .codehilitetable .linenodiv>pre{height:100%}.md-typeset .codehilitetable .linenos{background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.26);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-typeset .codehilitetable .linenos pre{margin:0;padding:0;background-color:transparent;color:inherit;text-align:right}.md-typeset .codehilitetable .code{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.md-typeset>.codehilitetable{box-shadow:none}.md-typeset .footnote{color:rgba(0,0,0,.54);font-size:1.28rem}.md-typeset .footnote ol{margin-left:0}.md-typeset .footnote li{-webkit-transition:color .25s;transition:color .25s}.md-typeset .footnote li:before{display:block;height:0}.md-typeset .footnote li:target{color:rgba(0,0,0,.87)}.md-typeset .footnote li:target:before{margin-top:-9rem;padding-top:9rem;pointer-events:none}.md-typeset .footnote li :first-child{margin-top:0}.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}.md-typeset .footnote li:hover .footnote-backref:hover,.md-typeset .footnote li:target .footnote-backref{color:#536dfe}.md-typeset .footnote-backref{display:inline-block;-webkit-transform:translateX(.5rem);transform:translateX(.5rem);-webkit-transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s,-webkit-transform .25s .125s;color:rgba(0,0,0,.26);font-size:0;opacity:0;vertical-align:text-bottom}.md-typeset .footnote-backref:before{font-size:1.6rem;content:"keyboard_return"}.md-typeset .headerlink{display:inline-block;margin-left:1rem;-webkit-transform:translateY(.5rem);transform:translateY(.5rem);-webkit-transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s,-webkit-transform .25s .25s;opacity:0}html body .md-typeset .headerlink{color:rgba(0,0,0,.26)}.md-typeset [id]:before{display:inline-block;content:""}.md-typeset [id]:target:before{margin-top:-9.8rem;padding-top:9.8rem}.md-typeset [id] .headerlink:focus,.md-typeset [id]:hover .headerlink,.md-typeset [id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset [id] .headerlink:focus,.md-typeset [id]:hover .headerlink:hover,.md-typeset [id]:target .headerlink{color:#536dfe}.md-typeset h1[id]{padding-top:.8rem}.md-typeset h1[id].headerlink{display:none}.md-typeset h2[id]:before{display:block;margin-top:-.4rem;padding-top:.4rem}.md-typeset h2[id]:target:before{margin-top:-8.4rem;padding-top:8.4rem}.md-typeset h3[id]:before{display:block;margin-top:-.7rem;padding-top:.7rem}.md-typeset h3[id]:target:before{margin-top:-8.7rem;padding-top:8.7rem}.md-typeset h4[id]:before{display:block;margin-top:-.8rem;padding-top:.8rem}.md-typeset h4[id]:target:before{margin-top:-8.8rem;padding-top:8.8rem}.md-typeset h5[id]:before{display:block;margin-top:-1.1rem;padding-top:1.1rem}.md-typeset h5[id]:target:before{margin-top:-9.1rem;padding-top:9.1rem}.md-typeset h6[id]:before{display:block;margin-top:-1.1rem;padding-top:1.1rem}.md-typeset h6[id]:target:before{margin-top:-9.1rem;padding-top:9.1rem}.md-typeset .MJXc-display{margin:.75em 0;padding:.25em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .MathJax_CHTML{outline:0}.md-typeset .comment.critic,.md-typeset del.critic,.md-typeset ins.critic{margin:0 .25em;padding:.0625em 0;border-radius:.2rem;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:#fdd;box-shadow:.25em 0 0 #fdd,-.25em 0 0 #fdd}.md-typeset ins.critic{background-color:#dfd;box-shadow:.25em 0 0 #dfd,-.25em 0 0 #dfd}.md-typeset .critic.comment{background-color:hsla(0,0%,93%,.5);color:#37474f;box-shadow:.25em 0 0 hsla(0,0%,93%,.5),-.25em 0 0 hsla(0,0%,93%,.5)}.md-typeset .critic.comment:before{padding-right:.125em;color:rgba(0,0,0,.26);content:"chat";vertical-align:-.125em}.md-typeset .critic.block{display:block;margin:1em 0;padding-right:1.6rem;padding-left:1.6rem;box-shadow:none}.md-typeset .critic.block :first-child{margin-top:.5em}.md-typeset .critic.block :last-child{margin-bottom:.5em}.md-typeset .emojione{width:2rem;vertical-align:text-top}.md-typeset code.codehilite{margin:0 .29412em;padding:.07353em 0}.md-typeset .task-list-item{position:relative;list-style-type:none}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em;left:-2em}.md-typeset .task-list-control .task-list-indicator:before{position:absolute;top:.05em;left:-1.25em;color:rgba(0,0,0,.26);font-size:1.5em;content:"check_box_outline_blank";vertical-align:-.25em}.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator:before{content:"check_box"}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}@media print{.md-typeset a:after{color:rgba(0,0,0,.54);content:" [" attr(href) "]"}.md-typeset code{box-shadow:none;-webkit-box-decoration-break:initial;box-decoration-break:slice}.md-content__edit,.md-footer,.md-header,.md-sidebar,.md-typeset .headerlink{display:none}}@media only screen and (max-width:44.9375em){.md-typeset pre{margin:1em -1.6rem;padding:1rem 1.6rem;border-radius:0}.md-footer-nav__link--prev .md-footer-nav__title{display:none}.codehilite .hll{margin:0 -1.6rem;padding:0 1.6rem}.md-typeset>.codehilite{padding:1rem 1.6rem .8rem}.md-typeset>.codehilite,.md-typeset>.codehilitetable{margin:1em -1.6rem;border-radius:0}.md-typeset>.codehilitetable .codehilite,.md-typeset>.codehilitetable .linenodiv{padding:1rem 1.6rem}.md-typeset>p>.MJXc-display{margin:.75em -1.6rem;padding:.25em 1.6rem}}@media only screen and (min-width:100em){html{font-size:68.75%}}@media only screen and (min-width:125em){html{font-size:75%}}@media only screen and (max-width:59.9375em){body[data-md-state=lock]{overflow:hidden}.ios body[data-md-state=lock] .md-container{display:none}.md-content__edit{margin-right:-.8rem}.md-nav--secondary{border-left:0}html .md-nav__link[for=toc]{display:block;padding-right:4.8rem}html .md-nav__link[for=toc]:after{color:inherit;content:"toc"}html .md-nav__link[for=toc]+.md-nav__link{display:none}html .md-nav__link[for=toc]~.md-nav{display:-webkit-box;display:-ms-flexbox;display:flex}.md-nav__source{display:block;padding:.4rem;background-color:rgba(50,64,144,.9675);color:#fff}.md-search__overlay{display:block;position:absolute;top:.4rem;left:.4rem;width:4rem;height:4rem;-webkit-transform-origin:center;transform-origin:center;-webkit-transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:transform .3s .1s,opacity .2s .2s;transition:transform .3s .1s,opacity .2s .2s,-webkit-transform .3s .1s;border-radius:2rem;background-color:#fff;opacity:0;overflow:hidden;z-index:1}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transition:opacity .1s,-webkit-transform .4s;transition:opacity .1s,-webkit-transform .4s;transition:transform .4s,opacity .1s;transition:transform .4s,opacity .1s,-webkit-transform .4s;opacity:1}.md-search__inner{position:fixed;top:0;left:100%;height:100%;-webkit-transform:translateX(5%);transform:translateX(5%);-webkit-transition:left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;transition:left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;opacity:0;z-index:2}[data-md-toggle=search]:checked~.md-header .md-search__inner{left:0;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;transition:left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;opacity:1}.md-search__input{width:100%;height:5.6rem;font-size:1.8rem}.md-search__icon{top:1.6rem;left:1.6rem}.md-search__icon:before{content:"arrow_back"}.md-search__output{top:5.6rem;bottom:0}}@media only screen and (max-width:76.1875em){[data-md-toggle=drawer]:checked~.md-overlay{width:100%;height:100%;-webkit-transition:width 0s,height 0s,opacity .25s;transition:width 0s,height 0s,opacity .25s;opacity:1}.md-header-nav__button.md-icon--home,.md-header-nav__button.md-logo{display:none}.md-nav--primary,.md-nav--primary .md-nav{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;top:0;right:0;left:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;z-index:1}.md-nav--primary{background-color:#fff}.md-nav--primary .md-nav__toggle~.md-nav{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.4);background-color:#fff}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:1.6rem;line-height:1.5}html .md-nav--primary .md-nav__title{position:relative;height:11.2rem;padding:6rem 1.6rem .4rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-weight:400;line-height:4.8rem;white-space:nowrap;cursor:pointer}html .md-nav--primary .md-nav__title:before{display:block;position:absolute;top:.4rem;left:.4rem;width:4rem;height:4rem;color:rgba(0,0,0,.54)}html .md-nav--primary .md-nav__title~.md-nav__list{background:-webkit-linear-gradient(top,#fff 10%,hsla(0,0%,100%,0)),-webkit-linear-gradient(top,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background:linear-gradient(180deg,#fff 10%,hsla(0,0%,100%,0)),linear-gradient(180deg,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background-attachment:local,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100% 2rem,100% 1rem;box-shadow:inset 0 .1rem 0 rgba(0,0,0,.07)}html .md-nav--primary .md-nav__title~.md-nav__list>.md-nav__item:first-child{border-top:0}html .md-nav--primary .md-nav__title--site{position:relative;background-color:#3f51b5;color:#fff}html .md-nav--primary .md-nav__title--site .md-nav__button{display:block;position:absolute;top:.4rem;left:.4rem;width:6.4rem;height:6.4rem;font-size:4.8rem}html .md-nav--primary .md-nav__title--site:before{display:none}.md-nav--primary .md-nav__list{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto}.md-nav--primary .md-nav__item{padding:0;border-top:.1rem solid rgba(0,0,0,.07)}.md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:4.8rem}.md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"keyboard_arrow_right"}.md-nav--primary .md-nav__link{position:relative;padding:1.6rem}.md-nav--primary .md-nav__link:after{position:absolute;top:50%;right:1.2rem;margin-top:-1.2rem;color:rgba(0,0,0,.54);font-size:2.4rem}.md-nav--primary .md-nav__link:hover:after{color:inherit}.md-nav--primary .md-nav--secondary .md-nav{position:static}.md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:2.8rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:4rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:5.2rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:6.4rem}.md-nav__toggle~.md-nav{display:none}.csstransforms3d .md-nav__toggle~.md-nav{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s;transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);opacity:0}.csstransforms3d .md-nav__toggle~.md-nav,.md-nav__toggle:checked~.md-nav{display:-webkit-box;display:-ms-flexbox;display:flex}.csstransforms3d .md-nav__toggle:checked~.md-nav{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1}.md-sidebar--primary{position:fixed;top:0;left:-24.2rem;width:24.2rem;height:100%;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);background-color:#fff;z-index:2}.no-csstransforms3d .md-sidebar--primary{display:none}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4);-webkit-transform:translateX(24.2rem);transform:translateX(24.2rem)}.no-csstransforms3d [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{display:block}.md-sidebar--primary .md-sidebar__scrollwrap{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;margin:0}}@media only screen and (min-width:60em){.md-content{margin-right:24.2rem}.md-header-nav__button.md-icon--search{display:none}.md-header-nav__source{display:block;width:23rem;max-width:23rem;padding-right:1.2rem}.md-search{margin-right:2.8rem;padding:.4rem}.md-search__inner{display:table;position:relative;clear:both}.md-search__form{width:23rem;float:right;-webkit-transition:width .25s cubic-bezier(.1,.7,.1,1);transition:width .25s cubic-bezier(.1,.7,.1,1);border-radius:.2rem}.md-search__input{width:100%;height:4rem;padding-left:4.8rem;-webkit-transition:background-color .25s,color .25s;transition:background-color .25s,color .25s;border-radius:.2rem;background-color:rgba(0,0,0,.26);color:#fff;font-size:1.6rem}.md-search__input+.md-search__icon,.md-search__input::-webkit-input-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input::-moz-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input:-ms-input-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input::placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input:hover{background-color:hsla(0,0%,100%,.12)}[data-md-toggle=search]:checked~.md-header .md-search__input{border-radius:.2rem .2rem 0 0;background-color:#fff;color:rgba(0,0,0,.87);text-overflow:none}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__output{top:4rem;-webkit-transition:opacity .4s;transition:opacity .4s;opacity:0}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4);opacity:1}.md-search__scrollwrap{max-height:0}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap::-webkit-scrollbar{width:.4rem;height:.4rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-search-result__link,.md-search-result__meta{padding-left:4.8rem}.md-sidebar--secondary{display:block;float:right}.md-sidebar--secondary[data-md-state=lock]{margin-left:100%;-webkit-transform:translate(-100%);transform:translate(-100%)}}@media only screen and (min-width:76.25em){.md-content{margin-left:24.2rem;overflow:auto}.md-content__inner{margin:2.4rem}.md-content__inner :last-child{margin-bottom:0}.md-header-nav__button.md-icon--menu{display:none}.md-nav[data-md-state=animate]{-webkit-transition:max-height .25s cubic-bezier(.86,0,.07,1);transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav__toggle~.md-nav{max-height:0;overflow:hidden}.md-nav[data-md-state=expand],.md-nav__toggle:checked~.md-nav{max-height:100%}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--nested>.md-nav__link:after{display:inline-block;-webkit-transform-origin:.45em .45em;transform-origin:.45em .45em;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;vertical-align:-.125em}.js .md-nav__item--nested>.md-nav__link:after{-webkit-transition:-webkit-transform .4s;transition:-webkit-transform .4s;transition:transform .4s;transition:transform .4s,-webkit-transform .4s}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link:after{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__form{width:68.8rem}.md-sidebar__inner{border-right:.1rem solid rgba(0,0,0,.07)}}@media only screen and (max-width:29.9375em){.md-header-nav__parent{display:none}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(45);transform:scale(45)}}@media only screen and (min-width:45em){.md-footer-nav__link{width:50%}.md-footer-copyright{max-width:75%;float:left}.md-footer-social{padding:1.2rem 0;float:right}}@media only screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(60);transform:scale(60)}}@media only screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(75);transform:scale(75)}}@media only screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__form{width:46.8rem}}@media only screen and (min-width:60em) and (min-width:76.25em){.md-sidebar--secondary[data-md-state=lock]{margin-left:122rem}} \ No newline at end of file diff --git a/material/assets/stylesheets/application-ee6a3f36b0.css b/material/assets/stylesheets/application-ee6a3f36b0.css new file mode 100644 index 000000000..811822de0 --- /dev/null +++ b/material/assets/stylesheets/application-ee6a3f36b0.css @@ -0,0 +1 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}html{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none}body{margin:0}hr{overflow:visible;box-sizing:content-box}a{-webkit-text-decoration-skip:objects}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}a:active,a:hover{outline-width:0}small,sub,sup{font-size:80%}sub,sup{position:relative;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}table{border-collapse:collapse;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{padding:0;background:transparent;font-size:inherit}button,input{border:0;outline:0}.admonition:before,.md-icon,.md-nav__button,.md-nav__link:after,.md-nav__title:before,.md-typeset .critic.comment:before,.md-typeset .footnote-backref,.md-typeset .task-list-control .task-list-indicator:before{font-family:Material Icons;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;white-space:nowrap;speak:none;word-wrap:normal;direction:ltr}.md-content__edit,.md-footer-nav__button,.md-header-nav__button,.md-nav__button,.md-nav__title:before{display:inline-block;margin:.4rem;padding:.8rem;font-size:2.4rem;cursor:pointer}.md-icon--arrow-back:before{content:"arrow_back"}.md-icon--arrow-forward:before{content:"arrow_forward"}.md-icon--menu:before{content:"menu"}.md-icon--search:before{content:"search"}.md-icon--home:before{content:"school"}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,input{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","onum","liga";font-feature-settings:"kern","onum","liga";font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400}code,kbd,pre{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","onum","liga";font-feature-settings:"kern","onum","liga";font-family:Courier New,Courier,monospace;font-weight:400}.md-typeset{font-size:1.6rem;line-height:1.6;-webkit-print-color-adjust:exact}.md-typeset blockquote,.md-typeset ol,.md-typeset p,.md-typeset ul{margin:1em 0}.md-typeset h1{margin:0 0 4rem;color:rgba(0,0,0,.54);font-size:3.125rem;line-height:1.3}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{margin:4rem 0 1.6rem;font-size:2.5rem;line-height:1.4}.md-typeset h3{margin:3.2rem 0 1.6rem;font-size:2rem;font-weight:400;letter-spacing:-.01em;line-height:1.5}.md-typeset h2+h3{margin-top:1.6rem}.md-typeset h4{font-size:1.6rem}.md-typeset h4,.md-typeset h5,.md-typeset h6{margin:1.6rem 0;font-weight:700;letter-spacing:-.01em}.md-typeset h5,.md-typeset h6{color:rgba(0,0,0,.54);font-size:1.28rem}.md-typeset h5{text-transform:uppercase}.md-typeset hr{margin:1.5em 0;border-bottom:.1rem dotted rgba(0,0,0,.26)}.md-typeset a{color:#3f51b5;word-break:break-word}.md-typeset a,.md-typeset a:before{-webkit-transition:color .125s;transition:color .125s}.md-typeset a:active,.md-typeset a:hover{color:#536dfe}.md-typeset code,.md-typeset pre{background-color:hsla(0,0%,93%,.5);color:#37474f;font-size:85%}.md-typeset code{margin:0 .29412em;padding:.07353em 0;border-radius:.2rem;box-shadow:.29412em 0 0 hsla(0,0%,93%,.5),-.29412em 0 0 hsla(0,0%,93%,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{margin:0;background-color:transparent;box-shadow:none}.md-typeset a>code{margin:inherit;padding:inherit;border-radius:none;background-color:inherit;color:inherit;box-shadow:none}.md-typeset pre{margin:1em 0;padding:1rem 1.2rem;border-radius:.2rem;line-height:1.4;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset pre::-webkit-scrollbar{width:.4rem;height:.4rem}.md-typeset pre::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset pre>code{margin:0;background-color:transparent;font-size:inherit;box-shadow:none;-webkit-box-decoration-break:none;box-decoration-break:none}.md-typeset kbd{padding:0 .29412em;border:.1rem solid #c9c9c9;border-radius:.2rem;border-bottom-color:#bcbcbc;background-color:#fcfcfc;color:#555;font-size:85%;box-shadow:0 .1rem 0 #b0b0b0;word-break:break-word}.md-typeset mark{margin:0 .25em;padding:.0625em 0;border-radius:.2rem;background-color:rgba(255,235,59,.5);box-shadow:.25em 0 0 rgba(255,235,59,.5),-.25em 0 0 rgba(255,235,59,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset abbr{border-bottom:.1rem dotted rgba(0,0,0,.54);cursor:help}.md-typeset small{opacity:.75}.md-typeset sub,.md-typeset sup{margin-left:.07812em}.md-typeset blockquote{padding-left:1.2rem;border-left:.4rem solid rgba(0,0,0,.26);color:rgba(0,0,0,.54)}.md-typeset ul{list-style-type:disc}.md-typeset ol,.md-typeset ul{margin-left:.625em;padding:0}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em;margin-left:1.25em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin:.5em 0 .5em .625em}.md-typeset iframe,.md-typeset img,.md-typeset svg{max-width:100%}.md-typeset table:not([class]){box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);margin:2em 0;border-radius:.2rem;font-size:1.28rem;overflow:hidden}.no-js .md-typeset table:not([class]){display:inline-block;max-width:100%;margin:.8em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}.md-typeset table:not([class]) th{min-width:10rem;padding:1.2rem 1.6rem;background-color:rgba(0,0,0,.54);color:#fff;vertical-align:top}.md-typeset table:not([class]) td{padding:1.2rem 1.6rem;border-top:.1rem solid rgba(0,0,0,.07);vertical-align:top}.md-typeset table:not([class]) tr:first-child td{border-top:0}.md-typeset table:not([class]) a{word-break:normal}.md-typeset .md-typeset__table{margin:1.6em -1.6rem;overflow-x:auto;-webkit-overflow-scrolling:touch}.md-typeset .md-typeset__table table{display:inline-block;margin:0 1.6rem}html{font-size:62.5%}body,html{height:100%}body{position:relative}hr{display:block;height:.1rem;padding:0;border:0}.md-svg{display:none}.md-grid{max-width:122rem;margin-right:auto;margin-left:auto}.md-container,.md-main{overflow:auto}.md-container{display:table;width:100%;height:100%;table-layout:fixed}.md-main{display:table-row;height:100%}.md-main__inner{margin-top:5.6rem;padding-top:3rem;overflow:auto}.csscalc .md-main__inner{min-height:calc(100% - 2.6rem)}@-moz-document url-prefix(){.csscalc .md-main__inner{min-height:calc(100% - 5.6rem)}}.md-toggle{display:none}.md-overlay{position:fixed;top:0;width:0;height:0;-webkit-transition:width 0s .25s,height 0s .25s,opacity .25s;transition:width 0s .25s,height 0s .25s,opacity .25s;background-color:rgba(0,0,0,.54);opacity:0;z-index:2}.md-flex{display:table}.md-flex__cell{display:table-cell;position:relative;vertical-align:top}.md-flex__cell--shrink{width:0}.md-flex__cell--stretch{display:table;width:100%;table-layout:fixed}.md-flex__ellipsis{display:table-cell;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}@page{margin:25mm}.md-content__inner{margin:2.4rem 1.6rem}.md-content__edit{float:right}.md-header{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:fixed;top:0;right:0;left:0;height:5.6rem;-webkit-transition:background-color .25s;transition:background-color .25s;background-color:#3f51b5;color:#fff;z-index:1}.md-header-nav{padding:.4rem}.md-header-nav__button{position:relative;-webkit-transition:opacity .25s;transition:opacity .25s;z-index:1}.md-header-nav__button:hover{opacity:.7}.md-header-nav__button.md-logo img{display:block}.no-js .md-header-nav__button.md-icon--search{display:none}.md-header-nav__title{padding:0 2rem;font-size:1.8rem;line-height:4.8rem}.md-header-nav__parent{color:hsla(0,0%,100%,.7)}.md-header-nav__parent:after{display:inline;color:hsla(0,0%,100%,.3);content:"/"}.md-header-nav__source{display:none}.md-footer-nav{background-color:rgba(0,0,0,.87);color:#fff}.md-footer-nav__inner{padding:.4rem;overflow:auto}.md-footer-nav__link{padding-top:2.8rem;padding-bottom:.8rem;-webkit-transition:opacity .25s;transition:opacity .25s}.md-footer-nav__link:hover{opacity:.7}.md-footer-nav__link--prev{width:25%;float:left}.md-footer-nav__link--next{width:75%;float:right;text-align:right}.md-footer-nav__button{-webkit-transition:background .25s;transition:background .25s}.md-footer-nav__title{position:relative;padding:0 2rem;font-size:1.8rem;line-height:4.8rem}.md-footer-nav__direction{position:absolute;right:0;left:0;margin-top:-2rem;padding:0 2rem;color:hsla(0,0%,100%,.7);font-size:1.5rem}.md-footer-meta{background:rgba(0,0,0,.895)}.md-footer-meta__inner{padding:.4rem;overflow:auto}html .md-footer-meta.md-typeset a{color:hsla(0,0%,100%,.7)}.md-footer-copyright{margin:0 1.2rem;padding:.8rem 0;color:hsla(0,0%,100%,.3);font-size:1.28rem}.md-footer-copyright__highlight{color:hsla(0,0%,100%,.7)}.md-footer-social{margin:0 .8rem;padding:.4rem 0 1.2rem}.md-footer-social__link{display:inline-block;width:3.2rem;height:3.2rem;border:.1rem solid hsla(0,0%,100%,.12);border-radius:100%;color:hsla(0,0%,100%,.7);font-size:1.6rem;text-align:center}.md-footer-social__link:before{line-height:1.9}.md-nav{font-size:1.4rem;line-height:1.3}.md-nav--secondary{-webkit-transition:border-left .25s;transition:border-left .25s;border-left:.4rem solid #3f51b5}.md-nav__title{display:block;padding:1.2rem 1.2rem 0;font-weight:700;text-overflow:ellipsis;overflow:hidden}.md-nav__title:before{display:none;content:"arrow_back"}.md-nav__title .md-nav__button{display:none}.md-nav__list{margin:0;padding:0;list-style:none}.md-nav__item{padding:.625em 1.2rem 0}.md-nav__item:last-child{padding-bottom:1.2rem}.md-nav__item .md-nav__item{padding-right:0}.md-nav__item .md-nav__item:last-child{padding-bottom:0}.md-nav__button img{width:100%;height:auto}.md-nav__link{display:block;-webkit-transition:color .125s;transition:color .125s;text-overflow:ellipsis;cursor:pointer;overflow:hidden}.md-nav__item--nested>.md-nav__link:after{content:"keyboard_arrow_down"}html .md-nav__link[for=toc],html .md-nav__link[for=toc]+.md-nav__link:after,html .md-nav__link[for=toc]~.md-nav{display:none}.md-nav__link[data-md-state=blur]{color:rgba(0,0,0,.54)}.md-nav__link--active,.md-nav__link:active{color:#3f51b5}.md-nav__link:focus,.md-nav__link:hover{color:#536dfe}.md-nav__source,.no-js .md-search{display:none}.md-search__overlay{display:none;pointer-events:none}.md-search__inner{width:100%}.md-search__form{position:relative}.md-search__input{position:relative;padding:0 1.6rem 0 7.2rem;text-overflow:ellipsis;z-index:1}.md-search__input+.md-search__icon,.md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__input::-ms-clear{display:none}.md-search__icon{position:absolute;top:.8rem;left:1.2rem;-webkit-transition:color .25s;transition:color .25s;font-size:2.4rem;cursor:pointer;z-index:1}.md-search__icon:before{content:"search"}.md-search__output{position:absolute;width:100%;border-radius:0 0 .2rem .2rem;overflow:hidden}.md-search__scrollwrap{height:100%;background:-webkit-linear-gradient(top,#fff 10%,hsla(0,0%,100%,0)),-webkit-linear-gradient(top,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background:linear-gradient(180deg,#fff 10%,hsla(0,0%,100%,0)),linear-gradient(180deg,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background-attachment:local,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100% 2rem,100% 1rem;box-shadow:inset 0 .1rem 0 rgba(0,0,0,.07);overflow-y:auto;-webkit-overflow-scrolling:touch}.md-search-result__meta{padding:0 1.6rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-size:1.28rem;line-height:4rem}.md-search-result__list{margin:0;padding:0;border-top:.1rem solid rgba(0,0,0,.07);list-style:none}.md-search-result__item{box-shadow:0 -.1rem 0 rgba(0,0,0,.07)}.md-search-result__link{display:block;padding:0 1.6rem;-webkit-transition:background .25s;transition:background .25s;overflow:auto}.md-search-result__link:hover{background-color:rgba(83,109,254,.1)}.md-search-result__article{margin:1em 0}.md-search-result__title{margin-top:.5em;margin-bottom:0;color:rgba(0,0,0,.87);font-size:1.6rem;font-weight:400;line-height:1.4}.md-search-result__teaser{margin:.5em 0;color:rgba(0,0,0,.54);font-size:1.28rem;line-height:1.4;word-break:break-word}.md-sidebar{position:relative;width:24.2rem;padding:2.4rem 0;float:left;overflow:visible}.md-sidebar[data-md-state=lock]{position:fixed;top:5.6rem;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-sidebar--secondary{display:none}.md-sidebar__scrollwrap{max-height:100%;margin:0 .4rem;overflow-y:auto}.md-sidebar__scrollwrap::-webkit-scrollbar{width:.4rem;height:.4rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}@-webkit-keyframes a{0%{height:0}to{height:1.3rem}}@keyframes a{0%{height:0}to{height:1.3rem}}@-webkit-keyframes b{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes b{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}.md-source{display:block;-webkit-transition:opacity .25s;transition:opacity .25s;font-size:1.3rem;line-height:1.2;white-space:nowrap}.md-source:hover{opacity:.7}.md-source:after,.md-source__icon{display:inline-block;height:4.8rem;content:"";vertical-align:middle}.md-source__icon{width:4.8rem}.md-source__icon svg{margin-top:1.2rem;margin-left:1.2rem}.md-source__icon+.md-source__repository{margin-left:-4.4rem;padding-left:4rem}.md-source__repository{display:inline-block;max-width:100%;margin-left:1.2rem;font-weight:700;text-overflow:ellipsis;overflow:hidden;vertical-align:middle}.md-source__facts{margin:0;padding:0;font-size:1.1rem;font-weight:700;list-style-type:none;opacity:.75;overflow:hidden}[data-md-state=done] .md-source__facts{-webkit-animation:a .25s ease-in;animation:a .25s ease-in}.md-source__fact{float:left}[data-md-state=done] .md-source__fact{-webkit-animation:b .4s ease-out;animation:b .4s ease-out}.md-source__fact:before{margin:0 .2rem;content:"\00B7"}.md-source__fact:first-child:before{display:none}.admonition{position:relative;margin:1.5625em 0;padding:.8rem 1.2rem;border-left:3.2rem solid rgba(68,138,255,.4);border-radius:.2rem;background-color:rgba(68,138,255,.15);font-size:1.28rem}.admonition:before{position:absolute;left:-2.6rem;color:#fff;font-size:2rem;content:"edit";vertical-align:-.25em}.admonition :first-child{margin-top:0}.admonition :last-child{margin-bottom:0}.admonition.summary,.admonition.tldr{border-color:rgba(0,176,255,.4);background-color:rgba(0,176,255,.15)}.admonition.summary:before,.admonition.tldr:before{content:"subject"}.admonition.hint,.admonition.important,.admonition.tip{border-color:rgba(0,191,165,.4);background-color:rgba(0,191,165,.15)}.admonition.hint:before,.admonition.important:before,.admonition.tip:before{content:"whatshot"}.admonition.check,.admonition.done,.admonition.success{border-color:rgba(0,230,118,.4);background-color:rgba(0,230,118,.15)}.admonition.check:before,.admonition.done:before,.admonition.success:before{content:"done"}.admonition.attention,.admonition.caution,.admonition.warning{border-color:rgba(255,145,0,.4);background-color:rgba(255,145,0,.15)}.admonition.attention:before,.admonition.caution:before,.admonition.warning:before{content:"warning"}.admonition.fail,.admonition.failure,.admonition.missing{border-color:rgba(255,82,82,.4);background-color:rgba(255,82,82,.15)}.admonition.fail:before,.admonition.failure:before,.admonition.missing:before{content:"clear"}.admonition.danger,.admonition.error{border-color:rgba(255,23,68,.4);background-color:rgba(255,23,68,.15)}.admonition.danger:before,.admonition.error:before{content:"flash_on"}.admonition.bug{border-color:rgba(245,0,87,.4);background-color:rgba(245,0,87,.15)}.admonition.bug:before{content:"bug_report"}.admonition-title{font-weight:700}html .admonition-title{margin-bottom:0}html .admonition-title+*{margin-top:0}.codehilite .o,.codehilite .ow{color:inherit}.codehilite .ge{color:#000}.codehilite .gr{color:#a00}.codehilite .gh{color:#999}.codehilite .go{color:#888}.codehilite .gp{color:#555}.codehilite .gs{color:inherit}.codehilite .gu{color:#aaa}.codehilite .gt{color:#a00}.codehilite .gd{background-color:#fdd}.codehilite .gi{background-color:#dfd}.codehilite .k{color:#3b78e7}.codehilite .kc{color:#a71d5d}.codehilite .kd,.codehilite .kn{color:#3b78e7}.codehilite .kp{color:#a71d5d}.codehilite .kr,.codehilite .kt{color:#3e61a2}.codehilite .c,.codehilite .cm{color:#999}.codehilite .cp{color:#666}.codehilite .c1,.codehilite .ch,.codehilite .cs{color:#999}.codehilite .na,.codehilite .nb{color:#c2185b}.codehilite .bp{color:#3e61a2}.codehilite .nc{color:#c2185b}.codehilite .no{color:#3e61a2}.codehilite .nd,.codehilite .ni{color:#666}.codehilite .ne,.codehilite .nf{color:#c2185b}.codehilite .nl{color:#3b5179}.codehilite .nn{color:#ec407a}.codehilite .nt{color:#3b78e7}.codehilite .nv,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#3e61a2}.codehilite .nx{color:#ec407a}.codehilite .il,.codehilite .m,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#e74c3c}.codehilite .s,.codehilite .sb,.codehilite .sc{color:#0d904f}.codehilite .sd{color:#999}.codehilite .s2{color:#0d904f}.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sx{color:#183691}.codehilite .sr{color:#009926}.codehilite .s1,.codehilite .ss{color:#0d904f}.codehilite .err{color:#a61717}.codehilite .w{color:transparent}.codehilite .hll{display:block;margin:0 -1.2rem;padding:0 1.2rem;background-color:rgba(255,235,59,.5)}.md-typeset .codehilite{margin:1em 0;padding:1rem 1.2rem .8rem;border-radius:.2rem;background-color:hsla(0,0%,93%,.5);color:#37474f;line-height:1.4;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .codehilite::-webkit-scrollbar{width:.4rem;height:.4rem}.md-typeset .codehilite::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset .codehilite::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset .codehilite pre{display:inline-block;min-width:100%;margin:0;padding:0;background-color:transparent;overflow:visible;vertical-align:top}.md-typeset .codehilitetable{display:block;margin:1em 0;border-radius:.2em;font-size:1.6rem;overflow:hidden}.md-typeset .codehilitetable tbody,.md-typeset .codehilitetable td{display:block;padding:0}.md-typeset .codehilitetable tr{display:-webkit-box;display:-ms-flexbox;display:flex}.md-typeset .codehilitetable .codehilite,.md-typeset .codehilitetable .linenodiv{margin:0;border-radius:0}.md-typeset .codehilitetable .linenodiv{padding:1rem 1.2rem .8rem}.md-typeset .codehilitetable .linenodiv,.md-typeset .codehilitetable .linenodiv>pre{height:100%}.md-typeset .codehilitetable .linenos{background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.26);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-typeset .codehilitetable .linenos pre{margin:0;padding:0;background-color:transparent;color:inherit;text-align:right}.md-typeset .codehilitetable .code{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.md-typeset>.codehilitetable{box-shadow:none}.md-typeset .footnote{color:rgba(0,0,0,.54);font-size:1.28rem}.md-typeset .footnote ol{margin-left:0}.md-typeset .footnote li{-webkit-transition:color .25s;transition:color .25s}.md-typeset .footnote li:before{display:block;height:0}.md-typeset .footnote li:target{color:rgba(0,0,0,.87)}.md-typeset .footnote li:target:before{margin-top:-9rem;padding-top:9rem;pointer-events:none}.md-typeset .footnote li :first-child{margin-top:0}.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}.md-typeset .footnote li:hover .footnote-backref:hover,.md-typeset .footnote li:target .footnote-backref{color:#536dfe}.md-typeset .footnote-backref{display:inline-block;-webkit-transform:translateX(.5rem);transform:translateX(.5rem);-webkit-transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s,-webkit-transform .25s .125s;color:rgba(0,0,0,.26);font-size:0;opacity:0;vertical-align:text-bottom}.md-typeset .footnote-backref:before{font-size:1.6rem;content:"keyboard_return"}.md-typeset .headerlink{display:inline-block;margin-left:1rem;-webkit-transform:translateY(.5rem);transform:translateY(.5rem);-webkit-transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s,-webkit-transform .25s .25s;opacity:0}html body .md-typeset .headerlink{color:rgba(0,0,0,.26)}.md-typeset [id]:before{display:inline-block;content:""}.md-typeset [id]:target:before{margin-top:-9.8rem;padding-top:9.8rem}.md-typeset [id] .headerlink:focus,.md-typeset [id]:hover .headerlink,.md-typeset [id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset [id] .headerlink:focus,.md-typeset [id]:hover .headerlink:hover,.md-typeset [id]:target .headerlink{color:#536dfe}.md-typeset h1[id]{padding-top:.8rem}.md-typeset h1[id].headerlink{display:none}.md-typeset h2[id]:before{display:block;margin-top:-.4rem;padding-top:.4rem}.md-typeset h2[id]:target:before{margin-top:-8.4rem;padding-top:8.4rem}.md-typeset h3[id]:before{display:block;margin-top:-.7rem;padding-top:.7rem}.md-typeset h3[id]:target:before{margin-top:-8.7rem;padding-top:8.7rem}.md-typeset h4[id]:before{display:block;margin-top:-.8rem;padding-top:.8rem}.md-typeset h4[id]:target:before{margin-top:-8.8rem;padding-top:8.8rem}.md-typeset h5[id]:before{display:block;margin-top:-1.1rem;padding-top:1.1rem}.md-typeset h5[id]:target:before{margin-top:-9.1rem;padding-top:9.1rem}.md-typeset h6[id]:before{display:block;margin-top:-1.1rem;padding-top:1.1rem}.md-typeset h6[id]:target:before{margin-top:-9.1rem;padding-top:9.1rem}.md-typeset .MJXc-display{margin:.75em 0;padding:.25em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .MathJax_CHTML{outline:0}.md-typeset .comment.critic,.md-typeset del.critic,.md-typeset ins.critic{margin:0 .25em;padding:.0625em 0;border-radius:.2rem;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:#fdd;box-shadow:.25em 0 0 #fdd,-.25em 0 0 #fdd}.md-typeset ins.critic{background-color:#dfd;box-shadow:.25em 0 0 #dfd,-.25em 0 0 #dfd}.md-typeset .critic.comment{background-color:hsla(0,0%,93%,.5);color:#37474f;box-shadow:.25em 0 0 hsla(0,0%,93%,.5),-.25em 0 0 hsla(0,0%,93%,.5)}.md-typeset .critic.comment:before{padding-right:.125em;color:rgba(0,0,0,.26);content:"chat";vertical-align:-.125em}.md-typeset .critic.block{display:block;margin:1em 0;padding-right:1.6rem;padding-left:1.6rem;box-shadow:none}.md-typeset .critic.block :first-child{margin-top:.5em}.md-typeset .critic.block :last-child{margin-bottom:.5em}.md-typeset .emojione{width:2rem;vertical-align:text-top}.md-typeset code.codehilite{margin:0 .29412em;padding:.07353em 0}.md-typeset .task-list-item{position:relative;list-style-type:none}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em;left:-2em}.md-typeset .task-list-control .task-list-indicator:before{position:absolute;top:.05em;left:-1.25em;color:rgba(0,0,0,.26);font-size:1.5em;content:"check_box_outline_blank";vertical-align:-.25em}.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator:before{content:"check_box"}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}@media print{.md-typeset a:after{color:rgba(0,0,0,.54);content:" [" attr(href) "]"}.md-typeset code{box-shadow:none;-webkit-box-decoration-break:initial;box-decoration-break:slice}.md-content__edit,.md-footer,.md-header,.md-sidebar,.md-typeset .headerlink{display:none}}@media only screen and (max-width:44.9375em){.md-typeset pre{margin:1em -1.6rem;padding:1rem 1.6rem;border-radius:0}.md-footer-nav__link--prev .md-footer-nav__title{display:none}.codehilite .hll{margin:0 -1.6rem;padding:0 1.6rem}.md-typeset>.codehilite{padding:1rem 1.6rem .8rem}.md-typeset>.codehilite,.md-typeset>.codehilitetable{margin:1em -1.6rem;border-radius:0}.md-typeset>.codehilitetable .codehilite,.md-typeset>.codehilitetable .linenodiv{padding:1rem 1.6rem}.md-typeset>p>.MJXc-display{margin:.75em -1.6rem;padding:.25em 1.6rem}}@media only screen and (min-width:100em){html{font-size:68.75%}}@media only screen and (min-width:125em){html{font-size:75%}}@media only screen and (max-width:59.9375em){body[data-md-state=lock]{overflow:hidden}.ios body[data-md-state=lock] .md-container{display:none}.md-content__edit{margin-right:-.8rem}.md-nav--secondary{border-left:0}html .md-nav__link[for=toc]{display:block;padding-right:4.8rem}html .md-nav__link[for=toc]:after{color:inherit;content:"toc"}html .md-nav__link[for=toc]+.md-nav__link{display:none}html .md-nav__link[for=toc]~.md-nav{display:-webkit-box;display:-ms-flexbox;display:flex}.md-nav__source{display:block;padding:.4rem;background-color:rgba(50,64,144,.9675);color:#fff}.md-search__overlay{display:block;position:absolute;top:.4rem;left:.4rem;width:4rem;height:4rem;-webkit-transform-origin:center;transform-origin:center;-webkit-transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:transform .3s .1s,opacity .2s .2s;transition:transform .3s .1s,opacity .2s .2s,-webkit-transform .3s .1s;border-radius:2rem;background-color:#fff;opacity:0;overflow:hidden;z-index:1}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transition:opacity .1s,-webkit-transform .4s;transition:opacity .1s,-webkit-transform .4s;transition:transform .4s,opacity .1s;transition:transform .4s,opacity .1s,-webkit-transform .4s;opacity:1}.md-search__inner{position:fixed;top:0;left:100%;height:100%;-webkit-transform:translateX(5%);transform:translateX(5%);-webkit-transition:left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;transition:left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;opacity:0;z-index:2}[data-md-toggle=search]:checked~.md-header .md-search__inner{left:0;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;transition:left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;opacity:1}.md-search__input{width:100%;height:5.6rem;font-size:1.8rem}.md-search__icon{top:1.6rem;left:1.6rem}.md-search__icon:before{content:"arrow_back"}.md-search__output{top:5.6rem;bottom:0}}@media only screen and (max-width:76.1875em){[data-md-toggle=drawer]:checked~.md-overlay{width:100%;height:100%;-webkit-transition:width 0s,height 0s,opacity .25s;transition:width 0s,height 0s,opacity .25s;opacity:1}.md-header-nav__button.md-icon--home,.md-header-nav__button.md-logo{display:none}.md-nav--primary,.md-nav--primary .md-nav{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;top:0;right:0;left:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;z-index:1}.md-nav--primary{background-color:#fff}.md-nav--primary .md-nav__toggle~.md-nav{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.4);background-color:#fff}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:1.6rem;line-height:1.5}html .md-nav--primary .md-nav__title{position:relative;height:11.2rem;padding:6rem 1.6rem .4rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-weight:400;line-height:4.8rem;white-space:nowrap;cursor:pointer}html .md-nav--primary .md-nav__title:before{display:block;position:absolute;top:.4rem;left:.4rem;width:4rem;height:4rem;color:rgba(0,0,0,.54)}html .md-nav--primary .md-nav__title~.md-nav__list{background:-webkit-linear-gradient(top,#fff 10%,hsla(0,0%,100%,0)),-webkit-linear-gradient(top,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background:linear-gradient(180deg,#fff 10%,hsla(0,0%,100%,0)),linear-gradient(180deg,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background-attachment:local,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100% 2rem,100% 1rem;box-shadow:inset 0 .1rem 0 rgba(0,0,0,.07)}html .md-nav--primary .md-nav__title~.md-nav__list>.md-nav__item:first-child{border-top:0}html .md-nav--primary .md-nav__title--site{position:relative;background-color:#3f51b5;color:#fff}html .md-nav--primary .md-nav__title--site .md-nav__button{display:block;position:absolute;top:.4rem;left:.4rem;width:6.4rem;height:6.4rem;font-size:4.8rem}html .md-nav--primary .md-nav__title--site:before{display:none}.md-nav--primary .md-nav__list{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto}.md-nav--primary .md-nav__item{padding:0;border-top:.1rem solid rgba(0,0,0,.07)}.md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:4.8rem}.md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"keyboard_arrow_right"}.md-nav--primary .md-nav__link{position:relative;padding:1.6rem}.md-nav--primary .md-nav__link:after{position:absolute;top:50%;right:1.2rem;margin-top:-1.2rem;color:rgba(0,0,0,.54);font-size:2.4rem}.md-nav--primary .md-nav__link:hover:after{color:inherit}.md-nav--primary .md-nav--secondary .md-nav{position:static}.md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:2.8rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:4rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:5.2rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:6.4rem}.md-nav__toggle~.md-nav{display:none}.csstransforms3d .md-nav__toggle~.md-nav{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s;transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);opacity:0}.csstransforms3d .md-nav__toggle~.md-nav,.md-nav__toggle:checked~.md-nav{display:-webkit-box;display:-ms-flexbox;display:flex}.csstransforms3d .md-nav__toggle:checked~.md-nav{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1}.md-sidebar--primary{position:fixed;top:0;left:-24.2rem;width:24.2rem;height:100%;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);background-color:#fff;z-index:2}.no-csstransforms3d .md-sidebar--primary{display:none}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4);-webkit-transform:translateX(24.2rem);transform:translateX(24.2rem)}.no-csstransforms3d [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{display:block}.md-sidebar--primary .md-sidebar__scrollwrap{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;margin:0}}@media only screen and (min-width:60em){.md-content{margin-right:24.2rem}.md-header-nav__button.md-icon--search{display:none}.md-header-nav__source{display:block;width:23rem;max-width:23rem;padding-right:1.2rem}.md-search{margin-right:2.8rem;padding:.4rem}.md-search__inner{display:table;position:relative;clear:both}.md-search__form{width:23rem;float:right;-webkit-transition:width .25s cubic-bezier(.1,.7,.1,1);transition:width .25s cubic-bezier(.1,.7,.1,1);border-radius:.2rem}.md-search__input{width:100%;height:4rem;padding-left:4.8rem;-webkit-transition:background-color .25s,color .25s;transition:background-color .25s,color .25s;border-radius:.2rem;background-color:rgba(0,0,0,.26);color:#fff;font-size:1.6rem}.md-search__input+.md-search__icon,.md-search__input::-webkit-input-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input::-moz-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input:-ms-input-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input::placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input:hover{background-color:hsla(0,0%,100%,.12)}[data-md-toggle=search]:checked~.md-header .md-search__input{border-radius:.2rem .2rem 0 0;background-color:#fff;color:rgba(0,0,0,.87);text-overflow:none}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__output{top:4rem;-webkit-transition:opacity .4s;transition:opacity .4s;opacity:0}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4);opacity:1}.md-search__scrollwrap{max-height:0}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap::-webkit-scrollbar{width:.4rem;height:.4rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-search-result__link,.md-search-result__meta{padding-left:4.8rem}.md-sidebar--secondary{display:block;float:right}.md-sidebar--secondary[data-md-state=lock]{margin-left:100%;-webkit-transform:translate(-100%);transform:translate(-100%)}}@media only screen and (min-width:76.25em){.md-content{margin-left:24.2rem;overflow:auto}.md-content__inner{margin:2.4rem}.md-content__inner :last-child{margin-bottom:0}.md-header-nav__button.md-icon--menu{display:none}.md-nav[data-md-state=animate]{-webkit-transition:max-height .25s cubic-bezier(.86,0,.07,1);transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav__toggle~.md-nav{max-height:0;overflow:hidden}.md-nav[data-md-state=expand],.md-nav__toggle:checked~.md-nav{max-height:100%}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--nested>.md-nav__link:after{display:inline-block;-webkit-transform-origin:.45em .45em;transform-origin:.45em .45em;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;vertical-align:-.125em}.js .md-nav__item--nested>.md-nav__link:after{-webkit-transition:-webkit-transform .4s;transition:-webkit-transform .4s;transition:transform .4s;transition:transform .4s,-webkit-transform .4s}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link:after{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__form{width:68.8rem}.md-sidebar__inner{border-right:.1rem solid rgba(0,0,0,.07)}}@media only screen and (max-width:29.9375em){.md-header-nav__parent{display:none}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(45);transform:scale(45)}}@media only screen and (min-width:45em){.md-footer-nav__link{width:50%}.md-footer-copyright{max-width:75%;float:left}.md-footer-social{padding:1.2rem 0;float:right}}@media only screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(60);transform:scale(60)}}@media only screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(75);transform:scale(75)}}@media only screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__form{width:46.8rem}}@media only screen and (min-width:60em) and (min-width:76.25em){.md-sidebar--secondary[data-md-state=lock]{margin-left:122rem}} \ No newline at end of file diff --git a/material/base.html b/material/base.html index 665256718..32d918607 100644 --- a/material/base.html +++ b/material/base.html @@ -31,7 +31,13 @@ {% endif %} {% endblock %} {% block libs %} - + + {% endblock %} + {% block styles %} + + {% if config.extra.palette %} + + {% endif %} {% endblock %} {% block fonts %} {% if config.extra.font != "none" %} @@ -44,15 +50,9 @@ {% endif %} {% endblock %} - {% block styles %} - - {% if config.extra.palette %} - - {% endif %} - {% for path in extra_css %} - - {% endfor %} - {% endblock %} + {% for path in extra_css %} + + {% endfor %} {% block extrahead %}{% endblock %} {% set palette = config.extra.get("palette", {}) %} diff --git a/src/assets/stylesheets/base/_typeset.scss b/src/assets/stylesheets/base/_typeset.scss index 2eced7319..c4ebedee0 100644 --- a/src/assets/stylesheets/base/_typeset.scss +++ b/src/assets/stylesheets/base/_typeset.scss @@ -34,14 +34,9 @@ body { body, input { color: $md-color-black; - // font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; font-feature-settings: "kern", "onum", "liga"; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 400; - - // Use system fonts, if browser doesn't support webfonts - .no-fontface & { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - } } // Proportionally spaced fonts @@ -49,14 +44,9 @@ pre, code, kbd { color: $md-color-black; - // font-family: "Roboto Mono", "Courier New", Courier, monospace; font-feature-settings: "kern", "onum", "liga"; + font-family: "Courier New", Courier, monospace; font-weight: 400; - - // Use system fonts, if browser doesn't support webfonts - .no-fontface & { - font-family: "Courier New", Courier, monospace; - } } // ---------------------------------------------------------------------------- diff --git a/src/base.html b/src/base.html index 374a60905..50d4dae31 100644 --- a/src/base.html +++ b/src/base.html @@ -76,6 +76,20 @@ {% endblock %} + + {% block styles %} + + + + + + {% if config.extra.palette %} + + {% endif %} + {% endblock %} + {% block fonts %} {% if config.extra.font != "none" %} @@ -102,24 +116,10 @@ href="https://fonts.googleapis.com/icon?family=Material+Icons" /> {% endblock %} - - {% block styles %} - - - - - - {% if config.extra.palette %} - - {% endif %} - - - {% for path in extra_css %} - - {% endfor %} - {% endblock %} + + {% for path in extra_css %} + + {% endfor %} {% block extrahead %}{% endblock %} diff --git a/tests/visual/baseline/ci/admonition/#bug/@screen/chrome.png b/tests/visual/baseline/ci/admonition/#bug/@screen/chrome.png index 4ccf0e96606972af201d4c347f163422c1b62322..806fe08a8057f2b36044f59dbe24f05c50cfef71 100644 GIT binary patch literal 5839 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 diff --git a/tests/visual/baseline/ci/admonition/#bug/@screen/edge.png b/tests/visual/baseline/ci/admonition/#bug/@screen/edge.png index aef7a5aba295419b28c8cf84da906f15ce37ff4b..3e11535a862fe1fb5dff044783bf1db88e11a46e 100644 GIT binary patch literal 7433 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 literal 11652 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 diff --git a/tests/visual/baseline/ci/admonition/#bug/@screen/firefox.png b/tests/visual/baseline/ci/admonition/#bug/@screen/firefox.png index 13a8d31334323d54b64a8568fb9bfeeeb442deec..d88b7b72467951e28f1e540f4e8d469197f8e3e0 100644 GIT binary patch literal 5097 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 O4xk3s1QkB9eD_~e`TN}f diff --git a/tests/visual/baseline/ci/admonition/#bug/@screen/ie11.png b/tests/visual/baseline/ci/admonition/#bug/@screen/ie11.png index 739f8aaecd1365d6773625524f4dc81ac09077e1..46f3d93412c43063103d13757ad81e6516b2ece2 100644 GIT binary patch literal 7347 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