diff --git a/patches/0005-no-ssr.diff b/patches/0005-no-ssr.diff
new file mode 100644
index 0000000..46d2baa
--- /dev/null
+++ b/patches/0005-no-ssr.diff
@@ -0,0 +1,11 @@
+--- orig/utils/ssr.jsx 2021-10-11 21:17:02.041396123 -0300
++++ sources-gen/utils/ssr.jsx 2021-10-11 21:22:17.825984088 -0300
+@@ -1,7 +1,3 @@
+-function isServer() {
++export function isServer() {
+ return !(typeof window !== 'undefined' && window.document);
+ }
+-// CommonJS export to be able to use it on server and client
+-module.exports = {
+- isServer,
+-};
diff --git a/source-from-sourcemaps.js b/source-from-sourcemaps.js
index aa401fe..44bdec3 100644
--- a/source-from-sourcemaps.js
+++ b/source-from-sourcemaps.js
@@ -1,47 +1,61 @@
#!/usr/bin/env node
+// Gracias a:
+// - Código original: https://github.com/akx/source-from-sourcemaps
+// - Aguante: https://gist.github.com/banyudu/b17a9cb3f05296b76a9f3051f66c3dcd
+// - Algoritmo: https://github.com/rarecoil/unwebpack-sourcemap
-const fs = require("fs");
-const util = require("util");
-const writeFileP = util.promisify(fs.writeFile);
-const readFileP = util.promisify(fs.readFile);
-const mkdirp = require("mkdirp");
-const path = require("path");
-const { SourceMapConsumer } = require("source-map");
-const minimist = require("minimist");
+const fs = require("fs")
+const util = require("util")
+const writeFileP = util.promisify(fs.writeFile)
+const readFileP = util.promisify(fs.readFile)
+const mkdirP = util.promisify(fs.mkdir)
+const path = require("path")
+const { SourceMapConsumer } = require("source-map")
-async function processSource(consumer, src) {
- const fsSrc =
- "sources-gen/" +
- src
- .replace(/webpack:\/\/\//, "")
- .replace(/~\//, "node_modules/")
- .replace(/\?.+$/, "");
- const source = consumer.sourceContentFor(src, true);
- if (!source) {
- console.warn("Unable to source:", src);
- return;
- }
- await mkdirp(path.dirname(fsSrc));
- await writeFileP(fsSrc, source, "UTF-8");
- console.log(`Wrote ${fsSrc}`);
+const outputDir = 'sources-gen'
+
+function sanitizePath (path) {
+ let newPath = path
+ .replace(/^webpack:\/\/\/?/, "")
+ .replace(/~\//, "node_modules/")
+ .replace(/\?.+$/, "")
+ .replace(/\.\.\//g, 'parent_dir/')
+ .replace(/\.\//g, '')
+ return newPath
}
async function processFile(pth) {
- const data = await readFileP(pth, "UTF-8");
- return await SourceMapConsumer.with(data, null, async (consumer) => {
- const processors = consumer.sources.map((src) =>
- processSource(consumer, src)
- );
- return await Promise.all(processors);
- });
+ const data = await readFileP(pth, "UTF-8");
+ const consumer = await new SourceMapConsumer(data);
+
+ const processors = consumer.sources.map(async (src) => {
+ const fsSrc = path.join(
+ outputDir,
+ sanitizePath(src)
+ )
+ if (fsSrc.includes('node_modules')) {
+ console.warn(`Not saving ${fsSrc} because it is node_modules`)
+ return
+ }
+
+ const source = consumer.sourceContentFor(src, true)
+ if (!source) {
+ console.warn("Unable to source", src)
+ return
+ }
+ await mkdirP(path.dirname(fsSrc), { recursive: true })
+ await writeFileP(fsSrc, source, "UTF-8")
+ console.log(`Wrote ${fsSrc}`)
+ })
+ await Promise.all(processors)
+
+ consumer.destroy();
}
-async function main() {
- const args = minimist(process.argv.slice(2));
- const processors = args._.map((pth) => processFile(pth));
- return await Promise.all(processors);
+function main() {
+ return processFile(process.argv[2])
}
if (!module.parent) {
- main().then(() => process.exit(0));
+ main().then(() => process.exit(0));
}
diff --git a/sources-gen/.pnpm-debug.log b/sources-gen/.pnpm-debug.log
deleted file mode 100644
index d9f22c0..0000000
--- a/sources-gen/.pnpm-debug.log
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "0 debug pnpm:scope": {
- "selected": 1
- },
- "1 error pnpm": {
- "code": "ERR_PNPM_NO_SCRIPT",
- "err": {
- "name": "pnpm",
- "message": "Missing script: vite",
- "code": "ERR_PNPM_NO_SCRIPT",
- "stack": "pnpm: Missing script: vite\n at Object.handler (/home/nulo/.npm/prefix/lib/node_modules/pnpm/dist/pnpm.cjs:129183:15)\n at async /home/nulo/.npm/prefix/lib/node_modules/pnpm/dist/pnpm.cjs:133329:20\n at async run (/home/nulo/.npm/prefix/lib/node_modules/pnpm/dist/pnpm.cjs:133304:34)\n at async runPnpm (/home/nulo/.npm/prefix/lib/node_modules/pnpm/dist/pnpm.cjs:133514:5)\n at async /home/nulo/.npm/prefix/lib/node_modules/pnpm/dist/pnpm.cjs:133506:7"
- }
- }
-}
\ No newline at end of file
diff --git a/sources-gen/assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff b/sources-gen/assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff
deleted file mode 100644
index d5fd351..0000000
--- a/sources-gen/assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff
+++ /dev/null
@@ -1 +0,0 @@
-export default __webpack_public_path__ + "static/media/dwtheantiquab-w5plain.94c5b804.woff";
\ No newline at end of file
diff --git a/sources-gen/assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff2 b/sources-gen/assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff2
deleted file mode 100644
index 1c19eb0..0000000
--- a/sources-gen/assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff2
+++ /dev/null
@@ -1 +0,0 @@
-export default __webpack_public_path__ + "static/media/dwtheantiquab-w5plain.524a5eac.woff2";
\ No newline at end of file
diff --git a/sources-gen/assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff b/sources-gen/assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff
deleted file mode 100644
index 8d556ff..0000000
--- a/sources-gen/assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff
+++ /dev/null
@@ -1 +0,0 @@
-export default __webpack_public_path__ + "static/media/DWTheAntiquaB-W5PlainItalic.0c806fe1.woff";
\ No newline at end of file
diff --git a/sources-gen/assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff2 b/sources-gen/assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff2
deleted file mode 100644
index 2323da8..0000000
--- a/sources-gen/assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff2
+++ /dev/null
@@ -1 +0,0 @@
-export default __webpack_public_path__ + "static/media/DWTheAntiquaB-W5PlainItalic.390937af.woff2";
\ No newline at end of file
diff --git a/sources-gen/assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff b/sources-gen/assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff
deleted file mode 100644
index 8db2343..0000000
--- a/sources-gen/assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff
+++ /dev/null
@@ -1 +0,0 @@
-export default __webpack_public_path__ + "static/media/DWTheAntiquaB-W7Bold.73a35783.woff";
\ No newline at end of file
diff --git a/sources-gen/assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff2 b/sources-gen/assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff2
deleted file mode 100644
index cc4dcad..0000000
--- a/sources-gen/assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff2
+++ /dev/null
@@ -1 +0,0 @@
-export default __webpack_public_path__ + "static/media/DWTheAntiquaB-W7Bold.c739cf0d.woff2";
\ No newline at end of file
diff --git a/sources-gen/assets/icons/DwClaim.jsx b/sources-gen/assets/icons/DwClaim.jsx
deleted file mode 100644
index 1b8b74b..0000000
--- a/sources-gen/assets/icons/DwClaim.jsx
+++ /dev/null
@@ -1,4 +0,0 @@
-import styled from 'styled-components';
-import { ReactComponent as ClaimLogo } from '../svg/dw-claim.svg';
-
-export const StyledClaimLogo = styled(props => )``;
diff --git a/sources-gen/assets/icons/DwLogo.jsx b/sources-gen/assets/icons/DwLogo.jsx
deleted file mode 100644
index 5859017..0000000
--- a/sources-gen/assets/icons/DwLogo.jsx
+++ /dev/null
@@ -1,4 +0,0 @@
-import styled from 'styled-components';
-import { ReactComponent as Logo } from '../svg/dw-logo.svg';
-
-export const StyledLogo = styled(props => )``;
diff --git a/sources-gen/assets/icons/Smiley.jsx b/sources-gen/assets/icons/Smiley.jsx
deleted file mode 100644
index 570c121..0000000
--- a/sources-gen/assets/icons/Smiley.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import styled from 'styled-components';
-import { ReactComponent as SmileyPositive } from '../svg/smiley-positive.svg';
-import { ReactComponent as SmileyNegative } from '../svg/smiley-negative.svg';
-
-export const StyledSmileyPositive = styled(SmileyPositive)``;
-export const StyledSmileyNegative = styled(SmileyNegative)``;
diff --git a/sources-gen/assets/icons/ToggleableArrowIcon.jsx b/sources-gen/assets/icons/ToggleableArrowIcon.jsx
deleted file mode 100644
index 1cddd48..0000000
--- a/sources-gen/assets/icons/ToggleableArrowIcon.jsx
+++ /dev/null
@@ -1,4 +0,0 @@
-import styled from 'styled-components';
-import { ReactComponent as ToggleableArrowIcon } from '../svg/toggleableArrow.svg';
-
-export const StyledToggleableArrowIcon = styled(props => )``;
diff --git a/sources-gen/assets/images/bg-dw-desktop.jpg b/sources-gen/assets/images/bg-dw-desktop.jpg
deleted file mode 100644
index 41fdab9..0000000
--- a/sources-gen/assets/images/bg-dw-desktop.jpg
+++ /dev/null
@@ -1 +0,0 @@
-export default __webpack_public_path__ + "static/media/bg-dw-desktop.4aec073f.jpg";
\ No newline at end of file
diff --git a/sources-gen/assets/images/landing/course_landing-1200x675.jpg b/sources-gen/assets/images/landing/course_landing-1200x675.jpg
deleted file mode 100644
index 5a276d9..0000000
--- a/sources-gen/assets/images/landing/course_landing-1200x675.jpg
+++ /dev/null
@@ -1 +0,0 @@
-export default __webpack_public_path__ + "static/media/course_landing-1200x675.f68dc5b5.jpg";
\ No newline at end of file
diff --git a/sources-gen/assets/images/landing/course_landing-480x270.jpg b/sources-gen/assets/images/landing/course_landing-480x270.jpg
deleted file mode 100644
index f50d40f..0000000
--- a/sources-gen/assets/images/landing/course_landing-480x270.jpg
+++ /dev/null
@@ -1 +0,0 @@
-export default __webpack_public_path__ + "static/media/course_landing-480x270.5a82869e.jpg";
\ No newline at end of file
diff --git a/sources-gen/assets/images/landing/course_landing-768x432.jpg b/sources-gen/assets/images/landing/course_landing-768x432.jpg
deleted file mode 100644
index 94d2520..0000000
--- a/sources-gen/assets/images/landing/course_landing-768x432.jpg
+++ /dev/null
@@ -1 +0,0 @@
-export default __webpack_public_path__ + "static/media/course_landing-768x432.d54bc099.jpg";
\ No newline at end of file
diff --git a/sources-gen/assets/images/landing/course_landing-992x558.jpg b/sources-gen/assets/images/landing/course_landing-992x558.jpg
deleted file mode 100644
index 2a3d331..0000000
--- a/sources-gen/assets/images/landing/course_landing-992x558.jpg
+++ /dev/null
@@ -1 +0,0 @@
-export default __webpack_public_path__ + "static/media/course_landing-992x558.4309e861.jpg";
\ No newline at end of file
diff --git a/sources-gen/assets/svg/dw-claim.svg.js b/sources-gen/assets/svg/dw-claim.svg.js
deleted file mode 100644
index 2147643..0000000
--- a/sources-gen/assets/svg/dw-claim.svg.js
+++ /dev/null
@@ -1,36 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
-
-function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
-
-function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
-
-import * as React from "react";
-
-function SvgDwClaim(_ref, svgRef) {
- var title = _ref.title,
- titleId = _ref.titleId,
- props = _objectWithoutProperties(_ref, ["title", "titleId"]);
-
- return /*#__PURE__*/React.createElement("svg", _extends({
- viewBox: "225 40 330 35",
- xmlns: "http://www.w3.org/2000/svg",
- ref: svgRef,
- "aria-labelledby": titleId
- }, props), title ? /*#__PURE__*/React.createElement("title", {
- id: titleId
- }, title) : null, /*#__PURE__*/React.createElement("g", {
- className: "claimBox"
- }, /*#__PURE__*/React.createElement("g", {
- className: "claimClaim"
- }, /*#__PURE__*/React.createElement("path", {
- d: "M268.479,73.127l0,-1.301c-0.655,-0.522 -1.526,-1.045 -2.443,-1.435l-3.042,-23.86c1.13,-0.305 2.35,-0.913 3.31,-1.478l0,-1.305l-8.012,0l-8.704,23.028l-8.882,-23.028l-8.007,0l0,1.305c0.999,0.523 2.222,1.131 3.348,1.478l-2.999,23.948c-0.743,0.263 -1.614,0.785 -2.354,1.347l0,1.301l8.793,0l0,-1.301c-0.824,-0.522 -1.741,-0.996 -3.046,-1.347l1.568,-21.769l0.043,0l9.4,24.417l2.481,0l9.184,-24.68l0.046,0l2.438,21.901c-1.134,0.305 -2.311,0.916 -3.224,1.478l0,1.301l10.102,0ZM290.589,69.346c-1.305,0.391 -2.35,0.478 -2.35,0.478c0,0 -0.352,-0.867 -0.352,-2.7l0,-9.88c0,-4.354 -2.733,-6.181 -7.478,-6.181c-2.832,0 -5.142,0.519 -7.186,1.304l0,5.659l1.525,0c0,0 0.956,-1.529 1.564,-3.967c0,0 1.265,-0.913 3.18,-0.913c2.922,0 4.312,1.919 4.312,4.88l0,2.438c-7.666,-0.04 -12.102,3.61 -12.102,7.14c0,3.44 2.392,5.918 5.917,5.918c2.701,0 5.402,-1.739 6.618,-4.041l0.046,0c0,0 0.043,2.259 1.173,4.132c3.174,-0.919 5.697,-2.871 5.697,-2.871l-0.564,-1.396ZM283.804,65.821c0,2.871 -2.439,4.79 -4.49,4.79c-1.954,0 -3.44,-1.568 -3.44,-3.789c0,-2.224 1.614,-4.447 7.93,-4.315l0,3.314ZM316.618,71.35c-1.78,-0.306 -3.042,-0.785 -3.042,-0.785l0,-29.467c-4.264,-0.093 -7.399,0.56 -7.399,0.56l0,1.348c2.001,0.348 3.312,0.781 3.312,0.781l0,7.581c0,0 -1.83,-0.213 -3.75,-0.213c-6.528,0 -11.49,4 -11.49,12.187c0,6.092 3.085,10.18 8.182,10.18c3.657,0 6.315,-2.303 7.36,-4.873l0.046,0.043c0,-0.004 -0.305,1.869 -0.263,4.566c3.956,0.132 7.044,-0.525 7.044,-0.525l0,-1.383ZM309.489,63.514c0,4.004 -2.445,7.139 -5.356,7.139c-3.617,0 -5.622,-3.355 -5.622,-8.231c0,-6.01 2.398,-9.144 6.443,-9.144c1.876,0 3.355,0.433 4.535,1.222l0,9.014ZM337.997,60.162c0,-5.488 -2.695,-9.099 -8.487,-9.099c-6.27,0 -9.792,4.741 -9.792,11.576c0,7.098 3.522,10.84 9.71,10.84c3.265,0 6.262,-1.219 8.569,-3l-0.74,-1.699c-1.567,1.083 -4.13,1.873 -6.27,1.873c-4.399,0 -6.966,-2.744 -6.966,-8.278l0,-0.607l13.976,0l0,-1.606ZM333.649,59.81l-9.539,0c0.306,-3.743 1.912,-6.664 4.962,-6.664c3.096,0 4.616,2.882 4.577,6.664ZM367.076,47.274l0,-5.793c-1.222,-0.298 -2.654,-0.476 -4.048,-0.476c-5.487,0 -8.049,2.957 -8.049,7.705l0,2.744l-4.18,0l0,2.087l4.18,0l0,16.985c-2.087,0.521 -3.527,1.3 -3.527,1.3l0,1.301l11.225,0l0,-1.301c0,0 -1.522,-0.736 -3.615,-1.3l0,-16.985l5.747,0l0,-2.087l-5.747,0l0,-3.219c0,-3.356 0.696,-5.229 3.398,-5.229c0.568,0 1.172,0.085 1.698,0.26c0.345,2.047 1.39,4.008 1.39,4.008l1.528,0ZM387.793,61.776c0,-6.842 -3.824,-10.713 -9.966,-10.713c-6.269,0 -11.529,4.134 -11.529,11.707c0,6.881 3.82,10.752 9.966,10.752c6.269,0 11.529,-4.173 11.529,-11.746ZM383.446,62.553c0,5.666 -2.263,8.576 -5.967,8.576c-4.396,0 -6.834,-3.699 -6.834,-9.141c0,-5.666 2.263,-8.576 5.92,-8.576c4.397,0 6.881,3.739 6.881,9.141ZM407.337,51.543c-0.824,-0.305 -1.954,-0.522 -3.088,-0.522c-2.741,0 -4.443,2.128 -5.616,5.476l-0.132,0c0.264,-1.691 0.349,-3.39 0.349,-5.171c-2.385,-0.088 -5.349,0.128 -7.265,0.522l0,1.344c1.088,0.171 2.311,0.476 3.309,0.824l0,16.51c-1.215,0.304 -2.26,0.738 -3.309,1.3l0,1.301l10.837,0l0,-1.301c-1.088,-0.522 -2.222,-0.957 -3.441,-1.3l0,-8.407c0,-3.746 1.483,-7.313 4.4,-7.313c1.305,0 2.389,0.432 3.394,0.909l0.562,-4.172ZM457.531,73.127l0,-1.301c0,0 -1.35,-0.824 -2.957,-1.3c0,0 0.175,-4.052 0.175,-9.799c0,-6.536 -2.307,-9.664 -6.874,-9.664c-3.664,0 -6.493,2.083 -7.581,4.869l-0.046,0c-0.437,-2.569 -2.389,-4.869 -6.525,-4.869c-3.441,0 -6.273,2.129 -7.361,4.788l-0.086,0c0,0 0.303,-1.835 0.303,-4.525c-4.169,-0.131 -7.35,0.522 -7.35,0.522l0,1.344c1.956,0.349 3.309,0.824 3.309,0.824l0,16.51c-1.788,0.429 -3.309,1.3 -3.309,1.3l0,1.301l10.186,0l0,-1.255c0,0 -1.4,-0.782 -2.793,-1.307l0,-9.535c0,-3.391 2.093,-7.231 5.622,-7.231c3.526,0 4.265,2.965 4.265,5.752l0,11.014c-1.087,0.437 -2.093,0.959 -2.786,1.307l0,1.255l9.663,0l0,-1.255c-0.697,-0.301 -1.741,-0.87 -2.786,-1.307l0,-9.535c0,-3.391 2.047,-7.231 5.705,-7.231c3.308,0 4.353,3.139 4.353,8.016c0,4.918 -0.171,8.75 -0.171,8.75c-1.528,0.525 -2.79,1.307 -2.79,1.307l0,1.255l9.834,0ZM468.72,44.573c0,-1.563 -1.13,-2.741 -2.741,-2.741c-1.567,0 -2.74,1.178 -2.74,2.741c0,1.525 1.173,2.698 2.74,2.698c1.611,0 2.741,-1.173 2.741,-2.698ZM471.072,73.127l0,-1.301c0,0 -1.396,-0.824 -3.052,-1.3l0,-19.2c-4.254,-0.131 -7.393,0.522 -7.393,0.522l0,1.344c1.916,0.349 3.306,0.824 3.306,0.824l0,16.51c-1.739,0.429 -3.306,1.3 -3.306,1.3l0,1.301l10.445,0ZM498.628,73.127l0,-1.301c0,0 -1.355,-0.824 -2.965,-1.3c0,0 0.221,-4.098 0.221,-9.799c0,-6.536 -2.26,-9.664 -7.009,-9.664c-3.831,0 -6.532,2.218 -7.577,4.788l-0.085,0c0,0 0.302,-1.835 0.302,-4.525c-4.173,-0.131 -7.354,0.522 -7.354,0.522l0,1.344c1.966,0.349 3.313,0.824 3.313,0.824l0,16.51c-1.83,0.476 -3.313,1.3 -3.313,1.3l0,1.301l10.321,0l0,-1.255c0,0 -1.353,-0.782 -2.921,-1.307l0,-9.535c0,-3.438 2.089,-7.231 5.793,-7.231c3.441,0 4.4,3.139 4.4,8.016c0,4.918 -0.178,8.75 -0.178,8.75c-1.567,0.525 -2.918,1.307 -2.918,1.307l0,1.255l9.97,0ZM524.395,71.35c-1.781,-0.306 -3.046,-0.785 -3.046,-0.785l0,-29.467c-4.258,-0.093 -7.396,0.56 -7.396,0.56l0,1.348c2,0.348 3.313,0.781 3.313,0.781l0,7.581c0,0 -1.834,-0.213 -3.75,-0.213c-6.533,0 -11.491,4 -11.491,12.187c0,6.092 3.089,10.18 8.185,10.18c3.654,0 6.316,-2.303 7.353,-4.873l0.047,0.043c0,-0.004 -0.305,1.869 -0.263,4.566c3.955,0.132 7.048,-0.525 7.048,-0.525l0,-1.383ZM517.266,63.514c0,4.004 -2.446,7.139 -5.357,7.139c-3.618,0 -5.622,-3.355 -5.622,-8.231c0,-6.01 2.395,-9.144 6.445,-9.144c1.875,0 3.353,0.433 4.534,1.222l0,9.014ZM542.812,66.949c0,-7.228 -10.406,-5.483 -10.406,-11.013c0,-1.653 1.049,-2.698 2.917,-2.698c1.266,0 2.401,0.303 3.05,0.647c0.31,1.27 0.742,2.57 1.305,3.572l1.563,0l0,-5.829c-1.304,-0.348 -3.128,-0.565 -5.001,-0.565c-4.662,0 -7.837,2.605 -7.837,5.961c0,7.445 10.319,5.576 10.319,11.017c0,2.09 -1.309,2.961 -3.227,2.961c-1.607,0 -3,-0.437 -4.045,-0.871c-0.26,-1.174 -0.821,-2.488 -1.308,-3.572l-1.603,0l0,6.223c1.734,0.437 3.604,0.654 5.829,0.654c4.401,0 8.444,-2.694 8.444,-6.487ZM552.995,70.781c0,-1.567 -1.174,-2.693 -2.698,-2.693c-1.564,0 -2.74,1.126 -2.74,2.693c0,1.565 1.176,2.741 2.74,2.741c1.524,0 2.698,-1.176 2.698,-2.741Z",
- style: {
- fillRule: "nonzero"
- }
- }))));
-}
-
-var ForwardRef = /*#__PURE__*/React.forwardRef(SvgDwClaim);
-export default __webpack_public_path__ + "static/media/dw-claim.dad03c02.svg";
-export { ForwardRef as ReactComponent };
\ No newline at end of file
diff --git a/sources-gen/assets/svg/dw-logo-mobile.svg.js b/sources-gen/assets/svg/dw-logo-mobile.svg.js
deleted file mode 100644
index bdf0701..0000000
--- a/sources-gen/assets/svg/dw-logo-mobile.svg.js
+++ /dev/null
@@ -1,2 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-export default __webpack_public_path__ + "static/media/dw-logo-mobile.7e6e58ec.svg";
\ No newline at end of file
diff --git a/sources-gen/assets/svg/dw-logo-tablet.svg.js b/sources-gen/assets/svg/dw-logo-tablet.svg.js
deleted file mode 100644
index 246f426..0000000
--- a/sources-gen/assets/svg/dw-logo-tablet.svg.js
+++ /dev/null
@@ -1,2 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-export default __webpack_public_path__ + "static/media/dw-logo-tablet.ac032dbb.svg";
\ No newline at end of file
diff --git a/sources-gen/assets/svg/dw-logo.svg.js b/sources-gen/assets/svg/dw-logo.svg.js
deleted file mode 100644
index 963fa5a..0000000
--- a/sources-gen/assets/svg/dw-logo.svg.js
+++ /dev/null
@@ -1,37 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
-
-function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
-
-function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
-
-import * as React from "react";
-
-var _ref2 = /*#__PURE__*/React.createElement("g", {
- className: "logoBox",
- fillRule: "evenodd"
-}, /*#__PURE__*/React.createElement("g", {
- className: "logoLogo"
-}, /*#__PURE__*/React.createElement("path", {
- d: "M15.5929091,3.39736364 C22.287,3.39736364 27.714,8.82381818 27.714,15.5184545 C27.714,22.2125455 22.287,27.6392727 15.5929091,27.6392727 C8.89881818,27.6392727 3.47181818,22.2125455 3.47181818,15.5184545 C3.47181818,8.82381818 8.89881818,3.39736364 15.5929091,3.39736364 L15.5929091,3.39736364 Z M26.9959091,5.16463636 C29.8276364,1.99527273 33.9458182,0 38.5303636,0 C47.0694545,0 53.9920909,6.92236364 53.9920909,15.4617273 C53.9920909,24.0010909 47.0694545,30.9234545 38.5303636,30.9234545 C33.9458182,30.9234545 29.8276364,28.9281818 26.9959091,25.7585455 C24.1644545,28.9281818 20.046,30.9234545 15.4614545,30.9234545 C6.92209091,30.9234545 0,24.0010909 0,15.4617273 C0,6.92236364 6.92209091,1.93784382e-15 15.4614545,1.93784382e-15 C20.046,1.93784382e-15 24.1644545,1.99527273 26.9959091,5.16463636 L26.9959091,5.16463636 Z M15.9913636,13.0819091 L12.6553636,13.0819091 L12.6553636,18.0845455 L15.9913636,18.0845455 C18.4150909,18.0845455 19.2714545,17.0787273 19.2714545,15.5833636 C19.2714545,14.088 18.4085455,13.0819091 15.9913636,13.0819091 L15.9913636,13.0819091 Z M16.4511818,9.59536364 C19.8250909,9.59536364 23.2835455,11.292 23.2835455,15.5828182 C23.2835455,19.8739091 19.8250909,21.5705455 16.4511818,21.5705455 L8.886,21.5705455 L8.886,9.59536364 L16.4511818,9.59536364 L16.4511818,9.59536364 Z M35.4119983,15.9318147 L37.5403715,10.1204985 L40.4334297,10.1204985 L42.5618029,15.9318147 L44.2678615,10.1204985 L48.0692727,10.1204985 L44.4908946,21.3263197 L41.2676315,21.3263197 L38.9674938,15.9016908 L36.7070387,21.3263197 L33.483486,21.3263197 L29.9048182,10.1204985 L33.7062294,10.1204985 L35.4119983,15.9318147 L35.4119983,15.9318147 Z",
- id: "Shape"
-})));
-
-function SvgDwLogo(_ref, svgRef) {
- var title = _ref.title,
- titleId = _ref.titleId,
- props = _objectWithoutProperties(_ref, ["title", "titleId"]);
-
- return /*#__PURE__*/React.createElement("svg", _extends({
- viewBox: "0 0 54 31",
- xmlns: "http://www.w3.org/2000/svg",
- ref: svgRef,
- "aria-labelledby": titleId
- }, props), title ? /*#__PURE__*/React.createElement("title", {
- id: titleId
- }, title) : null, _ref2);
-}
-
-var ForwardRef = /*#__PURE__*/React.forwardRef(SvgDwLogo);
-export default __webpack_public_path__ + "static/media/dw-logo.ff9012af.svg";
-export { ForwardRef as ReactComponent };
\ No newline at end of file
diff --git a/sources-gen/assets/svg/icon-course-cert-gray.svg.js b/sources-gen/assets/svg/icon-course-cert-gray.svg.js
deleted file mode 100644
index e8ab37e..0000000
--- a/sources-gen/assets/svg/icon-course-cert-gray.svg.js
+++ /dev/null
@@ -1,2 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-export default __webpack_public_path__ + "static/media/icon-course-cert-gray.0fdcab0c.svg";
\ No newline at end of file
diff --git a/sources-gen/assets/svg/icon-hint-circle-orange.svg.js b/sources-gen/assets/svg/icon-hint-circle-orange.svg.js
deleted file mode 100644
index c7df4af..0000000
--- a/sources-gen/assets/svg/icon-hint-circle-orange.svg.js
+++ /dev/null
@@ -1,42 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
-
-function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
-
-function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
-
-import * as React from "react";
-
-function SvgIconHintCircleOrange(_ref, svgRef) {
- var title = _ref.title,
- titleId = _ref.titleId,
- props = _objectWithoutProperties(_ref, ["title", "titleId"]);
-
- return /*#__PURE__*/React.createElement("svg", _extends({
- width: "18px",
- height: "18px",
- viewBox: "0 0 18 18",
- xmlns: "http://www.w3.org/2000/svg",
- xmlnsXlink: "http://www.w3.org/1999/xlink",
- xmlSpace: "preserve",
- style: {
- fillRule: "evenodd",
- clipRule: "evenodd",
- strokeLinejoin: "round",
- strokeMiterlimit: 1.41421
- },
- ref: svgRef,
- "aria-labelledby": titleId
- }, props), title ? /*#__PURE__*/React.createElement("title", {
- id: titleId
- }, title) : null, /*#__PURE__*/React.createElement("path", {
- d: "M9,0C13.967,0 18,4.033 18,9C18,13.967 13.967,18 9,18C4.033,18 0,13.967 0,9C0,4.033 4.033,0 9,0ZM12.189,14.994L12.189,14.343L10.027,13.623L10.027,6.966C8.269,6.966 7.525,7.069 6.206,7.289L6.206,7.903C7.113,8.041 7.538,8.144 7.977,8.337L7.977,13.657C7.181,13.849 6.502,14.013 5.87,14.343L5.87,14.994L12.189,14.994ZM8.984,5.417C8.544,5.417 8.31,5.322 8.007,5.02C7.705,4.718 7.61,4.484 7.61,4.044C7.61,3.605 7.705,3.37 8.007,3.068C8.31,2.765 8.544,2.67 8.984,2.67C9.424,2.67 9.657,2.765 9.96,3.068C10.262,3.37 10.357,3.605 10.357,4.044C10.357,4.484 10.262,4.718 9.96,5.02C9.657,5.322 9.424,5.417 8.984,5.417Z",
- style: {
- fill: "#f08c00"
- }
- }));
-}
-
-var ForwardRef = /*#__PURE__*/React.forwardRef(SvgIconHintCircleOrange);
-export default __webpack_public_path__ + "static/media/icon-hint-circle-orange.764164ab.svg";
-export { ForwardRef as ReactComponent };
\ No newline at end of file
diff --git a/sources-gen/assets/svg/icon-hint.svg.js b/sources-gen/assets/svg/icon-hint.svg.js
deleted file mode 100644
index 96d8261..0000000
--- a/sources-gen/assets/svg/icon-hint.svg.js
+++ /dev/null
@@ -1,39 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
-
-function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
-
-function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
-
-import * as React from "react";
-
-function SvgIconHint(_ref, svgRef) {
- var title = _ref.title,
- titleId = _ref.titleId,
- props = _objectWithoutProperties(_ref, ["title", "titleId"]);
-
- return /*#__PURE__*/React.createElement("svg", _extends({
- width: "10px",
- height: "18px",
- viewBox: "0 0 10 18",
- xmlns: "http://www.w3.org/2000/svg",
- xmlnsXlink: "http://www.w3.org/1999/xlink",
- style: {
- fillRule: "evenodd"
- },
- ref: svgRef,
- "aria-labelledby": titleId
- }, props), title ? /*#__PURE__*/React.createElement("title", {
- id: titleId
- }, title) : null, /*#__PURE__*/React.createElement("path", {
- d: "M369.101562,1457.80899 L369.101562,1456.85041 C369.918135,1456.42437 370.841202,1456.08709 371.870793,1455.83857 L371.870793,1448.22319 C371.302743,1447.97467 370.432929,1447.76165 369.261326,1447.58413 L369.261326,1446.67881 C370.965476,1446.39478 372.953622,1446.25277 375.225823,1446.25277 L375.225823,1455.83857 L378.101562,1456.85041 L378.101562,1457.80899 L369.101562,1457.80899 Z M373.308663,1444.17585 C372.740613,1444.17585 372.261328,1443.98059 371.870793,1443.59005 C371.480259,1443.19952 371.284994,1442.72023 371.284994,1442.15218 C371.284994,1441.58413 371.480259,1441.10485 371.870793,1440.71431 C372.261328,1440.32378 372.740613,1440.12851 373.308663,1440.12851 C373.876713,1440.12851 374.355998,1440.32378 374.746533,1440.71431 C375.137067,1441.10485 375.332332,1441.58413 375.332332,1442.15218 C375.332332,1442.72023 375.137067,1443.19952 374.746533,1443.59005 C374.355998,1443.98059 373.876713,1444.17585 373.308663,1444.17585 L373.308663,1444.17585 Z",
- style: {
- fill: "#f08c00"
- },
- transform: "translate(-369.000000, -1440.000000)"
- }));
-}
-
-var ForwardRef = /*#__PURE__*/React.forwardRef(SvgIconHint);
-export default __webpack_public_path__ + "static/media/icon-hint.484f8f25.svg";
-export { ForwardRef as ReactComponent };
\ No newline at end of file
diff --git a/sources-gen/assets/svg/icon-language-world-w.svg.js b/sources-gen/assets/svg/icon-language-world-w.svg.js
deleted file mode 100644
index 9b7b37d..0000000
--- a/sources-gen/assets/svg/icon-language-world-w.svg.js
+++ /dev/null
@@ -1,43 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
-
-function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
-
-function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
-
-import * as React from "react";
-
-function SvgIconLanguageWorldW(_ref, svgRef) {
- var title = _ref.title,
- titleId = _ref.titleId,
- props = _objectWithoutProperties(_ref, ["title", "titleId"]);
-
- return /*#__PURE__*/React.createElement("svg", _extends({
- width: "16px",
- height: "16px",
- viewBox: "0 0 16 16",
- xmlns: "http://www.w3.org/2000/svg",
- xmlnsXlink: "http://www.w3.org/1999/xlink",
- xmlSpace: "preserve",
- style: {
- fillRule: "evenodd",
- clipRule: "evenodd",
- strokeLinejoin: "round",
- strokeMiterlimit: 1.41421
- },
- ref: svgRef,
- "aria-labelledby": titleId
- }, props), title ? /*#__PURE__*/React.createElement("title", {
- id: titleId
- }, title) : null, /*#__PURE__*/React.createElement("path", {
- d: "M7.976,0.026c-1.443,0 -2.784,0.36 -4.021,1.082c-1.208,0.707 -2.165,1.665 -2.872,2.873c-0.722,1.252 -1.083,2.599 -1.083,4.043c0,1.443 0.361,2.784 1.083,4.021c0.707,1.208 1.664,2.165 2.872,2.872c1.237,0.722 2.578,1.083 4.021,1.083c1.444,0 2.784,-0.361 4.021,-1.083c1.208,-0.707 2.166,-1.664 2.873,-2.872c0.736,-1.237 1.104,-2.578 1.104,-4.021c0,-1.444 -0.36,-2.784 -1.082,-4.021c-0.707,-1.208 -1.665,-2.166 -2.873,-2.873c-1.252,-0.736 -2.599,-1.104 -4.043,-1.104Zm3.005,6.451c1.208,-0.25 2.268,-0.641 3.182,-1.171c0.383,0.855 0.574,1.76 0.574,2.718c0,1.149 -0.272,2.209 -0.817,3.181c-0.973,-0.486 -1.974,-0.832 -3.005,-1.038c0.088,-0.692 0.132,-1.407 0.132,-2.143c0,-0.53 -0.022,-1.046 -0.066,-1.547Zm2.629,-2.165c-0.942,0.398 -1.878,0.677 -2.806,0.84c-0.25,-1.429 -0.648,-2.659 -1.193,-3.69c0.825,0.206 1.584,0.556 2.276,1.049c0.692,0.494 1.267,1.094 1.723,1.801Zm-3.734,3.712c0,0.781 -0.037,1.429 -0.11,1.944c-0.634,-0.073 -1.23,-0.11 -1.79,-0.11c-0.56,0 -1.156,0.037 -1.789,0.11c-0.074,-0.692 -0.111,-1.34 -0.111,-1.944c0,-0.309 0.015,-0.759 0.044,-1.348c0.516,0.074 1.138,0.111 1.867,0.111c0.729,0 1.344,-0.037 1.845,-0.111c0.03,0.589 0.044,1.039 0.044,1.348Zm-1.414,-6.739c0.589,1.178 0.995,2.526 1.215,4.043c-0.736,0.059 -1.303,0.089 -1.701,0.089c-0.398,0 -0.965,-0.03 -1.701,-0.089c0.236,-1.517 0.641,-2.865 1.215,-4.043c0.103,-0.015 0.265,-0.022 0.486,-0.022c0.221,0 0.383,0.007 0.486,0.022Zm-2.121,0.177c-0.56,1.09 -0.957,2.32 -1.193,3.69c-0.972,-0.192 -1.907,-0.472 -2.806,-0.84c0.471,-0.707 1.05,-1.307 1.734,-1.801c0.685,-0.493 1.44,-0.843 2.265,-1.049Zm-4.551,3.844c0.942,0.53 2.003,0.921 3.181,1.171c-0.044,0.501 -0.066,1.017 -0.066,1.547c0,0.736 0.044,1.451 0.133,2.143c-1.032,0.206 -2.033,0.552 -3.005,1.038c-0.531,-0.986 -0.796,-2.047 -0.796,-3.181c0,-0.943 0.184,-1.849 0.553,-2.718Zm0.906,6.894c0.824,-0.324 1.679,-0.56 2.563,-0.707c0.235,1.119 0.596,2.143 1.082,3.071c-0.722,-0.192 -1.395,-0.49 -2.021,-0.895c-0.627,-0.405 -1.168,-0.895 -1.624,-1.469Zm4.794,2.541c-0.486,-0.973 -0.854,-2.114 -1.105,-3.425c0.531,-0.044 1.068,-0.066 1.613,-0.066c0.545,0 1.068,0.022 1.569,0.066c-0.25,1.311 -0.619,2.452 -1.105,3.425c-0.103,0.014 -0.265,0.022 -0.486,0.022c-0.221,0 -0.383,-0.008 -0.486,-0.022Zm2.121,-0.177c0.486,-0.928 0.847,-1.952 1.083,-3.071c0.898,0.147 1.76,0.383 2.585,0.707c-0.471,0.589 -1.02,1.086 -1.646,1.491c-0.626,0.405 -1.3,0.696 -2.022,0.873Z",
- style: {
- fill: "#fff",
- fillRule: "nonzero"
- }
- }));
-}
-
-var ForwardRef = /*#__PURE__*/React.forwardRef(SvgIconLanguageWorldW);
-export default __webpack_public_path__ + "static/media/icon-language-world-w.bb8502bb.svg";
-export { ForwardRef as ReactComponent };
\ No newline at end of file
diff --git a/sources-gen/assets/svg/icon-user-navi.svg.js b/sources-gen/assets/svg/icon-user-navi.svg.js
deleted file mode 100644
index 3a685a1..0000000
--- a/sources-gen/assets/svg/icon-user-navi.svg.js
+++ /dev/null
@@ -1,53 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
-
-function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
-
-function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
-
-import * as React from "react";
-
-var _ref2 = /*#__PURE__*/React.createElement("desc", null, "Person Icon");
-
-var _ref3 = /*#__PURE__*/React.createElement("g", {
- id: "Seiten",
- stroke: "none",
- strokeWidth: 1,
- fill: "none",
- fillRule: "evenodd",
- opacity: 1
-}, /*#__PURE__*/React.createElement("g", {
- id: "06-desk-lektionsinfo+burger",
- transform: "translate(-1146.000000, -501.000000)",
- fill: "#FFFFFF"
-}, /*#__PURE__*/React.createElement("g", {
- id: "burgernavi-d",
- transform: "translate(920.000000, 170.000000)"
-}, /*#__PURE__*/React.createElement("path", {
- d: "M241.86087,345.655072 C239.603853,344.603859 238.150728,344.078261 237.501449,344.078261 L233.976812,345.284058 L230.35942,344.078261 C230.081158,344.078261 229.578748,344.209661 228.852174,344.472464 C228.1256,344.735267 227.468602,344.990337 226.881159,345.237681 L226,345.655072 L226,347 L241.86087,347 L241.86087,345.655072 Z M229.988406,340.507246 C231.008701,342.64059 232.338156,343.707246 233.976812,343.707246 C235.584549,343.707246 236.898546,342.64059 237.918841,340.507246 C238.289857,340.383574 238.591303,339.997105 238.823188,339.347826 C239.055074,338.698547 239.155556,338.072467 239.124638,337.469565 C239.09372,336.866664 238.954591,336.565217 238.707246,336.565217 C239.047345,335.606758 239.047345,334.802902 238.707246,334.153623 C238.676328,334.060869 238.629952,333.944928 238.568116,333.805797 C238.50628,333.666666 238.343963,333.419325 238.081159,333.063768 C237.818356,332.708211 237.524639,332.391306 237.2,332.113043 C236.875361,331.834781 236.427056,331.579711 235.855072,331.347826 C235.283089,331.115941 234.657008,331 233.976812,331 C232.925599,331 231.998072,331.262799 231.194203,331.788406 C230.390334,332.314012 229.849277,332.839611 229.571014,333.365217 L229.2,334.153623 L229.153623,334.292754 C229.122705,334.35459 229.099517,334.455072 229.084058,334.594203 C229.068599,334.733334 229.05314,334.887922 229.037681,335.057971 C229.022222,335.22802 229.029952,335.444443 229.06087,335.707246 C229.091788,335.97005 229.138164,336.256037 229.2,336.565217 C228.952656,336.565217 228.813527,336.866664 228.782609,337.469565 C228.751691,338.072467 228.852173,338.698547 229.084058,339.347826 C229.315943,339.997105 229.617389,340.383574 229.988406,340.507246 L229.988406,340.507246 Z M230.127536,335.776812 C230.127536,335.684058 230.166183,335.591305 230.243478,335.498551 C230.320773,335.405797 230.552655,335.282126 230.93913,335.127536 C231.325606,334.972946 231.889851,335.05024 232.631884,335.35942 C233.373917,335.637683 234.085021,335.714976 234.765217,335.591304 C235.445414,335.467632 235.971013,335.313044 236.342029,335.127536 C236.713045,334.942028 236.991303,334.756523 237.176812,334.571014 C237.331402,334.571014 237.462801,334.764249 237.571014,335.150725 C237.679228,335.5372 237.733333,335.869564 237.733333,336.147826 L237.733333,337.353623 C237.918842,337.353623 238.042512,337.369082 238.104348,337.4 C238.166184,337.430918 238.197101,337.570047 238.197101,337.817391 C238.197101,338.064736 238.135266,338.435746 238.011594,338.930435 C237.733332,339.456041 237.455074,339.718841 237.176812,339.718841 C237.084058,339.966185 236.952658,340.259902 236.782609,340.6 C236.61256,340.940098 236.257008,341.403862 235.715942,341.991304 C235.174877,342.578747 234.595172,342.872464 233.976812,342.872464 C233.358451,342.872464 232.786476,342.609664 232.26087,342.084058 C231.735263,341.558451 231.364252,341.032853 231.147826,340.507246 L230.823188,339.718841 C230.699516,339.718841 230.560387,339.649276 230.405797,339.510145 C230.251207,339.371014 230.127537,339.239614 230.034783,339.115942 L229.895652,338.930435 C229.61739,337.879222 229.694684,337.353623 230.127536,337.353623 L230.127536,335.776812 Z",
- id: "Shape"
-}))));
-
-function SvgIconUserNavi(_ref, svgRef) {
- var title = _ref.title,
- titleId = _ref.titleId,
- props = _objectWithoutProperties(_ref, ["title", "titleId"]);
-
- return /*#__PURE__*/React.createElement("svg", _extends({
- width: "16px",
- height: "16px",
- viewBox: "0 0 16 16",
- xmlns: "http://www.w3.org/2000/svg",
- xmlnsXlink: "http://www.w3.org/1999/xlink",
- ref: svgRef,
- "aria-labelledby": titleId
- }, props), title === undefined ? /*#__PURE__*/React.createElement("title", {
- id: titleId
- }, "Avatar") : title ? /*#__PURE__*/React.createElement("title", {
- id: titleId
- }, title) : null, _ref2, _ref3);
-}
-
-var ForwardRef = /*#__PURE__*/React.forwardRef(SvgIconUserNavi);
-export default __webpack_public_path__ + "static/media/icon-user-navi.68643217.svg";
-export { ForwardRef as ReactComponent };
\ No newline at end of file
diff --git a/sources-gen/assets/svg/keyboard.svg.js b/sources-gen/assets/svg/keyboard.svg.js
deleted file mode 100644
index ff87a55..0000000
--- a/sources-gen/assets/svg/keyboard.svg.js
+++ /dev/null
@@ -1,104 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
-
-function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
-
-function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
-
-import * as React from "react";
-
-var _ref2 = /*#__PURE__*/React.createElement("rect", {
- width: 2,
- height: 2,
- x: 2,
- y: 6
-});
-
-var _ref3 = /*#__PURE__*/React.createElement("rect", {
- width: 2,
- height: 2,
- x: 5,
- y: 6
-});
-
-var _ref4 = /*#__PURE__*/React.createElement("rect", {
- width: 2,
- height: 2,
- x: 8,
- y: 6
-});
-
-var _ref5 = /*#__PURE__*/React.createElement("path", {
- d: "m 11,6 3,0 0,5 -2,0 0,-3 -1,0 z"
-});
-
-var _ref6 = /*#__PURE__*/React.createElement("rect", {
- width: 2,
- height: 2,
- x: 12,
- y: 12
-});
-
-var _ref7 = /*#__PURE__*/React.createElement("rect", {
- width: 6,
- height: 2,
- x: 5,
- y: 12
-});
-
-var _ref8 = /*#__PURE__*/React.createElement("rect", {
- width: 2,
- height: 2,
- x: 9,
- y: 9
-});
-
-var _ref9 = /*#__PURE__*/React.createElement("rect", {
- width: 2,
- height: 2,
- x: 6,
- y: 9
-});
-
-var _ref10 = /*#__PURE__*/React.createElement("rect", {
- width: 2,
- height: 2,
- x: 2,
- y: 12
-});
-
-var _ref11 = /*#__PURE__*/React.createElement("rect", {
- width: 3,
- height: 2,
- x: 2,
- y: 9
-});
-
-function SvgKeyboard(_ref, svgRef) {
- var title = _ref.title,
- titleId = _ref.titleId,
- props = _objectWithoutProperties(_ref, ["title", "titleId"]);
-
- return /*#__PURE__*/React.createElement("svg", _extends({
- xmlns: "http://www.w3.org/2000/svg",
- width: 16,
- height: 16,
- style: {
- fill: "#888"
- },
- ref: svgRef,
- "aria-labelledby": titleId
- }, props), title ? /*#__PURE__*/React.createElement("title", {
- id: titleId
- }, title) : null, /*#__PURE__*/React.createElement("g", null, /*#__PURE__*/React.createElement("path", {
- style: {
- fill: "none",
- stroke: "#888"
- },
- d: "M 0.5,4.5 15.5,4.5 15.5,15.5 0.5,15.5 Z"
- }), _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9, _ref10, _ref11));
-}
-
-var ForwardRef = /*#__PURE__*/React.forwardRef(SvgKeyboard);
-export default __webpack_public_path__ + "static/media/keyboard.3a060932.svg";
-export { ForwardRef as ReactComponent };
\ No newline at end of file
diff --git a/sources-gen/assets/svg/nav-cross-black-lg.svg.js b/sources-gen/assets/svg/nav-cross-black-lg.svg.js
deleted file mode 100644
index ea1c8ca..0000000
--- a/sources-gen/assets/svg/nav-cross-black-lg.svg.js
+++ /dev/null
@@ -1,2 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-export default __webpack_public_path__ + "static/media/nav-cross-black-lg.4c2e3c0d.svg";
\ No newline at end of file
diff --git a/sources-gen/assets/svg/nav-cross-black-md.svg.js b/sources-gen/assets/svg/nav-cross-black-md.svg.js
deleted file mode 100644
index f5c9ffc..0000000
--- a/sources-gen/assets/svg/nav-cross-black-md.svg.js
+++ /dev/null
@@ -1,2 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-export default __webpack_public_path__ + "static/media/nav-cross-black-md.f5825c8f.svg";
\ No newline at end of file
diff --git a/sources-gen/assets/svg/nav-cross-lg.svg.js b/sources-gen/assets/svg/nav-cross-lg.svg.js
deleted file mode 100644
index faefb0a..0000000
--- a/sources-gen/assets/svg/nav-cross-lg.svg.js
+++ /dev/null
@@ -1,2 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-export default __webpack_public_path__ + "static/media/nav-cross-lg.a759f43e.svg";
\ No newline at end of file
diff --git a/sources-gen/assets/svg/nav-cross-xs.svg.js b/sources-gen/assets/svg/nav-cross-xs.svg.js
deleted file mode 100644
index 78782ba..0000000
--- a/sources-gen/assets/svg/nav-cross-xs.svg.js
+++ /dev/null
@@ -1,2 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-export default __webpack_public_path__ + "static/media/nav-cross-xs.fec778ad.svg";
\ No newline at end of file
diff --git a/sources-gen/assets/svg/smiley-negative.svg.js b/sources-gen/assets/svg/smiley-negative.svg.js
deleted file mode 100644
index b58a455..0000000
--- a/sources-gen/assets/svg/smiley-negative.svg.js
+++ /dev/null
@@ -1,66 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
-
-function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
-
-function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
-
-import * as React from "react";
-
-function SvgSmileyNegative(_ref, svgRef) {
- var title = _ref.title,
- titleId = _ref.titleId,
- props = _objectWithoutProperties(_ref, ["title", "titleId"]);
-
- return /*#__PURE__*/React.createElement("svg", _extends({
- width: "100%",
- height: "100%",
- viewBox: "0 0 55 54",
- xmlns: "http://www.w3.org/2000/svg",
- xmlnsXlink: "http://www.w3.org/1999/xlink",
- xmlSpace: "preserve",
- style: {
- fillRule: "evenodd",
- clipRule: "evenodd",
- strokeLinejoin: "round",
- strokeMiterlimit: 1.41421
- },
- ref: svgRef,
- "aria-labelledby": titleId
- }, props), title ? /*#__PURE__*/React.createElement("title", {
- id: titleId
- }, title) : null, /*#__PURE__*/React.createElement("circle", {
- className: "dot",
- cx: 27.5,
- cy: 27,
- r: 27,
- style: {
- fill: "#A9A094"
- }
- }), /*#__PURE__*/React.createElement("g", {
- id: "face"
- }, /*#__PURE__*/React.createElement("circle", {
- cx: 18.5,
- cy: 18.5,
- r: 3.5,
- style: {
- fill: "#fff"
- }
- }), /*#__PURE__*/React.createElement("circle", {
- cx: 36.5,
- cy: 18.5,
- r: 3.5,
- style: {
- fill: "#fff"
- }
- }), /*#__PURE__*/React.createElement("path", {
- d: "M40.902,32.312l-26.41,5.613l0.624,2.935l26.41,-5.614l-0.624,-2.934Z",
- style: {
- fill: "#fff"
- }
- })));
-}
-
-var ForwardRef = /*#__PURE__*/React.forwardRef(SvgSmileyNegative);
-export default __webpack_public_path__ + "static/media/smiley-negative.6c289ab6.svg";
-export { ForwardRef as ReactComponent };
\ No newline at end of file
diff --git a/sources-gen/assets/svg/smiley-positive.svg.js b/sources-gen/assets/svg/smiley-positive.svg.js
deleted file mode 100644
index 8b8e1d3..0000000
--- a/sources-gen/assets/svg/smiley-positive.svg.js
+++ /dev/null
@@ -1,57 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
-
-function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
-
-function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
-
-import * as React from "react";
-
-function SvgSmileyPositive(_ref, svgRef) {
- var title = _ref.title,
- titleId = _ref.titleId,
- props = _objectWithoutProperties(_ref, ["title", "titleId"]);
-
- return /*#__PURE__*/React.createElement("svg", _extends({
- width: "100%",
- height: "100%",
- viewBox: "0 0 55 54",
- xmlns: "http://www.w3.org/2000/svg",
- xmlnsXlink: "http://www.w3.org/1999/xlink",
- xmlSpace: "preserve",
- style: {
- fillRule: "evenodd",
- clipRule: "evenodd",
- strokeLinejoin: "round",
- strokeMiterlimit: 1.41421
- },
- ref: svgRef,
- "aria-labelledby": titleId
- }, props), title ? /*#__PURE__*/React.createElement("title", {
- id: titleId
- }, title) : null, /*#__PURE__*/React.createElement("circle", {
- className: "dot",
- cx: 27.5,
- cy: 27,
- r: 27,
- style: {
- fill: "#A9A094"
- }
- }), /*#__PURE__*/React.createElement("g", {
- id: "face"
- }, /*#__PURE__*/React.createElement("path", {
- d: "M26.439,37.092l-11.313,-11.314l-2.829,2.829l11.314,11.313l2.828,-2.828Z",
- style: {
- fill: "#fff"
- }
- }), /*#__PURE__*/React.createElement("path", {
- d: "M39.874,18l-19.092,19.092l2.829,2.828l19.092,-19.092l-2.829,-2.828Z",
- style: {
- fill: "#fff"
- }
- })));
-}
-
-var ForwardRef = /*#__PURE__*/React.forwardRef(SvgSmileyPositive);
-export default __webpack_public_path__ + "static/media/smiley-positive.3d91069e.svg";
-export { ForwardRef as ReactComponent };
\ No newline at end of file
diff --git a/sources-gen/assets/svg/star-gray.svg.js b/sources-gen/assets/svg/star-gray.svg.js
deleted file mode 100644
index 081db05..0000000
--- a/sources-gen/assets/svg/star-gray.svg.js
+++ /dev/null
@@ -1,2 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-export default __webpack_public_path__ + "static/media/star-gray.84ad33dd.svg";
\ No newline at end of file
diff --git a/sources-gen/assets/svg/star-white.svg.js b/sources-gen/assets/svg/star-white.svg.js
deleted file mode 100644
index c8daaab..0000000
--- a/sources-gen/assets/svg/star-white.svg.js
+++ /dev/null
@@ -1,2 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-export default __webpack_public_path__ + "static/media/star-white.d32dc96a.svg";
\ No newline at end of file
diff --git a/sources-gen/assets/svg/tick.svg.js b/sources-gen/assets/svg/tick.svg.js
deleted file mode 100644
index 7efd211..0000000
--- a/sources-gen/assets/svg/tick.svg.js
+++ /dev/null
@@ -1,41 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
-
-function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
-
-function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
-
-import * as React from "react";
-
-var _ref2 = /*#__PURE__*/React.createElement("g", {
- fill: "none",
- fillRule: "evenodd"
-}, /*#__PURE__*/React.createElement("path", {
- d: "M-2.5-2.5h17v17h-17z"
-}), /*#__PURE__*/React.createElement("path", {
- fill: "#FFF",
- d: "M12.906 1.219C7.434 4.9 5.47 10.25 5.47 10.25H4.406S2.581 7.472.688 6.531l.53-1.062c2.089.469 3.72 1.593 3.72 1.593s1.78-3.61 7.437-6.906l.531 1.063z"
-}), /*#__PURE__*/React.createElement("path", {
- d: "M-4 16h20V-4H-4z"
-}));
-
-function SvgTick(_ref, svgRef) {
- var title = _ref.title,
- titleId = _ref.titleId,
- props = _objectWithoutProperties(_ref, ["title", "titleId"]);
-
- return /*#__PURE__*/React.createElement("svg", _extends({
- xmlns: "http://www.w3.org/2000/svg",
- width: 13,
- height: 11,
- viewBox: "0 0 13 11",
- ref: svgRef,
- "aria-labelledby": titleId
- }, props), title ? /*#__PURE__*/React.createElement("title", {
- id: titleId
- }, title) : null, _ref2);
-}
-
-var ForwardRef = /*#__PURE__*/React.forwardRef(SvgTick);
-export default __webpack_public_path__ + "static/media/tick.adf0c598.svg";
-export { ForwardRef as ReactComponent };
\ No newline at end of file
diff --git a/sources-gen/assets/svg/toggleableArrow.svg.js b/sources-gen/assets/svg/toggleableArrow.svg.js
deleted file mode 100644
index b15e737..0000000
--- a/sources-gen/assets/svg/toggleableArrow.svg.js
+++ /dev/null
@@ -1,37 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
-
-function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
-
-function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
-
-import * as React from "react";
-
-var _ref2 = /*#__PURE__*/React.createElement("g", {
- className: "arrowBox",
- fillRule: "evenodd"
-}, /*#__PURE__*/React.createElement("g", {
- className: "arrowArrow",
- transform: "translate(12, 12), rotate(0 0 0) scale(1.0)"
-}, /*#__PURE__*/React.createElement("polygon", {
- points: "12 -4.7125 0 4.9375 -12 -4.6875 -10.375 -5.5 0 0.125 10.375 -5.5"
-})));
-
-function SvgToggleableArrow(_ref, svgRef) {
- var title = _ref.title,
- titleId = _ref.titleId,
- props = _objectWithoutProperties(_ref, ["title", "titleId"]);
-
- return /*#__PURE__*/React.createElement("svg", _extends({
- viewBox: "0 0 24 24",
- xmlns: "http://www.w3.org/2000/svg",
- ref: svgRef,
- "aria-labelledby": titleId
- }, props), title ? /*#__PURE__*/React.createElement("title", {
- id: titleId
- }, title) : null, _ref2);
-}
-
-var ForwardRef = /*#__PURE__*/React.forwardRef(SvgToggleableArrow);
-export default __webpack_public_path__ + "static/media/toggleableArrow.a17a06a6.svg";
-export { ForwardRef as ReactComponent };
\ No newline at end of file
diff --git a/sources-gen/components/Accordion/Accordion.jsx b/sources-gen/components/Accordion/Accordion.jsx
deleted file mode 100644
index a39ffa9..0000000
--- a/sources-gen/components/Accordion/Accordion.jsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import styled from 'styled-components';
-import { StyledAccordionItem as AccordionItem } from './AccordionItem/AccordionItem';
-import { grammarOverviewColors } from '../../constants/grammarOverviewColors';
-
-export const Accordion = ({ className, data }) => {
- return (
-
- {data.map((accordionData, index) => (
-
- ))}
-
- );
-};
-
-export const StyledAccordion = styled(Accordion)`
- display: block;
-`;
diff --git a/sources-gen/components/Accordion/AccordionItem/AccordionItem.jsx b/sources-gen/components/Accordion/AccordionItem/AccordionItem.jsx
deleted file mode 100644
index f7a99f5..0000000
--- a/sources-gen/components/Accordion/AccordionItem/AccordionItem.jsx
+++ /dev/null
@@ -1,111 +0,0 @@
-import { useRef } from 'react';
-import styled from 'styled-components';
-import { Link } from 'react-router-dom';
-import { useToggle } from '../../../hooks/useToggle';
-import { colors, resolutions } from '../../../utils/css';
-import { StyledToggleableArrow as ToggleableArrow } from '../../ToggleableArrow/ToggleableArrow';
-import { I18nText } from '../../I18n/I18nText';
-import { getContentUrl } from '../../../utils/url/urlFactory';
-
-export const AccordionItem = ({ title, contents, className }) => {
- const element = useRef(null);
- const [isOpen, { toggleOnClick }] = useToggle();
- const height = element.current ? element.current.scrollHeight : '0';
- return (
-
-
-
-
-
-
- {contents.map(content => (
-
-
- {content.shortTitle}
-
-
- ))}
-
-
- );
-};
-
-export const StyledAccordionItem = styled(AccordionItem)`
- font-family: DWTheAntiquaB, Georgia, serif;
- font-weight: 400;
- font-size: 18px;
- line-height: 25px;
- text-align: left;
-
- display: flex;
- flex-direction: column;
- margin: 0px;
-
- .accordionItem-btn {
- display: flex;
- position: relative;
- width: 100%;
- padding: 20px;
- background-color: ${({ backgroundColor }) => backgroundColor};
- color: ${colors.LG_WHITE};
- cursor: pointer;
- align-items: center;
- border: none;
- :hover {
- background-color: ${colors.LG_GRAY_9};
- }
- :focus {
- color: ${colors.LG_BAHAMA_BLUE};
- text-decoration: underline;
- }
- }
-
- .toggleable-arrow {
- right: 18px;
- }
-`;
-
-export const AccordionItemContent = styled.div`
- max-height: ${({ isOpen, height }) => (isOpen ? height : '1')}px;
- overflow: hidden;
- background-color: ${colors.LG_WHITE};
- transition: max-height 0.7s;
-
- .accordionItem-text {
- font-size: 18px;
- line-height: 25px;
- border-bottom-width: 1px;
- border-bottom-style: solid;
- border-bottom-color: ${colors.LG_GRAY_12};
-
- a {
- color: ${colors.LG_GRAY_9};
- text-decoration: none;
- padding: 20px;
- display: block;
- &:hover {
- color: ${colors.LG_WHITE};
- background-color: ${colors.LG_GRAY_9};
- }
- }
-
- @media (max-width: ${resolutions.max.mobile}px) {
- font-size: 15px;
- line-height: 20px;
- }
- }
-`;
diff --git a/sources-gen/components/App.jsx b/sources-gen/components/App.jsx
deleted file mode 100644
index 1053932..0000000
--- a/sources-gen/components/App.jsx
+++ /dev/null
@@ -1,214 +0,0 @@
-import { Redirect, Route, Switch } from 'react-router-dom';
-import { useParams } from 'react-router';
-import { Default404Page } from '../pages/Default404Page';
-import { urlPrefixToType } from '../utils/url/url';
-import { CoursePage } from '../pages/CoursePage';
-import { GrammarPage } from '../pages/GrammarPage';
-import { DashboardPage } from '../pages/DashboardPage';
-import { GrammarOverviewPage } from '../pages/GrammarOverviewPage';
-import { pathPartials } from '../utils/url/pathAnalyser';
-import { LessonPage } from '../pages/LessonPage';
-import {
- PAGE_GRAMMAR,
- PAGE_LEGAL,
- PAGE_OVERVIEW,
- PAGE_PASSWORD_CHANGE,
- PAGE_PASSWORD_RESET,
- PAGE_PLACEMENT_TEST,
- PAGE_PROFILE,
- PAGE_REGISTRATION,
- PAGE_VOCABULARY,
- PAGE_VOCABULARY_TRAINER,
- PAGE_VOCABULARY_TRAINER_START,
- STATUS_FEEDBACK,
-} from '../utils/url/urlFactory';
-import { FEEDBACK_TYPES } from '../constants/feedback';
-import { RestrictedRoute } from './RestrictedRoute/RestrictedRoute';
-import { ConfirmUserRegistrationContainer } from './user/ConfirmUserRegistrationContainer';
-import { Registration } from './user/Registration';
-import { PasswordChange } from './user/PasswordChange';
-import { PasswordReset } from './user/PasswordReset';
-import { StatusFeedback } from './StatusFeedback/StatusFeedback';
-import { PageContainer, withPageContainerAndMetadata } from './Page/PageContainer';
-import { UserProfile } from './user/UserProfile';
-import { SetNewPassword } from './user/SetNewPassword';
-import { PlacementTestPage } from '../pages/PlacementTestPage';
-import { VocabularyTrainer } from './VocabularyTrainer/VocabularyTrainer';
-import { PlacementAndFinalTestResultPage } from '../pages/PlacementAndFinalTestResultPage';
-import { HelpPage } from '../pages/HelpPage';
-import { GTM_NO_CONTENT_PAGE_IDS, PAGE_TYPES } from '../constants/pageTypes';
-import { PageMetaData } from './Page/PageMetaData';
-import { LegalPage } from '../pages/LegalPage';
-import { VocabularyPage } from '../pages/VocabularyPage';
-import { GtmScriptWithDataLayer } from './GoogleTagManager';
-
-const typeToPage = {
- COURSE: {
- type: 'Course',
- component: CoursePage,
- },
- GRAMMAR: {
- type: 'Grammar',
- component: GrammarPage,
- },
- LESSON: {
- type: 'Lesson',
- component: LessonPage,
- },
- PLACEMENT: {
- type: 'Placement',
- component: PlacementAndFinalTestResultPage,
- },
- FINAL: {
- type: 'Final',
- component: PlacementAndFinalTestResultPage,
- },
-};
-
-export const ContentPage = () => {
- const params = useParams();
- const pageDef = typeToPage[urlPrefixToType(params.typeId)];
- const Tag = pageDef.component;
- return ;
-};
-
-export const App = () => (
-
- (
-
- )}
- />
-
-
-
-
-
-
-
-
- withPageContainerAndMetadata({
- component: Registration,
- pageType: PAGE_TYPES.REGISTER_USER,
- useDescriptionTranslation: true,
- })
- }
- />
- (
-
-
-
-
-
- )}
- />
- (
-
- )}
- />
-
- withPageContainerAndMetadata({
- component: UserProfile,
- pageType: PAGE_TYPES.USER_PROFILE,
- addDescriptionAndKeywordsMeta: false,
- })
- }
- feedbackType={FEEDBACK_TYPES.MISSING_USER_PROFILE}
- />
-
- withPageContainerAndMetadata({
- component: PasswordChange,
- pageType: PAGE_TYPES.PASSWORD_CHANGE,
- addDescriptionAndKeywordsMeta: false,
- })
- }
- />
-
- withPageContainerAndMetadata({
- component: VocabularyTrainer,
- pageType: PAGE_TYPES.VOCABULARY_TRAINER,
- addDescriptionAndKeywordsMeta: false,
- })
- }
- />
-
- withPageContainerAndMetadata({
- component: PasswordReset,
- pageType: PAGE_TYPES.PASSWORD_RESET,
- addDescriptionAndKeywordsMeta: false,
- })
- }
- />
-
- withPageContainerAndMetadata({
- component: StatusFeedback,
- pageType: PAGE_TYPES.FEEDBACK_STATUS,
- addDescriptionAndKeywordsMeta: false,
- })
- }
- />
-
-
-
-
-);
diff --git a/sources-gen/components/BurgerButton/BurgerButton.jsx b/sources-gen/components/BurgerButton/BurgerButton.jsx
deleted file mode 100644
index f393f26..0000000
--- a/sources-gen/components/BurgerButton/BurgerButton.jsx
+++ /dev/null
@@ -1,177 +0,0 @@
-import styled from 'styled-components';
-import { colors, resolutions } from '../../utils/css';
-import navCrossBlackMd from '../../assets/svg/nav-cross-black-md.svg';
-import navCrossBlackLg from '../../assets/svg/nav-cross-black-lg.svg';
-import navCrossXs from '../../assets/svg/nav-cross-xs.svg';
-import navCrossLg from '../../assets/svg/nav-cross-lg.svg';
-import { StyledIconBar as IconBar } from '../IconBar/IconBar';
-
-export const BurgerButton = ({
- isNavMenuOpen,
- toggleIsNavMenuOpen,
- setIsLanguageSubMenuOpen,
- className,
-}) => (
- {
- toggleIsNavMenuOpen();
- setIsLanguageSubMenuOpen(false);
- }}
- type="button"
- className={className}
- data-toggle="collapse"
- data-target="#nav-user-menu"
- aria-haspopup="true"
- aria-controls="navbar"
- aria-expanded={isNavMenuOpen}
- >
- {isNavMenuOpen && }
- Toggle navigation
-
- {!isNavMenuOpen && (
- <>
-
-
-
- >
- )}
-
-);
-
-const defaultHoverStyles = `
- &:hover {
- .close-menu {
- background: url(${navCrossXs});
- background-size: cover;
- }
- }
- &:hover {
- ${IconBar} {
- background-color: ${colors.LG_BLACK};
- }
- }
-`;
-
-/*
- CSS parsed by a string helper function to return css string with styling blocks as arguments,
- could not be tested with jest-styled-components.
- It reads the media option correctly (media: (hover:hover)). But it throws an unknown error.
- While using string templates passes with known media option.
-*/
-const mediaHoverDeviceDetection = `
- @media (hover: hover) and (pointer: fine) {
- ${defaultHoverStyles}
- }
- @media (hover: none) and (pointer: coarse) {
- ${defaultHoverStyles}
- }
-`;
-
-const closeMenuMobile = `
- height: 12px;
- width: 13px;
-`;
-
-const closeMenuTablet = `
- height: 21px;
- width: 22px;
-`;
-
-export const StyledBurgerButton = styled(BurgerButton)`
- z-index: 3000;
- display: block;
- position: fixed;
- background-color: transparent;
- background-image: none;
- padding: 0;
- /*! @noflip */
- right: 20px;
- top: 13px;
-
- border: none;
- border-radius: 0;
-
- -webkit-appearance: button;
- cursor: pointer;
-
- @media (max-width: ${resolutions.max.mobile}px) {
- top: 20px;
- &:hover {
- .close-menu {
- ${closeMenuMobile}
- }
- }
- }
-
- @media (min-width: ${resolutions.min.tablet}px) and (max-width: ${resolutions.max.tablet}px) {
- top: 28px;
- &:hover {
- .close-menu {
- ${closeMenuTablet}
- }
- }
- }
-
- @media (min-width: ${resolutions.min.desktop}px) {
- margin-top: 32px;
- z-index: 1;
- position: absolute;
- top: 0;
- /*! @noflip */
- right: 30px;
- }
-
- ${mediaHoverDeviceDetection}
-
- &:focus {
- outline: 0;
- .close-menu {
- background: url(${navCrossBlackLg});
- background-size: cover;
- }
- }
-
- .close-menu {
- background: url(${navCrossLg});
- display: block;
- height: 21px;
- margin-top: 5px;
- /*! @noflip */
- right: 15px;
- width: 22px;
-
- @media (max-width: ${resolutions.min.desktop}px) {
- background: url(${navCrossXs});
- height: 12px;
- width: 13px;
- }
-
- @media (min-width: ${resolutions.min.tablet}px) and (max-width: ${resolutions.max.tablet}px) {
- background: url(${navCrossBlackMd});
- height: 21px;
- margin-top: 5px;
- width: 22px;
- }
-
- @media (min-width: ${resolutions.min.desktop}px) {
- background: url(${navCrossBlackMd});
- height: 21px;
- margin-top: 0px;
- position: absolute;
- /*! @noflip */
- right: 0px;
- width: 22px;
- }
- }
-
- .screen-reader-only {
- border: none;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
- }
-`;
diff --git a/sources-gen/components/Checkbox/Checkbox.jsx b/sources-gen/components/Checkbox/Checkbox.jsx
deleted file mode 100644
index b43003b..0000000
--- a/sources-gen/components/Checkbox/Checkbox.jsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { hasErrorClassAssigner } from '../../utils/errorClassAssigner';
-import { getTranslatedValidationMessage } from '../../utils/validation/validationMessages';
-import { useI18nContext } from '../../context/I18nContext';
-
-export const Checkbox = ({
- name,
- labelText,
- validationErrorTranslationKey,
- register,
- validationError,
- ...restProps
-}) => {
- const { i18n } = useI18nContext();
-
- return (
-
-
-
-
-
-
- {labelText}
-
- {validationError && (
-
- {getTranslatedValidationMessage({
- name,
- validationErrorTranslationKey,
- validationType: validationError.type,
- t: i18n.t,
- })}
-
- )}
-
-
- );
-};
diff --git a/sources-gen/components/ContentContainer/AccordionContainer.jsx b/sources-gen/components/ContentContainer/AccordionContainer.jsx
deleted file mode 100644
index d0ea66e..0000000
--- a/sources-gen/components/ContentContainer/AccordionContainer.jsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import styled from 'styled-components';
-import { useRef } from 'react';
-import { useToggle } from '../../hooks/useToggle';
-import { StyledToggleableArrow as ToggleableArrow } from '../ToggleableArrow/ToggleableArrow';
-import { colors } from '../../utils/css';
-import { useTranslation } from '../../hooks/useTranslation';
-
-export const AccordionContainer = ({ title, children, className }) => {
- const titleTranslation = useTranslation(title);
-
- return (
-
-
-
-
- {titleTranslation}
-
-
-
-
- {children}
-
-
- );
-};
-
-export const AccordionContainerContent = styled.div`
- overflow: hidden;
- background-color: ${colors.LG_WHITE};
- transition: max-height 0.7s;
- margin-bottom: 20px;
-`;
-
-export const StyledAccordionContainer = styled(AccordionContainer)`
- button {
- outline: none;
- padding: 0;
- display: flex;
- position: relative;
- cursor: pointer;
- border: none;
- background-color: ${colors.LG_WHITE};
- width: 10em;
- }
- .toggleable-arrow {
- position: relative;
- top: 0.1em;
- margin-left: 0.2em;
- width: 20px;
- height: 17px;
- }
-`;
diff --git a/sources-gen/components/ContentContainer/AccordionContainer.jsx.orig b/sources-gen/components/ContentContainer/AccordionContainer.jsx.orig
deleted file mode 100644
index ed71204..0000000
--- a/sources-gen/components/ContentContainer/AccordionContainer.jsx.orig
+++ /dev/null
@@ -1,70 +0,0 @@
-import styled from 'styled-components';
-import { useRef } from 'react';
-import { useToggle } from '../../hooks/useToggle';
-import { StyledToggleableArrow as ToggleableArrow } from '../ToggleableArrow/ToggleableArrow';
-import { colors } from '../../utils/css';
-import { useTranslation } from '../../hooks/useTranslation';
-
-export const AccordionContainer = ({ title, children, className }) => {
- const element = useRef(null);
- const [isOpen, { toggleOnClick }] = useToggle();
- const height = element.current ? element.current.scrollHeight : '0';
- const titleTranslation = useTranslation(title);
-
- return (
-
-
-
-
-
- {titleTranslation}
-
-
-
-
-
-
- {children}
-
-
- );
-};
-
-export const AccordionContainerContent = styled.div`
- max-height: ${({ isOpen, height }) => (isOpen ? height : '1')}px;
- overflow: hidden;
- background-color: ${colors.LG_WHITE};
- transition: max-height 0.7s;
- margin-bottom: 20px;
-`;
-
-export const StyledAccordionContainer = styled(AccordionContainer)`
- button {
- outline: none;
- padding: 0;
- display: flex;
- position: relative;
- cursor: pointer;
- border: none;
- background-color: ${colors.LG_WHITE};
- width: 10em;
- }
- .toggleable-arrow {
- position: relative;
- top: 0.1em;
- margin-left: 0.2em;
- width: 20px;
- height: 17px;
- }
-`;
diff --git a/sources-gen/components/ContentContainer/ContentBottomLine/ContentBottomLine.jsx b/sources-gen/components/ContentContainer/ContentBottomLine/ContentBottomLine.jsx
deleted file mode 100644
index 6b382d0..0000000
--- a/sources-gen/components/ContentContainer/ContentBottomLine/ContentBottomLine.jsx
+++ /dev/null
@@ -1,5 +0,0 @@
-export const ContentBottomLine = () => (
-
-);
diff --git a/sources-gen/components/ContentContainer/ContentContainer.jsx b/sources-gen/components/ContentContainer/ContentContainer.jsx
deleted file mode 100644
index 58bae2b..0000000
--- a/sources-gen/components/ContentContainer/ContentContainer.jsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import { ContentNavTitle } from './ContentNavTitle/ContentNavTitle';
-
-export const ContentContainer = ({ title, children }) => (
-
-
- {children}
-
-
-);
diff --git a/sources-gen/components/ContentContainer/ContentHeadline/ContentHeadline.jsx b/sources-gen/components/ContentContainer/ContentHeadline/ContentHeadline.jsx
deleted file mode 100644
index 0a29f83..0000000
--- a/sources-gen/components/ContentContainer/ContentHeadline/ContentHeadline.jsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import classnames from 'classnames';
-
-export const ContentHeadline = ({ children, isStandalone = false }) => {
- return (
-
- );
-};
diff --git a/sources-gen/components/ContentContainer/ContentNavTitle/ContentNavTitle.jsx b/sources-gen/components/ContentContainer/ContentNavTitle/ContentNavTitle.jsx
deleted file mode 100644
index 012d553..0000000
--- a/sources-gen/components/ContentContainer/ContentNavTitle/ContentNavTitle.jsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import classnames from 'classnames';
-import { I18nText } from '../../I18n/I18nText';
-
-export const ContentNavTitle = ({ title, top, bottom }) => (
-
-);
diff --git a/sources-gen/components/ContentContainer/ContentSection/ContentSection.jsx b/sources-gen/components/ContentContainer/ContentSection/ContentSection.jsx
deleted file mode 100644
index d316eaa..0000000
--- a/sources-gen/components/ContentContainer/ContentSection/ContentSection.jsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { I18nText } from '../../I18n/I18nText';
-
-export const ContentSection = ({ title, children }) => (
- <>
-
-
- >
-);
diff --git a/sources-gen/components/Course/CourseHeroImage/CourseHeroImage.jsx b/sources-gen/components/Course/CourseHeroImage/CourseHeroImage.jsx
deleted file mode 100644
index 73162ba..0000000
--- a/sources-gen/components/Course/CourseHeroImage/CourseHeroImage.jsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import styled from 'styled-components';
-import { StyledHeroTemplate as HeroTemplate } from '../../HeroTemplate/HeroTemplate';
-import { resolutions } from '../../../utils/css';
-
-const determineImage = ({ imageId, imageBasePath }) => {
- return `${imageBasePath}/${imageId}`;
-};
-
-export const StyledCourseHeroImage = styled(HeroTemplate)`
- background: url(${determineImage}_509.jpg) center center / cover no-repeat;
- height: 320px;
-
- .content {
- width: 100%;
- padding: 0 20px;
- }
-
- .title {
- margin: 0;
- white-space: nowrap;
- overflow-x: hidden;
- text-overflow: ellipsis;
- }
-
- .identifier {
- text-transform: uppercase;
- font: 700 40px Helvetica, Arial, sans-serif;
- opacity: 0.5;
- }
-
- .description {
- /* @noflip */
- direction: ltr;
- font: 400 40px DWTheAntiquaB, Georgia, serif;
- opacity: 1;
- margin: 0 8px;
- }
-
- @media (max-width: ${resolutions.max.tablet}px) {
- .identifier,
- .description {
- font-size: 36px;
- }
- }
-
- @media (max-width: 992px) {
- background: url(${determineImage}_507.jpg) center center / cover no-repeat;
-
- .identifier,
- .description {
- font-size: 32px;
- }
- }
-
- @media (max-width: ${resolutions.max.mobile}px) {
- .identifier,
- .description {
- font-size: 28px;
- }
- }
-
- @media (max-width: 480px) {
- background: url(${determineImage}_503.jpg) center center / cover no-repeat;
- }
-
- @media (max-width: 360px) {
- background: url(${determineImage}_501.jpg) center center / cover no-repeat;
- }
-`;
diff --git a/sources-gen/components/Course/CourseList/CourseAccordion/CourseAccordion.jsx b/sources-gen/components/Course/CourseList/CourseAccordion/CourseAccordion.jsx
deleted file mode 100644
index e50375d..0000000
--- a/sources-gen/components/Course/CourseList/CourseAccordion/CourseAccordion.jsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { resolutions } from '../../../../utils/css';
-import { useToggle } from '../../../../hooks/useToggle';
-import { StyledCourseHeader as CourseHeader } from '../CourseHeader/CourseHeader';
-import { StyledLessonList as LessonList } from '../LessonList/LessonList';
-import globals from '../../../../utils/globals';
-
-export const CourseAccordion = ({ groupNameTranslationKey, groupedLessons, onClickReset }) => {
- const isOnDesktop = globals.window.innerWidth >= resolutions.min.desktop;
- const [isOpen, { toggleOnClick, toggleOnKeyPress }] = useToggle({ initialState: isOnDesktop });
-
- return (
-
-
-
-
- );
-};
diff --git a/sources-gen/components/Course/CourseList/CourseHeader/CourseHeader.jsx b/sources-gen/components/Course/CourseList/CourseHeader/CourseHeader.jsx
deleted file mode 100644
index ce176d8..0000000
--- a/sources-gen/components/Course/CourseList/CourseHeader/CourseHeader.jsx
+++ /dev/null
@@ -1,78 +0,0 @@
-import styled from 'styled-components';
-import classnames from 'classnames';
-import { I18nText } from '../../../I18n/I18nText';
-import { colors, resolutions } from '../../../../utils/css';
-import { StyledToggleableArrow as ToggleableArrow } from '../../../ToggleableArrow/ToggleableArrow';
-
-const CourseHeader = ({ className, groupNameTranslationKey, isOpen, onClick, onKeyPress }) => {
- return (
-
-
-
-
- );
-};
-
-export const StyledCourseHeader = styled(CourseHeader)`
- display: flex;
- justify-content: space-between;
- align-items: center;
- width: 100%;
- border-top: 1px solid ${colors.LG_GRAY_TRANSPARENT_1};
- height: 163px;
- pointer-events: none;
-
- .title {
- height: 25px;
- background-color: ${colors.LG_WHITE};
- color: ${colors.LG_GRAY_13};
- white-space: nowrap;
- overflow-x: hidden;
- text-overflow: ellipsis;
- font-family: Helvetica, Arial, sans-serif;
- font-weight: 700;
- font-size: 22px;
- line-height: 23px;
- margin: 0;
- padding: 0 20px;
- }
-
- .toggleable-arrow {
- display: none;
- }
-
- @media (max-width: ${resolutions.max.tablet}px) {
- height: 94px;
- pointer-events: all;
-
- .title {
- padding: 0 45px 0 20px;
- border-top: 0;
- }
-
- .toggleable-arrow {
- display: inline-block;
- right: 40px;
- }
- }
-`;
diff --git a/sources-gen/components/Course/CourseList/CourseList.jsx b/sources-gen/components/Course/CourseList/CourseList.jsx
deleted file mode 100644
index 993df13..0000000
--- a/sources-gen/components/Course/CourseList/CourseList.jsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import styled from 'styled-components';
-import { colors, resolutions } from '../../../utils/css';
-import { CourseAccordion } from './CourseAccordion/CourseAccordion';
-
-export const CourseList = ({ className, groupedLessons, onClickResetLesson }) => (
-
- {Object.keys(groupedLessons).map(key => (
- // group lessons by their group names
-
-
-
- ))}
-
-);
-
-export const StyledCourseList = styled(CourseList)`
- * {
- box-sizing: border-box;
- }
-
- display: grid;
- grid-template-columns: repeat(4, 1fr);
- width: 100%;
- list-style-type: none;
- margin: 0;
- padding: 0;
-
- .course {
- display: inline-block;
- background: ${colors.LG_WHITE};
-
- &:nth-child(odd) {
- .accordion .lesson-list {
- background-color: ${colors.LG_GRAY_3};
- }
- }
- }
-
- @media (max-width: ${resolutions.max.tablet}px) {
- grid-template-columns: 100%;
- }
-`;
diff --git a/sources-gen/components/Course/CourseList/LessionItem/LessonItem.jsx b/sources-gen/components/Course/CourseList/LessionItem/LessonItem.jsx
deleted file mode 100644
index 9a58f38..0000000
--- a/sources-gen/components/Course/CourseList/LessionItem/LessonItem.jsx
+++ /dev/null
@@ -1,120 +0,0 @@
-import styled from 'styled-components';
-import { Link } from 'react-router-dom';
-import { useSelector } from 'react-redux';
-import { StyledText as Text } from '../../../Text/Text';
-import { colors } from '../../../../utils/css';
-import { getContentUrl } from '../../../../utils/url/urlFactory';
-import { StyledLessonScore as LessonScore } from './LessonScore';
-import { StyledSmallProgressResetButton as ProgressResetButton } from '../../Progress/ProgressResetButton';
-import { LearnProgressIcon } from '../../../LearnProgressIcon/LearnProgressIcon';
-import { findLessonLearnProgressSelector } from '../../../../state/progress/learnProgressSelectors';
-
-export const LessonItem = ({ lesson, className, onClickReset }) => {
- const lessonId = lesson.id;
- const lessonProgress = useSelector(findLessonLearnProgressSelector(lessonId));
-
- const onHandleResetClick = e => {
- onClickReset(e, lessonId);
- };
-
- return (
- <>
-
-
- {lesson.shortTitle}
-
-
-
-
-
- {lesson.learningTargetHeadline}
-
- {lessonProgress && (
- <>
-
-
- >
- )}
-
- {lesson.grammarDescription}
-
-
- >
- );
-};
-
-const alignProgressData = '5px';
-
-export const StyledLessonItem = styled(LessonItem)`
- border-top: 1px solid ${colors.LG_GRAY_TRANSPARENT_1};
- color: ${colors.LG_GRAY_8};
- display: grid;
- font-size: 14px;
- grid-template-columns: 1fr auto;
- grid-template-rows: repeat(3, 1fr);
- height: 102px;
- padding: 10px 20px;
- overflow-y: hidden;
- text-decoration: none;
-
- &:hover {
- color: ${colors.LG_GRAY_8};
- text-decoration: none;
- }
-
- .title {
- color: ${colors.LG_GRAY_9};
- font-family: DWTheAntiquaBBold, Georgia-Bold, serif;
- font-size: 17px;
- line-height: 24px;
- margin: 0;
- overflow-x: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- .learningTarget,
- .categories {
- font-family: DWTheAntiquaB, Georgia, serif;
- overflow-x: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- .categories {
- grid-column: 1 / 2;
- }
-
- .tile-progress {
- display: flex;
- justify-content: flex-end;
- padding: 5px 0 0 0;
- padding-right: ${alignProgressData};
- }
-
- .lessonScore {
- grid-column-start: 2;
- justify-self: flex-end;
- padding-right: ${alignProgressData};
- }
-
- .resetButton {
- grid-column-start: 2;
- grid-row-start: 3;
- justify-self: center;
- }
-`;
diff --git a/sources-gen/components/Course/CourseList/LessionItem/LessonScore.jsx b/sources-gen/components/Course/CourseList/LessionItem/LessonScore.jsx
deleted file mode 100644
index d2b2442..0000000
--- a/sources-gen/components/Course/CourseList/LessionItem/LessonScore.jsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import styled from 'styled-components';
-import { colors } from '../../../../utils/css';
-import { calculatePercentage } from '../../../../utils/commons';
-
-export const LessonScore = ({ className, lessonProgress }) => {
- const { resultPoints, maxPointsForAllExercises } = lessonProgress;
-
- const resultPointsClassName = () => {
- const resultInPercentage = calculatePercentage(resultPoints, maxPointsForAllExercises);
-
- if (resultInPercentage >= 70) {
- return 'good';
- }
- if (resultInPercentage <= 40) {
- return 'low';
- }
- return 'mid';
- };
-
- return (
-
- {resultPoints}
- /
- {maxPointsForAllExercises}
-
- );
-};
-
-export const StyledLessonScore = styled(LessonScore)`
- font-size: 14px;
-
- .low {
- color: ${colors.LG_RED_SCORE};
- }
- .mid {
- color: ${colors.LG_GRAY_11};
- }
- .good {
- color: ${colors.LG_GREEN_SCORE};
- }
-`;
diff --git a/sources-gen/components/Course/CourseList/LessonList/LessonList.jsx b/sources-gen/components/Course/CourseList/LessonList/LessonList.jsx
deleted file mode 100644
index b6372fe..0000000
--- a/sources-gen/components/Course/CourseList/LessonList/LessonList.jsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import styled from 'styled-components';
-import classnames from 'classnames';
-import { colors, resolutions } from '../../../../utils/css';
-import { StyledLessonItem as LessonItem } from '../LessionItem/LessonItem';
-
-export const LessonList = ({ className, groupedLessons, onClickReset, isOpen = true }) => (
- // eslint-disable-next-line jsx-a11y/role-supports-aria-props
-
- {groupedLessons.map(lesson => (
-
-
-
- ))}
-
-);
-
-export const StyledLessonList = styled(LessonList)`
- transition: max-height 0.3s linear;
- overflow-y: hidden;
- visibility: visible;
- max-height: ${props => props.groupedLessons.length * 102}px;
- list-style-type: none;
- margin: 0;
- padding: 0;
-
- @media (max-width: ${resolutions.max.tablet}px) {
- background-color: ${colors.LG_GRAY_3};
-
- &:last-child {
- border-bottom: 0;
- }
-
- &.collapsed {
- visibility: hidden;
- max-height: 0;
- }
- }
-`;
diff --git a/sources-gen/components/Course/CourseOverview.jsx b/sources-gen/components/Course/CourseOverview.jsx
deleted file mode 100644
index 133abb4..0000000
--- a/sources-gen/components/Course/CourseOverview.jsx
+++ /dev/null
@@ -1,140 +0,0 @@
-import { useEffect, useState } from 'react';
-import { useDispatch } from 'react-redux';
-import { createGlobalStyle } from 'styled-components';
-import {
- groupBy,
- isFinalTestPredicate,
- removeContentLinksWithEmptyTarget,
-} from '../../utils/commons';
-import { useFrontendConfig } from '../../hooks/useFrontendConfig';
-import {
- deleteCourseProgress,
- deleteLessonProgress,
- initCourse,
- readCourseProgress,
- readLessonProgresses,
-} from '../../state/progress/learnProgressDuck';
-import { isMonolingualCourse } from '../../constants/isLtrContentOnly';
-import { StyledCourseHeroImage as CoursePageHeroImage } from './CourseHeroImage/CourseHeroImage';
-import { I18nText } from '../I18n/I18nText';
-import { StyledCourseList as CourseList } from './CourseList/CourseList';
-import { ModalIntegration } from '../Modal/ModalIntegration';
-import { ResetModal } from '../Modal/ResetModal';
-import { StyledCourseProgress as CourseProgress } from './Progress/CourseProgress';
-import { learningLevelMapper } from '../../utils/learningLevelUtils';
-
-export const LTRContentCourseOverviewStyle = createGlobalStyle`
- #courses {
- .title,
- span[aria-label*="lesson"] {
- /* @noflip */
- direction: ltr;
- }
- .content .title {
- /* @noflip */
- text-align: left;
- }
- }
-`;
-
-export const CourseOverview = ({ data, contentId }) => {
- const isMonoLingualCourse = isMonolingualCourse(contentId);
-
- const {
- name,
- dkLearningLevel,
- contentLinks: lessonContentLinks,
- mainContentImageLink,
- learningMetaInfo: { achievableScore, exerciseCount } = {},
- } = data.content;
- const filteredContentLinks = removeContentLinksWithEmptyTarget(lessonContentLinks);
- const finalLessonId = filteredContentLinks
- .filter(contentLink => isFinalTestPredicate(contentLink))
- .map(contentLink => contentLink.target.id);
- const allLessonIds = filteredContentLinks.map(contentLink => contentLink.target.id);
- const groupedLessons = groupBy('groupName', filteredContentLinks);
- const { imageBasePath } = useFrontendConfig();
- const [isResetModalOpen, setResetModalOpen] = useState(false);
- const [lessonIdToDelete, setLessonIdToDelete] = useState(null);
-
- const dispatch = useDispatch();
-
- useEffect(() => {
- dispatch(
- initCourse({
- allExerciseCount: exerciseCount,
- maxPointsForAllExercises: achievableScore,
- cosCourseId: contentId,
- }),
- );
- dispatch(readLessonProgresses(allLessonIds));
- dispatch(readCourseProgress(contentId));
- }, []); // eslint-disable-line react-hooks/exhaustive-deps
-
- const onClickResetCourse = () => {
- setResetModalOpen(true);
- };
-
- const onClickResetLesson = (e, lessonId) => {
- e.preventDefault();
- setLessonIdToDelete(lessonId);
- setResetModalOpen(true);
- };
-
- const onConfirmResetProgress = () => {
- if (lessonIdToDelete) {
- dispatch(deleteLessonProgress(lessonIdToDelete));
- setLessonIdToDelete(null);
- } else {
- dispatch(deleteCourseProgress(contentId));
- }
- setResetModalOpen(false);
- };
-
- const onCancelResetModal = () => {
- setLessonIdToDelete(null);
- setResetModalOpen(false);
- };
-
- return (
-
- {isMonoLingualCourse &&
}
-
-
-
-
-
-
-
-
-
-
-
- );
-};
diff --git a/sources-gen/components/Course/Progress/CourseProgress.jsx b/sources-gen/components/Course/Progress/CourseProgress.jsx
deleted file mode 100644
index b315461..0000000
--- a/sources-gen/components/Course/Progress/CourseProgress.jsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import styled from 'styled-components';
-import { useSelector } from 'react-redux';
-import { StyledProgressResetButton as ProgressResetButton } from './ProgressResetButton';
-import { LearnProgressIcon } from '../../LearnProgressIcon/LearnProgressIcon';
-import { findCourseLearnProgressSelector } from '../../../state/progress/learnProgressSelectors';
-
-export const CourseProgress = ({ className, courseId, finalLessonId, onClickResetCourse }) => {
- const { courseProgress } = useSelector(findCourseLearnProgressSelector(courseId));
-
- return (
-
- );
-};
-
-export const StyledCourseProgress = styled(CourseProgress)`
- display: flex;
- justify-content: flex-end;
- align-items: center;
- padding-right: 25px;
-
- > * {
- margin: 14px;
- }
-`;
diff --git a/sources-gen/components/Course/Progress/ProgressResetButton.jsx b/sources-gen/components/Course/Progress/ProgressResetButton.jsx
deleted file mode 100644
index 8df5e33..0000000
--- a/sources-gen/components/Course/Progress/ProgressResetButton.jsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import styled from 'styled-components';
-import { I18nText } from '../../I18n/I18nText';
-import { colors } from '../../../utils/css';
-
-export const ProgressResetButton = ({ className, onClickReset }) => {
- return (
- onClickReset(e)} className={className}>
-
-
- );
-};
-
-export const StyledProgressResetButton = styled(ProgressResetButton)`
- background-color: ${colors.LG_GRAY_2};
- border: 1px solid transparent;
- color: ${colors.LG_WHITE};
- font-size: 12px;
- min-height: 31px;
- padding: 3px 10px;
-`;
-
-export const StyledSmallProgressResetButton = styled(StyledProgressResetButton)`
- min-height: 27px;
- padding: 1px 7px;
-`;
diff --git a/sources-gen/components/Dashboard/Dashboard.jsx b/sources-gen/components/Dashboard/Dashboard.jsx
deleted file mode 100644
index 6db38bb..0000000
--- a/sources-gen/components/Dashboard/Dashboard.jsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { useEffect } from 'react';
-import { useDispatch } from 'react-redux';
-import { StyledMainHeroImage } from '../MainHeroImage/MainHeroImage';
-import { StyledTiles } from './Tiles/Tiles';
-import { I18nText } from '../I18n/I18nText';
-import { readCourseProgresses } from '../../state/progress/learnProgressDuck';
-
-export const Dashboard = ({ data }) => {
- const dispatch = useDispatch();
-
- useEffect(() => {
- const courseIds = data.map(course => course.id);
- dispatch(readCourseProgresses(courseIds));
- }, [data, dispatch]);
-
- return (
-
-
-
-
-
-
-
- );
-};
diff --git a/sources-gen/components/Dashboard/Tiles/Tile/BlankTile.jsx b/sources-gen/components/Dashboard/Tiles/Tile/BlankTile.jsx
deleted file mode 100644
index 40815ac..0000000
--- a/sources-gen/components/Dashboard/Tiles/Tile/BlankTile.jsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import styled from 'styled-components';
-import { colors, resolutions } from '../../../../utils/css';
-import { useRtlContext } from '../../../../hooks/useRtl';
-
-const BlankTile = ({ className }) => {
- const { isRtl } = useRtlContext();
- return
;
-};
-
-export const StyledBlankTile = styled(BlankTile)`
- border-top: 1px solid ${colors.LG_WHITE};
- border-right: 1px solid ${colors.LG_WHITE};
- background: ${colors.DW_LIGHT_BLUE};
- text-decoration: none;
-
- @media (max-width: ${resolutions.max.tablet}px) {
- height: 180px;
- width: 100%;
-
- &.rtl {
- border-right-width: 0;
- }
- }
-
- @media (max-width: ${resolutions.max.mobile}px) {
- display: none;
- }
-`;
diff --git a/sources-gen/components/Dashboard/Tiles/Tile/MoreCoursesTile.jsx b/sources-gen/components/Dashboard/Tiles/Tile/MoreCoursesTile.jsx
deleted file mode 100644
index bb852dd..0000000
--- a/sources-gen/components/Dashboard/Tiles/Tile/MoreCoursesTile.jsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import styled from 'styled-components';
-import { StyledTile as Tile } from './Tile';
-
-export const MoreCoursesTile = ({ className, backgroundColor }) => (
-
-);
-
-export const StyledMoreCoursesTile = styled(MoreCoursesTile)`
- .tile-progress {
- display: none;
- }
-`;
diff --git a/sources-gen/components/Dashboard/Tiles/Tile/Tile.jsx b/sources-gen/components/Dashboard/Tiles/Tile/Tile.jsx
deleted file mode 100644
index 6c6b49e..0000000
--- a/sources-gen/components/Dashboard/Tiles/Tile/Tile.jsx
+++ /dev/null
@@ -1,186 +0,0 @@
-import styled from 'styled-components';
-import gql from 'graphql-tag';
-import { Link } from 'react-router-dom';
-import { useSelector } from 'react-redux';
-import { colors, resolutions } from '../../../../utils/css';
-import { I18nText } from '../../../I18n/I18nText';
-import { learningLevelMapper } from '../../../../utils/learningLevelUtils';
-import { getContentUrl } from '../../../../utils/url/urlFactory';
-import { LearnProgressIcon } from '../../../LearnProgressIcon/LearnProgressIcon';
-import { findCourseLearnProgressSelector } from '../../../../state/progress/learnProgressSelectors';
-import { userSelector } from '../../../../state/user/userSelectors';
-import { progressIconColors } from '../../../ProgressIcon/progressIconColors';
-
-export const tileFragment = gql`
- fragment Tile on Course {
- id
- name
- language
- subTitle
- dkLearningLevel
- }
-`;
-
-export const Tile = ({ className, data }) => {
- const { dkLearningLevel, name, subTitle, id } = data;
- const { courseProgress } = useSelector(findCourseLearnProgressSelector(id));
- const { isLoggedIn } = useSelector(userSelector);
-
- return (
-
- {isLoggedIn && (
-
-
-
- )}
- {learningLevelMapper[dkLearningLevel]}
-
-
-
- );
-};
-
-const LinkWrapper = ({ children, linkData, className }) => {
- return linkData.href ? (
-
- {children}
-
- ) : (
-
- {children}
-
- );
-};
-
-export const StyledTile = styled(Tile)`
- --absElemOffset: 84px;
- padding: var(--absElemOffset) 20px 20px 20px;
- display: flex;
- flex-direction: column;
- width: 300px;
- height: 250px;
- box-sizing: border-box;
- position: relative;
- border-color: ${colors.LG_WHITE};
- border-style: solid;
- border-width: 1px 1px 0 0;
- background-color: ${({ backgroundColor }) => backgroundColor};
- color: ${colors.LG_WHITE};
-
- &:nth-child(4n) {
- border-right-width: 0;
- }
-
- &.tile-container {
- text-decoration: none;
- :hover,
- :active,
- :focus {
- color: ${colors.LG_TRANSPARENT_WHITE_50};
- }
- }
-
- .tile-learningLevel {
- font: 400 70px / var(--absElemOffset) Helvetica, Arial, sans-serif;
- height: var(--absElemOffset);
- text-align: start;
- margin: 0;
- padding: 0;
- position: absolute;
- top: 0;
- }
-
- .tile-name {
- font: 400 23px/25px DWTheAntiquaBBold, Georgia, serif;
- margin: 0 0 7px;
- width: 100%;
- }
-
- .tile-subTitle {
- font: 400 16px/25px DWTheAntiquaB, Georgia, serif;
- max-height: 60%;
- opacity: 0.9;
- max-width: 95%;
- }
-
- .tile-progress {
- position: absolute;
- top: 0;
- padding-top: 20px;
- width: calc(100% - 40px);
- height: var(--absElemOffset);
- display: flex;
- justify-content: flex-end;
- }
-
- @media (max-width: ${resolutions.max.tablet}px) {
- --absElemOffset: 64px;
- height: 180px;
- width: 100%;
- border-width: 1px 1px 0 0;
-
- &:nth-child(2n) {
- border-right-width: 0;
- }
-
- .tile-learningLevel {
- font: 400 54px/64px Helvetica, Arial, sans-serif;
- height: var(--absElemOffset);
- }
-
- .tile-name {
- font-size: 22px;
- }
-
- .tile-subTitle {
- font-size: 15px;
- }
-
- .tile-progress {
- height: var(--absElemOffset);
- padding-top: 15px;
- }
- }
-
- @media (max-width: ${resolutions.max.mobile}px) {
- height: 90px;
- padding: 10px;
- border-width: 1px 0 0 0;
- justify-content: center;
-
- .tile-learningLevel {
- line-height: 90px;
- font-size: 36px;
- width: 58px;
- height: 90px;
- margin: 0 0 0 6px;
- }
-
- .tile-name {
- position: relative;
- font-size: 17px;
- line-height: 19px;
- font-weight: 400;
- margin: 0 25px 3px 64px;
- width: calc(100% - 89px);
- }
-
- .tile-subTitle {
- font-size: 14px;
- font-weight: 400;
- line-height: 19px;
- flex-direction: row;
- margin: 0 25px 0 64px;
- width: calc(100% - 89px);
- }
-
- .tile-progress {
- width: calc(100% - 20px);
- }
- }
-`;
diff --git a/sources-gen/components/Dashboard/Tiles/Tiles.jsx b/sources-gen/components/Dashboard/Tiles/Tiles.jsx
deleted file mode 100644
index 05533c9..0000000
--- a/sources-gen/components/Dashboard/Tiles/Tiles.jsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import { Fragment } from 'react';
-import styled from 'styled-components';
-import { colors, resolutions } from '../../../utils/css';
-import { StyledTile as Tile } from './Tile/Tile';
-import { StyledBlankTile as BlankTile } from './Tile/BlankTile';
-import { StyledMoreCoursesTile as MoreCoursesTile } from './Tile/MoreCoursesTile';
-import { tileColors } from '../../../constants/tileColors';
-import { uniqueId } from '../../../utils/htmlUtils';
-
-export const Tiles = ({ className, data }) => {
- return (
-
- {data.map((tileData, index) => {
- const tileElement = (
-
- );
- // check if the number of the fetched tiles is even and if it is,
- // then add a blank tile as penultimate
- return data.length % 2 === 0 && data.indexOf(tileData) === data.length - 1 ? (
-
- {tileElement}
-
-
- ) : (
- tileElement
- );
- })}
-
-
- );
-};
-
-export const StyledTiles = styled(Tiles)`
- display: grid;
- grid-template-columns: repeat(4, 1fr);
- width: 100%;
- min-height: 500px;
- border-bottom: 1px solid ${colors.LG_WHITE};
-
- @media (min-width: ${resolutions.min.desktop}px) {
- width: 1200px;
- }
-
- @media (max-width: ${resolutions.max.tablet}px) {
- grid-template-columns: repeat(2, 1fr);
- }
-
- @media (max-width: ${resolutions.max.mobile}px) {
- grid-template-columns: 1fr;
- width: 100%;
- }
-`;
diff --git a/sources-gen/components/DwPicture/DwPicture.jsx b/sources-gen/components/DwPicture/DwPicture.jsx
deleted file mode 100644
index fc5d5da..0000000
--- a/sources-gen/components/DwPicture/DwPicture.jsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { useFrontendConfig } from '../../hooks/useFrontendConfig';
-import { imgWithFormatFn, format } from '../../utils/imgUtils';
-import { resolutions } from '../../utils/css';
-import { Picture } from '../Picture/Picture';
-
-export const DwPicture = ({ imageId, ...inProps }) => {
- const { imageBasePath } = useFrontendConfig();
-
- const imgWithFormat = imgWithFormatFn(imageId, imageBasePath);
-
- const defaultProps = {
- fallbackUrl: imgWithFormat(format.full),
- sources: [
- {
- media: `(min-width: ${resolutions.min.full}px)`,
- srcSet: imgWithFormat(format.full),
- },
- {
- media: `(min-width: ${resolutions.min.tabletLandscape}px)`,
- srcSet: imgWithFormat(format.lg),
- },
- {
- media: `(min-width: ${resolutions.min.tablet}px)`,
- srcSet: imgWithFormat(format.md),
- },
- {
- media: `(min-width: ${resolutions.min.mobile}px)`,
- srcSet: imgWithFormat(format.sm),
- },
- ],
- };
-
- const props = { ...defaultProps, ...inProps };
-
- return ;
-};
diff --git a/sources-gen/components/Footer/Footer.jsx b/sources-gen/components/Footer/Footer.jsx
deleted file mode 100644
index ef2c8e3..0000000
--- a/sources-gen/components/Footer/Footer.jsx
+++ /dev/null
@@ -1,168 +0,0 @@
-import styled from 'styled-components';
-import gql from 'graphql-tag';
-import { useParams } from 'react-router-dom';
-import { colors, resolutions } from '../../utils/css';
-import { I18nText } from '../I18n/I18nText';
-import {
- getDwContactUrl,
- getDwUrlWithLang,
- getFooterLinkForNamedUrl,
- getLegalUrl,
-} from '../../utils/url/urlFactory';
-import { useRtlContext } from '../../hooks/useRtl';
-import { legalFragment } from '../LegalNotice/LegalNotice';
-
-export const footerFragment = {
- name: 'Footer',
- fragment() {
- return gql`fragment ${this.name} on Query {
- footer(lang: $lang) {
- accessibility(appName: "mdl") {
- namedUrl
- }
- policy(appName: "mdl") {
- namedUrl
- }
- ${legalFragment.partial()}
- }
- }
- `;
- },
-};
-
-export const Footer = ({ className, data }) => {
- const { isRtl } = useRtlContext();
- const { langCode } = useParams();
-
- const rtlClass = isRtl ? 'rtl' : '';
- return (
-
-
- {footerData({ langCode, data }).map(footerObject => (
-
-
-
- ))}
-
-
- );
-};
-
-const footerData = ({ langCode, data }) => [
- {
- translation: {
- key: 'footer.copyright',
- parameters: { first: new Date().getFullYear() },
- },
- id: 0,
- aria: 'footer.copyright',
- role: 'Firm name',
- },
- {
- translation: 'footer.dw',
- id: 1,
- href: getDwUrlWithLang({ langCode }),
- target: '_blank',
- aria: 'footer.dw',
- role: 'link',
- },
- {
- translation: 'footer.privacyPolicy',
- id: 2,
- href: getFooterLinkForNamedUrl({ namedUrl: data.footer.policy.namedUrl }),
- target: '_blank',
- aria: 'footer.privacyPolicy',
- role: 'link',
- },
- {
- translation: 'footer.accessibility',
- id: 3,
- href: getFooterLinkForNamedUrl({ namedUrl: data.footer.accessibility.namedUrl }),
- target: '_blank',
- aria: 'footer.accessibility',
- role: 'link',
- },
- {
- translation: 'footer.legal',
- id: 4,
- href: getLegalUrl(langCode),
- target: '',
- aria: 'footer.legal',
- role: 'link',
- },
- {
- translation: 'footer.contact',
- id: 5,
- href: getDwContactUrl(),
- target: '_blank',
- aria: 'footer.contact',
- role: 'link',
- },
-];
-
-export const StyledFooter = styled(Footer)`
- box-sizing: border-box;
- display: flex;
- flex-wrap: wrap;
- flex-direction: row;
- align-items: center;
- width: 100%;
- min-height: 90px;
- font-family: Helvetica, Arial, sans-serif;
- line-height: 45px;
- margin: 20px 0;
- background: ${colors.LG_BLUE_7};
-
- ul {
- display: flex;
- flex-flow: row wrap;
- flex-direction: row;
- max-width: 100%;
- list-style-type: none;
- padding: 10px 0;
- text-align: center;
- margin: 0;
- }
-
- li {
- margin-right: 12px;
- padding: 0 0 0 12px;
-
- &.rtl {
- direction: rtl;
- }
- }
-
- .footer-link {
- text-decoration: none;
- font-size: 15px;
- color: ${colors.LG_BLUE_4};
- background-color: transparent;
- :hover,
- :active,
- :focus {
- color: ${colors.LG_WHITE};
- }
- }
-
- @media (max-width: ${resolutions.max.tablet}px) {
- margin: 0;
- }
-
- @media (max-width: ${resolutions.max.mobile}px) {
- max-width: 100%;
- min-height: 65px;
-
- ul {
- justify-content: center;
- }
- }
-`;
diff --git a/sources-gen/components/GdprLayer/BrowserOnly.jsx b/sources-gen/components/GdprLayer/BrowserOnly.jsx
deleted file mode 100644
index 6555ce3..0000000
--- a/sources-gen/components/GdprLayer/BrowserOnly.jsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import { isServer } from '../../utils/ssr';
-
-export const BrowserOnly = ({ children, ...restProps }) => (
- {!isServer() && children}
-);
diff --git a/sources-gen/components/GdprLayer/GdprLayer.jsx b/sources-gen/components/GdprLayer/GdprLayer.jsx
deleted file mode 100644
index b3adb37..0000000
--- a/sources-gen/components/GdprLayer/GdprLayer.jsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { useSelector } from 'react-redux';
-import config from '../../config';
-import { userSelector } from '../../state/user/userSelectors';
-import { useLocalStorage } from '../../hooks/useLocalStorage';
-import { I18nText } from '../I18n/I18nText';
-import { BrowserOnly } from './BrowserOnly';
-
-export const GdprLayer = ({ footerData }) => {
- const { isLoggedIn } = useSelector(userSelector);
- const [hasAcceptedGdpr, setHasAcceptedGdpr] = useLocalStorage('hasAcceptedGdpr');
- const { namedUrl } = footerData.footer.policy || {};
-
- if (isLoggedIn || hasAcceptedGdpr) {
- return null;
- }
-
- return (
-
-
-
-
-
-
-
-
- setHasAcceptedGdpr(true)}
- />
-
-
-
-
- );
-};
diff --git a/sources-gen/components/GoogleTagManager/GtmDataLayer.jsx b/sources-gen/components/GoogleTagManager/GtmDataLayer.jsx
deleted file mode 100644
index 80aa964..0000000
--- a/sources-gen/components/GoogleTagManager/GtmDataLayer.jsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import { Helmet } from 'react-helmet-async';
-import { GtmNoScriptFallback } from './GtmNoScriptFallback';
-import { useStaticInfoForGtm } from './hooks/useStaticInfoForGtm';
-import { gtmDataLayerPartial, TrackingUtils } from './TrackingUtils';
-import { useCourseData } from '../../hooks/useCourseData';
-
-export const gtmDataLayerFragment = gtmDataLayerPartial;
-
-export const GtmDataLayer = ({ content, noContentPageId, push = false }) => {
- const { gtmLevel1Id: level1Id, macaParam, pageUrl } = useStaticInfoForGtm();
- const { courseId } = useCourseData();
-
- const dataLayer = TrackingUtils.generateDataLayer({
- content,
- macaParam,
- level1Id,
- pageUrl,
- courseId,
- noContentPageId,
- });
-
- if (push) {
- TrackingUtils.pushToGoogleTagManager({
- withReset: true,
- datalayerObj: {
- event: 'onPageChange',
- ...dataLayer,
- },
- });
- }
-
- return (
- <>
-
-
-
-
- >
- );
-};
diff --git a/sources-gen/components/GoogleTagManager/GtmLoadScript.jsx b/sources-gen/components/GoogleTagManager/GtmLoadScript.jsx
deleted file mode 100644
index 7d29838..0000000
--- a/sources-gen/components/GoogleTagManager/GtmLoadScript.jsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { Helmet } from 'react-helmet-async';
-import { useFrontendConfig } from '../../hooks/useFrontendConfig';
-
-export const GtmLoadScript = () => (
-
-
-
-);
diff --git a/sources-gen/components/GoogleTagManager/GtmNoScriptFallback.jsx b/sources-gen/components/GoogleTagManager/GtmNoScriptFallback.jsx
deleted file mode 100644
index cc570b8..0000000
--- a/sources-gen/components/GoogleTagManager/GtmNoScriptFallback.jsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { objectToQueryParams } from '../../utils/url/url';
-import { useFrontendConfig } from '../../hooks/useFrontendConfig';
-
-export const GtmNoScriptFallback = ({ dataLayer }) => {
- const hideIframeStyles = {
- display: 'none',
- visibility: 'hidden',
- };
- const { gtmId } = useFrontendConfig();
- return (
-
-
-
- );
-};
diff --git a/sources-gen/components/GoogleTagManager/GtmScriptWithDataLayer.jsx b/sources-gen/components/GoogleTagManager/GtmScriptWithDataLayer.jsx
deleted file mode 100644
index ae5f429..0000000
--- a/sources-gen/components/GoogleTagManager/GtmScriptWithDataLayer.jsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { isServer } from '../../utils/ssr';
-import globals from '../../utils/globals';
-
-import { GtmLoadScript } from './GtmLoadScript';
-import { GtmDataLayer } from './GtmDataLayer';
-
-export { gtmDataLayerFragment } from './GtmDataLayer';
-
-export const GtmScriptWithDataLayer = ({ content = {}, noContentPageId }) => {
- const isGtmAlreadyInitialized = !isServer() && !!globals.window.dataLayer;
- return (
- <>
-
- {!isGtmAlreadyInitialized && }
- >
- );
-};
diff --git a/sources-gen/components/GoogleTagManager/TrackingUtils.jsx b/sources-gen/components/GoogleTagManager/TrackingUtils.jsx
deleted file mode 100644
index 0d929d0..0000000
--- a/sources-gen/components/GoogleTagManager/TrackingUtils.jsx
+++ /dev/null
@@ -1,139 +0,0 @@
-import gql from 'graphql-tag';
-import globals from '../../utils/globals';
-
-const isValidList = list => list?.length > 0;
-
-const addCurrentNavToRootList = ({ nav }) => [...nav.navsToRoot, nav];
-
-// eslint-disable-next-line no-underscore-dangle
-const contentTitle = content => (content.__typename === 'Person' ? content.fullName : content.name);
-
-const pickCategoryName = ({ navs, index }) => (navs[index] || {}).name;
-
-export const gtmDataLayerPartial = {
- name: 'GtmDataLayer',
- partial() {
- return `
- ...on ModelAspect {
- id
- gtmLanguageCode
- gtmContentType
- }
- ...on DeliveryAspect {
- gtmContentDate
- }
- ...on NamedAspect {
- name
- }
- ...on AssociationsAspect {
- navigations {
- id
- name
- navsToRoot {
- name
- }
- }
- subjects {
- name
- }
- topics:categories {
- originId
- }
- departments {
- name
- }
- }
- `;
- },
-};
-
-export const mediaInfoForTrackingFragment = {
- name: 'MediaInfoForTrackingFragment',
- fragment({ type }) {
- return gql`fragment ${this.name} on ${type} {
- videos {
- ${gtmDataLayerPartial.partial()}
- }
- audios {
- ${gtmDataLayerPartial.partial()}
- }
- }
- `;
- },
-};
-
-export const generateContentGtmInfo = ({
- content,
- level1Id,
- macaParam,
- pageUrl,
- courseId,
- noContentPageId,
-}) => {
- const navs = isValidList(content.navigations) ? content.navigations : [{ navsToRoot: [] }];
- const alignedNavs = addCurrentNavToRootList({ nav: navs[0] });
-
- return {
- categoryLevel1: pickCategoryName({ navs: alignedNavs, index: 0 }),
- categoryLevel2: pickCategoryName({ navs: alignedNavs, index: 1 }),
- categoryLevel3: pickCategoryName({ navs: alignedNavs, index: 2 }),
- contentTitle: contentTitle(content),
- contentLanguage: content.gtmLanguageCode,
- pageOID: content.id,
- contentType: content.gtmContentType,
- date: content.gtmContentDate,
- subject: content.subjects ? content.subjects[0]?.name : {},
- topicIds: content.topics?.map(topic => topic.originId),
- pageSID: navs[0].id,
- departmentName: content.departments ? content.departments[0]?.name : {},
- categoryType: 1,
- displayForm: 5,
- level1ID: level1Id,
- macaParam,
- pageUrl,
- courseId,
- noContentPageId,
- };
-};
-
-export const TrackingUtils = {
- initDataLayerScript: datalayer => {
- const initialDataLayer = {
- ...datalayer,
- event: 'onPageChange',
- };
-
- return `
- if(!window.dataLayer) {
- window.dataLayer = [${JSON.stringify(initialDataLayer)}]
- };`.trim();
- },
- generateDataLayer: ({ content, level1Id, macaParam, pageUrl, courseId, noContentPageId }) => ({
- pageData: {
- ...generateContentGtmInfo({
- content,
- level1Id,
- macaParam,
- pageUrl,
- courseId,
- noContentPageId,
- }),
- embeddings: {},
- },
- }),
- pushToGoogleTagManager: ({ datalayerObj, withReset = false }) => {
- setTimeout(() => {
- if (withReset) {
- TrackingUtils.resetDataLayer();
- }
- // eslint-disable-next-line fp/no-mutating-methods
- globals.window.dataLayer?.push(datalayerObj);
- }, 0);
- },
- resetDataLayer: () => {
- // eslint-disable-next-line fp/no-mutating-methods
- globals.window.dataLayer.push(function dontUseArrowFunction() {
- this.reset();
- });
- },
-};
diff --git a/sources-gen/components/GoogleTagManager/hooks/useAddEmbeddingsToGtm.jsx b/sources-gen/components/GoogleTagManager/hooks/useAddEmbeddingsToGtm.jsx
deleted file mode 100644
index b7cc4d5..0000000
--- a/sources-gen/components/GoogleTagManager/hooks/useAddEmbeddingsToGtm.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { useEffect } from 'react';
-import { TrackingUtils } from '../TrackingUtils';
-
-const eventName = 'addEmbeddings';
-
-export const useAddEmbeddingsToGtm = ({ dictionary }) => {
- useEffect(() => {
- TrackingUtils.pushToGoogleTagManager({
- datalayerObj: {
- event: eventName,
- pageData: {
- embeddings: dictionary,
- },
- },
- });
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, []);
-};
diff --git a/sources-gen/components/GoogleTagManager/hooks/useMediaTracking.jsx b/sources-gen/components/GoogleTagManager/hooks/useMediaTracking.jsx
deleted file mode 100644
index fbd8132..0000000
--- a/sources-gen/components/GoogleTagManager/hooks/useMediaTracking.jsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { useStaticInfoForGtm } from './useStaticInfoForGtm';
-import { generateContentGtmInfo } from '../TrackingUtils';
-import { useAddEmbeddingsToGtm } from './useAddEmbeddingsToGtm';
-
-export const useMediaTracking = content => {
- const { level1Id, macaParam, pageUrl } = useStaticInfoForGtm();
- const contentDictionary = {
- [content.id]: generateContentGtmInfo({
- content,
- level1Id,
- macaParam,
- pageUrl,
- }),
- };
-
- useAddEmbeddingsToGtm({ dictionary: contentDictionary });
-};
diff --git a/sources-gen/components/GoogleTagManager/hooks/useMediaTracking.jsx.orig b/sources-gen/components/GoogleTagManager/hooks/useMediaTracking.jsx.orig
deleted file mode 100644
index fbd8132..0000000
--- a/sources-gen/components/GoogleTagManager/hooks/useMediaTracking.jsx.orig
+++ /dev/null
@@ -1,17 +0,0 @@
-import { useStaticInfoForGtm } from './useStaticInfoForGtm';
-import { generateContentGtmInfo } from '../TrackingUtils';
-import { useAddEmbeddingsToGtm } from './useAddEmbeddingsToGtm';
-
-export const useMediaTracking = content => {
- const { level1Id, macaParam, pageUrl } = useStaticInfoForGtm();
- const contentDictionary = {
- [content.id]: generateContentGtmInfo({
- content,
- level1Id,
- macaParam,
- pageUrl,
- }),
- };
-
- useAddEmbeddingsToGtm({ dictionary: contentDictionary });
-};
diff --git a/sources-gen/components/GoogleTagManager/hooks/useStaticInfoForGtm.jsx b/sources-gen/components/GoogleTagManager/hooks/useStaticInfoForGtm.jsx
deleted file mode 100644
index 2c60cd2..0000000
--- a/sources-gen/components/GoogleTagManager/hooks/useStaticInfoForGtm.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { useGlobalsContext } from '../../../context/GlobalsContext';
-import { useLocationQueryParam } from '../../../hooks/useLocationQueryParam';
-import { useFrontendConfig } from '../../../hooks/useFrontendConfig';
-
-export const useStaticInfoForGtm = () => {
- const pageUrl = useGlobalsContext().window.location.href.split('?')[0];
- const macaParam = useLocationQueryParam('maca');
- const { gtmLevel1Id } = useFrontendConfig();
-
- return { gtmLevel1Id, macaParam, pageUrl };
-};
diff --git a/sources-gen/components/GoogleTagManager/index.jsx b/sources-gen/components/GoogleTagManager/index.jsx
deleted file mode 100644
index 22a0fc4..0000000
--- a/sources-gen/components/GoogleTagManager/index.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import { memo } from 'react';
-import { GtmScriptWithDataLayer as NotMemoGtmScriptWithDataLayer } from './GtmScriptWithDataLayer';
-
-export { gtmDataLayerFragment } from './GtmScriptWithDataLayer';
-
-export const GtmScriptWithDataLayer = memo(NotMemoGtmScriptWithDataLayer);
diff --git a/sources-gen/components/GrammarItem/GrammarItem.jsx b/sources-gen/components/GrammarItem/GrammarItem.jsx
deleted file mode 100644
index 9d3f803..0000000
--- a/sources-gen/components/GrammarItem/GrammarItem.jsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { wrapTablesWithDiv } from '../../utils/replacers/htmlReplacer';
-import { useKnowledgePlaceholderReplacementEffect } from '../Modal/KnowledgeModal/useKnowledgePlaceholderReplacementEffect';
-import { WithRenderDelay } from '../WithRenderDelay/WithRenderDelay';
-import { replacePlaceholderImagesWithResponsivePictures } from '../../utils/replacers/imageReplacer';
-import { RichText } from '../RichText/RichText';
-import { ContentHeadline } from '../ContentContainer/ContentHeadline/ContentHeadline';
-
-export const GrammarItem = ({ data }) => {
- const { name, text, knowledges } = data.content;
- const markup = wrapTablesWithDiv(text);
-
- useKnowledgePlaceholderReplacementEffect({ knowledges });
-
- return (
-
- );
-};
diff --git a/sources-gen/components/GrammarOverview/GrammarOverview.jsx b/sources-gen/components/GrammarOverview/GrammarOverview.jsx
deleted file mode 100644
index 0e53f75..0000000
--- a/sources-gen/components/GrammarOverview/GrammarOverview.jsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { StyledGrammarOverviewHeader as GrammarOverviewHeader } from './GrammarOverviewHeader';
-import { StyledAccordion as Accordion } from '../Accordion/Accordion';
-
-const removeEmptyGrammars = data =>
- Object.values(data.grammarOverview).filter(
- item => Array.isArray(item.grammars) && item.grammars.length,
- );
-
-export const GrammarOverview = data => (
- <>
-
-
- >
-);
diff --git a/sources-gen/components/GrammarOverview/GrammarOverviewHeader.jsx b/sources-gen/components/GrammarOverview/GrammarOverviewHeader.jsx
deleted file mode 100644
index 5cd8be7..0000000
--- a/sources-gen/components/GrammarOverview/GrammarOverviewHeader.jsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import styled from 'styled-components';
-import { I18nText } from '../I18n/I18nText';
-import { colors, resolutions } from '../../utils/css';
-
-export const GrammarOverviewHeader = ({ className }) => {
- return (
-
- );
-};
-
-export const StyledGrammarOverviewHeader = styled(GrammarOverviewHeader)`
- display: block;
- width: 100%;
- background-color: ${colors.LG_GRAY_3};
- color: ${colors.LG_GRAY_9};
-
- .grammarOverviewHeader-wrapper {
- height: 320px;
- display: flex;
- flex-direction: column;
- justify-content: space-between;
-
- h1 {
- padding: 125px 20px 0 20px;
- margin: 20px 0 10px;
- }
-
- p {
- padding: 0 20px 10px;
- margin: 0 0 10px;
- }
- }
-
- @media (min-width: ${resolutions.min.desktop}px) {
- margin-bottom: 20px;
- }
-
- @media (max-width: ${resolutions.max.mobile}px) {
- .grammarOverviewHeader-wrapper {
- height: 240px;
-
- h1 {
- padding: 78px 20px 0 20px;
- }
- }
- }
-`;
diff --git a/sources-gen/components/Header/ChineseVariantSwitch.jsx b/sources-gen/components/Header/ChineseVariantSwitch.jsx
deleted file mode 100644
index 0b93eed..0000000
--- a/sources-gen/components/Header/ChineseVariantSwitch.jsx
+++ /dev/null
@@ -1,58 +0,0 @@
-import styled from 'styled-components';
-import { useChineseSimpleTraditionalSwitch } from '../../hooks/useChineseSimpleTraditionalSwitch';
-import { colors } from '../../utils/css';
-
-// @VisibleForTesting
-export const toggleButtonId = 'zh-convert';
-
-export const ChineseVariantSwitch = ({ className, langCode }) => {
- const { isTraditionalChin, trans2Simple, trans2Traditional } = useChineseSimpleTraditionalSwitch(
- langCode,
- toggleButtonId,
- );
-
- const transFunction = isTraditionalChin ? trans2Simple : trans2Traditional;
-
- return ;
-};
-
-export const StyledChineseVariantSwitch = styled(ChineseVariantSwitch)`
- background-color: ${colors.LG_WHITE};
- padding: 9px 0;
- margin-right: 0;
- position: absolute;
- right: 43px;
- top: 11px;
- z-index: 10000;
- color: ${colors.LG_BLUE_6};
- text-decoration: none;
- border: none;
-
- @media (max-width: 767px) {
- margin-top: 0;
- margin-right: 10px;
- }
-
- @media (max-width: 1200px) {
- margin-right: 0;
- }
-
- @media (max-width: 1199px) and (min-width: 768px) {
- top: 25px;
- margin-right: 30px;
- font-size: 30px;
- }
-
- @media (min-width: 1200px) {
- background-color: ${colors.DW_LIGHT_BLUE};
- z-index: 1;
- display: block;
- float: right;
- padding: 24px 0;
- margin-right: 26px;
- margin-bottom: 4px;
- font-size: 30px;
- text-decoration: none;
- color: ${colors.LG_WHITE};
- }
-`;
diff --git a/sources-gen/components/Header/DesktopBanner.jsx b/sources-gen/components/Header/DesktopBanner.jsx
deleted file mode 100644
index 93fe1af..0000000
--- a/sources-gen/components/Header/DesktopBanner.jsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import styled from 'styled-components';
-import { resolutions } from '../../utils/css';
-import { StyledLogo as Logo } from '../Logo/Logo';
-
-export const DesktopBanner = ({ className }) => {
- return (
-
- );
-};
-
-export const StyledDesktopBanner = styled(DesktopBanner)`
- display: grid;
- height: 110px;
- margin-left: -20px;
- margin-right: -20px;
- padding: 26px 15px;
- width: 100%;
-
- @media (max-width: ${resolutions.max.tablet}px) {
- display: none !important;
- }
-`;
diff --git a/sources-gen/components/Header/Header.jsx b/sources-gen/components/Header/Header.jsx
deleted file mode 100644
index 9e9d20c..0000000
--- a/sources-gen/components/Header/Header.jsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import styled from 'styled-components';
-import { StyledDesktopBanner as DesktopBanner } from './DesktopBanner';
-import { StyledMobileBanner as MobileBanner } from './MobileBanner';
-import { StyledNavigationContainer as NavigationContainer } from './NavigationContainer/NavigationContainer';
-import { colors, resolutions } from '../../utils/css';
-
-export const Header = ({ className }) => {
- const headerTitleKey = 'header.bar';
- return (
-
- );
-};
-
-export const StyledHeader = styled(Header)`
- display: grid;
- background: ${colors.LG_WHITE};
- background-image: none;
- border: none;
- height: auto;
- min-height: 50px;
-
- @media (min-width: ${resolutions.min.tablet}px) {
- border-radius: 4px;
- margin-bottom: 0px;
- }
-
- @media (min-width: ${resolutions.min.desktop}px) {
- border: none;
- height: 200px;
- margin: 0;
- margin-bottom: 20px;
- }
-`;
diff --git a/sources-gen/components/Header/MobileBanner.jsx b/sources-gen/components/Header/MobileBanner.jsx
deleted file mode 100644
index cca5f7e..0000000
--- a/sources-gen/components/Header/MobileBanner.jsx
+++ /dev/null
@@ -1,106 +0,0 @@
-import styled from 'styled-components';
-import { colors, resolutions } from '../../utils/css';
-import dwLogoTablet from '../../assets/svg/dw-logo-tablet.svg';
-import dwLogoMobile from '../../assets/svg/dw-logo-mobile.svg';
-import { I18nText } from '../I18n/I18nText';
-
-export const MobileBanner = ({ className, title }) => {
- return (
-
- );
-};
-
-export const StyledMobileBanner = styled(MobileBanner)`
- border-width: 0 0 1px;
- box-shadow: inset 0 1px 0 ${colors.LG_TRANSPARENT_WHITE_15},
- 0 1px 5px ${colors.LG_TRANSPARENT_BLACK_075};
- line-height: 23px;
- position: fixed;
- left: 0px;
- right: 0px;
- top: 0px;
- z-index: 1030;
-
- @media (min-width: ${resolutions.min.tablet}px) {
- border-radius: 0px;
- height: 80px;
- }
-
- @media (min-width: ${resolutions.min.desktop}px) {
- display: none !important;
- }
-
- .mobile-banner {
- background: ${colors.LG_WHITE};
- border-bottom: 1px solid ${colors.LG_GRAY_14};
- height: 60px;
- margin-bottom: 0px;
- min-height: 50px;
- position: relative;
- width: 100%;
- z-index: 100;
-
- &:before,
- &:after {
- display: table;
- content: ' ';
- }
-
- @media (min-width: ${resolutions.min.tablet}px) {
- height: 80px;
- }
- }
-
- .mobile-banner-logo {
- background: url(${dwLogoMobile});
- color: ${colors.LG_GRAY_15};
- display: inline-block;
- /*! @noflip */
- float: left;
- font-size: 18px;
- font-weight: 400;
- height: 23px;
- line-height: 20px;
- margin: 17px 15px 0 15px;
- padding: 0;
- text-shadow: 0 1px 0 ${colors.LG_TRANSPARENT_WHITE_25};
- width: 40px;
-
- @media (min-width: ${resolutions.min.tablet}px) and (max-width: ${resolutions.max.tablet}px) {
- background: url(${dwLogoTablet});
- height: 31px;
- margin-top: 24px;
- width: 54px;
- }
- }
-
- .mobile-banner-brand {
- color: ${colors.LG_BLUE_5};
- font-size: 17px;
- margin: 19px auto 0 auto;
- position: relative;
- text-align: center;
- text-transform: uppercase;
- width: auto;
-
- @media (min-width: ${resolutions.min.tablet}px) and (max-width: ${resolutions.max.tablet}px) {
- font-size: 27px;
- margin: 23px auto 0 auto;
- padding-top: 8px;
- width: 300px;
- }
- }
-`;
diff --git a/sources-gen/components/Header/NavigationContainer/NavigationContainer.jsx b/sources-gen/components/Header/NavigationContainer/NavigationContainer.jsx
deleted file mode 100644
index 6fc12aa..0000000
--- a/sources-gen/components/Header/NavigationContainer/NavigationContainer.jsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { useState } from 'react';
-import { useParams } from 'react-router';
-import styled from 'styled-components';
-import { colors, resolutions } from '../../../utils/css';
-import { useToggle } from '../../../hooks/useToggle';
-import { StyledNavMenu as NavMenu } from '../../NavMenu/NavMenu';
-import { StyledBurgerButton as BurgerButton } from '../../BurgerButton/BurgerButton';
-import { StyledOnlyDesktopBrand as OnlyDesktopBrand } from './OnlyDesktopBrand';
-import { LANG_CODES } from '../../../utils/mappers/langMapper';
-import { StyledChineseVariantSwitch as ChineseVariantSwitch } from '../ChineseVariantSwitch';
-
-export const NavigationContainer = ({ className, title }) => {
- const [isNavMenuOpen, { toggleOnClick: toggleIsNavMenuOpen }] = useToggle();
- const [isLanguageSubMenuOpen, setIsLanguageSubMenuOpen] = useState(false);
- const { langCode } = useParams();
-
- return (
-
- {langCode === LANG_CODES.CHINESE && }
-
-
-
-
-
-
- );
-};
-
-export const StyledNavigationContainer = styled(NavigationContainer)`
- position: relative;
-
- @media (max-width: ${resolutions.max.mobile}px) {
- margin-bottom: 0px;
- }
-
- @media (min-width: ${resolutions.min.tablet}px) and (max-width: ${resolutions.max.tablet}px) {
- margin-bottom: -7px;
- }
-
- @media (min-width: ${resolutions.min.desktop}px) {
- background-color: ${colors.LG_BLUE_1};
- height: 85px;
- left: 0px;
- margin-left: 0px;
- margin-right: 0px;
- position: relative;
- right: inherit;
- top: inherit;
- }
-
- .navigation-container {
- border-top: 1px solid transparent;
- box-shadow: inset 0 1px 0 ${colors.LG_TRANSPARENT_WHITE_10};
- overflow-x: visible;
- padding: 0px;
- -webkit-overflow-scrolling: touch;
-
- @media (max-width: ${resolutions.max.mobile}px) {
- padding: 60px 0 0 0;
- }
-
- @media (max-width: ${resolutions.max.tablet}px) {
- border: none;
- }
- }
-`;
diff --git a/sources-gen/components/Header/NavigationContainer/OnlyDesktopBrand.jsx b/sources-gen/components/Header/NavigationContainer/OnlyDesktopBrand.jsx
deleted file mode 100644
index 5806500..0000000
--- a/sources-gen/components/Header/NavigationContainer/OnlyDesktopBrand.jsx
+++ /dev/null
@@ -1,50 +0,0 @@
-import { Link } from 'react-router-dom';
-import styled from 'styled-components';
-import { colors, resolutions } from '../../../utils/css';
-import { getDashboardUrl } from '../../../utils/url/urlFactory';
-import { I18nText } from '../../I18n/I18nText';
-
-export const OnlyDesktopBrand = ({ langCode, title, className }) => {
- return (
-
-
-
-
-
- );
-};
-
-const makeRoomForRtl = '85px';
-
-export const StyledOnlyDesktopBrand = styled(OnlyDesktopBrand)`
- align-items: center;
- display: flex;
- height: 85px;
- justify-content: flex-start;
- /*! @noflip */
- padding-left: 5px;
- /*! @noflip */
- padding-right: ${makeRoomForRtl};
-
- @media (max-width: ${resolutions.max.mobile}px) {
- display: none;
- }
-`;
-
-export const StyledLink = styled(Link)`
- color: ${colors.LG_WHITE};
- font-family: Arial;
- font-size: 23px;
- font-weight: 600;
- opacity: 1;
- text-decoration: none;
- text-transform: uppercase;
- padding: 15px;
-
- &:hover,
- &:focus,
- &:active {
- color: ${colors.LG_WHITE};
- text-decoration: none;
- }
-`;
diff --git a/sources-gen/components/Help/Help.jsx b/sources-gen/components/Help/Help.jsx
deleted file mode 100644
index 949b81c..0000000
--- a/sources-gen/components/Help/Help.jsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import styled from 'styled-components';
-import gql from 'graphql-tag';
-import { RichText } from '../RichText/RichText';
-import { useImagePlaceholderReplacementEffect } from '../../utils/replacers/useImagePlaceholderReplacementEffect';
-
-export const helpFragment = {
- name: 'Help',
- fragment() {
- return gql`fragment ${this.name} on Article {
- id
- shortTitle
- text
- }
- `;
- },
-};
-
-export const Help = ({ className, help }) => {
- useImagePlaceholderReplacementEffect({});
- const { shortTitle, text } = help;
-
- return (
-
-
-
-
- );
-};
-
-export const StyledHelp = styled(Help)`
- .content {
- margin: 10px;
- }
-`;
diff --git a/sources-gen/components/HeroTemplate/HeroTemplate.jsx b/sources-gen/components/HeroTemplate/HeroTemplate.jsx
deleted file mode 100644
index e26186e..0000000
--- a/sources-gen/components/HeroTemplate/HeroTemplate.jsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import styled from 'styled-components';
-import { colors, resolutions } from '../../utils/css';
-
-const HeroTemplate = ({ className, aria, children }) => (
-
-);
-export const StyledHeroTemplate = styled(HeroTemplate)`
- display: flex;
- align-items: center;
- color: ${colors.LG_WHITE};
-
- @media (max-width: ${resolutions.max.mobile}px) {
- max-height: 240px;
- background-size: 150%;
- font-size: 28px;
- line-height: 32px;
- }
-`;
diff --git a/sources-gen/components/I18n/I18nConfigLoader.jsx b/sources-gen/components/I18n/I18nConfigLoader.jsx
deleted file mode 100644
index fe8bd03..0000000
--- a/sources-gen/components/I18n/I18nConfigLoader.jsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import gql from 'graphql-tag';
-import { useParams } from 'react-router';
-import { setTranslations } from '../../utils/i18n';
-import { setFrontendConfig } from '../../hooks/useFrontendConfig';
-import { toLang } from '../../utils/mappers/langMapper';
-import { WithGraphQLQueryHandling } from '../WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { footerFragment } from '../Footer/Footer';
-import { setMetadata } from '../../hooks/useMetadata';
-
-export const i18nConfigQuery = gql`
- query translationsAndConfig($lang: Language!) {
- i18n: i18nByLang(lang: $lang, appName: "mdl") {
- all
- }
- config {
- imageBasePath
- staticBaseHost
- gtmId(appName: "mdl")
- gtmLevel1Id(appName: "mdl")
- }
- iso639ByLang(lang: $lang)
- ...${footerFragment.name}
- }
- ${footerFragment.fragment()}
-`;
-
-export const I18nConfigLoader = ({ children }) => {
- const { langCode } = useParams();
-
- const i18nQueryVariables = { lang: toLang(langCode || 'en') };
-
- return (
-
- {data => {
- if (data.i18n) {
- setTranslations(JSON.parse(data.i18n.all));
- }
- if (data.config) {
- setFrontendConfig(data.config);
- }
- if (data.iso639ByLang) {
- setMetadata(data.iso639ByLang);
- }
- return children(data);
- }}
-
- );
-};
diff --git a/sources-gen/components/I18n/I18nText.jsx b/sources-gen/components/I18n/I18nText.jsx
deleted file mode 100644
index 2cec160..0000000
--- a/sources-gen/components/I18n/I18nText.jsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { StyledText as Text } from '../Text/Text';
-import { useTranslation } from '../../hooks/useTranslation';
-import { useRtlContext } from '../../hooks/useRtl';
-
-export const I18nText = ({ translation, isA, className, ...restProps }) => {
- const { isRtl } = useRtlContext();
- const label = useTranslation(translation);
-
- return {label} ;
-};
diff --git a/sources-gen/components/IconBar/IconBar.jsx b/sources-gen/components/IconBar/IconBar.jsx
deleted file mode 100644
index d6d0cee..0000000
--- a/sources-gen/components/IconBar/IconBar.jsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import styled from 'styled-components';
-import { colors, resolutions } from '../../utils/css';
-
-export const StyledIconBar = styled('span')`
- margin-top: 4px;
- display: block;
- border-radius: 0;
- background-color: ${colors.LG_WHITE};
- width: 21px;
- height: 3px;
-
- @media (max-width: ${resolutions.max.tablet}px) {
- width: 14px;
- height: 2px;
- background-color: ${colors.LG_BLUE_6};
- }
-
- @media (min-width: ${resolutions.min.tablet}px) and (max-width: ${resolutions.max.tablet}px) {
- margin-top: 5px;
- width: 21px;
- height: 3px;
- background-color: ${colors.LG_BLUE_6};
- }
-`;
diff --git a/sources-gen/components/ImageOGMetaData/ImageOGMetaData.jsx b/sources-gen/components/ImageOGMetaData/ImageOGMetaData.jsx
deleted file mode 100644
index b68bb28..0000000
--- a/sources-gen/components/ImageOGMetaData/ImageOGMetaData.jsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import gql from 'graphql-tag';
-import { Helmet } from 'react-helmet-async';
-import { useFrontendConfig } from '../../hooks/useFrontendConfig';
-
-export const imageOGMetaDataFragment = {
- name: 'ImageOGMetaData',
- fragment({ type }) {
- return gql`fragment ${type}${this.name} on ${type} {
- mainContentImage {
- id
- imageFormats
- }
- }
- `;
- },
-};
-
-export const hasCorrectImageFormat = imageFormats =>
- imageFormats.find(format => format.includes('MASTER_LANDSCAPE'));
-
-const createImageSharingData = ({ id, imageFormats, imageBasePath }) => {
- if (hasCorrectImageFormat(imageFormats)) {
- return {
- url: `${imageBasePath}/${id}_401.jpg`,
- width: 700,
- height: 394,
- };
- }
- return undefined;
-};
-
-export const ImageOGMetaData = ({ image }) => {
- const { imageBasePath } = useFrontendConfig();
-
- if (!image) {
- return null;
- }
-
- const { url, width, height } = createImageSharingData({ ...image, imageBasePath }) || {};
-
- if (!url) {
- return null;
- }
-
- return (
-
-
-
-
-
-
- );
-};
diff --git a/sources-gen/components/Input/BirthDateInput/BirthDateInput.jsx b/sources-gen/components/Input/BirthDateInput/BirthDateInput.jsx
deleted file mode 100644
index f6f72f3..0000000
--- a/sources-gen/components/Input/BirthDateInput/BirthDateInput.jsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import {
- hasErrorClassAssigner,
- hasNestedErrorsClassAssigner,
-} from '../../../utils/errorClassAssigner';
-import { I18nText } from '../../I18n/I18nText';
-import { deconstructDateOfBirth } from '../../../utils/userUtils';
-import { useTranslation } from '../../../hooks/useTranslation';
-
-export const BirthDateInput = ({
- register,
- errors,
- initialDateOfBirth,
- translationPrefix = 'profile.register',
-}) => {
- const { year: initYear } = deconstructDateOfBirth(initialDateOfBirth);
- const hasErrors = errors.year;
- const placeholderLabel = useTranslation(`${translationPrefix}.placeholder.yearOfBirth`);
-
- return (
-
-
- {hasErrors && (
-
-
-
- )}
-
- );
-};
diff --git a/sources-gen/components/Input/Input.jsx b/sources-gen/components/Input/Input.jsx
deleted file mode 100644
index b5ac8b7..0000000
--- a/sources-gen/components/Input/Input.jsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { hasErrorClassAssigner } from '../../utils/errorClassAssigner';
-import { getTranslatedValidationMessage } from '../../utils/validation/validationMessages';
-import { I18nText } from '../I18n/I18nText';
-import { useI18nContext } from '../../context/I18nContext';
-
-export const Input = ({
- titleTranslationKey,
- placeholderTranslationKey = titleTranslationKey,
- name,
- type,
- register,
- validationError,
- isLabelVisible = false,
- customErrorTranslationKey,
- ...restProps
-}) => {
- const { i18n } = useI18nContext();
- return (
-
-
-
- {validationError && (
-
- {getTranslatedValidationMessage({
- name,
- validationErrorTranslationKey: titleTranslationKey,
- validationType: validationError.type,
- customErrorTranslationKey,
- t: i18n.t,
- })}
-
- )}
-
- );
-};
diff --git a/sources-gen/components/Input/NewPassword/NewPasswordInputs.jsx b/sources-gen/components/Input/NewPassword/NewPasswordInputs.jsx
deleted file mode 100644
index dadea85..0000000
--- a/sources-gen/components/Input/NewPassword/NewPasswordInputs.jsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import { Input } from '../Input';
-import {
- passwordDiffersFromEmail,
- passwordRetypeValid,
- passwordValid,
-} from '../../../utils/validation/validators';
-
-export const NewPasswordInputs = ({
- passwordTitleKey,
- passwordPlaceholderKey,
- passwordRepeatTitleKey,
- passwordRepeatPlaceholderKey,
- email,
- register,
- errors,
- getValues,
-}) => {
- return (
- <>
- passwordValid(value),
- differsFromEmail: value => passwordDiffersFromEmail(value, email),
- },
- })}
- validationError={errors.password}
- />
- passwordRetypeValid(value, getValues().password),
- },
- })}
- validationError={errors.passwordRetype}
- />
- >
- );
-};
diff --git a/sources-gen/components/Input/TextAreaInput/TextAreaInput.jsx b/sources-gen/components/Input/TextAreaInput/TextAreaInput.jsx
deleted file mode 100644
index fbc46a6..0000000
--- a/sources-gen/components/Input/TextAreaInput/TextAreaInput.jsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import styled, { css } from 'styled-components';
-import { forwardRef } from 'react';
-import { INQUIRY_STATE } from '../../Lesson/LessonExercise/workflow/inquiryState';
-import { useTranslation } from '../../../hooks/useTranslation';
-
-export const TextAreaInput = forwardRef(
- (
- { inquiryState, input, isDisabled, onChange, onKeyPress, isPlaceholderDisabled = false },
- ref,
- ) => {
- const translatedPlaceholder = useTranslation('exercise.typeHere');
-
- const getBorderColor = () => {
- switch (inquiryState) {
- case INQUIRY_STATE.WRONG:
- return '#be232d';
- case INQUIRY_STATE.CORRECT:
- return '#82b905';
- case INQUIRY_STATE.SOLVED:
- case INQUIRY_STATE.INITIAL:
- default:
- return '#d1c9c2';
- }
- };
-
- const onTextAreaKeyPress = e => {
- if (onKeyPress) {
- onKeyPress(e);
- }
- };
-
- return (
-
- );
- },
-);
-
-const StyledVerticalTextArea = styled.textarea`
- padding: 5px 10px;
- border: 2px solid ${({ borderColor }) => borderColor};
- resize: vertical;
- height: 8em;
- overflow: auto;
- /* @noflip */
- text-align: left;
- width: 95%;
-
- ${({ isDisabled }) =>
- isDisabled &&
- css`
- cursor: not-allowed;
- opacity: 1;
- background-color: #eee;
- `}
-
- &:empty:not(:focus):before {
- content: attr(placeholder);
- color: grey;
- }
-
- &:focus {
- border-color: #66afe9;
- outline: 0;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
- }
-`;
diff --git a/sources-gen/components/LearnProgressIcon/LearnProgressIcon.jsx b/sources-gen/components/LearnProgressIcon/LearnProgressIcon.jsx
deleted file mode 100644
index 7697acd..0000000
--- a/sources-gen/components/LearnProgressIcon/LearnProgressIcon.jsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { progressState, StyledProgressIcon as ProgressIcon } from '../ProgressIcon/ProgressIcon';
-import { calculatePercentage } from '../../utils/commons';
-import { StyledCertificateIcon } from '../ProgressIcon/CertificateIcon';
-import { StyledProgressIconStar } from '../ProgressIcon/ProgressIconStar';
-import { progressIconColors } from '../ProgressIcon/progressIconColors';
-
-export const LearnProgressIcon = ({
- learnProgress,
- color = progressIconColors.GRAY,
- finalLessonId,
-}) => {
- const getProgressIcon = () => {
- if (!learnProgress) {
- return ;
- }
-
- const {
- resultPoints,
- maxPointsForAllExercises,
- doneExerciseCount,
- allExerciseCount,
- finalTestPassed,
- } = learnProgress;
-
- if (doneExerciseCount === 0) {
- return ;
- }
- if (finalTestPassed) {
- return ;
- }
- if (doneExerciseCount < allExerciseCount) {
- return ;
- }
- if (doneExerciseCount === allExerciseCount) {
- const resultInPercentage = calculatePercentage(resultPoints, maxPointsForAllExercises);
- if (resultInPercentage >= 80) {
- return ;
- }
- return ;
- }
-
- return ;
- };
-
- return getProgressIcon();
-};
diff --git a/sources-gen/components/LegalNotice/LegalNotice.jsx b/sources-gen/components/LegalNotice/LegalNotice.jsx
deleted file mode 100644
index ba77ed6..0000000
--- a/sources-gen/components/LegalNotice/LegalNotice.jsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import styled from 'styled-components';
-import classnames from 'classnames';
-import { RichText } from '../RichText/RichText';
-import { useImagePlaceholderReplacementEffect } from '../../utils/replacers/useImagePlaceholderReplacementEffect';
-import { ContentHeadline } from '../ContentContainer/ContentHeadline/ContentHeadline';
-
-export const legalFragment = {
- name: 'Legal',
- partial() {
- return `legal(appName: "mdl") {
- ... on Article {
- id
- shortTitle
- text
- }
- }
- `;
- },
-};
-
-export const LegalNotice = ({ className, legal }) => {
- useImagePlaceholderReplacementEffect({});
- const { text, shortTitle } = legal || {};
-
- return (
-
- );
-};
-
-export const StyledLegalNotice = styled(LegalNotice)`
- .img-caption {
- display: none;
- }
-`;
diff --git a/sources-gen/components/Lesson/Lesson.jsx b/sources-gen/components/Lesson/Lesson.jsx
deleted file mode 100644
index 45dc554..0000000
--- a/sources-gen/components/Lesson/Lesson.jsx
+++ /dev/null
@@ -1,213 +0,0 @@
-import { Route, useParams, useRouteMatch } from 'react-router';
-import gql from 'graphql-tag';
-import { createGlobalStyle } from 'styled-components';
-import { isMonolingualCourse } from '../../constants/isLtrContentOnly';
-import { LessonMenu } from './LessonMenu/LessonMenu';
-import { LessonInformation } from './LessonInformation/LessonInformation';
-import { pathPartials } from '../../utils/url/pathAnalyser';
-import { ExerciseProgressProvider } from './LessonExercise/workflow/ExerciseProgress';
-import { LessonExerciseNavigation } from './LessonExercise/LessonExerciseNavigation/LessonExerciseNavigation';
-import { LessonKnowledgeNavigation } from './LessonKnowledgeNavigation/LessonKnowledgeNavigation';
-import {
- LESSON_EXERCISE_RESULT_SUFFIX,
- LESSON_EXTRAS_SUFFIX,
- LESSON_MANUSCRIPT_SUFFIX,
- LESSON_SUMMARY_SUFFIX,
-} from '../../utils/url/urlFactory';
-import { ManuscriptPage } from '../../pages/ManuscriptPage';
-import { LessonExtrasPage } from '../../pages/LessonExtrasPage';
-import { LessonExerciseResult } from './LessonExercise/LessonExerciseResult/LessonExerciseResult';
-import { LessonSummaryPage } from '../../pages/LessonSummaryPage';
-import { useExerciseManager } from '../../hooks/useExerciseManager';
-import {
- filterLessonExerciseOverviewItems,
- filterLessonKnowledgeOverviewItems,
- isFinalTestLesson,
-} from '../../utils/lessonUtils';
-import { isPlacementTestCourse } from '../../utils/mappers/placementTestCourseIds';
-import { hasCorrectImageFormat } from '../ImageOGMetaData/ImageOGMetaData';
-import { gtmDataLayerFragment } from '../GoogleTagManager';
-import { CourseDataContext } from '../../hooks/useCourseData';
-
-export const lessonOverviewPartsFragment = {
- fragment({ scope, handicap }) {
- const handicapArg = handicap ? `(handicap: ${handicap})` : '';
- return gql`
- fragment ${scope}OverviewParts${handicap || ''} on Lesson {
- overviewParts${handicapArg} {
- targetId
- lessonPart
- target {
- ... on Exercise {
- name
- ${gtmDataLayerFragment.partial()}
- }
- ... on Knowledge {
- name
- }
- }
- }
- }
- `;
- },
-};
-
-export const LtrContentLessonStyle = createGlobalStyle`
- #lesson {
- .title,
- .main-info-content,
- .exercise-container,
- .input-header-container {
- /* @noflip */
- direction: ltr;
- /* @noflip */
- text-align: left;
- }
- }
-`;
-
-export const Lesson = ({ data }) => {
- const { content } = data;
- const {
- name: lessonName,
- language,
- overviewParts: lessonOverviewParts,
- learningMetaInfo: { achievableScore },
- manuscript,
- knowledges,
- mainContentImage: lessonMainImage,
- keywordStrings: lessonKeywordStrings,
- } = content;
- const lessonKnowledgeOverviewItems = filterLessonKnowledgeOverviewItems(lessonOverviewParts);
- const lessonExerciseOverviewItems = filterLessonExerciseOverviewItems(lessonOverviewParts);
-
- const manuscriptContent = { manuscript, knowledges };
- const { path } = useRouteMatch();
- const { lessonId: lessonIdString } = useParams();
- const lessonId = +lessonIdString;
-
- const {
- id: courseId,
- name: courseName,
- contentLinks: lessonContentLinksFromCourse,
- mainContentImage: courseMainImage,
- } = data.contentsByType[0];
-
- const isFromPlacementCourse = isPlacementTestCourse(courseId);
- const isFinalTest = isFinalTestLesson({
- lessonContentLinksFromCourse,
- currentLessonId: lessonId,
- });
-
- const ogImage =
- lessonMainImage && hasCorrectImageFormat(lessonMainImage.imageFormats)
- ? lessonMainImage
- : courseMainImage;
-
- const { firstExerciseLink } = useExerciseManager({
- lessonName,
- lessonExerciseOverviewItems,
- courseId,
- isFinalTest,
- });
-
- const firstExercisePath = firstExerciseLink();
-
- return (
-
-
- {isMonolingualCourse(courseId.toString()) && }
-
- (
-
- )}
- />
- (
-
-
-
- )}
- />
- (
-
- )}
- />
- }
- />
- }
- />
- (
-
- )}
- />
- (
-
- )}
- />
-
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonContentDescription/LessonContentDescription.jsx b/sources-gen/components/Lesson/LessonContentDescription/LessonContentDescription.jsx
deleted file mode 100644
index aa64edc..0000000
--- a/sources-gen/components/Lesson/LessonContentDescription/LessonContentDescription.jsx
+++ /dev/null
@@ -1,89 +0,0 @@
-import { Link } from 'react-router-dom';
-import gql from 'graphql-tag';
-import { useDispatch } from 'react-redux';
-import { I18nText } from '../../I18n/I18nText';
-import { ReactComponent as IconHintCircleOrange } from '../../../assets/svg/icon-hint-circle-orange.svg';
-import { Text } from '../../Text/Text';
-import { useKnowledgePlaceholderReplacementEffect } from '../../Modal/KnowledgeModal/useKnowledgePlaceholderReplacementEffect';
-import { deleteLessonProgress } from '../../../state/progress/learnProgressDuck';
-
-export const lessonContentDescriptionFragment = gql`
- fragment LessonContentDescription on Lesson {
- id
- description
- learningTargetHeadline
- learningTargetDescription
- }
-`;
-
-export const LessonContentDescription = ({
- content,
- firstExercisePath,
- isFinalTest,
- isHintHidden,
-}) => {
- const {
- id: lessonid,
- description,
- learningTargetHeadline,
- learningTargetDescription,
- knowledges,
- } = content;
-
- useKnowledgePlaceholderReplacementEffect({ knowledges });
- const dispatch = useDispatch();
-
- const deleteProgressIfFinalTest = () => {
- if (isFinalTest) {
- dispatch(deleteLessonProgress(lessonid));
- }
- };
-
- return (
-
-
-
-
-
-
-
-
-
-
{learningTargetHeadline}
-
-
-
-
-
-
-
-
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/ChooseAnswer.jsx b/sources-gen/components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/ChooseAnswer.jsx
deleted file mode 100644
index 6bcd733..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/ChooseAnswer.jsx
+++ /dev/null
@@ -1,247 +0,0 @@
-/* eslint-disable jsx-a11y/anchor-is-valid,jsx-a11y/aria-role */
-import { useState, useEffect } from 'react';
-import classnames from 'classnames';
-import { createGlobalStyle } from 'styled-components';
-import {
- cleanupAndAddPlaceholderComponents,
- createSingleSentenceAnswerContent,
-} from '../clozeExerciseUtils';
-import { ExerciseRichText } from '../ExerciseRichText';
-import { StyledContainerTextContent } from './ContainerTextContent';
-import { INQUIRY_STATE } from '../../workflow/inquiryState';
-import { shuffle } from '../../../../../utils/commons';
-import { isNormalizedTextEqual } from '../../utils/exerciseUtils';
-
-const ChooseAnswerGlobalStyles = createGlobalStyle`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-`;
-
-export const ChooseAnswer = ({ inquiry, onChange, inquiryState, isDisabled }) => {
- const { subInquiries, clozeLayoutType, id } = inquiry;
-
- const scopeClassName = `inquiry_${id}`;
-
- const initialClozeChooseData = subInquiries.map(subInquiry => {
- return {
- ...subInquiry,
- selectedAnswer: undefined,
- };
- });
- const initialSelectableAnswers = subInquiries.map(subInquiry => ({
- text: subInquiry.alternatives[0].alternativeText,
- id: subInquiry.alternatives[0].id,
- }));
-
- const [clozeChooseData, setClozeChooseData] = useState(initialClozeChooseData);
- const [selectableAnswers, setSelectableAnswers] = useState(initialSelectableAnswers);
-
- const setSelectedAnswer = answer => {
- // eslint-disable-next-line fp/no-let
- let updated = false;
- const newClozeData = clozeChooseData.map(clozeData => {
- if (!clozeData.selectedAnswer && !updated) {
- // eslint-disable-next-line fp/no-mutation
- updated = true;
- return { ...clozeData, selectedAnswer: answer };
- }
- return { ...clozeData };
- });
- setClozeChooseData(newClozeData);
- };
-
- const removeSelectedAnswer = answer => {
- const newClozeData = clozeChooseData.map(clozeData => {
- if (clozeData.selectedAnswer && clozeData.selectedAnswer.id === answer.id) {
- return { ...clozeData, selectedAnswer: undefined };
- }
- return { ...clozeData };
- });
- setClozeChooseData(newClozeData);
- };
-
- const removeSelectableAnswer = answer => {
- const newSelectableAnswers = selectableAnswers.filter(
- selectableAnswer => selectableAnswer.id !== answer.id,
- );
- setSelectableAnswers(newSelectableAnswers);
- };
-
- const addSelectableAnswer = answer => {
- const newSelectableAnswers = [answer, ...selectableAnswers];
- setSelectableAnswers(newSelectableAnswers);
- };
-
- const handleAnswerClicked = (e, answerText, answerId, isSelectedAnswer) => {
- const answer = { text: answerText, id: +answerId };
- e.preventDefault();
- if (!isDisabled) {
- if (isSelectedAnswer) {
- removeSelectedAnswer(answer);
- addSelectableAnswer(answer);
- } else {
- setSelectedAnswer(answer);
- removeSelectableAnswer(answer);
- }
- }
- };
-
- const checkEntry = (answerText, index) => {
- return clozeChooseData[index].alternatives.some(
- alternative =>
- isNormalizedTextEqual(answerText, alternative.alternativeText) && alternative.isCorrect,
- );
- };
- useEffect(() => {
- if (inquiryState === INQUIRY_STATE.SOLVED) {
- setClozeChooseData(
- subInquiries.map(subInquiry => ({
- ...subInquiry,
- selectedAnswer: {
- text: subInquiry.alternatives[0].alternativeText,
- id: subInquiry.alternatives[0].id,
- },
- })),
- );
- setSelectableAnswers([]);
- }
- }, [inquiryState, subInquiries]);
- useEffect(() => {
- if (inquiryState !== INQUIRY_STATE.SOLVED) {
- onChange(
- clozeChooseData.filter((data, index) =>
- clozeChooseData[index].alternatives.some(
- alternative =>
- data.selectedAnswer &&
- isNormalizedTextEqual(data.selectedAnswer.text, alternative.alternativeText) &&
- alternative.isCorrect,
- ),
- ).length,
- );
- }
- }, [inquiryState, onChange, clozeChooseData]);
- useEffect(() => {
- setSelectableAnswers(answers =>
- shuffle(answers.slice(0)).map(answer => {
- return {
- ...answer,
- };
- }),
- );
- }, []);
-
- const EmptyPlaceholder = () =>
;
- const FilledPlaceholder = ({ selectedAnswer, index }) => (
- {answerLink(selectedAnswer, index, true)}
- );
-
- const PlaceHolder = ({ clozeData, index }) => {
- const { selectedAnswer } = clozeData;
- return (
- <>
- {selectedAnswer ? (
-
- ) : (
-
- )}
- >
- );
- };
-
- const createPlaceholder = index => {
- const clozeData = clozeChooseData[index];
- return ;
- };
-
- const continuousTextPartialComponent = answerContent => (
-
- );
-
- const singleLinePartialComponent = answerContent => (
-
-
-
-
-
- );
- const getAnswerClasses = (answerText, index, isSelectedAnswer) => {
- const defaultClasses = 'btn answer-sorting-btn alwaysLtr';
- if (!isSelectedAnswer) {
- return defaultClasses;
- }
- return classnames(
- defaultClasses,
- (inquiryState === INQUIRY_STATE.CORRECT || inquiryState === INQUIRY_STATE.WRONG) &&
- checkEntry(answerText, index)
- ? 'correct-input'
- : '',
- inquiryState === INQUIRY_STATE.WRONG && !checkEntry(answerText, index) ? 'wrong-input' : '',
- inquiryState === INQUIRY_STATE.SOLVED ? 'solved-input' : '',
- );
- };
- const answerLink = (selectableAnswer, index, isSelectedAnswer) => (
-
- handleAnswerClicked(e, selectableAnswer.text, selectableAnswer.id, isSelectedAnswer)
- }
- >
- {selectableAnswer.text}
-
- );
-
- const clozeLayoutTypeConfig = {
- CONTINUOUS_TEXT: {
- cmp: continuousTextPartialComponent,
- answerContent: () => cleanupAndAddPlaceholderComponents(inquiry.text),
- },
- SINGLE_SENTENCE: {
- cmp: singleLinePartialComponent,
- answerContent: () =>
- cleanupAndAddPlaceholderComponents(createSingleSentenceAnswerContent(subInquiries, ' ')),
- },
- };
-
- const selectedClozeLayoutConfig = clozeLayoutTypeConfig[clozeLayoutType];
-
- if (selectedClozeLayoutConfig == null) {
- return null;
- }
-
- return (
- <>
-
-
- {selectedClozeLayoutConfig.cmp(selectedClozeLayoutConfig.answerContent())}
-
-
- {selectableAnswers.map((selectableAnswer, index) =>
- answerLink(selectableAnswer, index, false, false),
- )}
-
- >
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/ContainerTextContent.jsx b/sources-gen/components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/ContainerTextContent.jsx
deleted file mode 100644
index 3b147f4..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/ContainerTextContent.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import styled from 'styled-components';
-
-export const StyledContainerTextContent = styled('div')`
- display: grid;
-
- br {
- content: '';
- display: block;
- height: 10px;
- }
-`;
diff --git a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/PulldownAnswer.jsx b/sources-gen/components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/PulldownAnswer.jsx
deleted file mode 100644
index 27854d1..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/PulldownAnswer.jsx
+++ /dev/null
@@ -1,120 +0,0 @@
-import { useState, useEffect, useRef } from 'react';
-import classnames from 'classnames';
-import styled from 'styled-components';
-import {
- cleanupAndAddPlaceholderComponents,
- createSingleSentenceAnswerContent,
-} from '../clozeExerciseUtils';
-import { INQUIRY_STATE } from '../../workflow/inquiryState';
-import { ClozePulldown } from '../ClozePulldown';
-import { ExerciseRichText } from '../ExerciseRichText';
-
-export const PulldownAnswer = ({ className, inquiry, onChange, inquiryState, isDisabled }) => {
- const { subInquiries, clozeLayoutType } = inquiry;
- const initialClozePulldownData = subInquiries.map(subInquiry => {
- return {
- ...subInquiry,
- selectedValue: '...',
- };
- });
-
- const checkEntry = entry =>
- entry.alternatives.some(
- alternative => entry.selectedValue === alternative.alternativeText && alternative.isCorrect,
- );
- const checkAnswer = () => clozePulldownData.filter(data => checkEntry(data)).length;
-
- const [clozePulldownData, setClozePulldownData] = useState(initialClozePulldownData);
- const node = useRef(null);
-
- const onHandleItemSelected = (e, index, answer) => {
- e.preventDefault();
- const newClozeData = [...clozePulldownData];
- // eslint-disable-next-line fp/no-mutation
- newClozeData[index].selectedValue = answer;
- setClozePulldownData(newClozeData);
- onChange(checkAnswer());
- };
-
- useEffect(() => {
- if (inquiryState === INQUIRY_STATE.SOLVED) {
- setClozePulldownData(pulldownData => {
- const newClozeData = [...pulldownData];
- pulldownData.forEach((value, index) => {
- // eslint-disable-next-line fp/no-mutation
- newClozeData[index].selectedValue = value.alternatives.find(
- alternative => alternative.isCorrect,
- ).alternativeText;
- });
- return newClozeData;
- });
- }
- }, [inquiryState]);
-
- const createPulldown = index => (
-
- );
-
- const partialComponent = (inline = false) => answerContent => (
-
-
-
- );
-
- const clozeLayoutTypeConfig = {
- CONTINUOUS_TEXT: {
- cmp: partialComponent(true),
- answerContent: () => cleanupAndAddPlaceholderComponents(inquiry.text),
- },
- SINGLE_SENTENCE: {
- cmp: partialComponent(false),
- answerContent: () =>
- cleanupAndAddPlaceholderComponents(
- createSingleSentenceAnswerContent(subInquiries, '
'),
- ),
- },
- };
-
- const selectedClozeLayoutConfig = clozeLayoutTypeConfig[clozeLayoutType];
-
- if (selectedClozeLayoutConfig == null) {
- return null;
- }
-
- return selectedClozeLayoutConfig.cmp(selectedClozeLayoutConfig.answerContent());
-};
-
-export const StyledPulldownAnswer = styled(PulldownAnswer)`
- &.exercise-cloze-text-big div.form-group p {
- display: block;
- }
-
- /* @noflip */
- text-align: left;
- /* @noflip */
- direction: ltr;
-`;
diff --git a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/WritingAnswer.jsx b/sources-gen/components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/WritingAnswer.jsx
deleted file mode 100644
index 6519e86..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/WritingAnswer.jsx
+++ /dev/null
@@ -1,116 +0,0 @@
-import { useEffect, useState } from 'react';
-import { createGlobalStyle } from 'styled-components';
-import {
- cleanupAndAddPlaceholderComponents,
- createSingleSentenceAnswerContent,
- placeholderConfig,
-} from '../clozeExerciseUtils';
-import { ExerciseRichText } from '../ExerciseRichText';
-import { INQUIRY_STATE } from '../../workflow/inquiryState';
-import { isNormalizedTextEqual } from '../../utils/exerciseUtils';
-import { ClozeInput } from '../ClozeInput';
-
-const WritingAnswerGlobalStyles = createGlobalStyle`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-`;
-
-export const WritingAnswer = ({ inquiry, onChange, inquiryState, isDisabled }) => {
- const { subInquiries, clozeLayoutType, id } = inquiry;
- const scopeClassName = `inquiry_${id}`;
-
- const initialClozeWritingData = subInquiries.map(subInquiry => {
- return {
- ...subInquiry,
- userAnswer: '',
- };
- });
-
- const [clozeWritingData, setClozeWritingData] = useState(initialClozeWritingData);
-
- useEffect(() => {
- if (inquiryState === INQUIRY_STATE.SOLVED) {
- setClozeWritingData(
- subInquiries.map(subInquiry => ({
- ...subInquiry,
- userAnswer: subInquiry.alternatives[0].alternativeText,
- })),
- );
- }
- }, [inquiryState, subInquiries]);
-
- const handleOnInputChange = (index, value) => {
- const newData = [...clozeWritingData];
- // eslint-disable-next-line fp/no-mutation
- newData[index].userAnswer = value;
- setClozeWritingData(newData);
- onChange(
- newData.filter(answer =>
- isNormalizedTextEqual(answer.userAnswer, answer.alternatives[0].alternativeText),
- ).length,
- );
-
- return checkAnswer(index, value);
- };
-
- const checkAnswer = (index, value) =>
- isNormalizedTextEqual(value, clozeWritingData[index].alternatives[0].alternativeText);
-
- const createPlaceholder = (index, matchedElement) => {
- const clozeData = clozeWritingData[index];
- const config = placeholderConfig.find(entry => entry.size === matchedElement.innerText);
- return (
-
- );
- };
-
- const clozeLayoutTypeConfig = {
- CONTINUOUS_TEXT: {
- answerContent: () => cleanupAndAddPlaceholderComponents(inquiry.text),
- },
- SINGLE_SENTENCE: {
- answerContent: () =>
- cleanupAndAddPlaceholderComponents(
- createSingleSentenceAnswerContent(subInquiries, '
'),
- ),
- },
- };
-
- const selectedClozeLayoutConfig = clozeLayoutTypeConfig[clozeLayoutType];
-
- if (selectedClozeLayoutConfig == null) {
- return null;
- }
-
- const answerContent = selectedClozeLayoutConfig.answerContent();
-
- return (
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ClozeExercise.jsx b/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ClozeExercise.jsx
deleted file mode 100644
index 7843001..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ClozeExercise.jsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import gql from 'graphql-tag';
-import { AudioProvider } from '../../../../context/AudioContext';
-import { LessonExerciseTextInput } from '../LessonExerciseTextInput/LessonExerciseTextInput';
-import { ClozeExerciseRow } from './ClozeExerciseRow';
-
-export const clozeExerciseFragment = {
- name: 'clozeExercise',
- fragment() {
- return gql`fragment ${this.name} on Inquiry {
- text
- clozeLayoutType
- subInquiries {
- clozeType
- }
- }
- `;
- },
-};
-
-export const ClozeExercise = ({ data }) => {
- const { inputText, inquiries } = data.content;
-
- return (
-
-
- {inquiries.map(inquiry => (
-
- ))}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ClozeExerciseRow.jsx b/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ClozeExerciseRow.jsx
deleted file mode 100644
index 5afda50..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ClozeExerciseRow.jsx
+++ /dev/null
@@ -1,140 +0,0 @@
-import { useRef, useState } from 'react';
-import { useParams } from 'react-router';
-import {
- exerciseQuestionTypeSelector,
- LessonExerciseQuestion,
-} from '../LessonExerciseQuestion/LessonExerciseQuestion';
-import { StyledSolveCheckButton } from '../../../SolveCheckButton/SolveCheckButton';
-import { StyledPulldownAnswer } from './AnswerTypes/PulldownAnswer';
-import { QUESTION_TYPES } from '../LessonExerciseQuestion/QuestionTypes/questionTypes';
-import { LessonExerciseHint } from '../LessonExerciseHint/LessonExerciseHint';
-import { ChooseAnswer } from './AnswerTypes/ChooseAnswer';
-import { WritingAnswer } from './AnswerTypes/WritingAnswer';
-import { useAudio } from '../../../../hooks/useAudio';
-import { useInquiryHandling } from '../workflow/useInquiryHandling';
-import { findFeedbackAudio } from '../../../../utils/audioUtils';
-import { LessonExerciseHiddenAudio } from '../LessonExerciseHiddenAudio/LessonExerciseHiddenAudio';
-
-export const ClozeExerciseRow = ({ inquiry, initiallyCorrectInquiries = 0 }) => {
- const { exerciseId } = useParams();
- const {
- audios,
- inquiryDescription,
- id: inquiryId,
- learningMetaInfo: { achievableScore },
- mainContentImage,
- } = inquiry;
- const { clozeType } = inquiry.subInquiries[0];
-
- const [correctSubInquiries, setCorrectSubInquiries] = useState(initiallyCorrectInquiries);
- const { playWrongDefaultAudioFeedBack, playCorrectDefaultAudioFeedBack } = useAudio();
- const isSolutionAudioFallbackMode = Boolean(mainContentImage);
- const feedbackAudio = findFeedbackAudio(isSolutionAudioFallbackMode, audios);
- const { target: answerAudio } = feedbackAudio || {};
- const { mp3Src: feedbackAudioUrl } = answerAudio || {};
- const feedbackAudioRef = useRef();
-
- const {
- isSolveButtonDisabled,
- isCheckButtonDisabled,
- handleCorrectAnswer,
- handleWrongAnswer,
- handleSolved,
- inquiryState,
- isDisabled,
- } = useInquiryHandling({ inquiryId, achievableScore, subInquiries: inquiry.subInquiries.length });
-
- const onChange = changeResult => {
- setCorrectSubInquiries(changeResult);
- };
-
- const onHandleSolveButtonClicked = () => {
- handleSolved();
- playCorrectAudioFeedBack();
- };
-
- const onHandleCheckButtonClicked = () => {
- if (correctSubInquiries === inquiry.subInquiries.length) {
- handleCorrectAnswer();
- playCorrectAudioFeedBack();
- } else {
- handleWrongAnswer(correctSubInquiries);
- playWrongDefaultAudioFeedBack();
- }
- };
- const playCorrectAudioFeedBack = () => {
- if (feedbackAudioUrl) {
- feedbackAudioRef.current.play();
- } else {
- playCorrectDefaultAudioFeedBack();
- }
- };
- const getAnswerComponent = () => {
- switch (clozeType) {
- case 'PULLDOWN':
- return (
-
- );
- case 'CHOOSE':
- return ;
- case 'WRITING':
- return ;
- default:
- return null;
- }
- };
-
- const questionType = exerciseQuestionTypeSelector({ inquiry });
- const answerComponent = getAnswerComponent();
-
- const lessonExerciseHintPartial = (
-
- );
-
- return (
-
-
- {questionType === QUESTION_TYPES.TEXT && clozeType !== 'CHOOSE' ? (
- <>
-
-
-
- {answerComponent}
-
- {lessonExerciseHintPartial}
- >
- ) : (
- <>
-
-
-
-
-
{answerComponent}
- {lessonExerciseHintPartial}
- >
- )}
-
-
-
-
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ClozeInput.jsx b/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ClozeInput.jsx
deleted file mode 100644
index ae95e1e..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ClozeInput.jsx
+++ /dev/null
@@ -1,80 +0,0 @@
-import { useState } from 'react';
-import classnames from 'classnames';
-import { INQUIRY_STATE } from '../workflow/inquiryState';
-import { isNormalizedTextEqual } from '../utils/exerciseUtils';
-import { KeyboardWrapper } from '../Keyboard/KeyboardWrapper';
-
-export const ClozeInput = ({
- inquiryState,
- index,
- clozeData,
- config,
- handleOnInputChange,
- isDisabled,
-}) => {
- const fieldNameId = clozeData.id;
- const [value, setValue] = useState(
- inquiryState === INQUIRY_STATE.SOLVED
- ? clozeData.alternatives[0].alternativeText
- : clozeData.userAnswer,
- );
-
- const [isCorrect, setIsCorrect] = useState(
- isNormalizedTextEqual(clozeData.alternatives[0].alternativeText, clozeData.userAnswer),
- );
-
- const handleOnChange = e => {
- handleChange(e.target.value);
- };
-
- const handleKeyboardChange = input => {
- handleChange(input);
- };
-
- const handleChange = input => {
- if (!isDisabled) {
- setValue(input);
- setIsCorrect(handleOnInputChange(index, input));
- }
- };
-
- const getInputClassName = () => {
- switch (inquiryState) {
- case INQUIRY_STATE.CORRECT:
- case INQUIRY_STATE.WRONG:
- return isCorrect ? 'correct-input' : 'wrong-input';
- case INQUIRY_STATE.SOLVED:
- return 'solved-input';
- default:
- return '';
- }
- };
-
- const baseInputClassName = `answer-input-cloze-${config.size} cloze-${clozeData.id} answer-input-cloze-element form-control onscreen-kb input-sm`;
-
- return (
- <>
-
- {!isDisabled && (
-
- )}
- >
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ClozePulldown.jsx b/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ClozePulldown.jsx
deleted file mode 100644
index a4a0eb1..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ClozePulldown.jsx
+++ /dev/null
@@ -1,78 +0,0 @@
-/* eslint-disable jsx-a11y/anchor-is-valid,jsx-a11y/aria-role,comma-dangle */
-import { useState } from 'react';
-import classnames from 'classnames';
-import { INQUIRY_STATE } from '../workflow/inquiryState';
-
-export const ClozePulldown = ({
- index,
- pulldownData,
- inquiryState,
- checkEntry,
- onHandleItemSelected,
- isDisabled,
-}) => {
- const [isToggled, setIsToggled] = useState(false);
- const getInputClassName = () => {
- switch (inquiryState) {
- case INQUIRY_STATE.CORRECT:
- case INQUIRY_STATE.WRONG:
- return checkEntry(pulldownData) ? 'correct-input' : 'wrong-input';
- case INQUIRY_STATE.SOLVED:
- return 'solved-input';
- default:
- return '';
- }
- };
-
- const onPulldownClicked = () => {
- if (!isDisabled) {
- setIsToggled(!isToggled);
- }
- };
-
- return (
-
-
- {pulldownData.selectedValue}{' '}
- {pulldownData.selectedValue === '...' ? : null}
-
-
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ExerciseRichText.jsx b/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ExerciseRichText.jsx
deleted file mode 100644
index a8ca2f8..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/ExerciseRichText.jsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { usePlaceholderReplacementEffect } from './usePlaceholderReplacementEffect';
-import { Text } from '../../../Text/Text';
-
-export const ExerciseRichText = ({
- content,
- createComponent,
- trigger,
- scopeClassName,
- className,
- isA = 'div',
- update = false,
- node,
-}) => {
- usePlaceholderReplacementEffect({ createComponent, trigger, scopeClassName, node });
- return (
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/clozeExerciseUtils.jsx b/sources-gen/components/Lesson/LessonExercise/ClozeExercise/clozeExerciseUtils.jsx
deleted file mode 100644
index 6566ba6..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/clozeExerciseUtils.jsx
+++ /dev/null
@@ -1,27 +0,0 @@
-export const placeholderConfig = [
- { placeholder: '#p#', size: 'medium', maxLength: 15 },
- { placeholder: '#ps#', size: 'small', maxLength: 7 },
- { placeholder: '#pm#', size: 'medium', maxLength: 15 },
- { placeholder: '#pl#', size: 'full', maxLength: null },
-];
-
-export const createSingleSentenceAnswerContent = (subInquiries, arrayJoinString) => {
- const sentences = subInquiries.map(subInquiry => subInquiry.subInquiryText);
- return sentences.join(arrayJoinString);
-};
-
-export const cleanupAndAddPlaceholderComponents = answertext => {
- // eslint-disable-next-line fp/no-let
- let answerWithReplacePlaceholders = answertext;
-
- const replaceInString = config => {
- // eslint-disable-next-line fp/no-mutation
- answerWithReplacePlaceholders = answerWithReplacePlaceholders.replace(
- new RegExp(config.placeholder, 'g'),
- `${config.size} `,
- );
- };
-
- placeholderConfig.forEach(replaceInString);
- return answerWithReplacePlaceholders;
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/usePlaceholderReplacementEffect.jsx b/sources-gen/components/Lesson/LessonExercise/ClozeExercise/usePlaceholderReplacementEffect.jsx
deleted file mode 100644
index df94dce..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ClozeExercise/usePlaceholderReplacementEffect.jsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import globals from '../../../../utils/globals';
-import { replacePlaceholderWithAnswerComponent } from '../../../../utils/replacers/exerciseReplacer';
-import { useTimeout } from '../../../../hooks/useTimeout';
-
-export const usePlaceholderReplacementEffect = ({
- selector,
- createComponent,
- trigger = 'staticTrigger',
- scopeClassName,
- node,
-}) => {
- useTimeout(
- {
- callback: () => {
- replacePlaceholderWithAnswerComponent({
- selector,
- createComponent,
- scopeClassName,
- node: node ? node.current : globals.window.document,
- });
- },
- delay: 10,
- },
- [trigger],
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/DictationExercise/DictationExercise.jsx b/sources-gen/components/Lesson/LessonExercise/DictationExercise/DictationExercise.jsx
deleted file mode 100644
index ef6cffa..0000000
--- a/sources-gen/components/Lesson/LessonExercise/DictationExercise/DictationExercise.jsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { DictationExerciseRow } from './DictationExerciseRow';
-import { AudioProvider } from '../../../../context/AudioContext';
-
-export const DictationExercise = ({ data }) => {
- const { inquiries } = data.content;
-
- return (
-
- {inquiries.map(inquiry => (
-
- ))}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/DictationExercise/DictationExerciseRow.jsx b/sources-gen/components/Lesson/LessonExercise/DictationExercise/DictationExerciseRow.jsx
deleted file mode 100644
index 3c7b98f..0000000
--- a/sources-gen/components/Lesson/LessonExercise/DictationExercise/DictationExerciseRow.jsx
+++ /dev/null
@@ -1,78 +0,0 @@
-import { useState } from 'react';
-import { useInquiryHandling } from '../workflow/useInquiryHandling';
-import { KeyboardWrapper } from '../Keyboard/KeyboardWrapper';
-import { TextAreaInput } from '../../../Input/TextAreaInput/TextAreaInput';
-import { LessonExerciseQuestionAudio } from '../LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionAudio';
-import { LessonExerciseHint } from '../LessonExerciseHint/LessonExerciseHint';
-import { StyledSolveCheckButton } from '../../../SolveCheckButton/SolveCheckButton';
-import { findQuestionAudio } from '../../../../utils/audioUtils';
-import { useAudio } from '../../../../hooks/useAudio';
-import { isNormalizedTextEqual } from '../utils/exerciseUtils';
-
-export const DictationExerciseRow = ({ inquiry }) => {
- const [input, setInput] = useState('');
-
- const {
- inquiryDescription,
- audios,
- text: solutionText,
- learningMetaInfo: { achievableScore },
- id: inquiryId,
- } = inquiry;
- const questionAudio = findQuestionAudio(audios);
-
- const {
- isSolveButtonDisabled,
- isCheckButtonDisabled,
- inquiryState,
- handleCorrectAnswer,
- handleWrongAnswer,
- handleSolved,
- isDisabled,
- } = useInquiryHandling({ inquiryId, achievableScore });
- const { playWrongDefaultAudioFeedBack, playCorrectDefaultAudioFeedBack } = useAudio();
-
- const onSolveClicked = () => {
- setInput(solutionText);
- handleSolved();
- };
- const onCheckClicked = () => {
- if (isNormalizedTextEqual(solutionText, input)) {
- handleCorrectAnswer();
- playCorrectDefaultAudioFeedBack();
- } else {
- handleWrongAnswer();
- playWrongDefaultAudioFeedBack();
- }
- };
-
- const onChange = event => {
- const newInput = event.target.value;
- setInput(newInput);
- };
-
- return (
-
-
-
-
-
-
-
- {!isDisabled() && (
-
- )}
-
-
-
-
-
-
onCheckClicked()}
- handleSolveClicked={() => onSolveClicked()}
- isSolveButtonDisabled={isSolveButtonDisabled}
- isCheckButtonDisabled={isCheckButtonDisabled}
- />
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/Keyboard/KeyboardIcon.jsx b/sources-gen/components/Lesson/LessonExercise/Keyboard/KeyboardIcon.jsx
deleted file mode 100644
index 4efab06..0000000
--- a/sources-gen/components/Lesson/LessonExercise/Keyboard/KeyboardIcon.jsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import styled from 'styled-components';
-import { ReactComponent as KeyboardIcon } from '../../../../assets/svg/keyboard.svg';
-import { resolutions } from '../../../../utils/css';
-
-export const StyledKeyboardIcon = styled(KeyboardIcon)`
- display: none;
-
- @media (min-width: ${resolutions.max.tabletLandscape}px) {
- display: block;
- .placeholder-cloze > & {
- display: inline-block;
- }
- }
-`;
diff --git a/sources-gen/components/Lesson/LessonExercise/Keyboard/KeyboardWrapper.jsx b/sources-gen/components/Lesson/LessonExercise/Keyboard/KeyboardWrapper.jsx
deleted file mode 100644
index 0135822..0000000
--- a/sources-gen/components/Lesson/LessonExercise/Keyboard/KeyboardWrapper.jsx
+++ /dev/null
@@ -1,146 +0,0 @@
-/* eslint-disable fp/no-mutation,no-param-reassign,no-return-assign,react-hooks/exhaustive-deps */
-import styled from 'styled-components';
-import classnames from 'classnames';
-import { useEffect, useRef, useState } from 'react';
-import './index.css'; // copied file from module path react-simple-keyboard/build/css/index.css due to SSR issues
-import Keyboard from 'react-simple-keyboard';
-import { StyledKeyboardIcon as KeyboardIcon } from './KeyboardIcon';
-import { TextAreaInput } from '../../../Input/TextAreaInput/TextAreaInput';
-
-// copy&pasted from simple-keyboard-layouts module because it was not usable in unit tests
-// import layout from 'simple-keyboard-layouts/build/layouts/german';
-const layout = {
- layout: {
- default: [
- '^ 1 2 3 4 5 6 7 8 9 0 \u00DF \u00B4 {bksp}',
- '{tab} q w e r t z u i o p \u00FC +',
- '{lock} a s d f g h j k l \u00F6 \u00E4 # {enter}',
- '{shift} < y x c v b n m , . - {shift}',
- '.com @ {space}',
- ],
- shift: [
- '\u00B0 ! " \u00A7 $ % & / ( ) = ? ` {bksp}',
- '{tab} Q W E R T Z U I O P \u00DC *',
- "{lock} A S D F G H J K L \u00D6 \u00C4 ' {enter}",
- '{shift} > Y X C V B N M ; : _ {shift}',
- '.com @ {space}',
- ],
- },
-};
-
-export const KeyboardWrapper = ({
- inputMaxLength,
- onChange,
- inputValue,
- inputClassName = '',
- isTextArea = false,
-}) => {
- const [isKeyboardVisible, setKeyboardVisible] = useState(false);
- const [layoutName, setLayoutName] = useState('default');
- const keyboardRef = useRef();
- const inputRef = useRef();
- const textAreaRef = useRef();
-
- useEffect(() => {
- if (isKeyboardVisible) {
- keyboardRef.current.setInput(inputValue);
- }
- if (inputRef.current) {
- inputRef.current.focus();
- }
- if (textAreaRef.current) {
- textAreaRef.current.focus();
- }
- }, [isKeyboardVisible]);
-
- const toggleKeyboard = () => {
- setKeyboardVisible(!isKeyboardVisible);
- };
-
- const handleKeyPress = pressedKey => {
- if (pressedKey === '{enter}') toggleKeyboard();
- if (pressedKey === '{shift}' || pressedKey === '{lock}') handleShift();
- };
-
- const onInputKeyPress = e => {
- if (e.charCode === 13) {
- toggleKeyboard();
- }
- };
-
- const handleShift = () => {
- const newLayoutName = layoutName === 'default' ? 'shift' : 'default';
- setLayoutName(newLayoutName);
- };
-
- const onChangeInput = input => {
- keyboardRef.current.setInput(input);
- onChange(input);
- };
-
- const onChangeLocalInput = e => {
- onChangeInput(e.target.value);
- };
-
- return (
- <>
-
- {isKeyboardVisible && (
- <>
-
-
-
- ×
-
- {!isTextArea && (
-
- )}
- {isTextArea && (
- false,
- onKeyPress: onInputKeyPress,
- isPlaceholderDisabled: true,
- ref: textAreaRef,
- }}
- />
- )}
-
-
(keyboardRef.current = r)}
- className="keyboard"
- {...{
- onChange: onChangeInput,
- onKeyPress: handleKeyPress,
- layoutName,
- ...layout,
- }}
- />
-
-
- >
- )}
- >
- );
-};
-
-export const StyledKeyboardBackdrop = styled.div`
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 990;
-`;
diff --git a/sources-gen/components/Lesson/LessonExercise/Keyboard/index.css b/sources-gen/components/Lesson/LessonExercise/Keyboard/index.css
deleted file mode 100644
index 54ccd8b..0000000
--- a/sources-gen/components/Lesson/LessonExercise/Keyboard/index.css
+++ /dev/null
@@ -1,22 +0,0 @@
-/*!
- *
- * react-simple-keyboard v3.2.65
- * https://github.com/hodgef/react-simple-keyboard
- *
- * Copyright (c) Francisco Hodge (https://github.com/hodgef) and project contributors.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- *
- */
-/*!
- *
- * simple-keyboard v3.2.44
- * https://github.com/hodgef/simple-keyboard
- *
- * Copyright (c) Francisco Hodge (https://github.com/hodgef) and project contributors.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- *
- */.hg-theme-default{background-color:#ececec;border-radius:5px;box-sizing:border-box;font-family:HelveticaNeue-Light,Helvetica Neue Light,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;overflow:hidden;padding:5px;touch-action:manipulation;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.hg-theme-default .hg-button span{pointer-events:none}.hg-theme-default button.hg-button{border-width:0;font-size:inherit;outline:0}.hg-theme-default .hg-button{display:inline-block;flex-grow:1}.hg-theme-default .hg-row{display:flex}.hg-theme-default .hg-row:not(:last-child){margin-bottom:5px}.hg-theme-default .hg-row .hg-button:not(:last-child){margin-right:5px}.hg-theme-default .hg-row .hg-button-container{margin-right:5px}.hg-theme-default .hg-row>div:last-child{margin-right:0}.hg-theme-default .hg-row .hg-button-container{display:flex}.hg-theme-default .hg-button{-webkit-tap-highlight-color:rgba(0,0,0,0);align-items:center;background:#fff;border-bottom:1px solid #b5b5b5;border-radius:5px;box-shadow:0 0 3px -1px rgba(0,0,0,.3);box-sizing:border-box;cursor:pointer;display:flex;height:40px;justify-content:center;padding:5px}.hg-theme-default .hg-button.hg-standardBtn{width:20px}.hg-theme-default .hg-button.hg-activeButton{background:#efefef}.hg-theme-default.hg-layout-numeric .hg-button{align-items:center;display:flex;height:60px;justify-content:center;width:33.3%}.hg-theme-default .hg-button.hg-button-numpadadd,.hg-theme-default .hg-button.hg-button-numpadenter{height:85px}.hg-theme-default .hg-button.hg-button-numpad0{width:105px}.hg-theme-default .hg-button.hg-button-com{max-width:85px}.hg-theme-default .hg-button.hg-standardBtn.hg-button-at{max-width:45px}.hg-theme-default .hg-button.hg-selectedButton{background:rgba(5,25,70,.53);color:#fff}.hg-theme-default .hg-button.hg-standardBtn[data-skbtn=".com"]{max-width:82px}.hg-theme-default .hg-button.hg-standardBtn[data-skbtn="@"]{max-width:60px}.hg-candidate-box{background:#ececec;border-bottom:2px solid #b5b5b5;border-radius:5px;display:inline-flex;margin-top:-10px;max-width:272px;position:absolute;transform:translateY(-100%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}ul.hg-candidate-box-list{display:flex;flex:1;list-style:none;margin:0;padding:0}li.hg-candidate-box-list-item{align-items:center;display:flex;height:40px;justify-content:center;width:40px}li.hg-candidate-box-list-item:hover{background:rgba(0,0,0,.03);cursor:pointer}li.hg-candidate-box-list-item:active{background:rgba(0,0,0,.1)}.hg-candidate-box-prev:before{content:"◄"}.hg-candidate-box-next:before{content:"►"}.hg-candidate-box-next,.hg-candidate-box-prev{align-items:center;background:#d0d0d0;color:#969696;cursor:pointer;display:flex;padding:0 10px}.hg-candidate-box-next{border-bottom-right-radius:5px;border-top-right-radius:5px}.hg-candidate-box-prev{border-bottom-left-radius:5px;border-top-left-radius:5px}.hg-candidate-box-btn-active{color:#444}
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseAnswer/ExerciseAnswer.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseAnswer/ExerciseAnswer.jsx
deleted file mode 100644
index 4593418..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseAnswer/ExerciseAnswer.jsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import gql from 'graphql-tag';
-import { INQUIRY_MEDIA_TYPE } from '../../../../constants/inquiryMediaTypes';
-import { LessonExerciseTextAnswer } from './LessonExerciseTextAnswer/LessonExerciseTextAnswer';
-import { LessonExerciseImageAnswer } from './LessonExerciseImageAnswer/LessonExerciseImageAnswer';
-
-export const lessonExerciseAnswerFragment = {
- name: 'LessonExerciseAnswer',
- fragment() {
- return gql`fragment ${this.name} on Inquiry {
- subInquiries {
- id
- subInquiryText: inquiryText
- subInquiryDescription: inquiryDescription
- images {
- id
- }
- alternatives {
- id
- alternativeText
- isCorrect
- images {
- id
- }
- }
- }
- }
- `;
- },
-};
-
-export const ExerciseAnswer = ({ answerMediaType, answer, index, onAnswerClicked, addRef }) => {
- const Component =
- answerMediaType === INQUIRY_MEDIA_TYPE.TEXT.toLowerCase()
- ? LessonExerciseTextAnswer
- : LessonExerciseImageAnswer;
- return (
- onAnswerClicked(e, index)}
- ref={ref => {
- addRef(index, ref);
- }}
- />
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseAnswer/LessonExerciseImageAnswer/LessonExerciseImageAnswer.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseAnswer/LessonExerciseImageAnswer/LessonExerciseImageAnswer.jsx
deleted file mode 100644
index 75fbc7f..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseAnswer/LessonExerciseImageAnswer/LessonExerciseImageAnswer.jsx
+++ /dev/null
@@ -1,44 +0,0 @@
-/* eslint-disable jsx-a11y/role-supports-aria-props */
-import { forwardRef } from 'react';
-import { ANSWER_STATE } from '../answerState';
-import { useFrontendConfig } from '../../../../../hooks/useFrontendConfig';
-
-export const LessonExerciseImageAnswer = forwardRef(({ answer, handleAnswerClicked }, ref) => {
- const { imageBasePath } = useFrontendConfig();
-
- const assignAnswerClass = ({ answerState }) => {
- switch (answerState) {
- case ANSWER_STATE.INITIAL:
- return '';
- case ANSWER_STATE.SELECTED:
- return 'selected-image';
- case ANSWER_STATE.CORRECT:
- return 'correct-image';
- case ANSWER_STATE.WRONG:
- return 'wrong-image';
- case ANSWER_STATE.SOLVED:
- return 'solved-image';
- default:
- // eslint-disable-next-line fp/no-throw
- throw new Error('invalid answerState');
- }
- };
-
- return (
-
-
-
- );
-});
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseAnswer/LessonExerciseTextAnswer/LessonExerciseTextAnswer.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseAnswer/LessonExerciseTextAnswer/LessonExerciseTextAnswer.jsx
deleted file mode 100644
index 2e2af43..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseAnswer/LessonExerciseTextAnswer/LessonExerciseTextAnswer.jsx
+++ /dev/null
@@ -1,67 +0,0 @@
-/* eslint-disable jsx-a11y/role-supports-aria-props */
-import { forwardRef } from 'react';
-import { createGlobalStyle } from 'styled-components';
-import { ANSWER_STATE } from '../answerState';
-
-const LessonExerciseTextAnswerGlobalStyles = createGlobalStyle`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-`;
-
-export const LessonExerciseTextAnswer = forwardRef(({ answer, handleAnswerClicked }, ref) => {
- const assignAnswerAriaLabel = ({ answerState }) => {
- switch (answerState) {
- case ANSWER_STATE.INITIAL:
- return 'Not selected';
- case ANSWER_STATE.SOLVED:
- case ANSWER_STATE.SELECTED:
- return 'Selected';
- case ANSWER_STATE.CORRECT:
- return 'Correct';
- case ANSWER_STATE.WRONG:
- return 'Wrong';
- default:
- // eslint-disable-next-line fp/no-throw
- throw new Error('invalid answerState');
- }
- };
-
- const getAnswerClass = ({ answerState }) => {
- switch (answerState) {
- case ANSWER_STATE.INITIAL:
- return '';
- case ANSWER_STATE.SELECTED:
- return 'selected';
- case ANSWER_STATE.CORRECT:
- return 'correct';
- case ANSWER_STATE.WRONG:
- return 'wrong';
- case ANSWER_STATE.SOLVED:
- return 'solved';
- default:
- // eslint-disable-next-line fp/no-throw
- throw new Error('invalid answerState');
- }
- };
-
- return (
-
-
-
- {answer.alternativeText}
-
-
- );
-});
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseAnswer/answerState.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseAnswer/answerState.jsx
deleted file mode 100644
index a0b66d7..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseAnswer/answerState.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export const ANSWER_STATE = Object.freeze({
- INITIAL: 'initial',
- SELECTED: 'selected',
- WRONG: 'wrong',
- CORRECT: 'correct',
- SOLVED: 'solved',
-});
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseHeadline/LessonExerciseHeadline.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseHeadline/LessonExerciseHeadline.jsx
deleted file mode 100644
index 4cf1e20..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseHeadline/LessonExerciseHeadline.jsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import gql from 'graphql-tag';
-import { ContentHeadline } from '../../../ContentContainer/ContentHeadline/ContentHeadline';
-
-export const lessonExerciseHeadlineFragment = {
- name: 'LessonExerciseHeadline',
- fragment() {
- return gql`fragment ${this.name} on Exercise {
- name
- description
- }
- `;
- },
-};
-
-export const LessonExerciseHeadline = ({ data }) => {
- const { name, description } = data.content;
- return (
-
- {name}
-
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseHiddenAudio.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseHiddenAudio.jsx
deleted file mode 100644
index e1424fb..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseHiddenAudio.jsx
+++ /dev/null
@@ -1,16 +0,0 @@
-/* eslint-disable jsx-a11y/media-has-caption */
-import { forwardRef } from 'react';
-
-export const LessonExerciseHiddenAudio = forwardRef(({ src }, ref) => (
-
-));
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseSoundFailureHiddenAudio.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseSoundFailureHiddenAudio.jsx
deleted file mode 100644
index 0a0a5c1..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseSoundFailureHiddenAudio.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import { forwardRef } from 'react';
-import { LessonExerciseHiddenAudio } from './LessonExerciseHiddenAudio';
-
-export const LessonExerciseSoundFailureHiddenAudio = forwardRef((_, ref) => (
-
-));
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseSoundSuccessHiddenAudio.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseSoundSuccessHiddenAudio.jsx
deleted file mode 100644
index 20678cc..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseSoundSuccessHiddenAudio.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import { forwardRef } from 'react';
-import { LessonExerciseHiddenAudio } from './LessonExerciseHiddenAudio';
-
-export const LessonExerciseSoundSuccessHiddenAudio = forwardRef((_, ref) => (
-
-));
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseHint/LessonExerciseHint.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseHint/LessonExerciseHint.jsx
deleted file mode 100644
index 329987b..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseHint/LessonExerciseHint.jsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { createGlobalStyle } from 'styled-components';
-import { ReactComponent as IconHintSimple } from '../../../../assets/svg/icon-hint.svg';
-import { ReactComponent as IconHintCircleOrange } from '../../../../assets/svg/icon-hint-circle-orange.svg';
-
-export const LessonExerciseHintGlobalStyles = createGlobalStyle`
- /* @noflip */
- .exercise-container .exercise-hint span.hint {
- right: 0
- }
-
- @media (min-width: 768px) {
- .exercise-container .exercise-hint p {
- text-align: left;
- }
- }
-`;
-
-export const LessonExerciseHint = ({ description, isSimpleIconHint = false, isA = 'div' }) => {
- const hintSVG = isSimpleIconHint ? : ;
- const Tag = isA;
-
- return (
- description && (
-
-
- {hintSVG}
-
-
- )
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseItem/ExerciseLeavingPrompt.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseItem/ExerciseLeavingPrompt.jsx
deleted file mode 100644
index 0c1ff4a..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseItem/ExerciseLeavingPrompt.jsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Prompt } from 'react-router-dom';
-import { useBeforeunload } from 'react-beforeunload';
-import { useTranslation } from '../../../../hooks/useTranslation';
-import { isPathInExerciseNavigationWhiteList } from '../../../../utils/url/urlUtils';
-
-export const ExerciseLeavingPrompt = () => {
- useBeforeunload(event => {
- event.preventDefault();
- });
-
- const leaveMessage = useTranslation('client.exercise.interrupt');
- return (
- {
- if (action === 'POP') {
- return leaveMessage;
- }
- return isPathInExerciseNavigationWhiteList(location.pathname) ? true : leaveMessage;
- }}
- />
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseItem/LessonExerciseItem.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseItem/LessonExerciseItem.jsx
deleted file mode 100644
index 66b5005..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseItem/LessonExerciseItem.jsx
+++ /dev/null
@@ -1,137 +0,0 @@
-import gql from 'graphql-tag';
-import { ContentNavTitle } from '../../../ContentContainer/ContentNavTitle/ContentNavTitle';
-import { LessonExerciseHeadline } from '../LessonExerciseHeadline/LessonExerciseHeadline';
-import { ClozeExercise, clozeExerciseFragment } from '../ClozeExercise/ClozeExercise';
-import { DictationExercise } from '../DictationExercise/DictationExercise';
-import { ManyToManyExercise } from '../ManyToManyExercise/ManyToManyExercise';
-import { MediaInputVideo } from '../../../MediaInput/MediaInputVideo/MediaInputVideo';
-import { MediaInputImage } from '../../../MediaInput/MediaInputImage/MediaInputImage';
-import { MediaInputAudio } from '../../../MediaInput/MediaInputAudio/MediaInputAudio';
-import { MultiSelectionExercise } from '../MultiSelectionExercise/MultiSelectionExercise';
-import { RepeatExercise } from '../RepeatExercise/RepeatExercise';
-import { SingleSelectionExercise } from '../SingleSelectionExercise/SingleSelectionExercise';
-import { SortingExercise } from '../SortingExercise/SortingExercise';
-import { useKnowledgePlaceholderReplacementEffect } from '../../../Modal/KnowledgeModal/useKnowledgePlaceholderReplacementEffect';
-import { lessonExerciseAnswerFragment } from '../LessonExerciseAnswer/ExerciseAnswer';
-import { lessonExerciseQuestionFragment } from '../LessonExerciseQuestion/LessonExerciseQuestion';
-import { sortingExerciseFragment } from '../SortingExercise/SortingExerciseRow';
-import { ExerciseLeavingPrompt } from './ExerciseLeavingPrompt';
-import { Manuscript } from '../../../Manuscript/Manuscript';
-
-export const lessonExerciseItemFragment = {
- name: 'LessonExerciseItem',
- fragment() {
- return gql`fragment ${this.name} on Inquiry {
- id
- inquiryDescription
- inquiryType
- selectionType
- sortingType
- mediaType
- learningMetaInfo {
- achievableScore
- }
- ...${lessonExerciseAnswerFragment.name}
- ...${lessonExerciseQuestionFragment.name}
- ...${sortingExerciseFragment.name}
- ...${clozeExerciseFragment.name}
- }
-
- ${lessonExerciseQuestionFragment.fragment()}
- ${lessonExerciseAnswerFragment.fragment()}
- ${sortingExerciseFragment.fragment()}
- ${clozeExerciseFragment.fragment()}
- `;
- },
-};
-
-export const getExerciseComponentBySelectionType = (selectionType, data) => {
- switch (selectionType) {
- case 'SINGLE':
- return ;
- case 'DIRECT':
- return ;
- case 'MULTIPLE':
- return ;
- default:
- return null;
- }
-};
-
-export const getExerciseComponentByType = data => {
- const { inquiryType, selectionType } = data.content.inquiries[0];
- switch (inquiryType) {
- case 'ASSOCIATION':
- return getExerciseComponentBySelectionType(selectionType, data);
- case 'DICTATION':
- return ;
- case 'REPEAT':
- return ;
- case 'CLOZE':
- return ;
- case 'SORTING':
- return ;
- default:
- return 'OTHER EXERCISE TYPE PLACEHOLDER';
- }
-};
-
-export const getExerciseMediaInputComponentByType = data => {
- const { inputType } = data.content;
- switch (inputType) {
- case 'NONE':
- return null;
- case 'TEXT':
- return null;
- case 'IMAGE':
- return ;
- case 'AUDIO':
- return (
-
-
-
- );
- // XXX: Here is the problem. These exercises return inputType == 'VIDEO'
- // even though they don't have any videos (videos == []) causing some
- // code that assumes that there is a video inside videos to fail
- // (the MediaInputVideo component.)
- case 'VIDEO':
- // This "if" is our patch. If it isn't true, it fallsthrough to the default
- // behaviour (returning null.)
- if (data.content.videos.length > 0) {
- return (
-
-
-
- );
- }
- default:
- return null;
- }
-};
-
-export const LessonExerciseItem = ({ data, exerciseCounter, manuscriptContent }) => {
- const contentComponent = getExerciseComponentByType(data);
- const mediaInputComponent = getExerciseMediaInputComponentByType(data);
-
- useKnowledgePlaceholderReplacementEffect({
- knowledges: [...data.content.knowledges, ...manuscriptContent.knowledges],
- });
-
- return (
- <>
-
- {mediaInputComponent && (
-
-
{mediaInputComponent}
-
- )}
-
-
- {manuscriptContent.manuscript && (
-
- )}
- {contentComponent}
- >
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseItem/LessonExerciseItem.jsx.orig b/sources-gen/components/Lesson/LessonExercise/LessonExerciseItem/LessonExerciseItem.jsx.orig
deleted file mode 100644
index 6d35539..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseItem/LessonExerciseItem.jsx.orig
+++ /dev/null
@@ -1,129 +0,0 @@
-import gql from 'graphql-tag';
-import { ContentNavTitle } from '../../../ContentContainer/ContentNavTitle/ContentNavTitle';
-import { LessonExerciseHeadline } from '../LessonExerciseHeadline/LessonExerciseHeadline';
-import { ClozeExercise, clozeExerciseFragment } from '../ClozeExercise/ClozeExercise';
-import { DictationExercise } from '../DictationExercise/DictationExercise';
-import { ManyToManyExercise } from '../ManyToManyExercise/ManyToManyExercise';
-import { MediaInputVideo } from '../../../MediaInput/MediaInputVideo/MediaInputVideo';
-import { MediaInputImage } from '../../../MediaInput/MediaInputImage/MediaInputImage';
-import { MediaInputAudio } from '../../../MediaInput/MediaInputAudio/MediaInputAudio';
-import { MultiSelectionExercise } from '../MultiSelectionExercise/MultiSelectionExercise';
-import { RepeatExercise } from '../RepeatExercise/RepeatExercise';
-import { SingleSelectionExercise } from '../SingleSelectionExercise/SingleSelectionExercise';
-import { SortingExercise } from '../SortingExercise/SortingExercise';
-import { useKnowledgePlaceholderReplacementEffect } from '../../../Modal/KnowledgeModal/useKnowledgePlaceholderReplacementEffect';
-import { lessonExerciseAnswerFragment } from '../LessonExerciseAnswer/ExerciseAnswer';
-import { lessonExerciseQuestionFragment } from '../LessonExerciseQuestion/LessonExerciseQuestion';
-import { sortingExerciseFragment } from '../SortingExercise/SortingExerciseRow';
-import { ExerciseLeavingPrompt } from './ExerciseLeavingPrompt';
-import { Manuscript } from '../../../Manuscript/Manuscript';
-
-export const lessonExerciseItemFragment = {
- name: 'LessonExerciseItem',
- fragment() {
- return gql`fragment ${this.name} on Inquiry {
- id
- inquiryDescription
- inquiryType
- selectionType
- sortingType
- mediaType
- learningMetaInfo {
- achievableScore
- }
- ...${lessonExerciseAnswerFragment.name}
- ...${lessonExerciseQuestionFragment.name}
- ...${sortingExerciseFragment.name}
- ...${clozeExerciseFragment.name}
- }
-
- ${lessonExerciseQuestionFragment.fragment()}
- ${lessonExerciseAnswerFragment.fragment()}
- ${sortingExerciseFragment.fragment()}
- ${clozeExerciseFragment.fragment()}
- `;
- },
-};
-
-export const getExerciseComponentBySelectionType = (selectionType, data) => {
- switch (selectionType) {
- case 'SINGLE':
- return ;
- case 'DIRECT':
- return ;
- case 'MULTIPLE':
- return ;
- default:
- return null;
- }
-};
-
-export const getExerciseComponentByType = data => {
- const { inquiryType, selectionType } = data.content.inquiries[0];
- switch (inquiryType) {
- case 'ASSOCIATION':
- return getExerciseComponentBySelectionType(selectionType, data);
- case 'DICTATION':
- return ;
- case 'REPEAT':
- return ;
- case 'CLOZE':
- return ;
- case 'SORTING':
- return ;
- default:
- return 'OTHER EXERCISE TYPE PLACEHOLDER';
- }
-};
-
-export const getExerciseMediaInputComponentByType = data => {
- const { inputType } = data.content;
- switch (inputType) {
- case 'NONE':
- return null;
- case 'TEXT':
- return null;
- case 'IMAGE':
- return ;
- case 'AUDIO':
- return (
-
-
-
- );
- case 'VIDEO':
- return (
-
-
-
- );
- default:
- return null;
- }
-};
-
-export const LessonExerciseItem = ({ data, exerciseCounter, manuscriptContent }) => {
- const contentComponent = getExerciseComponentByType(data);
- const mediaInputComponent = getExerciseMediaInputComponentByType(data);
-
- useKnowledgePlaceholderReplacementEffect({
- knowledges: [...data.content.knowledges, ...manuscriptContent.knowledges],
- });
-
- return (
- <>
-
- {mediaInputComponent && (
-
-
{mediaInputComponent}
-
- )}
-
-
- {manuscriptContent.manuscript && (
-
- )}
- {contentComponent}
- >
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseNavigation/LessonExerciseNavigation.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseNavigation/LessonExerciseNavigation.jsx
deleted file mode 100644
index 63cfb84..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseNavigation/LessonExerciseNavigation.jsx
+++ /dev/null
@@ -1,191 +0,0 @@
-/* eslint-disable react-hooks/exhaustive-deps */
-import { useEffect } from 'react';
-import gql from 'graphql-tag';
-import { useHistory, useParams } from 'react-router-dom';
-import { useDispatch, useSelector } from 'react-redux';
-import { LessonExerciseStats } from '../LessonExerciseStats/LessonExerciseStats';
-import { useScrollToTop } from '../../../../hooks/useScrollToTop';
-import { ContentNavTitle } from '../../../ContentContainer/ContentNavTitle/ContentNavTitle';
-import { StyledStandardButton } from '../../../StandardButton/StandardButton';
-import { knowledgesFragment } from '../../LessonKnowledge/LessonKnowledge';
-import {
- LessonExerciseItem,
- lessonExerciseItemFragment,
-} from '../LessonExerciseItem/LessonExerciseItem';
-import { normalizeUrlName } from '../../../../utils/url/url';
-import { createLinkToResultPage, getLessonUrl } from '../../../../utils/url/urlFactory';
-import { WithGraphQLQueryHandling } from '../../../WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { lessonExerciseHeadlineFragment } from '../LessonExerciseHeadline/LessonExerciseHeadline';
-import { useExerciseProgress } from '../workflow/ExerciseProgress';
-import {
- addLessonProgress,
- readLessonProgress,
-} from '../../../../state/progress/learnProgressDuck';
-import { createLearnProgressData, scoreFragment } from '../../../../state/progress/learnProgress';
-import { mediaInputChooserFragment } from '../../MediaInputChooser/MediaInputChooser';
-import { useExerciseManager } from '../../../../hooks/useExerciseManager';
-import { isLessonInImproveModeSelector } from '../../../../state/mode/lessonExerciseModeSelectors';
-import { userDataSelector } from '../../../../state/user/userSelectors';
-import { metaDataFragment, PageMetaData } from '../../../Page/PageMetaData';
-import { PAGE_TYPES } from '../../../../constants/pageTypes';
-import {
- gtmDataLayerFragment,
- GtmScriptWithDataLayer,
-} from '../../../GoogleTagManager/GtmScriptWithDataLayer';
-
-export const lessonExerciseQuery = ({ handicap }) => gql`
- query LessonExercise($exerciseId: Int!, $lessonLang: Language!) {
- content(id: $exerciseId, lang: $lessonLang) {
- ... on Exercise {
- id
- name
- inputType
- inputText
- images {
- id
- }
- inquiries {
- ...${lessonExerciseItemFragment.name}
- }
- ...${lessonExerciseHeadlineFragment.name}
- ...ExerciseMediaInputChooser
- ...${`ExerciseScore${handicap || ''}`}
- ...ExerciseKnowledges
- ...${metaDataFragment.name}
- ${gtmDataLayerFragment.partial()}
- }
- }
- }
- ${lessonExerciseHeadlineFragment.fragment()}
- ${lessonExerciseItemFragment.fragment()}
- ${mediaInputChooserFragment.fragment({ type: 'Exercise' })}
- ${scoreFragment.fragment({ type: 'Exercise', handicap })}
- ${knowledgesFragment.fragment({ type: 'Exercise' })}
- ${metaDataFragment.fragment({ type: 'Exercise' })}
-`;
-
-export const LessonExerciseNavigation = ({
- lessonExerciseOverviewItems,
- lessonLang,
- lessonName,
- lessonAchievableScore,
- courseId,
- manuscriptContent,
- isFinalTest,
-}) => {
- useScrollToTop();
- const history = useHistory();
- const { langCode, lessonId, exerciseId } = useParams();
- const { exerciseProgress, resetProgress } = useExerciseProgress();
- const { handicap } = useSelector(userDataSelector) || {};
- const dispatch = useDispatch();
- const lessonIdNumber = +lessonId;
- const exerciseIdNumber = +exerciseId;
-
- const isLessonInImproveMode = useSelector(isLessonInImproveModeSelector(lessonIdNumber));
-
- const {
- nextExerciseLink,
- currentExerciseCount,
- allExerciseCount,
- filterExerciseDataIfInImproveMode,
- } = useExerciseManager({
- lessonName,
- lessonExerciseOverviewItems,
- courseId,
- isFinalTest,
- });
-
- useEffect(() => {
- // reset local progress state in case of browser back and forward buttons have been used
- const unlisten = history.listen((location, action) => {
- if (action === 'POP') {
- resetProgress();
- if (isLessonInImproveMode) {
- history.push(createLinkToResultPage({ courseId, lessonName, lessonPath }));
- }
- }
- });
- return () => unlisten();
- }, [history]);
-
- useEffect(() => {
- dispatch(readLessonProgress(lessonIdNumber));
- }, [lessonIdNumber]);
-
- const lessonPath = getLessonUrl(lessonId, langCode, normalizeUrlName(lessonName));
- const lessonExerciseNavQueryVariables = {
- exerciseId: exerciseIdNumber,
- lessonLang,
- };
-
- const exerciseCounter = `${currentExerciseCount} / ${allExerciseCount}`;
-
- const handleNextButtonClick = ({ exerciseAchievableScore }) => {
- const progressMetaData = createLearnProgressData({
- langCode,
- lessonId: lessonIdNumber,
- courseId,
- lessonAchievableScore,
- exerciseId: exerciseIdNumber,
- allExerciseCount,
- exerciseProgress,
- exerciseAchievableScore,
- });
- dispatch(addLessonProgress(progressMetaData));
- resetProgress();
- const nextPath =
- nextExerciseLink() || createLinkToResultPage({ courseId, isFinalTest, lessonPath });
- history.push(nextPath);
- };
-
- return (
-
- {data => {
- const { content } = data;
- const {
- learningMetaInfo: { achievableScore: exerciseAchievableScore },
- } = content;
-
- const filteredData = filterExerciseDataIfInImproveMode(data);
- const amountOfInquiries = filteredData.content.inquiries.length;
-
- return (
- <>
-
-
-
-
-
-
-
-
-
- handleNextButtonClick({
- exerciseAchievableScore,
- })
- }
- />
-
-
-
-
-
- >
- );
- }}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/LessonExerciseQuestion.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/LessonExerciseQuestion.jsx
deleted file mode 100644
index 2ea8e30..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/LessonExerciseQuestion.jsx
+++ /dev/null
@@ -1,78 +0,0 @@
-import gql from 'graphql-tag';
-import { LessonExerciseQuestionAudio } from './QuestionTypes/LessonExerciseQuestionAudio';
-import { LessonExerciseQuestionImage } from './QuestionTypes/LessonExerciseQuestionImage';
-import { LessonExerciseQuestionText } from './QuestionTypes/LessonExerciseQuestionText';
-import { LessonExerciseQuestionVideo } from './QuestionTypes/LessonExerciseQuestionVideo';
-import { findQuestionAudio } from '../../../../utils/audioUtils';
-import { QUESTION_TYPES } from './QuestionTypes/questionTypes';
-import { mediaInputVideoFragment } from '../../../MediaInput/MediaInputVideo/MediaInputVideo';
-
-export const lessonExerciseQuestionFragment = {
- name: 'LessonExerciseQuestion',
- fragment() {
- return gql`fragment ${this.name} on Inquiry {
- inquiryText
- mainContentImage {
- id
- name
- }
- audios: contentLinks(targetTypes: [AUDIO]) {
- id
- mainContent
- target {
- ...on Audio {
- mp3Src
- mainContentImage {
- imageId: id
- imageName: name
- }
- }
- }
- }
- ...Inquiry${mediaInputVideoFragment.name}
- }
- ${mediaInputVideoFragment.fragment({ type: 'Inquiry' })}
- `;
- },
-};
-
-export const exerciseQuestionTypeSelector = ({ inquiry }) => {
- const { videos, audios, mainContentImage } = inquiry;
- if (mainContentImage) {
- return QUESTION_TYPES.IMAGE;
- }
- if (videos.length > 0) {
- return QUESTION_TYPES.VIDEO;
- }
- if (findQuestionAudio(audios)) {
- return QUESTION_TYPES.AUDIO;
- }
- return QUESTION_TYPES.TEXT;
-};
-
-export const LessonExerciseQuestion = ({ inquiry, useSubInquiryTextAsLabel = false }) => {
- const { inquiryText, videos, audios, mainContentImage, subInquiries } = inquiry;
- const questionType = exerciseQuestionTypeSelector({ inquiry });
-
- const getLabelText = () => {
- if (inquiryText) return inquiryText;
- if (subInquiries && useSubInquiryTextAsLabel) return subInquiries[0].subInquiryText;
- return '';
- };
-
- const labelText = getLabelText(inquiryText, subInquiries);
- const questionAudio = findQuestionAudio(audios);
-
- switch (questionType) {
- case QUESTION_TYPES.IMAGE:
- return ;
- case QUESTION_TYPES.VIDEO:
- return ;
- case QUESTION_TYPES.AUDIO:
- return ;
- case QUESTION_TYPES.TEXT:
- return ;
- default:
- return null;
- }
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionAudio.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionAudio.jsx
deleted file mode 100644
index 0548750..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionAudio.jsx
+++ /dev/null
@@ -1,91 +0,0 @@
-/* eslint-disable jsx-a11y/role-supports-aria-props */
-import { useEffect, useRef, useState } from 'react';
-import { createGlobalStyle } from 'styled-components';
-import { useAudio } from '../../../../../hooks/useAudio';
-import { useTranslation } from '../../../../../hooks/useTranslation';
-import { useFrontendConfig } from '../../../../../hooks/useFrontendConfig';
-
-const LessonExerciseQuestionAudioGlobalStyles = createGlobalStyle`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-`;
-
-export const LessonExerciseQuestionAudio = ({ audio, inquiryText }) => {
- const [isPlaying, setIsPlaying] = useState(false);
- const [hasEnded, setHasEnded] = useState(false);
-
- const playAudioLabel = useTranslation('exercise.playAudio');
- const { target: answerAudio } = audio || {};
- const { mp3Src: audioUrl, mainContentImage } = answerAudio || {};
-
- const audioRef = useRef();
- const { addRef, playAudio } = useAudio();
-
- const { imageBasePath } = useFrontendConfig();
-
- useEffect(() => {
- addRef(audioRef);
- }, [addRef]);
-
- const handleOnPlaying = () => {
- setIsPlaying(true);
- };
-
- const handleOnEnded = () => {
- setIsPlaying(false);
- setHasEnded(true);
- };
-
- const handleOnPaused = () => {
- setIsPlaying(false);
- };
-
- const getBubbleAudioLabel = () => {
- if (isPlaying) return 'playing';
-
- if (hasEnded) return 'ending';
-
- return '';
- };
-
- const audioLabel = inquiryText || playAudioLabel;
- return (
- <>
- playAudio(e, audioRef)}
- >
-
- {/* eslint-disable-next-line jsx-a11y/media-has-caption */}
-
-
-
- {audioLabel}
-
-
- {mainContentImage && (
-
-
-
- )}
- >
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionImage.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionImage.jsx
deleted file mode 100644
index 2709f7d..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionImage.jsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { LessonExerciseQuestionText } from './LessonExerciseQuestionText';
-import { useFrontendConfig } from '../../../../../hooks/useFrontendConfig';
-
-export const LessonExerciseQuestionImage = ({ inquiryText, mainContentImage }) => {
- const { id, name } = mainContentImage;
- const { imageBasePath } = useFrontendConfig();
- return (
- <>
-
-
-
-
- >
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionText.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionText.jsx
deleted file mode 100644
index c79e579..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionText.jsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { createGlobalStyle } from 'styled-components';
-
-export const LessonExerciseQuestionTextGlobalStyles = createGlobalStyle`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-`;
-
-export const LessonExerciseQuestionText = ({ inquiryText }) => (
- <>
-
- {inquiryText}
- >
-);
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionVideo.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionVideo.jsx
deleted file mode 100644
index ff386b5..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionVideo.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { LessonExerciseQuestionText } from './LessonExerciseQuestionText';
-import { MediaInputVideo } from '../../../../MediaInput/MediaInputVideo/MediaInputVideo';
-
-export const LessonExerciseQuestionVideo = ({ inquiryText, videos }) => (
- <>
-
-
-
-
- >
-);
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/questionTypes.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/questionTypes.jsx
deleted file mode 100644
index 5b94b9a..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/questionTypes.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-export const QUESTION_TYPES = Object.freeze({
- TEXT: 'TEXT',
- IMAGE: 'IMAGE',
- AUDIO: 'AUDIO',
- VIDEO: 'VIDEO',
-});
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseResult/ExerciseAction.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseResult/ExerciseAction.jsx
deleted file mode 100644
index 4a794d8..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseResult/ExerciseAction.jsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import { useSelector } from 'react-redux';
-import { I18nText } from '../../../I18n/I18nText';
-import { userSelector } from '../../../../state/user/userSelectors';
-
-export const EXERCISE_ACTION_TYPES = Object.freeze({
- CONTINUE: 'CONTINUE',
- IMPROVE: 'IMPROVE',
- SAVE: 'SAVE',
-});
-
-const generateActionKey = (actionType, isLoggedIn) => {
- const translationPrefix = 'lesson.exercises.result';
-
- switch (actionType) {
- case EXERCISE_ACTION_TYPES.CONTINUE:
- return `${translationPrefix}.notSave`;
- case EXERCISE_ACTION_TYPES.IMPROVE:
- return isLoggedIn ? `${translationPrefix}.correct` : `${translationPrefix}.loginFixErrors`;
- case EXERCISE_ACTION_TYPES.SAVE:
- return isLoggedIn ? `${translationPrefix}.save` : `${translationPrefix}.loginSave`;
- default:
- // eslint-disable-next-line fp/no-throw
- throw new Error('invalid action');
- }
-};
-
-export const ExerciseAction = ({ name, actionType, onClickAction, href }) => {
- const { isLoggedIn } = useSelector(userSelector);
- const actionKey = generateActionKey(actionType, isLoggedIn);
-
- return (
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseResult/LessonExerciseResult.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseResult/LessonExerciseResult.jsx
deleted file mode 100644
index a8ee112..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseResult/LessonExerciseResult.jsx
+++ /dev/null
@@ -1,192 +0,0 @@
-/* eslint-disable react-hooks/exhaustive-deps */
-import { useDispatch, useSelector } from 'react-redux';
-import { useEffect } from 'react';
-import { useHistory, useParams } from 'react-router-dom';
-import { createGlobalStyle } from 'styled-components';
-import { EXERCISE_ACTION_TYPES, ExerciseAction } from './ExerciseAction';
-import { LessonExerciseHint } from '../LessonExerciseHint/LessonExerciseHint';
-import { Summary } from './Summary';
-import {
- filteredAssembledInfos,
- filterLessonExerciseOverviewItems,
-} from '../../../../utils/lessonUtils';
-import { userSelector } from '../../../../state/user/userSelectors';
-import { useI18nContext } from '../../../../context/I18nContext';
-import { removeImproveMode, setImproveMode } from '../../../../state/mode/lessonExerciseModeDuck';
-import { useExerciseManager } from '../../../../hooks/useExerciseManager';
-import { getLessonUrl, getLoginPage, getSummaryUrl } from '../../../../utils/url/urlFactory';
-import { useGlobalsContext } from '../../../../context/GlobalsContext';
-import { normalizeUrlName } from '../../../../utils/url/url';
-import { setLessonProgressSyncNeeded } from '../../../../state/progress/learnProgressDuck';
-import { PageMetaData } from '../../../Page/PageMetaData';
-import { PAGE_TYPES } from '../../../../constants/pageTypes';
-import { GtmScriptWithDataLayer } from '../../../GoogleTagManager/GtmScriptWithDataLayer';
-
-export const LessonResultAndSummaryGlobalStyles = createGlobalStyle`
- @media (min-width: 1200px) {
- /* @noflip */
- .col-lg-push-1 {
- right: 8.33333333%;
- left: 0;
- }
- }
- @media (min-width: 1200px) {
- /* @noflip */
- .col-lg-pull-1 {
- left: 8.33333333%;
- right: auto;
- }
- }
- /* @noflip */
- .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 {
- position: relative;
- min-height: 1px;
- padding-left: 20px;
- padding-right: 20px;
- }
-`;
-
-export const LessonExerciseResult = ({
- lessonOverviewParts,
- lessonId,
- lessonName,
- courseId,
- isFinalTest,
- lessonKeywordStrings,
- data,
-}) => {
- const { isLoggedIn } = useSelector(userSelector);
- const { i18n } = useI18nContext();
- const { langCode } = useParams();
- const { location } = useGlobalsContext().window;
- const dispatch = useDispatch();
- const history = useHistory();
-
- const lessonExerciseOverviewItems = filterLessonExerciseOverviewItems(lessonOverviewParts);
- const { firstExerciseLink, isFullScoreAchieved } = useExerciseManager({
- lessonName,
- lessonExerciseOverviewItems,
- courseId,
- isFinalTest,
- });
-
- useEffect(() => {
- dispatch(removeImproveMode(lessonId));
- }, []);
-
- const lessonPath = getLessonUrl(lessonId, langCode, normalizeUrlName(lessonName));
- const assembledInfos = filteredAssembledInfos({ lessonOverviewParts, lessonPath });
- const showImproveButton = !isLoggedIn || (isLoggedIn && !isFullScoreAchieved());
- const resultPrefix = 'lesson.exercises.result';
-
- const generateNextUrl = () => {
- return assembledInfos[0] ? assembledInfos[0].url : getSummaryUrl(lessonPath);
- };
-
- const generateExerciseInfos = t => {
- const exerciseInfos = assembledInfos.map(info => t(`${resultPrefix}.${info.name}`)).join(', ');
-
- return (
- exerciseInfos && (
-
- {t(`${resultPrefix}.whatsNext`)} {exerciseInfos}.
-
- )
- );
- };
-
- const infos = generateExerciseInfos(i18n.t);
- const nextUrl = generateNextUrl();
- const hintKey = i18n.t(`${resultPrefix}.hint`);
-
- const handleImproveClicked = () => {
- if (isLoggedIn) {
- dispatch(setImproveMode(lessonId));
- const firstExerciseLinkInImproveMode = firstExerciseLink(true);
- history.push(firstExerciseLinkInImproveMode);
- } else {
- dispatch(setLessonProgressSyncNeeded(true));
- }
- };
-
- const handleSaveClicked = () => {
- if (isLoggedIn) {
- history.push(nextUrl);
- } else {
- dispatch(setLessonProgressSyncNeeded(true));
- }
- };
-
- const handleContinueClicked = () => {
- history.push(nextUrl);
- };
-
- const loginLink = isLoggedIn
- ? undefined
- : getLoginPage(location.origin, langCode, location.pathname);
-
- return (
- <>
-
-
-
-
-
-
-
-
-
{infos}
- {!isLoggedIn && (
-
- )}
-
-
-
-
-
-
- {showImproveButton && (
-
-
-
- )}
-
- {!isLoggedIn && (
-
- )}
-
-
-
-
-
-
-
-
-
-
- >
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseResult/Summary.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseResult/Summary.jsx
deleted file mode 100644
index 96595d1..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseResult/Summary.jsx
+++ /dev/null
@@ -1,72 +0,0 @@
-import { useSelector } from 'react-redux';
-import { MARKS } from '../../../../constants/marks';
-import { I18nText } from '../../../I18n/I18nText';
-import { calculatePercentage, generateRandomNumber } from '../../../../utils/commons';
-import { findLessonLearnProgressSelector } from '../../../../state/progress/learnProgressSelectors';
-
-export const Summary = ({ lessonId, showFeedback = false, showTitle = true }) => {
- const lesson = useSelector(findLessonLearnProgressSelector(lessonId));
-
- const {
- allExerciseCount = 0,
- doneExerciseCount = 0,
- maxPointsForAllExercises = 0,
- resultPoints = 0,
- } = lesson || {};
-
- const percentile = calculatePercentage(resultPoints, maxPointsForAllExercises);
-
- const getFeedBackText = () => {
- const randomNumber = generateRandomNumber(1, 3);
-
- if (percentile >= MARKS.GOOD) return `good${randomNumber}`;
- if (percentile >= MARKS.MEDIUM) return `mid${randomNumber}`;
-
- return `bad${randomNumber}`;
- };
-
- return (
- <>
- {showTitle && (
-
- )}
- {showFeedback && (
-
- )}
-
-
-
-
-
- {percentile}%
-
-
-
-
- : {`${doneExerciseCount}/${allExerciseCount}`}
-
-
-
-
- >
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseStats/LessonExerciseStats.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseStats/LessonExerciseStats.jsx
deleted file mode 100644
index 6a21ae3..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseStats/LessonExerciseStats.jsx
+++ /dev/null
@@ -1,71 +0,0 @@
-import { useParams } from 'react-router';
-import { I18nText } from '../../../I18n/I18nText';
-import { useExerciseProgress } from '../workflow/ExerciseProgress';
-import { isRtlByLangCode } from '../../../../utils/mappers/rtlLanguages';
-
-const outOfText = ;
-const numberOfPointsEarnedText = (
-
-);
-const numberOfExercisesSolvedText = (
-
-);
-
-export const LessonExerciseStats = ({ amountOfInquiries }) => {
- const { exerciseProgress } = useExerciseProgress();
- const { langCode } = useParams();
- const isRtlLang = isRtlByLangCode(langCode);
-
- const numberOfDoneInquiriesSpan = (
- {exerciseProgress.numberOfDoneInquiries}
- );
- const amountOfInquiriesSpan = {amountOfInquiries} ;
- const scoreSpan = (
- {exerciseProgress.currentExerciseScore}
- );
-
- const ltrStats = (
- <>
- {numberOfDoneInquiriesSpan}
-
- {outOfText}
-
- {amountOfInquiriesSpan}
-
- {numberOfExercisesSolvedText}.
- {scoreSpan}
-
- {numberOfPointsEarnedText}.
- >
- );
-
- const rtlStats = (
- <>
- {numberOfDoneInquiriesSpan}
-
- {outOfText}
-
- {numberOfExercisesSolvedText}
-
- {amountOfInquiriesSpan}
-
- {numberOfPointsEarnedText}
-
- {scoreSpan}
- >
- );
-
- return (
-
-
{isRtlLang ? rtlStats : ltrStats}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/LessonExerciseTextInput/LessonExerciseTextInput.jsx b/sources-gen/components/Lesson/LessonExercise/LessonExerciseTextInput/LessonExerciseTextInput.jsx
deleted file mode 100644
index ee8e6c8..0000000
--- a/sources-gen/components/Lesson/LessonExercise/LessonExerciseTextInput/LessonExerciseTextInput.jsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { RichText } from '../../../RichText/RichText';
-
-export const LessonExerciseTextInput = ({ inputText }) =>
- inputText && (
-
- );
diff --git a/sources-gen/components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyAnswer/ManyToManyAnswer.jsx b/sources-gen/components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyAnswer/ManyToManyAnswer.jsx
deleted file mode 100644
index c658b72..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyAnswer/ManyToManyAnswer.jsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import { createGlobalStyle } from 'styled-components';
-import classnames from 'classnames';
-import { INQUIRY_MEDIA_TYPE } from '../../../../../constants/inquiryMediaTypes';
-import { useFrontendConfig } from '../../../../../hooks/useFrontendConfig';
-
-const ManyToManyAnswerGlobalStyles = createGlobalStyle`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-
- .pair-select-container .pairsToUse .left .btn {
- /* @noflip */
- float: left;
- /* @noflip */
- clear: left;
- }
-`;
-
-export const ManyToManyAnswer = ({
- answer,
- answersBlocked,
- mediaType,
- isLeftAnswer = false,
- isMatched = false,
- onAnswerClicked,
-}) => {
- const answerText = isLeftAnswer ? answer.subInquiryText : answer.alternatives[0].alternativeText;
- const isImage = mediaType === INQUIRY_MEDIA_TYPE.IMAGE;
- const imagePairClass = isLeftAnswer ? 'image-pair-left ' : 'image-pair-right ';
- const basicClass = `btn ${isImage ? imagePairClass : ''}removeHover`;
-
- const { imageBasePath } = useFrontendConfig();
- const assignAnswerClass = (isSelected, currentSideAnswersBlocked) => {
- const isBlocked = currentSideAnswersBlocked ? 'waiting inactive' : '';
- const status = isSelected ? 'tapped' : isBlocked;
- return `${basicClass} ${status}`;
- };
-
- const assignMatchedAnswerClass = (isCorrectlyMatched, isSolved) => {
- if (isSolved) {
- return `${basicClass} solved`;
- }
- if (isCorrectlyMatched === null) {
- return basicClass;
- }
- const checkedStatus = isCorrectlyMatched ? 'correct solved' : 'wrong';
- return `${basicClass} ${checkedStatus}`;
- };
-
- return (
-
-
- {!isLeftAnswer && isImage ? (
-
- ) : (
- answerText
- )}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyExercise.jsx b/sources-gen/components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyExercise.jsx
deleted file mode 100644
index eabba45..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyExercise.jsx
+++ /dev/null
@@ -1,21 +0,0 @@
-/* eslint-disable jsx-a11y/media-has-caption */
-import { useParams } from 'react-router';
-import { ManyToManyQuestionRow } from './ManyToManyQuestionRow/ManyToManyQuestionRow';
-import { LessonExerciseTextInput } from '../LessonExerciseTextInput/LessonExerciseTextInput';
-import { AudioProvider } from '../../../../context/AudioContext';
-
-export const ManyToManyExercise = ({ data }) => {
- const { exerciseId } = useParams();
- const { inputText, inquiries } = data.content;
-
- return (
-
-
-
- {inquiries.map(inquiry => (
-
- ))}
-
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyQuestionRow/ManyToManyQuestionRow.jsx b/sources-gen/components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyQuestionRow/ManyToManyQuestionRow.jsx
deleted file mode 100644
index 30feb35..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyQuestionRow/ManyToManyQuestionRow.jsx
+++ /dev/null
@@ -1,233 +0,0 @@
-import { useEffect, useReducer } from 'react';
-import { createGlobalStyle } from 'styled-components';
-import { ManyToManyAnswer } from '../ManyToManyAnswer/ManyToManyAnswer';
-import { I18nText } from '../../../../I18n/I18nText';
-import {
- BLOCK_ANSWERS,
- CHECK_ANSWERS,
- SHUFFLE_RIGHT_ANSWERS,
- MATCH_ANSWERS_PAIR,
- reducer,
- RESET_MATCHED_ANSWERS_PAIR,
- SOLVE_ANSWERS,
-} from './manyToManyQuestionRowReducer';
-import { LessonExerciseHint } from '../../LessonExerciseHint/LessonExerciseHint';
-import { StyledSolveCheckButton } from '../../../../SolveCheckButton/SolveCheckButton';
-import { useInquiryHandling } from '../../workflow/useInquiryHandling';
-import { useAudio } from '../../../../../hooks/useAudio';
-
-const ManyToManyQuetsionRowGlobalStyles = createGlobalStyle`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-
- /* @noflip */
- .pair-select-container .pairsToUse.used .right .btn {
- float: left;
- clear: left;
- }
-`;
-
-export const ManyToManyQuestionRow = ({ inquiry }) => {
- const {
- id: inquiryId,
- inquiryText,
- inquiryDescription,
- subInquiries,
- mediaType,
- learningMetaInfo: { achievableScore },
- } = inquiry;
- const initialLeftAnswers = subInquiries.map(subInquiry => {
- return {
- ...subInquiry,
- isSelected: false,
- isCorrectlyMatched: null,
- isSolved: false,
- };
- });
-
- const [state, dispatch] = useReducer(reducer, {
- isLeftAnswerBlocked: false,
- isRightAnswerBlocked: false,
- leftAnswers: initialLeftAnswers,
- rightAnswers: initialLeftAnswers,
- leftMatchedAnswers: [],
- rightMatchedAnswers: [],
- isAllMatchedCorrectly: false,
- solvedWrongCounter: 0,
- isSolvedCorrect: false,
- });
-
- const {
- isSolveButtonDisabled,
- isCheckButtonDisabled,
- handleCorrectAnswer,
- handleWrongAnswer,
- handleSolved,
- isFromPlacementCourse,
- } = useInquiryHandling({
- inquiryId,
- achievableScore,
- });
- const { playWrongDefaultAudioFeedBack, playCorrectDefaultAudioFeedBack } = useAudio();
-
- useEffect(() => {
- if (state.isAllMatchedCorrectly) {
- handleCorrectAnswer();
- playCorrectDefaultAudioFeedBack();
- }
- if (state.isSolvedCorrect) {
- handleSolved();
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [state.isAllMatchedCorrectly, state.isSolvedCorrect]);
-
- useEffect(() => {
- if (state.solvedWrongCounter > 0) {
- handleWrongAnswer();
- playWrongDefaultAudioFeedBack();
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [state.solvedWrongCounter]);
-
- useEffect(() => {
- dispatch({
- type: SHUFFLE_RIGHT_ANSWERS,
- });
- }, []);
-
- const onAnswerClicked = (e, selectedId, isLeft) => {
- e.preventDefault();
- const isAnswerBlocked = isLeft ? state.isRightAnswerBlocked : state.isLeftAnswerBlocked;
- if (isAnswerBlocked || (state.solvedWrongCounter > 0 && isFromPlacementCourse)) {
- dispatch({
- type: MATCH_ANSWERS_PAIR,
- payload: {
- selectedId,
- isLeft,
- },
- });
- } else {
- dispatch({
- type: BLOCK_ANSWERS,
- payload: {
- selectedId,
- isLeft,
- },
- });
- }
- };
-
- const onMatchedAnswerClicked = (e, selectedIndex) => {
- e.preventDefault();
- if (
- state.leftMatchedAnswers[selectedIndex].isCorrectlyMatched ||
- state.leftMatchedAnswers[selectedIndex].isSolved ||
- (state.solvedWrongCounter > 0 && isFromPlacementCourse)
- ) {
- return;
- }
-
- dispatch({
- type: RESET_MATCHED_ANSWERS_PAIR,
- payload: {
- selectedIndex,
- },
- });
- };
-
- const onCheckClicked = e => {
- e.preventDefault();
- dispatch({
- type: CHECK_ANSWERS,
- payload: {
- subInquiries,
- },
- });
- };
-
- const onSolveClicked = e => {
- e.preventDefault();
- dispatch({
- type: SOLVE_ANSWERS,
- payload: {
- initialLeftAnswers,
- },
- });
- };
-
- return (
-
-
-
-
{inquiryText}
-
-
-
- {state.leftAnswers.map(answer => (
- onAnswerClicked(e, answer.id, true)}
- />
- ))}
-
-
- {state.rightAnswers.map(answer => (
- onAnswerClicked(e, answer.alternatives[0].id, false)}
- />
- ))}
-
-
-
-
-
- {state.leftMatchedAnswers.map((matchedAnswer, index) => (
- onMatchedAnswerClicked(e, index)}
- />
- ))}
-
-
- {state.rightMatchedAnswers.map((matchedAnswer, index) => (
- onMatchedAnswerClicked(e, index)}
- />
- ))}
-
-
-
-
- {inquiryDescription && (
-
-
-
- )}
-
onSolveClicked(e)}
- handleCheckClicked={e => onCheckClicked(e)}
- />
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyQuestionRow/manyToManyQuestionRowReducer.jsx b/sources-gen/components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyQuestionRow/manyToManyQuestionRowReducer.jsx
deleted file mode 100644
index f60dc29..0000000
--- a/sources-gen/components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyQuestionRow/manyToManyQuestionRowReducer.jsx
+++ /dev/null
@@ -1,150 +0,0 @@
-export const SHUFFLE_RIGHT_ANSWERS = 'SHUFFLE_RIGHT_ANSWERS';
-export const MATCH_ANSWERS_PAIR = 'MATCH_ANSWERS_PAIR';
-export const BLOCK_ANSWERS = 'BLOCK_ANSWERS';
-export const RESET_MATCHED_ANSWERS_PAIR = 'RESET_MATCHED_ANSWERS_PAIR';
-export const CHECK_ANSWERS = 'CHECK_ANSWERS';
-export const SOLVE_ANSWERS = 'SOLVE_ANSWERS';
-
-export const reducer = (state, action) => {
- const { selectedId, isLeft, selectedIndex, subInquiries, initialLeftAnswers } =
- action.payload || {};
-
- switch (action.type) {
- case SHUFFLE_RIGHT_ANSWERS: {
- // eslint-disable-next-line fp/no-mutating-methods
- const shuffledRightAnswers = [...state.rightAnswers].sort(() => 0.25 - Math.random());
- return {
- ...state,
- rightAnswers: shuffledRightAnswers,
- };
- }
- case MATCH_ANSWERS_PAIR: {
- const leftMatchedAnswer = state.leftAnswers.find(answer =>
- isLeft ? answer.id === selectedId : answer.isSelected,
- );
- const rightMatchedAnswer = state.rightAnswers.find(answer =>
- isLeft ? answer.isSelected : answer.alternatives[0].id === selectedId,
- );
-
- return {
- ...state,
- leftMatchedAnswers: [
- ...state.leftMatchedAnswers,
- {
- ...leftMatchedAnswer,
- isSelected: false,
- },
- ],
- rightMatchedAnswers: [
- ...state.rightMatchedAnswers,
- {
- ...rightMatchedAnswer,
- isSelected: false,
- },
- ],
- leftAnswers: state.leftAnswers.filter(answer => answer !== leftMatchedAnswer),
- rightAnswers: state.rightAnswers.filter(answer => answer !== rightMatchedAnswer),
- isLeftAnswerBlocked: false,
- isRightAnswerBlocked: false,
- };
- }
- case BLOCK_ANSWERS: {
- const answers = isLeft ? state.leftAnswers : state.rightAnswers;
- const updatedAnswers = answers.map(answer => {
- const isIdEqual = isLeft
- ? answer.id === selectedId
- : answer.alternatives[0].id === selectedId;
- return {
- ...answer,
- isSelected: isIdEqual && !answer.isSelected,
- };
- });
-
- return {
- ...state,
- leftAnswers: isLeft ? updatedAnswers : state.leftAnswers,
- rightAnswers: isLeft ? state.rightAnswers : updatedAnswers,
- isLeftAnswerBlocked: isLeft
- ? updatedAnswers.some(answer => answer.isSelected)
- : state.isLeftAnswerBlocked,
- isRightAnswerBlocked: isLeft
- ? state.isRightAnswerBlocked
- : updatedAnswers.some(answer => answer.isSelected),
- };
- }
- case RESET_MATCHED_ANSWERS_PAIR: {
- const leftMatchedAnswer = state.leftMatchedAnswers[selectedIndex];
- const rightMatchedAnswer = state.rightMatchedAnswers[selectedIndex];
-
- return {
- ...state,
- leftMatchedAnswers: state.leftMatchedAnswers.filter(
- matchedAnswer => matchedAnswer !== leftMatchedAnswer,
- ),
- rightMatchedAnswers: state.rightMatchedAnswers.filter(
- matchedAnswer => matchedAnswer !== rightMatchedAnswer,
- ),
- leftAnswers: [
- ...state.leftAnswers,
- {
- ...leftMatchedAnswer,
- isCorrectlyMatched: null,
- },
- ],
- rightAnswers: [
- ...state.rightAnswers,
- {
- ...rightMatchedAnswer,
- isCorrectlyMatched: null,
- },
- ],
- };
- }
- case CHECK_ANSWERS: {
- const updatedLeftMatchedAnswers = state.leftMatchedAnswers.map((matchedAnswer, index) => {
- return {
- ...matchedAnswer,
- isCorrectlyMatched: matchedAnswer.id === state.rightMatchedAnswers[index].id,
- };
- });
-
- const updatedRightMatchedAnswers = state.rightMatchedAnswers.map((matchedAnswer, index) => {
- return {
- ...matchedAnswer,
- isCorrectlyMatched: matchedAnswer.id === state.leftMatchedAnswers[index].id,
- };
- });
-
- const isAllMatchedCorrectly =
- updatedLeftMatchedAnswers.length === subInquiries.length &&
- updatedLeftMatchedAnswers.every(matchedAnswer => matchedAnswer.isCorrectlyMatched);
-
- return {
- ...state,
- leftMatchedAnswers: updatedLeftMatchedAnswers,
- rightMatchedAnswers: updatedRightMatchedAnswers,
- solvedWrongCounter: isAllMatchedCorrectly ? 0 : state.solvedWrongCounter + 1,
- isAllMatchedCorrectly,
- };
- }
- case SOLVE_ANSWERS: {
- const solvedMatchedAnswers = initialLeftAnswers.map(answer => {
- return {
- ...answer,
- isSolved: true,
- };
- });
-
- return {
- ...state,
- leftAnswers: [],
- rightAnswers: [],
- leftMatchedAnswers: solvedMatchedAnswers,
- rightMatchedAnswers: solvedMatchedAnswers,
- isSolvedCorrect: true,
- };
- }
- default:
- return state;
- }
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/MultiSelectionExercise/MultiSelectionExercise.jsx b/sources-gen/components/Lesson/LessonExercise/MultiSelectionExercise/MultiSelectionExercise.jsx
deleted file mode 100644
index 59de574..0000000
--- a/sources-gen/components/Lesson/LessonExercise/MultiSelectionExercise/MultiSelectionExercise.jsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { LessonExerciseTextInput } from '../LessonExerciseTextInput/LessonExerciseTextInput';
-import { MultiSelectionQuestionRow } from './MultiSelectionQuestionRow';
-import { AudioProvider } from '../../../../context/AudioContext';
-
-export const MultiSelectionExercise = ({ data }) => {
- const { id, inputText, inquiries } = data.content;
-
- return (
-
-
- {inquiries.map(inquiry => (
-
- ))}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/MultiSelectionExercise/MultiSelectionQuestionRow.jsx b/sources-gen/components/Lesson/LessonExercise/MultiSelectionExercise/MultiSelectionQuestionRow.jsx
deleted file mode 100644
index 4bbc2f4..0000000
--- a/sources-gen/components/Lesson/LessonExercise/MultiSelectionExercise/MultiSelectionQuestionRow.jsx
+++ /dev/null
@@ -1,197 +0,0 @@
-import { useEffect, useRef, useState } from 'react';
-import { LessonExerciseHint } from '../LessonExerciseHint/LessonExerciseHint';
-import { LessonExerciseQuestion } from '../LessonExerciseQuestion/LessonExerciseQuestion';
-import { StyledSolveCheckButton } from '../../../SolveCheckButton/SolveCheckButton';
-import { useInquiryHandling } from '../workflow/useInquiryHandling';
-import { ANSWER_STATE } from '../LessonExerciseAnswer/answerState';
-import { useAudio } from '../../../../hooks/useAudio';
-import { findFeedbackAudio } from '../../../../utils/audioUtils';
-import { LessonExerciseHiddenAudio } from '../LessonExerciseHiddenAudio/LessonExerciseHiddenAudio';
-import { ExerciseAnswer } from '../LessonExerciseAnswer/ExerciseAnswer';
-import { useIsMountedRef } from '../../../../hooks/useIsMountedRef';
-
-export const MultiSelectionQuestionRow = ({ inquiry, exerciseId }) => {
- const {
- id: inquiryId,
- inquiryDescription,
- audios,
- subInquiries,
- mediaType,
- mainContentImage,
- learningMetaInfo: { achievableScore },
- } = inquiry;
- const isSolutionAudioFallbackMode = Boolean(mainContentImage);
- const correctAnswerAudio = findFeedbackAudio(isSolutionAudioFallbackMode, audios);
- const { target: answerAudio } = correctAnswerAudio || {};
- const { mp3Src: correctAnswerAudioUrl } = answerAudio || {};
- const { alternatives } = subInquiries[0];
- const answersRefArray = [];
- const answerMediaType = mediaType.toLowerCase();
-
- const [answersFrozen, setAnswersFrozen] = useState(false);
- const [answers, setAnswers] = useState(
- alternatives.map(alternative => {
- return {
- ...alternative,
- answerState: ANSWER_STATE.INITIAL,
- };
- }),
- );
- const {
- isSolveButtonDisabled,
- isCheckButtonDisabled,
- handleCorrectAnswer,
- handleWrongAnswer,
- handleSolved,
- isFromPlacementCourse,
- } = useInquiryHandling({
- inquiryId,
- achievableScore,
- });
-
- const { playWrongDefaultAudioFeedBack, playCorrectDefaultAudioFeedBack } = useAudio();
- const correctAnswerAudioRef = useRef();
- const answersRef = useRef(answers);
- const isMountedRef = useIsMountedRef();
-
- useEffect(() => {
- // eslint-disable-next-line fp/no-mutation
- answersRef.current = answers;
- });
-
- const selectOrUnselectAnswer = chosenAnswerIndex => {
- const updatedAnswers = answers.map((answer, index) => {
- if (index !== chosenAnswerIndex) {
- return answer;
- }
- const newAnswerState =
- answer.answerState === ANSWER_STATE.SELECTED ? ANSWER_STATE.INITIAL : ANSWER_STATE.SELECTED;
- return {
- ...answer,
- answerState: newAnswerState,
- };
- });
- setAnswers(updatedAnswers);
- };
-
- const isSolvedCorrectly = checkedAnswers => {
- const unsolvedOrWrongAnswers = checkedAnswers.filter(answer => {
- const { answerState, isCorrect } = answer;
- return (
- answerState === ANSWER_STATE.WRONG || (answerState === ANSWER_STATE.INITIAL && isCorrect)
- );
- });
- return unsolvedOrWrongAnswers.length === 0;
- };
-
- const updateAnswers = (answersToUpdate, answerStateEvalFn, skipAnswerConditionalFn) => {
- const updatedAnswers = answersToUpdate.map(answer => {
- if (skipAnswerConditionalFn && skipAnswerConditionalFn(answer) === true) {
- return answer;
- }
- return {
- ...answer,
- answerState: answerStateEvalFn(answer),
- };
- });
- setAnswers(updatedAnswers);
- return updatedAnswers;
- };
-
- const playSuccessAudio = () => {
- if (correctAnswerAudioUrl) {
- correctAnswerAudioRef.current.play();
- } else {
- playCorrectDefaultAudioFeedBack();
- }
- };
-
- const addRef = (index, ref) => {
- // eslint-disable-next-line fp/no-mutation
- answersRefArray[index] = ref;
- };
-
- const onAnswerClicked = (e, chosenAnswerIndex) => {
- e.preventDefault();
- if (answersFrozen) {
- return;
- }
- answersRefArray[chosenAnswerIndex].blur();
- selectOrUnselectAnswer(chosenAnswerIndex);
- };
-
- const onHandleSolveButtonClicked = () => {
- handleSolved();
- playSuccessAudio();
- updateAnswers(answers, answer =>
- answer.isCorrect ? ANSWER_STATE.SOLVED : ANSWER_STATE.INITIAL,
- );
- setAnswersFrozen(true);
- };
-
- const onHandleCheckButtonClicked = () => {
- const checkedAnswers = updateAnswers(
- answers,
- answer => (answer.isCorrect ? ANSWER_STATE.CORRECT : ANSWER_STATE.WRONG),
- answer => answer.answerState !== ANSWER_STATE.SELECTED,
- );
-
- if (isSolvedCorrectly(checkedAnswers)) {
- handleCorrectAnswer();
- playSuccessAudio();
- setAnswersFrozen(true);
- } else {
- handleWrongAnswer();
- if (isFromPlacementCourse) setAnswersFrozen(true);
- playWrongDefaultAudioFeedBack();
- setTimeout(() => {
- if (isMountedRef.current) {
- updateAnswers(answersRef.current, answer =>
- answer.answerState === ANSWER_STATE.WRONG && !isFromPlacementCourse
- ? ANSWER_STATE.INITIAL
- : answer.answerState,
- );
- }
- }, 3000);
- }
- };
-
- return (
-
-
-
-
-
-
-
- {answers.map((answer, index) => (
-
- ))}
-
-
-
-
-
-
-
- {correctAnswerAudioUrl && (
-
- )}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/RepeatExercise/RepeatExercise.jsx b/sources-gen/components/Lesson/LessonExercise/RepeatExercise/RepeatExercise.jsx
deleted file mode 100644
index a9e9f2d..0000000
--- a/sources-gen/components/Lesson/LessonExercise/RepeatExercise/RepeatExercise.jsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { AudioProvider } from '../../../../context/AudioContext';
-import { LessonExerciseTextInput } from '../LessonExerciseTextInput/LessonExerciseTextInput';
-import { RepeatExerciseRow } from './RepeatExerciseRow';
-
-export const RepeatExercise = ({ data }) => {
- const { inputText, inquiries } = data.content;
- return (
-
-
- {inquiries.map(inquiry => (
-
- ))}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/RepeatExercise/RepeatExerciseRow.jsx b/sources-gen/components/Lesson/LessonExercise/RepeatExercise/RepeatExerciseRow.jsx
deleted file mode 100644
index 0a9ef62..0000000
--- a/sources-gen/components/Lesson/LessonExercise/RepeatExercise/RepeatExerciseRow.jsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { createGlobalStyle } from 'styled-components';
-import { LessonExerciseHint } from '../LessonExerciseHint/LessonExerciseHint';
-import { LessonExerciseQuestion } from '../LessonExerciseQuestion/LessonExerciseQuestion';
-import { SelfAssessment } from './SelfAssessment/SelfAssessment';
-
-export const RepeatExerciseRowGlobalStyles = createGlobalStyle`
- /* @noflip */
- .answer {
- direction: ltr;
- text-align: left;
- }
-`;
-
-export const RepeatExerciseRow = ({ inquiry }) => {
- const { inquiryDescription, subInquiries } = inquiry;
- const { subInquiryDescription } = subInquiries[0];
-
- return (
- <>
-
-
-
-
-
-
-
- {subInquiryDescription &&
{subInquiryDescription}
}
-
-
-
-
-
- >
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/RepeatExercise/SelfAssessment/SelfAssessment.jsx b/sources-gen/components/Lesson/LessonExercise/RepeatExercise/SelfAssessment/SelfAssessment.jsx
deleted file mode 100644
index b2ccdcd..0000000
--- a/sources-gen/components/Lesson/LessonExercise/RepeatExercise/SelfAssessment/SelfAssessment.jsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { useState } from 'react';
-import { SelfAssessmentAnswer } from './SelfAssessmentAnswer';
-import { SelfAssessmentQuestion } from './SelfAssessmentQuestion';
-import { useInquiryHandling } from '../../workflow/useInquiryHandling';
-
-export const SelfAssessment = ({ inquiry }) => {
- const {
- audios,
- mainContentImage,
- learningMetaInfo: { achievableScore },
- id: inquiryId,
- } = inquiry;
- const fixedAnswers = [
- { label: 'exercise.02', index: 1, isSelected: false },
- { label: 'exercise.01', index: 0, isSelected: false },
- ];
-
- const { handleCorrectAnswer, handleWrongAnswer } = useInquiryHandling({
- inquiryId,
- achievableScore,
- });
-
- const [answersFrozen, setAnswersFrozen] = useState(false);
- const [answers, setSelected] = useState(fixedAnswers);
-
- const updateSelected = selectedIndex => {
- const updatedAnswers = answers.map((answer, index) => {
- return {
- ...answer,
- isSelected: index === selectedIndex ? true : answer.isSelected,
- };
- });
-
- setSelected(updatedAnswers);
- };
-
- const evaluateAnswer = selectedIndex => {
- if (selectedIndex === 0) {
- handleCorrectAnswer();
- } else {
- handleWrongAnswer();
- }
- };
-
- const onAnswerClicked = (e, index) => {
- e.preventDefault();
-
- if (answersFrozen) {
- return;
- }
-
- evaluateAnswer(index);
- updateSelected(index);
- setAnswersFrozen(true);
- };
-
- return (
-
-
-
-
-
- {answers.map((answer, index) => (
- onAnswerClicked(e, index)}
- />
- ))}
-
-
-
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/RepeatExercise/SelfAssessment/SelfAssessmentAnswer.jsx b/sources-gen/components/Lesson/LessonExercise/RepeatExercise/SelfAssessment/SelfAssessmentAnswer.jsx
deleted file mode 100644
index 85a5570..0000000
--- a/sources-gen/components/Lesson/LessonExercise/RepeatExercise/SelfAssessment/SelfAssessmentAnswer.jsx
+++ /dev/null
@@ -1,23 +0,0 @@
-/* eslint-disable jsx-a11y/aria-role */
-import { useTranslation } from '../../../../../hooks/useTranslation';
-
-export const SelfAssessmentAnswer = ({ answer, handleAnswerClicked }) => {
- const { index, isSelected, label } = answer;
- const answerLabel = useTranslation(label);
-
- return (
- <>
-
- {answerLabel}
-
- >
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/RepeatExercise/SelfAssessment/SelfAssessmentQuestion.jsx b/sources-gen/components/Lesson/LessonExercise/RepeatExercise/SelfAssessment/SelfAssessmentQuestion.jsx
deleted file mode 100644
index d02f742..0000000
--- a/sources-gen/components/Lesson/LessonExercise/RepeatExercise/SelfAssessment/SelfAssessmentQuestion.jsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { I18nText } from '../../../../I18n/I18nText';
-import { LessonExerciseQuestionAudio } from '../../LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionAudio';
-import { findFeedbackAudio } from '../../../../../utils/audioUtils';
-import { useTranslation } from '../../../../../hooks/useTranslation';
-import { useRtlContext } from '../../../../../hooks/useRtl';
-
-export const SelfAssessmentQuestion = ({ audios, mainContentImage }) => {
- const { isRtl } = useRtlContext();
-
- const howWasItWithOnlyFeedbackAudio = useTranslation('exercise.howWasItWithOnlyFeedbackAudio');
- const howWasItLabel = useTranslation('exercise.howWasIt');
-
- const isSolutionAudioFallbackMode = Boolean(mainContentImage);
- const feedbackAudio = findFeedbackAudio(isSolutionAudioFallbackMode, audios);
-
- const feedbackAudioUrl = feedbackAudio ? feedbackAudio.target.mp3Src : null;
-
- const lessonExerciseQuestionAudio = () => {
- const hasOnlyFeedbackAudio =
- feedbackAudioUrl.includes('Loesungsaudio.mp3') && audios.length === 1;
- const audioLabel = hasOnlyFeedbackAudio ? howWasItWithOnlyFeedbackAudio : howWasItLabel;
- return ;
- };
-
- return (
-
- {feedbackAudioUrl ? (
- lessonExerciseQuestionAudio()
- ) : (
-
-
-
- )}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/SingleSelectionExercise/SingleSelectionExercise.jsx b/sources-gen/components/Lesson/LessonExercise/SingleSelectionExercise/SingleSelectionExercise.jsx
deleted file mode 100644
index b3eb9df..0000000
--- a/sources-gen/components/Lesson/LessonExercise/SingleSelectionExercise/SingleSelectionExercise.jsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { SingleSelectionQuestionRow } from './SingleSelectionQuestionRow/SingleSelectionQuestionRow';
-import { LessonExerciseTextInput } from '../LessonExerciseTextInput/LessonExerciseTextInput';
-import { AudioProvider } from '../../../../context/AudioContext';
-
-export const SingleSelectionExercise = ({ data }) => {
- const { id, inputText, inquiries } = data.content;
-
- return (
-
-
- {inquiries.map(inquiry => (
-
- ))}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/SingleSelectionExercise/SingleSelectionQuestionRow/SingleSelectionQuestionRow.jsx b/sources-gen/components/Lesson/LessonExercise/SingleSelectionExercise/SingleSelectionQuestionRow/SingleSelectionQuestionRow.jsx
deleted file mode 100644
index 96f12d4..0000000
--- a/sources-gen/components/Lesson/LessonExercise/SingleSelectionExercise/SingleSelectionQuestionRow/SingleSelectionQuestionRow.jsx
+++ /dev/null
@@ -1,139 +0,0 @@
-import { useEffect, useRef, useState } from 'react';
-import { LessonExerciseHiddenAudio } from '../../LessonExerciseHiddenAudio/LessonExerciseHiddenAudio';
-import { LessonExerciseHint } from '../../LessonExerciseHint/LessonExerciseHint';
-import { LessonExerciseQuestion } from '../../LessonExerciseQuestion/LessonExerciseQuestion';
-import { findFeedbackAudio } from '../../../../../utils/audioUtils';
-import { useAudio } from '../../../../../hooks/useAudio';
-import { useInquiryHandling } from '../../workflow/useInquiryHandling';
-import { ANSWER_STATE } from '../../LessonExerciseAnswer/answerState';
-import { ExerciseAnswer } from '../../LessonExerciseAnswer/ExerciseAnswer';
-import { useIsMountedRef } from '../../../../../hooks/useIsMountedRef';
-
-export const SingleSelectionQuestionRow = ({ exerciseId, inquiry }) => {
- const {
- id: inquiryId,
- inquiryDescription,
- audios,
- subInquiries,
- mainContentImage,
- learningMetaInfo: { achievableScore },
- } = inquiry;
- const isSolutionAudioFallbackMode = Boolean(mainContentImage);
- const correctAnswerAudio = findFeedbackAudio(isSolutionAudioFallbackMode, audios);
- const { target: answerAudio } = correctAnswerAudio || {};
- const { mp3Src: correctAnswerAudioUrl } = answerAudio || {};
- const { alternatives } = subInquiries[0];
- const answerMediaType = inquiry.mediaType.toLowerCase();
- const answersRefArray = [];
-
- const [answersFrozen, setAnswersFrozen] = useState(false);
- const [answers, setAnswers] = useState(
- alternatives.map(alternative => {
- return {
- ...alternative,
- answerState: ANSWER_STATE.INITIAL,
- };
- }),
- );
- const { playWrongDefaultAudioFeedBack, playCorrectDefaultAudioFeedBack } = useAudio();
- const correctAnswerAudioRef = useRef();
- const answersRef = useRef(answers);
- const { handleCorrectAnswer, handleWrongAnswer, isFromPlacementCourse } = useInquiryHandling({
- inquiryId,
- achievableScore,
- });
- const isMountedRef = useIsMountedRef();
-
- useEffect(() => {
- // eslint-disable-next-line fp/no-mutation
- answersRef.current = answers;
- });
-
- const getAnswerState = ({ index, chosenAnswerIndex, selectCurrentAnswer, answer }) => {
- const { answerState, isCorrect } = answer;
- if (index === chosenAnswerIndex) {
- if (selectCurrentAnswer) {
- return isCorrect ? ANSWER_STATE.CORRECT : ANSWER_STATE.WRONG;
- }
- return ANSWER_STATE.INITIAL;
- }
- return answerState;
- };
-
- const updateAnswers = (chosenAnswerIndex, selectCurrentAnswer) => {
- const answersCopy = selectCurrentAnswer ? [...answers] : [...answersRef.current];
- const updatedAnswers = answersCopy.map((answer, index) => {
- return {
- ...answer,
- answerState: getAnswerState({ index, chosenAnswerIndex, selectCurrentAnswer, answer }),
- };
- });
- setAnswers(updatedAnswers);
- };
-
- const addRef = (index, ref) => {
- // eslint-disable-next-line fp/no-mutation
- answersRefArray[index] = ref;
- };
-
- const onAnswerClicked = (e, chosenAnswerIndex) => {
- e.preventDefault();
- answersRefArray[chosenAnswerIndex].blur();
- if (answersFrozen) {
- return;
- }
- updateAnswers(chosenAnswerIndex, true);
-
- if (answers[chosenAnswerIndex].isCorrect) {
- handleCorrectAnswer();
- setAnswersFrozen(true);
- if (correctAnswerAudioUrl) {
- correctAnswerAudioRef.current.play();
- } else {
- playCorrectDefaultAudioFeedBack();
- }
- } else {
- handleWrongAnswer();
- if (isFromPlacementCourse) setAnswersFrozen(true);
- playWrongDefaultAudioFeedBack();
- setTimeout(() => {
- if (isMountedRef.current) {
- updateAnswers(chosenAnswerIndex, isFromPlacementCourse);
- }
- }, 3000);
- }
- };
-
- return (
-
-
-
-
-
-
-
- {answers.map((answer, index) => (
-
- ))}
-
-
-
-
- {correctAnswerAudioUrl && (
-
- )}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/SortingExercise/SortingExercise.jsx b/sources-gen/components/Lesson/LessonExercise/SortingExercise/SortingExercise.jsx
deleted file mode 100644
index 4337c07..0000000
--- a/sources-gen/components/Lesson/LessonExercise/SortingExercise/SortingExercise.jsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { AudioProvider } from '../../../../context/AudioContext';
-import { LessonExerciseTextInput } from '../LessonExerciseTextInput/LessonExerciseTextInput';
-import { SortingExerciseRow } from './SortingExerciseRow';
-
-export const SortingExercise = ({ data }) => {
- const { inputText, inquiries } = data.content;
- return (
-
-
- {inquiries.map(inquiry => (
-
- ))}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/SortingExercise/SortingExerciseRow.jsx b/sources-gen/components/Lesson/LessonExercise/SortingExercise/SortingExerciseRow.jsx
deleted file mode 100644
index 7c2b093..0000000
--- a/sources-gen/components/Lesson/LessonExercise/SortingExercise/SortingExerciseRow.jsx
+++ /dev/null
@@ -1,220 +0,0 @@
-/* eslint-disable jsx-a11y/anchor-is-valid,jsx-a11y/aria-role */
-import gql from 'graphql-tag';
-import { useRef, useState, useEffect } from 'react';
-import { createGlobalStyle } from 'styled-components';
-import { useFrontendConfig } from '../../../../hooks/useFrontendConfig';
-import { LessonExerciseQuestion } from '../LessonExerciseQuestion/LessonExerciseQuestion';
-import { LessonExerciseHint } from '../LessonExerciseHint/LessonExerciseHint';
-import { LessonExerciseHiddenAudio } from '../LessonExerciseHiddenAudio/LessonExerciseHiddenAudio';
-import { StyledSolveCheckButton } from '../../../SolveCheckButton/SolveCheckButton';
-import { INQUIRY_MEDIA_TYPE } from '../../../../constants/inquiryMediaTypes';
-import { findFeedbackAudio } from '../../../../utils/audioUtils';
-import { shuffle, sortObjectsByProp } from '../../../../utils/commons';
-import { useInquiryHandling } from '../workflow/useInquiryHandling';
-import { useAudio } from '../../../../hooks/useAudio';
-import { INQUIRY_STATE } from '../workflow/inquiryState';
-
-export const sortingExerciseFragment = {
- name: 'SortingExercise',
- fragment() {
- return gql`fragment ${this.name} on Inquiry {
- alternatives {
- id
- order
- alternativeText
- contentLinks {
- targetId
- }
- }
- }
- `;
- },
-};
-
-const SortingExerciseRowAnswerGlobalStyles = createGlobalStyle`
- /* @noflip */
- .dotted-outline {
- text-align: left;
- direction: ltr;
- }
-`;
-
-export const SortingExerciseRow = ({ inquiry }) => {
- const {
- alternatives,
- audios,
- id: inquiryId,
- inquiryDescription,
- mainContentImage,
- learningMetaInfo: { achievableScore },
- } = inquiry;
- const answerType = inquiry.mediaType.toLowerCase();
-
- const isSolutionAudioFallbackMode = Boolean(mainContentImage);
- const feedbackAudio = findFeedbackAudio(isSolutionAudioFallbackMode, audios);
- const { target: answerAudio } = feedbackAudio || {};
- const { mp3Src: feedbackAudioUrl } = answerAudio || {};
- const { imageBasePath } = useFrontendConfig();
-
- const feedbackAudioRef = useRef();
- const { playWrongDefaultAudioFeedBack, playCorrectDefaultAudioFeedBack } = useAudio();
-
- const {
- isSolveButtonDisabled,
- isCheckButtonDisabled,
- handleCorrectAnswer,
- handleWrongAnswer,
- handleSolved,
- inquiryState,
- isDisabled,
- } = useInquiryHandling({ inquiryId, achievableScore });
-
- const [choosenAnswers, setChoosenAnswers] = useState([]);
- const [selectableAnswers, setSelectableAnswers] = useState(alternatives);
-
- useEffect(() => {
- setSelectableAnswers(answers =>
- shuffle(answers.slice(0)).map(alternative => {
- return {
- ...alternative,
- isSelected: false,
- };
- }),
- );
- }, []);
-
- const isCorrectOrder = (value, index) => value.order === index + 1;
-
- const isDuplicatedValue = (value, index) =>
- value.alternativeText === alternatives[index].alternativeText;
-
- const isCorrect =
- choosenAnswers.length &&
- choosenAnswers.every(
- (value, index) => isCorrectOrder(value, index) || isDuplicatedValue(value, index),
- );
-
- const playCorrectAudio = () =>
- feedbackAudioUrl ? feedbackAudioRef.current.play() : playCorrectDefaultAudioFeedBack();
-
- const onHandleSolveButtonClicked = () => {
- setChoosenAnswers(sortObjectsByProp(alternatives, 'order'));
- setSelectableAnswers([]);
- playCorrectAudio();
- handleSolved();
- };
-
- const onHandleCheckButtonClicked = () => {
- if (isCorrect) {
- handleCorrectAnswer();
- playCorrectAudio();
- } else {
- handleWrongAnswer();
- playWrongDefaultAudioFeedBack();
- }
- };
-
- const onAnswerClicked = (e, selectedAnswer) => {
- e.preventDefault();
- if (isDisabled()) {
- return;
- }
-
- const updateSelection = {
- ...selectedAnswer,
- isSelected: !selectedAnswer.isSelected,
- };
-
- if (selectedAnswer.isSelected) {
- setSelectableAnswers(currentSelectableAnswers => [
- updateSelection,
- ...currentSelectableAnswers,
- ]);
- setChoosenAnswers(choosenAnswers.filter(answer => answer.id !== updateSelection.id));
- } else {
- setChoosenAnswers(currentChoosenAnswers => [...currentChoosenAnswers, updateSelection]);
- setSelectableAnswers(selectableAnswers.filter(answer => answer.id !== updateSelection.id));
- }
- };
-
- const getAnswerLink = (type, answer) => {
- const { alternativeText, contentLinks } = answer;
- const answerID = answer.id;
- const isInquiryMediaTypeText = type === INQUIRY_MEDIA_TYPE.TEXT.toLowerCase();
- const classType = isInquiryMediaTypeText ? 'btn' : 'image';
- const answerContent = isInquiryMediaTypeText ? (
- alternativeText
- ) : (
-
- );
-
- return (
- onAnswerClicked(e, answer)}
- href="#"
- className={`btn answer-sorting-${classType} alwaysLtr`}
- aria-selected={answer.isSelected}
- data-exercise-answer-id={answerID}
- >
-
- {answerContent}
-
- );
- };
-
- function getFeedbackClass() {
- switch (inquiryState) {
- case INQUIRY_STATE.WRONG:
- return 'wrong-outline';
- case INQUIRY_STATE.CORRECT:
- return 'correct-outline';
- case INQUIRY_STATE.SOLVED:
- case INQUIRY_STATE.INITIAL:
- default:
- return '';
- }
- }
- return (
- <>
-
-
-
-
-
-
-
-
-
- {choosenAnswers.map(answer => getAnswerLink(answerType, answer))}
-
-
-
- {selectableAnswers.map(answer => getAnswerLink(answerType, answer))}
-
-
-
-
-
-
-
-
- >
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/utils/exerciseUtils.jsx b/sources-gen/components/Lesson/LessonExercise/utils/exerciseUtils.jsx
deleted file mode 100644
index 96a3bea..0000000
--- a/sources-gen/components/Lesson/LessonExercise/utils/exerciseUtils.jsx
+++ /dev/null
@@ -1,21 +0,0 @@
-const MULTIPLE_WHITESPACES_REGEX = /\s\s+/g;
-const MINUS_CHARACTERS_REGEX = /[\u002D\u2010\u2027\u2011\u2013\u2014\u2212]/g;
-const SPECIAL_CHARACTERS = ',\\.!\\?:;\\-';
-const WHITESPACE_BEFORE_SPECIAL_REGEX = new RegExp(` ([${SPECIAL_CHARACTERS}])`, 'g');
-const WHITESPACE_AFTER_SPECIAL_REGEX = new RegExp(`([${SPECIAL_CHARACTERS}]) `, 'g');
-
-export const normalizeText = str => {
- if (!str) {
- return str;
- }
- return str
- .trim()
- .replace(MULTIPLE_WHITESPACES_REGEX, ' ')
- .replace(MINUS_CHARACTERS_REGEX, '-')
- .replace(WHITESPACE_BEFORE_SPECIAL_REGEX, '$1')
- .replace(WHITESPACE_AFTER_SPECIAL_REGEX, '$1');
-};
-
-export const isNormalizedTextEqual = (str1, str2) => {
- return normalizeText(str1) === normalizeText(str2);
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/workflow/ExerciseProgress.jsx b/sources-gen/components/Lesson/LessonExercise/workflow/ExerciseProgress.jsx
deleted file mode 100644
index 6502975..0000000
--- a/sources-gen/components/Lesson/LessonExercise/workflow/ExerciseProgress.jsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { createContext, useContext, useReducer } from 'react';
-import { createInquiryProgressMetaData } from '../../../../state/progress/learnProgress';
-
-// Actions
-export const EXERCISE_PROGRESS_ACTION_TYPES = Object.freeze({
- ADD_DONE_INQUIRY: 'ADD_DONE_INQUIRY',
- RESET: 'RESET',
-});
-
-// Reducer
-const exerciseProgressReducer = (state, action) => {
- switch (action.type) {
- case EXERCISE_PROGRESS_ACTION_TYPES.ADD_DONE_INQUIRY:
- return {
- ...state,
- inquiryProgresses: [
- ...state.inquiryProgresses,
- createInquiryProgressMetaData({
- inquiryId: action.inquiryId,
- score: action.score,
- achievableScore: action.achievableScore,
- }),
- ],
- numberOfDoneInquiries: state.numberOfDoneInquiries + 1,
- currentExerciseScore: state.currentExerciseScore + action.score,
- };
- case EXERCISE_PROGRESS_ACTION_TYPES.RESET:
- return initialState;
- default:
- // eslint-disable-next-line fp/no-throw
- throw new Error('unexpected action type');
- }
-};
-
-const initialState = {
- inquiryProgresses: [],
- numberOfDoneInquiries: 0,
- currentExerciseScore: 0,
-};
-
-export const ExerciseProgressContext = createContext(null);
-
-export const ExerciseProgressProvider = ({ isFromPlacementCourse, children }) => {
- const [exerciseStats, dispatch] = useReducer(exerciseProgressReducer, initialState);
-
- return (
-
- {children}
-
- );
-};
-
-// usage hook with "action creators"
-export const useExerciseProgress = () => {
- const [exerciseProgress, dispatch] = useContext(ExerciseProgressContext);
-
- const addDoneInquiry = ({ inquiryId, score, achievableScore }) => {
- dispatch({
- type: EXERCISE_PROGRESS_ACTION_TYPES.ADD_DONE_INQUIRY,
- inquiryId,
- score,
- achievableScore,
- });
- };
-
- const resetProgress = () => {
- dispatch({ type: EXERCISE_PROGRESS_ACTION_TYPES.RESET });
- };
-
- return { exerciseProgress, addDoneInquiry, resetProgress };
-};
diff --git a/sources-gen/components/Lesson/LessonExercise/workflow/inquiryState.jsx b/sources-gen/components/Lesson/LessonExercise/workflow/inquiryState.jsx
deleted file mode 100644
index 7e941ab..0000000
--- a/sources-gen/components/Lesson/LessonExercise/workflow/inquiryState.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-export const INQUIRY_STATE = Object.freeze({
- INITIAL: 'INITIAL',
- WRONG: 'WRONG',
- CORRECT: 'CORRECT',
- SOLVED: 'SOLVED',
-});
diff --git a/sources-gen/components/Lesson/LessonExercise/workflow/useInquiryHandling.jsx b/sources-gen/components/Lesson/LessonExercise/workflow/useInquiryHandling.jsx
deleted file mode 100644
index 39cdbe5..0000000
--- a/sources-gen/components/Lesson/LessonExercise/workflow/useInquiryHandling.jsx
+++ /dev/null
@@ -1,65 +0,0 @@
-import { useState } from 'react';
-import { INQUIRY_STATE } from './inquiryState';
-import { useExerciseProgress } from './ExerciseProgress';
-
-export const useInquiryHandling = ({ inquiryId, achievableScore, subInquiries = 1 }) => {
- const [isSolveButtonDisabled, setSolveButtonDisabled] = useState(true);
- const [isCheckButtonDisabled, setCheckButtonDisabled] = useState(false);
- const [isMarkedAsDone, setMarkedAsDone] = useState(false);
- const [wrongAnswerCount, setWrongAnswerCount] = useState(0);
- const [inquiryState, setInquiryState] = useState(INQUIRY_STATE.INITIAL);
-
- const { addDoneInquiry, exerciseProgress } = useExerciseProgress();
- const { isFromPlacementCourse } = exerciseProgress;
-
- const isDisabled = () => {
- return (
- inquiryState === INQUIRY_STATE.CORRECT ||
- inquiryState === INQUIRY_STATE.SOLVED ||
- (inquiryState === INQUIRY_STATE.WRONG && isFromPlacementCourse)
- );
- };
-
- const disableAllButtons = () => {
- setCheckButtonDisabled(true);
- setSolveButtonDisabled(true);
- };
-
- const checkAndMarkAsDone = ({ score = 0 }) => {
- if (!isMarkedAsDone) {
- addDoneInquiry({ inquiryId, achievableScore, score });
- setMarkedAsDone(true);
- }
- };
-
- const handleCorrectAnswer = () => {
- setInquiryState(INQUIRY_STATE.CORRECT);
- checkAndMarkAsDone({ score: achievableScore });
- disableAllButtons();
- };
-
- const handleWrongAnswer = (correctSubInquiries = 0) => {
- setInquiryState(INQUIRY_STATE.WRONG);
- checkAndMarkAsDone({ score: (achievableScore * correctSubInquiries) / subInquiries });
- setWrongAnswerCount(wrongAnswerCount + 1);
- if (isFromPlacementCourse) setCheckButtonDisabled(true);
- setSolveButtonDisabled(false);
- };
-
- const handleSolved = () => {
- setInquiryState(INQUIRY_STATE.SOLVED);
- checkAndMarkAsDone({});
- disableAllButtons();
- };
-
- return {
- isSolveButtonDisabled,
- isCheckButtonDisabled,
- inquiryState,
- isDisabled,
- isFromPlacementCourse,
- handleCorrectAnswer,
- handleWrongAnswer,
- handleSolved,
- };
-};
diff --git a/sources-gen/components/Lesson/LessonExtras/LessonExtras.jsx b/sources-gen/components/Lesson/LessonExtras/LessonExtras.jsx
deleted file mode 100644
index 1ed99af..0000000
--- a/sources-gen/components/Lesson/LessonExtras/LessonExtras.jsx
+++ /dev/null
@@ -1,84 +0,0 @@
-import gql from 'graphql-tag';
-import { ContentContainer } from '../../ContentContainer/ContentContainer';
-import { ContentHeadline } from '../../ContentContainer/ContentHeadline/ContentHeadline';
-import { ContentBottomLine } from '../../ContentContainer/ContentBottomLine/ContentBottomLine';
-import { ContentSection } from '../../ContentContainer/ContentSection/ContentSection';
-import { ArticleLinks } from './Links/ArticleLinks';
-import { AudioLinks } from './Links/AudioLinks';
-import { DownloadLinks } from './Links/DownloadLinks';
-import { VideoLinks, videoResourceLinksFragment } from './Links/VideoLinks';
-import { I18nText } from '../../I18n/I18nText';
-
-export const lessonExtrasFragment = gql`
- fragment LessonExtras on Lesson {
- id
- contentLinks(targetTypes: [ARTICLE, DOWNLOAD, AUDIO, VIDEO]) {
- id
- name
- targetId
- targetType
- target {
- ... on Download {
- filename
- }
- ... on Article {
- name
- }
- ... on Audio {
- id
- name
- audioResourceLinks {
- id
- url
- size
- format
- variant
- }
- }
- ...${videoResourceLinksFragment.name}
- }
- }
- }
- ${videoResourceLinksFragment.fragment()}
-`;
-
-const filterContentByType = type => contentLink => contentLink.targetType === type;
-
-export const LessonExtras = ({ content = {} }) => {
- const { contentLinks = [] } = content;
- const downloads = contentLinks.filter(filterContentByType('DOWNLOAD'));
- const articles = contentLinks.filter(filterContentByType('ARTICLE'));
- const audios = contentLinks.filter(filterContentByType('AUDIO'));
- const videos = contentLinks.filter(filterContentByType('VIDEO'));
- const [hasDownloads, hasVideos, hasAudios, hasArticles] = [
- !!downloads.length,
- !!videos.length,
- !!audios.length,
- !!articles.length,
- ];
-
- return (
-
-
-
-
- {hasDownloads && (
-
-
-
- )}
- {(hasVideos || hasAudios) && (
-
- {hasVideos && }
- {hasAudios && }
-
- )}
- {hasArticles && (
-
-
-
- )}
-
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExtras/Links/ArticleLinks.jsx b/sources-gen/components/Lesson/LessonExtras/Links/ArticleLinks.jsx
deleted file mode 100644
index 0327a8c..0000000
--- a/sources-gen/components/Lesson/LessonExtras/Links/ArticleLinks.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { getArticleUrl } from '../../../../utils/url/url';
-
-export const ArticleLinks = ({ data }) => {
- return data.map(({ targetId, target: { name: targetName }, name }) => (
-
- ));
-};
diff --git a/sources-gen/components/Lesson/LessonExtras/Links/AudioLinks.jsx b/sources-gen/components/Lesson/LessonExtras/Links/AudioLinks.jsx
deleted file mode 100644
index 089ef91..0000000
--- a/sources-gen/components/Lesson/LessonExtras/Links/AudioLinks.jsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { capitalize, getMediaFileSizeInKBorMB } from '../../../../utils/commons';
-import { getAudioDownloadUrl } from '../../../../utils/url/url';
-
-export const AudioLinks = ({ data }) => {
- const getAudioLinkTitle = (name, format, size, variant) =>
- `${name} | ${format} | ${getMediaFileSizeInKBorMB(size)} (${capitalize(variant)})`;
-
- return data.map(audioLink =>
- audioLink.target.audioResourceLinks.map(({ id, url, format, size, variant }) => (
-
- )),
- );
-};
diff --git a/sources-gen/components/Lesson/LessonExtras/Links/DownloadLinks.jsx b/sources-gen/components/Lesson/LessonExtras/Links/DownloadLinks.jsx
deleted file mode 100644
index a8d6463..0000000
--- a/sources-gen/components/Lesson/LessonExtras/Links/DownloadLinks.jsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { getDownloadUrl } from '../../../../utils/url/url';
-import { useFrontendConfig } from '../../../../hooks/useFrontendConfig';
-
-export const DownloadLinks = ({ data }) => {
- const { staticBaseHost } = useFrontendConfig();
-
- return data.map(({ targetId, target: { filename }, name }) => (
-
- ));
-};
diff --git a/sources-gen/components/Lesson/LessonExtras/Links/VideoLinks.jsx b/sources-gen/components/Lesson/LessonExtras/Links/VideoLinks.jsx
deleted file mode 100644
index 93b66c7..0000000
--- a/sources-gen/components/Lesson/LessonExtras/Links/VideoLinks.jsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import gql from 'graphql-tag';
-import { getMediaFileSizeInKBorMB } from '../../../../utils/commons';
-import { getVideoDownloadUrl } from '../../../../utils/url/url';
-
-export const videoResourceLinksFragment = {
- name: 'VideoResourceLinks',
- fragment() {
- return gql`fragment ${this.name} on Video {
- id
- name
- videoResourceLinks {
- id
- url
- techFormat
- size
- format
- }
- }
- `;
- },
-};
-
-export const VideoLinks = ({ data }) => {
- const getVideoLinksByFormat = video =>
- video.videoResourceLinks.filter(videoLink => videoLink.techFormat.includes('PODCAST'));
-
- const videos = [].concat(
- ...data.map(video =>
- getVideoLinksByFormat(video.target).map(link => ({ ...link, name: video.name })),
- ),
- );
-
- const getVideoLinkTitle = (name, format, size, techFormat) =>
- `${name} | ${format} | ${getMediaFileSizeInKBorMB(size)} (${techFormat.slice(-2)})`;
-
- return videos.map(({ id, url, name, format, size, techFormat }) => (
-
-
- {getVideoLinkTitle(name, format, size, techFormat)}
-
-
- ));
-};
diff --git a/sources-gen/components/Lesson/LessonInformation/LessonInformation.jsx b/sources-gen/components/Lesson/LessonInformation/LessonInformation.jsx
deleted file mode 100644
index de375a0..0000000
--- a/sources-gen/components/Lesson/LessonInformation/LessonInformation.jsx
+++ /dev/null
@@ -1,81 +0,0 @@
-import { useParams } from 'react-router';
-import gql from 'graphql-tag';
-import {
- LessonContentDescription,
- lessonContentDescriptionFragment,
-} from '../LessonContentDescription/LessonContentDescription';
-import {
- MediaInputChooser,
- mediaInputChooserFragment,
-} from '../MediaInputChooser/MediaInputChooser';
-import { ImageOGMetaData } from '../../ImageOGMetaData/ImageOGMetaData';
-import { knowledgesFragment } from '../LessonKnowledge/LessonKnowledge';
-import { WithGraphQLQueryHandling } from '../../WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { metaDataFragment, PageMetaData } from '../../Page/PageMetaData';
-import { PAGE_TYPES } from '../../../constants/pageTypes';
-import {
- gtmDataLayerFragment,
- GtmScriptWithDataLayer,
-} from '../../GoogleTagManager/GtmScriptWithDataLayer';
-
-export const lessonInformationQuery = gql`
- query LessonInformation($lessonId: Int!, $lang: Language!) {
- content(id: $lessonId, lang: $lang) {
- ... on Lesson {
- ...LessonMediaInputChooser
- ...LessonContentDescription
- ...LessonKnowledges
- ...${metaDataFragment.name}
- ${gtmDataLayerFragment.partial()}
- }
- }
- }
- ${mediaInputChooserFragment.fragment({ type: 'Lesson' })}
- ${lessonContentDescriptionFragment}
- ${knowledgesFragment.fragment({ type: 'Lesson' })}
- ${metaDataFragment.fragment({ type: 'Lesson' })}
-`;
-
-export const LessonInformation = ({
- lessonLang,
- firstExercisePath,
- isFinalTest,
- courseName,
- isContentDescriptionHintVisible = false,
- ogImage,
-}) => {
- const { lessonId } = useParams();
-
- const lessonInformationQueryVariables = {
- lessonId: +lessonId,
- lang: lessonLang,
- };
-
- return (
-
- {data => (
- <>
-
-
-
-
-
- >
- )}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonKnowledge/LessonKnowledge.jsx b/sources-gen/components/Lesson/LessonKnowledge/LessonKnowledge.jsx
deleted file mode 100644
index 5eb22b2..0000000
--- a/sources-gen/components/Lesson/LessonKnowledge/LessonKnowledge.jsx
+++ /dev/null
@@ -1,105 +0,0 @@
-import gql from 'graphql-tag';
-import { useParams } from 'react-router';
-import { wrapTablesWithDiv } from '../../../utils/replacers/htmlReplacer';
-import { replacePlaceholderImagesWithResponsivePictures } from '../../../utils/replacers/imageReplacer';
-import { WithRenderDelay } from '../../WithRenderDelay/WithRenderDelay';
-import { RichText } from '../../RichText/RichText';
-import { toLang } from '../../../utils/mappers/langMapper';
-import { WithGraphQLQueryHandling } from '../../WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { replacePlaceholderMarkupWithKnowledges } from '../../../utils/replacers/knowledgeReplacer';
-import { ContentHeadline } from '../../ContentContainer/ContentHeadline/ContentHeadline';
-import { useRtlContext } from '../../../hooks/useRtl';
-import { PageMetaData } from '../../Page/PageMetaData';
-import { gtmDataLayerFragment } from '../../GoogleTagManager';
-import { GtmScriptWithDataLayer } from '../../GoogleTagManager/GtmScriptWithDataLayer';
-
-export const knowledgesFragment = {
- name: 'Knowledges',
- fragment({ type }) {
- return gql`fragment ${type}${this.name} on ${type} {
- knowledges {
- id
- text
- knowledgeType
- shortTitle
- subTitle
- name
- mainContentImage {
- id
- name
- }
- audios {
- mp3Src
- }
- }
- }
- `;
- },
-};
-export const lessonKnowledgeQuery = gql`
- query LessonKnowledge($knowledgeId: Int!, $lessonLang: Language!) {
- content(id: $knowledgeId, lang: $lessonLang) {
- ... on Knowledge {
- name
- text
- }
- ...KnowledgeKnowledges
- ${gtmDataLayerFragment.partial()}
- }
- }
- ${knowledgesFragment.fragment({ type: 'Knowledge' })}
-`;
-
-export const LessonKnowledge = ({ pageType, lessonName, lessonKeywordStrings }) => {
- const { langCode, contentId } = useParams();
- const { isRtl } = useRtlContext();
- const lessonKnowledgeQueryVariables = {
- knowledgeId: +contentId,
- lessonLang: toLang(langCode),
- };
-
- return (
-
- {data => {
- const { content } = data;
- const { name, text, knowledges } = content;
- const knowledgeContent = wrapTablesWithDiv(text);
-
- return (
- <>
-
-
-
- {name}
-
-
-
- {
- replacePlaceholderImagesWithResponsivePictures();
- replacePlaceholderMarkupWithKnowledges({ knowledges, isRtl });
- }}
- delayTime={10}
- render={() => }
- />
-
-
-
- >
- );
- }}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonKnowledgeNavigation/LessonKnowledgeNavigation.jsx b/sources-gen/components/Lesson/LessonKnowledgeNavigation/LessonKnowledgeNavigation.jsx
deleted file mode 100644
index 36f36b5..0000000
--- a/sources-gen/components/Lesson/LessonKnowledgeNavigation/LessonKnowledgeNavigation.jsx
+++ /dev/null
@@ -1,114 +0,0 @@
-import { useHistory, useParams } from 'react-router';
-import { LessonVocabulary } from '../LessonVocabulary/LessonVocabulary';
-import { StyledStandardButton as StandardButton } from '../../StandardButton/StandardButton';
-import { NavigationRow } from './NavigationRow/NavigationRow';
-import { normalizeUrlName } from '../../../utils/url/url';
-import {
- ALPHABETICAL_ORDER_URL_SUFFIX,
- LESSON_VOCABULARY_URL_SUFFIX,
- getLessonGrammarUrl,
- getLessonPhonemicChartUrl,
- getLessonRegionalStudiesUrl,
- getLessonVocabularyUrl,
- getSummaryUrl,
- getLessonUrl,
-} from '../../../utils/url/urlFactory';
-import { LessonKnowledge } from '../LessonKnowledge/LessonKnowledge';
-import { LESSON_PARTS } from '../../../constants/lessonParts';
-import { ContentBottomLine } from '../../ContentContainer/ContentBottomLine/ContentBottomLine';
-import { PAGE_TYPES } from '../../../constants/pageTypes';
-import { PageMetaData } from '../../Page/PageMetaData';
-
-const LESSON_PARTS_SUFFIX = {
- [LESSON_VOCABULARY_URL_SUFFIX]: LESSON_PARTS.VOCABULARY_GLOSSARY,
- [ALPHABETICAL_ORDER_URL_SUFFIX]: LESSON_PARTS.PHONEMIC_CHART,
-};
-
-export const LessonKnowledgeNavigation = ({
- lessonName,
- lessonKeywordStrings,
- lessonKnowledgeOverviewItems,
-}) => {
- const history = useHistory();
- const { langCode, lessonId, knowledgeType, contentId } = useParams();
- const lessonPath = getLessonUrl(lessonId, langCode, normalizeUrlName(lessonName));
-
- const getCurrentItem = () => {
- if (contentId) {
- return lessonKnowledgeOverviewItems.find(item => item.targetId.toString() === contentId);
- }
- return lessonKnowledgeOverviewItems.find(
- item => item.lessonPart === LESSON_PARTS_SUFFIX[knowledgeType],
- );
- };
-
- const currentItem = getCurrentItem();
- const currentItemIndex = lessonKnowledgeOverviewItems.indexOf(currentItem);
- const previousItem = lessonKnowledgeOverviewItems[currentItemIndex - 1];
- const nextItem = lessonKnowledgeOverviewItems[currentItemIndex + 1];
-
- const moveTo = item => {
- const normalizedName = normalizeUrlName(item.target.name);
- if (item.lessonPart === LESSON_PARTS.GRAMMAR) {
- return getLessonGrammarUrl(langCode, lessonId, normalizedName, item.targetId);
- }
- if (item.lessonPart === LESSON_PARTS.REGIONAL_STUDIES) {
- return getLessonRegionalStudiesUrl(langCode, lessonId, normalizedName, item.targetId);
- }
- if (item.lessonPart === LESSON_PARTS.PHONEMIC_CHART) {
- return getLessonPhonemicChartUrl(langCode, lessonId, normalizedName);
- }
- return getLessonVocabularyUrl(langCode, lessonId, normalizedName);
- };
-
- const getCurrentComponent = () => {
- if ([LESSON_PARTS.GRAMMAR, LESSON_PARTS.REGIONAL_STUDIES].includes(currentItem.lessonPart)) {
- const pageType =
- currentItem.lessonPart === LESSON_PARTS.GRAMMAR
- ? PAGE_TYPES.GRAMMAR
- : PAGE_TYPES.REGIONAL_STUDIES;
- return (
-
- );
- }
-
- if (currentItem.lessonPart === LESSON_PARTS.PHONEMIC_CHART) {
- // TODO - create Phonemic Chart component and keep PageMetaData (but extend with content)
- return (
- <>
-
- Phonemic Chart component
- >
- );
- }
- return ;
- };
-
- const goNextWithButton = () => {
- const nextPath = nextItem ? moveTo(nextItem) : getSummaryUrl(lessonPath);
- history.push(nextPath);
- };
-
- return (
-
-
- {currentItem && getCurrentComponent()}
-
-
-
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonKnowledgeNavigation/NavigationRow/NavigationRow.jsx b/sources-gen/components/Lesson/LessonKnowledgeNavigation/NavigationRow/NavigationRow.jsx
deleted file mode 100644
index 9401f5a..0000000
--- a/sources-gen/components/Lesson/LessonKnowledgeNavigation/NavigationRow/NavigationRow.jsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { Link } from 'react-router-dom';
-import { getTranslationCodeForLessonPart } from '../../../../utils/mappers/lessonPartToTranslationCode';
-import { LESSON_PARTS } from '../../../../constants/lessonParts';
-import { useI18nContext } from '../../../../context/I18nContext';
-
-const getArrowAriaLabel = (item, t) => {
- if (item && item.lessonPart === LESSON_PARTS.GRAMMAR) {
- return item.target.name;
- }
- if (item && item.lessonPart === LESSON_PARTS.VOCABULARY_GLOSSARY) {
- return t('lesson.aria.vocabulary');
- }
- return '';
-};
-
-export const NavigationRow = ({ position, currentItem, previousItem, nextItem, moveTo }) => {
- const { i18n } = useI18nContext();
-
- return (
-
-
-
-
- {currentItem && i18n.t(getTranslationCodeForLessonPart(currentItem.lessonPart))}
-
- {previousItem && (
-
- )}
- {nextItem && (
-
- )}
-
-
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonMenu/LessonMenu.jsx b/sources-gen/components/Lesson/LessonMenu/LessonMenu.jsx
deleted file mode 100644
index e377a39..0000000
--- a/sources-gen/components/Lesson/LessonMenu/LessonMenu.jsx
+++ /dev/null
@@ -1,272 +0,0 @@
-import styled from 'styled-components';
-import { useState } from 'react';
-import { useParams } from 'react-router';
-import { useDispatch } from 'react-redux';
-import { useHistory } from 'react-router-dom';
-import { colors, resolutions, clearfix } from '../../../utils/css';
-import { LessonMenuItem } from './LessonMenuItem/LessonMenuItem';
-import { LessonTitle } from './LessonTitleAndBurgerButton/LessonTitle';
-import { LessonBurgerButton } from './LessonTitleAndBurgerButton/LessonBurgerButton';
-import { LESSON_PARTS } from '../../../constants/lessonParts';
-import {
- getAlphabeticalOrderUrl,
- getCourseUrl,
- getExtrasUrl,
- getFirstGrammarUrl,
- getFirstRegionalStudiesUrl,
- getLessonUrl,
- getManuscriptUrl,
- getPlacementDashboardUrl,
- getVocabularyUrl,
-} from '../../../utils/url/urlFactory';
-import { normalizeUrlName } from '../../../utils/url/url';
-import { hasLessonPart } from '../../../utils/lessonUtils';
-import { ModalIntegration } from '../../Modal/ModalIntegration';
-import { ResetModal } from '../../Modal/ResetModal';
-import { deleteLessonProgress } from '../../../state/progress/learnProgressDuck';
-import { useTranslation } from '../../../hooks/useTranslation';
-
-export const LessonMenu = ({
- lessonId,
- lessonName,
- lessonOverviewParts,
- courseId,
- courseName,
- isFromPlacementCourse,
- isFinalTest,
- firstExercisePath,
-}) => {
- const { langCode } = useParams();
- const [isMenuCollapsed, setIsMenuCollapsed] = useState(true);
- const [isResetModalOpen, setResetModalOpen] = useState(false);
-
- const dispatch = useDispatch();
- const history = useHistory();
-
- const grammarAria = useTranslation('lesson.menu.grammar_aria');
- const vocabularyAria = useTranslation('lesson.menu.vocabulary_aria');
-
- const onConfirmResetLessonProgress = () => {
- dispatch(deleteLessonProgress(+lessonId));
- setResetModalOpen(false);
- history.push(getLessonUrl(lessonId, langCode, normalizeUrlName(lessonName)));
- };
-
- const onCancelResetLessonProgress = () => {
- setResetModalOpen(false);
- };
-
- const getFirstOfTypeId = lessonPart =>
- hasLessonPart(lessonOverviewParts, lessonPart) &&
- lessonOverviewParts.find(part => part.lessonPart === lessonPart).targetId;
-
- const firstGrammarId = getFirstOfTypeId(LESSON_PARTS.GRAMMAR);
- const firstRegionalStudiesId = getFirstOfTypeId(LESSON_PARTS.REGIONAL_STUDIES);
-
- const lessonPath = getLessonUrl(lessonId, langCode, normalizeUrlName(lessonName));
-
- const hasExercisesReset =
- hasLessonPart(lessonOverviewParts, LESSON_PARTS.EXERCISE) &&
- !isFromPlacementCourse &&
- !isFinalTest;
-
- return (
-
-
-
- );
-};
-
-export const StyledLessonMenu = styled('nav')`
- display: grid;
-
- @media (min-width: ${resolutions.min.desktop}px) {
- margin-bottom: 20px;
- }
-
- .lesson-nav-layout-wrapper {
- background-color: ${colors.LG_ORANGE};
- position: relative;
- top: 0;
- width: 100%;
- z-index: 3;
- }
-
- .lesson-title-button-container-wrapper {
- display: grid;
- }
-
- .lesson-nav-menu-container-wrapper {
- position: absolute;
- width: 100%;
- }
-
- .lesson-nav-menu-wrapper {
- border-top: 1px solid ${colors.LG_WHITE};
- box-shadow: 1px 10px 20px 0 ${colors.LG_TRANSPARENT_BLACK_25};
- margin: 0;
- padding: 0;
- width: 100%;
-
- @media (min-width: ${resolutions.min.desktop}px) {
- box-shadow: none;
- }
- }
-
- .lesson-nav-menu {
- background-color: ${colors.LG_ORANGE};
- list-style-type: none;
- margin: 0;
- padding: 0;
- width: 100%;
-
- ${clearfix}
-
- @media (min-width: ${resolutions.min.desktop}px) {
- /* @noflip */
- float: right;
- width: 400px;
- }
- }
-`;
diff --git a/sources-gen/components/Lesson/LessonMenu/LessonMenuItem/LessonMenuItem.jsx b/sources-gen/components/Lesson/LessonMenu/LessonMenuItem/LessonMenuItem.jsx
deleted file mode 100644
index 49c03e7..0000000
--- a/sources-gen/components/Lesson/LessonMenu/LessonMenuItem/LessonMenuItem.jsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { Link } from 'react-router-dom';
-import styled from 'styled-components';
-import { colors, resolutions } from '../../../../utils/css';
-import { useTranslation } from '../../../../hooks/useTranslation';
-
-export const LessonMenuItem = ({
- to,
- translationKey,
- id,
- ariaLabel,
- target,
- rel,
- onClick,
- onKeyPress,
-}) => {
- const label = useTranslation(translationKey);
- return (
-
-
- {label}
-
-
- );
-};
-
-export const StyledLessonMenuItem = styled('li')`
- padding: 0;
- text-align: center;
- width: 100%;
-
- @media (min-width: ${resolutions.min.tablet}px) {
- border-bottom: 1px solid ${colors.LG_WHITE};
- }
-
- .lesson-menu-link {
- color: ${colors.LG_WHITE};
- font-family: Helvetica, Arial, sans-serif;
- font-size: 17px;
- font-weight: 700;
- display: inline-block;
- padding: 20px;
- text-decoration: none;
- width: 100%;
-
- // mouse, touch pad
- @media (hover: hover) and (pointer: fine) {
- &:hover {
- background-color: ${colors.LG_ORANGE1};
- }
- }
- // smartphones, touchscreens
- @media (hover: none) and (pointer: coarse) {
- &:hover {
- background-color: ${colors.LG_ORANGE1};
- }
- }
- &:active {
- background-color: ${colors.LG_ORANGE1};
- }
- &:focus {
- background-color: ${colors.LG_BLACK};
- }
-
- @media (min-width: ${resolutions.min.tablet}px) {
- font-size: 21px;
- }
- }
-`;
diff --git a/sources-gen/components/Lesson/LessonMenu/LessonTitleAndBurgerButton/LessonBurgerButton.jsx b/sources-gen/components/Lesson/LessonMenu/LessonTitleAndBurgerButton/LessonBurgerButton.jsx
deleted file mode 100644
index f8d494e..0000000
--- a/sources-gen/components/Lesson/LessonMenu/LessonTitleAndBurgerButton/LessonBurgerButton.jsx
+++ /dev/null
@@ -1,132 +0,0 @@
-import styled from 'styled-components';
-import { colors, resolutions } from '../../../../utils/css';
-import navCrossBlackLg from '../../../../assets/svg/nav-cross-black-lg.svg';
-import navCrossLg from '../../../../assets/svg/nav-cross-lg.svg';
-import { StyledIconBar as IconBar } from '../../../IconBar/IconBar';
-import { I18nText } from '../../../I18n/I18nText';
-
-export const LessonBurgerButton = ({ isMenuCollapsed, setIsMenuCollapsed }) => (
-
- setIsMenuCollapsed(!isMenuCollapsed)}
- type="button"
- className={isMenuCollapsed ? 'icon-toggle collapsed' : 'icon-toggle collapse'}
- data-toggle={isMenuCollapsed ? 'collapsed' : 'collapse'}
- data-target="#lecture-nav-user-menu"
- aria-expanded={isMenuCollapsed}
- aria-controls="navbar"
- >
-
-
-
-
-
-
-
- {!isMenuCollapsed && }
-
- {isMenuCollapsed && (
- <>
-
-
- >
- )}
-
-
-
-);
-
-const buttonStyle = `
- background-color: transparent;
- background-image: none;
- border: 0;
- border-radius: 0;
- margin: 0;
- padding: 0;
-`;
-
-const defaultHoverStyles = `
- &:hover ${IconBar} {
- background-color: ${colors.LG_BLACK};
- }
- &:hover .close-menu {
- background: url(${navCrossBlackLg});
- background-size: cover;
- }
-`;
-// mouse, touch pad, smartphones, touchscreens
-const mediaHoverDeviceDetection = `
- @media (hover: hover) and (pointer: fine) {
- ${defaultHoverStyles}
- }
- @media (hover: none) and (pointer: coarse) {
- ${defaultHoverStyles}
- }
-`;
-
-export const StyledLessonBurgerButton = styled('div')`
- position: absolute;
- /*! @noflip */
- right: 20px;
- top: calc(50% - 10px);
-
- @media (min-width: ${resolutions.min.desktop}px) {
- /*! @noflip */
- right: 30px;
- }
-
- .title {
- display: none;
- }
-
- ${IconBar} {
- background-color: ${colors.LG_WHITE};
- padding: 0;
- }
-
- .close-menu {
- background: url(${navCrossLg});
- background-size: cover;
- display: block;
- height: 15px;
- margin-top: 6px;
- /*! @noflip */
- right: 15px;
- width: 15px;
-
- @media (min-width: ${resolutions.min.tablet}px) {
- height: 21px;
- margin-top: 2px;
- width: 22px;
- }
- }
-
- .collapse {
- display: block;
- ${buttonStyle}
- }
-
- .collapsed {
- ${buttonStyle}
- }
-
- .burger-menu-toggle-container {
- margin: 0;
- position: relative;
- }
-
- .icon-toggle {
- ${mediaHoverDeviceDetection}
-
- &:active ${IconBar},
- &:focus ${IconBar} {
- background-color: ${colors.LG_BLACK};
- }
-
- &:focus .close-menu,
- &:active .close-menu {
- background: url(${navCrossBlackLg});
- background-size: cover;
- }
- }
-`;
diff --git a/sources-gen/components/Lesson/LessonMenu/LessonTitleAndBurgerButton/LessonTitle.jsx b/sources-gen/components/Lesson/LessonMenu/LessonTitleAndBurgerButton/LessonTitle.jsx
deleted file mode 100644
index 009b2cd..0000000
--- a/sources-gen/components/Lesson/LessonMenu/LessonTitleAndBurgerButton/LessonTitle.jsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import styled from 'styled-components';
-import { colors, resolutions } from '../../../../utils/css';
-
-export const LessonTitle = ({ lessonName }) => (
-
- {lessonName}
-
-);
-
-export const StyledLessonTitle = styled('div')`
- align-items: center;
- display: flex;
- justify-content: center;
- min-height: 60px;
-
- .title {
- color: ${colors.LG_WHITE};
- font-size: 18px;
- line-height: 1.3;
- margin: 15px 0;
- padding: 0 50px;
- text-align: center;
- }
-
- @media (min-width: ${resolutions.min.tablet}px) {
- min-height: 85px;
-
- .title {
- font-size: 25px;
- padding: 0 65px;
- }
- }
-
- @media (min-width: ${resolutions.min.desktop}px) {
- .title {
- font-size: 34px;
- }
- }
-`;
diff --git a/sources-gen/components/Lesson/LessonSummary/LessonSummary.jsx b/sources-gen/components/Lesson/LessonSummary/LessonSummary.jsx
deleted file mode 100644
index 047ea31..0000000
--- a/sources-gen/components/Lesson/LessonSummary/LessonSummary.jsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import { Link } from 'react-router-dom';
-import { Summary } from '../LessonExercise/LessonExerciseResult/Summary';
-import { getContentUrl, getDashboardUrl } from '../../../utils/url/urlFactory';
-import { I18nText } from '../../I18n/I18nText';
-import { toLangCode } from '../../../utils/mappers/langMapper';
-import { isFinalTestPredicate } from '../../../utils/commons';
-import { LessonResultAndSummaryGlobalStyles } from '../LessonExercise/LessonExerciseResult/LessonExerciseResult';
-
-export const LessonSummary = ({ data, lessonId, language }) => {
- const { content } = data;
- const { contentLinks } = content;
- const currentLessonLink = contentLinks.find(link => link.targetId === lessonId);
- const currentLessonIndex = contentLinks.indexOf(currentLessonLink);
-
- const generateRedirectInfos = () => {
- const nextLessonContentLink = contentLinks[currentLessonIndex + 1] || {};
- const { lesson } = nextLessonContentLink;
-
- if (!lesson) {
- return {
- url: getDashboardUrl(toLangCode(language)),
- redirectMessage: 'lesson.exercises.result.toDashboard',
- };
- }
-
- const { shortTitle, id } = lesson;
-
- const url = getContentUrl({
- id,
- name: shortTitle,
- language,
- __typename: 'Lesson',
- });
-
- const isFinalTest = isFinalTestPredicate(nextLessonContentLink);
-
- const redirectMessage = isFinalTest
- ? 'lesson.exercises.result.toFinalTest'
- : 'lesson.exercises.result.nextLesson';
-
- return { url, redirectMessage };
- };
-
- const { url, redirectMessage } = generateRedirectInfos();
-
- return (
- <>
-
-
- >
- );
-};
diff --git a/sources-gen/components/Lesson/LessonVocabulary/LessonVocabulary.jsx b/sources-gen/components/Lesson/LessonVocabulary/LessonVocabulary.jsx
deleted file mode 100644
index 0cc4817..0000000
--- a/sources-gen/components/Lesson/LessonVocabulary/LessonVocabulary.jsx
+++ /dev/null
@@ -1,116 +0,0 @@
-import { gql } from '@apollo/client';
-import { useParams } from 'react-router';
-import { createGlobalStyle } from 'styled-components';
-import { VocabularyRow } from './VocabularyRow/VocabularyRow';
-import { toLang } from '../../../utils/mappers/langMapper';
-import { WithGraphQLQueryHandling } from '../../WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { isRtlByLangCode } from '../../../utils/mappers/rtlLanguages';
-import { metaDataFragment, PageMetaData } from '../../Page/PageMetaData';
-import { PAGE_TYPES } from '../../../constants/pageTypes';
-import {
- gtmDataLayerFragment,
- GtmScriptWithDataLayer,
-} from '../../GoogleTagManager/GtmScriptWithDataLayer';
-
-export const lessonVocabularyQuery = gql`
- query LessonVocabulary($lessonId: Int!, $lessonLang: Language!) {
- content(id: $lessonId, lang: $lessonLang) {
- ... on Lesson {
- vocabularies {
- id
- name
- subTitle
- text
- audios {
- mp3Src
- mainContentImageLink {
- targetId
- }
- }
- }
- ...${metaDataFragment.name}
- ${gtmDataLayerFragment.partial()}
- }
- }
- }
- ${metaDataFragment.fragment({ type: 'Lesson' })}
-`;
-
-const LessonVocabularyGlobalStyles = createGlobalStyle`
- /* @noflip */
- .override-ltr {
- text-align: left;
- }
-
- @media (min-width: 768px) {
- /* @noflip */
- .col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9 {
- float:right
- }
-
- /* @noflip */
- div.row.vocabulary div.col-sm-4 p {
- margin-right: auto;
- margin-left: 20px
- }
-
- /* @noflip */
- .col-sm-offset-1 {
- margin-right: 8.33333333%;
- margin-left: 0;
- }
- }
-
- @media (min-width: 1200px) {
- /* @noflip */
- .col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9 {
- float:right
- }
-
- /* @noflip */
- .col-lg-offset-2 {
- margin-right: 16.66666667%;
- margin-left: 0
- }
- }
-`;
-
-export const LessonVocabulary = () => {
- const { langCode, lessonId } = useParams();
-
- const lessonVocabularyQueryVariables = {
- lessonId: +lessonId,
- lessonLang: toLang(langCode),
- };
-
- // TODO: this is only temporary here because the old styles need this distinction
- const isRtl = isRtlByLangCode(langCode);
-
- return (
-
- {data => {
- const { content } = data;
- const { vocabularies } = content;
-
- return (
- <>
- {isRtl && }
-
-
- {vocabularies.map(vocabularyItem => (
-
- ))}
- >
- );
- }}
-
- );
-};
diff --git a/sources-gen/components/Lesson/LessonVocabulary/VocabularyRow/VocabularyRow.jsx b/sources-gen/components/Lesson/LessonVocabulary/VocabularyRow/VocabularyRow.jsx
deleted file mode 100644
index 217a1c5..0000000
--- a/sources-gen/components/Lesson/LessonVocabulary/VocabularyRow/VocabularyRow.jsx
+++ /dev/null
@@ -1,58 +0,0 @@
-import { useRef } from 'react';
-import { DwPicture } from '../../../DwPicture/DwPicture';
-
-export const VocabularyRow = ({ data }) => {
- const { name, subTitle, audios, text } = data;
- const audio = audios[0];
- const audioSource = audio ? audio.mp3Src : '';
- const isValidImage = audio && audio.mainContentImageLink;
-
- const audioRef = useRef();
-
- const playAudio = e => {
- e.preventDefault();
- audioRef.current.play();
- };
-
- return (
-
-
-
- {isValidImage && (
-
-
-
- )}
-
-
-
- );
-};
diff --git a/sources-gen/components/Lesson/MediaInputChooser/MediaInputChooser.jsx b/sources-gen/components/Lesson/MediaInputChooser/MediaInputChooser.jsx
deleted file mode 100644
index 2842546..0000000
--- a/sources-gen/components/Lesson/MediaInputChooser/MediaInputChooser.jsx
+++ /dev/null
@@ -1,52 +0,0 @@
-/* eslint-disable no-nested-ternary */
-import gql from 'graphql-tag';
-import {
- MediaInputVideo,
- mediaInputVideoFragment,
-} from '../../MediaInput/MediaInputVideo/MediaInputVideo';
-import {
- MediaInputImage,
- mediaInputImageFragment,
-} from '../../MediaInput/MediaInputImage/MediaInputImage';
-import {
- MediaInputAudio,
- mediaInputAudioFragment,
-} from '../../MediaInput/MediaInputAudio/MediaInputAudio';
-
-export const mediaInputChooserFragment = {
- name: 'MediaInputChooser',
- fragment({ type }) {
- return gql`fragment ${type}${this.name} on ${type} {
- ...${type}MediaInputImage
- ...${type}MediaInputAudio
- ...${type}MediaInputVideo
- }
- ${mediaInputImageFragment.fragment({ type })}
- ${mediaInputAudioFragment.fragment({ type })}
- ${mediaInputVideoFragment.fragment({ type })}
- `;
- },
-};
-
-export const MediaInputChooser = ({ data }) => {
- const { videos, audios } = data.content;
-
- const lessonInput =
- videos.length > 0 ? (
-
- ) : audios.length > 0 ? (
-
- ) : data.content.mainContentImage ? (
-
-
-
- ) : null;
-
- return (
-
- );
-};
diff --git a/sources-gen/components/Logo/Logo.jsx b/sources-gen/components/Logo/Logo.jsx
deleted file mode 100644
index a394bd2..0000000
--- a/sources-gen/components/Logo/Logo.jsx
+++ /dev/null
@@ -1,63 +0,0 @@
-import styled from 'styled-components';
-import { StyledLogo as LogoIcon } from '../../assets/icons/DwLogo';
-import { StyledClaimLogo as ClaimIcon } from '../../assets/icons/DwClaim';
-import { colors, resolutions } from '../../utils/css';
-
-export const Logo = ({ className, url = 'https://dw.com' }) => {
- return (
-
-
-
-
- );
-};
-
-export const StyledLogo = styled(Logo)`
- display: inline-block;
- margin: 0 20px;
- direction: ltr;
-
- svg.logo {
- width: 40px;
- height: 23px;
- fill: ${colors.DW_DARK_BLUE};
- transition: fill 80ms cubic-bezier(0.43, 0, 0.09, 1) 67ms;
- }
-
- svg.claim {
- display: none;
- }
-
- @media (min-width: ${resolutions.min.tablet}px) {
- svg.logo {
- width: 54px;
- height: 31px;
- }
-
- svg.claim {
- display: none;
- }
- }
-
- @media (min-width: ${resolutions.min.desktop}px) {
- svg.logo {
- width: 88px;
- height: 50px;
- }
-
- svg.claim {
- display: inline-block;
- margin: 0 12px;
- width: 140px;
- height: 50px;
- fill: ${colors.DW_LIGHT_BLUE};
- transition: fill 80ms cubic-bezier(0.43, 0, 0.09, 1) 67ms;
- }
- }
-`;
diff --git a/sources-gen/components/MainHeroImage/MainHeroImage.jsx b/sources-gen/components/MainHeroImage/MainHeroImage.jsx
deleted file mode 100644
index ccd5ccc..0000000
--- a/sources-gen/components/MainHeroImage/MainHeroImage.jsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import styled from 'styled-components';
-import { colors, resolutions } from '../../utils/css';
-import { StyledHeroTemplate } from '../HeroTemplate/HeroTemplate';
-import landingImgFull from '../../assets/images/landing/course_landing-1200x675.jpg';
-import landingImgTabletLandscape from '../../assets/images/landing/course_landing-992x558.jpg';
-import landingImgTablet from '../../assets/images/landing/course_landing-768x432.jpg';
-import landingImgMobile from '../../assets/images/landing/course_landing-480x270.jpg';
-
-export const StyledMainHeroImage = styled(StyledHeroTemplate)`
- height: 400px;
- background-size: 100%;
- text-align: center;
- justify-content: center;
- background: url(${landingImgFull}) center/cover no-repeat;
-
- .content {
- position: static;
- display: flex;
- flex-flow: column;
-
- .title {
- color: ${colors.LG_ORANGE_DARK};
- font-family: DWTheAntiquaB, Georgia, serif;
- font-size: 54px;
- font-weight: 400;
- height: 60px;
- line-height: 50px;
- margin: 0 0 30px 0;
- opacity: 1;
- width: 100%;
- }
-
- .description {
- font: 400 23px/27.6px DWTheAntiquaB, Georgia, serif;
- margin: 0 0 10px;
- font-size: 23px;
- color: ${colors.LG_ORANGE_DARK};
- width: 100%;
- }
- }
-
- @media (max-width: ${resolutions.max.mobile}px) {
- .content {
- .title {
- font-size: 28px;
- margin-bottom: -20px;
- }
-
- .description {
- font-size: 16px;
- }
- }
- }
-
- @media (min-width: ${resolutions.min.mobile}px) {
- background: url(${landingImgMobile}) center/cover no-repeat;
- }
-
- @media (min-width: ${resolutions.min.tablet}px) {
- background: url(${landingImgTablet}) center/cover no-repeat;
- .title {
- margin-bottom: 0;
- }
- }
-
- @media (min-width: ${resolutions.min.tabletLandscape}px) {
- background: url(${landingImgTabletLandscape}) center/cover no-repeat;
- }
-
- @media (min-width: ${resolutions.min.full}px) {
- background: url(${landingImgFull}) center/cover no-repeat;
- }
-`;
diff --git a/sources-gen/components/Manuscript/Manuscript.jsx b/sources-gen/components/Manuscript/Manuscript.jsx
deleted file mode 100644
index 73a965d..0000000
--- a/sources-gen/components/Manuscript/Manuscript.jsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import gql from 'graphql-tag';
-import { createGlobalStyle } from 'styled-components';
-import { RichText } from '../RichText/RichText';
-import { useKnowledgePlaceholderReplacementEffect } from '../Modal/KnowledgeModal/useKnowledgePlaceholderReplacementEffect';
-import { ContentContainer } from '../ContentContainer/ContentContainer';
-import { ContentBottomLine } from '../ContentContainer/ContentBottomLine/ContentBottomLine';
-import { StyledAccordionContainer as AccordionContainer } from '../ContentContainer/AccordionContainer';
-
-export const manuscriptFragment = gql`
- fragment LessonManuscript on Lesson {
- id
- manuscript
- }
-`;
-
-const ManuscriptGlobalStyles = createGlobalStyle`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- }
-`;
-
-export const Manuscript = ({ content, isStandalone = true }) => {
- const { knowledges, manuscript } = content;
- const ContainerComponent = isStandalone ? ContentContainer : AccordionContainer;
-
- useKnowledgePlaceholderReplacementEffect({ knowledges, ignore: !isStandalone });
-
- return (
-
-
-
-
-
- );
-};
diff --git a/sources-gen/components/MediaInput/MediaInputAudio/MediaInputAudio.jsx b/sources-gen/components/MediaInput/MediaInputAudio/MediaInputAudio.jsx
deleted file mode 100644
index 2f70443..0000000
--- a/sources-gen/components/MediaInput/MediaInputAudio/MediaInputAudio.jsx
+++ /dev/null
@@ -1,85 +0,0 @@
-/* eslint-disable jsx-a11y/media-has-caption */
-import { useRef } from 'react';
-import gql from 'graphql-tag';
-import { DwPicture } from '../../DwPicture/DwPicture';
-import { I18nText } from '../../I18n/I18nText';
-import { useMediaTracking } from '../../GoogleTagManager/hooks/useMediaTracking';
-import { gtmDataLayerFragment } from '../../GoogleTagManager';
-
-export const mediaInputAudioFragment = {
- name: 'MediaInputAudio',
- fragment({ type }) {
- return gql`fragment ${type}${this.name} on ${type} {
- audios {
- id
- name
- contentDate
- mainContentImage {
- imageId: id
- imageName: name
- }
- mp3Src
- audioResourceLinks {
- url
- duration
- size
- }
- ${gtmDataLayerFragment.partial()}
- }
- }
- `;
- },
-};
-
-export const MediaInputAudio = ({ data }) => {
- const audioRef = useRef();
- useMediaTracking(data.content.audios[0]);
-
- if (!data.content.audios[0]) return null;
- const { id, name, contentDate, mainContentImage, mp3Src } = data.content.audios[0];
- const { imageId, imageName } = mainContentImage || data.content.mainContentImage || {};
- const { duration, size } = data.content.audios[0].audioResourceLinks[0];
-
- const playAudio = e => {
- e.preventDefault();
- audioRef.current.play();
- };
-
- return (
-
- );
-};
diff --git a/sources-gen/components/MediaInput/MediaInputImage/MediaInputImage.jsx b/sources-gen/components/MediaInput/MediaInputImage/MediaInputImage.jsx
deleted file mode 100644
index 97b03c5..0000000
--- a/sources-gen/components/MediaInput/MediaInputImage/MediaInputImage.jsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import gql from 'graphql-tag';
-import { DwPicture } from '../../DwPicture/DwPicture';
-
-export const mediaInputImageFragment = {
- name: 'MediaInputImage',
- fragment({ type }) {
- return gql`fragment ${type}${this.name} on ${type} {
- mainContentImage {
- imageId: id
- imageName: name
- }
- }
- `;
- },
-};
-
-export const MediaInputImage = ({ data }) => {
- const { imageId, imageName } = data.content.mainContentImage || {};
-
- return imageId ? : null;
-};
diff --git a/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/InfoBar/InfoBar.jsx b/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/InfoBar/InfoBar.jsx
deleted file mode 100644
index ace459f..0000000
--- a/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/InfoBar/InfoBar.jsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import styled from 'styled-components';
-import { colors } from '../../../../../utils/css';
-import { StyledTextGray12 as Text } from '../../../../Text/Text';
-
-export const InfoBar = ({ className, videoDuration }) => (
-
-);
-
-export const StyledInfoBar = styled(InfoBar)`
- /* @noflip */
- direction: ltr;
- position: absolute;
- height: 100px;
- bottom: 0;
- width: 100%;
- z-index: 1;
- display: flex;
- align-items: flex-end;
- background: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.9));
- color: ${colors.LG_GRAY_12};
-
- .vjs-duration-text {
- position: relative;
- left: 65px;
- font-size: 1.6rem;
- height: 50px;
- display: flex;
- align-items: center;
-
- & > span {
- font-size: 1.6rem;
- line-height: 0.156rem;
- letter-spacing: 0.05rem;
- }
- }
-
- @media (min-width: 992px) {
- .vjs-duration-text {
- height: 60px;
- left: 75px;
- }
- }
-`;
diff --git a/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/InfoBar/VjsDurationInfoBar.jsx b/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/InfoBar/VjsDurationInfoBar.jsx
deleted file mode 100644
index 135b688..0000000
--- a/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/InfoBar/VjsDurationInfoBar.jsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import ReactDOM from 'react-dom';
-import videojsDefault from 'video.js';
-import { StyledInfoBar as InfoBar } from './InfoBar';
-
-export const durationBarComponentName = 'VjsDurationInfoBar';
-
-const vjsComponent = videojsDefault.getComponent('Component');
-
-export class VjsDurationInfoBar extends vjsComponent {
- constructor(player, options) {
- super(player, options);
- this.mount = this.mount.bind(this);
-
- const videoDuration = player.el().getAttribute('data-duration');
-
- player.ready(() => {
- this.mount({ videoDuration });
- });
-
- player.on('play', () => {
- this.hide();
- });
- }
-
- mount({ videoDuration }) {
- ReactDOM.render( , this.el());
- }
-}
-
-vjsComponent.registerComponent(durationBarComponentName, VjsDurationInfoBar);
diff --git a/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/Button.jsx b/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/Button.jsx
deleted file mode 100644
index 5b1689e..0000000
--- a/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/Button.jsx
+++ /dev/null
@@ -1,141 +0,0 @@
-import classnames from 'classnames';
-import styled, { css } from 'styled-components';
-import { noop } from '../../../../../utils/commons';
-import { mediaMin, colors, selector, mediaDevice } from '../../../../../utils/css';
-import { keyCodes } from '../../../../../constants/keyCodes';
-
-// This button is the DefaultButton in ROAD. We used it as base for the VJS big play button.
-export const Button = ({
- variant,
- className,
- isA = 'div',
- onClick = noop,
- onKeyDown = noop,
- children,
- disabled,
- 'aria-hidden': ariaHidden,
- tabIndex = disabled || ariaHidden ? -1 : 0,
- ...restProps
-}) => {
- const Tag = isA;
-
- return (
- {
- onKeyDown(e);
- if (e.key === keyCodes.ENTER || e.key === keyCodes.SPACEBAR) {
- e.key === keyCodes.SPACEBAR && e.preventDefault();
- onClick();
- }
- }}
- {...restProps}
- >
- {children}
-
- );
-};
-
-const commonHoverAndFocusCss = color => `
- box-shadow: 0 0 0 2px ${color} inset;
- text-decoration: none;
-`;
-
-export const hoverAndFocusCss = ({ cssSelector = '', color = colors.DW_BLUE } = {}) => css`
- ${mediaDevice.mouse`
- &:hover${cssSelector} {
- ${commonHoverAndFocusCss(color)}
- }
- `}
-`;
-
-export const StyledButton = styled(Button)`
- display: block;
- border: none;
- padding: 0;
- background: none;
- cursor: pointer;
- outline: none;
- ${hoverAndFocusCss()}
-
- &:disabled,
- &${selector.disabled} {
- cursor: default;
- }
-
- &${selector.disabled} {
- pointer-events: none;
- }
-
- &.primary,
- &.secondary,
- &.tertiary {
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 0 30px;
- height: 48px;
- width: 100%;
- overflow: hidden;
- font-size: 1.4rem;
- word-break: break-word;
- color: ${colors.DW_BLUE};
-
- svg {
- fill: ${colors.DW_BLUE};
- }
-
- & > * {
- letter-spacing: 0.04rem;
- font-weight: bold;
- }
-
- &:active {
- background-color: ${colors.LG_GRAY_13};
- color: ${colors.LG_WHITE};
- box-shadow: none;
-
- svg {
- fill: ${colors.LG_WHITE};
- }
- }
-
- &:disabled,
- &${selector.disabled} {
- text-decoration: line-through;
- background-color: ${colors.LG_GRAY_2};
- color: ${colors.LG_GRAY_11};
- box-shadow: none;
-
- svg {
- fill: ${colors.LG_GRAY_7};
- }
- }
- }
-
- &.primary {
- background-color: ${colors.DW_LIGHT_BLUE};
- }
-
- &.secondary {
- background-color: ${colors.LG_GRAY_3};
- }
-
- &.tertiary {
- box-shadow: inset 0px 0px 0px 1px ${colors.LG_GRAY_6};
- ${hoverAndFocusCss()}
- }
-
- ${mediaMin.mobile`
- &.primary, &.secondary, &.tertiary {
- width: fit-content;
- margin-left: auto;
- margin-right: auto;
- }
- `}
-`;
diff --git a/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/Play.jsx b/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/Play.jsx
deleted file mode 100644
index 44fb0a4..0000000
--- a/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/Play.jsx
+++ /dev/null
@@ -1,4 +0,0 @@
-import styled from 'styled-components';
-import { ReactComponent as PlayIcon } from './play.svg';
-
-export const StyledPlayIcon = styled(props => )``;
diff --git a/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/VjsPlayButton.jsx b/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/VjsPlayButton.jsx
deleted file mode 100644
index a636448..0000000
--- a/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/VjsPlayButton.jsx
+++ /dev/null
@@ -1,71 +0,0 @@
-import ReactDOM from 'react-dom';
-import styled from 'styled-components';
-import videojsDefault from 'video.js';
-import { StyledButton as PlayButton } from './Button';
-import { StyledPlayIcon as PlayIcon } from './Play';
-import { colors } from '../../../../../utils/css';
-import { useTranslation } from '../../../../../hooks/useTranslation';
-import { getPlayerType } from '../vjsComponentUtils';
-
-export const videoPlayButtonComponentName = 'vjsBigPlayButton';
-
-const vjsComponent = videojsDefault.getComponent('Component');
-
-// eslint-disable-next-line no-unused-vars
-const VideoPlayButton = ({ className, playerType, ...restProps }) => {
- const buttonTitle = useTranslation(`common.avplayer.button.play`);
-
- return (
-
-
-
- );
-};
-
-const StyledVideoPlayButton = styled(VideoPlayButton)`
- position: absolute;
- bottom: 0;
- z-index: 2;
- background-color: ${colors.DW_LIGHT_BLUE};
- padding: 15px;
-
- svg {
- fill: ${colors.LG_WHITE};
- width: 20px;
- height: 20px;
- }
-
- @media (min-width: 992px) {
- padding: 18px;
- svg {
- width: 24px;
- height: 24px;
- }
- }
-`;
-
-export class VjsBigPlayButton extends vjsComponent {
- constructor(player, options) {
- super(player, options);
- this.mount = this.mount.bind(this);
-
- player.ready(() => {
- this.mount({
- onClick: () => player.play(),
- playerType: getPlayerType({ player }),
- });
- });
-
- player.on('play', () => {
- const playButton = player.el().querySelector('.vjs-play-control');
- playButton.focus();
- this.hide();
- });
- }
-
- mount({ onClick, playerType }) {
- ReactDOM.render( , this.el());
- }
-}
-
-vjsComponent.registerComponent(videoPlayButtonComponentName, VjsBigPlayButton);
diff --git a/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/play.svg.js b/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/play.svg.js
deleted file mode 100644
index 64b84d4..0000000
--- a/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/play.svg.js
+++ /dev/null
@@ -1,32 +0,0 @@
-const __webpack_public_path__ = "https://learngerman.dw.com/";
-function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
-
-function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
-
-function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
-
-import * as React from "react";
-
-var _ref2 = /*#__PURE__*/React.createElement("path", {
- stroke: "#FFF",
- d: "M3 .467v18.999l16-9.499z"
-});
-
-function SvgPlay(_ref, svgRef) {
- var title = _ref.title,
- titleId = _ref.titleId,
- props = _objectWithoutProperties(_ref, ["title", "titleId"]);
-
- return /*#__PURE__*/React.createElement("svg", _extends({
- xmlns: "http://www.w3.org/2000/svg",
- viewBox: "0 0 20 20",
- ref: svgRef,
- "aria-labelledby": titleId
- }, props), title ? /*#__PURE__*/React.createElement("title", {
- id: titleId
- }, title) : null, _ref2);
-}
-
-var ForwardRef = /*#__PURE__*/React.forwardRef(SvgPlay);
-export default __webpack_public_path__ + "static/media/play.e4d9e1b0.svg";
-export { ForwardRef as ReactComponent };
\ No newline at end of file
diff --git a/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/vjsComponentUtils.jsx b/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/vjsComponentUtils.jsx
deleted file mode 100644
index ae991d4..0000000
--- a/sources-gen/components/MediaInput/MediaInputVideo/CustomPlayerComponents/vjsComponentUtils.jsx
+++ /dev/null
@@ -1 +0,0 @@
-export const getPlayerType = ({ player }) => (player.isAudio() ? 'audio' : 'video');
diff --git a/sources-gen/components/MediaInput/MediaInputVideo/MediaInputVideo.jsx b/sources-gen/components/MediaInput/MediaInputVideo/MediaInputVideo.jsx
deleted file mode 100644
index 262c8d1..0000000
--- a/sources-gen/components/MediaInput/MediaInputVideo/MediaInputVideo.jsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import gql from 'graphql-tag';
-import { subtitlesLabels } from '../../../utils/mappers/subtitlesLabel';
-import { useVideoPlayerEffect } from '../../../video/useVideoPlayerEffect';
-import { useMediaTracking } from '../../GoogleTagManager/hooks/useMediaTracking';
-import { gtmDataLayerFragment } from '../../GoogleTagManager';
-
-export const mediaInputVideoFragment = {
- name: 'MediaInputVideo',
- fragment({ type }) {
- return gql`fragment ${type}${this.name} on ${type} {
- videos {
- name
- contentDate
- language
- posterImageUrl
- hlsVideoSrc
- formattedDuration
- subtitles {
- trackId: targetId
- srcLanguage
- language
- subtitleUrl
- }
- ${gtmDataLayerFragment.partial()}
- }
- }
- `;
- },
-};
-
-export const MediaInputVideo = ({ data }) => {
- useVideoPlayerEffect(data.content);
- useMediaTracking(data.content.videos[0]);
- const {
- type = 'application/x-mpegURL',
- subtitles,
- posterImageUrl,
- hlsVideoSrc,
- formattedDuration,
- } = data.content.videos[0];
-
- return (
- // eslint-disable-next-line jsx-a11y/media-has-caption
-
-
- {subtitles.map(subtitle => (
-
- ))}
-
- To view this video please enable JavaScript, and consider upgrading to a web browser that{' '}
-
- supports HTML5 video
-
-
-
- );
-};
diff --git a/sources-gen/components/MediaInput/MediaInputVideo/MediaInputVideo.jsx.orig b/sources-gen/components/MediaInput/MediaInputVideo/MediaInputVideo.jsx.orig
deleted file mode 100644
index 262c8d1..0000000
--- a/sources-gen/components/MediaInput/MediaInputVideo/MediaInputVideo.jsx.orig
+++ /dev/null
@@ -1,73 +0,0 @@
-import gql from 'graphql-tag';
-import { subtitlesLabels } from '../../../utils/mappers/subtitlesLabel';
-import { useVideoPlayerEffect } from '../../../video/useVideoPlayerEffect';
-import { useMediaTracking } from '../../GoogleTagManager/hooks/useMediaTracking';
-import { gtmDataLayerFragment } from '../../GoogleTagManager';
-
-export const mediaInputVideoFragment = {
- name: 'MediaInputVideo',
- fragment({ type }) {
- return gql`fragment ${type}${this.name} on ${type} {
- videos {
- name
- contentDate
- language
- posterImageUrl
- hlsVideoSrc
- formattedDuration
- subtitles {
- trackId: targetId
- srcLanguage
- language
- subtitleUrl
- }
- ${gtmDataLayerFragment.partial()}
- }
- }
- `;
- },
-};
-
-export const MediaInputVideo = ({ data }) => {
- useVideoPlayerEffect(data.content);
- useMediaTracking(data.content.videos[0]);
- const {
- type = 'application/x-mpegURL',
- subtitles,
- posterImageUrl,
- hlsVideoSrc,
- formattedDuration,
- } = data.content.videos[0];
-
- return (
- // eslint-disable-next-line jsx-a11y/media-has-caption
-
-
- {subtitles.map(subtitle => (
-
- ))}
-
- To view this video please enable JavaScript, and consider upgrading to a web browser that{' '}
-
- supports HTML5 video
-
-
-
- );
-};
diff --git a/sources-gen/components/Modal/DeleteAccountModal/DeleteAccountModal.jsx b/sources-gen/components/Modal/DeleteAccountModal/DeleteAccountModal.jsx
deleted file mode 100644
index 3c33aab..0000000
--- a/sources-gen/components/Modal/DeleteAccountModal/DeleteAccountModal.jsx
+++ /dev/null
@@ -1,81 +0,0 @@
-import { useDispatch } from 'react-redux';
-import { useHistory, useParams } from 'react-router-dom';
-import { useForm } from 'react-hook-form';
-import { Checkbox } from '../../Checkbox/Checkbox';
-import { I18nText } from '../../I18n/I18nText';
-import { StyledStandardButton } from '../../StandardButton/StandardButton';
-import { deleteUser } from '../../../services/userService';
-import { deleteUserAccount } from '../../../state/user/userDuck';
-import { feedbackHelper } from '../../../utils/url/feedbackHelpers';
-import { useTranslation } from '../../../hooks/useTranslation';
-
-export const DeleteAccountModal = ({ onClose }) => {
- const { langCode } = useParams();
- const history = useHistory();
- const dispatch = useDispatch();
-
- const { register, handleSubmit } = useForm({
- mode: 'onSubmit',
- });
-
- const confirmDeleteLabel = useTranslation('profile.edit.modal.confirmDelete');
-
- const onSubmit = async () => {
- try {
- const response = await deleteUser();
- if (response.ok) {
- dispatch(deleteUserAccount());
- history.push(feedbackHelper.forUserDelete(langCode));
- } else {
- const responseJson = await response.json();
- history.push(feedbackHelper.getForErrorCode(responseJson, langCode));
- }
- } catch (err) {
- history.push(feedbackHelper.getForErrorCode(err, langCode));
- }
- };
-
- return (
- <>
-
-
- >
- );
-};
diff --git a/sources-gen/components/Modal/DisableScrollingStyles.jsx b/sources-gen/components/Modal/DisableScrollingStyles.jsx
deleted file mode 100644
index c37dd0b..0000000
--- a/sources-gen/components/Modal/DisableScrollingStyles.jsx
+++ /dev/null
@@ -1,8 +0,0 @@
-import { createGlobalStyle } from 'styled-components';
-
-export const DisableScrollingStyles = createGlobalStyle`
- body {
- overflow: hidden;
- padding-right: 17px;
- }
-`;
diff --git a/sources-gen/components/Modal/KnowledgeModal/Knowledge.jsx b/sources-gen/components/Modal/KnowledgeModal/Knowledge.jsx
deleted file mode 100644
index 3d5be7f..0000000
--- a/sources-gen/components/Modal/KnowledgeModal/Knowledge.jsx
+++ /dev/null
@@ -1,74 +0,0 @@
-import { useEffect, useRef } from 'react';
-import ReactDOM from 'react-dom';
-import { useToggle } from '../../../hooks/useToggle';
-import { KnowledgeModal } from './KnowledgeModal';
-
-export const Knowledge = ({ children, knowledge, isRtl }) => {
- const [isOpen, { toggleOnClick, toggleOnKeyPress }] = useToggle();
- const wrapper = useRef(null);
- const vocals = 'A, a;Ä, ä;E, e;I, i;O, o;Ö, ö;U, u;Ü, ü;Eu, eu;Au, au;ie;Ei, ei'.split(';');
- const classMap = {
- consonants: 'anlaut-modal consonants',
- vocals: 'anlaut-modal vocals',
- glossary: 'glossar-modal custom-modal',
- };
- const getClassName = () => {
- if (knowledge.knowledgeType === 'VOCABULARY') {
- return classMap.glossary;
- }
- if (vocals.includes(knowledge.shortTitle)) {
- return classMap.vocals;
- }
- return classMap.consonants;
- };
-
- const KnowledgeModalContainer = () => {
- return (
- <>
- {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
- handleClick(e)}
- onKeyPress={e => handleKeyPress(e)}
- >
- {children}
- {' '}
- {isOpen && (
- {
- toggleOnClick();
- }}
- isRtl={isRtl}
- />
- )}
- >
- );
- };
-
- useEffect(() => {
- ReactDOM.render( , wrapper.current);
- }, [isOpen]);
-
- const handleClick = e => {
- e.preventDefault();
- toggleOnClick();
- };
-
- const handleKeyPress = e => {
- e.preventDefault();
- toggleOnKeyPress(e);
- };
-
- return ;
-};
diff --git a/sources-gen/components/Modal/KnowledgeModal/KnowledgeModal.jsx b/sources-gen/components/Modal/KnowledgeModal/KnowledgeModal.jsx
deleted file mode 100644
index e0da88b..0000000
--- a/sources-gen/components/Modal/KnowledgeModal/KnowledgeModal.jsx
+++ /dev/null
@@ -1,164 +0,0 @@
-import { useRef } from 'react';
-import styled from 'styled-components';
-import classnames from 'classnames';
-import { DwPicture } from '../../DwPicture/DwPicture';
-import { RichText } from '../../RichText/RichText';
-
-const KnowledgeModalContainer = ({
- className,
- fadeIn,
- knowledgeType,
- imageId,
- imageName,
- audioFile,
- title,
- shortTitle,
- name,
- text,
- subTitle,
- onClose,
- isRtl,
-}) => {
- const audioRef = useRef();
- const closeModalRef = useRef();
- const closeBackdropRef = useRef();
- const faded = fadeIn ? 'in' : '';
- const initialSound = knowledgeType === 'INITIAL_SOUND';
-
- const playAudio = e => {
- e.preventDefault();
- audioRef.current.play();
- };
-
- const closeModal = () => {
- closeModalRef.current.classList.remove('in');
- closeBackdropRef.current.classList.remove('in');
- if (onClose) {
- onClose();
- }
- };
-
- const closeButton = (
-
- ⨯
-
- );
-
- const audioLink = linkTitle => (
- playAudio(e)}
- role="button"
- tabIndex={0}
- >
-
- {linkTitle}
-
- {/* eslint-disable-next-line jsx-a11y/media-has-caption */}
-
-
-
-
- );
-
- return (
- <>
-
-
-
- {initialSound && (
-
- {closeButton}
-
- {shortTitle}
-
-
- )}
-
- {!initialSound && (
-
- {closeButton}
- {audioLink(title)}
- {subTitle && (
-
- {subTitle}
-
- )}
-
- )}
-
- {initialSound && (
-
-
- {audioLink(name)}
-
-
- )}
- {!initialSound && (
-
- {imageId && }
-
-
- )}
-
-
-
-
- >
- );
-};
-
-export const KnowledgeModal = styled(KnowledgeModalContainer)`
- display: block;
- &.modal {
- pointer-events: none;
- }
- .modal-dialog-glossar {
- pointer-events: all;
- }
- &.modal-backdrop {
- cursor: default;
- }
- div.modal-body {
- div.richText {
- margin: 0;
- p {
- margin: 0 0 10px;
- }
- }
- }
- .audio-example {
- background-image: inherit;
- padding-left: 0px;
- padding-right: 0px;
- margin-right: 0px;
- }
-`;
diff --git a/sources-gen/components/Modal/KnowledgeModal/useKnowledgePlaceholderReplacementEffect.jsx b/sources-gen/components/Modal/KnowledgeModal/useKnowledgePlaceholderReplacementEffect.jsx
deleted file mode 100644
index 1451e67..0000000
--- a/sources-gen/components/Modal/KnowledgeModal/useKnowledgePlaceholderReplacementEffect.jsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { useTimeout } from '../../../hooks/useTimeout';
-import { replacePlaceholderMarkupWithKnowledges } from '../../../utils/replacers/knowledgeReplacer';
-import { useRtlContext } from '../../../hooks/useRtl';
-
-export const useKnowledgePlaceholderReplacementEffect = ({
- trigger,
- knowledges,
- ignore = false,
-}) => {
- const { isRtl } = useRtlContext();
- useTimeout(
- {
- callback: () => {
- if (!ignore) {
- replacePlaceholderMarkupWithKnowledges({ knowledges, isRtl });
- }
- },
- delay: 10,
- },
- [trigger],
- );
-};
diff --git a/sources-gen/components/Modal/Modal.jsx b/sources-gen/components/Modal/Modal.jsx
deleted file mode 100644
index d4b1fdf..0000000
--- a/sources-gen/components/Modal/Modal.jsx
+++ /dev/null
@@ -1,160 +0,0 @@
-import styled from 'styled-components';
-import { StyledStandardButton as StandardButton } from '../StandardButton/StandardButton';
-import { colors, resolutions } from '../../utils/css';
-import { I18nText } from '../I18n/I18nText';
-import { useRtlContext } from '../../hooks/useRtl';
-
-export const Modal = ({
- className,
- fadeIn,
- descriptionKey,
- leftButtonKey,
- rightButtonKey,
- onConfirmClicked,
- onCancelClicked,
-}) => {
- const { isRtl } = useRtlContext();
-
- const faded = fadeIn ? 'in' : '';
- const classNameString = `${className} fade ${faded}`;
- return (
-
- );
-};
-
-export const StyledModal = styled(Modal)`
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 10040;
-
- .modal-background {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background: ${colors.LG_BLACK};
- opacity: 0.5;
- font-family: Helvetica, Arial, sans-serif;
- font-weight: 400;
- font-size: 15px;
- }
- .modal-dialogue {
- position: relative;
- background-color: ${colors.LG_WHITE};
- width: 900px;
- margin: 30px auto;
-
- .modal-content {
- position: relative;
- background-color: ${colors.LG_WHITE};
- background-clip: padding-box;
- border-radius: 0;
- outline: 0;
- box-shadow: 0 3px 9px ${colors.LG_TRANSPARENT_BLACK_50};
- border: 1px solid ${colors.LG_TRANSPARENT_BLACK_20};
-
- .modal-body {
- position: relative;
- padding: 15px;
- font-size: 15px;
-
- p {
- margin: 0 0 10px;
- }
- }
- }
-
- .modal-footer {
- padding: 35px 10px;
- text-align: right;
- border-top: 1px solid ${colors.LG_GRAY_4};
- display: flex;
- flex-flow: row;
- justify-content: space-evenly;
-
- button {
- position: relative;
- margin: 0 7px;
- width: 100%;
- }
- }
- }
-
- &.fade {
- opacity: 0;
- -webkit-transition: opacity 0.15s linear;
- -o-transition: opacity 0.15s linear;
- transition: opacity 0.15s linear;
- }
-
- &.fade.in {
- opacity: 1;
- }
-
- &.rtl {
- direction: rtl;
- }
-
- @media (max-width: ${resolutions.max.tablet}px) {
- .modal-dialogue {
- width: 600px;
- .modal-footer {
- flex-flow: column;
- button {
- margin: 15px 0;
- }
- }
- }
- }
-
- @media (max-width: ${resolutions.max.mobile}px) {
- .modal-dialogue {
- width: auto;
- margin: 10px;
- .modal-footer {
- flex-flow: column;
- button {
- margin: 15px 0;
- }
- }
- }
- }
-`;
-
-export const RightButton = styled(StandardButton)`
- background: ${colors.LG_WHITE};
- color: ${colors.LG_BLUE_1};
- border: 1px solid ${colors.LG_BLUE_1};
- box-sizing: border-box;
-
- :hover {
- border-color: ${colors.LG_BLACK};
- }
-`;
-
-export const LeftButton = StandardButton;
diff --git a/sources-gen/components/Modal/ModalIntegration.jsx b/sources-gen/components/Modal/ModalIntegration.jsx
deleted file mode 100644
index 18b6864..0000000
--- a/sources-gen/components/Modal/ModalIntegration.jsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import ReactDOM from 'react-dom';
-import { DisableScrollingStyles } from './DisableScrollingStyles';
-
-export const ModalIntegration = ({ isOpen, children }) => {
- if (!isOpen) return null;
- const componentToCreate = (
- <>
-
- {children}
- >
- );
- return ReactDOM.createPortal(componentToCreate, document.body);
-};
diff --git a/sources-gen/components/Modal/ResetModal.jsx b/sources-gen/components/Modal/ResetModal.jsx
deleted file mode 100644
index 2205b5d..0000000
--- a/sources-gen/components/Modal/ResetModal.jsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { StyledModal as Modal } from './Modal';
-
-export const ResetModal = ({ fadeIn, onConfirmClicked, onCancelClicked }) => {
- const descriptionKey = 'lesson.modal.confirm';
- const leftButtonKey = 'lesson.modal.reset';
- const rightButtonKey = 'lesson.modal.cancel';
- return (
-
- );
-};
diff --git a/sources-gen/components/NavMenu/LanguageSelectionButton/LanguageSelectionButton.jsx b/sources-gen/components/NavMenu/LanguageSelectionButton/LanguageSelectionButton.jsx
deleted file mode 100644
index 9fa9a7c..0000000
--- a/sources-gen/components/NavMenu/LanguageSelectionButton/LanguageSelectionButton.jsx
+++ /dev/null
@@ -1,103 +0,0 @@
-import classnames from 'classnames';
-import styled from 'styled-components';
-import { ReactComponent as TickImg } from '../../../assets/svg/tick.svg';
-import { getDashboardUrl } from '../../../utils/url/urlFactory';
-import { useI18nContext } from '../../../context/I18nContext';
-import { useLocalStorage } from '../../../hooks/useLocalStorage';
-import { LANG_CODES } from '../../../utils/mappers/langMapper';
-import {
- CHINESE_SIMP_TRANSLATION_KEY,
- CHINESE_TRAD_TRANSLATION_KEY,
-} from '../../../constants/menuLanguageCodes';
-import {
- TRADITIONAL_CHIN_LOCAL_STORAGE_KEY,
- URL_GET_PARAM_NAME,
- URL_GET_PARAM_SIMPLIFIED,
- URL_GET_PARAM_TRADITIONAL,
-} from '../../../hooks/useChineseSimpleTraditionalSwitch';
-import { colors, resolutions } from '../../../utils/css';
-
-const isLanguageSelected = ({ languageTranslationKey, currentLanguage, isTraditionalChin }) => {
- const isCurrentLanguageChinese = currentLanguage === LANG_CODES.CHINESE;
- if (isCurrentLanguageChinese) {
- return (
- (isTraditionalChin && languageTranslationKey === CHINESE_TRAD_TRANSLATION_KEY) ||
- (!isTraditionalChin && languageTranslationKey === CHINESE_SIMP_TRANSLATION_KEY)
- );
- }
- return languageTranslationKey === currentLanguage;
-};
-
-const getDashBoardUrlForLanguage = ({ languageTranslationKey, language }) => {
- const dashboardBaseUrl = getDashboardUrl(language);
- if (languageTranslationKey === CHINESE_SIMP_TRANSLATION_KEY) {
- return `${dashboardBaseUrl}?${URL_GET_PARAM_NAME}=${URL_GET_PARAM_SIMPLIFIED}`;
- }
- if (languageTranslationKey === CHINESE_TRAD_TRANSLATION_KEY) {
- return `${dashboardBaseUrl}?${URL_GET_PARAM_NAME}=${URL_GET_PARAM_TRADITIONAL}`;
- }
- return dashboardBaseUrl;
-};
-
-export const LanguageSelectionButton = ({
- language,
- translationKey: languageTranslationKey,
- langCode: currentLanguage,
-}) => {
- const { i18n } = useI18nContext();
- const [isTraditionalChin] = useLocalStorage(TRADITIONAL_CHIN_LOCAL_STORAGE_KEY);
-
- return (
-
-
-
- {`${i18n.t(`header.menu.language.${languageTranslationKey}`)} - ${i18n.t(
- `header.menu.language.native.${languageTranslationKey}`,
- )}`}
-
-
-
-
-
-
-
-
- );
-};
-
-export const StyledLanguageSelectionButton = styled('li')`
- border-bottom: 1px solid ${colors.LG_BLUE_4};
- display: block;
- float: left;
- width: 100%;
-
- &:first-child {
- border-top: 1px solid ${colors.LG_BLUE_4};
- }
-
- span {
- padding: 0 10px;
- }
-
- .lang-nav {
- display: inline-block;
- padding: 20px 25px;
- width: 100%;
-
- @media (min-width: ${resolutions.min.tablet}px) {
- padding: 20px;
- }
- }
-`;
diff --git a/sources-gen/components/NavMenu/NavMenu.jsx b/sources-gen/components/NavMenu/NavMenu.jsx
deleted file mode 100644
index 8a676f6..0000000
--- a/sources-gen/components/NavMenu/NavMenu.jsx
+++ /dev/null
@@ -1,273 +0,0 @@
-/* eslint-disable jsx-a11y/anchor-is-valid,jsx-a11y/no-static-element-interactions */
-import { Link } from 'react-router-dom';
-import { useDispatch, useSelector } from 'react-redux';
-import { useParams } from 'react-router';
-import styled from 'styled-components';
-import { colors, resolutions, clearfix } from '../../utils/css';
-import { ReactComponent as IconUserNavi } from '../../assets/svg/icon-user-navi.svg';
-import { ReactComponent as IconLanguageWorldW } from '../../assets/svg/icon-language-world-w.svg';
-import { I18nText } from '../I18n/I18nText';
-import { LanguageSelectionButton } from './LanguageSelectionButton/LanguageSelectionButton';
-import { MENU_LANGUAGES } from '../../constants/menuLanguageCodes';
-import {
- getDashboardUrl,
- getGrammarUrl,
- getHelpUrl,
- getLoginPage,
- getUserProfileUrl,
- getVocabularyPageUrl,
- getVocabularyTrainerStartPage,
-} from '../../utils/url/urlFactory';
-import { logOutUser } from '../../state/user/userDuck';
-import { userSelector } from '../../state/user/userSelectors';
-import { useGlobalsContext } from '../../context/GlobalsContext';
-
-export const NavMenu = ({
- isNavMenuOpen,
- toggleIsNavMenuOpen,
- isLanguageSubMenuOpen,
- setIsLanguageSubMenuOpen,
- className,
-}) => {
- const { origin } = useGlobalsContext().window.location;
- const { langCode } = useParams();
- const { isLoggedIn } = useSelector(userSelector);
- const isLoggedInClass = !isLoggedIn ? 'hidden' : undefined;
- const dispatch = useDispatch();
-
- const handleLogoutClicked = e => {
- e.preventDefault();
- dispatch(logOutUser());
- };
-
- return (
-
- );
-};
-
-export const StyledNavMenu = styled(NavMenu)`
- background-color: ${colors.LG_BLUE_1};
- border-top: 1px solid ${colors.LG_BLUE_4};
- box-shadow: ${props =>
- props.isNavMenuOpen ? `0 9px 10px ${colors.LG_TRANSPARENT_BLACK_40}` : 'hidden'};
- display: block;
- visibility: ${props => (props.isNavMenuOpen ? 'visible' : 'hidden')};
- overflow: hidden;
- position: relative;
- right: 0;
- transition: all 0.3s linear;
- z-index: 100;
-
- @media (min-width: ${resolutions.min.tablet}px) {
- top: -5px;
- }
- @media (min-width: ${resolutions.min.desktop}px) {
- position: absolute;
- /*! @noflip */
- right: 0;
- top: 85px;
- width: 400px;
- }
-
- .course-nav {
- display: inline-block;
- padding: 20px;
- width: 100%;
- }
-
- #languageMenu {
- padding: 0;
- &:hover {
- background: ${colors.LG_BLACK};
- }
- }
-`;
-
-export const StyledNavigationList = styled('ul')`
- box-shadow: 1px 10px 20px 0 ${colors.LG_TRANSPARENT_BLACK_25};
- float: left;
- margin: 0;
- padding: 0;
- text-align: left;
- width: 100%;
-
- ${clearfix}
-
- > li {
- border-bottom: 1px solid ${colors.LG_BLUE_4};
- display: block;
- padding: 0;
- width: 100%;
- }
-
- a {
- background-color: ${colors.LG_BLUE_1};
- color: ${colors.LG_WHITE};
- display: block;
- font-size: 18px;
- font-weight: 700;
- line-height: 23px;
- padding: 20px;
- text-decoration: none;
- text-transform: uppercase;
-
- &:hover,
- &:active {
- background-color: ${colors.LG_BLACK};
- }
-
- @media (min-width: ${resolutions.min.tablet}px) {
- font-size: 22px;
- line-height: 43px;
- }
-
- @media (min-width: ${resolutions.min.desktop}px) {
- font-size: 18px;
- line-height: 23px;
- }
- }
-
- #navbar-lang {
- padding: 0;
-
- ul {
- margin-top: 0;
- padding-left: 0;
- }
- }
-
- .collapse.in {
- overflow: hidden;
- display: block;
- }
-`;
-
-export const StyledNavMenuIcon = styled('span')`
- margin-left: 10px;
- margin-top: -1px;
- opacity: 0.7;
- position: absolute;
-`;
diff --git a/sources-gen/components/Page/PageContainer.jsx b/sources-gen/components/Page/PageContainer.jsx
deleted file mode 100644
index 70ef666..0000000
--- a/sources-gen/components/Page/PageContainer.jsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import { StyledHeader as Header } from '../Header/Header';
-import { StyledFooter as Footer } from '../Footer/Footer';
-import { I18nConfigLoader } from '../I18n/I18nConfigLoader';
-import { GdprLayer } from '../GdprLayer/GdprLayer';
-import { PageMetaData } from './PageMetaData';
-import { MainPage } from '../../pages/MainPage';
-import { GtmScriptWithDataLayer } from '../GoogleTagManager';
-import { GTM_NO_CONTENT_PAGE_IDS } from '../../constants/pageTypes';
-
-export const PageContainer = ({ children }) => {
- return (
-
-
- {data => (
- <>
-
- {children}
-
-
- >
- )}
-
-
- );
-};
-
-export const withPageContainerAndMetadata = ({
- component: TargetComponent,
- pageType,
- addDescriptionAndKeywordsMeta,
- useDescriptionTranslation,
-}) => (
-
-
-
-
-
-);
diff --git a/sources-gen/components/Page/PageLayout.jsx b/sources-gen/components/Page/PageLayout.jsx
deleted file mode 100644
index 91af83a..0000000
--- a/sources-gen/components/Page/PageLayout.jsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import styled from 'styled-components';
-import { colors, resolutions } from '../../utils/css';
-
-const PageLayout = ({ className, children }) => (
-
-);
-
-export const StyledPageLayout = styled(PageLayout)`
- background: ${colors.LG_WHITE};
- display: grid;
- margin: 0 auto;
- overflow-x: hidden !important;
- padding: 0;
- width: 100%;
-
- @media (min-width: ${resolutions.min.desktop}px) {
- margin: 40px auto;
- min-height: 600px;
- padding: 0 20px;
- width: 1240px;
-
- .content-container {
- width: 1200px;
- }
- }
-`;
diff --git a/sources-gen/components/Page/PageMetaData.jsx b/sources-gen/components/Page/PageMetaData.jsx
deleted file mode 100644
index f47e264..0000000
--- a/sources-gen/components/Page/PageMetaData.jsx
+++ /dev/null
@@ -1,78 +0,0 @@
-import { Helmet } from 'react-helmet-async';
-import gql from 'graphql-tag';
-import { useMetadata } from '../../hooks/useMetadata';
-import { useMetaTitle } from '../../hooks/useMetaTitle';
-import { useMetaDescription } from '../../hooks/useMetaDescription';
-import { useMetaKeywords } from '../../hooks/useMetaKeywords';
-import { mainContentFullUrl } from '../../utils/url/url';
-import { useTranslation } from '../../hooks/useTranslation';
-
-export const pageHeaderMetadataFragment = {
- name: 'PageHeaderMetadata',
- fragment({ type }) {
- return gql`fragment ${this.name} on ${type} {
- iso639Lang
- }
- `;
- },
-};
-
-export const metaDataFragment = {
- name: 'MetaData',
- fragment({ type }) {
- return gql`fragment ${this.name} on ${type} {
- name
- keywordStrings
- description
- teaser
- }
- `;
- },
-};
-
-export const PageMetaData = ({
- pageType,
- content = {},
- parentContentName,
- translationFirst = false,
- useOnlyCmsKeywords = false,
- useTeaserAsDescription = false,
- useDescriptionTranslation = false,
- addKeywordsAndDescription = true,
-}) => {
- const { name: contentName, keywordStrings = [], description, teaser } = content;
- const siteName = useTranslation('metadata.siteName');
- const iso639Lang = useMetadata();
- const title = useMetaTitle({ pageType, translationFirst, contentName, parentContentName });
- const descriptionMeta = useMetaDescription({
- pageType,
- contentName,
- teaser,
- description,
- useTeaserAsDescription,
- useDescriptionTranslation,
- });
- const keywordsString = useMetaKeywords({ pageType, useOnlyCmsKeywords, keywordStrings });
- const contentFullUrl = mainContentFullUrl();
- const showDescription = addKeywordsAndDescription && descriptionMeta;
-
- return (
-
-
- {title}
-
- {showDescription && }
- {showDescription && }
- {addKeywordsAndDescription && keywordsString && (
-
- )}
-
-
-
-
-
- );
-};
diff --git a/sources-gen/components/Picture/Picture.jsx b/sources-gen/components/Picture/Picture.jsx
deleted file mode 100644
index 263ab2e..0000000
--- a/sources-gen/components/Picture/Picture.jsx
+++ /dev/null
@@ -1,8 +0,0 @@
-export const Picture = ({ sources, fallbackUrl, alt, className, aspectRatio }) => (
-
- {sources.map((sourceAttributes, index) => (
-
- ))}
-
-
-);
diff --git a/sources-gen/components/PlacementResult/PlacementAndFinalTestResult.jsx b/sources-gen/components/PlacementResult/PlacementAndFinalTestResult.jsx
deleted file mode 100644
index 61f61bb..0000000
--- a/sources-gen/components/PlacementResult/PlacementAndFinalTestResult.jsx
+++ /dev/null
@@ -1,225 +0,0 @@
-/* eslint-disable react-hooks/exhaustive-deps */
-import gql from 'graphql-tag';
-import { useParams } from 'react-router';
-import { useDispatch, useSelector } from 'react-redux';
-import { Link, useHistory } from 'react-router-dom';
-import { useEffect } from 'react';
-import { ContentHeadline } from '../ContentContainer/ContentHeadline/ContentHeadline';
-import { ContentSection } from '../ContentContainer/ContentSection/ContentSection';
-import { I18nText } from '../I18n/I18nText';
-import { LessonMenu } from '../Lesson/LessonMenu/LessonMenu';
-import { Summary } from '../Lesson/LessonExercise/LessonExerciseResult/Summary';
-import { calculatePercentage } from '../../utils/commons';
-import { findLessonLearnProgressSelector } from '../../state/progress/learnProgressSelectors';
-import { getContentUrl, getLessonExerciseUrl } from '../../utils/url/urlFactory';
-import { getDWStructureUrl, normalizeUrlName } from '../../utils/url/url';
-import { isPlacementTestCourse } from '../../utils/mappers/placementTestCourseIds';
-import { learningLevelMapper } from '../../utils/learningLevelUtils';
-import { MARKS } from '../../constants/marks';
-import { userSelector } from '../../state/user/userSelectors';
-import { handleCertificateGeneration } from '../../utils/certificateUtils';
-import { readLessonProgress } from '../../state/progress/learnProgressDuck';
-import { filterLessonExerciseOverviewItems, isFinalTestLesson } from '../../utils/lessonUtils';
-import { PAGE_TYPES } from '../../constants/pageTypes';
-import { PageMetaData } from '../Page/PageMetaData';
-import { GtmScriptWithDataLayer } from '../GoogleTagManager/GtmScriptWithDataLayer';
-
-export const placementResultFragment = gql`
- fragment PlacementResult on Course {
- id
- name
- language
- dkLearningLevel
- }
-`;
-
-const getFirstCourseOfEachLevel = allDkCourses => {
- const result = [];
- Object.keys(learningLevelMapper).forEach(learningLevel => {
- const targetCourse = allDkCourses.find(course => course.dkLearningLevel === +learningLevel);
- if (targetCourse) {
- // eslint-disable-next-line fp/no-mutating-methods
- result.push(targetCourse);
- }
- });
- return result;
-};
-
-export const PlacementAndFinalTestResult = ({ data }) => {
- const { lesson, course, dkCourses: allDkCourses } = data;
- const { dkLearningLevel: courseDkLearningLevel } = course;
- const dkCourses = getFirstCourseOfEachLevel(allDkCourses);
- const {
- dwLinks,
- id: lessonId,
- name,
- overviewParts,
- dkLearningLevel: lessonDkLearningLevel,
- } = lesson;
- const { id: courseId, name: courseName, contentLinks: lessonContentLinksFromCourse } = course;
- const dispatch = useDispatch();
-
- useEffect(() => {
- dispatch(readLessonProgress(lessonId));
- }, []);
-
- const history = useHistory();
- const { isLoggedIn } = useSelector(userSelector);
- const { langCode } = useParams();
-
- const lessonProgress = useSelector(findLessonLearnProgressSelector(lessonId));
- const { maxPointsForAllExercises = 0, resultPoints = 0, finalTest } = lessonProgress || {};
-
- const isFromPlacementCourse = isPlacementTestCourse(courseId);
- const isFinalTest = isFinalTestLesson({
- lessonContentLinksFromCourse,
- currentLessonId: lessonId,
- });
-
- const dkLearningLevel = isFinalTest ? courseDkLearningLevel : lessonDkLearningLevel;
-
- const level = learningLevelMapper[dkLearningLevel] || 'A1';
- const percentile = calculatePercentage(resultPoints, maxPointsForAllExercises);
-
- const calculateCourseNote = () => {
- if (percentile >= MARKS.GOOD) return 'veryGood';
- if (percentile >= MARKS.MEDIUM) return 'good';
- if (percentile >= MARKS.BAD) return 'bad';
- return 'veryBad';
- };
-
- const nextLevelRecommendation = () => {
- if (percentile <= MARKS.MEDIUM) return level;
-
- const levelValues = Object.values(learningLevelMapper);
- const currentIndex = levelValues.indexOf(level);
- const nextLevel = levelValues[currentIndex + 1];
-
- return nextLevel || level;
- };
-
- const nextLevel = nextLevelRecommendation();
-
- const getRecommendedCourseURL = () => {
- const nextCourse = dkCourses.find(
- dkCourse => learningLevelMapper[dkCourse.dkLearningLevel] === nextLevel,
- );
-
- return nextCourse ? getContentUrl(nextCourse) : null;
- };
-
- const handleOnCertificateClick = async () => {
- await handleCertificateGeneration({ id: lessonId, langCode, history });
- };
-
- const nextCourseUrl = getRecommendedCourseURL();
- const showCertificateButton = isLoggedIn && finalTest && percentile >= MARKS.MEDIUM;
-
- const lessonExerciseOverviewItems = filterLessonExerciseOverviewItems(overviewParts);
- const firstExerciseLink = getLessonExerciseUrl(
- langCode,
- lessonId,
- normalizeUrlName(lessonExerciseOverviewItems[0].target.name),
- lessonExerciseOverviewItems[0].targetId,
- );
-
- const PageMetaDataComponent = () => {
- if (isFinalTest) {
- return (
-
- );
- }
- if (isFromPlacementCourse) {
- return ;
- }
- return ;
- };
-
- return (
- <>
-
-
-
-
-
-
-
-
-
-
-
- {showCertificateButton && (
-
- )}
- {nextCourseUrl && (
- <>
-
-
- >
- )}
- {dwLinks && dwLinks.length > 0 && (
-
- {dwLinks.map(link => {
- if (!link.name.includes(nextLevel)) return '';
- return (
-
- );
- })}
-
- )}
-
-
-
-
- >
- );
-};
diff --git a/sources-gen/components/PlacementTest/PlacementTest.jsx b/sources-gen/components/PlacementTest/PlacementTest.jsx
deleted file mode 100644
index e66da19..0000000
--- a/sources-gen/components/PlacementTest/PlacementTest.jsx
+++ /dev/null
@@ -1,136 +0,0 @@
-/* eslint-disable jsx-a11y/anchor-is-valid,jsx-a11y/aria-role */
-import { useSelector } from 'react-redux';
-import { Link } from 'react-router-dom';
-import { createGlobalStyle } from 'styled-components';
-import { DwPicture } from '../DwPicture/DwPicture';
-import { I18nText } from '../I18n/I18nText';
-import { getContentUrl } from '../../utils/url/urlFactory';
-import { learningLevelMapper } from '../../utils/learningLevelUtils';
-import { findLessonLearnProgressSelector } from '../../state/progress/learnProgressSelectors';
-import { LearnProgressIcon } from '../LearnProgressIcon/LearnProgressIcon';
-import { progressIconColors } from '../ProgressIcon/progressIconColors';
-
-export const PlacementTile = ({ lesson, index }) => {
- const { dkLearningLevel, id, name, subTitle } = lesson;
- const lessonProgress = useSelector(findLessonLearnProgressSelector(id));
- const level = learningLevelMapper[dkLearningLevel];
-
- return (
-
-
-
-
-
-
{level}
-
-
-
-
- );
-};
-
-const PlacementTestGlobalStyles = createGlobalStyle`
- div.allcourses .main-course {
- float: left;
- text-align: left
- }
-
- div.allcourses .main-course h2 {
- float: left;
- margin: 0 6px 0 0
- }
-
- @media (max-width: 767px) {
- div.allcourses .main-course h2 {
- margin: 5px 6px 0 10px
- }
- }
-
- div.allcourses .main-course p.course-title {
- margin: 6px 0 0
- }
-
- div.allcourses .main-course span.progress-icon {
- float: right;
- margin-top: 20px
- }
-
- div.allcourses .main-course span.progress-icon.half {
- margin-left: 8px
- }
-
- @media (min-width: 768px) {
- div.allcourses .main-course p {
- clear: left
- }
-
- div.allcourses .main-course p.course-title {
- margin: 32px 7px 0 16px
- }
- }
-
- @media (min-width: 992px) {
- div.allcourses .main-course span.progress-icon.half {
- margin-left: 10px
- }
- }
-
- @media (max-width: 767px) {
- div.allcourses .main-course[class*=assess] {
- height: 180px
- }
-
- div.allcourses .main-course[class*=assess] span.progress-icon {
- margin-top: 5px
- }
-
- div.allcourses .main-course[class*=assess] h2 {
- font-size: 36px;
- line-height: 40px;
- display: inline;
- float: none;
- width: auto;
- margin: 0
- }
-
- div.allcourses .main-course[class*=assess] p {
- max-width: 100%;
- max-height: 100%;
- overflow: visible;
- opacity: 1;
- margin: 0
- }
- }
-`;
-
-export const PlacementTest = ({ data }) => {
- const { name, subTitle, mainContentImageLink, lessons } = data.content;
- return (
-
-
-
-
-
-
- {lessons.map((lesson, index) => (
-
- ))}
-
-
-
-
-
-
-
- );
-};
diff --git a/sources-gen/components/ProgressIcon/CertificateIcon.jsx b/sources-gen/components/ProgressIcon/CertificateIcon.jsx
deleted file mode 100644
index 7840485..0000000
--- a/sources-gen/components/ProgressIcon/CertificateIcon.jsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import styled from 'styled-components';
-import { useHistory } from 'react-router-dom';
-import { useParams } from 'react-router';
-import { useTranslation } from '../../hooks/useTranslation';
-import { handleCertificateGeneration } from '../../utils/certificateUtils';
-import CertificateGray from '../../assets/svg/icon-course-cert-gray.svg';
-
-export const CertificateIcon = ({ className, id }) => {
- const history = useHistory();
- const { langCode } = useParams();
- const title = useTranslation('common.progress.cert');
-
- const handleOnCertificateClick = async () => {
- if (id) {
- await handleCertificateGeneration({ id, langCode, history });
- }
- };
-
- return (
-
-
-
- );
-};
-
-export const StyledCertificateIcon = styled(CertificateIcon)`
- width: 16px;
- height: 24px;
- cursor: pointer;
-`;
diff --git a/sources-gen/components/ProgressIcon/ProgressIcon.jsx b/sources-gen/components/ProgressIcon/ProgressIcon.jsx
deleted file mode 100644
index e7f701a..0000000
--- a/sources-gen/components/ProgressIcon/ProgressIcon.jsx
+++ /dev/null
@@ -1,88 +0,0 @@
-import styled from 'styled-components';
-import classnames from 'classnames';
-import { colors } from '../../utils/css';
-import { progressIconColors } from './progressIconColors';
-import { useTranslation } from '../../hooks/useTranslation';
-
-export const progressState = Object.freeze({
- EMPTY: 'empty',
- HALF: 'half',
- FULL: 'full',
-});
-
-const translationKeyPrefix = 'common.progress';
-
-const getTitleTranslationKey = progress => {
- switch (progress) {
- case progressState.EMPTY:
- return `${translationKeyPrefix}.none`;
- case progressState.HALF:
- return `${translationKeyPrefix}.half`;
- case progressState.FULL:
- return `${translationKeyPrefix}.full`;
- default:
- return `${translationKeyPrefix}.none`;
- }
-};
-
-const ProgressIcon = ({ className, progress, color = progressIconColors.GRAY }) => {
- const title = useTranslation(getTitleTranslationKey(progress));
-
- return (
-
- );
-};
-
-export const StyledProgressIcon = styled(ProgressIcon)`
- width: 16px;
- height: 16px;
- margin: 0;
- text-align: right;
-
- div {
- margin: 0;
- }
-
- .background.white {
- border: 2px solid ${colors.LG_WHITE};
- }
-
- .background.gray {
- border: 2px solid ${colors.LG_GRAY_2};
- }
-
- .background {
- height: 100%;
- width: 100%;
- border-radius: 50%;
- box-sizing: border-box;
-
- .icon {
- height: 100%;
- }
-
- .icon.white {
- background: ${colors.LG_WHITE};
- }
-
- .icon.gray {
- background: ${colors.LG_GRAY_2};
- }
-
- .icon.full {
- width: 100%;
- }
-
- .icon.half {
- width: 50%;
- }
-
- .icon.empty {
- width: 0;
- }
- }
-`;
diff --git a/sources-gen/components/ProgressIcon/ProgressIconStar.jsx b/sources-gen/components/ProgressIcon/ProgressIconStar.jsx
deleted file mode 100644
index d6b8e57..0000000
--- a/sources-gen/components/ProgressIcon/ProgressIconStar.jsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import styled from 'styled-components';
-import StarWhite from '../../assets/svg/star-white.svg';
-import StarGrey from '../../assets/svg/star-gray.svg';
-import { progressIconColors } from './progressIconColors';
-import { useTranslation } from '../../hooks/useTranslation';
-
-const starsMapping = {
- [progressIconColors.GRAY]: StarGrey,
- [progressIconColors.WHITE]: StarWhite,
-};
-
-export const ProgressIconStar = ({ className, color }) => {
- const title = useTranslation('common.progress.good');
-
- return (
-
- );
-};
-
-export const StyledProgressIconStar = styled(ProgressIconStar)`
- width: 16px;
- height: 16px;
-`;
diff --git a/sources-gen/components/ProgressIcon/progressIconColors.jsx b/sources-gen/components/ProgressIcon/progressIconColors.jsx
deleted file mode 100644
index 652b77a..0000000
--- a/sources-gen/components/ProgressIcon/progressIconColors.jsx
+++ /dev/null
@@ -1,4 +0,0 @@
-export const progressIconColors = {
- GRAY: 'gray',
- WHITE: 'white',
-};
diff --git a/sources-gen/components/ReCaptcha/ReCaptcha.jsx b/sources-gen/components/ReCaptcha/ReCaptcha.jsx
deleted file mode 100644
index 6fa3baa..0000000
--- a/sources-gen/components/ReCaptcha/ReCaptcha.jsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import ReCAPTCHA from 'react-google-recaptcha';
-import config from '../../config';
-
-export const ReCaptcha = ({ languageCode, onSuccess, onExpired }) => {
- const checkForReCaptchaToken = token => {
- if (token) {
- onSuccess(token);
- }
- };
-
- return (
-
- );
-};
diff --git a/sources-gen/components/RestrictedRoute/RestrictedRoute.jsx b/sources-gen/components/RestrictedRoute/RestrictedRoute.jsx
deleted file mode 100644
index 3fbbc5f..0000000
--- a/sources-gen/components/RestrictedRoute/RestrictedRoute.jsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import { useSelector } from 'react-redux';
-import { Redirect, Route } from 'react-router-dom';
-import { getFeedbackUrl } from '../../utils/url/urlFactory';
-import { userSelector } from '../../state/user/userSelectors';
-
-export const RestrictedRoute = ({ path, component, render, feedbackType }) => {
- const { isLoggedIn } = useSelector(userSelector);
- const TargetComponent = component;
-
- return (
- {
- // eslint-disable-next-line no-nested-ternary
- return isLoggedIn ? (
- TargetComponent ? (
-
- ) : (
- render()
- )
- ) : (
-
- );
- }}
- />
- );
-};
diff --git a/sources-gen/components/RichText/RichText.jsx b/sources-gen/components/RichText/RichText.jsx
deleted file mode 100644
index e26652c..0000000
--- a/sources-gen/components/RichText/RichText.jsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import classnames from 'classnames';
-import { createGlobalStyle } from 'styled-components';
-import { Text } from '../Text/Text';
-
-const RichtextGlobalStyles = createGlobalStyle`
- /* @noflip */
- .richtext-content-container > span > p[dir=ltr] {
- text-align: left;
- }
-`;
-
-export const RichText = ({ content, isContainer = true, className }) => (
-
-
-
-
-);
diff --git a/sources-gen/components/Select/Select.jsx b/sources-gen/components/Select/Select.jsx
deleted file mode 100644
index f258e4f..0000000
--- a/sources-gen/components/Select/Select.jsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { hasErrorClassAssigner } from '../../utils/errorClassAssigner';
-import { getTranslatedValidationMessage } from '../../utils/validation/validationMessages';
-import { useI18nContext } from '../../context/I18nContext';
-
-export const Select = ({
- name,
- defaultOptionKey,
- options,
- validationError,
- register,
- ...restProps
-}) => {
- const { i18n } = useI18nContext();
-
- return (
-
-
- {i18n.t(defaultOptionKey)}
- {options &&
- options.map(option => {
- const { key, name: optionName, value, ariaKey } = option;
- return (
-
- {key ? i18n.t(key) : optionName}
-
- );
- })}
-
- {validationError && (
-
- {getTranslatedValidationMessage({
- name,
- validationErrorTranslationKey: defaultOptionKey,
- validationType: validationError.type,
- t: i18n.t,
- })}
-
- )}
-
- );
-};
diff --git a/sources-gen/components/SolveCheckButton/ButtonTemplate.jsx b/sources-gen/components/SolveCheckButton/ButtonTemplate.jsx
deleted file mode 100644
index a0a46cf..0000000
--- a/sources-gen/components/SolveCheckButton/ButtonTemplate.jsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import styled from 'styled-components';
-import { colors } from '../../utils/css';
-import { Text } from '../Text/Text';
-
-// eslint-disable-next-line no-unused-vars
-const ButtonTemplate = ({ className, btnClass, children, disabled, fullWidth, ...restProps }) => (
-
-
- {children}
-
-
-);
-export const StyledButtonTemplate = styled(ButtonTemplate)`
- width: ${props => (props.fullWidth ? '100%' : '40%')};
-
- button {
- border-radius: 25px;
- width: 100%;
- height: 38px;
- background: ${colors.LG_WHITE};
- color: ${colors.LG_BLUE_1};
- border: 1px solid ${colors.LG_BLUE_1};
- transition: 0.2s;
- outline: none;
- }
-`;
diff --git a/sources-gen/components/SolveCheckButton/CheckButton.jsx b/sources-gen/components/SolveCheckButton/CheckButton.jsx
deleted file mode 100644
index c199ab4..0000000
--- a/sources-gen/components/SolveCheckButton/CheckButton.jsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import styled from 'styled-components';
-import { StyledButtonTemplate } from './ButtonTemplate';
-import { colors } from '../../utils/css';
-
-export const CheckButton = ({ className, handleClick, isDisabled, children }) => (
-
- {children}
-
-);
-
-export const StyledCheckButton = styled(CheckButton)`
- .check-button-blue {
- &:hover {
- color: ${colors.LG_WHITE};
- background: ${colors.LG_BLUE_1};
- }
- }
-
- .check-button-gray {
- background: ${colors.LG_WHITE};
- color: ${colors.LG_GRAY_1};
- border-color: ${colors.LG_GRAY_1};
- opacity: 0.65;
- }
-`;
diff --git a/sources-gen/components/SolveCheckButton/SolveButton.jsx b/sources-gen/components/SolveCheckButton/SolveButton.jsx
deleted file mode 100644
index a2ba852..0000000
--- a/sources-gen/components/SolveCheckButton/SolveButton.jsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import styled from 'styled-components';
-import { StyledButtonTemplate } from './ButtonTemplate';
-import { colors } from '../../utils/css';
-
-export const SolveButton = ({ className, isDisabled, handleClick, fullWidth, children }) => (
-
- {children}
-
-);
-
-const grayActiveFocus = `
- background: ${colors.LG_WHITE};
- color: ${colors.LG_GRAY_1};
- border: 1px solid ${colors.LG_GRAY_1};
- opacity: 0.65;
-`;
-
-export const StyledSolveButton = styled(SolveButton)`
- .solve-button-gray {
- ${grayActiveFocus}
- }
-
- button.solve-button-blue {
- &:hover {
- background: ${props => (props.fullWidth ? colors.DW_LIGHT_BLUE : colors.LG_GRAY_10)};
- color: ${colors.LG_WHITE};
- border: 1px solid ${props => (props.fullWidth ? colors.DW_LIGHT_BLUE : colors.LG_GRAY_1)};
- }
-
- &:active,
- &:focus {
- ${grayActiveFocus}
- }
- }
-`;
diff --git a/sources-gen/components/SolveCheckButton/SolveCheckButton.jsx b/sources-gen/components/SolveCheckButton/SolveCheckButton.jsx
deleted file mode 100644
index 262254e..0000000
--- a/sources-gen/components/SolveCheckButton/SolveCheckButton.jsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import styled from 'styled-components';
-import { StyledSolveButton } from './SolveButton';
-import { StyledCheckButton } from './CheckButton';
-import { I18nText } from '../I18n/I18nText';
-import { resolutions } from '../../utils/css';
-
-export const SolveCheckButton = ({
- className,
- isSolveButtonDisabled,
- isCheckButtonDisabled,
- handleSolveClicked,
- handleCheckClicked,
-}) => (
-
-
-
-
-
-
-
-
-);
-
-export const StyledSolveCheckButton = styled(SolveCheckButton)`
- /* @noflip */
- direction: ltr;
- display: flex;
- margin: auto;
- justify-content: space-between;
- padding: 20px 0;
- margin-bottom: 50px;
- width: 770px;
- > * {
- width: 376px;
- }
-
- @media (max-width: ${resolutions.max.tablet}px) {
- width: 79.825%;
- padding: 20px 20px;
- > * {
- width: 48%;
- }
- }
-
- @media (max-width: ${resolutions.max.mobile}px) {
- width: 97%;
- }
-`;
diff --git a/sources-gen/components/StandardButton/StandardButton.jsx b/sources-gen/components/StandardButton/StandardButton.jsx
deleted file mode 100644
index d5c099b..0000000
--- a/sources-gen/components/StandardButton/StandardButton.jsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import styled from 'styled-components';
-import classnames from 'classnames';
-import { colors } from '../../utils/css';
-import { useTranslation } from '../../hooks/useTranslation';
-import { useRtlContext } from '../../hooks/useRtl';
-
-const StandardButton = ({ titleKey, className, handleClick }) => {
- const { isRtl } = useRtlContext();
- const label = useTranslation(titleKey);
-
- return (
-
- {label}
-
- );
-};
-
-export const StyledStandardButton = styled(StandardButton)`
- display: inline-block;
- width: 100%;
- background: ${colors.LG_BLUE_1};
- box-sizing: border-box;
- border: none;
- height: 50px;
- text-decoration: none;
- justify-content: center;
- align-items: center;
- line-height: 33px;
- color: ${colors.LG_WHITE};
- font: 400 17px Helvetica, Arial, sans-serif;
- text-align: center;
- :active,
- :hover,
- :focus {
- transition: all 0.1s linear;
- background-color: ${colors.LG_GRAY_10};
- color: ${colors.LG_WHITE};
- }
-
- .rtl {
- direction: rtl;
- }
-`;
diff --git a/sources-gen/components/StatusFeedback/StatusFeedback.jsx b/sources-gen/components/StatusFeedback/StatusFeedback.jsx
deleted file mode 100644
index 2995660..0000000
--- a/sources-gen/components/StatusFeedback/StatusFeedback.jsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { Link } from 'react-router-dom';
-import { useLocation, useParams } from 'react-router';
-import { I18nText } from '../I18n/I18nText';
-import { StyledStandardButton } from '../StandardButton/StandardButton';
-import { feedbackHelper } from '../../utils/url/feedbackHelpers';
-import { getTargetPageUrl, URL_SEARCH_PARAM_TARGET_PATH } from '../../utils/url/urlFactory';
-import { COMMON_FEEDBACK_TRANSLATION_KEYS } from '../../constants/feedback';
-
-export const StatusFeedback = () => {
- const { langCode, feedbackType } = useParams();
- const { search } = useLocation();
-
- const feedbackContentKey = feedbackHelper.getFeedbackContentKey(feedbackType);
- const urlParams = new URLSearchParams(search);
- const targetPath = urlParams.get(URL_SEARCH_PARAM_TARGET_PATH);
- const targetPageUrl = targetPath || getTargetPageUrl(feedbackType, langCode);
-
- return (
-
- );
-};
diff --git a/sources-gen/components/Text/Text.jsx b/sources-gen/components/Text/Text.jsx
deleted file mode 100644
index e5ab848..0000000
--- a/sources-gen/components/Text/Text.jsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import styled from 'styled-components';
-import { colors } from '../../utils/css';
-
-// eslint-disable-next-line react/prop-types,no-unused-vars
-export const Text = ({
- isA = 'span',
- children,
- // eslint-disable-next-line no-unused-vars
- isRtl,
- className,
- ...restProps
-}) => {
- const Tag = isA;
- return (
-
- {children}
-
- );
-};
-
-export const StyledText = styled(Text)`
- direction: ${({ isRtl }) => (isRtl ? 'rtl' : 'ltr')};
-`;
-
-export const StyledTextGray12 = styled(StyledText)`
- color: ${colors.LG_GRAY_12};
-`;
diff --git a/sources-gen/components/ToggleableArrow/ToggleableArrow.jsx b/sources-gen/components/ToggleableArrow/ToggleableArrow.jsx
deleted file mode 100644
index 78d9d39..0000000
--- a/sources-gen/components/ToggleableArrow/ToggleableArrow.jsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import styled from 'styled-components';
-import classnames from 'classnames';
-import { StyledToggleableArrowIcon as ToggleableArrowIcon } from '../../assets/icons/ToggleableArrowIcon';
-
-const ToggleableArrow = ({ className, isUp, fill, ...restProps }) => {
- const classNames = classnames(className, {
- up: isUp,
- });
- return ;
-};
-
-export const StyledToggleableArrow = styled(ToggleableArrow)`
- position: absolute;
- width: 28px;
- height: 24px;
- fill: ${({ fill }) => fill};
- &.up {
- transform: rotate(180deg);
- }
-`;
diff --git a/sources-gen/components/Vocabulary/Vocabulary.jsx b/sources-gen/components/Vocabulary/Vocabulary.jsx
deleted file mode 100644
index b01fed6..0000000
--- a/sources-gen/components/Vocabulary/Vocabulary.jsx
+++ /dev/null
@@ -1,87 +0,0 @@
-/* eslint-disable react-hooks/exhaustive-deps */
-import { useEffect, useState } from 'react';
-import { useParams } from 'react-router';
-import { ReactComponent as IconHintCircleOrange } from '../../assets/svg/icon-hint-circle-orange.svg';
-import { StyledVocabularySearch } from './VocabularySearch/VocabularySearch';
-import { VocabularyMoreButton } from './VocabularyMoreButton/VocabularyMoreButton';
-import { I18nText } from '../I18n/I18nText';
-import { ContentHeadline } from '../ContentContainer/ContentHeadline/ContentHeadline';
-import { combineVocabularyData } from '../../hooks/vocabularySearchHooks';
-import { VocabularyItem } from './VocabularyItem';
-import { getQueryVariables } from './VocabularyQuery';
-
-export const Vocabulary = ({ data, refetch }) => {
- const { langCode } = useParams();
-
- const [startValue, setStartValue] = useState(0);
- const [vocabularyData, setVocabularyData] = useState(combineVocabularyData(data));
- const [isNotEmptyResp, setIsNotEmptyResp] = useState(false);
- const [searchQuery, setSearchQuery] = useState('');
-
- const findAdditionalData = shouldConcat => {
- refetch(
- getQueryVariables({
- langCode,
- offset: startValue,
- searchQuery,
- }),
- ).then(resp => {
- const combinedVocabularyData = combineVocabularyData(resp.data);
- shouldConcat
- ? setVocabularyData(prevState => [...prevState, ...combinedVocabularyData])
- : setVocabularyData(combinedVocabularyData);
- setIsNotEmptyResp(combinedVocabularyData.length > 0);
- if (combinedVocabularyData.length > 0) {
- setStartValue(prevState => prevState + 12);
- }
- });
- };
-
- useEffect(() => {
- findAdditionalData();
- }, [searchQuery]);
-
- return (
-
-
-
-
-
-
- {
- setStartValue(0);
- setSearchQuery(newSearchQuery);
- }}
- />
-
-
-
-
-
-
- );
-};
diff --git a/sources-gen/components/Vocabulary/VocabularyItem.jsx b/sources-gen/components/Vocabulary/VocabularyItem.jsx
deleted file mode 100644
index 0639cac..0000000
--- a/sources-gen/components/Vocabulary/VocabularyItem.jsx
+++ /dev/null
@@ -1,26 +0,0 @@
-export const VocabularyItem = ({ item }) => {
- return (
-
-
-
-
-
- {item.name}
-
-
- {item.subTitle}
-
-
-
-
-
-
- );
-};
diff --git a/sources-gen/components/Vocabulary/VocabularyMoreButton/VocabularyMoreButton.jsx b/sources-gen/components/Vocabulary/VocabularyMoreButton/VocabularyMoreButton.jsx
deleted file mode 100644
index 43d2570..0000000
--- a/sources-gen/components/Vocabulary/VocabularyMoreButton/VocabularyMoreButton.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { StyledStandardButton as StandardButton } from '../../StandardButton/StandardButton';
-
-export const VocabularyMoreButton = ({ handleClick, style }) => (
-
-);
diff --git a/sources-gen/components/Vocabulary/VocabularyQuery.jsx b/sources-gen/components/Vocabulary/VocabularyQuery.jsx
deleted file mode 100644
index 2c888ce..0000000
--- a/sources-gen/components/Vocabulary/VocabularyQuery.jsx
+++ /dev/null
@@ -1,85 +0,0 @@
-import gql from 'graphql-tag';
-import { toLang } from '../../utils/mappers/langMapper';
-
-export const knowledgeType = { field: 'knowledgeType', operator: 'match', value: 'VOCABULARY' };
-
-export const getCondition = (searchQuery, field) => {
- if (!searchQuery) {
- return [knowledgeType];
- }
- return [knowledgeType, { field, operator: 'match', value: searchQuery }];
-};
-
-export const getQueryVariables = ({
- langCode,
- offset = 0,
- amount = 12,
- searchQuery,
- sort = true,
-}) => ({
- lang: toLang(langCode),
- offset,
- amount,
- originalCondition: getCondition(searchQuery, 'name_partial'),
- translationCondition: getCondition(searchQuery, 'text_partial'),
- sort: !searchQuery && sort ? [{ field: 'name_not_analyzed', order: 'ASC' }] : [],
-});
-
-export const vocabularyFragment = {
- name: 'vocabularyFragment',
- fragment() {
- return gql`
- fragment ${this.name} on Knowledge {
- id
- text
- name
- subTitle
- }
- `;
- },
-};
-
-export const searchResultFragment = {
- name: 'searchResult',
- fragment() {
- return gql`
- fragment ${this.name} on SearchResult {
- totalHits
- amount
- offset
- hits {
- ...vocabularyFragment
- }
- }
- ${vocabularyFragment.fragment()}
- `;
- },
-};
-
-const searchQueryPart = name => `${name}: findContents(
- lang: $lang
- types: [KNOWLEDGE]
- offset: $offset
- amount: $amount
- must: $${name}Condition
- should: []
- mustNot: []
- sort: $sort
- ) {
- ...searchResult
- }
- `;
-
-export const vocabularySearchQuery = gql`
- query VocabularySearch(
- $lang: Language!, $offset: Int!
- $amount: Int!
- $originalCondition: [QueryConditionInput!]
- $translationCondition: [QueryConditionInput!]
- $sort: [QuerySortInput!]
- ) {
- ${searchQueryPart('original')}
- ${searchQueryPart('translation')}
- }
- ${searchResultFragment.fragment()}
- `;
diff --git a/sources-gen/components/Vocabulary/VocabularySearch/VocabularySearch.jsx b/sources-gen/components/Vocabulary/VocabularySearch/VocabularySearch.jsx
deleted file mode 100644
index 899a7ba..0000000
--- a/sources-gen/components/Vocabulary/VocabularySearch/VocabularySearch.jsx
+++ /dev/null
@@ -1,220 +0,0 @@
-import { useReducer, useRef } from 'react';
-import styled from 'styled-components';
-import classnames from 'classnames';
-import { useQuery } from '@apollo/client';
-import { useParams } from 'react-router-dom';
-import useDebounce from '../../../hooks/useDebounce';
-import {
- KEY_ARROW_DOWN,
- KEY_ARROW_UP,
- KEY_BACKSPACE,
- KEY_ENTER,
- KEY_ESCAPE,
-} from '../../../constants/keyCodes';
-import {
- reducer,
- TYPE_ANY_CHARACTER_TYPED,
- TYPE_KEY_BACKSPACE_CLICKED,
- TYPE_KEY_ENTER_CLICKED,
- TYPE_KEY_ESCAPE_CLICKED,
- TYPE_SET_CURSOR_ARROW_DOWN,
- TYPE_SET_CURSOR_ARROW_UP,
- TYPE_SET_HINTS_CLOSED,
- TYPE_SET_HINTS_OPENED,
- TYPE_SET_INPUT,
- TYPE_ITEM_CLICKED,
-} from './duck/vocabularySearchDuck';
-import {
- useGetCachedHintsResponse,
- useGetHintsResponseAndCacheIt,
-} from '../../../hooks/vocabularySearchHooks';
-import { useTranslation } from '../../../hooks/useTranslation';
-import { useRtlContext } from '../../../hooks/useRtl';
-import { vocabularySearchQuery, getQueryVariables } from '../VocabularyQuery';
-
-const specialCharactersRegex = new RegExp('[^\\p{L} @]', 'gui');
-
-const VocabularySearch = ({ className, onItemSelected }) => {
- const { langCode } = useParams();
- const { refetch } = useQuery(vocabularySearchQuery, {
- variables: getQueryVariables({
- langCode,
- }),
- });
- const [state, dispatch] = useReducer(reducer, {
- input: '',
- searchQuery: '',
- vocabularyItems: [],
- cursor: -1,
- isOpened: false,
- recentlySearched: new Map(),
- isEscapeClicked: false,
- isEnterClicked: false,
- amount: 6,
- offset: 0,
- });
-
- const { isRtl } = useRtlContext();
- const vocabularyOverviewPlaceholder = useTranslation('vocabularyOverview.placeholder');
- const vocabularyOverviewAria = useTranslation('vocabularyOverview.aria');
-
- const { isOpened, input, cursor, vocabularyItems, searchQuery } = state;
-
- const debouncedSearchQuery = useDebounce(searchQuery, 350);
-
- useGetCachedHintsResponse(state, dispatch);
- useGetHintsResponseAndCacheIt(debouncedSearchQuery, state, dispatch, refetch);
-
- const searchInput = useRef(null);
-
- const handleFocus = () => {
- dispatch({ type: TYPE_SET_HINTS_OPENED });
- };
-
- const handleBlur = () => {
- dispatch({ type: TYPE_SET_HINTS_CLOSED });
- };
-
- const handleClick = e => {
- const target = e.target.tagName === 'STRONG' ? e.target.parentNode : e.target;
- const { textContent } = target;
- dispatch({
- type: TYPE_ITEM_CLICKED,
- payload: {
- input: textContent,
- },
- });
- onItemSelected(textContent);
- };
-
- const handleKeys = e => {
- switch (e.keyCode) {
- case KEY_ARROW_UP:
- dispatch({ type: TYPE_SET_CURSOR_ARROW_UP });
- break;
-
- case KEY_ARROW_DOWN:
- dispatch({ type: TYPE_SET_CURSOR_ARROW_DOWN });
- break;
-
- case KEY_ENTER:
- // eslint-disable-next-line no-case-declarations
- const conditionalSearchQuery = input;
- onItemSelected(conditionalSearchQuery);
- dispatch({
- type: TYPE_KEY_ENTER_CLICKED,
- payload: {
- searchQuery: conditionalSearchQuery,
- },
- });
- break;
- case KEY_ESCAPE:
- dispatch({ type: TYPE_KEY_ESCAPE_CLICKED });
- break;
-
- case KEY_BACKSPACE:
- dispatch({
- type: TYPE_KEY_BACKSPACE_CLICKED,
- payload: {
- input: e.target.value,
- searchQuery: e.target.value,
- },
- });
- break;
-
- default:
- dispatch({
- type: TYPE_ANY_CHARACTER_TYPED,
- payload: {
- input: e.target.value,
- searchQuery: e.target.value,
- },
- });
- }
- };
- const cleanSearchQuery = searchQuery.replace(specialCharactersRegex);
- const wordsRegex = new RegExp(
- `((?:(?:\\p{P}|\\p{Z} )*)((\\p{L}*)${cleanSearchQuery}(\\p{L}*))(?:(?:\\p{P}|\\p{Z} )*))`,
- 'imu',
- );
- const suggestions = vocabularyItems
- .map(item => {
- const vocabularyText = item.translation
- ? item.text.replace(/<[^>]*>?/gm, '').trim()
- : item.name;
- const matches = wordsRegex.exec(vocabularyText);
- return matches ? matches[2] : null;
- })
- .filter(item => !!item);
- const distinctSuggestions = [...new Set(suggestions)];
-
- const addBolding = text =>
- text.replace(
- new RegExp(searchQuery.replace(specialCharactersRegex, ''), 'gi'),
- m => `${m} `,
- );
-
- return (
-
-
-
-
-
- dispatch({
- type: TYPE_SET_INPUT,
- payload: { input: e.target.value },
- })
- }
- onKeyUp={handleKeys}
- onBlur={handleBlur}
- onFocus={handleFocus}
- ref={searchInput}
- />
-
-
- {distinctSuggestions &&
- distinctSuggestions.length > 0 &&
- distinctSuggestions.map((suggestion, index) => (
- // eslint-disable-next-line jsx-a11y/no-static-element-interactions
-
- ))}
-
-
-
-
-
-
- );
-};
-
-export const StyledVocabularySearch = styled(VocabularySearch)`
- .tt-menu {
- visibility: hidden;
- }
-
- .tt-open {
- visibility: visible;
- }
-
- .twitter-typeahead {
- position: relative;
- display: inline-block;
- }
-`;
diff --git a/sources-gen/components/Vocabulary/VocabularySearch/duck/vocabularySearchDuck.jsx b/sources-gen/components/Vocabulary/VocabularySearch/duck/vocabularySearchDuck.jsx
deleted file mode 100644
index ae63af7..0000000
--- a/sources-gen/components/Vocabulary/VocabularySearch/duck/vocabularySearchDuck.jsx
+++ /dev/null
@@ -1,117 +0,0 @@
-export const TYPE_SET_INPUT = 'TYPE_SET_INPUT';
-export const TYPE_GET_CACHED_RESULTS = 'TYPE_GET_CACHED_RESULTS';
-export const TYPE_SET_HINTS_DATA = 'TYPE_RESET_CURSOR_AND_SET_HINTS_DATA';
-export const TYPE_SET_HINTS_OPENED = 'TYPE_SET_HINTS_OPENED';
-export const TYPE_SET_HINTS_CLOSED = 'TYPE_SET_HINTS_CLOSED';
-export const TYPE_SET_CURSOR_ARROW_UP = 'TYPE_SET_CURSOR_ARROW_UP';
-export const TYPE_SET_CURSOR_ARROW_DOWN = 'TYPE_SET_CURSOR_ARROW_DOWN';
-export const TYPE_KEY_ESCAPE_CLICKED = 'TYPE_KEY_ESCAPE_CLICKED';
-export const TYPE_KEY_BACKSPACE_CLICKED = 'TYPE_KEY_BACKSPACE_CLICKED';
-export const TYPE_ANY_CHARACTER_TYPED = 'TYPE_KEY_ANY_CLICKED';
-export const TYPE_ITEM_CLICKED = 'TYPE_ITEM_CLICKED';
-export const TYPE_KEY_ENTER_CLICKED = 'TYPE_KEY_ENTER_CLICKED';
-
-export const reducer = (state, action) => {
- switch (action.type) {
- case TYPE_GET_CACHED_RESULTS:
- return {
- ...state,
- vocabularyItems: state.recentlySearched.get(state.input),
- isOpened:
- !state.isEscapeClicked && !state.isEnterClicked && state.recentlySearched.get(state.input)
- ? state.recentlySearched.get(state.input).length > 0
- : false,
- isEscapeClicked: false,
- isEnterClicked: false,
- };
- case TYPE_SET_HINTS_DATA: {
- const { response, searchQuery } = action.payload;
- return {
- ...state,
- vocabularyItems: response ? response.slice(0, Math.min(8, response.length)) : [],
- recentlySearched: state.recentlySearched.set(searchQuery, response || []),
- cursor: -1,
- isOpened:
- !state.isEnterClicked && !state.isEscapeClicked && response ? response.length > 0 : false,
- };
- }
- case TYPE_SET_HINTS_OPENED:
- return {
- ...state,
- isOpened: true,
- };
- case TYPE_SET_HINTS_CLOSED:
- return {
- ...state,
- isOpened: false,
- };
- case TYPE_SET_INPUT:
- return {
- ...state,
- ...action.payload,
- };
- case TYPE_SET_CURSOR_ARROW_UP: {
- const cursorUp =
- state.cursor === -1
- ? state.vocabularyItems.length - 1
- : (state.cursor - 1) % state.vocabularyItems.length;
- return {
- ...state,
- isOpened: true,
- cursor: cursorUp,
- input: state.vocabularyItems[cursorUp !== -1 ? cursorUp : 0],
- };
- }
- case TYPE_SET_CURSOR_ARROW_DOWN: {
- const cursorDown = (state.cursor + 1) % state.vocabularyItems.length;
- return {
- ...state,
- isOpened: true,
- cursor: cursorDown,
- input: state.vocabularyItems[cursorDown],
- };
- }
- case TYPE_KEY_ESCAPE_CLICKED:
- return {
- ...state,
- cursor: -1,
- input: '',
- isOpened: false,
- isEscapeClicked: true,
- vocabularyItems: [],
- };
- case TYPE_KEY_BACKSPACE_CLICKED:
- return {
- ...state,
- ...action.payload,
- cursor: -1,
- vocabularyItems: action.payload.input === '' ? [] : state.vocabularyItems,
- isEnterClicked: false,
- isEscapeClicked: false,
- };
- case TYPE_ITEM_CLICKED:
- return {
- ...state,
- ...action.payload,
- cursor: -1,
- isOpened: false,
- };
- case TYPE_ANY_CHARACTER_TYPED:
- return {
- ...state,
- ...action.payload,
- cursor: -1,
- isOpened: true,
- };
- case TYPE_KEY_ENTER_CLICKED:
- return {
- ...state,
- ...action.payload,
- cursor: -1,
- isOpened: false,
- isEnterClicked: true,
- };
- default:
- return state;
- }
-};
diff --git a/sources-gen/components/VocabularyTrainer/BubbleContainer.jsx b/sources-gen/components/VocabularyTrainer/BubbleContainer.jsx
deleted file mode 100644
index 0c5851f..0000000
--- a/sources-gen/components/VocabularyTrainer/BubbleContainer.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { RichText } from '../RichText/RichText';
-import { DwPicture } from '../DwPicture/DwPicture';
-
-export const BubbleContainer = ({ children, mainContentImage }) => {
- return (
-
- {mainContentImage && }
-
-
- );
-};
diff --git a/sources-gen/components/VocabularyTrainer/VocabularyTrainer.jsx b/sources-gen/components/VocabularyTrainer/VocabularyTrainer.jsx
deleted file mode 100644
index ef8971f..0000000
--- a/sources-gen/components/VocabularyTrainer/VocabularyTrainer.jsx
+++ /dev/null
@@ -1,100 +0,0 @@
-import { useEffect, useState } from 'react';
-import gql from 'graphql-tag';
-import { useHistory, useLocation, useParams } from 'react-router';
-import { VocabularyTrainerStart } from './VocabularyTrainerStart';
-import { StyledVocabularyTrainerExercise as VocabularyTrainerExercise } from './VocabularyTrainerExercise';
-import { WithGraphQLQueryHandling } from '../WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { toLang } from '../../utils/mappers/langMapper';
-import { shuffle } from '../../utils/commons';
-import {
- getFeedbackUrl,
- PAGE_VOCABULARY_TRAINER_START,
- getVocabularyTrainerPage,
-} from '../../utils/url/urlFactory';
-import { FEEDBACK_TYPES } from '../../constants/feedback';
-import { vocabularyFragment } from '../Vocabulary/VocabularyQuery';
-
-export const vocabularyTrainerQuery = gql`
- query VocabularyTrainer($keys: [ContentKeyInput]!, $lang: Language!) {
- contents(keys: $keys, lang: $lang) {
- ... on Lesson {
- id
- vocabularies {
- ...vocabularyFragment
- audios {
- mp3Src
- mainContentImage {
- id
- name
- }
- }
- }
- }
- }
- }
- ${vocabularyFragment.fragment()}
-`;
-
-export const makeQueryVariables = (ids, langCode) => ({
- keys: ids.map(lessonId => ({
- id: lessonId,
- type: 'LESSON',
- })),
- lang: toLang(langCode),
-});
-
-export const VocabularyTrainer = () => {
- const [lastLessonsIds, setLastLessonsIds] = useState([]);
- const [numberOfVocabularies, setNumberOfVocabularies] = useState(0);
- const [isStarted, setStarted] = useState(false);
- const { langCode } = useParams();
- const location = useLocation();
- const history = useHistory();
-
- const handleExerciseStart = () => {
- setStarted(true);
- };
-
- const handleExerciseEnd = () => {
- setStarted(false);
- };
-
- useEffect(() => {
- if (location.pathname.includes(PAGE_VOCABULARY_TRAINER_START)) {
- setStarted(false);
- setLastLessonsIds([]);
- history.replace(getVocabularyTrainerPage(langCode));
- }
- if (isStarted && !lastLessonsIds.length) {
- history.push(getFeedbackUrl(FEEDBACK_TYPES.VOCABULARY_TRAINER_NO_VOCABULARIES, langCode));
- }
- }, [history, langCode, lastLessonsIds.length, isStarted, location.pathname]);
-
- const getRandomVocabularies = ({ contents }) => {
- const vocabularies = contents.map(content => (content ? content.vocabularies : [])).flat(1);
- const uniqueVocabularies = Array.from(new Set(vocabularies));
- return shuffle(uniqueVocabularies).slice(0, numberOfVocabularies);
- };
-
- if (!isStarted) {
- return (
-
- );
- }
-
- return (
-
- {data => (
-
- )}
-
- );
-};
diff --git a/sources-gen/components/VocabularyTrainer/VocabularyTrainerExercise.jsx b/sources-gen/components/VocabularyTrainer/VocabularyTrainerExercise.jsx
deleted file mode 100644
index 8a5261e..0000000
--- a/sources-gen/components/VocabularyTrainer/VocabularyTrainerExercise.jsx
+++ /dev/null
@@ -1,96 +0,0 @@
-import { useEffect, useState } from 'react';
-import styled from 'styled-components';
-import classnames from 'classnames';
-import { useHistory, useParams } from 'react-router';
-import { StyledVocabularyTrainerStatus as VocabularyTrainerStatus } from './VocabularyTrainerStatus';
-import { StyledVocabularyTrainerItem as VocabularyTrainerItem } from './VocabularyTrainerItem';
-import { StyledVocabularyTrainerSmileys as VocabularyTrainerSmileys } from './VocabularyTrainerSmileys';
-import { useTransition } from '../../hooks/useTransition';
-import { getFeedbackUrl } from '../../utils/url/urlFactory';
-import { FEEDBACK_TYPES } from '../../constants/feedback';
-
-export const VocabularyTrainerExercise = ({ vocabularies, handleExerciseEnd, className }) => {
- const [isSolved, setSolved] = useState(false);
- const [correctAnswers, setCorrectAnswers] = useState(0);
- const [trainerVocabularies, setTrainerVocabularies] = useState(vocabularies);
- const history = useHistory();
- const { langCode } = useParams();
-
- const nextVocabulary = newTrainerVocabularies => {
- const slicedTrainerVocabularies = newTrainerVocabularies.slice(1);
- setTrainerVocabularies(slicedTrainerVocabularies);
- setSolved(false);
- if (!slicedTrainerVocabularies.length) {
- handleExerciseEnd();
- }
- };
-
- const { transitionStatus, startTransition } = useTransition({
- delay: 300,
- });
-
- useEffect(() => {
- if (vocabularies.length === 0) {
- history.push(getFeedbackUrl(FEEDBACK_TYPES.VOCABULARY_TRAINER_NO_VOCABULARIES, langCode));
- }
- }, [history, langCode, vocabularies.length]);
-
- const onSolved = () => {
- setSolved(true);
- };
-
- const handleCorrectAnswer = () => {
- startTransition({ onTransitionEnd: () => nextVocabulary(trainerVocabularies) });
- setCorrectAnswers(value => value + 1);
- };
- const handleWrongAnswer = () => {
- const newTrainerVocabularies = [...trainerVocabularies, trainerVocabularies[0]];
- startTransition({ onTransitionEnd: () => nextVocabulary(newTrainerVocabularies) });
- };
-
- if (!trainerVocabularies.length) {
- return null;
- }
-
- return (
-
-
-
- {isSolved && (
-
-
-
- )}
-
-
- );
-};
-
-export const StyledVocabularyTrainerExercise = styled(VocabularyTrainerExercise)`
- &.busy {
- opacity: 0;
- }
- &.ready {
- opacity: 1;
- }
- & {
- opacity: 0;
- -webkit-transition: opacity 0.3s ease;
- -moz-transition: opacity 0.3s ease;
- -o-transition: opacity 0.3s ease;
- transition: opacity 0.3s ease;
- }
-`;
diff --git a/sources-gen/components/VocabularyTrainer/VocabularyTrainerItem.jsx b/sources-gen/components/VocabularyTrainer/VocabularyTrainerItem.jsx
deleted file mode 100644
index 5b2d9a8..0000000
--- a/sources-gen/components/VocabularyTrainer/VocabularyTrainerItem.jsx
+++ /dev/null
@@ -1,125 +0,0 @@
-import { useRef, useState, useEffect } from 'react';
-import styled, { createGlobalStyle } from 'styled-components';
-import classnames from 'classnames';
-import { BubbleContainer } from './BubbleContainer';
-import { StyledSolveButton } from '../SolveCheckButton/SolveButton';
-import { I18nText } from '../I18n/I18nText';
-
-const VocabularyTrainerItemGlobalStyles = createGlobalStyle`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-`;
-
-export const VocabularyTrainerItem = ({
- vocabulary: { text, audios, subTitle, name },
- onSolved,
- isHidden,
- className,
-}) => {
- const audioRef = useRef();
- const { mp3Src, mainContentImage } = audios[0] || {};
- const [isSolved, setSolved] = useState(false);
- const [audioStatus, setAudioStatus] = useState('');
- const [isDisabled, setDisabled] = useState(false);
-
- const onSolveClicked = event => {
- event.preventDefault();
- setSolved(true);
- setDisabled(true);
- if (!mp3Src) {
- setAudioStatus('ending');
- onSolved();
- }
- };
-
- const onAnswerClicked = event => {
- event.preventDefault();
- audioRef.current.play();
- setAudioStatus('playing');
- };
-
- const onAudioEnded = () => {
- setAudioStatus('ending');
- onSolved();
- };
-
- useEffect(() => {
- if (!isHidden) {
- setSolved(false);
- setAudioStatus('');
- setDisabled(false);
- }
- }, [text, isHidden]);
-
- return (
- <>
-
- {!isHidden && (
-
- )}
- >
- );
-};
-
-export const StyledVocabularyTrainerItem = styled(VocabularyTrainerItem)`
- & .answer-multiple-text:hover:after {
- -webkit-transition: all 0.3s linear;
- -moz-transition: all 0.3s linear;
- -o-transition: all 0.3s linear;
- transition: all 0.3s linear;
- border-left-color: #0098ff;
- }
- & .bubble .hint {
- display: block;
- font-size: 80%;
- font-style: italic;
- }
-`;
diff --git a/sources-gen/components/VocabularyTrainer/VocabularyTrainerSmileys.jsx b/sources-gen/components/VocabularyTrainer/VocabularyTrainerSmileys.jsx
deleted file mode 100644
index a311e8b..0000000
--- a/sources-gen/components/VocabularyTrainer/VocabularyTrainerSmileys.jsx
+++ /dev/null
@@ -1,64 +0,0 @@
-import { useState } from 'react';
-import classnames from 'classnames';
-import styled from 'styled-components';
-import {
- StyledSmileyNegative as SmileyNegative,
- StyledSmileyPositive as SmileyPositive,
-} from '../../assets/icons/Smiley';
-import { useRtlContext } from '../../hooks/useRtl';
-
-export const VocabularyTrainerSmileys = ({ handleCorrectAnswer, handleWrongAnswer, className }) => {
- const ANSWER_STATE = Object.freeze({
- INITIAL: 'initial',
- WRONG: 'wrong',
- CORRECT: 'correct',
- });
- const { isRtl } = useRtlContext();
- const [answerState, setAnswerState] = useState(ANSWER_STATE.INITIAL);
-
- const onPositiveSmileyClicked = e => {
- e.preventDefault();
- setAnswerState(ANSWER_STATE.CORRECT);
- handleCorrectAnswer();
- };
-
- const onNegativeSmileyClicked = e => {
- e.preventDefault();
- setAnswerState(ANSWER_STATE.WRONG);
- handleWrongAnswer();
- };
-
- return (
-
-
- {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
-
-
-
-
-
- {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
-
-
-
-
-
- );
-};
-
-export const StyledVocabularyTrainerSmileys = styled(VocabularyTrainerSmileys)`
- @media (min-width: 768px) {
- &.isRtl .col-lg-offset-5 {
- margin-right: 0;
- margin-left: 33.3333%;
- }
- }
-`;
diff --git a/sources-gen/components/VocabularyTrainer/VocabularyTrainerStart.jsx b/sources-gen/components/VocabularyTrainer/VocabularyTrainerStart.jsx
deleted file mode 100644
index 2d62832..0000000
--- a/sources-gen/components/VocabularyTrainer/VocabularyTrainerStart.jsx
+++ /dev/null
@@ -1,122 +0,0 @@
-/* eslint-disable jsx-a11y/aria-role */
-import { useEffect, useState } from 'react';
-import { Link } from 'react-router-dom';
-import { useParams } from 'react-router';
-import { I18nText } from '../I18n/I18nText';
-import { getHelpUrl } from '../../utils/url/urlFactory';
-import { StyledStandardButton } from '../StandardButton/StandardButton';
-import { useI18nContext } from '../../context/I18nContext';
-import { getLastEditedLessonsIds } from '../../services/learnProgressService';
-
-const SCOPE = Object.freeze({
- LAST_LESSON: 1,
- LAST_THREE_LESSONS: 3,
- LAST_TEN_LESSONS: 10,
- ALL_LESSONS: 0,
-});
-
-const scopeToTranslationKeyMapping = Object.freeze({
- [SCOPE.LAST_LESSON]: 'vocabularyTrainer.last',
- [SCOPE.LAST_THREE_LESSONS]: 'vocabularyTrainer.last3',
- [SCOPE.LAST_TEN_LESSONS]: 'vocabularyTrainer.last10',
- [SCOPE.ALL_LESSONS]: 'vocabularyTrainer.all',
-});
-
-export const VocabularyTrainerStart = ({
- setLastLessonsIds,
- setNumberOfVocabularies,
- handleExerciseStart,
-}) => {
- const [numberOfLessons, setNumberOfLessons] = useState(SCOPE.LAST_LESSON);
- const { langCode } = useParams();
- const { i18n } = useI18nContext();
-
- const handleChangeScope = async value => {
- const lastEditedLessonIds = await getLastEditedLessonsIds(value, langCode);
- setNumberOfLessons(value);
- setLastLessonsIds && setLastLessonsIds(lastEditedLessonIds);
- };
-
- const handleSubmit = e => {
- e.preventDefault();
- handleExerciseStart && handleExerciseStart();
- };
-
- useEffect(() => {
- handleChangeScope(SCOPE.LAST_LESSON);
- // eslint-disable-next-line
- }, []);
-
- return (
-
- );
-};
diff --git a/sources-gen/components/VocabularyTrainer/VocabularyTrainerStatus.jsx b/sources-gen/components/VocabularyTrainer/VocabularyTrainerStatus.jsx
deleted file mode 100644
index 91409fb..0000000
--- a/sources-gen/components/VocabularyTrainer/VocabularyTrainerStatus.jsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import classnames from 'classnames';
-import styled from 'styled-components';
-import { I18nText } from '../I18n/I18nText';
-import { useRtlContext } from '../../hooks/useRtl';
-
-export const VocabularyTrainerStatus = ({ number, total, top, bottom, className }) => {
- const { isRtl } = useRtlContext();
-
- const rtlText = (
-
-
- {` ${number} `}
-
- {` ${total}`}
-
- );
-
- const ltrText = (
-
- {`${number} `}
-
- {` ${total} `}
-
-
- );
-
- return (
-
-
-
- {isRtl ? rtlText : ltrText}
-
-
-
- );
-};
-
-export const StyledVocabularyTrainerStatus = styled(VocabularyTrainerStatus)`
- & div.exercise-nav div.exercise-nav-title.rtl {
- direction: rtl;
- }
-`;
diff --git a/sources-gen/components/WithGraphQLQueryHandling/WithGraphQLQueryHandling.jsx b/sources-gen/components/WithGraphQLQueryHandling/WithGraphQLQueryHandling.jsx
deleted file mode 100644
index b7fe9c9..0000000
--- a/sources-gen/components/WithGraphQLQueryHandling/WithGraphQLQueryHandling.jsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { useQuery } from '@apollo/client';
-import { StyledLoadingMessage as LoadingMessage } from '../commons/LoadingMessage';
-import { StyledErrorMessage as ErrorMessage } from '../commons/ErrorMessage';
-
-const hasData = data => data && Object.values(data).filter(item => item).length > 0;
-
-export const WithGraphQLQueryHandling = ({ query, queryVariables, children }) => {
- const { loading, error, data = {}, refetch } = useQuery(query, {
- variables: queryVariables,
- });
-
- if (loading) {
- return ;
- }
-
- if (error) {
- const { message = 'error while fetching data' } = error;
- return ;
- }
-
- if (!hasData(data)) {
- return ;
- }
-
- return children(data, refetch);
-};
diff --git a/sources-gen/components/WithRenderDelay/WithRenderDelay.jsx b/sources-gen/components/WithRenderDelay/WithRenderDelay.jsx
deleted file mode 100644
index 01c5064..0000000
--- a/sources-gen/components/WithRenderDelay/WithRenderDelay.jsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { Component } from 'react';
-
-export class WithRenderDelay extends Component {
- state = {};
-
- componentDidMount() {
- const delayTime = this.props.delayTime || 100;
- const timeoutHandle = setTimeout(() => this.props.actionToBeDelayed(), delayTime);
- this.setState((prevState, props) => ({ timeoutHandle }));
- }
-
- componentWillUnmount() {
- clearTimeout(this.state.timeoutHandle);
- }
-
- render() {
- // eslint-disable-next-line no-unused-vars
- const { render, actionToBeDelayed, delayTime, ...restProps } = this.props;
- return render(restProps);
- }
-}
diff --git a/sources-gen/components/commons/ErrorMessage.jsx b/sources-gen/components/commons/ErrorMessage.jsx
deleted file mode 100644
index 40988d4..0000000
--- a/sources-gen/components/commons/ErrorMessage.jsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import styled from 'styled-components';
-
-const ErrorMessage = ({ className, error }) => (
-
-);
-export const StyledErrorMessage = styled(ErrorMessage)`
- color: red;
-`;
diff --git a/sources-gen/components/commons/LoadingMessage.jsx b/sources-gen/components/commons/LoadingMessage.jsx
deleted file mode 100644
index 27de359..0000000
--- a/sources-gen/components/commons/LoadingMessage.jsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import styled from 'styled-components';
-
-const LoadingMessage = ({ className }) => (
-
-);
-
-export const StyledLoadingMessage = styled(LoadingMessage)``;
diff --git a/sources-gen/components/user/ConfirmUserRegistrationContainer.jsx b/sources-gen/components/user/ConfirmUserRegistrationContainer.jsx
deleted file mode 100644
index d93a41b..0000000
--- a/sources-gen/components/user/ConfirmUserRegistrationContainer.jsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import { useEffect } from 'react';
-import { useHistory, useParams } from 'react-router';
-import { confirmUserRegistration } from '../../services/userService';
-import { feedbackHelper } from '../../utils/url/feedbackHelpers';
-import { StyledLoadingMessage as LoadingMessage } from '../commons/LoadingMessage';
-
-export const ConfirmUserRegistrationContainer = ({ confirmationId }) => {
- const { langCode } = useParams();
- const history = useHistory();
-
- useEffect(() => {
- confirmUserRegistration(confirmationId)
- .then(async response => {
- if (response.ok) {
- history.push(feedbackHelper.forRegistrationConfirm(langCode));
- } else {
- const errorResponse = await response.json();
- history.push(feedbackHelper.getForErrorCode(errorResponse, langCode));
- }
- })
- .catch(e => {
- history.push(feedbackHelper.getForErrorCode(e, langCode));
- });
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, []);
-
- return ;
-};
diff --git a/sources-gen/components/user/PasswordChange.jsx b/sources-gen/components/user/PasswordChange.jsx
deleted file mode 100644
index e270c49..0000000
--- a/sources-gen/components/user/PasswordChange.jsx
+++ /dev/null
@@ -1,90 +0,0 @@
-import { useForm } from 'react-hook-form';
-import { useHistory, useParams } from 'react-router-dom';
-import { useSelector } from 'react-redux';
-import { I18nText } from '../I18n/I18nText';
-import { Input } from '../Input/Input';
-import { StyledStandardButton as StandardButton } from '../StandardButton/StandardButton';
-import { changePassword } from '../../services/passwordService';
-import { feedbackHelper } from '../../utils/url/feedbackHelpers';
-import { NewPasswordInputs } from '../Input/NewPassword/NewPasswordInputs';
-import { userDataSelector } from '../../state/user/userSelectors';
-
-export const PasswordChange = () => {
- const { langCode } = useParams();
- const history = useHistory();
-
- const {
- register,
- handleSubmit,
- getValues,
- formState: { errors },
- } = useForm({
- mode: 'onSubmit',
- reValidateMode: 'onSubmit',
- });
-
- const { email } = useSelector(userDataSelector);
-
- const onSubmit = async data => {
- const { oldPassword, password } = data;
-
- try {
- const changePasswordResponse = await changePassword(oldPassword, password);
-
- if (!changePasswordResponse.ok) {
- const jsonResponse = await changePasswordResponse.json();
- history.push(feedbackHelper.getForPasswordChangeErrorCode(jsonResponse, langCode));
- } else {
- history.push(feedbackHelper.forPasswordChanged(langCode));
- }
- } catch (err) {
- history.push(feedbackHelper.forGeneralError(langCode));
- }
- };
-
- return (
-
- );
-};
diff --git a/sources-gen/components/user/PasswordReset.jsx b/sources-gen/components/user/PasswordReset.jsx
deleted file mode 100644
index f0e88a3..0000000
--- a/sources-gen/components/user/PasswordReset.jsx
+++ /dev/null
@@ -1,109 +0,0 @@
-import { useRef, useState } from 'react';
-import { useHistory, useParams } from 'react-router';
-import { useForm } from 'react-hook-form';
-import { I18nText } from '../I18n/I18nText';
-import { Input } from '../Input/Input';
-import { captcha, emailPattern } from '../../utils/validation/validators';
-import { hasErrorClassAssigner } from '../../utils/errorClassAssigner';
-import { ReCaptcha } from '../ReCaptcha/ReCaptcha';
-import { StyledStandardButton as StandardButton } from '../StandardButton/StandardButton';
-import { scrollIntoViewCenter } from '../../utils/htmlUtils';
-import { requestResetPassword } from '../../services/passwordService';
-import { feedbackHelper } from '../../utils/url/feedbackHelpers';
-import { useTranslation } from '../../hooks/useTranslation';
-
-export const PasswordReset = () => {
- const [state, setState] = useState({
- isCaptchaPassed: false,
- captchaError: false,
- captchaToken: null,
- });
- const { langCode } = useParams();
- const captchaRef = useRef();
- const history = useHistory();
-
- const {
- register,
- handleSubmit,
- formState: { errors },
- } = useForm({
- mode: 'onSubmit',
- reValidateMode: 'onSubmit',
- });
-
- const captchaMessage = useTranslation('client.recaptcha');
- const captchaValidationMessage = useTranslation({
- key: 'client.validator.required',
- parameters: { first: captchaMessage },
- });
-
- const onSubmit = async data => {
- if (!captcha.validateCaptcha(state, setState)) {
- scrollIntoViewCenter(captchaRef.current);
- return;
- }
- try {
- await requestResetPassword({ userData: data, captchaToken: state.captchaToken });
- history.push(feedbackHelper.forPasswordResetRequest(langCode));
- } catch (err) {
- history.push(feedbackHelper.getForErrorCode(err, langCode));
- }
- };
-
- const onCaptchaSuccess = token => {
- setState({ ...state, isCaptchaPassed: true, captchaToken: token });
- };
-
- const onCaptchaExpired = () => {
- setState({ ...state, isCaptchaPassed: false, captchaToken: null });
- };
-
- return (
-
- );
-};
diff --git a/sources-gen/components/user/Registration.jsx b/sources-gen/components/user/Registration.jsx
deleted file mode 100644
index 2f97302..0000000
--- a/sources-gen/components/user/Registration.jsx
+++ /dev/null
@@ -1,260 +0,0 @@
-import { useRef, useState } from 'react';
-import { useForm } from 'react-hook-form';
-import { useHistory, useParams } from 'react-router-dom';
-import { Input } from '../Input/Input';
-import { Select } from '../Select/Select';
-import { Checkbox } from '../Checkbox/Checkbox';
-import { I18nText } from '../I18n/I18nText';
-import { StyledStandardButton as StandardButton } from '../StandardButton/StandardButton';
-import { BirthDateInput } from '../Input/BirthDateInput/BirthDateInput';
-import {
- emailPattern,
- namePattern,
- passwordDiffersFromEmail,
- passwordRetypeValid,
- passwordValid,
- captcha,
-} from '../../utils/validation/validators';
-import { ReCaptcha } from '../ReCaptcha/ReCaptcha';
-import { scrollIntoViewCenter } from '../../utils/htmlUtils';
-import { hasErrorClassAssigner } from '../../utils/errorClassAssigner';
-import { Text } from '../Text/Text';
-import { getDashboardUrl } from '../../utils/url/urlFactory';
-import { countries } from '../../constants/countries';
-import { registerUser } from '../../services/userService';
-import { sexOptions } from '../../constants/userInputOptions';
-import { CUSTOM_ERROR_TRANSLATION_KEYS } from '../../utils/validation/validationMessages';
-import { feedbackHelper } from '../../utils/url/feedbackHelpers';
-import { useI18nContext } from '../../context/I18nContext';
-import { useTranslation } from '../../hooks/useTranslation';
-
-export const Registration = () => {
- const { i18n } = useI18nContext();
-
- const [state, setState] = useState({
- isCaptchaPassed: false,
- captchaError: false,
- captchaToken: null,
- });
-
- const captchaRef = useRef();
- const { langCode } = useParams();
- const history = useHistory();
-
- const {
- register,
- handleSubmit,
- getValues,
- formState: { errors },
- } = useForm({
- mode: 'onSubmit',
- reValidateMode: 'onSubmit',
- });
-
- const captchaMessage = useTranslation('client.recaptcha');
- const captchaValidationMessage = useTranslation({
- key: 'client.validator.required',
- parameters: { first: captchaMessage },
- });
-
- const createLink = (href, text) => `
- ${text}
- `;
-
- const createPrivacyPolicyLink = t =>
- createLink('https://p.dw.com/p/1Edck', t('profile.register.privacyPolicy'));
-
- const createAgbLink = t => createLink('https://p.dw.com/p/16hIr', t('profile.register.agb'));
-
- const fullGdpr = t => {
- const label = t('profile.register.agbAndPrivacyPolicyFormat', {
- dataPrivacyPolicy: createPrivacyPolicyLink(t),
- conditionsOfParticipation: createAgbLink(t),
- });
- return (
- <>
-
-
-
-
-
- >
- );
- };
-
- const checkboxes = [
- {
- name: 'gdpr',
- labelTextFunc: fullGdpr,
- validationErrorTranslationKey: 'client.acceptTermsConditions',
- register: register('gdpr', { required: true }),
- validationError: errors.gdpr,
- },
- {
- name: 'teacher',
- labelText: ,
- register: register('teacher'),
- },
- {
- name: 'newsletter',
- labelText: ,
- register: register('newsletter'),
- },
- ];
-
- const onSubmit = async userData => {
- if (captcha.validateCaptcha(state, setState)) {
- try {
- const response = await registerUser({
- userData,
- captchaToken: state.captchaToken,
- langCode,
- });
- if (response.ok) {
- history.push(feedbackHelper.forRegistered(langCode));
- } else {
- const responseJson = await response.json();
- history.push(feedbackHelper.getForErrorCode(responseJson, langCode));
- }
- } catch (err) {
- history.push(feedbackHelper.getForErrorCode(err, langCode));
- }
- } else {
- scrollIntoViewCenter(captchaRef.current);
- }
- };
-
- const onCaptchaSuccess = token => {
- setState({ ...state, isCaptchaPassed: true, captchaToken: token });
- };
-
- const onCaptchaExpired = () => {
- setState({ ...state, isCaptchaPassed: false, captchaToken: null });
- };
-
- const cancelRegistration = e => {
- e.preventDefault();
- history.push(getDashboardUrl(langCode));
- };
-
- return (
-
- );
-};
diff --git a/sources-gen/components/user/SetNewPassword.jsx b/sources-gen/components/user/SetNewPassword.jsx
deleted file mode 100644
index 69fb869..0000000
--- a/sources-gen/components/user/SetNewPassword.jsx
+++ /dev/null
@@ -1,87 +0,0 @@
-import { useEffect, useState } from 'react';
-import { useForm } from 'react-hook-form';
-import { useHistory, useParams } from 'react-router-dom';
-import { feedbackHelper } from '../../utils/url/feedbackHelpers';
-import { getUserByConfirmationId, setPasswordByToken } from '../../services/passwordService';
-import { I18nText } from '../I18n/I18nText';
-import { NewPasswordInputs } from '../Input/NewPassword/NewPasswordInputs';
-import { StyledStandardButton as StandardButton } from '../StandardButton/StandardButton';
-import { StyledLoadingMessage as LoadingMessage } from '../commons/LoadingMessage';
-
-export const SetNewPassword = ({ confirmationId }) => {
- const history = useHistory();
- const { langCode } = useParams();
- const [email, setEmail] = useState(null);
-
- useEffect(() => {
- getUserByConfirmationId(confirmationId)
- .then(userEmailResponse => {
- if (!userEmailResponse.includes('@')) {
- history.push(feedbackHelper.forInvalidToken(langCode));
- } else {
- setEmail(userEmailResponse);
- }
- })
- .catch(e => {
- history.push(feedbackHelper.getForErrorCode(e, langCode));
- });
- // eslint-disable-next-line
- }, []);
-
- const {
- register,
- handleSubmit,
- getValues,
- formState: { errors },
- } = useForm({
- mode: 'onSubmit',
- reValidateMode: 'onSubmit',
- });
-
- const onSubmit = async () => {
- try {
- await setPasswordByToken(getValues().password, confirmationId);
- history.push(feedbackHelper.forSetPassword(langCode));
- } catch (err) {
- history.push(feedbackHelper.getForErrorCode(err, langCode));
- }
- };
-
- return email ? (
-
- ) : (
-
- );
-};
diff --git a/sources-gen/components/user/UserProfile.jsx b/sources-gen/components/user/UserProfile.jsx
deleted file mode 100644
index a831818..0000000
--- a/sources-gen/components/user/UserProfile.jsx
+++ /dev/null
@@ -1,234 +0,0 @@
-import { useState } from 'react';
-import { useForm } from 'react-hook-form';
-import { useDispatch, useSelector } from 'react-redux';
-import { Link, useHistory } from 'react-router-dom';
-import { useParams } from 'react-router';
-import {
- contactLanguageOptions,
- handicapOptions,
- languageLevelOptions,
- learningTypeOptions,
- professionOptions,
- sexOptions,
- writingReadingLevelOptions,
-} from '../../constants/userInputOptions';
-import { setUser } from '../../state/user/userDuck';
-import { feedbackHelper } from '../../utils/url/feedbackHelpers';
-import { updateUserProfile } from '../../services/userService';
-import { I18nText } from '../I18n/I18nText';
-import { DeleteAccountModal } from '../Modal/DeleteAccountModal/DeleteAccountModal';
-import { ModalIntegration } from '../Modal/ModalIntegration';
-import { StyledStandardButton } from '../StandardButton/StandardButton';
-import { getPasswordChangeUrl } from '../../utils/url/urlFactory';
-import { Checkbox } from '../Checkbox/Checkbox';
-import { Select } from '../Select/Select';
-import { BirthDateInput } from '../Input/BirthDateInput/BirthDateInput';
-import { countries } from '../../constants/countries';
-import { Input } from '../Input/Input';
-import { emailPattern, namePattern, transcriptionPattern } from '../../utils/validation/validators';
-import { CUSTOM_ERROR_TRANSLATION_KEYS } from '../../utils/validation/validationMessages';
-import { userDataSelector } from '../../state/user/userSelectors';
-import { useI18nContext } from '../../context/I18nContext';
-
-export const UserProfile = () => {
- const history = useHistory();
- const { langCode } = useParams();
- const dispatch = useDispatch();
- const userData = useSelector(userDataSelector);
- const { i18n } = useI18nContext();
-
- const [isDeleteModalOpen, setDeleteModalOpen] = useState(false);
-
- const {
- register,
- handleSubmit,
- getValues,
- formState: { errors },
- } = useForm({
- mode: 'onSubmit',
- reValidateMode: 'onSubmit',
- });
-
- const additionalSelectInputs = [
- { name: 'contactLanguage', options: contactLanguageOptions, translationKeySuffix: '' },
- { name: 'profession', options: professionOptions },
- { name: 'languageLevel', options: languageLevelOptions },
- { name: 'writingReadingLevel', options: writingReadingLevelOptions },
- { name: 'handicap', options: handicapOptions },
- { name: 'learningType', options: learningTypeOptions },
- ];
-
- const checkboxInputs = [
- { name: 'teacher', translationKeySuffix: '.teacher' },
- { name: 'newsletter', translationKeySuffix: '.newsletter.subscribe' },
- { name: 'signalSoundDisabled', translationKeySuffix: '.signalSoundTurnOff' },
- ];
-
- const removeEmptySelectValues = data => {
- const cleanedData = { ...data };
- additionalSelectInputs.forEach(selectInputName => {
- const value = cleanedData[selectInputName.name];
- if (value === '') {
- // eslint-disable-next-line fp/no-delete
- delete cleanedData[selectInputName.name];
- }
- });
- return cleanedData;
- };
-
- const onSubmit = async data => {
- const cleanedData = removeEmptySelectValues(data);
- try {
- const updatedData = await updateUserProfile(cleanedData);
- dispatch(setUser(updatedData));
- updatedData.email !== getValues().email
- ? history.push(feedbackHelper.forMailChangeRequest(langCode))
- : history.push(feedbackHelper.forProfileUpdated(langCode));
- } catch (err) {
- history.push(feedbackHelper.getForErrorCode(err, langCode));
- }
- };
-
- const toggleDeleteAccountModal = () => {
- setDeleteModalOpen(!isDeleteModalOpen);
- };
-
- return (
-
- );
-};
diff --git a/sources-gen/config.jsx b/sources-gen/config.jsx
deleted file mode 100644
index 6964eb4..0000000
--- a/sources-gen/config.jsx
+++ /dev/null
@@ -1,29 +0,0 @@
-const process={
- env:{
-
- //REACT_APP_GRAPHQL_BASE_URL: "https://learngerman.dw.com/",
- //REACT_APP_GRAPHQL_BASE_URL: "https://sutty.vm:4002/graphql",
- REACT_APP_GRAPHQL_BASE_URL: null,
- REACT_APP_RECAPTCHA_SITEKEY: null,
- }
-}
-
-const config = {
- graphQL: {
- baseUrl: process.env.REACT_APP_GRAPHQL_BASE_URL || '/graphql',
- },
- dw: {
- baseUrl: 'https://www.dw.com',
- mobileUrl: 'https://m.dw.com',
- },
- reCaptcha: {
- siteKey: process.env.REACT_APP_RECAPTCHA_SITEKEY || '6Ld5YwUTAAAAAJnUx8sjEIS5VSJ94AdGcC0BfDXV',
- },
- // static urls used on download page. Will be replaced with webapi based solution (LG-719).
- download: {
- videoBaseUrl: 'https://tvdownloaddw-a.akamaihd.net/downloads/Events/mp4/',
- audioBaseUrl: 'https://radiodownloaddw-a.akamaihd.net/downloads/Events/dwelle/',
- },
-};
-
-export default config;
diff --git a/sources-gen/constants/countries.jsx b/sources-gen/constants/countries.jsx
deleted file mode 100644
index bd568dc..0000000
--- a/sources-gen/constants/countries.jsx
+++ /dev/null
@@ -1,245 +0,0 @@
-export const countries = [
- { value: 'AF', name: 'Afghanistan' },
- { value: 'AL', name: 'Albania' },
- { value: 'DZ', name: 'Algeria' },
- { value: 'AS', name: 'American Samoa' },
- { value: 'AD', name: 'Andorra' },
- { value: 'AO', name: 'Angola' },
- { value: 'AI', name: 'Anguilla' },
- { value: 'AQ', name: 'Antarctica' },
- { value: 'AG', name: 'Antigua and Barbuda' },
- { value: 'AR', name: 'Argentina' },
- { value: 'AM', name: 'Armenia' },
- { value: 'AW', name: 'Aruba' },
- { value: 'AU', name: 'Australia' },
- { value: 'AT', name: 'Austria' },
- { value: 'AZ', name: 'Azerbaijan' },
- { value: 'BS', name: 'Bahamas' },
- { value: 'BH', name: 'Bahrain' },
- { value: 'BD', name: 'Bangladesh' },
- { value: 'BB', name: 'Barbados' },
- { value: 'BY', name: 'Belarus' },
- { value: 'BE', name: 'Belgium' },
- { value: 'BZ', name: 'Belize' },
- { value: 'BJ', name: 'Benin' },
- { value: 'BM', name: 'Bermuda' },
- { value: 'BT', name: 'Bhutan' },
- { value: 'BO', name: 'Bolivia' },
- { value: 'BA', name: 'Bosnia and Herzegovina' },
- { value: 'BW', name: 'Botswana' },
- { value: 'BV', name: 'Bouvet Island' },
- { value: 'BR', name: 'Brazil' },
- { value: 'IO', name: 'British Indian Ocean Territory' },
- { value: 'BN', name: 'Brunei Darussalam' },
- { value: 'BG', name: 'Bulgaria' },
- { value: 'BF', name: 'Burkina Faso' },
- { value: 'BI', name: 'Burundi' },
- { value: 'CI', name: "Côte d'Ivoire" },
- { value: 'CV', name: 'Cabo Verde' },
- { value: 'KH', name: 'Cambodia' },
- { value: 'CM', name: 'Cameroon' },
- { value: 'CA', name: 'Canada' },
- { value: 'KY', name: 'Cayman Islands' },
- { value: 'CF', name: 'Central African Republic' },
- { value: 'TD', name: 'Chad' },
- { value: 'CL', name: 'Chile' },
- { value: 'CN', name: 'China' },
- { value: 'CX', name: 'Christmas Island' },
- { value: 'CC', name: 'Cocos Islands' },
- { value: 'CO', name: 'Colombia' },
- { value: 'KM', name: 'Comoros' },
- { value: 'CG', name: 'Congo' },
- { value: 'CK', name: 'Cook Islands' },
- { value: 'CR', name: 'Costa Rica' },
- { value: 'HR', name: 'Croatia' },
- { value: 'CU', name: 'Cuba' },
- { value: 'CY', name: 'Cyprus' },
- { value: 'CZ', name: 'Czech Republic' },
- { value: 'CD', name: 'Dem. Rep. of Congo' },
- { value: 'DK', name: 'Denmark' },
- { value: 'DJ', name: 'Djibouti' },
- { value: 'DM', name: 'Dominica' },
- { value: 'DO', name: 'Dominican Republic' },
- { value: 'EC', name: 'Ecuador' },
- { value: 'EG', name: 'Egypt' },
- { value: 'SV', name: 'El Salvador' },
- { value: 'GQ', name: 'Equatorial Guinea' },
- { value: 'ER', name: 'Eritrea' },
- { value: 'EE', name: 'Estonia' },
- { value: 'ET', name: 'Ethiopia' },
- { value: 'FK', name: 'Falkland Islands' },
- { value: 'FO', name: 'Faroe Islands' },
- { value: 'FJ', name: 'Fiji' },
- { value: 'FI', name: 'Finland' },
- { value: 'FR', name: 'France' },
- { value: 'GF', name: 'French Guyana' },
- { value: 'PF', name: 'French Polynesia' },
- { value: 'TF', name: 'French Southern and Antarctic Territories' },
- { value: 'GA', name: 'Gabon' },
- { value: 'GM', name: 'Gambia' },
- { value: 'GE', name: 'Georgia' },
- { value: 'DE', name: 'Germany' },
- { value: 'GH', name: 'Ghana' },
- { value: 'GI', name: 'Gibraltar' },
- { value: 'GB', name: 'Great Britain' },
- { value: 'GR', name: 'Greece' },
- { value: 'GL', name: 'Greenland' },
- { value: 'GD', name: 'Grenada' },
- { value: 'GP', name: 'Guadeloupe' },
- { value: 'GU', name: 'Guam' },
- { value: 'GT', name: 'Guatemala' },
- { value: 'GN', name: 'Guinea' },
- { value: 'GW', name: 'Guinea-Bissau' },
- { value: 'GY', name: 'Guyana' },
- { value: 'HT', name: 'Haiti' },
- { value: 'HM', name: 'Heard and the McDonald Islands' },
- { value: 'HN', name: 'Honduras' },
- { value: 'HK', name: 'Hong Kong' },
- { value: 'HU', name: 'Hungary' },
- { value: 'IS', name: 'Iceland' },
- { value: 'IN', name: 'India' },
- { value: 'ID', name: 'Indonesia' },
- { value: 'IR', name: 'Iran' },
- { value: 'IQ', name: 'Iraq' },
- { value: 'IE', name: 'Ireland' },
- { value: 'IL', name: 'Israel' },
- { value: 'IT', name: 'Italy' },
- { value: 'JM', name: 'Jamaica' },
- { value: 'JP', name: 'Japan' },
- { value: 'JO', name: 'Jordan' },
- { value: 'KZ', name: 'Kazakhstan' },
- { value: 'KE', name: 'Kenya' },
- { value: 'KI', name: 'Kiribati' },
- { value: 'KP', name: "Korea (Democratic People's Republic of)" },
- { value: 'KR', name: 'Korea (Republic)' },
- { value: 'KO', name: 'Kosovo' },
- { value: 'KW', name: 'Kuwait' },
- { value: 'KG', name: 'Kyrgyzstan' },
- { value: 'LA', name: 'Lao' },
- { value: 'LV', name: 'Latvia' },
- { value: 'LB', name: 'Lebanon' },
- { value: 'LS', name: 'Lesotho' },
- { value: 'LR', name: 'Liberia' },
- { value: 'LY', name: 'Libya' },
- { value: 'LI', name: 'Liechtenstein' },
- { value: 'LT', name: 'Lithuania' },
- { value: 'LU', name: 'Luxembourg' },
- { value: 'MO', name: 'Macau' },
- { value: 'MK', name: 'Macedonia' },
- { value: 'MG', name: 'Madagascar' },
- { value: 'MW', name: 'Malawi' },
- { value: 'MY', name: 'Malaysia' },
- { value: 'MV', name: 'Maldivian' },
- { value: 'ML', name: 'Mali' },
- { value: 'MT', name: 'Malta' },
- { value: 'MH', name: 'Marshall Islands' },
- { value: 'MQ', name: 'Martinique' },
- { value: 'MR', name: 'Mauritania' },
- { value: 'MU', name: 'Mauritius' },
- { value: 'YT', name: 'Mayotte' },
- { value: 'MX', name: 'Mexico' },
- { value: 'FM', name: 'Micronesia' },
- { value: 'MD', name: 'Moldova' },
- { value: 'MC', name: 'Monaco' },
- { value: 'MN', name: 'Mongolia' },
- { value: 'ME', name: 'Montenegro' },
- { value: 'MS', name: 'Montserrat' },
- { value: 'MA', name: 'Morocco' },
- { value: 'MZ', name: 'Mozambique' },
- { value: 'MM', name: 'Myanmar' },
- { value: 'NA', name: 'Namibia' },
- { value: 'NR', name: 'Nauru' },
- { value: 'NP', name: 'Nepal' },
- { value: 'NL', name: 'Netherlands' },
- { value: 'AN', name: 'Netherlands Antilles' },
- { value: 'NC', name: 'New Caledonia' },
- { value: 'NZ', name: 'New Zealand' },
- { value: 'NI', name: 'Nicaragua' },
- { value: 'NE', name: 'Niger' },
- { value: 'NG', name: 'Nigeria' },
- { value: 'NU', name: 'Niue' },
- { value: 'NF', name: 'Norfolk Island' },
- { value: 'MP', name: 'Northern Mariana Islands' },
- { value: 'NO', name: 'Norway' },
- { value: 'OM', name: 'Oman' },
- { value: 'PK', name: 'Pakistan' },
- { value: 'PW', name: 'Palau' },
- { value: 'PS', name: 'Palestine' },
- { value: 'PA', name: 'Panama' },
- { value: 'PG', name: 'Papua New Guinea' },
- { value: 'PY', name: 'Paraguay' },
- { value: 'PE', name: 'Peru' },
- { value: 'PH', name: 'Philippines' },
- { value: 'PN', name: 'Pitcairn' },
- { value: 'PL', name: 'Poland' },
- { value: 'PT', name: 'Portugal' },
- { value: 'PR', name: 'Puerto Rico' },
- { value: 'QA', name: 'Qatar' },
- { value: 'RE', name: 'Réunion' },
- { value: 'SS', name: 'Republic of South Sudan' },
- { value: 'RO', name: 'Romania' },
- { value: 'RU', name: 'Russia' },
- { value: 'RW', name: 'Rwanda' },
- { value: 'SH', name: 'Saint Helena' },
- { value: 'KN', name: 'Saint Kitts and Nevis' },
- { value: 'LC', name: 'Saint Lucia' },
- { value: 'VC', name: 'Saint Vincent & the Grenadines' },
- { value: 'WS', name: 'Samoa' },
- { value: 'SM', name: 'San Marino' },
- { value: 'ST', name: 'Sao Tomé and Principe' },
- { value: 'SA', name: 'Saudi Arabia' },
- { value: 'SN', name: 'Senegal' },
- { value: 'RS', name: 'Serbia' },
- { value: 'SC', name: 'Seychelles' },
- { value: 'SL', name: 'Sierra Leone' },
- { value: 'SG', name: 'Singapore' },
- { value: 'SK', name: 'Slovakia' },
- { value: 'SI', name: 'Slovenia' },
- { value: 'SB', name: 'Solomon Islands' },
- { value: 'SO', name: 'Somalia' },
- { value: 'ZA', name: 'South Africa' },
- { value: 'GS', name: 'South Georgia and the South Sandwich Islands' },
- { value: 'ES', name: 'Spain' },
- { value: 'LK', name: 'Sri Lanka' },
- { value: 'PM', name: 'St. Pierre and Miquelon' },
- { value: 'SD', name: 'Sudan' },
- { value: 'SR', name: 'Suriname' },
- { value: 'SJ', name: 'Svalbard and Jan Mayen' },
- { value: 'SZ', name: 'Swaziland' },
- { value: 'SE', name: 'Sweden' },
- { value: 'CH', name: 'Switzerland' },
- { value: 'SY', name: 'Syrian Arab Republic' },
- { value: 'TW', name: 'Taiwan, R.O.C.' },
- { value: 'TJ', name: 'Tajikistan' },
- { value: 'TZ', name: 'Tanzania' },
- { value: 'TH', name: 'Thailand' },
- { value: 'TL', name: 'Timor-Leste' },
- { value: 'TG', name: 'Togo' },
- { value: 'TK', name: 'Tokelau' },
- { value: 'TO', name: 'Tonga' },
- { value: 'TT', name: 'Trinidad & Tobago' },
- { value: 'TN', name: 'Tunisia' },
- { value: 'TR', name: 'Turkey' },
- { value: 'TM', name: 'Turkmenistan' },
- { value: 'TC', name: 'Turks and Caicos Islands' },
- { value: 'TV', name: 'Tuvalu' },
- { value: 'UG', name: 'Uganda' },
- { value: 'UA', name: 'Ukraine' },
- { value: 'AE', name: 'United Arab Emirates' },
- { value: 'UM', name: 'United States Minor Outlying Islands' },
- { value: 'US', name: 'United States of America' },
- { value: 'UY', name: 'Uruguay' },
- { value: 'UZ', name: 'Uzbekistan' },
- { value: 'VU', name: 'Vanuatu' },
- { value: 'VA', name: 'Vatican City' },
- { value: 'VE', name: 'Venezuela' },
- { value: 'VN', name: 'Viet Nam' },
- { value: 'VI', name: 'Virgin Islands' },
- { value: 'VG', name: 'Virgin Islands (brit.)' },
- { value: 'WF', name: 'Wallis and Futuna' },
- { value: 'EH', name: 'Western Sahara' },
- { value: 'YE', name: 'Yemen' },
- { value: 'ZM', name: 'Zambia' },
- { value: 'ZW', name: 'Zimbabwe' },
-];
-Object.freeze(countries);
diff --git a/sources-gen/constants/feedback.jsx b/sources-gen/constants/feedback.jsx
deleted file mode 100644
index efae2c9..0000000
--- a/sources-gen/constants/feedback.jsx
+++ /dev/null
@@ -1,55 +0,0 @@
-export const FEEDBACK_TYPES = {
- OTHER: 'OTHER',
- LOGIN: 'LOGIN',
- LOGIN_ERROR: 'LOGIN_ERROR',
- LOGIN_FB: 'LOGIN_FB',
- LOGOUT: 'LOGOUT',
- SESSION_TIMEOUT: 'SESSION_TIMEOUT',
- PROFILE_SERVICE_UNAVAILABLE: 'PROFILE_SERVICE_UNAVAILABLE',
- MISSING_USER_PROFILE: 'MISSING_USER_PROFILE',
- FORCED_LOGOUT: 'FORCED_LOGOUT',
- PASSWORD_CHANGED: 'PASSWORD_CHANGED',
- MAIL_CHANGED: 'MAIL_CHANGED',
- MAIL_CHANGE_REQUEST: 'MAIL_CHANGE_REQUEST',
- EMAIL_ALREADY_EXISTS: 'EMAIL_ALREADY_EXISTS',
- REGISTERED: 'REGISTERED',
- REGISTRATION_CONFIRMED: 'REGISTRATION_CONFIRMED',
- DELETED: 'DELETED',
- INVALID_TOKEN: 'INVALID_TOKEN',
- PASSWORD_RESET_REQUESTED: 'PASSWORD_RESET_REQUESTED',
- PASSWORD_RESET_SET: 'PASSWORD_RESET_SET',
- PASSWORD_CHANGE_WRONG_PASSWORD: 'PASSWORD_CHANGE_WRONG_PASSWORD',
- PROFILE_UPDATED: 'PROFILE_UPDATED',
- PASSWORD_CHANGE: 'PASSWORD_CHANGE_',
- INVALID_CERTIFICATE: 'INVALID_CERTIFICATE',
- VOCABULARY_TRAINER_UNAVAILABLE: 'VOCABULARY_TRAINER_UNAVAILABLE',
- VOCABULARY_TRAINER_NO_VOCABULARIES: 'VOCABULARY_TRAINER_NO_VOCABULARIES',
- CERTIFICATE_NO_TRANSCRIPTION: 'CERTIFICATE_NO_TRANSCRIPTION',
- MISSING_TRANSCRIPTION: 'MISSING_TRANSCRIPTION',
- USER_ALREADY_EXISTS: 'USER_ALREADY_EXISTS',
- USER_ALREADY_CONFIRMED: 'USER_ALREADY_CONFIRMED',
-};
-
-export const TYPES_WITH_PROFILE_PAGE_AS_TARGET = [
- FEEDBACK_TYPES.PASSWORD_CHANGE_WRONG_PASSWORD,
- FEEDBACK_TYPES.PASSWORD_CHANGED,
- FEEDBACK_TYPES.EMAIL_ALREADY_EXISTS,
- FEEDBACK_TYPES.PROFILE_UPDATED,
- FEEDBACK_TYPES.CERTIFICATE_NO_TRANSCRIPTION,
-];
-
-export const TYPES_WITH_HOME_PAGE_AS_TARGET = [
- FEEDBACK_TYPES.OTHER,
- FEEDBACK_TYPES.MAIL_CHANGED,
- FEEDBACK_TYPES.MAIL_CHANGE_REQUEST,
- FEEDBACK_TYPES.REGISTERED,
- FEEDBACK_TYPES.REGISTRATION_CONFIRMED,
- FEEDBACK_TYPES.PASSWORD_RESET_REQUESTED,
- FEEDBACK_TYPES.PASSWORD_RESET_SET,
- FEEDBACK_TYPES.USER_ALREADY_EXISTS,
-];
-
-export const COMMON_FEEDBACK_TRANSLATION_KEYS = {
- TITLE: 'common.feedback',
- OK_BUTTON: 'common.ok',
-};
diff --git a/sources-gen/constants/grammarOverviewColors.jsx b/sources-gen/constants/grammarOverviewColors.jsx
deleted file mode 100644
index 9c2b15c..0000000
--- a/sources-gen/constants/grammarOverviewColors.jsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { colors } from '../utils/css';
-
-export const grammarOverviewColors = [
- `${colors.LG_GREEN_YELLOW}`,
- `${colors.DW_LIGHT_BLUE}`,
- `${colors.LG_ORANGE}`,
- `${colors.LG_RED}`,
- `${colors.LG_GREEN_YELLOW}`,
- `${colors.LG_PINK}`,
- `${colors.LG_ORANGE_DARK}`,
- `${colors.LG_ORANGE}`,
- `${colors.LG_RED_DARK}`,
- `${colors.DW_LIGHT_BLUE}`,
- `${colors.LG_GREEN}`,
- `${colors.LG_ORANGE}`,
-];
diff --git a/sources-gen/constants/inquiryMediaTypes.jsx b/sources-gen/constants/inquiryMediaTypes.jsx
deleted file mode 100644
index e1bd0ee..0000000
--- a/sources-gen/constants/inquiryMediaTypes.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-export const INQUIRY_MEDIA_TYPE = Object.freeze({
- TEXT: 'TEXT',
- IMAGE: 'IMAGE',
- AUDIO: 'AUDIO',
- VIDEO: 'VIDEO',
-});
diff --git a/sources-gen/constants/isLtrContentOnly.jsx b/sources-gen/constants/isLtrContentOnly.jsx
deleted file mode 100644
index 212892c..0000000
--- a/sources-gen/constants/isLtrContentOnly.jsx
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Represents Courses that are delivered in one Content Language typically German.
- * @constructor
- * @param {array} 36519718 - B1 Nicos Weg
- * @param {array} 39902336 - B1 Deutsch im Job – Profis gesucht
- * @param {array} 53437698 - B1 Jojo sucht das Glück
- * @param {array} 53074503 - Das Deutschlandlabor
- * @param {array} 55320903 - Ticket nach Berlin
- * @param {array} 54554235 - Das Bandtagebuch mit Einshoch6
- */
-export const MONOLINGUAL_COURSES_IDS = Object.freeze([
- '36519718',
- '39902336',
- '53437698',
- '53074503',
- '54554235',
-]);
-
-export const isMonolingualCourse = courseId => MONOLINGUAL_COURSES_IDS.includes(courseId);
diff --git a/sources-gen/constants/keyCodes.jsx b/sources-gen/constants/keyCodes.jsx
deleted file mode 100644
index 0446f6b..0000000
--- a/sources-gen/constants/keyCodes.jsx
+++ /dev/null
@@ -1,14 +0,0 @@
-export const KEY_ARROW_UP = 38;
-export const KEY_ARROW_DOWN = 40;
-export const KEY_ENTER = 13;
-export const KEY_ESCAPE = 27;
-export const KEY_BACKSPACE = 8;
-
-export const keyCodes = Object.freeze({
- TAB: 'Tab',
- ENTER: 'Enter',
- SPACEBAR: ' ',
- ARROW_LEFT: 'ArrowLeft',
- ARROW_RIGHT: 'ArrowRight',
- ESCAPE: 'Escape',
-});
diff --git a/sources-gen/constants/lessonParts.jsx b/sources-gen/constants/lessonParts.jsx
deleted file mode 100644
index 54937b1..0000000
--- a/sources-gen/constants/lessonParts.jsx
+++ /dev/null
@@ -1,9 +0,0 @@
-export const LESSON_PARTS = Object.freeze({
- EXERCISE: 'EXERCISE',
- GRAMMAR: 'GRAMMAR',
- VOCABULARY_GLOSSARY: 'VOCABULARY_GLOSSARY',
- REGIONAL_STUDIES: 'REGIONAL_STUDIES',
- PHONEMIC_CHART: 'PHONEMIC_CHART',
- MANUSCRIPT: 'MANUSCRIPT',
- DOWNLOAD: 'DOWNLOAD',
-});
diff --git a/sources-gen/constants/marks.jsx b/sources-gen/constants/marks.jsx
deleted file mode 100644
index f31b516..0000000
--- a/sources-gen/constants/marks.jsx
+++ /dev/null
@@ -1,5 +0,0 @@
-export const MARKS = Object.freeze({
- GOOD: 80,
- MEDIUM: 60,
- BAD: 40,
-});
diff --git a/sources-gen/constants/menuLanguageCodes.jsx b/sources-gen/constants/menuLanguageCodes.jsx
deleted file mode 100644
index eeff731..0000000
--- a/sources-gen/constants/menuLanguageCodes.jsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { LANG_CODES } from '../utils/mappers/langMapper';
-
-const CHINESE_SIMP_POSTFIX = '_simp';
-const CHINESE_TRAD_POSTFIX = '_trad';
-
-export const CHINESE_SIMP_TRANSLATION_KEY = `${LANG_CODES.CHINESE}${CHINESE_SIMP_POSTFIX}`;
-export const CHINESE_TRAD_TRANSLATION_KEY = `${LANG_CODES.CHINESE}${CHINESE_TRAD_POSTFIX}`;
-
-export const MENU_LANGUAGES = [
- { translationKey: LANG_CODES.GERMAN, langCode: LANG_CODES.GERMAN },
- { translationKey: LANG_CODES.ENGLISH, langCode: LANG_CODES.ENGLISH },
- { translationKey: LANG_CODES.ARABIC, langCode: LANG_CODES.ARABIC },
- { translationKey: LANG_CODES.RUSSIAN, langCode: LANG_CODES.RUSSIAN },
- { translationKey: LANG_CODES.PERSIAN, langCode: LANG_CODES.PERSIAN },
- { translationKey: LANG_CODES.SPANISH, langCode: LANG_CODES.SPANISH },
- { translationKey: LANG_CODES.PORTUGUESE_BRAZIL, langCode: LANG_CODES.PORTUGUESE_BRAZIL },
- { translationKey: LANG_CODES.POLISH, langCode: LANG_CODES.POLISH },
- { translationKey: LANG_CODES.FRENCH, langCode: LANG_CODES.FRENCH },
- { translationKey: CHINESE_SIMP_TRANSLATION_KEY, langCode: LANG_CODES.CHINESE },
- { translationKey: CHINESE_TRAD_TRANSLATION_KEY, langCode: LANG_CODES.CHINESE },
- { translationKey: LANG_CODES.TURKISH, langCode: LANG_CODES.TURKISH },
-];
diff --git a/sources-gen/constants/pageTypes.jsx b/sources-gen/constants/pageTypes.jsx
deleted file mode 100644
index 912e232..0000000
--- a/sources-gen/constants/pageTypes.jsx
+++ /dev/null
@@ -1,44 +0,0 @@
-export const PAGE_TYPES = Object.freeze({
- HELP: 'HELP',
- VOCABULARY: 'VOCABULARY',
- ALPHABETICAL_ORDER: 'ALPHABETICAL_ORDER',
- LEGAL: 'LEGAL',
- OVERVIEW: 'OVERVIEW',
- COURSE: 'COURSE',
- LESSON: 'LESSON',
- EXERCISE: 'EXERCISE',
- LESSON_EXERCISE_RESULT: 'LESSON_EXERCISE_RESULT',
- LESSON_SUMMARY: 'LESSON_SUMMARY',
- GRAMMAR: 'GRAMMAR',
- GRAMMAR_DETAIL: 'GRAMMAR_DETAIL',
- GRAMMAR_OVERVIEW: 'GRAMMAR_OVERVIEW',
- VOCABULARY_OVERVIEW: 'VOCABULARY_OVERVIEW',
- REGIONAL_STUDIES: 'REGIONAL_STUDIES',
- PLACEMENT_TEST: 'PLACEMENT_TEST',
- FINAL_TEST: 'FINAL_TEST',
- MANUSCRIPT: 'MANUSCRIPT',
- USER_PROFILE: 'USER_PROFILE',
- PASSWORD_CHANGE: 'PASSWORD_CHANGE',
- PASSWORD_RESET: 'PASSWORD_RESET',
- PASSWORD_SET: 'PASSWORD_SET',
- REGISTER_USER: 'REGISTER_USER',
- FEEDBACK_STATUS: 'FEEDBACK_STATUS',
- EXTRAS: 'EXTRAS',
- PLACEMENT_DASHBOARD: 'PLACEMENT_DASHBOARD',
- VOCABULARY_TRAINER: 'VOCABULARY_TRAINER',
- NOT_FOUND_PAGE: 'NOT_FOUND',
-});
-
-export const GTM_NO_CONTENT_PAGE_IDS = Object.freeze({
- [PAGE_TYPES.OVERVIEW]: 5001,
- [PAGE_TYPES.GRAMMAR_OVERVIEW]: 5002,
- [PAGE_TYPES.VOCABULARY_OVERVIEW]: 5003,
- [PAGE_TYPES.VOCABULARY_TRAINER]: 5004,
- [PAGE_TYPES.REGISTER_USER]: 5005,
- [PAGE_TYPES.USER_PROFILE]: 5006,
- [PAGE_TYPES.PASSWORD_CHANGE]: 5007,
- [PAGE_TYPES.PASSWORD_RESET]: 5008,
- [PAGE_TYPES.PASSWORD_SET]: 5009,
- [PAGE_TYPES.FEEDBACK_STATUS]: 5010,
- [PAGE_TYPES.NOT_FOUND_PAGE]: 5011,
-});
diff --git a/sources-gen/constants/services.jsx b/sources-gen/constants/services.jsx
deleted file mode 100644
index 160305e..0000000
--- a/sources-gen/constants/services.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export const JSON_CONTENT_TYPE = 'application/json';
-
-export const BASIC_JSON_CONTENT_TYPE_HEADER = {
- headers: {
- 'Content-Type': JSON_CONTENT_TYPE,
- },
-};
diff --git a/sources-gen/constants/tileColors.jsx b/sources-gen/constants/tileColors.jsx
deleted file mode 100644
index 700f2a8..0000000
--- a/sources-gen/constants/tileColors.jsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { colors } from '../utils/css';
-
-export const tileColors = [
- `${colors.LG_ORANGE}`,
- `${colors.LG_ORANGE_DARK}`,
- `${colors.LG_PINK}`,
- `${colors.LG_RED}`,
- `${colors.LG_GREEN_LIGHT}`,
- `${colors.LG_GREEN}`,
- `${colors.DW_LIGHT_BLUE}`,
- `${colors.LG_BLUE_5}`,
-];
diff --git a/sources-gen/constants/userInputOptions.jsx b/sources-gen/constants/userInputOptions.jsx
deleted file mode 100644
index 2278adf..0000000
--- a/sources-gen/constants/userInputOptions.jsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import { LANG_CODES } from '../utils/mappers/langMapper';
-
-export const contactLanguageOptions = Object.freeze([
- { value: LANG_CODES.GERMAN, name: 'German' },
- { value: LANG_CODES.ENGLISH, name: 'English' },
- { value: LANG_CODES.ARABIC, name: 'Arabic' },
- { value: LANG_CODES.RUSSIAN, name: 'Russian' },
- { value: 'fa', name: 'Persian' },
- { value: LANG_CODES.SPANISH, name: 'Spanish' },
-]);
-
-const profileEditKeyPath = 'profile.edit';
-const professionKeyPath = `${profileEditKeyPath}.profession`;
-export const sexOptions = Object.freeze([
- { value: 'FEMALE', key: `${profileEditKeyPath}.sex.female` },
- { value: 'MALE', key: `${profileEditKeyPath}.sex.male` },
- { value: 'OTHER', key: `${profileEditKeyPath}.sex.other` },
-]);
-
-export const professionOptions = Object.freeze([
- { value: 'ZFA_TEACHER', key: `${professionKeyPath}.zfa_teacher` },
- { value: 'PRIVATE_TEACHER', key: `${professionKeyPath}.private_teacher` },
- { value: 'INSTITUTE_MANAGER', key: `${professionKeyPath}.institute_manager` },
- { value: 'INSTITUTE_EMPLOYEE', key: `${professionKeyPath}.institute_employee` },
- { value: 'OTHER', key: `${professionKeyPath}.other` },
-]);
-
-const languageLevelKeyPath = `${profileEditKeyPath}.languageLevel`;
-export const languageLevelOptions = Object.freeze([
- { value: 'ZERO', key: `${languageLevelKeyPath}.zero` },
- { value: 'BEGINNER', key: `${languageLevelKeyPath}.beginner` },
- { value: 'INTERMEDIATE', key: `${languageLevelKeyPath}.intermediate` },
- { value: 'EXPERT', key: `${languageLevelKeyPath}.expert` },
-]);
-
-const writingReadingLevelKeyPath = `${profileEditKeyPath}.writingReadingLevel`;
-export const writingReadingLevelOptions = Object.freeze([
- { value: 'ZERO', key: `${writingReadingLevelKeyPath}.zero` },
- { value: 'NOT_LATIN', key: `${writingReadingLevelKeyPath}.not_latin` },
- { value: 'UNCERTAIN', key: `${writingReadingLevelKeyPath}.uncertain` },
- { value: 'CAN', key: `${writingReadingLevelKeyPath}.can` },
-]);
-
-const handicapKeyPath = `${profileEditKeyPath}.handicap`;
-export const handicapOptions = Object.freeze([
- {
- value: 'BLIND',
- key: `${handicapKeyPath}.blind.title`,
- ariaKey: `${handicapKeyPath}.blind.aria`,
- },
- {
- value: 'POOR_EYESIGHT',
- key: `${handicapKeyPath}.poor_eyesight.title`,
- ariaKey: `${handicapKeyPath}.blind.aria`,
- },
- {
- value: 'WEAK_HEARING',
- key: `${handicapKeyPath}.weak_hearing.title`,
- ariaKey: `${handicapKeyPath}.blind.aria`,
- },
- {
- value: 'MOUSE_USAGE',
- key: `${handicapKeyPath}.mouse_usage.title`,
- ariaKey: `${handicapKeyPath}.blind.aria`,
- },
-]);
-
-const learningTypeKeyPath = `${profileEditKeyPath}.learningType`;
-export const learningTypeOptions = Object.freeze([
- { value: 'MUSIC', key: `${learningTypeKeyPath}.music` },
- { value: 'AUDIO', key: `${learningTypeKeyPath}.audio` },
- { value: 'AUTHENTIC_TEXT', key: `${learningTypeKeyPath}.authentic_text` },
-]);
diff --git a/sources-gen/constants/userUrl.jsx b/sources-gen/constants/userUrl.jsx
deleted file mode 100644
index fa10653..0000000
--- a/sources-gen/constants/userUrl.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { isServer } from '../utils/ssr';
-
-const domainWithProtocol = isServer() ? '' : window.location.origin;
-
-export const USER = {
- AS_URL: '/auth/',
- AS_URL_WITH_DOMAIN: `${domainWithProtocol}/auth/`,
- PS_URL: `${domainWithProtocol}/profiles/`,
- LOGGED_USER_RESOURCE: `${domainWithProtocol}/profiles/protected/user`,
- TICKET_PARAM_NAME: 'ticket',
-};
diff --git a/sources-gen/context/AudioContext.jsx b/sources-gen/context/AudioContext.jsx
deleted file mode 100644
index c6fec54..0000000
--- a/sources-gen/context/AudioContext.jsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { createContext, useRef, useState } from 'react';
-import { LessonExerciseSoundFailureHiddenAudio } from '../components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseSoundFailureHiddenAudio';
-import { LessonExerciseSoundSuccessHiddenAudio } from '../components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseSoundSuccessHiddenAudio';
-
-export const AudioContext = createContext([{}, () => {}, {}, {}]);
-
-export const AudioProvider = props => {
- const [questionAudiosRefArray, setQuestionAudiosRefArray] = useState([]);
- const wrongAnswerAudioRef = useRef();
- const correctAnswerAudioRef = useRef();
-
- return (
-
-
-
- {props.children}
-
- );
-};
diff --git a/sources-gen/context/GlobalsContext.jsx b/sources-gen/context/GlobalsContext.jsx
deleted file mode 100644
index 5dc71c2..0000000
--- a/sources-gen/context/GlobalsContext.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import { createContext, useContext } from 'react';
-import globals from '../utils/globals';
-
-export const GlobalsContext = createContext(globals);
-
-export const useGlobalsContext = () => useContext(GlobalsContext);
diff --git a/sources-gen/context/I18nContext.jsx b/sources-gen/context/I18nContext.jsx
deleted file mode 100644
index 7d27f12..0000000
--- a/sources-gen/context/I18nContext.jsx
+++ /dev/null
@@ -1,8 +0,0 @@
-import { createContext, useContext } from 'react';
-import { t, clearTranslations, hasTranslations } from '../utils/i18n';
-
-const i18n = { t, clearTranslations, hasTranslations };
-
-export const I18nContext = createContext({ i18n });
-
-export const useI18nContext = () => useContext(I18nContext);
diff --git a/sources-gen/context/rtlContext.jsx b/sources-gen/context/rtlContext.jsx
deleted file mode 100644
index 2cc22d9..0000000
--- a/sources-gen/context/rtlContext.jsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { createContext, useState } from 'react';
-
-/**
- * @deprecated since we use StylisRTLPlugin in MainPage we should not need to distinguish between
- * ltr/rtl in components because it's managed globally. This context still exists for old copy&paste
- * components because it has not been removed yet. The isRtl result of this provider is now always
- * undefined because the value is not set anymore.
- */
-export const RtlContext = createContext({});
-
-export const RtlProvider = props => {
- const { initialIsRtl = false, children } = props;
-
- const [isRtl, setIsRtlValue] = useState(initialIsRtl);
- const setIsRtl = isRtlValue => setIsRtlValue(isRtlValue);
-
- const isRtlContext = {
- isRtl,
- setIsRtl,
- };
-
- return {children} ;
-};
diff --git a/sources-gen/dist/assets/VjsDurationInfoBar.bf4a69ea.js b/sources-gen/dist/assets/VjsDurationInfoBar.bf4a69ea.js
deleted file mode 100644
index 7e280b2..0000000
--- a/sources-gen/dist/assets/VjsDurationInfoBar.bf4a69ea.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import{s as r,j as e,R as a}from"./vendor.5e871953.js";import{v as d}from"./video.es.046d6735.js";import{c as m,S as l}from"./index.962b7ca8.js";const c=({className:o,videoDuration:t})=>e("div",{className:o,children:e("div",{className:"vjs-duration-text",children:e(l,{children:t})})}),p=r(c)`
- /* @noflip */
- direction: ltr;
- position: absolute;
- height: 100px;
- bottom: 0;
- width: 100%;
- z-index: 1;
- display: flex;
- align-items: flex-end;
- background: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.9));
- color: ${m.LG_GRAY_12};
-
- .vjs-duration-text {
- position: relative;
- left: 65px;
- font-size: 1.6rem;
- height: 50px;
- display: flex;
- align-items: center;
-
- & > span {
- font-size: 1.6rem;
- line-height: 0.156rem;
- letter-spacing: 0.05rem;
- }
- }
-
- @media (min-width: 992px) {
- .vjs-duration-text {
- height: 60px;
- left: 75px;
- }
- }
-`,h="VjsDurationInfoBar",i=d.getComponent("Component");class x extends i{constructor(t,n){super(t,n);this.mount=this.mount.bind(this);const s=t.el().getAttribute("data-duration");t.ready(()=>{this.mount({videoDuration:s})}),t.on("play",()=>{this.hide()})}mount({videoDuration:t}){a.render(e(p,{videoDuration:t}),this.el())}}i.registerComponent(h,x);export{x as VjsDurationInfoBar,h as durationBarComponentName};
-//# sourceMappingURL=VjsDurationInfoBar.bf4a69ea.js.map
diff --git a/sources-gen/dist/assets/VjsDurationInfoBar.bf4a69ea.js.map b/sources-gen/dist/assets/VjsDurationInfoBar.bf4a69ea.js.map
deleted file mode 100644
index 341389c..0000000
--- a/sources-gen/dist/assets/VjsDurationInfoBar.bf4a69ea.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"VjsDurationInfoBar.bf4a69ea.js","sources":["../../components/MediaInput/MediaInputVideo/CustomPlayerComponents/InfoBar/InfoBar.jsx","../../components/MediaInput/MediaInputVideo/CustomPlayerComponents/InfoBar/VjsDurationInfoBar.jsx"],"sourcesContent":["import styled from 'styled-components';\nimport { colors } from '../../../../../utils/css';\nimport { StyledTextGray12 as Text } from '../../../../Text/Text';\n\nexport const InfoBar = ({ className, videoDuration }) => (\n \n
\n {videoDuration} \n
\n
\n);\n\nexport const StyledInfoBar = styled(InfoBar)`\n /* @noflip */\n direction: ltr;\n position: absolute;\n height: 100px;\n bottom: 0;\n width: 100%;\n z-index: 1;\n display: flex;\n align-items: flex-end;\n background: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.9));\n color: ${colors.LG_GRAY_12};\n\n .vjs-duration-text {\n position: relative;\n left: 65px;\n font-size: 1.6rem;\n height: 50px;\n display: flex;\n align-items: center;\n\n & > span {\n font-size: 1.6rem;\n line-height: 0.156rem;\n letter-spacing: 0.05rem;\n }\n }\n\n @media (min-width: 992px) {\n .vjs-duration-text {\n height: 60px;\n left: 75px;\n }\n }\n`;\n","import ReactDOM from 'react-dom';\nimport videojsDefault from 'video.js';\nimport { StyledInfoBar as InfoBar } from './InfoBar';\n\nexport const durationBarComponentName = 'VjsDurationInfoBar';\n\nconst vjsComponent = videojsDefault.getComponent('Component');\n\nexport class VjsDurationInfoBar extends vjsComponent {\n constructor(player, options) {\n super(player, options);\n this.mount = this.mount.bind(this);\n\n const videoDuration = player.el().getAttribute('data-duration');\n\n player.ready(() => {\n this.mount({ videoDuration });\n });\n\n player.on('play', () => {\n this.hide();\n });\n }\n\n mount({ videoDuration }) {\n ReactDOM.render( , this.el());\n }\n}\n\nvjsComponent.registerComponent(durationBarComponentName, VjsDurationInfoBar);\n"],"names":["InfoBar","className","videoDuration","Text","StyledInfoBar","styled","colors","LG_GRAY_12","durationBarComponentName","vjsComponent","videojsDefault","getComponent","constructor","player","options","mount","bind","el","getAttribute","ready","on","hide","render","registerComponent","VjsDurationInfoBar"],"mappings":"sJAIaA,GAAU,CAAC,CAAEC,YAAWC,4BAC9B,8BACE,UAAU,+BACZC,YAAMD,QAKAE,EAAgBC,EAAOL;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,WAWzBM,EAAOC;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,ECnBLC,EAA2B,qBAElCC,EAAeC,EAAeC,aAAa,4BAETF,EAAa,CACnDG,YAAYC,EAAQC,EAAS,OACrBD,EAAQC,QACTC,MAAQ,KAAKA,MAAMC,KAAK,WAEvBd,GAAgBW,EAAOI,KAAKC,aAAa,mBAExCC,MAAM,IAAM,MACZJ,MAAM,CAAEb,sBAGRkB,GAAG,OAAQ,IAAM,MACjBC,SAITN,MAAM,CAAEb,iBAAiB,GACdoB,SAAQtB,GAAQ,kBAAkC,KAAKiB,OAIpER,EAAac,kBAAkBf,EAA0BgB"}
\ No newline at end of file
diff --git a/sources-gen/dist/assets/VjsPlayButton.12b55f32.js b/sources-gen/dist/assets/VjsPlayButton.12b55f32.js
deleted file mode 100644
index a3f2f67..0000000
--- a/sources-gen/dist/assets/VjsPlayButton.12b55f32.js
+++ /dev/null
@@ -1,115 +0,0 @@
-var E=Object.defineProperty,P=Object.defineProperties;var A=Object.getOwnPropertyDescriptors;var d=Object.getOwnPropertySymbols;var w=Object.prototype.hasOwnProperty,_=Object.prototype.propertyIsEnumerable;var $=(t,e,o)=>e in t?E(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,c=(t,e)=>{for(var o in e||(e={}))w.call(e,o)&&$(t,o,e[o]);if(d)for(var o of d(e))_.call(e,o)&&$(t,o,e[o]);return t},u=(t,e)=>P(t,A(e));var y=(t,e)=>{var o={};for(var n in t)w.call(t,n)&&e.indexOf(n)<0&&(o[n]=t[n]);if(t!=null&&d)for(var n of d(t))e.indexOf(n)<0&&_.call(t,n)&&(o[n]=t[n]);return o};import{s as m,C as R,j as l,c as T,r as p,R as C}from"./vendor.5e871953.js";import{v as O}from"./video.es.046d6735.js";import{m as I,s as g,c as i,a as W,n as j,k as h,u as D}from"./index.962b7ca8.js";const S=Z=>{var x=Z,{variant:t,className:e,isA:o="div",onClick:n=j,onKeyDown:r=j,children:a,disabled:b,"aria-hidden":f,tabIndex:L=b||f?-1:0}=x,k=y(x,["variant","className","isA","onClick","onKeyDown","children","disabled","aria-hidden","tabIndex"]);return l(o,u(c({className:T(e,t),role:"button",tabIndex:L,disabled:b,"aria-hidden":f,onClick:n,onKeyDown:s=>{r(s),(s.key===h.ENTER||s.key===h.SPACEBAR)&&(s.key===h.SPACEBAR&&s.preventDefault(),n())}},k),{children:a}))},F=t=>`
- box-shadow: 0 0 0 2px ${t} inset;
- text-decoration: none;
-`,B=({cssSelector:t="",color:e=i.DW_BLUE}={})=>R`
- ${I.mouse`
- &:hover${t} {
- ${F(e)}
- }
- `}
-`,Y=m(S)`
- display: block;
- border: none;
- padding: 0;
- background: none;
- cursor: pointer;
- outline: none;
- ${B()}
-
- &:disabled,
- &${g.disabled} {
- cursor: default;
- }
-
- &${g.disabled} {
- pointer-events: none;
- }
-
- &.primary,
- &.secondary,
- &.tertiary {
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 0 30px;
- height: 48px;
- width: 100%;
- overflow: hidden;
- font-size: 1.4rem;
- word-break: break-word;
- color: ${i.DW_BLUE};
-
- svg {
- fill: ${i.DW_BLUE};
- }
-
- & > * {
- letter-spacing: 0.04rem;
- font-weight: bold;
- }
-
- &:active {
- background-color: ${i.LG_GRAY_13};
- color: ${i.LG_WHITE};
- box-shadow: none;
-
- svg {
- fill: ${i.LG_WHITE};
- }
- }
-
- &:disabled,
- &${g.disabled} {
- text-decoration: line-through;
- background-color: ${i.LG_GRAY_2};
- color: ${i.LG_GRAY_11};
- box-shadow: none;
-
- svg {
- fill: ${i.LG_GRAY_7};
- }
- }
- }
-
- &.primary {
- background-color: ${i.DW_LIGHT_BLUE};
- }
-
- &.secondary {
- background-color: ${i.LG_GRAY_3};
- }
-
- &.tertiary {
- box-shadow: inset 0px 0px 0px 1px ${i.LG_GRAY_6};
- ${B()}
- }
-
- ${W.mobile`
- &.primary, &.secondary, &.tertiary {
- width: fit-content;
- margin-left: auto;
- margin-right: auto;
- }
- `}
-`;function v(){return v=Object.assign||function(t){for(var e=1;e=0)&&(!Object.prototype.propertyIsEnumerable.call(t,n)||(o[n]=t[n]))}return o}function U(t,e){if(t==null)return{};var o={},n=Object.keys(t),r,a;for(a=0;a=0)&&(o[r]=t[r]);return o}var z=p.exports.createElement("path",{stroke:"#FFF",d:"M3 .467v18.999l16-9.499z"});function M(t,e){var o=t.title,n=t.titleId,r=H(t,["title","titleId"]);return p.exports.createElement("svg",v({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",ref:e,"aria-labelledby":n},r),o?p.exports.createElement("title",{id:n},o):null,z)}var N=p.exports.forwardRef(M);const V=m(t=>l(N,c({},t)))``,q=({player:t})=>t.isAudio()?"audio":"video",K="vjsBigPlayButton",G=O.getComponent("Component"),J=n=>{var r=n,{className:t,playerType:e}=r,o=y(r,["className","playerType"]);const a=D("common.avplayer.button.play");return l(Y,u(c({className:t,title:a},o),{children:l(V,{})}))},Q=m(J)`
- position: absolute;
- bottom: 0;
- z-index: 2;
- background-color: ${i.DW_LIGHT_BLUE};
- padding: 15px;
-
- svg {
- fill: ${i.LG_WHITE};
- width: 20px;
- height: 20px;
- }
-
- @media (min-width: 992px) {
- padding: 18px;
- svg {
- width: 24px;
- height: 24px;
- }
- }
-`;class X extends G{constructor(e,o){super(e,o);this.mount=this.mount.bind(this),e.ready(()=>{this.mount({onClick:()=>e.play(),playerType:q({player:e})})}),e.on("play",()=>{e.el().querySelector(".vjs-play-control").focus(),this.hide()})}mount({onClick:e,playerType:o}){C.render(l(Q,{onClick:e,playerType:o}),this.el())}}G.registerComponent(K,X);export{X as VjsBigPlayButton,K as videoPlayButtonComponentName};
-//# sourceMappingURL=VjsPlayButton.12b55f32.js.map
diff --git a/sources-gen/dist/assets/VjsPlayButton.12b55f32.js.map b/sources-gen/dist/assets/VjsPlayButton.12b55f32.js.map
deleted file mode 100644
index 6b8dbb7..0000000
--- a/sources-gen/dist/assets/VjsPlayButton.12b55f32.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"VjsPlayButton.12b55f32.js","sources":["../../components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/Button.jsx","../../components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/play.svg.js","../../components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/Play.jsx","../../components/MediaInput/MediaInputVideo/CustomPlayerComponents/vjsComponentUtils.jsx","../../components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/VjsPlayButton.jsx"],"sourcesContent":["import classnames from 'classnames';\nimport styled, { css } from 'styled-components';\nimport { noop } from '../../../../../utils/commons';\nimport { mediaMin, colors, selector, mediaDevice } from '../../../../../utils/css';\nimport { keyCodes } from '../../../../../constants/keyCodes';\n\n// This button is the DefaultButton in ROAD. We used it as base for the VJS big play button.\nexport const Button = ({\n variant,\n className,\n isA = 'div',\n onClick = noop,\n onKeyDown = noop,\n children,\n disabled,\n 'aria-hidden': ariaHidden,\n tabIndex = disabled || ariaHidden ? -1 : 0,\n ...restProps\n}) => {\n const Tag = isA;\n\n return (\n {\n onKeyDown(e);\n if (e.key === keyCodes.ENTER || e.key === keyCodes.SPACEBAR) {\n e.key === keyCodes.SPACEBAR && e.preventDefault();\n onClick();\n }\n }}\n {...restProps}\n >\n {children}\n \n );\n};\n\nconst commonHoverAndFocusCss = color => `\n box-shadow: 0 0 0 2px ${color} inset;\n text-decoration: none;\n`;\n\nexport const hoverAndFocusCss = ({ cssSelector = '', color = colors.DW_BLUE } = {}) => css`\n ${mediaDevice.mouse`\n &:hover${cssSelector} {\n ${commonHoverAndFocusCss(color)}\n }\n `}\n`;\n\nexport const StyledButton = styled(Button)`\n display: block;\n border: none;\n padding: 0;\n background: none;\n cursor: pointer;\n outline: none;\n ${hoverAndFocusCss()}\n\n &:disabled,\n &${selector.disabled} {\n cursor: default;\n }\n\n &${selector.disabled} {\n pointer-events: none;\n }\n\n &.primary,\n &.secondary,\n &.tertiary {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 30px;\n height: 48px;\n width: 100%;\n overflow: hidden;\n font-size: 1.4rem;\n word-break: break-word;\n color: ${colors.DW_BLUE};\n\n svg {\n fill: ${colors.DW_BLUE};\n }\n\n & > * {\n letter-spacing: 0.04rem;\n font-weight: bold;\n }\n\n &:active {\n background-color: ${colors.LG_GRAY_13};\n color: ${colors.LG_WHITE};\n box-shadow: none;\n\n svg {\n fill: ${colors.LG_WHITE};\n }\n }\n\n &:disabled,\n &${selector.disabled} {\n text-decoration: line-through;\n background-color: ${colors.LG_GRAY_2};\n color: ${colors.LG_GRAY_11};\n box-shadow: none;\n\n svg {\n fill: ${colors.LG_GRAY_7};\n }\n }\n }\n\n &.primary {\n background-color: ${colors.DW_LIGHT_BLUE};\n }\n\n &.secondary {\n background-color: ${colors.LG_GRAY_3};\n }\n\n &.tertiary {\n box-shadow: inset 0px 0px 0px 1px ${colors.LG_GRAY_6};\n ${hoverAndFocusCss()}\n }\n\n ${mediaMin.mobile`\n &.primary, &.secondary, &.tertiary {\n width: fit-content;\n margin-left: auto;\n margin-right: auto;\n }\n `}\n`;\n","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n stroke: \"#FFF\",\n d: \"M3 .467v18.999l16-9.499z\"\n});\n\nfunction SvgPlay(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgPlay);\nexport default __webpack_public_path__ + \"static/media/play.e4d9e1b0.svg\";\nexport { ForwardRef as ReactComponent };","import styled from 'styled-components';\nimport { ReactComponent as PlayIcon } from './play.svg';\n\nexport const StyledPlayIcon = styled(props => )``;\n","export const getPlayerType = ({ player }) => (player.isAudio() ? 'audio' : 'video');\n","import ReactDOM from 'react-dom';\nimport styled from 'styled-components';\nimport videojsDefault from 'video.js';\nimport { StyledButton as PlayButton } from './Button';\nimport { StyledPlayIcon as PlayIcon } from './Play';\nimport { colors } from '../../../../../utils/css';\nimport { useTranslation } from '../../../../../hooks/useTranslation';\nimport { getPlayerType } from '../vjsComponentUtils';\n\nexport const videoPlayButtonComponentName = 'vjsBigPlayButton';\n\nconst vjsComponent = videojsDefault.getComponent('Component');\n\n// eslint-disable-next-line no-unused-vars\nconst VideoPlayButton = ({ className, playerType, ...restProps }) => {\n const buttonTitle = useTranslation(`common.avplayer.button.play`);\n\n return (\n \n \n \n );\n};\n\nconst StyledVideoPlayButton = styled(VideoPlayButton)`\n position: absolute;\n bottom: 0;\n z-index: 2;\n background-color: ${colors.DW_LIGHT_BLUE};\n padding: 15px;\n\n svg {\n fill: ${colors.LG_WHITE};\n width: 20px;\n height: 20px;\n }\n\n @media (min-width: 992px) {\n padding: 18px;\n svg {\n width: 24px;\n height: 24px;\n }\n }\n`;\n\nexport class VjsBigPlayButton extends vjsComponent {\n constructor(player, options) {\n super(player, options);\n this.mount = this.mount.bind(this);\n\n player.ready(() => {\n this.mount({\n onClick: () => player.play(),\n playerType: getPlayerType({ player }),\n });\n });\n\n player.on('play', () => {\n const playButton = player.el().querySelector('.vjs-play-control');\n playButton.focus();\n this.hide();\n });\n }\n\n mount({ onClick, playerType }) {\n ReactDOM.render( , this.el());\n }\n}\n\nvjsComponent.registerComponent(videoPlayButtonComponentName, VjsBigPlayButton);\n"],"names":["Button","variant","className","isA","onClick","noop","onKeyDown","children","disabled","ariaHidden","tabIndex","restProps","classnames","e","key","keyCodes","ENTER","SPACEBAR","preventDefault","commonHoverAndFocusCss","color","hoverAndFocusCss","cssSelector","colors","DW_BLUE","css","mediaDevice","mouse","StyledButton","styled","selector","LG_GRAY_13","LG_WHITE","LG_GRAY_2","LG_GRAY_11","LG_GRAY_7","DW_LIGHT_BLUE","LG_GRAY_3","LG_GRAY_6","mediaMin","mobile","_extends","Object","assign","target","i","arguments","length","source","prototype","hasOwnProperty","call","apply","excluded","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","indexOf","propertyIsEnumerable","sourceKeys","keys","_ref2","React","stroke","d","_ref","svgRef","title","titleId","props","_objectWithoutProperties","xmlns","viewBox","ref","id","ForwardRef","SvgPlay","StyledPlayIcon","PlayIcon","getPlayerType","player","isAudio","videoPlayButtonComponentName","vjsComponent","videojsDefault","getComponent","VideoPlayButton","playerType","buttonTitle","useTranslation","PlayButton","StyledVideoPlayButton","constructor","options","mount","bind","ready","play","on","el","querySelector","focus","hide","render","registerComponent","VjsBigPlayButton"],"mappings":"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"}
\ No newline at end of file
diff --git a/sources-gen/dist/assets/index.3c5a3e75.css b/sources-gen/dist/assets/index.3c5a3e75.css
deleted file mode 100644
index bf5bc05..0000000
--- a/sources-gen/dist/assets/index.3c5a3e75.css
+++ /dev/null
@@ -1 +0,0 @@
-.btn-danger:focus,.btn-danger:hover,.btn-default:focus,.btn-default:hover,.btn-info:focus,.btn-info:hover,.btn-primary:focus,.btn-primary:hover,.btn-success:focus,.btn-success:hover,.btn-warning:focus,.btn-warning:hover{background-position:0 -15px}.navbar-default,.navbar-inverse{border-radius:4px;background-repeat:repeat-x}.label,sub,sup{vertical-align:baseline}body,figure{margin:0}.btn-group>.btn-group,.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.dropdown-menu{float:left}.btn,.ui-button{-moz-user-select:none;-ms-user-select:none}.form-control-feedback,.ui-checkboxradio-disabled,.ui-state-disabled,a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px #ffffff26,0 1px 1px #00000013}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px #00000020}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffffffff",endColorstr="#ffe0e0e0",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff337ab7",endColorstr="#ff265a88",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff5cb85c",endColorstr="#ff419641",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff5bc0de",endColorstr="#ff2aabd2",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#fff0ad4e",endColorstr="#ffeb9316",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffd9534f",endColorstr="#ffc12e2a",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px #00000013}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#fff5f5f5",endColorstr="#ffe8e8e8",GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff337ab7",endColorstr="#ff2e6da4",GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffffffff",endColorstr="#fff8f8f8",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px #ffffff26,0 1px 5px #00000013}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffdbdbdb",endColorstr="#ffe2e2e2",GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px #00000013}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff3c3c3c",endColorstr="#ff222222",GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff080808",endColorstr="#ff0f0f0f",GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px #00000040}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width: 767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff337ab7",endColorstr="#ff2e6da4",GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px #ffffff40,0 1px 2px #0000000d}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffdff0d8",endColorstr="#ffc8e5bc",GradientType=0);background-repeat:repeat-x}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffd9edf7",endColorstr="#ffb9def0",GradientType=0);background-repeat:repeat-x}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#fffcf8e3",endColorstr="#fff8efc0",GradientType=0);background-repeat:repeat-x}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#fff2dede",endColorstr="#ffe7c3c3",GradientType=0);background-repeat:repeat-x}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffebebeb",endColorstr="#fff5f5f5",GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff337ab7",endColorstr="#ff286090",GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff5cb85c",endColorstr="#ff449d44",GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff5bc0de",endColorstr="#ff31b0d5",GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#fff0ad4e",endColorstr="#ffec971f",GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffd9534f",endColorstr="#ffc9302c",GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px #00000013}hr,img{border:0}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff337ab7",endColorstr="#ff2b669a",GradientType=0);background-repeat:repeat-x}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#fff5f5f5",endColorstr="#ffe8e8e8",GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff337ab7",endColorstr="#ff2e6da4",GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffdff0d8",endColorstr="#ffd0e9c6",GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffd9edf7",endColorstr="#ffc4e3f3",GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#fffcf8e3",endColorstr="#fffaf2cc",GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#fff2dede",endColorstr="#ffebcccc",GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffe8e8e8",endColorstr="#fff5f5f5",GradientType=0);background-repeat:repeat-x}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000;background:#ff0}sub,sup{position:relative;font-size:75%;line-height:0}sup{top:-.5em}sub{bottom:-.25em}img{vertical-align:middle}svg:not(:root){overflow:hidden}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}*,:after,:before,input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}.glyphicon,address{font-style:normal}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}.dropdown-menu,.modal-content{-webkit-background-clip:padding-box}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-warning.active,.btn-warning:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-primary,.open>.dropdown-toggle.btn-warning{background-image:none}.img-thumbnail,body{background-color:#fff}@font-face{font-family:"Glyphicons Halflings";src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/glyphicons-halflings-regular.woff2) format("woff2"),url(../fonts/glyphicons-halflings-regular.woff) format("woff"),url(../fonts/glyphicons-halflings-regular.ttf) format("truetype"),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.popover,.tooltip,body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.glyphicon-asterisk:before{content:"*"}.glyphicon-plus:before{content:"+"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before,.glyphicon-btc:before,.glyphicon-xbt:before{content:"\e227"}.glyphicon-jpy:before,.glyphicon-yen:before{content:"\a5"}.glyphicon-rub:before,.glyphicon-ruble:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*,:after,:before{box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}dt,kbd kbd,label{font-weight:700}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}@media (min-width: 768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}dl,ol,ul{margin-top:0}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}address,dl{margin-bottom:20px}ol,ul{margin-bottom:10px}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dd{margin-left:0}@media (min-width: 768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.container{width:750px}}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after,.ui-helper-clearfix:after{clear:both}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}legend,pre{display:block;color:#333}blockquote .small:before,blockquote footer:before,blockquote small:before{content:"\2014\a0"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}code,kbd{padding:2px 4px;font-size:90%}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:""}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:"\a0\2014"}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px #00000040}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-right:15px;padding-left:15px}.pre-scrollable{overflow-y:scroll}@media (min-width: 992px){.container{width:970px}}@media (min-width: 1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width: 768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width: 992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width: 1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}caption{padding-top:8px;padding-bottom:8px;color:#777}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width: 767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{min-width:0;margin:0}legend{width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none}.ui-button-icon-only,.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \ ;line-height:normal}.form-control,output{font-size:14px;line-height:1.42857143;color:#555;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px #00000013;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px #00000013,0 0 8px #66afe999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \ ;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.form-group-sm .form-control,.input-sm{padding:5px 10px;border-radius:3px;font-size:12px}.input-sm{height:30px;line-height:1.5}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;line-height:1.5}.form-group-lg .form-control,.input-lg{border-radius:6px;padding:10px 16px;font-size:18px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;line-height:1.3333333}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;line-height:1.3333333}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.collapsing,.dropdown,.dropup{position:relative}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px #00000013}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px #00000013,0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px #00000013}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px #00000013,0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px #00000013}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px #00000013,0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width: 768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width: 768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;user-select:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px #00000020}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success.active,.btn-success:active,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info.active,.btn-info:active,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \ ;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px #0000002d}.dropdown-menu-right,.dropdown-menu.pull-right{right:0;left:auto}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.42857143;white-space:nowrap}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{clear:both;font-weight:400;color:#333}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{right:auto;left:0}.dropdown-header{font-size:12px;color:#777}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid \ }.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width: 768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px #00000020}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child:not(:first-child){border-radius:0 0 4px 4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.nav>li,.nav>li>a{display:block;position:relative}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center;margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width: 768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width: 768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px #ffffff1a}.navbar-collapse.in{overflow-y:auto}@media (min-width: 768px){.navbar{border-radius:4px}.navbar-header{float:left}.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.carousel-inner,.embed-responsive,.media,.media-body,.modal,.modal-open,.progress,.ui-icon{overflow:hidden}@media (max-device-width: 480px) and (orientation: landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width: 768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width: 767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}.progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}@media (min-width: 768px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px #ffffff1a,0 1px #ffffff1a;margin:8px -15px}@media (min-width: 768px){.navbar-form .form-control-static,.navbar-form .form-group{display:inline-block}.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.breadcrumb>li,.pagination{display:inline-block}.btn .badge,.btn .label{top:-1px;position:relative}@media (max-width: 767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:4px 4px 0 0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width: 768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width: 767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width: 767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\a0"}.breadcrumb>.active{color:#777}.pagination{padding-left:0;margin:20px 0;border-radius:4px}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.badge,.label{font-weight:700;line-height:1;white-space:nowrap;text-align:center}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}a.badge:focus,a.badge:hover,a.label:focus,a.label:hover{color:#fff;cursor:pointer;text-decoration:none}.label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;border-radius:.25em}.label:empty{display:none}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.media-object,.thumbnail{display:block}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;background-color:#eee}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.alert,.thumbnail{margin-bottom:20px}.alert .alert-link,.close{font-weight:700}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width: 768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px #0000001a}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px #00000026;-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1}.media-body{width:10000px}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle,.ui-icon{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px #0000000d}.panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-title{margin-top:0;font-size:16px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px #0000000d}.well blockquote{border-color:#ddd;border-color:#00000026}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.popover,.tooltip{font-style:normal;font-weight:400;line-height:1.42857143;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;line-break:auto;text-decoration:none}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal{position:fixed;z-index:1050;display:none;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translateY(-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px #00000080}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px #00000080}.modal-sm{width:300px}}.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}@media (min-width: 992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;text-align:left;text-align:start;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px}.tooltip.top-right .tooltip-arrow{left:5px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 5px 5px;border-bottom-color:#000;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.bottom-left .tooltip-arrow{right:5px;margin-top:-5px}.tooltip.bottom-right .tooltip-arrow{left:5px;margin-top:-5px}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-size:14px;text-align:left;text-align:start;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px #0003}.carousel-caption,.carousel-control{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.6);text-align:center}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.carousel,.carousel-inner{position:relative}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:#00000040;border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.left>.arrow:after,.popover.right>.arrow:after{bottom:-10px;content:" "}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:#00000040;border-left-width:0}.popover.right>.arrow:after{left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:#00000040}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:#00000040}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.carousel-inner{width:100%}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate(100%)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate(-100%)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate(0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;background-color:#0000;filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#80000000",endColorstr="#00000000",GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000",endColorstr="#80000000",GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:"\2039"}.carousel-control .icon-next:before{content:"\203a"}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \ ;background-color:#0000;border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width: 768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width: 767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width: 1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!important}}@media (max-width: 767px){.hidden-xs{display:none!important}}@media (min-width: 768px) and (max-width: 991px){.hidden-sm{display:none!important}}@media (min-width: 992px) and (max-width: 1199px){.hidden-md{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:inline-block;margin-top:-.25em;position:relative;text-indent:-99999px;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-autocomplete,.ui-menu .ui-menu{position:absolute}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-button,.ui-controlgroup{display:inline-block;vertical-align:middle}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0}.ui-menu .ui-state-active,.ui-menu .ui-state-focus{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;text-align:center;-webkit-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:active,.ui-button:hover,.ui-button:link,.ui-button:visited{text-decoration:none}.ui-button-icon-only{width:2em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}button.ui-button::-moz-focus-inner,input.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup>.ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup>.ui-controlgroup-item.ui-visual-focus,.ui-controlgroup>.ui-controlgroup-item:focus{z-index:9999}.ui-controlgroup-vertical>.ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label+.ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label+.ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc(100% - 2.4em)}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-next-hover,.ui-datepicker .ui-datepicker-prev-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td a,.ui-datepicker td span{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-multi .ui-datepicker-group,.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-slider-vertical .ui-slider-range-min,.ui-spinner-down{bottom:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-overlay{background:url(data:image/gif;base64,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);height:100%;filter:alpha(opacity=25);opacity:.25}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-slider{position:relative;text-align:left}.ui-spinner-input{border:none;background:0 0;color:inherit;padding:.222em 0;margin:.2em 2em .2em .4em;vertical-align:middle}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-widget-content{border:1px solid #ddd;background:url(../images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x #eee;color:#333}.ui-widget-header{border:1px solid #e78f08;background:url(../images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x #f6a828;color:#fff;font-weight:700}.ui-button,.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,html .ui-button.ui-state-disabled:active,html .ui-button.ui-state-disabled:hover{border:1px solid #ccc;background:url(../images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x #f6f6f6;font-weight:700;color:#1c94c4}.ui-button:focus,.ui-button:hover,.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{border:1px solid #fbcb09;background:url(../images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x #fdf5ce;font-weight:700;color:#c77405}.ui-button.ui-state-active:hover,.ui-button:active,.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active{border:1px solid #fbd850;background:url(../images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x #fff;font-weight:700;color:#eb8f00}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:url(../images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x #ffe45c;color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:url(../images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% #b81900;color:#fff}.ui-state-error a,.ui-state-error-text,.ui-widget-content .ui-state-error a,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error a,.ui-widget-header .ui-state-error-text{color:#fff}.ui-icon,.ui-widget-content .ui-icon{background-image:url(../images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(../images/ui-icons_ffffff_256x240.png)}.ui-button:active .ui-icon,.ui-button:focus .ui-icon,.ui-button:hover .ui-icon,.ui-state-active .ui-icon,.ui-state-focus .ui-icon,.ui-state-hover .ui-icon{background-image:url(../images/ui-icons_ef8c08_256x240.png)}.ui-button .ui-state-highlight.ui-icon,.ui-state-highlight .ui-icon{background-image:url(../images/ui-icons_228ef1_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(../images/ui-icons_ffd27a_256x240.png)}.ui-button .ui-icon{background-image:url(../images/ui-icons_ef8c08_256x240.png)}.ui-icon-seek-first,.ui-icon-seek-start{background-position:-80px -160px}.ui-widget-overlay{background:url(../images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% #666;opacity:.5;filter:Alpha(Opacity=50)}.ui-keyboard{text-align:center;padding:.3em;position:absolute;left:0;top:0;z-index:16000}.ui-keyboard-has-focus{z-index:16001}.ui-keyboard div{font-size:1.1em}.ui-keyboard-button{height:2em;min-width:2em;margin:.1em;cursor:pointer;overflow:hidden;line-height:2em;-moz-user-focus:ignore}.ui-keyboard-button span{padding:0;margin:0;white-space:nowrap;display:inline-block}.ui-keyboard-button-endrow{clear:left}.ui-keyboard-space{width:15em}.ui-keyboard-empty span,.ui-keyboard-space span{font:0/0 a;text-shadow:none;color:transparent}.ui-keyboard-preview-wrapper{text-align:center;position:relative;overflow:hidden}.ui-keyboard-preview{text-align:left;margin:0 0 3px;display:inline;width:99%}.ui-keyboard-keyset{text-align:center;white-space:nowrap}.ui-keyboard-input{text-align:left}.ui-keyboard-input-current{-moz-box-shadow:0 0 5px #4d90fe;-webkit-box-shadow:0 0 5px #4d90fe;box-shadow:0 0 5px #4d90fe}.ui-keyboard-placeholder{color:#888}.ui-keyboard-nokeyboard{color:#888;border-color:#888}.ui-keyboard-spacer{display:inline-block;width:1px;height:0;cursor:default}.ui-keyboard-LRM span,.ui-keyboard-NBSP span,.ui-keyboard-RLM span,.ui-keyboard-ZWJ span,.ui-keyboard-ZWNJ span,.ui-keyboard-ZWSP span{font-size:.5em;line-height:1.5em;white-space:normal}.ui-keyboard-button.ui-keyboard-combo.ui-state-default{border-color:#ffaf0f}button.ui-keyboard-accept.ui-keyboard-valid-input{border-color:#0c0;background:#080;color:#fff}button.ui-keyboard-accept.ui-keyboard-valid-input:not([disabled]):hover{background:#0a0}button.ui-keyboard-accept.ui-keyboard-invalid-input{border-color:#c00;background:#800;color:#fff;opacity:.5;filter:alpha(opacity=50)}button.ui-keyboard-accept.ui-keyboard-invalid-input:not([disabled]):hover{background:#a00}.ui-keyboard-caret{background:#c00;width:1px;margin-top:3px}div.ui-body.ui-keyboard button.ui-keyboard-button.ui-btn{padding:.5em 1em;border-color:transparent}.ui-body .ui-keyboard-button{width:3em;height:3em;display:inline-block}.ui-body .ui-keyboard-widekey{width:5.5em}.ui-body .ui-keyboard-space{width:15em}.ui-body .ui-keyboard-space span{visibility:hidden}.ui-body .ui-keyboard-keyset{line-height:.5em}.ui-body input.ui-input-text,.ui-body textarea.ui-input-text{width:95%}.ui-body .ui-btn-inner{height:2em;padding:.2em 0;margin:0}.ui-body .ui-btn{margin:0;font-size:13px}button.ui-keyboard-button.btn{padding:1px 6px}button.ui-keyboard-toggle span{width:.8em;height:.8em;display:inline-block;background-repeat:no-repeat;background-position:center center;background-size:contain;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0iIzExMSI+PHBhdGggZD0iTTguNyw0LjRINy41SDUuMHYtMS45YzAtMS40LTEuMS0yLjUtMi41LTIuNWMtMS40LDAtMi41LDEuMS0yLjUsMi41djEuOWgxLjIgdi0xLjljMC0wLjcsMC42LTEuMiwxLjItMS4yczEuMiwwLjYsMS4yLDEuMnYxLjljLTAuNywwLTEuMiwwLjYtMS4yLDEuMlY4LjggYzAsMC43LDAuNiwxLjIsMS4yLDEuMmg1LjBDOS40LDEwLDEwLDkuNCwxMCw4LjhWNS42QzEwLDUuMCw5LjQsNC40LDguOCw0LjR6IE02LjYsNy40djEuMCBjMCwwLjItMC4xLDAuMy0wLjMsMC4zUzYuMCw4LjYsNi4wLDguNFY3LjRjLTAuMi0wLjEtMC4zLTAuMy0wLjMtMC41YzAtMC4zLDAuMy0wLjYsMC42LTAuNiBTNi45LDYuNiw2LjksNi45QzYuOSw3LjEsNi44LDcuMyw2LjYsNy40eiIvPjwvc3ZnPg==)}.ui-keyboard-dark-theme button.ui-keyboard-toggle span{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0iI2VlZSI+PHBhdGggZD0iTTguNyw0LjRINy41SDUuMHYtMS45YzAtMS40LTEuMS0yLjUtMi41LTIuNWMtMS40LDAtMi41LDEuMS0yLjUsMi41djEuOWgxLjIgdi0xLjljMC0wLjcsMC42LTEuMiwxLjItMS4yczEuMiwwLjYsMS4yLDEuMnYxLjljLTAuNywwLTEuMiwwLjYtMS4yLDEuMlY4LjggYzAsMC43LDAuNiwxLjIsMS4yLDEuMmg1LjBDOS40LDEwLDEwLDkuNCwxMCw4LjhWNS42QzEwLDUuMCw5LjQsNC40LDguOCw0LjR6IE02LjYsNy40djEuMCBjMCwwLjItMC4xLDAuMy0wLjMsMC4zUzYuMCw4LjYsNi4wLDguNFY3LjRjLTAuMi0wLjEtMC4zLTAuMy0wLjMtMC41YzAtMC4zLDAuMy0wLjYsMC42LTAuNiBTNi45LDYuNiw2LjksNi45QzYuOSw3LjEsNi44LDcuMyw2LjYsNy40eiIvPjwvc3ZnPg==)}button.ui-keyboard-toggle.ui-keyboard-disabled span{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0iIzExMSI+PHBhdGggZD0iTTcuNCA0LjRWMi41YzAtMS40LTEuMS0yLjUtMi41LTIuNWMtMS40IDAtMi41IDEuMS0yLjUgMi41djEuOSBjLTAuNyAwLTEuMiAwLjUtMS4yIDEuMnYzLjFDMS4zIDkuNCAxLjggMTAgMi41IDEwaDQuOWMwLjcgMCAxLjItMC42IDEuMi0xLjJWNS42IEM4LjcgNC45IDguMSA0LjQgNy40IDQuNHogTTUuMyA3LjR2MS4wYzAgMC4yLTAuMSAwLjMtMC4zIDAuM2MtMC4yIDAtMC4zLTAuMS0wLjMtMC4zVjcuNCBjLTAuMi0wLjEtMC4zLTAuMy0wLjMtMC41YzAtMC4zIDAuMy0wLjYgMC42LTAuNmMwLjMgMCAwLjYgMC4zIDAuNiAwLjYgQzUuNiA3LjEgNS41IDcuMyA1LjMgNy40eiBNNi4yIDQuNEgzLjdWMi41YzAtMC43IDAuNS0xLjIgMS4yLTEuMmMwLjcgMCAxLjIgMC42IDEuMiAxLjIgVjQuNHoiLz48L3N2Zz4=)}.ui-keyboard-dark-theme button.ui-keyboard-toggle.ui-keyboard-disabled span{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0iI2VlZSI+PHBhdGggZD0iTTcuNCA0LjRWMi41YzAtMS40LTEuMS0yLjUtMi41LTIuNWMtMS40IDAtMi41IDEuMS0yLjUgMi41djEuOSBjLTAuNyAwLTEuMiAwLjUtMS4yIDEuMnYzLjFDMS4zIDkuNCAxLjggMTAgMi41IDEwaDQuOWMwLjcgMCAxLjItMC42IDEuMi0xLjJWNS42IEM4LjcgNC45IDguMSA0LjQgNy40IDQuNHogTTUuMyA3LjR2MS4wYzAgMC4yLTAuMSAwLjMtMC4zIDAuM2MtMC4yIDAtMC4zLTAuMS0wLjMtMC4zVjcuNCBjLTAuMi0wLjEtMC4zLTAuMy0wLjMtMC41YzAtMC4zIDAuMy0wLjYgMC42LTAuNmMwLjMgMCAwLjYgMC4zIDAuNiAwLjYgQzUuNiA3LjEgNS41IDcuMyA1LjMgNy40eiBNNi4yIDQuNEgzLjdWMi41YzAtMC43IDAuNS0xLjIgMS4yLTEuMmMwLjcgMCAxLjIgMC42IDEuMiAxLjIgVjQuNHoiLz48L3N2Zz4=)}.ui-keyboard.ui-keyboard-disabled button:not(.ui-keyboard-toggle),.ui-keyboard.ui-keyboard-disabled input{opacity:.5}.ui-keyboard-overlay{position:absolute;top:0;left:0;bottom:0;right:0;background:rgba(0,0,0,.5)}.ui-keyboard-popup{display:inline-block;max-width:22em}div.ui-keyboard-extender{margin-left:5px}button.ui-keyboard-extender span{width:.9em;height:.9em;display:inline-block;margin-bottom:3px;background-repeat:no-repeat;background-position:center center;background-size:contain;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9ImZpbGw6IzExMSI+PGc+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzExMSIgZD0iTSAwLjUsNC41IDE1LjUsNC41IDE1LjUsMTUuNSAwLjUsMTUuNSBaIj48L3BhdGg+PHJlY3Qgd2lkdGg9IjIiIGhlaWdodD0iMiIgeD0iMiIgeT0iNiI+PC9yZWN0PjxyZWN0IHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHg9IjUiIHk9IjYiPjwvcmVjdD48cmVjdCB3aWR0aD0iMiIgaGVpZ2h0PSIyIiB4PSI4IiB5PSI2Ij48L3JlY3Q+PHBhdGggZD0ibSAxMSw2IDMsMCAwLDUgLTIsMCAwLC0zIC0xLDAgeiI+PC9wYXRoPjxyZWN0IHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHg9IjEyIiB5PSIxMiI+PC9yZWN0PjxyZWN0IHdpZHRoPSI2IiBoZWlnaHQ9IjIiIHg9IjUiIHk9IjEyIj48L3JlY3Q+PHJlY3Qgd2lkdGg9IjIiIGhlaWdodD0iMiIgeD0iOSIgeT0iOSI+PC9yZWN0PjxyZWN0IHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHg9IjYiIHk9IjkiPjwvcmVjdD48cmVjdCB3aWR0aD0iMiIgaGVpZ2h0PSIyIiB4PSIyIiB5PSIxMiI+PC9yZWN0PjxyZWN0IHdpZHRoPSIzIiBoZWlnaHQ9IjIiIHg9IjIiIHk9IjkiPjwvcmVjdD48L2c+PC9zdmc+)}.ui-keyboard-dark-theme button.ui-keyboard-extender span{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9ImZpbGw6I2VlZSI+PGc+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6I2VlZSIgZD0iTSAwLjUsNC41IDE1LjUsNC41IDE1LjUsMTUuNSAwLjUsMTUuNSBaIj48L3BhdGg+PHJlY3Qgd2lkdGg9IjIiIGhlaWdodD0iMiIgeD0iMiIgeT0iNiI+PC9yZWN0PjxyZWN0IHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHg9IjUiIHk9IjYiPjwvcmVjdD48cmVjdCB3aWR0aD0iMiIgaGVpZ2h0PSIyIiB4PSI4IiB5PSI2Ij48L3JlY3Q+PHBhdGggZD0ibSAxMSw2IDMsMCAwLDUgLTIsMCAwLC0zIC0xLDAgeiI+PC9wYXRoPjxyZWN0IHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHg9IjEyIiB5PSIxMiI+PC9yZWN0PjxyZWN0IHdpZHRoPSI2IiBoZWlnaHQ9IjIiIHg9IjUiIHk9IjEyIj48L3JlY3Q+PHJlY3Qgd2lkdGg9IjIiIGhlaWdodD0iMiIgeD0iOSIgeT0iOSI+PC9yZWN0PjxyZWN0IHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHg9IjYiIHk9IjkiPjwvcmVjdD48cmVjdCB3aWR0aD0iMiIgaGVpZ2h0PSIyIiB4PSIyIiB5PSIxMiI+PC9yZWN0PjxyZWN0IHdpZHRoPSIzIiBoZWlnaHQ9IjIiIHg9IjIiIHk9IjkiPjwvcmVjdD48L2c+PC9zdmc+)}@media all and (max-width: 319px){.ui-keyboard div{font-size:9px}.ui-keyboard .ui-keyboard-input{font-size:12px}.ui-body .ui-btn{margin:0;font-size:9px}.ui-body .ui-keyboard-button{width:1.8em;height:2.5em}.ui-body .ui-keyboard-widekey{width:4em}.ui-body .ui-keyboard-space{width:8em}.ui-body .ui-btn-inner{height:2.5em;padding:.3em 0}}@media all and (min-width: 320px) and (max-width: 479px){.ui-keyboard div{font-size:9px}.ui-keyboard .ui-keyboard-input{font-size:14px}.ui-body .ui-btn{margin:0;font-size:11px}.ui-body .ui-keyboard-button{width:1.8em;height:3em}.ui-body .ui-keyboard-widekey{width:4.5em}.ui-body .ui-keyboard-space{width:10em}.ui-body .ui-btn-inner{height:3em;padding:.7em 0}}@media all and (min-width: 480px) and (max-width: 767px){.ui-keyboard div{font-size:13px}.ui-keyboard .ui-keyboard-input{font-size:14px}.ui-body .ui-btn{margin:0;font-size:10px}.ui-body .ui-keyboard-button{height:2.5em}.ui-body .ui-btn-inner{height:2.5em;padding:.5em 0}}.background-color-sand{background-color:#f08c00}.background-color-orange{background-color:#e1500f}.background-color-pink{background-color:#dc1978}.background-color-red{background-color:#be0046}.background-color-gray{background-color:#f5f4f2}.text-color-white{color:#fff!important}.text-color-gray{color:#9b9b9b!important}.color-orange{background-color:#e1500f;color:#fff}.color-orange-light{background-color:#f08c00;color:#fff}.color-pink{background-color:#dc1978;color:#fff}.color-red{background-color:#be0046;color:#fff}.color-red-dark{background-color:#b20028;color:#fff}.color-green-light{background-color:#cdbe00;color:#fff}.color-green-mid{background-color:#91b423;color:#fff}.color-green-dark{background-color:#55911e;color:#fff}.color-blue-mid{background-color:#1464a5;color:#fff}.color-blue-cyan{background-color:#0098ff;color:#fff}@font-face{font-family:DWTheAntiquaB;src:url(../fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.eot);src:url(../fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.eot?) format("embedded-opentype"),url(data:font/woff2;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2R3dGhlYW50aXF1YWItdzVwbGFpbi41MjRhNWVhYy53b2ZmMiI7) format("woff2"),url(data:font/woff;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2R3dGhlYW50aXF1YWItdzVwbGFpbi45NGM1YjgwNC53b2ZmIjs=) format("woff"),url(../fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.svg) format("svg");font-style:normal;font-weight:400}@font-face{font-family:DWTheAntiquaBItalic;src:url(data:font/woff2;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL0RXVGhlQW50aXF1YUItVzVQbGFpbkl0YWxpYy4zOTA5MzdhZi53b2ZmMiI7) format("woff2"),url(data:font/woff;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL0RXVGhlQW50aXF1YUItVzVQbGFpbkl0YWxpYy4wYzgwNmZlMS53b2ZmIjs=) format("woff");font-style:normal;font-weight:400}@font-face{font-family:DWTheAntiquaBBold;src:url(data:font/woff2;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL0RXVGhlQW50aXF1YUItVzdCb2xkLmM3MzljZjBkLndvZmYyIjs=) format("woff2"),url(data:font/woff;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL0RXVGhlQW50aXF1YUItVzdCb2xkLjczYTM1NzgzLndvZmYiOw==) format("woff");font-style:normal;font-weight:400}body{font-family:Helvetica,Arial,sans-serif;font-weight:400;font-size:17px;line-height:23px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.h1,h1{font-size:28px;line-height:32px}.h2,h2{font-size:24px;line-height:25px}.h3,h3{font-size:20px;line-height:25px}.h4,h4{font-size:17px;line-height:20px}.paragraph,p{font-size:15px;line-height:25px}.exercise-questions{font-size:15px}@media (min-width: 768px){.h1,h1{font-size:32px;line-height:40px}.h2,h2{font-size:24px;line-height:25px}.h3,h3{font-size:20px;line-height:25px}.h4,h4{font-size:17px;line-height:20px}.paragraph,p{font-size:15px;line-height:25px}.exercise-questions{font-size:17px}}@media (min-width: 992px){.h1,h1{font-size:36px;line-height:45px}.paragraph,p{font-size:17px;line-height:25px}}@media (min-width: 1200px){.h1,h1{font-size:40px;line-height:50px;font-weight:400}.h2,h2{font-size:27px;line-height:25px}.h3,h3{font-size:22px;line-height:25px}.h4,h4{font-size:18px;line-height:25px}.paragraph,p{font-size:18px;line-height:25px}}.result-headline p,h1,h1+p,h3{font-family:DWTheAntiquaB,Georgia,serif;font-weight:400}.exercise-container .exercise-headline,.exercise-container .exercise-infos,.exercise-container .exercise-results-header{font-family:DWTheAntiquaB,Georgia,serif;font-weight:400}.exercise-container .exercise-headline bold,.exercise-container .exercise-headline strong,.exercise-container .exercise-infos bold,.exercise-container .exercise-infos strong,.exercise-container .exercise-results-header bold,.exercise-container .exercise-results-header strong{font-family:DWTheAntiquaBBold,Georgia,serif;font-weight:400}.exercise-container .exercise-headline em,.exercise-container .exercise-headline i,.exercise-container .exercise-infos em,.exercise-container .exercise-infos i,.exercise-container .exercise-results-header em,.exercise-container .exercise-results-header i{font-family:DWTheAntiquaBItalic,Georgia,serif;font-style:normal}.richtext-content-container .grammarLink,.richtext-content-container .grammarLinkText{font-family:DWTheAntiquaB,Georgia,serif;font-weight:400}.btn,.exercise-nav-title,button{font-family:Helvetica,Arial,sans-serif}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.main{display:inline-block;background:#0098FF;position:relative;width:100%;height:50px;margin-top:20px;margin-bottom:20px;line-height:33px;font-size:17px;color:#fff}.btn.main:active,.btn.main:focus,.btn.main:hover{-webkit-transition:all .1s linear;-moz-transition:all .1s linear;-o-transition:all .1s linear;transition:all .1s linear;background-color:#252629;color:#fff}.btn.secondary{display:inline-block;background:0 0;position:relative;width:100%;height:50px;margin-top:20px;margin-bottom:20px;line-height:33px;font-size:17px;border:1px solid #0098FF;color:#0098ff}.btn.secondary:active,.btn.secondary:focus,.btn.secondary:hover{-webkit-transition:all .1s linear;-moz-transition:all .1s linear;-o-transition:all .1s linear;transition:all .1s linear;background-color:#252629;border:1px solid #FFF;color:#fff}.btn.login-home{position:relative;background:#FFF;font-size:22px;line-height:50px;border-radius:0;width:320px;text-transform:uppercase;color:#f08c00;margin:700px auto 0}@media (max-width: 767px){.btn.login-home{margin:740px auto 0}}@media (min-width: 768px) and (max-width: 991px){.btn.login-home{margin:790px auto 0}}@media (min-width: 992px) and (max-width: 1199px){.btn.login-home{margin:660px auto 0}}@media (min-width: 1200px){.btn.login-home{margin:540px auto 0}}.btn span.icon{position:absolute;margin:-2px 0 0 10px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px #00000020}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#0098ff;border-color:#0089e6}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#007acc;border-color:#003d66}.btn-primary:hover{color:#fff;background-color:#007acc;border-color:#0064a8}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#007acc;border-color:#0064a8}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#0064a8;border-color:#003d66}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#0098ff;border-color:#0089e6}.btn-primary .badge{color:#0098ff;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#0098ff;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#a0d246;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:0}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:0}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.form-control{border-radius:0;box-shadow:none;border-color:#aeb8c1}.form-control,output{color:#000}div.form-group div.input-group label{font-weight:400}div.form-group div.input-group label a{color:#0098ff}.custom-checkbox{margin-top:20px;margin-bottom:20px}.custom-checkbox .input-group .form-control{position:relative;z-index:2;margin:0;height:15px;width:15px;color:#000;padding:0}.custom-checkbox .input-group .checkbox-label{position:relative;z-index:2;margin-bottom:0;color:#000;padding:15px 0 15px 20px;font-size:14px;border:1px solid #AEB8C1;border-radius:0 4px 4px 0;width:100%}.custom-checkbox .has-error .checkbox-label{border-color:#a94442}.has-nested-errors .help-block{color:#a94442}.alert-danger{border-radius:0;background-image:none;background-color:inherit;border-color:#be232d;color:#be232d}.nav>li>a:focus,.nav>li>a:hover{background-color:#000;color:#fff}.nav-tabs{border-bottom:1px solid #0098FF}.nav-tabs>li>a{border-radius:0;color:#0098ff;-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;border-image:none;border-style:solid;border-width:1px;cursor:default}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{background-color:#0098ff;color:#fff;border-color:#0098FF #0098FF transparent}.tab-content{margin:20px 0}div.richtext-content-container{margin:20px 0}div.richtext-content-container b,div.richtext-content-container strong{font-family:DWTheAntiquaBBold,Georgia,serif;font-weight:400;color:#3e3e3e}div.richtext-content-container em,div.richtext-content-container i{font-family:DWTheAntiquaBItalic,Georgia,serif;font-weight:400;font-style:normal}div.richtext-content-container img~p,div.richtext-content-container picture~p{margin-top:40px}div.richtext-content-container div.tab-wrap{margin:40px 0;width:100%;overflow-x:hidden;-webkit-overflow-scrolling:touch;overflow-x:scroll}@media (min-width: 768px){div.richtext-content-container div.tab-wrap{overflow-x:auto}}div.richtext-content-container div.tab-wrap table td,div.richtext-content-container div.tab-wrap table th{padding:5px 0 15px;vertical-align:top;border-top:1px solid #BBB}div.richtext-content-container div.tab-wrap table td:first-child,div.richtext-content-container div.tab-wrap table th:first-child{padding-right:10px}div.richtext-content-container div.tab-wrap table td:last-child,div.richtext-content-container div.tab-wrap table th:last-child{padding-left:10px}div.richtext-content-container div.tab-wrap table{border-bottom:1px solid #BBB}div.richtext-content-container div.tab-wrap table td strong,div.richtext-content-container div.tab-wrap table th{font-family:DWTheAntiquaBBold,Georgia,serif;font-weight:400;color:#3e3e3e}div.richtext-content-container div.tab-wrap table{font-size:15px;line-height:25px}div.richtext-content-container .jwplayer,div.richtext-content-container img,div.richtext-content-container p,div.richtext-content-container picture,div.richtext-content-container video{margin-bottom:20px}div.row.vocabulary div.richtext-content-container .jwplayer,div.row.vocabulary div.richtext-content-container img,div.row.vocabulary div.richtext-content-container p,div.row.vocabulary div.richtext-content-container picture,div.row.vocabulary div.richtext-content-container video{margin-bottom:20px}@media (min-width: 768px){div.richtext-content-container div.tab-wrap table{font-size:16px}div.richtext-content-container .jwplayer,div.richtext-content-container img,div.richtext-content-container p,div.richtext-content-container picture,div.richtext-content-container video{margin-bottom:30px}}@media (min-width: 992px){div.richtext-content-container div.tab-wrap table{font-size:16px}div.richtext-content-container div.tab-wrap table td,div.richtext-content-container div.tab-wrap table th{padding:10px 0 20px}div.richtext-content-container div.tab-wrap table td:first-child,div.richtext-content-container div.tab-wrap table th:first-child{padding-right:20px}div.richtext-content-container div.tab-wrap table td:last-child,div.richtext-content-container div.tab-wrap table th:last-child{padding-left:20px}}@media (min-width: 1200px){div.richtext-content-container div.tab-wrap table{font-size:17px}div.richtext-content-container div.tab-wrap table td,div.richtext-content-container div.tab-wrap table th{padding:15px 0 30px}div.richtext-content-container .jwplayer,div.richtext-content-container img,div.richtext-content-container p,div.richtext-content-container picture,div.richtext-content-container video{margin-bottom:40px}}div.richtext-content-container p.grammarLink{border-top:1px solid #BBB;padding:8px 0;margin-bottom:0!important}p.grammarLinkText{margin-top:-8px!important}p.grammarLinkText{margin-bottom:10px!important}p.grammarLinkText:last-child{margin-bottom:30px!important}div.grammarOverview div.course-headline-wrapper{background-color:#f5f4f2;color:#3e3e3e}div.grammar-link-list a,div.grammar-list a{display:block;padding:20px 40px 20px 20px;font-family:DWTheAntiquaB,Georgia,serif;font-weight:400;font-size:15px;line-height:20px}div.grammar-list a{font-size:16px;border-bottom:1px solid #fff}div.grammar-list a:after{position:absolute;top:22px;right:36px;width:24px;height:20px;content:"";background:transparent url(../svg/nav-arrow-up.svg) no-repeat top left}div.grammar-list a.collapsed:after{position:absolute;top:22px;right:36px;width:24px;height:20px;content:"";background:transparent url(../svg/nav-arrow-down.svg) no-repeat top left}div.grammar-list a:hover{color:#fff;text-decoration:none}div.grammar-link-list a:hover{color:#3e3e3e;text-decoration:none}div.grammar-link-list a{border-bottom:1px solid #E6E1DD;color:#3e3e3e}div.grammar-overview div:nth-last-child(2) a{border-bottom:none}@media (min-width: 768px){div.grammar-link-list a,div.grammar-list a{font-size:18px;line-height:25px}div.grammar-list a:after{top:27px;right:40px}div.grammar-list a.collapsed:after{top:27px;right:40px}}@media (min-width: 992px){div.grammar-link-list a:hover,div.grammar-list a:hover{background-color:#3e3e3e;color:#fff;text-decoration:none}}@media (min-width: 1200px){div.section div.row.grammar-list:first-child{margin-top:20px}}a.audio-link{color:#0ff;text-decoration:none}a.audio-link:before{content:" ";display:inline-block;background-image:url(../icons/icon-vocabulary-audio.svg);background-size:contain;background-repeat:no-repeat;width:16px;height:15px;margin-right:8px;margin-bottom:-2px}a.audio-link:hover,a.audio-link:hover em,a.audio-link:hover strong{color:#0098ff!important;text-decoration:none}a.audio-link:hover:before{background-image:url(../icons/icon-vocabulary-audio-cyan.svg)}a.absolute-fav{display:block;position:absolute;content:" ";width:40px;height:40px;top:12px;right:10px;z-index:99;background-image:url(../svg/icon-vocabulary-star-outline.svg);background-position:center center;background-size:contain;background-repeat:no-repeat}a.absolute-fav.checked{background-image:url(../svg/icon-vocabulary-star.svg)}div.row.vocabulary{position:relative}div.row.vocabulary div.col-sm-3 p{margin-right:30px}@media (min-width: 768px){a.absolute-fav{right:70px}div.row.vocabulary div.col-sm-4 p{margin-right:20px}div.row.vocabulary div.col-sm-3 p{margin-right:0}}@media (min-width: 992px){a.absolute-fav{right:95px}}@media (min-width: 1200px){a.absolute-fav{right:212px}}@media (min-width: 768px){div.section div.row.vocabulary:first-child div[class^=col-]{border-top:none}}div.headline-container.row.voc-start,div.row.voc-start{margin-top:35px;margin-bottom:10px}.voc-start div.exercise-headline h2,.voc-start div.exercise-headline p{font-size:16px;line-height:16px;margin-top:0}.voc-start div.exercise-headline h2{color:#3e3e3e}.voc-start div.exercise-headline p{color:#938a7f}div.row.voc-button-stack{margin-bottom:10px}@media (min-width: 768px){div.headline-container.row.voc-start,div.row.voc-start{margin-top:60px;margin-bottom:20px}.voc-start div.exercise-headline h2,.voc-start div.exercise-headline p{font-size:18px;line-height:18px}div.row.voc-button-stack{margin-bottom:20px}}@media (min-width: 1200px){div.headline-container.row.voc-start,div.row.voc-start{margin-top:40px;margin-bottom:30px}.voc-start div.exercise-headline h2,.voc-start div.exercise-headline p{font-size:20px;line-height:22px}div.row.voc-button-stack{margin-bottom:30px}}div.row.topless{margin-top:-70px}@media (min-width: 768px){div.row.topless{margin-top:-30px}}@media (min-width: 1200px){div.row.topless{margin-top:-20px}}.exercise-container .bubble.right.audio{padding-right:20px;padding-left:50px}.exercise-container .bubble.right:after{display:block;position:absolute;z-index:10;content:"";top:30px;top:calc(38%);left:auto;right:-20px;height:4px;width:0;background-color:#0098ff;border-top:20px solid #FFF;border-right:none;border-left:20px solid #0098FF}.exercise-container .bubble.right.playing:after{left:auto;right:-20px;background-color:#000;border-top:20px solid #FFF;border-right:none;border-left:20px solid #000}.exercise-container .bubble.right.ending:after{left:auto;right:-20px;background-color:#0098ff;border-top:20px solid #FFF;border-right:none;border-left:20px solid #0098FF}.exercise-container .bubble.right.audio .exercise-play-audio{right:auto;left:18px}a.smileys{margin-top:20px;margin-bottom:20px}a.smileys:hover circle.dot{fill:#0098ff!important}a.smileys.fine circle.dot{fill:#91b423!important}a.smileys.notsogood circle.dot{fill:#e1500f!important}.modal .modal-dialog-glossar{position:absolute;top:50%;left:50%;margin:0;min-width:280px}.modal .modal-dialog-glossar .m-bubble:after{display:block;position:absolute;z-index:10;content:"";bottom:-19px;left:30%;height:4px;width:0;background-color:transparent;border-top:20px solid #fff;border-right:20px solid transparent}.modal .modal-content{position:relative;background-color:#fff;background-clip:padding-box;border-radius:0;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px #00000080}.modal.fade .modal-dialog-glossar{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);-o-transform:translate(0,-50%);transform:translateY(-50%)}.modal.in .modal-dialog-glossar{-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.modal .m-bubble .modal-header{padding:15px 15px 10px}.modal .m-bubble .modal-header.no-line{border-bottom:none}.modal .m-bubble .modal-body{padding:10px 15px 15px}.modal .m-bubble .modal-body img{margin-bottom:15px}.modal h2.modal-title{font-size:70px;line-height:64px;color:#333}.modal h4.modal-title{color:#000;padding-right:20px}.modal h5.modal-title{color:#777;margin:3px 0 0;font-size:16px}.modal div.modal-body,.modal div.modal-body p{font-size:15px}a.glossar-modal{outline:0;text-decoration:none;border-bottom:1px dotted #0098FF;cursor:help}a.glossar-modal:hover{text-decoration:none;border-bottom:2px dotted #0098FF}a.anlaut-modal{outline:0;text-decoration:none;border-bottom:1px solid #E1500F;font-weight:700;color:#e1500f;cursor:help}a.anlaut-modal:hover{text-decoration:none;border-bottom:2px solid #E1500F}.navbar-header{height:110px;position:relative;width:100%;padding:26px 15px}.navbar-header a.navbar-brand{padding:0;width:270px;margin-left:25px}.navbar-header a.navbar-brand .brand-text{color:#0098ff;position:absolute;top:50px;left:118px}.row-menu .navbar.navbar-static-top{background-color:#fff;background-image:none;box-shadow:none;border:none}.row-menu .navbar .navbar-nav.navbar-right{margin:21px 10px 0 0}.row-menu .navbar nav.main-nav{position:relative}.row-menu .navbar nav.main-nav .navbar-toggle{z-index:1;display:block;position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:26px;margin-bottom:4px;background-color:transparent;background-image:none;border:none;border-radius:0}.row-menu .navbar nav.main-nav .navbar-toggle:active .icon-bar,.row-menu .navbar nav.main-nav .navbar-toggle:hover .icon-bar{background-color:#fff}.row-menu .navbar nav.main-nav .navbar-toggle:active .close-cross,.row-menu .navbar nav.main-nav .navbar-toggle:hover .close-cross{background:url(../svg/nav-cross-lg.svg) no-repeat}.row-menu .navbar nav.main-nav .navbar-toggle:focus .icon-bar{background-color:#000}.row-menu .navbar nav.main-nav .navbar-toggle:focus .close-cross{background:url(../svg/nav-cross-black-lg.svg) no-repeat}.row-menu .navbar nav.main-nav .navbar-toggle.collapsed .close-cross{display:none}.row-menu .navbar nav.main-nav .navbar-toggle.collapsed .icon-bar{display:block}.row-menu .navbar nav.main-nav .navbar-toggle .icon-bar{background-color:#fff;width:21px;height:3px;border-radius:0;display:none}.row-menu .navbar nav.main-nav .navbar-toggle .close-cross{display:block;width:22px;height:21px;background:url(../svg/nav-cross-lg.svg) no-repeat;margin-top:-2px}.row-menu .navbar nav.main-nav div#main-nav{position:relative;width:100%;height:85px}.row-menu .navbar nav.main-nav div#main-nav ul{padding:20px 4px;margin:0}.row-menu .navbar nav.main-nav div#main-nav ul li{display:inline;padding:0 10px 0 0;line-height:90px}.row-menu .navbar nav.main-nav div#main-nav ul li a{font-family:Arial;color:#fff;font-size:23px;text-decoration:none;text-transform:uppercase;opacity:.33;font-weight:600}.row-menu .navbar nav.main-nav div#main-nav ul li a:active,.row-menu .navbar nav.main-nav div#main-nav ul li a:hover{opacity:1}.row-menu .navbar nav.main-nav div#main-nav ul li a:focus{color:#000;opacity:1}.row-menu .navbar nav.main-nav div#main-nav ul li a.active{opacity:1}.row-menu .navbar nav.main-nav #nav-user-menu{border-top:1px solid #99d7ff;width:400px;z-index:100;background-color:#0098ff;right:0;box-shadow:0 9px 10px #0006}.row-menu .navbar nav.main-nav #nav-user-menu ul{padding:0;margin:0;-webkit-box-shadow:1px 10px 20px 0 rgba(0,0,0,.25);-moz-box-shadow:1px 10px 20px 0 rgba(0,0,0,.25);box-shadow:1px 10px 20px #00000040}.row-menu .navbar nav.main-nav #nav-user-menu ul li{display:block;padding:0;border-bottom:1px solid #99d7ff;width:100%}.row-menu .navbar nav.main-nav #nav-user-menu ul li:last-child{border:none}.row-menu .navbar nav.main-nav #nav-user-menu ul li a{display:block;font-size:18px;text-decoration:none;text-transform:uppercase;font-weight:700;color:#99d7ff;padding:0 20px}.row-menu .navbar nav.main-nav #nav-user-menu ul li a:active,.row-menu .navbar nav.main-nav #nav-user-menu ul li a:focus,.row-menu .navbar nav.main-nav #nav-user-menu ul li a:hover{color:#fff;background-color:#000}.row-menu .navbar nav.main-nav #nav-user-menu ul li a.course-nav{font-family:Helvetica,Arial,sans-serif;color:#fff}.row-menu .navbar nav.main-nav #nav-user-menu ul li a span.icon{margin-left:10px;margin-top:-1px;position:absolute;opacity:.7}.row-menu .navbar nav.main-nav #nav-user-menu ul li a:hover span.icon{opacity:1}.row-menu .navbar nav.main-nav #nav-user-menu ul li #navbar-lang{padding:0;margin:0}.row-menu .navbar nav.main-nav #nav-user-menu ul li a{cursor:pointer}.row-menu .navbar nav.main-nav #nav-user-menu ul li #nav-lang-menu ul.nav.navbar-nav li a span:first-of-type{padding:0 15px}.row-menu .navbar nav.main-nav #nav-user-menu ul li #nav-lang-menu ul.nav.navbar-nav li a span:first-of-type.rtl{padding-left:0;padding-right:15px}.row-menu .navbar nav.main-nav #nav-user-menu ul li #nav-lang-menu ul.nav.navbar-nav li:first-child{border-top:1px solid #99d7ff}.row-menu .navbar nav.main-nav #nav-user-menu ul li #nav-lang-menu ul.nav.navbar-nav .language-tick{width:16px;height:16px}@media (max-width: 767px){.row-menu .navbar .navbar-header-mobile{height:60px;width:100%;position:relative;z-index:100}.row-menu .navbar .navbar-header-mobile a.navbar-brand{display:inline-block;height:60px;width:260px;font-size:18px;line-height:20px;margin-top:15px}.row-menu .navbar .navbar-header-mobile .brand-text-mobile{color:#1464a5;font-size:17px;margin-top:24px;text-transform:uppercase;position:relative;text-align:center}.row-menu .navbar nav.main-nav{margin-bottom:0}.row-menu .navbar nav.main-nav .navbar-toggle{margin-top:0;top:60px;z-index:1;margin-right:10px}.row-menu .navbar nav.main-nav #nav-user-menu{top:0}.row-menu .navbar nav.main-nav #nav-user-menu ul{width:100%}.row-menu .navbar nav.main-nav #nav-user-menu ul li a{line-height:60px;font-size:18px}.row-menu .navbar .navbar-collapse{padding:60px 0 0}}@media (min-width: 768px){.row-menu .navbar .navbar-header-mobile{height:80px}.row-menu .navbar nav.main-nav{margin-bottom:80px;position:relative}.row-menu .navbar nav.main-nav #nav-user-menu{top:80px}.row-menu .navbar nav.main-nav #nav-user-menu ul{width:100%}.row-menu .navbar nav.main-nav #nav-user-menu ul li a{line-height:85px;font-size:22px}.row-menu .navbar .navbar-collapse{padding:0}}@media (max-width: 1200px){.row-menu .navbar{margin-bottom:0}.row-menu .navbar .navbar-header-mobile{width:100%;position:relative;z-index:100}.row-menu .navbar .navbar-header-mobile a.navbar-brand{display:inline-block;width:260px;font-size:18px;line-height:20px;margin:17px 0 0 30px;padding:0;background:url(../svg/dw-logo-mobile.svg);width:40px;height:23px}.row-menu .navbar .navbar-header-mobile .brand-text-mobile{color:#1464a5;font-size:17px;text-transform:uppercase;position:relative;margin:19px auto 0;width:190px}.row-menu .navbar nav.main-nav #nav-user-menu{position:relative;width:100%;left:0;right:inherit}.row-menu .navbar nav.main-nav .navbar-toggle{padding:9px 0;margin-right:0;position:fixed;right:22px;top:13px;z-index:3000}.row-menu .navbar nav.main-nav .navbar-toggle .icon-bar{background-color:#032f59;width:14px;height:2px;border-radius:0;margin-top:3px}.row-menu .navbar nav.main-nav .navbar-toggle .close-cross{background-image:url(../svg/nav-cross-xs.svg);margin-top:3px;width:13px;height:12px}.row-menu .navbar nav.main-nav .navbar-toggle:active .icon-bar,.row-menu .navbar nav.main-nav .navbar-toggle:hover .icon-bar{background-color:#032f59}.row-menu .navbar nav.main-nav .navbar-toggle:active .close-cross,.row-menu .navbar nav.main-nav .navbar-toggle:hover .close-cross{background:url(../svg/nav-cross-xs.svg) no-repeat}.row-menu .navbar nav.main-nav .navbar-toggle:active:focus .icon-bar,.row-menu .navbar nav.main-nav .navbar-toggle:hover:focus .icon-bar{background-color:#000}.row-menu .navbar nav.main-nav .navbar-toggle:active:focus .close-cross,.row-menu .navbar nav.main-nav .navbar-toggle:hover:focus .close-cross{background:url(../svg/nav-cross-black-xs.svg) no-repeat}.row-menu .navbar .navbar-collapse{border:none}}@media (max-width: 1200px) and (min-width: 768px){.row-menu .navbar .navbar-header-mobile a.navbar-brand{background:url(../svg/dw-logo-tablet.svg);margin:24px 0 0 30px;width:54px;height:31px}}@media (max-width: 1200px) and (min-width: 768px){.row-menu .navbar .navbar-header-mobile .brand-text-mobile{font-size:27px;width:300px;margin:23px auto 0;padding-top:8px}}@media (max-width: 1200px) and (min-width: 768px){.row-menu .navbar nav.main-nav .navbar-toggle{padding:0;top:22px;margin-right:22px}}@media (max-width: 1200px) and (min-width: 768px){.row-menu .navbar nav.main-nav .navbar-toggle .icon-bar{margin-top:5px;width:21px;height:3px;border-radius:0}}@media (max-width: 1200px) and (min-width: 768px){.row-menu .navbar nav.main-nav .navbar-toggle .close-cross{background-image:url(../svg/nav-cross-md.svg);margin-top:3px;width:22px;height:21px}}@media (max-width: 1200px) and (min-width: 768px){.row-menu .navbar nav.main-nav .navbar-toggle:active .icon-bar,.row-menu .navbar nav.main-nav .navbar-toggle:hover .icon-bar{background-color:#032f59}.row-menu .navbar nav.main-nav .navbar-toggle:active .close-cross,.row-menu .navbar nav.main-nav .navbar-toggle:hover .close-cross{background:url(../svg/nav-cross-md.svg) no-repeat}.row-menu .navbar nav.main-nav .navbar-toggle:active:focus .icon-bar,.row-menu .navbar nav.main-nav .navbar-toggle:hover:focus .icon-bar{background-color:#000}.row-menu .navbar nav.main-nav .navbar-toggle:active:focus .close-cross,.row-menu .navbar nav.main-nav .navbar-toggle:hover:focus .close-cross{background:url(../svg/nav-cross-black-md.svg) no-repeat}}@media (min-width: 1200px){header{height:220px;margin:0}.row-menu .col-xs-12{height:85px}.row-menu .navbar{height:200px}.row-menu .navbar nav.main-nav{background-color:#0098ff;position:relative;top:inherit;left:0;right:inherit;margin-bottom:0}.row-menu .navbar nav.main-nav .navbar-toggle{margin-top:28px}.row-menu .navbar nav.main-nav #nav-user-menu{position:absolute;top:90px}.row-menu .navbar nav.main-nav #nav-user-menu ul li a{line-height:60px;font-size:18px}.row-menu .navbar nav.main-nav .navbar-collapse{padding:0}}@media (min-width: 1200px){div#header-row.lecture-nav{margin-bottom:20px}}div#header-row div.row-menu div.lecture-nav-container{position:relative}div#header-row div.row-menu div.lecture-nav-container div.navbar.lecture{margin-bottom:0;border:0;position:absolute;z-index:20;height:60px;width:100%}@media (min-width: 768px){div#header-row div.row-menu div.lecture-nav-container div.navbar.lecture{height:85px}}div#header-row div.row-menu div.lecture-nav-container div.navbar.lecture .excercise-nav-title{color:#fff;text-align:center}div#header-row div.row-menu div.lecture-nav-container div.navbar.lecture .excercise-nav-title h1{margin-top:0;line-height:60px;font-size:18px}@media (min-width: 768px){div#header-row div.row-menu div.lecture-nav-container div.navbar.lecture .excercise-nav-title h1{line-height:85px;font-size:25px}}@media (min-width: 992px){div#header-row div.row-menu div.lecture-nav-container div.navbar.lecture .excercise-nav-title h1{line-height:85px;font-size:25px}}@media (min-width: 1200px){div#header-row div.row-menu div.lecture-nav-container div.navbar.lecture .excercise-nav-title h1{line-height:85px;font-size:34px}}div#header-row div.row-menu div.lecture-nav-container div.navbar.lecture .lecture-navbar-nav.navbar-right{margin-right:0;position:absolute;right:-19px;top:10px}@media (min-width: 768px){div#header-row div.row-menu div.lecture-nav-container div.navbar.lecture .lecture-navbar-nav.navbar-right{right:-10px;top:19px}}div#header-row div.row-menu div.lecture-nav-container div.navbar div.lecture-title{position:absolute;color:#fff;z-index:1;padding:0 20px}div#header-row div.row-menu div.lecture-nav-container div.navbar div.lecture-title h1{margin-top:0;line-height:85px}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav{background-color:#f08c00;height:60px;position:absolute;z-index:1;width:100%;top:0}@media (min-width: 768px){div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav{height:85px}}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle{z-index:1;display:block;position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:23px;margin-bottom:8px;background-color:transparent;background-image:none;border:none;border-radius:0;color:#fff}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle:focus.collapsed .toggle-icon-container .icon-bar{background-color:#000}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle:focus .icon-close-cross{background:url(../svg/nav-cross-black-lg.svg) no-repeat}@media (min-width: 768px){div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle{margin-right:35px}}@media (min-width: 1200px){div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle{margin-right:27px}}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle .toggle-icon-container{position:relative;float:right;margin-top:3px}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle.collapsed .icon-close-cross{display:none}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle.collapsed .toggle-icon-container{margin:-4px 9px 0 0}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle.collapsed .toggle-icon-container .icon-bar{display:block;background-color:#fff;width:14px;height:2px;border-radius:0;margin-top:3px}@media (min-width: 768px){div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle.collapsed .toggle-icon-container .icon-bar{margin-top:5px;width:21px;height:3px;border-radius:0}}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle .icon-bar{background-color:#fff;width:21px;height:3px;border-radius:0;display:none}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle .icon-close-cross{display:block;width:15px;height:15px;background:url(../svg/nav-cross-lg.svg) no-repeat;background-size:cover;margin-top:-7px;margin-right:8px}@media (min-width: 768px){div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle .icon-close-cross{margin-top:-7px;width:22px;height:21px;margin-right:8px}}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle span.title{display:none;position:absolute;top:-3px;right:50px;width:150px}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle span.title:hover{opacity:1}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu{border-top:1px solid #fff;z-index:1;background-color:#f08c00;margin:-15px 0 0;position:absolute;right:0;top:75px;text-align:center;width:100%;box-shadow:0 9px 10px #0006}@media (min-width: 768px){div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu{top:100px}}@media (min-width: 1200px){div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu{width:400px}}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu ul{padding:0;margin:0;-webkit-box-shadow:1px 10px 20px 0 rgba(0,0,0,.25);-moz-box-shadow:1px 10px 20px 0 rgba(0,0,0,.25);box-shadow:1px 10px 20px #00000040;width:100%}@media (min-width: 1200px){div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu ul{width:400px}}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu ul li{position:relative;display:inline;padding:0;border-bottom:1px solid #fff;width:100%}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu ul li:last-child{border:none}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu ul li a{font-family:Helvetica,Arial,sans-serif;font-weight:700;color:#fff;font-size:17px;padding:20px;text-decoration:none}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu ul li a:active,div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu ul li a:focus,div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu ul li a:hover{background-color:#bf6f00}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu ul li a:focus{background-color:#000}@media (min-width: 768px){div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu ul li a{font-size:21px}}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu ul li a span{font-family:Helvetica,Arial,sans-serif;font-weight:400;display:block;padding:5px 0;font-size:14px}@media (min-width: 768px){div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu ul li a span{font-size:17px}}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu ul li .progress-icon{display:none;position:absolute;right:40px;top:30px}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav div#lecture-nav-user-menu ul li .progress-icon.half{right:50px}div#page-header-container{background-color:#f08c00;position:relative;text-align:center;color:#fff;height:65px}@media (min-width: 1200px){div#page-header-container{margin-bottom:20px}}div#page-header-container h1{line-height:65px;margin:0}@media (min-width: 992px){div#page-header-container{height:85px}div#page-header-container h1{line-height:85px;margin:0}}div.input-header-video{position:relative}div.input-header-video div.video-overlay{opacity:1;color:#fff;cursor:pointer;position:absolute;background:url(../svg/playIcon.svg) no-repeat center center rgba(0,0,0,.3);width:100%;height:100%;z-index:1}div.input-header-video div.video-overlay p{text-align:center;text-transform:uppercase;position:absolute;bottom:30%;margin:0 auto;width:100%}div.input-header-video div.video-overlay:focus,div.input-header-video div.video-overlay:hover{opacity:.75}div.input-header-video img{width:100%;height:auto}div.input-header-img{width:100%}div.input-header-img img{width:100%;height:auto}div.input-header-img div.input-header-img-content{color:#fff;position:absolute;padding:20px}div.input-header-img div.input-header-img-content h1{margin-top:0;font-size:40px}div.input-header-img div.input-header-img-content p{font-size:17px}div.input-header-audio{position:relative}div.input-header-audio div.audio-overlay{opacity:1;cursor:pointer;position:absolute;color:#fff;background:url(../svg/playIcon-audio.svg) no-repeat center center rgba(0,0,0,.25);width:100%;height:100%;z-index:1}div.input-header-audio div.audio-overlay p{text-align:center;text-transform:uppercase;position:absolute;bottom:30%;margin:0 auto;width:100%}div.input-header-audio div.audio-overlay:focus,div.input-header-audio div.audio-overlay:hover{background:url(../svg/playIcon-audio.svg) no-repeat center center rgba(0,0,0,.5)}div.input-header-audio img.cover{position:relative;width:100%}div.input-header-audio audio{position:relative;width:100%;z-index:2}div.main-footer{width:100%;margin:1px 0 0;line-height:45px;color:#fff}@media (min-width: 768px){div.main-footer{line-height:90px;height:90px}}@media (min-width: 1200px){div.main-footer{margin:20px 0}}div.main-footer ul{margin:0;padding:10px 12px;text-align:center}@media (min-width: 768px){div.main-footer ul{padding:0 12px}}div.main-footer ul li{display:inline-block;list-style-type:none;margin-right:12px}div.main-footer ul li a:active,div.main-footer ul li a:focus,div.main-footer ul li a:hover{color:#fff;text-decoration:none}div.main-footer ul li .text,div.main-footer ul li a{color:#99d7ff;font-size:14px}@media (min-width: 768px){div.main-footer ul li .text,div.main-footer ul li a{font-size:15px}}div.main-footer ul li.coop span{padding-right:20px}div.main-footer ul li.coop a img{opacity:.5}div.main-footer ul li.coop a:hover img{opacity:1}@media (min-width: 768px){div.main-footer ul li.coop{float:right}}.footer-gradient{background:#1b9efd}@media (min-width: 1200px){.footer-gradient{background:#1b9efd;background:-moz-linear-gradient(top,#1b9efd 0,#0e62c1 100%);background:-webkit-linear-gradient(top,#1b9efd 0,#0e62c1 100%);background:linear-gradient(to bottom,#1b9efd 0,#0e62c1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#1b9efd",endColorstr="#0e62c1",GradientType=0)}}@media (max-width: 767px){div.g-recaptcha iframe{transform:scale(.96);transform-origin:0 0}}span.twitter-typeahead{width:100%}span.twitter-typeahead input[type=search].tt-input{background-image:url(../svg/icon-lupe.svg);background-repeat:no-repeat;padding-left:20px;padding-right:44px;background-position:93% 14px}@media (min-width: 768px){span.twitter-typeahead input[type=search].tt-input{background-position:97% 14px}}@media (min-width: 992px){span.twitter-typeahead input[type=search].tt-input{background-position:98% 14px}}span.twitter-typeahead .input-lg{padding-left:20px}div.tt-menu{position:absolute;top:auto;left:0;width:100%;background-color:#fff;border-left:1px solid #BBB;border-right:1px solid #BBB;font-family:DWTheAntiquaB,Georgia,serif;font-weight:400;z-index:1001;padding-left:0}.tt-suggestion{display:block;width:100%;margin-bottom:0;padding:20px;font-family:DWTheAntiquaB,Georgia,serif;font-weight:400;color:#666;text-decoration:none;border-bottom:1px solid #BBB}.tt-suggestion em,.tt-suggestion span.hilite,.tt-suggestion strong{font-family:DWTheAntiquaBBold,Georgia,serif;font-weight:400;color:#000}.tt-suggestion.tt-cursor,.tt-suggestion:hover{background-color:#f5f4f2}.tt-suggestion strong{color:inherit}.progress-icon{position:relative}.progress-icon.half{background-color:#fff;height:16px;width:8px;margin-right:8px;border-radius:16px 0 0 16px}.progress-icon.half:after{content:"";background-color:transparent;border:2px solid #FFF;height:16px;width:16px;position:absolute;border-radius:16px}.progress-icon.full{background-color:#fff;height:16px;width:16px;border-radius:16px}.progress-icon.none{background-color:transparent;border:2px solid #FFF;height:16px;width:16px;border-radius:16px}.progress-icon.gray{background-color:#bbb}.progress-icon.gray:after{border-color:#bbb}.progress-icon.gray.none{background-color:transparent;border-color:#bbb}.progress-icon.good{background-color:transparent;border:none;height:20px;width:20px;background:url(../svg/star-white.svg) top left no-repeat}.progress-icon.cert{background-color:transparent;border:none;width:16px;height:24px;background:url(../svg/icon-course-cert-gray.svg) top left no-repeat}.progress-icon.gray.good{background:url(../svg/star-gray.svg) top left no-repeat}.progress-icon.black.good{background:url(../svg/star.svg) top left no-repeat}.progress-icon.black.cert{background:url(../svg/icon-course-cert-k.svg) top left no-repeat}a.audio-example h4.modal-title{background-image:url(../svg/icon-bubble-answer-3e.svg);background-repeat:no-repeat;background-size:15px 15px;background-position-y:4px;text-indent:24px}a.audio-example h2{background-image:url(../svg/icon-bubble-answer-3e.svg);background-repeat:no-repeat;background-size:18px 18px;background-position-y:3px;text-indent:27px;text-decoration:none;color:#3e3e3e}a.audio-example:hover h2{background-image:url(../svg/icon-bubble-answer-audio.svg);text-decoration:underline;color:#0098ff}p a.audio-example{background-repeat:no-repeat;background-size:14px 14px;background-position-x:4px;background-position-y:3px;text-decoration:none}@media (min-width: 768px){p a.audio-example{background-size:15px 15px;background-position-x:7px;background-position-y:3px}}@media (min-width: 992px){p a.audio-example{background-size:15px 15px;background-position-x:7px;background-position-y:4px}}@media (min-width: 1200px){p a.audio-example{background-size:17px 17px;background-position-x:6px;background-position-y:4px}}p a.audio-example:hover{text-decoration:none;border-bottom:2px dotted #0098FF}.container{width:100%}@media (min-width: 768px){.container{width:100%;margin:0 auto}}@media (min-width: 992px){.container{width:100%}}@media (min-width: 1200px){.container{margin-right:auto;margin-left:auto;padding-left:20px;padding-right:20px;width:1240px}}.container.page-container{background:#FFF;margin:0 auto;padding:0;overflow-x:hidden;overflow-y:hidden}@media (min-width: 1200px){.container.page-container{background:#FFF;margin:40px auto;padding:0 20px;min-height:600px}}@media (max-width: 1199px) and (min-width: 768px){.container.page-container{min-height:600px}}@media (max-width: 991px){.container.page-container{min-height:500px}}.row{margin-left:-20px;margin-right:-20px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:20px;padding-right:20px}body{background:#FFF}@media (min-width: 1200px){body{background:url(data:image/jpeg;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2JnLWR3LWRlc2t0b3AuNGFlYzA3M2YuanBnIjs=) center top no-repeat #f5f4f2;width:100%;clear:both;padding-bottom:30px}}.section.exercise-container{padding:0 20px}@media (min-width: 768px){.section.exercise-container{padding:0}}.section.exercise-container.grid .row{border-bottom:1px solid #fff;margin-bottom:20px}.section.exercise-container.grid .row [class*=col-]{background-color:#f08c00;height:40px;border-right:1px solid #fff}.section.exercise-container.template{padding:20px;font-size:20px;line-height:36px}.valign-wrapper{display:flex;align-items:center}audio,canvas,progress,video{display:inline-block;vertical-align:middle}.template .section.grid .row{border-bottom:1px solid #fff;margin-bottom:20px}.template .section.grid .row [class*=col-]{background-color:#f08c00;height:40px;border-right:1px solid #fff}.padding-right{padding-right:0!important}@media (min-width: 1200px){.padding-right{padding-right:20px!important}}.padding-left{padding-left:0!important}@media (min-width: 1200px){.padding-left{padding-left:20px!important}}.padding{padding-left:0!important;padding-right:0!important}@media (min-width: 1200px){.padding{padding-left:20px!important;padding-right:20px!important}}.padding-right-none{padding-right:0!important}@media (min-width: 1200px){.padding-right-none{padding-right:0!important}}.padding-left-none{padding-left:0!important}@media (min-width: 1200px){.padding-left-none{padding-left:0!important}}.padding-none{padding-left:0!important;padding-right:0!important}@media (min-width: 1200px){.padding-none{padding-left:0!important;padding-right:0!important}}.breakpoint-indicator{bottom:50px;left:0;opacity:0;position:absolute;visibility:hidden;z-index:-1}.breakpoint-indicator span{display:none}@media (max-width: 767px){.breakpoint-indicator span.screen-xs{display:block}}@media (min-width: 768px) and (max-width: 991px){.breakpoint-indicator span.screen-sm{display:block}}@media (min-width: 992px) and (max-width: 1199px){.breakpoint-indicator span.screen-md{display:block}}@media (min-width: 1200px){.breakpoint-indicator span.screen-lg{display:block}}.background-container{background-repeat:no-repeat;background-position:center top;background-size:cover}.collapse.in{overflow:hidden}div#bpIndicator{position:fixed;top:0;left:10vw;z-index:9999;padding:6px 10px;border-bottom-left-radius:4px;border-bottom-right-radius:4px;color:#fff;font:14px/14px Helvetica,Arial,sans-serif;background-color:#7b60e5d9}.img-responsive{width:100%;height:auto}.keyboard-opener{display:none}@media (min-width: 992px){.keyboard-opener{display:inline;margin:0 10px 0 -5px}}.keyboard-opener.textarea{display:none}@media (min-width: 992px){.keyboard-opener.textarea{display:inline;margin:10px 0 0;float:right}}div.main-course-overview-container{position:relative;text-align:center;height:800px}div.main-course-overview-container .main-course-overview a.main-course-container{text-decoration:none;color:#fff}div.main-course-overview-container .main-course-overview a.main-course-container:active,div.main-course-overview-container .main-course-overview a.main-course-container:focus,div.main-course-overview-container .main-course-overview a.main-course-container:hover{color:#ffffffbf}div.main-course-overview-container div.main-course-overview-title{color:#fff;margin:20px 0}@media (min-width: 768px){div.main-course-overview-container div.main-course-overview-title{margin:40px 0}}@media (min-width: 992px){div.main-course-overview-container div.main-course-overview-title{margin:80px 0}}@media (min-width: 1200px){div.main-course-overview-container div.main-course-overview-title{margin:220px 0 0}}div.main-course-overview-container div.main-course-overview-title h1{font-family:Helvetica,Arial,sans-serif;font-weight:700;margin-top:0}div.main-course-overview-container div.main-course-overview-title p{font-family:Helvetica,Arial,sans-serif}div.respHeaderImgContainer{display:block;width:100%;height:240px;position:relative;background-color:#808080bf;color:#fff;overflow:hidden}@media screen and (min-width: 768px){div.respHeaderImgContainer{height:320px}}.respHeaderImgContainer .course-headline-wrapper{width:100%;position:absolute;bottom:0;margin-bottom:15px;left:0;z-index:2}@media screen and (max-width: 439px){.respHeaderImgContainer img{height:100%;width:inherit;max-width:none;border-color:transparent}}.respHeaderImgContainer img{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:1}.course-headline h1,.course-headline p{font-family:DWTheAntiquaB,Georgia,serif;font-weight:400;margin:0}.course-headline h1{margin-bottom:20px}.course-headline span{font-family:Helvetica,Arial,sans-serif;font-weight:700;opacity:.5;filter:alpha(opacity=50)}@media (min-width: 768px){.course-headline{height:280px}.course-headline h1{margin-bottom:90px}}@media (min-width: 1200px){.course-headline{height:300px}}.course-headline .course-headline-wrapper{width:100%;height:100%;position:absolute;top:0;left:0;z-index:2}.course-headline .course-headline-wrapper div[class^=col-]:first-child{position:absolute;top:90px}.course-headline .course-headline-wrapper div[class^=col-]:first-child h1{white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}.course-headline .course-headline-wrapper div[class^=col-]:last-child{position:absolute;bottom:14px}@media (min-width: 768px){.course-headline .course-headline-wrapper div[class^=col-]:first-child h1{white-space:normal;overflow-x:auto;overflow-y:hidden}.course-headline .course-headline-wrapper div[class^=col-]:first-child{position:absolute;top:130px}}.course-list{background-color:#f5f4f2;margin:0;overflow:hidden}@media (min-width: 1200px){.course-list>[class*=col-]:nth-child(2n){background-color:#fff}}.course-list .row{border-top:1px solid rgba(128,128,128,.5)}.course-list .row h2{color:#4a4a4a;padding:50px 30px 60px 20px;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:22px;line-height:23px}.course-list .row h2 span{font-family:Helvetica,Arial,sans-serif;font-weight:400;opacity:.5;filter:alpha(opacity=50)}@media (max-width: 1199px){.course-list .row h2{padding:15px 40px 25px 20px}.course-list .row h2:after{position:absolute;right:20px;width:24px;height:20px;content:"";background:transparent url(../svg/nav-arrow-up-black.svg) no-repeat top left}}.course-list .row a{display:block;text-decoration:none;color:inherit}@media (max-width: 1199px){.course-list .row a.collapsed h2:after{position:absolute;right:20px;width:24px;height:20px;content:"";background:transparent url(../svg/nav-arrow-down-black.svg) no-repeat top left}}.course-list .row h3{font-family:DWTheAntiquaBBold,Georgia-Bold,serif;color:#3e3e3e;font-size:17px;line-height:24px;margin-top:11px;margin-bottom:3px;padding-left:20px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;width:260px}@media (min-width: 768px){.course-list .row h3{width:75%}}@media (min-width: 1200px){.course-list .row h3{width:250px}}.course-list .row p{color:#9b9b9b;font-size:14px;line-height:21px}.course-list .row p span{display:block}@media (min-width: 768px){.course-list .row p span{display:inline-block}}.course-list .row p span strong{color:#000000b3}@media (min-width: 1200px){.course-list .row p span strong{color:inherit}}.course-list .row p span.title{font-family:DWTheAntiquaB,Georgia,serif;white-space:nowrap;text-overflow:ellipsis;overflow-y:hidden}.course-list .row p span.desciption{font-family:DWTheAntiquaB,Georgia,serif;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.course-list .row p span.desciption,.course-list .row p span.headline,.course-list .row p span.title{overflow:hidden;width:calc(100vw - 80px)}@media (min-width: 1200px){.course-list .row p span.desciption,.course-list .row p span.headline,.course-list .row p span.title{width:230px}}@media (min-width: 768px) and (max-width: 1199px){.course-list .row p span.desciption,.course-list .row p span.title{text-overflow:inherit;overflow:inherit}}.course-list .row .progress-icon{float:right;margin-right:20px}.course-list .row .progress-icon.half{margin-right:30px}.course-list .row+.row{border-top:none}.course-list .row+.row [class*=col-]{display:table;width:100%;height:102px;border-top:1px solid rgba(128,128,128,.5)}.course-list .row+.row a{display:block;height:90px;text-decoration:none;color:inherit}.course-list .row+.row img{width:90px}.course-list .row+.row p{padding-top:0;padding-left:20px;width:100%}.course-list .row+.row .progress-icon{margin-top:-22px}.course-list .row+.row img,.course-list .row+.row p{vertical-align:top;display:table-cell}.course-list .row [class*=col-]{padding:0}.course-list [class*=col-]>.row:first-child{background-color:#fff}.course-list:after{width:100%;height:1px;border-top:1px solid rgba(128,128,128,.5)}.course{margin:0}.course-lead{border-top:1px solid rgba(128,128,128,.5);margin:0;padding:0 20px 60px}@media (min-width: 768px){.course-lead{padding:15px 20px 25px}}@media (min-width: 992px){.course-lead{padding:50px 20px 60px}}.course-lead a h2{color:#000}.course-lead a:active,.course-lead a:hover,.course-lead a:visited{text-decoration:none;outline:none transparent}.course-lead h2{font-size:22px;line-height:23px}@media (max-width: 767px){.course-lead h2{white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;margin-right:30px}}.course-lead h2.nav-arrow:after{position:absolute;top:28px;right:20px;width:24px;height:20px;content:"";background:transparent url(../svg/nav-arrow-up-black.svg) no-repeat top left}@media (min-width: 768px){.course-lead h2.nav-arrow:after{top:42px}}@media (min-width: 992px){.course-lead h2.nav-arrow:after{top:78px}}.course-lead h2.nav-arrow.mump:after{background:transparent url(../svg/nav-arrow-down-black.svg) no-repeat top left}.course-lead h2 span{opacity:.5}.course-lead a.nav-arrow{z-index:1;position:absolute;top:28px;right:20px;width:24px;height:20px;content:"";background:transparent url(../svg/nav-arrow-up-black.svg) no-repeat top left}@media (min-width: 768px){.course-lead a.nav-arrow{top:42px}}@media (min-width: 992px){.course-lead a.nav-arrow{top:78px}}.course-lead a.nav-arrow.collapsed{background:transparent url(../svg/nav-arrow-down-black.svg) no-repeat top left}.course-reset{position:absolute;top:55px;right:15px;z-index:10;color:#fff;background-color:#bbb;padding-bottom:2px}@media (min-width: 768px){.course-reset{top:46px;right:53px}}@media (min-width: 992px){.course-reset{top:55px;right:20px}}.course-lead .course-reset{position:absolute;top:60px;left:20px;right:inherit;z-index:30;color:#fff;background-color:#bbb;padding-bottom:6px}@media (min-width: 768px){.course-lead .course-reset{top:31px;left:inherit;right:150px}}@media (min-width: 992px){.course-lead .course-reset{top:68px;left:inherit;right:150px}}.course-lead .course-certificate{position:absolute;top:67px;left:90px;right:inherit;z-index:40;color:#bbb;background-color:transparent;padding-bottom:6px}@media (max-width: 767px){.course-lead .course-certificate .progress-icon.gray.half{position:absolute;right:-50px}}@media (min-width: 768px){.course-lead .course-certificate{top:37px;left:inherit;right:80px}}@media (min-width: 992px){.course-lead .course-certificate{top:73px;left:inherit;right:90px}}.course-lead-overview{border-top:none;padding:30px 20px}.course-lead-overview .course-reset{top:15px;left:inherit;right:80px}.course-lead-overview .course-certificate{top:23px;left:inherit;right:45px}.course-score{position:absolute;top:33px;right:15px;z-index:20;font-size:14px;color:#aaa}@media (min-width: 768px){.course-score{top:14px;right:56px}}@media (min-width: 992px){.course-score{top:33px;right:20px}}.course-score .low{color:#be232d}.course-score .mid{color:#666}.course-score .good{color:#82b905}.learn-status .hide{display:none}.learn-status .row p span.desciption,.learn-status .row p span.headline,.learn-status .row p span.title{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;width:calc(100vw - 90px)}@media (min-width: 1200px){.learn-status .row p span.desciption,.learn-status .row p span.headline,.learn-status .row p span.title{width:210px}}div.main-info-content{padding:10% 5%;font-family:DWTheAntiquaB;background-color:#f4f3f1}@media (min-width: 1200px){div.main-info-content{padding:10% 20%}}div.main-info-content h2{font-size:30px;line-height:1.1em;margin-top:0;margin-bottom:1em}div.main-info-content p{color:#4a4a4a}div.main-info-content p b,div.main-info-content p strong{font-family:DWTheAntiquaBBold,Georgia,serif;font-weight:400;color:#3e3e3e}div.main-info-content p em,div.main-info-content p i{font-family:DWTheAntiquaBItalic,Georgia,serif;font-weight:400;font-style:normal}div.start-lecture{text-align:center;margin:70px 0 50px}div.lecture-nav-header{background:#F08C00;color:#fff;height:85px;padding:10px}div.lecture-nav-header h1{margin:0}div.section.vocabulary{background-color:#f4f3f1}div.section.vocabulary.copy{font-family:DWTheAntiquaB,serif}div.row.vocabulary{margin-bottom:0;color:#666}.vocabulary-entry:first-child{border-top:1px solid #BBB}.vocabulary-entry:first-child .richtext-content-container p strong{font-family:DWTheAntiquaBBold,Georgia,serif;font-weight:400;font-size:105%;color:#3e3e3e}@media (min-width: 768px){.vocabulary-entry{border-top:1px solid #BBB}}.richtext-content-container:empty{margin-top:-20px}div.row.vocabulary.list-end{margin-bottom:20px}.exercise-headline.standalone{margin-top:-10px}.exercise-headline.standalone p{margin-bottom:0}@media (min-width: 768px){.exercise-headline.standalone{margin-top:30px}.exercise-headline.standalone p{margin-bottom:10px}}@media (min-width: 1200px){.exercise-headline.standalone{margin-top:50px}.exercise-headline.standalone p{margin-bottom:20px}}.result-headline{padding:60px 30px;text-align:center}.result-headline h1{font-size:70px;line-height:70px;margin:0}.result-headline p{font-size:18px;line-height:25px;margin:0}@media (min-width: 992px){.result-headline h1{font-size:90px;line-height:90px}}.result-headline.score{background-color:#a9a094;color:#fff}.result-headline.recommendation{background-color:#f5f4f2;color:#3e3e3e}@media (max-width: 767px){.main-course[class*=assess]{height:180px}.main-course[class*=assess] h2{font-size:36px;line-height:40px;display:inline;float:initial;width:auto;margin:0}.main-course[class*=assess] p{max-width:100%;max-height:100%;overflow:visible;opacity:1}}.row.breakout{margin-left:-40px;margin-right:-40px}@media (min-width: 768px){.row.breakout{margin-left:-20px;margin-right:-20px}}div.section.vocabulary.alphabet{background-color:#fff}div.section.vocabulary.alphabet .row.vocabulary p{text-align:center}.row.alphabet-not-visited{opacity:.33}h2.konsonant,h2.vokal{text-align:center;font-size:60px;line-height:60px}@media (min-width: 768px){h2.konsonant,h2.vokal{font-size:65px;line-height:60px}}@media (min-width: 992px){h2.konsonant,h2.vokal{font-size:70px;line-height:70px}}@media (min-width: 1200px){h2.konsonant,h2.vokal{font-size:80px;line-height:80px}}h2.konsonant{color:#1464a5}h2.vokal{color:#e1500f}.exercise-questions.inactive{opacity:1}.exercise-questions .inactive{cursor:not-allowed;pointer-events:none;opacity:.65!important;filter:alpha(opacity=65)!important;-webkit-box-shadow:none;box-shadow:none}.exercise-questions .dropwdowns-inline p:not(:first-child){display:inline}.lecture-exercise-nav .lecture-nav-container{background-color:#f08c00}.exercise-input-container{margin:0}@media (min-width: 992px){.exercise-input-container{margin:0 -40px}}.exercise-container[data-type=trainer-1]{opacity:0;-webkit-transition:opacity .3s ease;-moz-transition:opacity .3s ease;-o-transition:opacity .3s ease;transition:opacity .3s ease}.exercise-container[data-type=trainer-1] [data-for-step]{display:none}.exercise-container[data-type=trainer-1] [data-for-step].active{display:block}.exercise-container[data-type=trainer-1] .bubble .hint{display:block;font-size:80%;font-style:italic}.exercise-container[data-type=trainer-1] .audio.disabled{cursor:default;padding-left:20px;text-decoration:none}.exercise-container[data-type=trainer-1] .audio.disabled .exercise-play-audio{display:none}.exercise-container[data-type=trainer-1] .answer-multiple-text:hover:after{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;border-left-color:#0098ff}.exercise-container[data-type=trainer-1] a.smileys{display:block;float:none}.exercise-container[data-type=trainer-1].ready{opacity:1}.exercise-container[data-type=trainer-1].busy{opacity:0}.exercise-container[data-type=trainer-1].ok a.smileys[data-is-correct="1"] circle.dot{fill:#91b423!important}.exercise-container[data-type=trainer-1].not-ok a.smileys[data-is-correct="0"] circle.dot{fill:#e1500f!important}.exercise-container .headline-container.row{margin-bottom:60px}.exercise-container .headline-container.row.textOnlyIntro{margin-top:60px;margin-bottom:10px}.exercise-container .question-row,.exercise-container .row{margin-top:0;margin-bottom:50px}.exercise-container .row.noVMargins,.exercise-container .row.noVMargins .row{margin-top:0;margin-bottom:0}.exercise-container .exercise-nav{width:100%;position:relative;text-align:center}.exercise-container .exercise-nav a{display:inline-block;position:absolute;top:0;width:10px;height:23px}.exercise-container .exercise-nav a.prev-exercise{background:url(../svg/arrow-left.svg);left:0}.exercise-container .exercise-nav a.prev-exercise:active,.exercise-container .exercise-nav a.prev-exercise:focus,.exercise-container .exercise-nav a.prev-exercise:hover{background:url(../svg/arrow-left-hover.svg)}.exercise-container .exercise-nav a.next-exercise{background:url(../svg/arrow-right.svg);right:0}.exercise-container .exercise-nav a.next-exercise:active,.exercise-container .exercise-nav a.next-exercise:focus,.exercise-container .exercise-nav a.next-exercise:hover{background:url(../svg/arrow-right-hover.svg)}.exercise-container .exercise-nav{height:28px;margin:16px 0}.exercise-container .exercise-nav.bottom{margin:0 0 60px}.exercise-container .exercise-questions.finished a.answer-link-container{pointer-events:none}.exercise-container .exercise-questions.finished a.answer-link-container:active .answer,.exercise-container .exercise-questions.finished a.answer-link-container:focus .answer,.exercise-container .exercise-questions.finished a.answer-link-container:hover .answer{background-color:#f4f3f1;color:#333;margin-left:0}.exercise-container .exercise-questions.finished a.answer-link-container:active .answer.answer-text-audio,.exercise-container .exercise-questions.finished a.answer-link-container:active .answer.choice,.exercise-container .exercise-questions.finished a.answer-link-container:active .answer.pronunciation-text-choice,.exercise-container .exercise-questions.finished a.answer-link-container:active .answer.text-choice,.exercise-container .exercise-questions.finished a.answer-link-container:focus .answer.answer-text-audio,.exercise-container .exercise-questions.finished a.answer-link-container:focus .answer.choice,.exercise-container .exercise-questions.finished a.answer-link-container:focus .answer.pronunciation-text-choice,.exercise-container .exercise-questions.finished a.answer-link-container:focus .answer.text-choice,.exercise-container .exercise-questions.finished a.answer-link-container:hover .answer.answer-text-audio,.exercise-container .exercise-questions.finished a.answer-link-container:hover .answer.choice,.exercise-container .exercise-questions.finished a.answer-link-container:hover .answer.pronunciation-text-choice,.exercise-container .exercise-questions.finished a.answer-link-container:hover .answer.text-choice{pointer-events:none}.exercise-container .exercise-questions.finished .image-choice:active,.exercise-container .exercise-questions.finished .image-choice:focus,.exercise-container .exercise-questions.finished .image-choice:hover{border:5px solid #F5F4F2}.exercise-container .exercise-nav-title{font-size:17px;line-height:28px;color:#938a7f}.exercise-container .exercise-nav-title em{font-style:normal}.exercise-container .exercise-nav-title span{color:#d1c9c2}@media (min-width: 768px){.exercise-container .exercise-nav{height:30px;margin:27px 0}.exercise-container .exercise-nav-title{font-size:21px;line-height:30px}}@media (min-width: 992px){.exercise-container .exercise-nav{height:30px;margin:30px 0}.exercise-container .exercise-nav-title{font-size:24px;line-height:30px}}@media (min-width: 1200px){.exercise-container .exercise-nav{height:30px;margin:50px 0}}.exercise-container .exercise-content [class*=col-]{padding-left:0;padding-right:0}@media (min-width: 992px){.exercise-container .exercise-content [class*=col-]{padding-left:20px;padding-right:20px}}.exercise-container .answer,.exercise-container .bubble{position:relative;padding:20px;margin-bottom:30px}@media (min-width: 768px){.exercise-container .answer,.exercise-container .bubble{margin-bottom:0}}.exercise-container .bubble{background-color:#0098ff;color:#fff;margin-right:0;display:block}.exercise-container .bubble:after{display:block;position:absolute;z-index:10;content:"";top:30px;top:calc(38%);left:-20px;height:4px;width:0;background-color:#0098ff;border-top:20px solid #FFF;border-right:20px solid #0098FF}.exercise-container .bubble.audio{cursor:pointer;min-height:61px;position:relative;padding-right:50px}.exercise-container .bubble.audio:focus{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#99d7ff}.exercise-container .bubble.audio:focus:after{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;border-right:20px solid #000}.exercise-container .bubble.audio.playing{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#000}.exercise-container .bubble.audio.playing:after{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;border-right:20px solid #000}.exercise-container .bubble.audio.ending{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#0098ff;border-right-color:#0098ff}.exercise-container .bubble.audio.ending:after{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;border-right:20px solid #0098FF}.exercise-container .bubble.audio.right:focus{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#99d7ff}.exercise-container .bubble.audio.right:focus:after{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;border-right:0 solid #000}.exercise-container .bubble.audio.right.playing{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#000}.exercise-container .bubble.audio.right.playing:after{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;border-right:0 solid #000}.exercise-container .bubble.audio.right.ending{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#0098ff;border-right-color:#0098ff}.exercise-container .bubble.audio.right.ending:after{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;border-right:0 solid #0098FF}.exercise-container .bubble.audio .exercise-play-audio{background:url(../svg/icon-bubble-question-audio.svg) no-repeat;width:20px;height:19px;position:absolute;right:18px;top:22px}.exercise-container .bubble.text{background-color:#a9a094}.exercise-container .bubble.text:after{display:block;position:absolute;z-index:10;content:"";top:30px;top:calc(38%);left:-20px;height:4px;width:0;background-color:#a9a094;border-top:20px solid #fff;border-right:20px solid #A9A094}.exercise-container .bubble.image{background-color:#a9a094;padding:0 0 64px}.exercise-container .bubble.image:after{display:block;position:absolute;z-index:10;content:"";top:30px;top:calc(38%);right:-20px;height:4px;width:0;background-color:#a9a094;border-top:20px solid #fff;border-right:20px solid #A9A094}.exercise-container .bubble-image-container img{width:100%}.exercise-container .bubble-image-container .bubble-text-image{min-height:61px;padding:20px}.exercise-container .answer{background-color:#f4f3f1;color:#333;margin-left:0}.exercise-container .answer:after{display:block;position:absolute;z-index:10;content:"";top:30px;top:calc(38%);right:-20px;height:4px;width:0;background-color:#f4f3f1;border-top:20px solid #fff;border-left:20px solid #f4f3f1}.exercise-container .answer.audio{min-height:61px;width:160px}.exercise-container .answer.audio .answer-text-audio{position:relative}.exercise-container .answer.audio .answer-text-audio.removeHover:hover{background-color:#f4f3f1}.exercise-container .answer.audio .exercise-play-audio{background:url(../svg/icon-bubble-answer-audio.svg) no-repeat;width:20px;height:19px;position:relative;right:10px}.exercise-container .answer.cloze-text input.input-cloze{width:80px;height:34px;display:inline;margin:0 0 25px;border-radius:0;border:1px dashed #A9A094}.exercise-container .answer.cloze-text span:first-child{margin:0 10px 0 0}.exercise-container .answer.cloze-text span{margin:0 10px}.exercise-container a.answer-link-container{color:#333;text-decoration:none}.exercise-container a.answer-link-container:active,.exercise-container a.answer-link-container:hover{text-decoration:none;color:#fff}.exercise-container a.answer-link-container:active .choice,.exercise-container a.answer-link-container:active .pronunciation-text-choice,.exercise-container a.answer-link-container:active div.answer.text-choice,.exercise-container a.answer-link-container:hover .choice,.exercise-container a.answer-link-container:hover .pronunciation-text-choice,.exercise-container a.answer-link-container:hover div.answer.text-choice{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#0098ff;color:#fff}.exercise-container a.answer-link-container:active .choice.removeHover:hover,.exercise-container a.answer-link-container:active .pronunciation-text-choice.removeHover:hover,.exercise-container a.answer-link-container:active div.answer.text-choice.removeHover:hover,.exercise-container a.answer-link-container:hover .choice.removeHover:hover,.exercise-container a.answer-link-container:hover .pronunciation-text-choice.removeHover:hover,.exercise-container a.answer-link-container:hover div.answer.text-choice.removeHover:hover{background-color:#f4f3f1;color:#000}.exercise-container a.answer-link-container:focus{text-decoration:none;color:#fff}.exercise-container a.answer-link-container:focus .choice,.exercise-container a.answer-link-container:focus .pronunciation-text-choice,.exercise-container a.answer-link-container:focus div.answer.text-choice{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#99d7ff;color:#fff}.exercise-container .dotted-outline{position:relative;background:#fff;border:2px dotted #D1C9C2;min-height:110px;overflow:hidden;padding:14px 0 0}.exercise-container .dotted-outline:after,.exercise-container .dotted-outline:before{left:100%;top:50%;content:" ";height:4px;width:0;right:0;position:absolute;pointer-events:none}.exercise-container .dotted-outline:after{z-index:10;top:50%;background-color:#f4f3f1;border-top:20px solid #fff;border-left:20px solid #D1C9C2}.exercise-container .dotted-outline:before{z-index:11;top:calc(51%);border-top:18px solid transparent;border-left:18px solid #fff}.exercise-container .answer-sorting-collection{margin-top:20px;padding-left:0;padding-right:0;text-align:right}.exercise-container .answer-sorting-collection .answer-sorting-btn{white-space:normal;height:auto;margin-left:5px;margin-right:5px;text-align:right}.exercise-container .answer-sorting-collection-image{margin-top:20px;padding-left:20px;text-align:right}.exercise-container .answer-sorting-collection-image .answer-sorting-btn{margin-left:10px}.exercise-container .answer-sorting-collection-image .answer-sorting-image{margin-left:10px}.exercise-container .answer-sorting-target .answer-sorting-btn{margin-right:5px;margin-left:5px;white-space:normal;height:auto;padding-left:8px;padding-right:8px;-webkit-transition:margin .3s ease-in,padding .4s ease-out .3s;-moz-transition:margin .3s ease-in,padding .4s ease-out .3s;-o-transition:margin .3s ease-in,padding .4s ease-out .3s;transition:margin .3s ease-in,padding .4s ease-out .3s}.exercise-container .answer-sorting-target.merged .answer-sorting-btn:not(:first-child){border-left-width:0;margin-left:0;padding-left:.02em}.exercise-container .answer-sorting-target.merged .answer-sorting-btn:not(:last-child){border-right-width:0;margin-right:0;padding-right:0}.exercise-container .answer-sorting-target-image{padding-left:20px}.exercise-container .answer-sorting-target-image .answer-sorting-image{margin-right:10px}.exercise-container .answer-sorting-btn{width:auto;background:#3e3e3e;color:#fff;text-transform:none;font-size:16px;height:30px;padding:5px 8px;margin-bottom:10px;border-radius:0;line-height:18px}.exercise-container .answer-sorting-btn:active,.exercise-container .answer-sorting-btn:hover{-webkit-transition:all .1s linear;-moz-transition:all .1s linear;-o-transition:all .1s linear;transition:all .1s linear;background-color:#0098ff;color:#fff}.exercise-container .answer-sorting-btn:focus{-webkit-transition:all .1s linear;-moz-transition:all .1s linear;-o-transition:all .1s linear;transition:all .1s linear;background-color:#99d7ff;color:#fff}.exercise-container .answer-sorting-btn.wrong{background-color:#be232d!important}.exercise-container .answer-sorting-btn.correct{background-color:#82b905!important}.exercise-container .answer-sorting-btn.solved:focus{background-color:#000!important}.exercise-container .answer-sorting-btn.removeHover:hover{background-color:#3e3e3e}.exercise-container .answer-sorting-image{width:auto;height:60px;text-transform:none;padding:0;margin-bottom:14px;border-radius:0;line-height:18px;border:2px solid #FFF}.exercise-container .answer-sorting-image:active,.exercise-container .answer-sorting-image:hover{-webkit-transition:all .1s linear;-moz-transition:all .1s linear;-o-transition:all .1s linear;transition:all .1s linear;border-color:#0098ff}.exercise-container .answer-sorting-image:focus{-webkit-transition:all .1s linear;-moz-transition:all .1s linear;-o-transition:all .1s linear;transition:all .1s linear;border-color:#99d7ff}.exercise-container .answer-sorting-image img{width:auto;height:56px}.exercise-container .answer-sorting-image.removeHover:hover{border-color:#fff}.exercise-container .answer.choice,.exercise-container .answer.text-choice{text-align:center;margin-bottom:2px}.exercise-container .answer.choice:active,.exercise-container .answer.choice:hover,.exercise-container .answer.text-choice:active,.exercise-container .answer.text-choice:hover{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#0098ff;color:#fff}.exercise-container .answer.choice.removeHover:hover,.exercise-container .answer.text-choice.removeHover:hover{background-color:#f4f3f1}.exercise-container .answer.choice:focus,.exercise-container .answer.text-choice:focus{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#99d7ff;color:#fff}.exercise-container .answer-multiple-text{position:relative;margin-bottom:30px}.exercise-container .answer-multiple-text:after{display:block;position:absolute;z-index:10;content:"";top:30px;top:calc(44%);right:-20px;height:4px;width:0;background-color:#f4f3f1;border-top:20px solid #fff;border-left:20px solid #f4f3f1}.exercise-container .answer-multiple-text .answer.pronunciation-text-choice{margin-bottom:2px;text-align:center}.exercise-container .answer-multiple-text .answer.pronunciation-text-choice span{color:#000;font-weight:700;text-decoration:underline}.exercise-container .answer-multiple-text .answer.pronunciation-text-choice:active,.exercise-container .answer-multiple-text .answer.pronunciation-text-choice:hover{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#0098ff;color:#fff}.exercise-container .answer-multiple-text .answer.pronunciation-text-choice.removeHover:hover{background-color:#f4f3f1}.exercise-container .answer-multiple-text .answer.pronunciation-text-choice:focus{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#99d7ff;color:#fff}.exercise-container .answer-multiple-text .answer.pronunciation-text-choice:after{display:none}.exercise-container .answer-multiple-text .answer.pronunciation-text-choice.solved span{color:#fff;font-weight:700;text-decoration:underline}.exercise-container .answer-multiple-text .answer.pronunciation-text-choice.selected span{color:#000!important;-webkit-text-fill-color:#000!important}.exercise-container .answer-multiple-text .answer.text-choice{margin-bottom:2px}.exercise-container .answer-multiple-text .answer.text-choice:after{display:none}.exercise-container .answer-multiple-image{position:relative;border:5px solid #F5F4F2;margin-bottom:50px}.exercise-container .answer-multiple-image a.image-choice{display:block;float:left;border:5px solid #F5F4F2;z-index:0;padding:0;position:relative;width:50%;text-align:center}.exercise-container .answer-multiple-image a.image-choice img{width:100%;height:auto;margin:0}.exercise-container .answer-multiple-image a.image-choice:active,.exercise-container .answer-multiple-image a.image-choice:hover{border:5px solid #0098FF;z-index:1}.exercise-container .answer-multiple-image a.image-choice.removeHover:hover{border:5px solid #E6E1DD}.exercise-container .answer-multiple-image a.image-choice:focus{border:5px solid #99d7ff;outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px;z-index:1}.exercise-container .answer-multiple-audio{position:relative}@media (min-width: 992px){.exercise-container .answer-multiple-audio{padding-right:0}}.exercise-container .answer-multiple-audio:after{display:none}.exercise-container .answer-multiple-audio .answer.audio-choice{color:#0098ff;margin-bottom:2px;cursor:pointer;display:block}.exercise-container .answer-multiple-audio .answer.audio-choice .answer-text-audio{position:relative;margin-left:30px}.exercise-container .answer-multiple-audio .answer.audio-choice .answer-text-audio.removeHover:hover{background-color:#f4f3f1}.exercise-container .answer-multiple-audio .answer.audio-choice .exercise-play-audio{background:url(../svg/icon-bubble-answer-audio.svg) no-repeat;width:20px;height:19px;position:absolute;right:35px;top:22px}.exercise-container .answer-multiple-audio .answer.audio-choice:focus{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#99d7ff}.exercise-container .answer-multiple-audio .answer.audio-choice:focus:after{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#000}.exercise-container .answer-multiple-audio .answer.audio-choice.playing{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#000}.exercise-container .answer-multiple-audio .answer.audio-choice.playing:after{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#000}.exercise-container .answer-multiple-audio .answer.audio-choice.ending{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;background-color:#f4f3f1}.exercise-container .answer-multiple-audio .answer.audio-choice.ending:after{-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.exercise-container .answer-multiple-audio .answer.choice{margin-bottom:2px}.exercise-container .answer-multiple-audio .answer:after{display:none}.exercise-container .answer-multiple-audio-choice{position:relative;text-align:center}@media (min-width: 992px){.exercise-container .answer-multiple-audio-choice{padding-left:0}}.exercise-container .answer-multiple-audio-choice:after{display:block;position:absolute;z-index:10;content:"";top:30px;top:calc(44%);right:-20px;height:4px;width:0;background-color:#f4f3f1;border-top:20px solid #fff;border-left:20px solid #f4f3f1}.exercise-container .answer-multiple-audio-choice .answer.choice{margin-bottom:2px}.exercise-container .answer-multiple-audio-choice .answer.choice:after{display:none}.exercise-container .exercise-hint{position:relative;min-height:60px;padding:50px 20px 7px;margin:20px 0}@media (min-width: 768px){.exercise-container .exercise-hint{padding:17px 20px 19px}}.exercise-container .exercise-hint span.hint{position:absolute;display:inline-block;top:16px;left:calc(50% - 9px)}@media (min-width: 768px){.exercise-container .exercise-hint span.hint{left:0}}.exercise-container .exercise-hint p{color:#3e3e3e;text-align:center}@media (min-width: 768px){.exercise-container .exercise-hint p{margin:0 20px}}.exercise-container .exercise-check{position:relative;text-align:center;margin:10px 0 30px}.exercise-container .exercise-check .btn[disabled]{pointer-events:none}.exercise-container .exercise-check .btn[disabled]:hover{color:#fff;background-color:#0098ff}.exercise-container .exercise-result-row-headlines{margin:40px 0 10px;height:20px;color:#a9a094;font-family:Helvetica,Arial,sans-serif;font-size:12px}.exercise-container .exercise-result-row{background:#F5F4F3;color:#333;height:60px;line-height:60px;padding:0 10px;margin-bottom:10px}.exercise-container .exercise-result-row .result-statistic{display:inline;color:#a9a094}.exercise-container .exercise-result-row .result-points{display:inline;font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:18px;padding:0 18px;width:100%;text-align:right}.exercise-container .exercise-result-row .result-points.low{color:#be232d}.exercise-container .exercise-result-row .result-points.neutral{color:#333}.exercise-container .exercise-result-row .result-points.high{color:#82b905}.exercise-container .exercise-finish-text{text-align:center;margin:40px 0 20px}.exercise-container .exercise-infos{text-align:center;margin:40px 0}.exercise-container .exercise-cloze-text-big{position:relative;background-color:#f4f3f1;padding:20px;line-height:40px}.exercise-container .exercise-cloze-text-big input.answer-input-cloze-small{width:85px;height:34px;display:inline;padding:6px 7px!important;font-size:17px!important;text-align:center;margin:0 5px;border-radius:0;border-top:none;border-left:none;border-right:none;background-color:#fff;border-bottom:1px solid #000;color:#000}.exercise-container .exercise-cloze-text-big input.answer-input-cloze-medium{width:150px;height:34px;display:inline;padding:6px 7px!important;font-size:17px!important;text-align:center;margin:0 5px;border-radius:0;border-top:none;border-left:none;border-right:none;background-color:#fff;border-bottom:1px solid #000;color:#000}.exercise-container .exercise-cloze-text-big input.answer-input-cloze-full{width:95%;height:34px;display:inline;padding:6px 2%!important;font-size:17px!important;text-align:center;margin:0 5px 0 0;border-radius:0;border-top:none;border-left:none;border-right:none;background-color:#fff;border-bottom:1px solid #000;color:#000}@media (min-width: 992px){.exercise-container .exercise-cloze-text-big input.answer-input-cloze-full{width:50%}}.exercise-container .exercise-cloze-text-big p{line-height:40px}.exercise-container .cloze-text .form-group{margin-bottom:0;line-height:40px}.exercise-container .cloze-sorting-target{display:inline-block;background-color:#fff;border:2px dotted #D1C9C2;height:30px;width:80px;margin-bottom:-8px}.exercise-container .cloze-sorting-target.filled{border:0 none transparent;background-color:transparent;height:auto;width:auto}.exercise-container .exercise-next{position:relative;text-align:center;margin:10px 0 45px}.exercise-result-title{white-space:nowrap;text-overflow:ellipsis}.answer-select-dropdown-container button.dropdown-toggle{opacity:1}.answer-select-dropdown-container button.dropdown-toggle.wrong-input{background-color:#a81f28!important;text-shadow:#fff 0 0 10px;color:#fff!important;-webkit-text-fill-color:#FFF!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.answer-select-dropdown-container button.dropdown-toggle.wrong-input:active,.answer-select-dropdown-container button.dropdown-toggle.wrong-input:hover{background:#FFF!important;color:#000!important;-webkit-text-fill-color:#000!important}.answer-select-dropdown-container button.dropdown-toggle.wrong-input:focus{background:#99d7ff!important;color:#000!important;-webkit-text-fill-color:#000!important}.answer-select-dropdown-container button.dropdown-toggle.wrong-input.removeHover:hover{background-color:#3e3e3e}.answer-select-dropdown-container button.dropdown-toggle.correct-input{background-color:#71a004!important;text-shadow:#fff 0 0 10px;color:#fff!important;-webkit-text-fill-color:#FFF!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.answer-select-dropdown-container button.dropdown-toggle.correct-input:active,.answer-select-dropdown-container button.dropdown-toggle.correct-input:hover{background:#FFF!important;color:#000!important;-webkit-text-fill-color:#000!important}.answer-select-dropdown-container button.dropdown-toggle.correct-input:focus{background:#FFF!important;color:#99d7ff!important;-webkit-text-fill-color:#000!important}.answer-select-dropdown-container button.dropdown-toggle.correct-input.removeHover:hover{background-color:#3e3e3e}.selected{background-color:#0098ff!important;color:#fff!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.selected:active,.selected:hover{background-color:#0098ff!important;-webkit-text-fill-color:#FFF!important}.selected:focus{background-color:#99d7ff!important;-webkit-text-fill-color:#FFF!important}.wrong{background-color:#be232d!important;color:#fff!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.wrong:active,.wrong:hover{background:#be232d!important}.wrong:focus{background:#99d7ff!important}.solved{background-color:#000!important;border-color:#fff!important;color:#fff!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.solved:active,.solved:focus,.solved:hover{background-color:#000!important;-webkit-text-fill-color:#FFF!important}.solved:focus{background-color:#99d7ff!important;-webkit-text-fill-color:#FFF!important}.correct{background-color:#82b905!important;color:#fff!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.correct:active,.correct:hover{background:#82b905!important}.correct:focus{background:#99d7ff!important}.selected-image{border:5px solid #0098FF!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.selected-image:active,.selected-image:focus,.selected-image:hover{border:5px solid #0098FF!important}.wrong-image{border:5px solid #be232d!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.wrong-image:active,.wrong-image:hover{border:5px solid #be232d!important}.wrong-image:focus{border:5px solid #be232d!important}.solved-image{border:5px solid #000!important;color:#fff!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.solved-image:active,.solved-image:hover{border:5px solid #000!important}.solved-image:focus{border:5px solid #99d7ff!important}.correct-image{border:5px solid #82b905!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.correct-image:active,.correct-image:focus,.correct-image:hover{border:5px solid #82b905!important}.wrong-input{background-color:#be232d!important;color:#fff!important;-webkit-text-fill-color:#FFF!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.wrong-input:active,.wrong-input:focus,.wrong-input:hover{background:#FFF!important;color:#000!important;-webkit-text-fill-color:#000!important}.correct-input{background-color:#82b905!important;color:#fff!important;-webkit-text-fill-color:#FFF!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.correct-input:active,.correct-input:hover{background:#FFF!important;color:#000!important;-webkit-text-fill-color:#000!important}.correct-input:focus{background:#99d7ff!important;color:#000!important;-webkit-text-fill-color:#000!important}.solved-input{background-color:#000!important;color:#fff!important;-webkit-text-fill-color:#FFF!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.solved-input:active,.solved-input:hover{background-color:#000!important;color:#fff!important;-webkit-text-fill-color:#FFF!important}.solved-input:focus{background-color:#99d7ff!important;color:#fff!important;-webkit-text-fill-color:#FFF!important}.solved-input .dropdown-menu li a{color:#000!important;-webkit-text-fill-color:#000!important}.correct-outline{border-color:#82b905!important;color:#fff!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;border-style:solid!important}.correct-outline:active,.correct-outline:hover{border-color:#82b905!important}.correct-outline:focus{border-color:#99d7ff!important}.wrong-outline{border-color:#be232d!important;color:#fff!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;border-style:solid!important}.wrong-outline:active,.wrong-outline:focus,.wrong-outline:hover{border-color:#be232d!important}.correct-textarea{border-color:#82b905!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.wrong-textarea{border-color:#be232d!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.solved-textarea{border-color:#d1c9c2!important}div.form-group a.btn.answer-sorting-btn{margin-bottom:3px}div.form-group a.btn.answer-sorting-image{margin-bottom:3px}ul.dropdown-menu{min-width:inherit}.container.evaluation .exercise-questions .btn.wrong{background-color:#be232d!important;cursor:default}.container.evaluation .exercise-questions .btn.wrong:hover{background-color:#be232d!important}.container.evaluation .exercise-questions .btn.solved{cursor:default}.container.evaluation .exercise-questions .solved-textarea.correct-textarea{border-color:#82b905!important}.container.evaluation .exercise-questions .solved-textarea.wrong-textarea{border-color:#be232d!important}.exercise-cloze-text-big .row.inline-check,.pair-select-container .row.inline-check{margin-bottom:0}.row.inline-check .btn{border-radius:20px;line-height:26px;height:40px;text-transform:none}.row.inline-check .btn.main{border-color:#0098ff;background-color:transparent;color:#0098ff}.row.inline-check .btn.main:active,.row.inline-check .btn.main:hover{color:#fff;background-color:#0098ff}.row.inline-check .btn.disabled{color:#938a7f;border-color:#938a7f}.xPaddingRight{padding-right:10px}.xPaddingLeft{padding-left:10px}@media (min-width: 768px){.xPaddingRight{padding-right:20px}.xPaddingLeft{padding-left:20px}}.row.inline-check.inBox .btn.secondary{margin-left:10px;margin-right:-10px}.row.inline-check.inBox .btn.main{margin-left:-10px}.row+.row.inline-check{margin-top:-50px}p.exerciseStats{text-align:center;color:#9b9b9b}p.exerciseStats span{color:#000}p.exerciseStats span.darkgray{color:#9b9b9b}div.answer .btn-group .btn{margin-top:-5px;padding:3px 12px 6px}.pair-select-container{position:relative;background-color:#f4f3f1;padding:20px;line-height:40px}div.row.pairsToUse{margin-bottom:0}.pair-select-container .pairsToUse .btn{margin-top:0;width:auto;max-width:100%;background-color:#0098ff;color:#fff;display:block;overflow-x:hidden;white-space:nowrap;text-overflow:ellipsis}.pair-select-container .pairsToUse .btn.image-pair-right{width:auto;height:66px;padding:2px;background-color:#fff;margin-top:10px;margin-bottom:5px}.pair-select-container .pairsToUse .btn.image-pair-right img{width:auto;height:60px}.pair-select-container .pairsToUse .btn.image-pair-right:hover{background-color:#0098ff}.pair-select-container .pairsToUse .btn.image-pair-left{width:auto;height:66px;padding:20px 12px;margin-top:10px;margin-bottom:5px;overflow:hidden}.pair-select-container .pairsToUse .btn:active,.pair-select-container .pairsToUse .btn:hover{background-color:#000}.pair-select-container .pairsToUse .btn:focus{background-color:#000}.pair-select-container .pairsToUse .btn.waiting,.pair-select-container .pairsToUse .btn.waiting:hover,.pair-select-container .pairsToUse.used .btn,.pair-select-container .pairsToUse.used .btn:hover{background-color:#a9a094;cursor:pointer}.pair-select-container .pairsToUse .btn.waiting.correct,.pair-select-container .pairsToUse .btn.waiting:hover.correct,.pair-select-container .pairsToUse.used .btn.correct,.pair-select-container .pairsToUse.used .btn:hover.correct{cursor:default}.pair-select-container .pairsToUse .btn.tapped,.pair-select-container .pairsToUse .btn:hover{background-color:#000;color:#fff}.answer-pairs-target.pairsToUse.used .btn.wrong:hover,.answer-pairs-target.pairsToUse.used .btn:hover{background-color:#000!important;color:#fff}.answer-pairs-target.pairsToUse.used .btn.correct:hover{background-color:#82b905!important;color:#fff}.pair-select-container .pairsToUse .btn{font-size:14px;padding:6px 12px;margin-bottom:10px}.pair-select-container .pairsToUse .btn.removeHover:hover{background-color:#1594ff}.pair-select-container .pairsToUse .btn.removeHover.image-pair-right{background-color:#fff}.pair-select-container .pairsToUse .btn.removeHover.tapped,.pair-select-container .pairsToUse .btn.removeHover.tapped:hover{background-color:#000}@media (min-width: 768px){.pair-select-container .pairsToUse .btn{font-size:16px;padding:8px 15px;margin-bottom:15px}}@media (min-width: 992px){.pair-select-container .pairsToUse .btn{font-size:18px;padding:12px 20px;margin-bottom:20px}}.pair-select-container .pairsToUse .left{padding-right:10px}.pair-select-container .pairsToUse .right{padding-left:10px}.pair-select-container .pairsToUse .right .btn{float:right;clear:right}.pair-select-container .pairsToUse.used .left .btn{float:right;clear:right}.pair-select-container p{margin:20px;text-align:center}textarea.dictation{width:100%;padding:5px 10px;border:2px solid #D1C9C2;resize:vertical;max-width:100%}textarea.dictation.correct-textarea{border-color:#82b905!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}textarea.dictation.wrong-textarea{border-color:#be232d!important;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}textarea.dictation.wrong-textarea.solved-textarea{border-color:#be232d!important}textarea.dictation.solved-textarea{border-color:#d1c9c2!important}textarea[disabled]{opacity:.65}.dropdown-menu{padding:0}.dropdown-menu>li>a{padding:14px}.exercise-summary{padding:0 0 25px}@media (min-width: 768px){.exercise-summary{padding:0 0 60px}}@media (min-width: 992px){.exercise-summary{padding:20px 0 70px}}.course-headline.allcourses-title{height:240px;text-align:center}.course-headline.allcourses-title h1{font-family:DWTheAntiquaB,Georgia,serif;font-weight:400;font-size:30px;text-transform:none;margin:0 auto auto;width:100%}.course-headline.allcourses-title p{font-family:DWTheAntiquaB,Georgia,serif;font-size:16px;width:80%;margin:5px auto 67px;line-height:1.2}@media (min-width: 768px){.course-headline.allcourses-title{height:360px}.course-headline.allcourses-title h1{font-size:44px;line-height:48px;width:80%}.course-headline.allcourses-title p{font-size:20px;margin-bottom:120px;width:80%}}@media (min-width: 992px){.course-headline.allcourses-title{height:400px}.course-headline.allcourses-title h1{font-size:54px;line-height:60px}.course-headline.allcourses-title p{font-size:23px}}div.allcourses{display:block;width:100%}div.allcourses a.main-course-container{text-decoration:none;color:#fff}div.allcourses a.main-course-container:active,div.allcourses a.main-course-container:focus,div.allcourses a.main-course-container:hover{color:#ffffff80}.main-course{width:100%;height:90px;padding:10px;border-top:1px solid #FFF}.main-course h2{font-size:36px;line-height:62px;font-family:Helvetica,Arial,sans-serif;margin:3px 0 0 6px;display:inline-block;width:58px}.main-course p{font-size:14px;line-height:19px;font-family:DWTheAntiquaB,Georgia,serif;max-width:70%;max-height:34px;overflow:hidden;opacity:.9}.main-course p.course-title{font-family:DWTheAntiquaBBold,Georgia,serif;font-weight:400;font-size:17px;margin:15px 0 0;opacity:1}.main-course span.progress-icon{float:right;margin:5px 5px 0 0}.main-course span.progress-icon.half{margin-right:14px}.main-course.alpha{background-color:#e1500f}.main-course.one{background-color:#f08c00}.main-course.a1{background-color:#dc1978}.main-course.a2{background-color:#be0046}.main-course.b1{background-color:#91b423}.main-course.b1-plus{background-color:#55911e}.main-course.empty{background-color:#0098ff}.main-course.dw{background-color:#1464a5}.main-course.assess1{background-color:#f4f3f2!important;color:#f08c00!important}.main-course.assess2{background-color:#f4f3f2!important;color:#e1500f!important}.main-course.assess3{background-color:#f4f3f2!important;color:#dc1978!important}.main-course.assess4{background-color:#f4f3f2!important;color:#be0046!important}@media (min-width: 768px){.main-course{width:50%;height:180px;padding:5px 20px 20px;border-right:1px solid #FFF}.main-course h2{font-size:54px;line-height:64px;display:inline;width:auto;margin:0}.main-course p.course-title{font-size:22px;line-height:25px;margin:32px 7px 0 16px;display:inline-block}.main-course p.course-title.einstufung{margin:32px 7px 7px 0}.main-course p{font-size:15px;line-height:20px;max-width:95%;max-height:60%;overflow:visible}.main-course span.progress-icon{margin:15px 0 0}.main-course span.progress-icon.half{margin-right:10px}[class*=assess]{height:205px!important}}@media (min-width: 992px){.main-course{width:25%;height:250px;padding:0 20px 20px;border-right:1px solid #FFF}.main-course h2{font-size:70px;line-height:84px;display:block}.main-course p{font-size:16px;line-height:25px;display:block}.main-course p.course-title{font-size:23px;display:block;margin:0 0 7px}.main-course span.progress-icon{margin:20px 0 0}.main-course span.progress-icon.half{margin-right:10px}.main-course.one{border-right:1px solid #FFF}[class*=assess]{height:380px!important}}@media (max-width: 992px){.main-course.alpha{border-right:0}.main-course.a2{border-right:0}.main-course.b1-plus{border-right:0}.main-course.dw{border-right:0}}@media (min-width: 992px){.main-course.a2{border-right:0}.main-course.dw{border-right:0}.main-course [class*=assess]{height:300px!important}}.help-list{background-color:#f5f4f2;margin:0;overflow:hidden}.help-list .row{border-top:1px solid rgba(128,128,128,.5)}.help-list .row h2{color:#4a4a4a;padding:60px 0;font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:22px;line-height:23px}.help-list .row h2 span{font-family:Helvetica,Arial,sans-serif;font-weight:400;opacity:.5;filter:alpha(opacity=50)}@media (max-width: 1199px){.help-list .row h2{padding:20px 0;margin-left:20px}.help-list .row h2:after{position:absolute;right:20px;width:24px;height:20px;content:"";background:transparent url(../svg/nav-arrow-up-black.svg) no-repeat top left}}.help-list .row a{display:block;text-decoration:none;color:inherit}@media (max-width: 1199px){.help-list .row a.collapsed h2:after{position:absolute;right:20px;width:24px;height:20px;content:"";background:transparent url(../svg/nav-arrow-down-black.svg) no-repeat top left}}.help-list .row p{color:#9b9b9b;font-size:14px;line-height:17px}.help-list .row p span{display:block}@media (min-width: 768px){.help-list .row p span{display:inline-block}}.help-list .row p span strong{color:#000000b3}@media (min-width: 1200px){.help-list .row p span strong{color:inherit;font-weight:400}}.help-list .row p span.headline{display:block;color:#333;font-size:17px;line-height:23px;margin-bottom:5px}.help-list .row p span.title{display:block}.help-list .row p span.desciption{display:block}@media (min-width: 768px) and (max-width: 1199px){.help-list .row p span.desciption,.help-list .row p span.title{width:auto;text-overflow:inherit;overflow:inherit}}.help-list .row .progress-icon{float:right;margin-right:20px}.help-list .row .progress-icon.half{margin-right:30px}.help-list .row+.row{border-top:none}.help-list .row+.row [class*=col-]{display:table;width:100%;height:90px;border-top:1px solid rgba(128,128,128,.5)}.help-list .row+.row a{display:block;height:90px;text-decoration:none;color:inherit;display:table-row}.help-list .row+.row img{width:90px}.help-list .row+.row p{padding-top:10px;padding-left:20px;padding-bottom:20px;width:100%}.help-list .row+.row .progress-icon{margin-top:10px}.help-list .row+.row img,.help-list .row+.row p{vertical-align:top;display:table-cell}.help-list .row [class*=col-]{padding:0}.help-list [class*=col-]>.row:first-child{background-color:#fff}.help-list:after{width:100%;height:1px;border-top:1px solid rgba(128,128,128,.5)}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.ui-keyboard{text-align:center;padding:.3em;position:absolute;left:0;top:0;z-index:16000}.ui-keyboard-has-focus{z-index:16001}.ui-keyboard div{font-size:1.1em}.ui-keyboard-button{height:2em;min-width:2em;margin:.1em;cursor:pointer;overflow:hidden;line-height:2em;-moz-user-focus:ignore}.ui-keyboard-button span{padding:0;margin:0;white-space:nowrap;display:inline-block}.ui-keyboard-space{width:15em}.ui-keyboard-empty span,.ui-keyboard-space span{font:0/0 a;text-shadow:none;color:transparent}.ui-keyboard-preview-wrapper{text-align:center;position:relative;overflow:hidden}.ui-keyboard-preview{margin:0 0 3px;display:inline;width:99%}.ui-keyboard-keyset{text-align:center;white-space:nowrap}.ui-keyboard-input-current{-moz-box-shadow:0 0 5px #4d90fe;-webkit-box-shadow:0 0 5px #4d90fe;box-shadow:0 0 5px #4d90fe}.ui-keyboard-placeholder{color:#888}.ui-keyboard-nokeyboard{color:#888;border-color:#888}.ui-keyboard-spacer{display:inline-block;width:1px;height:0;cursor:default}.ui-keyboard-LRM span,.ui-keyboard-NBSP span,.ui-keyboard-RLM span,.ui-keyboard-ZWJ span,.ui-keyboard-ZWNJ span,.ui-keyboard-ZWSP span{font-size:.5em;line-height:1.5em;white-space:normal}.ui-keyboard-button.ui-keyboard-combo.ui-state-default{border-color:#ffaf0f}button.ui-keyboard-accept.ui-keyboard-valid-input{border-color:#0c0;background:#080;color:#fff}button.ui-keyboard-accept.ui-keyboard-valid-input:not([disabled]):hover{background:#0a0}button.ui-keyboard-accept.ui-keyboard-invalid-input{border-color:#c00;background:#800;color:#fff;opacity:.5;filter:alpha(opacity=50)}button.ui-keyboard-accept.ui-keyboard-invalid-input:not([disabled]):hover{background:#a00}.ui-keyboard-caret{background:#c00;width:1px;margin-top:3px}div.ui-body.ui-keyboard button.ui-keyboard-button.ui-btn{padding:.5em 1em;border-color:transparent}.ui-body .ui-keyboard-button{width:3em;height:3em;display:inline-block}.ui-body .ui-keyboard-widekey{width:5.5em}.ui-body .ui-keyboard-space{width:15em}.ui-body .ui-keyboard-space span{visibility:hidden}.ui-body .ui-keyboard-keyset{line-height:.5em}.ui-body input.ui-input-text,.ui-body textarea.ui-input-text{width:95%}.ui-body .ui-btn-inner{height:2em;padding:.2em 0;margin:0}.ui-body .ui-btn{margin:0;font-size:13px}button.ui-keyboard-button.btn{padding:1px 6px}button.ui-keyboard-toggle span{width:.8em;height:.8em;display:inline-block;background-repeat:no-repeat;background-position:center center;background-size:contain;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0iIzExMSI+PHBhdGggZD0iTTguNyw0LjRINy41SDUuMHYtMS45YzAtMS40LTEuMS0yLjUtMi41LTIuNWMtMS40LDAtMi41LDEuMS0yLjUsMi41djEuOWgxLjIgdi0xLjljMC0wLjcsMC42LTEuMiwxLjItMS4yczEuMiwwLjYsMS4yLDEuMnYxLjljLTAuNywwLTEuMiwwLjYtMS4yLDEuMlY4LjggYzAsMC43LDAuNiwxLjIsMS4yLDEuMmg1LjBDOS40LDEwLDEwLDkuNCwxMCw4LjhWNS42QzEwLDUuMCw5LjQsNC40LDguOCw0LjR6IE02LjYsNy40djEuMCBjMCwwLjItMC4xLDAuMy0wLjMsMC4zUzYuMCw4LjYsNi4wLDguNFY3LjRjLTAuMi0wLjEtMC4zLTAuMy0wLjMtMC41YzAtMC4zLDAuMy0wLjYsMC42LTAuNiBTNi45LDYuNiw2LjksNi45QzYuOSw3LjEsNi44LDcuMyw2LjYsNy40eiIvPjwvc3ZnPg==)}.ui-keyboard-dark-theme button.ui-keyboard-toggle span{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0iI2VlZSI+PHBhdGggZD0iTTguNyw0LjRINy41SDUuMHYtMS45YzAtMS40LTEuMS0yLjUtMi41LTIuNWMtMS40LDAtMi41LDEuMS0yLjUsMi41djEuOWgxLjIgdi0xLjljMC0wLjcsMC42LTEuMiwxLjItMS4yczEuMiwwLjYsMS4yLDEuMnYxLjljLTAuNywwLTEuMiwwLjYtMS4yLDEuMlY4LjggYzAsMC43LDAuNiwxLjIsMS4yLDEuMmg1LjBDOS40LDEwLDEwLDkuNCwxMCw4LjhWNS42QzEwLDUuMCw5LjQsNC40LDguOCw0LjR6IE02LjYsNy40djEuMCBjMCwwLjItMC4xLDAuMy0wLjMsMC4zUzYuMCw4LjYsNi4wLDguNFY3LjRjLTAuMi0wLjEtMC4zLTAuMy0wLjMtMC41YzAtMC4zLDAuMy0wLjYsMC42LTAuNiBTNi45LDYuNiw2LjksNi45QzYuOSw3LjEsNi44LDcuMyw2LjYsNy40eiIvPjwvc3ZnPg==)}button.ui-keyboard-toggle.ui-keyboard-disabled span{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0iIzExMSI+PHBhdGggZD0iTTcuNCA0LjRWMi41YzAtMS40LTEuMS0yLjUtMi41LTIuNWMtMS40IDAtMi41IDEuMS0yLjUgMi41djEuOSBjLTAuNyAwLTEuMiAwLjUtMS4yIDEuMnYzLjFDMS4zIDkuNCAxLjggMTAgMi41IDEwaDQuOWMwLjcgMCAxLjItMC42IDEuMi0xLjJWNS42IEM4LjcgNC45IDguMSA0LjQgNy40IDQuNHogTTUuMyA3LjR2MS4wYzAgMC4yLTAuMSAwLjMtMC4zIDAuM2MtMC4yIDAtMC4zLTAuMS0wLjMtMC4zVjcuNCBjLTAuMi0wLjEtMC4zLTAuMy0wLjMtMC41YzAtMC4zIDAuMy0wLjYgMC42LTAuNmMwLjMgMCAwLjYgMC4zIDAuNiAwLjYgQzUuNiA3LjEgNS41IDcuMyA1LjMgNy40eiBNNi4yIDQuNEgzLjdWMi41YzAtMC43IDAuNS0xLjIgMS4yLTEuMmMwLjcgMCAxLjIgMC42IDEuMiAxLjIgVjQuNHoiLz48L3N2Zz4=)}.ui-keyboard-dark-theme button.ui-keyboard-toggle.ui-keyboard-disabled span{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0iI2VlZSI+PHBhdGggZD0iTTcuNCA0LjRWMi41YzAtMS40LTEuMS0yLjUtMi41LTIuNWMtMS40IDAtMi41IDEuMS0yLjUgMi41djEuOSBjLTAuNyAwLTEuMiAwLjUtMS4yIDEuMnYzLjFDMS4zIDkuNCAxLjggMTAgMi41IDEwaDQuOWMwLjcgMCAxLjItMC42IDEuMi0xLjJWNS42IEM4LjcgNC45IDguMSA0LjQgNy40IDQuNHogTTUuMyA3LjR2MS4wYzAgMC4yLTAuMSAwLjMtMC4zIDAuM2MtMC4yIDAtMC4zLTAuMS0wLjMtMC4zVjcuNCBjLTAuMi0wLjEtMC4zLTAuMy0wLjMtMC41YzAtMC4zIDAuMy0wLjYgMC42LTAuNmMwLjMgMCAwLjYgMC4zIDAuNiAwLjYgQzUuNiA3LjEgNS41IDcuMyA1LjMgNy40eiBNNi4yIDQuNEgzLjdWMi41YzAtMC43IDAuNS0xLjIgMS4yLTEuMmMwLjcgMCAxLjIgMC42IDEuMiAxLjIgVjQuNHoiLz48L3N2Zz4=)}.ui-keyboard.ui-keyboard-disabled button:not(.ui-keyboard-toggle),.ui-keyboard.ui-keyboard-disabled input{opacity:.5}.ui-keyboard-overlay{position:absolute;top:0;left:0;bottom:0;right:0;background:rgba(0,0,0,.5)}.ui-keyboard-popup{display:inline-block;max-width:22em}div.ui-keyboard-extender{margin-left:5px}button.ui-keyboard-extender span{width:.9em;height:.9em;display:inline-block;margin-bottom:3px;background-repeat:no-repeat;background-position:center center;background-size:contain;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9ImZpbGw6IzExMSI+PGc+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzExMSIgZD0iTSAwLjUsNC41IDE1LjUsNC41IDE1LjUsMTUuNSAwLjUsMTUuNSBaIj48L3BhdGg+PHJlY3Qgd2lkdGg9IjIiIGhlaWdodD0iMiIgeD0iMiIgeT0iNiI+PC9yZWN0PjxyZWN0IHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHg9IjUiIHk9IjYiPjwvcmVjdD48cmVjdCB3aWR0aD0iMiIgaGVpZ2h0PSIyIiB4PSI4IiB5PSI2Ij48L3JlY3Q+PHBhdGggZD0ibSAxMSw2IDMsMCAwLDUgLTIsMCAwLC0zIC0xLDAgeiI+PC9wYXRoPjxyZWN0IHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHg9IjEyIiB5PSIxMiI+PC9yZWN0PjxyZWN0IHdpZHRoPSI2IiBoZWlnaHQ9IjIiIHg9IjUiIHk9IjEyIj48L3JlY3Q+PHJlY3Qgd2lkdGg9IjIiIGhlaWdodD0iMiIgeD0iOSIgeT0iOSI+PC9yZWN0PjxyZWN0IHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHg9IjYiIHk9IjkiPjwvcmVjdD48cmVjdCB3aWR0aD0iMiIgaGVpZ2h0PSIyIiB4PSIyIiB5PSIxMiI+PC9yZWN0PjxyZWN0IHdpZHRoPSIzIiBoZWlnaHQ9IjIiIHg9IjIiIHk9IjkiPjwvcmVjdD48L2c+PC9zdmc+)}.ui-keyboard-dark-theme button.ui-keyboard-extender span{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9ImZpbGw6I2VlZSI+PGc+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6I2VlZSIgZD0iTSAwLjUsNC41IDE1LjUsNC41IDE1LjUsMTUuNSAwLjUsMTUuNSBaIj48L3BhdGg+PHJlY3Qgd2lkdGg9IjIiIGhlaWdodD0iMiIgeD0iMiIgeT0iNiI+PC9yZWN0PjxyZWN0IHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHg9IjUiIHk9IjYiPjwvcmVjdD48cmVjdCB3aWR0aD0iMiIgaGVpZ2h0PSIyIiB4PSI4IiB5PSI2Ij48L3JlY3Q+PHBhdGggZD0ibSAxMSw2IDMsMCAwLDUgLTIsMCAwLC0zIC0xLDAgeiI+PC9wYXRoPjxyZWN0IHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHg9IjEyIiB5PSIxMiI+PC9yZWN0PjxyZWN0IHdpZHRoPSI2IiBoZWlnaHQ9IjIiIHg9IjUiIHk9IjEyIj48L3JlY3Q+PHJlY3Qgd2lkdGg9IjIiIGhlaWdodD0iMiIgeD0iOSIgeT0iOSI+PC9yZWN0PjxyZWN0IHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHg9IjYiIHk9IjkiPjwvcmVjdD48cmVjdCB3aWR0aD0iMiIgaGVpZ2h0PSIyIiB4PSIyIiB5PSIxMiI+PC9yZWN0PjxyZWN0IHdpZHRoPSIzIiBoZWlnaHQ9IjIiIHg9IjIiIHk9IjkiPjwvcmVjdD48L2c+PC9zdmc+)}@media all and (max-width: 319px){.ui-keyboard div{font-size:9px}.ui-keyboard .ui-keyboard-input{font-size:12px}.ui-body .ui-btn{margin:0;font-size:9px}.ui-body .ui-keyboard-button{width:1.8em;height:2.5em}.ui-body .ui-keyboard-widekey{width:4em}.ui-body .ui-keyboard-space{width:8em}.ui-body .ui-btn-inner{height:2.5em;padding:.3em 0}}@media all and (min-width: 320px) and (max-width: 479px){.ui-keyboard div{font-size:9px}.ui-keyboard .ui-keyboard-input{font-size:14px}.ui-body .ui-btn{margin:0;font-size:11px}.ui-body .ui-keyboard-button{width:1.8em;height:3em}.ui-body .ui-keyboard-widekey{width:4.5em}.ui-body .ui-keyboard-space{width:10em}.ui-body .ui-btn-inner{height:3em;padding:.7em 0}}@media all and (min-width: 480px) and (max-width: 767px){.ui-keyboard div{font-size:13px}.ui-keyboard .ui-keyboard-input{font-size:14px}.ui-body .ui-btn{margin:0;font-size:10px}.ui-body .ui-keyboard-button{height:2.5em}.ui-body .ui-btn-inner{height:2.5em;padding:.5em 0}}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-active,.ui-menu .ui-state-focus{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:active,.ui-button:hover,.ui-button:link,.ui-button:visited{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}button.ui-button::-moz-focus-inner,input.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup>.ui-controlgroup-item{margin-left:0;margin-right:0}.ui-controlgroup>.ui-controlgroup-item.ui-visual-focus,.ui-controlgroup>.ui-controlgroup-item:focus{z-index:9999}.ui-controlgroup-vertical>.ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label+.ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label+.ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc(100% - 2.4em)}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-next-hover,.ui-datepicker .ui-datepicker-prev-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td a,.ui-datepicker td span{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0 0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw,.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(data:image/gif;base64,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);height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:700;line-height:1.5;padding:2px .4em;margin:.5em 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:0 0;color:inherit;padding:.222em 0;vertical-align:middle;margin:.2em 2em .2em .4em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0 0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #ccc}.ui-widget-content{border:1px solid #ddd;background:#eee url(../images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url(../images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x;color:#fff;font-weight:700}.ui-widget-header a{color:#fff}.ui-button,.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,html .ui-button.ui-state-disabled:active,html .ui-button.ui-state-disabled:hover{border:1px solid #ccc;background:#f6f6f6 url(../images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x;font-weight:700;color:#1c94c4}.ui-button,.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button{color:#1c94c4;text-decoration:none}.ui-button:focus,.ui-button:hover,.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{border:1px solid #fbcb09;background:#fdf5ce url(../images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x;font-weight:700;color:#c77405}.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,a.ui-button:focus,a.ui-button:hover{color:#c77405;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px #5e9ed6}.ui-button.ui-state-active:hover,.ui-button:active,.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active{border:1px solid #fbd850;background:#fff url(../images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:700;color:#eb8f00}.ui-icon-background,.ui-state-active .ui-icon-background{border:#fbd850;background-color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url(../images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x;color:#363636}.ui-state-checked{border:1px solid #fed22f;background:#ffe45c}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url(../images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:400}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(../images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(../images/ui-icons_ffffff_256x240.png)}.ui-button:focus .ui-icon,.ui-button:hover .ui-icon,.ui-state-focus .ui-icon,.ui-state-hover .ui-icon{background-image:url(../images/ui-icons_ef8c08_256x240.png)}.ui-button:active .ui-icon,.ui-state-active .ui-icon{background-image:url(../images/ui-icons_ef8c08_256x240.png)}.ui-button .ui-state-highlight.ui-icon,.ui-state-highlight .ui-icon{background-image:url(../images/ui-icons_228ef1_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(../images/ui-icons_ffd27a_256x240.png)}.ui-button .ui-icon{background-image:url(../images/ui-icons_ef8c08_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-left,.ui-corner-tl,.ui-corner-top{border-top-left-radius:4px}.ui-corner-all,.ui-corner-right,.ui-corner-top,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bl,.ui-corner-bottom,.ui-corner-left{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-br,.ui-corner-right{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url(../images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{-webkit-box-shadow:-5px -5px 5px #000;box-shadow:-5px -5px 5px #000}.override-rtl{direction:rtl}.monolingual-course{padding-left:20px;padding-right:0}.override-ltr{direction:ltr}span.ltr{left:0!important;right:inherit!important}.override-strong strong{font-weight:700!important}.tt-suggestion{padding-bottom:10px;padding-top:10px}@media (min-width: 768px) and (max-width: 991px){.override-ltr .col-lg-1,.override-ltr .col-lg-10,.override-ltr .col-lg-11,.override-ltr .col-lg-12,.override-ltr .col-lg-2,.override-ltr .col-lg-3,.override-ltr .col-lg-4,.override-ltr .col-lg-5,.override-ltr .col-lg-6,.override-ltr .col-lg-7,.override-ltr .col-lg-8,.override-ltr .col-lg-9{float:left!important}.override-ltr .col-lg-offset-2{margin-right:0!important}.override-ltr .col-sm-offset-1{margin-left:8.33333333%;margin-right:0}}@media (min-width: 992px){.override-ltr .col-lg-1,.override-ltr .col-lg-10,.override-ltr .col-lg-11,.override-ltr .col-lg-12,.override-ltr .col-lg-2,.override-ltr .col-lg-3,.override-ltr .col-lg-4,.override-ltr .col-lg-5,.override-ltr .col-lg-6,.override-ltr .col-lg-7,.override-ltr .col-lg-8,.override-ltr .col-lg-9{float:left!important}.override-ltr .col-lg-offset-2{margin-right:0!important;margin-left:16.66666667%!important}.override-ltr .col-sm-offset-1{margin-left:8.33333333%;margin-right:0}}.override-ltr div.row.vocabulary div.col-sm-3 p{margin-right:30px!important;margin-left:auto!important}.override-ltr a.audio-link:before{background-position:left top;margin-right:8px;margin-left:0}.consonants:hover{border-bottom:2px solid #23527c!important}.consonants{border-bottom:1px solid #23527c!important;color:#23527c!important}.container.page-container{overflow:visible}div#header-row div.row-menu div.lecture-nav-container div.navbar nav.lecture-nav .navbar-toggle:focus .icon-close-cross{background:url(../svg/nav-cross-black-lg.svg) no-repeat;background-size:cover}header div.row-menu div.navbar.navbar-default.navbar-static-top nav.main-nav .navbar-toggle:focus .close-cross{background:url(../svg/nav-cross-xs.svg) no-repeat;background-size:cover}div#the-basics.rtl span.twitter-typeahead{width:100%}div#the-basics.rtl span.twitter-typeahead .input-lg{padding-left:20px;direction:rtl}div#the-basics.rtl span.twitter-typeahead input[type=search].tt-input{background-image:url(../svg/icon-lupe.svg);background-repeat:no-repeat;padding-left:20px;padding-right:44px;direction:rtl;background-position:7% 14px}span.course-score-ltr,button.course-reset-ltr{left:inherit!important;right:15px!important}#header-row{margin-bottom:58px}@media (min-width: 768px){div#the-basics.rtl span.twitter-typeahead input[type=search].tt-input{background-position:3% 14px}span.course-score-ltr,button.course-reset-ltr{left:inherit!important;right:56px!important}#header-row{margin-bottom:58px}}@media (min-width: 992px){div#the-basics.rtl span.twitter-typeahead input[type=search].tt-input{background-position:2% 14px}span.course-score-ltr,button.course-reset-ltr{left:inherit!important;right:20px!important}#header-row{margin-bottom:84px}}.richtext-content-container img{max-width:300px}#newsletter-subscribe,#newsletter-unsubscribe{display:none}.user-profile-button{padding-top:8px}.need-help-link{padding-top:20px;padding-bottom:10px}.cookie{position:fixed;bottom:0;width:100%;background:rgba(59,68,77,.9);z-index:1000;font:normal normal 400 12px/18px Arial,Helvetica,sans-serif}.cookie--visible>div{transition:.35s .25s ease-out;transform:translateY(0)}.cookie__wrap{width:940px;color:#fff;margin:18px auto;display:-webkit-box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;letter-spacing:.5px}@media (max-width: 940px){.cookie__wrap{width:auto;margin:18px;flex-direction:column;-webkit-box-direction:normal;-webkit-box-orient:vertical;-moz-box-direction:normal;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column}.cookie__text{-ms-align-self:flex-start;-webkit-align-self:flex-start;-moz-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.cookie__buttons{-ms-align-self:flex-end;-webkit-align-self:flex-end;-moz-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}}.cookie__item{-ms-flex-item-align:stretch;-webkit-align-self:stretch;-moz-align-self:stretch;align-self:stretch}.cookie__text{font-size:12px;font-weight:400}.cookie__buttons{display:-webkit-box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;justify-content:space-between}.cookie__buttons a{border:none;color:#fff;padding:7px 14px 8px;font-weight:700;display:flex;justify-content:center;flex-direction:column;text-align:center;white-space:nowrap}a.cookie__btn--more{background-color:#7f8891;margin:0 8px}a.cookie__btn--more:hover{background-color:#d8dde2;color:#3b444d;text-decoration:none}a.cookie__btn--ok{background-color:#00a5ff}a.cookie__btn--ok:hover{background-color:#fff;color:#00a5ff;text-decoration:none}a.glossar-modal.custom-modal:focus{border:2px solid #0098FF}.hg-theme-default{background-color:#ececec;border-radius:5px;box-sizing:border-box;font-family:HelveticaNeue-Light,Helvetica Neue Light,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;overflow:hidden;padding:5px;touch-action:manipulation;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.hg-theme-default .hg-button span{pointer-events:none}.hg-theme-default button.hg-button{border-width:0;font-size:inherit;outline:0}.hg-theme-default .hg-button{display:inline-block;flex-grow:1}.hg-theme-default .hg-row{display:flex}.hg-theme-default .hg-row:not(:last-child){margin-bottom:5px}.hg-theme-default .hg-row .hg-button:not(:last-child){margin-right:5px}.hg-theme-default .hg-row .hg-button-container{margin-right:5px}.hg-theme-default .hg-row>div:last-child{margin-right:0}.hg-theme-default .hg-row .hg-button-container{display:flex}.hg-theme-default .hg-button{-webkit-tap-highlight-color:rgba(0,0,0,0);align-items:center;background:#fff;border-bottom:1px solid #b5b5b5;border-radius:5px;box-shadow:0 0 3px -1px #0000004d;box-sizing:border-box;cursor:pointer;display:flex;height:40px;justify-content:center;padding:5px}.hg-theme-default .hg-button.hg-standardBtn{width:20px}.hg-theme-default .hg-button.hg-activeButton{background:#efefef}.hg-theme-default.hg-layout-numeric .hg-button{align-items:center;display:flex;height:60px;justify-content:center;width:33.3%}.hg-theme-default .hg-button.hg-button-numpadadd,.hg-theme-default .hg-button.hg-button-numpadenter{height:85px}.hg-theme-default .hg-button.hg-button-numpad0{width:105px}.hg-theme-default .hg-button.hg-button-com{max-width:85px}.hg-theme-default .hg-button.hg-standardBtn.hg-button-at{max-width:45px}.hg-theme-default .hg-button.hg-selectedButton{background:rgba(5,25,70,.53);color:#fff}.hg-theme-default .hg-button.hg-standardBtn[data-skbtn=".com"]{max-width:82px}.hg-theme-default .hg-button.hg-standardBtn[data-skbtn="@"]{max-width:60px}.hg-candidate-box{background:#ececec;border-bottom:2px solid #b5b5b5;border-radius:5px;display:inline-flex;margin-top:-10px;max-width:272px;position:absolute;transform:translateY(-100%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}ul.hg-candidate-box-list{display:flex;flex:1;list-style:none;margin:0;padding:0}li.hg-candidate-box-list-item{align-items:center;display:flex;height:40px;justify-content:center;width:40px}li.hg-candidate-box-list-item:hover{background:rgba(0,0,0,.03);cursor:pointer}li.hg-candidate-box-list-item:active{background:rgba(0,0,0,.1)}.hg-candidate-box-prev:before{content:"\25c4"}.hg-candidate-box-next:before{content:"\25ba"}.hg-candidate-box-next,.hg-candidate-box-prev{align-items:center;background:#d0d0d0;color:#969696;cursor:pointer;display:flex;padding:0 10px}.hg-candidate-box-next{border-bottom-right-radius:5px;border-top-right-radius:5px}.hg-candidate-box-prev{border-bottom-left-radius:5px;border-top-left-radius:5px}.hg-candidate-box-btn-active{color:#444}
diff --git a/sources-gen/dist/assets/index.962b7ca8.js b/sources-gen/dist/assets/index.962b7ca8.js
deleted file mode 100644
index 4c3fcfa..0000000
--- a/sources-gen/dist/assets/index.962b7ca8.js
+++ /dev/null
@@ -1,2913 +0,0 @@
-var Ni=Object.defineProperty,_i=Object.defineProperties;var Oi=Object.getOwnPropertyDescriptors;var Ft=Object.getOwnPropertySymbols;var Ur=Object.prototype.hasOwnProperty,Br=Object.prototype.propertyIsEnumerable;var yn=(e,t,r)=>t in e?Ni(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,h=(e,t)=>{for(var r in t||(t={}))Ur.call(t,r)&&yn(e,r,t[r]);if(Ft)for(var r of Ft(t))Br.call(t,r)&&yn(e,r,t[r]);return e},T=(e,t)=>_i(e,Oi(t));var Oe=(e,t)=>{var r={};for(var a in e)Ur.call(e,a)&&t.indexOf(a)<0&&(r[a]=e[a]);if(e!=null&&Ft)for(var a of Ft(e))t.indexOf(a)<0&&Br.call(e,a)&&(r[a]=e[a]);return r};var Fr=(e,t,r)=>(yn(e,typeof t!="symbol"?t+"":t,r),r);import{C as Tt,r as c,s as _,j as n,a as d,u as Nt,c as z,g as B,b as W,d as J,e as Le,L as ue,F as k,W as me,R as Wt,f as Wr,z as Vt,h as ge,y as Pi,i as $i,K as ki,k as Gi,P as Di,l as Mi,m as Ui,n as se,o as Vr,p as Bi,q as ut,S as Fi,t as Wi,v as Vi,w as Hi,x as Ki,A as Yi,B as ji,D as zi,E as qi,G as Xi,I as Zi,H as Qi,J as Ji,M as el,N as tl,O as nl,Q as rl,T as al,U as sl}from"./vendor.5e871953.js";const ol=function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))a(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&a(i)}).observe(document,{childList:!0,subtree:!0});function r(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerpolicy&&(o.referrerPolicy=s.referrerpolicy),s.crossorigin==="use-credentials"?o.credentials="include":s.crossorigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function a(s){if(s.ep)return;s.ep=!0;const o=r(s);fetch(s.href,o)}};ol();Boolean(window.location.hostname==="localhost"||window.location.hostname==="[::1]"||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));function il(){"serviceWorker"in navigator&&navigator.serviceWorker.ready.then(e=>{e.unregister()})}const C=Object.freeze({min:Object.freeze({zero:0,mobile:320,tablet:768,tabletLandscape:1024,desktop:1200,full:1280}),max:Object.freeze({mobile:767,tablet:1199,tabletLandscape:992,desktop:Number.MAX_SAFE_INTEGER})}),Hr=(e,t)=>Object.keys(e).reduce((r,a)=>T(h({},r),{[a]:(...s)=>Tt`
- @media (${t}-width: ${e[a]}px) {
- ${Tt(...s)}
- }
- `}),{}),NE=Hr(C.min,"min");Hr(C.max,"max");const Kr=(e,t)=>(...r)=>Tt`
- @media (hover: ${e}) and (pointer: ${t}) {
- ${Tt(...r)}
- }
-`,_E={mouse:Kr("hover","fine"),touch:Kr("none","coarse")},g=Object.freeze({LG_WHITE:"#FFF",LG_BLACK:"#000",LG_ORANGE:"#F08C00",LG_ORANGE_DARK:"#E1500F",LG_PINK:"#DC1978",LG_RED:"#BE0046",LG_RED_SCORE:"#BE232D",LG_RED_DARK:"#B20028",LG_GREEN_YELLOW:"#CDBE00",LG_GREEN_LIGHT:"#91B423",LG_GREEN:"#55911E",LG_GREEN_SCORE:"#82B905",DW_BLUE:"#002D5A",DW_DARK_BLUE:"#032F59",DW_LIGHT_BLUE:"#0098FF",LG_BLUE_1:"#0098FF",LG_BLUE_2:"#0096FA",LG_BLUE_3:"#1B9EFD",LG_BLUE_4:"#99d7ff",LG_BLUE_5:"#1464A5",LG_BLUE_6:"#032F59",LG_BLUE_7:"#1B9EFD",LG_BAHAMA_BLUE:"#23527c",LG_GRAY_1:"#938A7F",LG_GRAY_2:"#BBB",LG_GRAY_3:"#F5F4F2",LG_GRAY_4:"#ddd",LG_GRAY_5:"#444",LG_GRAY_6:"#ccc",LG_GRAY_7:"#eee",LG_GRAY_8:"#9B9B9B",LG_GRAY_9:"#3e3e3e",LG_GRAY_10:"#252629",LG_GRAY_11:"#666",LG_GRAY_12:"#E6E1DD",LG_GRAY_13:"#4a4a4a",LG_GRAY_14:"#e7e7e7",LG_GRAY_15:"#777777",LG_ORANGE1:"#bf6f00",LIGHT_KHAKI:"#f4f3f2",LG_GRAY_TRANSPARENT_1:"rgba(128,128,128,.5)",LG_GRAY_TRANSPARENT_15:"rgba(128,128,128,.15)",LG_TRANSPARENT_BLACK_075:"rgba(0,0,0,0.075)",LG_TRANSPARENT_BLACK_20:"rgba(0,0,0,0.2)",LG_TRANSPARENT_BLACK_25:"rgba(0,0,0,0.25)",LG_TRANSPARENT_BLACK_30:"rgba(0,0,0,0.3)",LG_TRANSPARENT_BLACK_40:"rgba(0,0,0,0.4)",LG_TRANSPARENT_BLACK_50:"rgba(0,0,0,0.5)",LG_TRANSPARENT_WHITE_10:"rgba(255,255,255,0.1)",LG_TRANSPARENT_WHITE_15:"rgba(255,255,255,0.15)",LG_TRANSPARENT_WHITE_25:"rgba(255,255,255,0.25)",LG_TRANSPARENT_WHITE_50:"rgba(255,255,255,0.5)"}),OE=Object.freeze({composition:Object.freeze({even:":first-child:nth-last-child(2n)",odd:":first-child:nth-last-child(2n+1)",_369:":first-child:nth-last-child(3n)",_258:":first-child:nth-last-child(3n+2)",_4710:":first-child:nth-last-child(3n+1)"}),notFirst:":not(:first-child)",notLast:":not(:last-child)",disabled:'[disabled]:not([disabled="false"])',topElements:e=>`:nth-child(-n+${e})`,justNElements:e=>`:first-child:nth-last-child(${e})`}),Yr=`
- &:after {
- display: table;
- content: "";
- clear: both;
- }
- `;function Sn(){return Sn=Object.assign||function(e){for(var t=1;t=0)&&(!Object.prototype.propertyIsEnumerable.call(e,a)||(r[a]=e[a]))}return r}function cl(e,t){if(e==null)return{};var r={},a=Object.keys(e),s,o;for(o=0;o=0)&&(r[s]=e[s]);return r}var dl=c.exports.createElement("g",{className:"logoBox",fillRule:"evenodd"},c.exports.createElement("g",{className:"logoLogo"},c.exports.createElement("path",{d:"M15.5929091,3.39736364 C22.287,3.39736364 27.714,8.82381818 27.714,15.5184545 C27.714,22.2125455 22.287,27.6392727 15.5929091,27.6392727 C8.89881818,27.6392727 3.47181818,22.2125455 3.47181818,15.5184545 C3.47181818,8.82381818 8.89881818,3.39736364 15.5929091,3.39736364 L15.5929091,3.39736364 Z M26.9959091,5.16463636 C29.8276364,1.99527273 33.9458182,0 38.5303636,0 C47.0694545,0 53.9920909,6.92236364 53.9920909,15.4617273 C53.9920909,24.0010909 47.0694545,30.9234545 38.5303636,30.9234545 C33.9458182,30.9234545 29.8276364,28.9281818 26.9959091,25.7585455 C24.1644545,28.9281818 20.046,30.9234545 15.4614545,30.9234545 C6.92209091,30.9234545 0,24.0010909 0,15.4617273 C0,6.92236364 6.92209091,1.93784382e-15 15.4614545,1.93784382e-15 C20.046,1.93784382e-15 24.1644545,1.99527273 26.9959091,5.16463636 L26.9959091,5.16463636 Z M15.9913636,13.0819091 L12.6553636,13.0819091 L12.6553636,18.0845455 L15.9913636,18.0845455 C18.4150909,18.0845455 19.2714545,17.0787273 19.2714545,15.5833636 C19.2714545,14.088 18.4085455,13.0819091 15.9913636,13.0819091 L15.9913636,13.0819091 Z M16.4511818,9.59536364 C19.8250909,9.59536364 23.2835455,11.292 23.2835455,15.5828182 C23.2835455,19.8739091 19.8250909,21.5705455 16.4511818,21.5705455 L8.886,21.5705455 L8.886,9.59536364 L16.4511818,9.59536364 L16.4511818,9.59536364 Z M35.4119983,15.9318147 L37.5403715,10.1204985 L40.4334297,10.1204985 L42.5618029,15.9318147 L44.2678615,10.1204985 L48.0692727,10.1204985 L44.4908946,21.3263197 L41.2676315,21.3263197 L38.9674938,15.9016908 L36.7070387,21.3263197 L33.483486,21.3263197 L29.9048182,10.1204985 L33.7062294,10.1204985 L35.4119983,15.9318147 L35.4119983,15.9318147 Z",id:"Shape"})));function ul(e,t){var r=e.title,a=e.titleId,s=ll(e,["title","titleId"]);return c.exports.createElement("svg",Sn({viewBox:"0 0 54 31",xmlns:"http://www.w3.org/2000/svg",ref:t,"aria-labelledby":a},s),r?c.exports.createElement("title",{id:a},r):null,dl)}var ml=c.exports.forwardRef(ul);const pl=_(e=>n(ml,h({},e)))``;function An(){return An=Object.assign||function(e){for(var t=1;t=0)&&(!Object.prototype.propertyIsEnumerable.call(e,a)||(r[a]=e[a]))}return r}function hl(e,t){if(e==null)return{};var r={},a=Object.keys(e),s,o;for(o=0;o=0)&&(r[s]=e[s]);return r}function fl(e,t){var r=e.title,a=e.titleId,s=gl(e,["title","titleId"]);return c.exports.createElement("svg",An({viewBox:"225 40 330 35",xmlns:"http://www.w3.org/2000/svg",ref:t,"aria-labelledby":a},s),r?c.exports.createElement("title",{id:a},r):null,c.exports.createElement("g",{className:"claimBox"},c.exports.createElement("g",{className:"claimClaim"},c.exports.createElement("path",{d:"M268.479,73.127l0,-1.301c-0.655,-0.522 -1.526,-1.045 -2.443,-1.435l-3.042,-23.86c1.13,-0.305 2.35,-0.913 3.31,-1.478l0,-1.305l-8.012,0l-8.704,23.028l-8.882,-23.028l-8.007,0l0,1.305c0.999,0.523 2.222,1.131 3.348,1.478l-2.999,23.948c-0.743,0.263 -1.614,0.785 -2.354,1.347l0,1.301l8.793,0l0,-1.301c-0.824,-0.522 -1.741,-0.996 -3.046,-1.347l1.568,-21.769l0.043,0l9.4,24.417l2.481,0l9.184,-24.68l0.046,0l2.438,21.901c-1.134,0.305 -2.311,0.916 -3.224,1.478l0,1.301l10.102,0ZM290.589,69.346c-1.305,0.391 -2.35,0.478 -2.35,0.478c0,0 -0.352,-0.867 -0.352,-2.7l0,-9.88c0,-4.354 -2.733,-6.181 -7.478,-6.181c-2.832,0 -5.142,0.519 -7.186,1.304l0,5.659l1.525,0c0,0 0.956,-1.529 1.564,-3.967c0,0 1.265,-0.913 3.18,-0.913c2.922,0 4.312,1.919 4.312,4.88l0,2.438c-7.666,-0.04 -12.102,3.61 -12.102,7.14c0,3.44 2.392,5.918 5.917,5.918c2.701,0 5.402,-1.739 6.618,-4.041l0.046,0c0,0 0.043,2.259 1.173,4.132c3.174,-0.919 5.697,-2.871 5.697,-2.871l-0.564,-1.396ZM283.804,65.821c0,2.871 -2.439,4.79 -4.49,4.79c-1.954,0 -3.44,-1.568 -3.44,-3.789c0,-2.224 1.614,-4.447 7.93,-4.315l0,3.314ZM316.618,71.35c-1.78,-0.306 -3.042,-0.785 -3.042,-0.785l0,-29.467c-4.264,-0.093 -7.399,0.56 -7.399,0.56l0,1.348c2.001,0.348 3.312,0.781 3.312,0.781l0,7.581c0,0 -1.83,-0.213 -3.75,-0.213c-6.528,0 -11.49,4 -11.49,12.187c0,6.092 3.085,10.18 8.182,10.18c3.657,0 6.315,-2.303 7.36,-4.873l0.046,0.043c0,-0.004 -0.305,1.869 -0.263,4.566c3.956,0.132 7.044,-0.525 7.044,-0.525l0,-1.383ZM309.489,63.514c0,4.004 -2.445,7.139 -5.356,7.139c-3.617,0 -5.622,-3.355 -5.622,-8.231c0,-6.01 2.398,-9.144 6.443,-9.144c1.876,0 3.355,0.433 4.535,1.222l0,9.014ZM337.997,60.162c0,-5.488 -2.695,-9.099 -8.487,-9.099c-6.27,0 -9.792,4.741 -9.792,11.576c0,7.098 3.522,10.84 9.71,10.84c3.265,0 6.262,-1.219 8.569,-3l-0.74,-1.699c-1.567,1.083 -4.13,1.873 -6.27,1.873c-4.399,0 -6.966,-2.744 -6.966,-8.278l0,-0.607l13.976,0l0,-1.606ZM333.649,59.81l-9.539,0c0.306,-3.743 1.912,-6.664 4.962,-6.664c3.096,0 4.616,2.882 4.577,6.664ZM367.076,47.274l0,-5.793c-1.222,-0.298 -2.654,-0.476 -4.048,-0.476c-5.487,0 -8.049,2.957 -8.049,7.705l0,2.744l-4.18,0l0,2.087l4.18,0l0,16.985c-2.087,0.521 -3.527,1.3 -3.527,1.3l0,1.301l11.225,0l0,-1.301c0,0 -1.522,-0.736 -3.615,-1.3l0,-16.985l5.747,0l0,-2.087l-5.747,0l0,-3.219c0,-3.356 0.696,-5.229 3.398,-5.229c0.568,0 1.172,0.085 1.698,0.26c0.345,2.047 1.39,4.008 1.39,4.008l1.528,0ZM387.793,61.776c0,-6.842 -3.824,-10.713 -9.966,-10.713c-6.269,0 -11.529,4.134 -11.529,11.707c0,6.881 3.82,10.752 9.966,10.752c6.269,0 11.529,-4.173 11.529,-11.746ZM383.446,62.553c0,5.666 -2.263,8.576 -5.967,8.576c-4.396,0 -6.834,-3.699 -6.834,-9.141c0,-5.666 2.263,-8.576 5.92,-8.576c4.397,0 6.881,3.739 6.881,9.141ZM407.337,51.543c-0.824,-0.305 -1.954,-0.522 -3.088,-0.522c-2.741,0 -4.443,2.128 -5.616,5.476l-0.132,0c0.264,-1.691 0.349,-3.39 0.349,-5.171c-2.385,-0.088 -5.349,0.128 -7.265,0.522l0,1.344c1.088,0.171 2.311,0.476 3.309,0.824l0,16.51c-1.215,0.304 -2.26,0.738 -3.309,1.3l0,1.301l10.837,0l0,-1.301c-1.088,-0.522 -2.222,-0.957 -3.441,-1.3l0,-8.407c0,-3.746 1.483,-7.313 4.4,-7.313c1.305,0 2.389,0.432 3.394,0.909l0.562,-4.172ZM457.531,73.127l0,-1.301c0,0 -1.35,-0.824 -2.957,-1.3c0,0 0.175,-4.052 0.175,-9.799c0,-6.536 -2.307,-9.664 -6.874,-9.664c-3.664,0 -6.493,2.083 -7.581,4.869l-0.046,0c-0.437,-2.569 -2.389,-4.869 -6.525,-4.869c-3.441,0 -6.273,2.129 -7.361,4.788l-0.086,0c0,0 0.303,-1.835 0.303,-4.525c-4.169,-0.131 -7.35,0.522 -7.35,0.522l0,1.344c1.956,0.349 3.309,0.824 3.309,0.824l0,16.51c-1.788,0.429 -3.309,1.3 -3.309,1.3l0,1.301l10.186,0l0,-1.255c0,0 -1.4,-0.782 -2.793,-1.307l0,-9.535c0,-3.391 2.093,-7.231 5.622,-7.231c3.526,0 4.265,2.965 4.265,5.752l0,11.014c-1.087,0.437 -2.093,0.959 -2.786,1.307l0,1.255l9.663,0l0,-1.255c-0.697,-0.301 -1.741,-0.87 -2.786,-1.307l0,-9.535c0,-3.391 2.047,-7.231 5.705,-7.231c3.308,0 4.353,3.139 4.353,8.016c0,4.918 -0.171,8.75 -0.171,8.75c-1.528,0.525 -2.79,1.307 -2.79,1.307l0,1.255l9.834,0ZM468.72,44.573c0,-1.563 -1.13,-2.741 -2.741,-2.741c-1.567,0 -2.74,1.178 -2.74,2.741c0,1.525 1.173,2.698 2.74,2.698c1.611,0 2.741,-1.173 2.741,-2.698ZM471.072,73.127l0,-1.301c0,0 -1.396,-0.824 -3.052,-1.3l0,-19.2c-4.254,-0.131 -7.393,0.522 -7.393,0.522l0,1.344c1.916,0.349 3.306,0.824 3.306,0.824l0,16.51c-1.739,0.429 -3.306,1.3 -3.306,1.3l0,1.301l10.445,0ZM498.628,73.127l0,-1.301c0,0 -1.355,-0.824 -2.965,-1.3c0,0 0.221,-4.098 0.221,-9.799c0,-6.536 -2.26,-9.664 -7.009,-9.664c-3.831,0 -6.532,2.218 -7.577,4.788l-0.085,0c0,0 0.302,-1.835 0.302,-4.525c-4.173,-0.131 -7.354,0.522 -7.354,0.522l0,1.344c1.966,0.349 3.313,0.824 3.313,0.824l0,16.51c-1.83,0.476 -3.313,1.3 -3.313,1.3l0,1.301l10.321,0l0,-1.255c0,0 -1.353,-0.782 -2.921,-1.307l0,-9.535c0,-3.438 2.089,-7.231 5.793,-7.231c3.441,0 4.4,3.139 4.4,8.016c0,4.918 -0.178,8.75 -0.178,8.75c-1.567,0.525 -2.918,1.307 -2.918,1.307l0,1.255l9.97,0ZM524.395,71.35c-1.781,-0.306 -3.046,-0.785 -3.046,-0.785l0,-29.467c-4.258,-0.093 -7.396,0.56 -7.396,0.56l0,1.348c2,0.348 3.313,0.781 3.313,0.781l0,7.581c0,0 -1.834,-0.213 -3.75,-0.213c-6.533,0 -11.491,4 -11.491,12.187c0,6.092 3.089,10.18 8.185,10.18c3.654,0 6.316,-2.303 7.353,-4.873l0.047,0.043c0,-0.004 -0.305,1.869 -0.263,4.566c3.955,0.132 7.048,-0.525 7.048,-0.525l0,-1.383ZM517.266,63.514c0,4.004 -2.446,7.139 -5.357,7.139c-3.618,0 -5.622,-3.355 -5.622,-8.231c0,-6.01 2.395,-9.144 6.445,-9.144c1.875,0 3.353,0.433 4.534,1.222l0,9.014ZM542.812,66.949c0,-7.228 -10.406,-5.483 -10.406,-11.013c0,-1.653 1.049,-2.698 2.917,-2.698c1.266,0 2.401,0.303 3.05,0.647c0.31,1.27 0.742,2.57 1.305,3.572l1.563,0l0,-5.829c-1.304,-0.348 -3.128,-0.565 -5.001,-0.565c-4.662,0 -7.837,2.605 -7.837,5.961c0,7.445 10.319,5.576 10.319,11.017c0,2.09 -1.309,2.961 -3.227,2.961c-1.607,0 -3,-0.437 -4.045,-0.871c-0.26,-1.174 -0.821,-2.488 -1.308,-3.572l-1.603,0l0,6.223c1.734,0.437 3.604,0.654 5.829,0.654c4.401,0 8.444,-2.694 8.444,-6.487ZM552.995,70.781c0,-1.567 -1.174,-2.693 -2.698,-2.693c-1.564,0 -2.74,1.126 -2.74,2.693c0,1.565 1.176,2.741 2.74,2.741c1.524,0 2.698,-1.176 2.698,-2.741Z",style:{fillRule:"nonzero"}}))))}var El=c.exports.forwardRef(fl);const xl=_(e=>n(El,h({},e)))``,vl=({className:e,url:t="https://dw.com"})=>d("a",{className:e,href:t,"aria-label":"common.header.logo",target:"_blank",rel:"noopener noreferrer",children:[n(pl,{className:"logo"}),n(xl,{className:"claim"})]}),yl=_(vl)`
- display: inline-block;
- margin: 0 20px;
- direction: ltr;
-
- svg.logo {
- width: 40px;
- height: 23px;
- fill: ${g.DW_DARK_BLUE};
- transition: fill 80ms cubic-bezier(0.43, 0, 0.09, 1) 67ms;
- }
-
- svg.claim {
- display: none;
- }
-
- @media (min-width: ${C.min.tablet}px) {
- svg.logo {
- width: 54px;
- height: 31px;
- }
-
- svg.claim {
- display: none;
- }
- }
-
- @media (min-width: ${C.min.desktop}px) {
- svg.logo {
- width: 88px;
- height: 50px;
- }
-
- svg.claim {
- display: inline-block;
- margin: 0 12px;
- width: 140px;
- height: 50px;
- fill: ${g.DW_LIGHT_BLUE};
- transition: fill 80ms cubic-bezier(0.43, 0, 0.09, 1) 67ms;
- }
- }
-`,Sl=({className:e})=>n("aside",{className:e,children:n(yl,{url:"http://dw.com/en",target:"_blank"})}),Al=_(Sl)`
- display: grid;
- height: 110px;
- margin-left: -20px;
- margin-right: -20px;
- padding: 26px 15px;
- width: 100%;
-
- @media (max-width: ${C.max.tablet}px) {
- display: none !important;
- }
-`,Ll="https://learngerman.dw.com/";var bl=Ll+"static/media/dw-logo-tablet.ac032dbb.svg";const Rl="https://learngerman.dw.com/";var Cl=Rl+"static/media/dw-logo-mobile.7e6e58ec.svg";const tt=o=>{var i=o,{isA:e="span",children:t,isRtl:r,className:a}=i,s=Oe(i,["isA","children","isRtl","className"]);return n(e,T(h({className:a},s),{children:t}))},_t=_(tt)`
- direction: ${({isRtl:e})=>e?"rtl":"ltr"};
-`,PE=_(_t)`
- color: ${g.LG_GRAY_12};
-`;function jr(e,t){if(!t)return null;const r=t[e[0]];return r?e.length===1?r:jr(e.slice(1),r):null}function Il(e,t){return e?jr(e.split("."),t):t}let Ht=null;const wl=(e,t)=>Object.keys(t).reduce((r,a)=>{const s=new RegExp(/\${/.source+a+/}/.source,"g");return r.replace(s,t[a])},e),Tl=e=>{const t=Il(e,Ht);return t||e};function Nl(){return!!Ht}function _l(e){Ht=e}function Ol(){Ht=null}function Pl(e,t){const r=Tl(e);return t?wl(r,t):r}const $l={t:Pl,clearTranslations:Ol,hasTranslations:Nl},kl=c.exports.createContext({i18n:$l}),Ge=()=>c.exports.useContext(kl),Gl=e=>typeof e=="string"||!e,Dl=e=>Gl(e)?{key:e,parameters:{}}:e,te=e=>{const{i18n:t}=Ge(),{key:r,parameters:a}=Dl(e);return r?t.t(r,a):null},Ml=c.exports.createContext({}),De=()=>c.exports.useContext(Ml),R=s=>{var o=s,{translation:e,isA:t,className:r}=o,a=Oe(o,["translation","isA","className"]);const{isRtl:i}=De(),l=te(e);return n(_t,T(h({className:r,isA:t,isRtl:i},a),{children:l}))},Ul=({className:e,title:t})=>n("aside",{className:e,children:d("div",{className:"mobile-banner",children:[n("a",{className:"mobile-banner-logo",href:"http://dw.com/en",target:"_blank",rel:"noopener noreferrer"}),n("div",{className:"mobile-banner-brand",children:n(R,{translation:t})})]})}),Bl=_(Ul)`
- border-width: 0 0 1px;
- box-shadow: inset 0 1px 0 ${g.LG_TRANSPARENT_WHITE_15},
- 0 1px 5px ${g.LG_TRANSPARENT_BLACK_075};
- line-height: 23px;
- position: fixed;
- left: 0px;
- right: 0px;
- top: 0px;
- z-index: 1030;
-
- @media (min-width: ${C.min.tablet}px) {
- border-radius: 0px;
- height: 80px;
- }
-
- @media (min-width: ${C.min.desktop}px) {
- display: none !important;
- }
-
- .mobile-banner {
- background: ${g.LG_WHITE};
- border-bottom: 1px solid ${g.LG_GRAY_14};
- height: 60px;
- margin-bottom: 0px;
- min-height: 50px;
- position: relative;
- width: 100%;
- z-index: 100;
-
- &:before,
- &:after {
- display: table;
- content: ' ';
- }
-
- @media (min-width: ${C.min.tablet}px) {
- height: 80px;
- }
- }
-
- .mobile-banner-logo {
- background: url(${Cl});
- color: ${g.LG_GRAY_15};
- display: inline-block;
- /*! @noflip */
- float: left;
- font-size: 18px;
- font-weight: 400;
- height: 23px;
- line-height: 20px;
- margin: 17px 15px 0 15px;
- padding: 0;
- text-shadow: 0 1px 0 ${g.LG_TRANSPARENT_WHITE_25};
- width: 40px;
-
- @media (min-width: ${C.min.tablet}px) and (max-width: ${C.max.tablet}px) {
- background: url(${bl});
- height: 31px;
- margin-top: 24px;
- width: 54px;
- }
- }
-
- .mobile-banner-brand {
- color: ${g.LG_BLUE_5};
- font-size: 17px;
- margin: 19px auto 0 auto;
- position: relative;
- text-align: center;
- text-transform: uppercase;
- width: auto;
-
- @media (min-width: ${C.min.tablet}px) and (max-width: ${C.max.tablet}px) {
- font-size: 27px;
- margin: 23px auto 0 auto;
- padding-top: 8px;
- width: 300px;
- }
- }
-`,Kt=({initialState:e=!1,key:t="Enter"}={})=>{const[r,a]=c.exports.useState(e),s=c.exports.useCallback(()=>{a(i=>!i)},[]),o=c.exports.useCallback(i=>{i.key===t&&a(l=>!l)},[t]);return[r,{toggleOnClick:s,toggleOnKeyPress:o}]};function Ln(){return Ln=Object.assign||function(e){for(var t=1;t=0)&&(!Object.prototype.propertyIsEnumerable.call(e,a)||(r[a]=e[a]))}return r}function Wl(e,t){if(e==null)return{};var r={},a=Object.keys(e),s,o;for(o=0;o=0)&&(r[s]=e[s]);return r}var Vl=c.exports.createElement("desc",null,"Person Icon"),Hl=c.exports.createElement("g",{id:"Seiten",stroke:"none",strokeWidth:1,fill:"none",fillRule:"evenodd",opacity:1},c.exports.createElement("g",{id:"06-desk-lektionsinfo+burger",transform:"translate(-1146.000000, -501.000000)",fill:"#FFFFFF"},c.exports.createElement("g",{id:"burgernavi-d",transform:"translate(920.000000, 170.000000)"},c.exports.createElement("path",{d:"M241.86087,345.655072 C239.603853,344.603859 238.150728,344.078261 237.501449,344.078261 L233.976812,345.284058 L230.35942,344.078261 C230.081158,344.078261 229.578748,344.209661 228.852174,344.472464 C228.1256,344.735267 227.468602,344.990337 226.881159,345.237681 L226,345.655072 L226,347 L241.86087,347 L241.86087,345.655072 Z M229.988406,340.507246 C231.008701,342.64059 232.338156,343.707246 233.976812,343.707246 C235.584549,343.707246 236.898546,342.64059 237.918841,340.507246 C238.289857,340.383574 238.591303,339.997105 238.823188,339.347826 C239.055074,338.698547 239.155556,338.072467 239.124638,337.469565 C239.09372,336.866664 238.954591,336.565217 238.707246,336.565217 C239.047345,335.606758 239.047345,334.802902 238.707246,334.153623 C238.676328,334.060869 238.629952,333.944928 238.568116,333.805797 C238.50628,333.666666 238.343963,333.419325 238.081159,333.063768 C237.818356,332.708211 237.524639,332.391306 237.2,332.113043 C236.875361,331.834781 236.427056,331.579711 235.855072,331.347826 C235.283089,331.115941 234.657008,331 233.976812,331 C232.925599,331 231.998072,331.262799 231.194203,331.788406 C230.390334,332.314012 229.849277,332.839611 229.571014,333.365217 L229.2,334.153623 L229.153623,334.292754 C229.122705,334.35459 229.099517,334.455072 229.084058,334.594203 C229.068599,334.733334 229.05314,334.887922 229.037681,335.057971 C229.022222,335.22802 229.029952,335.444443 229.06087,335.707246 C229.091788,335.97005 229.138164,336.256037 229.2,336.565217 C228.952656,336.565217 228.813527,336.866664 228.782609,337.469565 C228.751691,338.072467 228.852173,338.698547 229.084058,339.347826 C229.315943,339.997105 229.617389,340.383574 229.988406,340.507246 L229.988406,340.507246 Z M230.127536,335.776812 C230.127536,335.684058 230.166183,335.591305 230.243478,335.498551 C230.320773,335.405797 230.552655,335.282126 230.93913,335.127536 C231.325606,334.972946 231.889851,335.05024 232.631884,335.35942 C233.373917,335.637683 234.085021,335.714976 234.765217,335.591304 C235.445414,335.467632 235.971013,335.313044 236.342029,335.127536 C236.713045,334.942028 236.991303,334.756523 237.176812,334.571014 C237.331402,334.571014 237.462801,334.764249 237.571014,335.150725 C237.679228,335.5372 237.733333,335.869564 237.733333,336.147826 L237.733333,337.353623 C237.918842,337.353623 238.042512,337.369082 238.104348,337.4 C238.166184,337.430918 238.197101,337.570047 238.197101,337.817391 C238.197101,338.064736 238.135266,338.435746 238.011594,338.930435 C237.733332,339.456041 237.455074,339.718841 237.176812,339.718841 C237.084058,339.966185 236.952658,340.259902 236.782609,340.6 C236.61256,340.940098 236.257008,341.403862 235.715942,341.991304 C235.174877,342.578747 234.595172,342.872464 233.976812,342.872464 C233.358451,342.872464 232.786476,342.609664 232.26087,342.084058 C231.735263,341.558451 231.364252,341.032853 231.147826,340.507246 L230.823188,339.718841 C230.699516,339.718841 230.560387,339.649276 230.405797,339.510145 C230.251207,339.371014 230.127537,339.239614 230.034783,339.115942 L229.895652,338.930435 C229.61739,337.879222 229.694684,337.353623 230.127536,337.353623 L230.127536,335.776812 Z",id:"Shape"}))));function Kl(e,t){var r=e.title,a=e.titleId,s=Fl(e,["title","titleId"]);return c.exports.createElement("svg",Ln({width:"16px",height:"16px",viewBox:"0 0 16 16",xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",ref:t,"aria-labelledby":a},s),r===void 0?c.exports.createElement("title",{id:a},"Avatar"):r?c.exports.createElement("title",{id:a},r):null,Vl,Hl)}var zr=c.exports.forwardRef(Kl);function bn(){return bn=Object.assign||function(e){for(var t=1;t=0)&&(!Object.prototype.propertyIsEnumerable.call(e,a)||(r[a]=e[a]))}return r}function jl(e,t){if(e==null)return{};var r={},a=Object.keys(e),s,o;for(o=0;o=0)&&(r[s]=e[s]);return r}function zl(e,t){var r=e.title,a=e.titleId,s=Yl(e,["title","titleId"]);return c.exports.createElement("svg",bn({width:"16px",height:"16px",viewBox:"0 0 16 16",xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",xmlSpace:"preserve",style:{fillRule:"evenodd",clipRule:"evenodd",strokeLinejoin:"round",strokeMiterlimit:1.41421},ref:t,"aria-labelledby":a},s),r?c.exports.createElement("title",{id:a},r):null,c.exports.createElement("path",{d:"M7.976,0.026c-1.443,0 -2.784,0.36 -4.021,1.082c-1.208,0.707 -2.165,1.665 -2.872,2.873c-0.722,1.252 -1.083,2.599 -1.083,4.043c0,1.443 0.361,2.784 1.083,4.021c0.707,1.208 1.664,2.165 2.872,2.872c1.237,0.722 2.578,1.083 4.021,1.083c1.444,0 2.784,-0.361 4.021,-1.083c1.208,-0.707 2.166,-1.664 2.873,-2.872c0.736,-1.237 1.104,-2.578 1.104,-4.021c0,-1.444 -0.36,-2.784 -1.082,-4.021c-0.707,-1.208 -1.665,-2.166 -2.873,-2.873c-1.252,-0.736 -2.599,-1.104 -4.043,-1.104Zm3.005,6.451c1.208,-0.25 2.268,-0.641 3.182,-1.171c0.383,0.855 0.574,1.76 0.574,2.718c0,1.149 -0.272,2.209 -0.817,3.181c-0.973,-0.486 -1.974,-0.832 -3.005,-1.038c0.088,-0.692 0.132,-1.407 0.132,-2.143c0,-0.53 -0.022,-1.046 -0.066,-1.547Zm2.629,-2.165c-0.942,0.398 -1.878,0.677 -2.806,0.84c-0.25,-1.429 -0.648,-2.659 -1.193,-3.69c0.825,0.206 1.584,0.556 2.276,1.049c0.692,0.494 1.267,1.094 1.723,1.801Zm-3.734,3.712c0,0.781 -0.037,1.429 -0.11,1.944c-0.634,-0.073 -1.23,-0.11 -1.79,-0.11c-0.56,0 -1.156,0.037 -1.789,0.11c-0.074,-0.692 -0.111,-1.34 -0.111,-1.944c0,-0.309 0.015,-0.759 0.044,-1.348c0.516,0.074 1.138,0.111 1.867,0.111c0.729,0 1.344,-0.037 1.845,-0.111c0.03,0.589 0.044,1.039 0.044,1.348Zm-1.414,-6.739c0.589,1.178 0.995,2.526 1.215,4.043c-0.736,0.059 -1.303,0.089 -1.701,0.089c-0.398,0 -0.965,-0.03 -1.701,-0.089c0.236,-1.517 0.641,-2.865 1.215,-4.043c0.103,-0.015 0.265,-0.022 0.486,-0.022c0.221,0 0.383,0.007 0.486,0.022Zm-2.121,0.177c-0.56,1.09 -0.957,2.32 -1.193,3.69c-0.972,-0.192 -1.907,-0.472 -2.806,-0.84c0.471,-0.707 1.05,-1.307 1.734,-1.801c0.685,-0.493 1.44,-0.843 2.265,-1.049Zm-4.551,3.844c0.942,0.53 2.003,0.921 3.181,1.171c-0.044,0.501 -0.066,1.017 -0.066,1.547c0,0.736 0.044,1.451 0.133,2.143c-1.032,0.206 -2.033,0.552 -3.005,1.038c-0.531,-0.986 -0.796,-2.047 -0.796,-3.181c0,-0.943 0.184,-1.849 0.553,-2.718Zm0.906,6.894c0.824,-0.324 1.679,-0.56 2.563,-0.707c0.235,1.119 0.596,2.143 1.082,3.071c-0.722,-0.192 -1.395,-0.49 -2.021,-0.895c-0.627,-0.405 -1.168,-0.895 -1.624,-1.469Zm4.794,2.541c-0.486,-0.973 -0.854,-2.114 -1.105,-3.425c0.531,-0.044 1.068,-0.066 1.613,-0.066c0.545,0 1.068,0.022 1.569,0.066c-0.25,1.311 -0.619,2.452 -1.105,3.425c-0.103,0.014 -0.265,0.022 -0.486,0.022c-0.221,0 -0.383,-0.008 -0.486,-0.022Zm2.121,-0.177c0.486,-0.928 0.847,-1.952 1.083,-3.071c0.898,0.147 1.76,0.383 2.585,0.707c-0.471,0.589 -1.02,1.086 -1.646,1.491c-0.626,0.405 -1.3,0.696 -2.022,0.873Z",style:{fill:"#fff",fillRule:"nonzero"}}))}var ql=c.exports.forwardRef(zl);function Rn(){return Rn=Object.assign||function(e){for(var t=1;t=0)&&(!Object.prototype.propertyIsEnumerable.call(e,a)||(r[a]=e[a]))}return r}function Zl(e,t){if(e==null)return{};var r={},a=Object.keys(e),s,o;for(o=0;o=0)&&(r[s]=e[s]);return r}var Ql=c.exports.createElement("g",{fill:"none",fillRule:"evenodd"},c.exports.createElement("path",{d:"M-2.5-2.5h17v17h-17z"}),c.exports.createElement("path",{fill:"#FFF",d:"M12.906 1.219C7.434 4.9 5.47 10.25 5.47 10.25H4.406S2.581 7.472.688 6.531l.53-1.062c2.089.469 3.72 1.593 3.72 1.593s1.78-3.61 7.437-6.906l.531 1.063z"}),c.exports.createElement("path",{d:"M-4 16h20V-4H-4z"}));function Jl(e,t){var r=e.title,a=e.titleId,s=Xl(e,["title","titleId"]);return c.exports.createElement("svg",Rn({xmlns:"http://www.w3.org/2000/svg",width:13,height:11,viewBox:"0 0 13 11",ref:t,"aria-labelledby":a},s),r?c.exports.createElement("title",{id:a},r):null,Ql)}var ec=c.exports.forwardRef(Jl);function be(){return!(typeof window!="undefined"&&window.document)}const Cn=be()?"":window.location.origin,Ye={AS_URL:"/auth/",AS_URL_WITH_DOMAIN:`${Cn}/auth/`,PS_URL:`${Cn}/profiles/`,LOGGED_USER_RESOURCE:`${Cn}/profiles/protected/user`,TICKET_PARAM_NAME:"ticket"},F={OTHER:"OTHER",LOGIN:"LOGIN",LOGIN_ERROR:"LOGIN_ERROR",LOGIN_FB:"LOGIN_FB",LOGOUT:"LOGOUT",SESSION_TIMEOUT:"SESSION_TIMEOUT",PROFILE_SERVICE_UNAVAILABLE:"PROFILE_SERVICE_UNAVAILABLE",MISSING_USER_PROFILE:"MISSING_USER_PROFILE",FORCED_LOGOUT:"FORCED_LOGOUT",PASSWORD_CHANGED:"PASSWORD_CHANGED",MAIL_CHANGED:"MAIL_CHANGED",MAIL_CHANGE_REQUEST:"MAIL_CHANGE_REQUEST",EMAIL_ALREADY_EXISTS:"EMAIL_ALREADY_EXISTS",REGISTERED:"REGISTERED",REGISTRATION_CONFIRMED:"REGISTRATION_CONFIRMED",DELETED:"DELETED",INVALID_TOKEN:"INVALID_TOKEN",PASSWORD_RESET_REQUESTED:"PASSWORD_RESET_REQUESTED",PASSWORD_RESET_SET:"PASSWORD_RESET_SET",PASSWORD_CHANGE_WRONG_PASSWORD:"PASSWORD_CHANGE_WRONG_PASSWORD",PROFILE_UPDATED:"PROFILE_UPDATED",PASSWORD_CHANGE:"PASSWORD_CHANGE_",INVALID_CERTIFICATE:"INVALID_CERTIFICATE",VOCABULARY_TRAINER_UNAVAILABLE:"VOCABULARY_TRAINER_UNAVAILABLE",VOCABULARY_TRAINER_NO_VOCABULARIES:"VOCABULARY_TRAINER_NO_VOCABULARIES",CERTIFICATE_NO_TRANSCRIPTION:"CERTIFICATE_NO_TRANSCRIPTION",MISSING_TRANSCRIPTION:"MISSING_TRANSCRIPTION",USER_ALREADY_EXISTS:"USER_ALREADY_EXISTS",USER_ALREADY_CONFIRMED:"USER_ALREADY_CONFIRMED"},tc=[F.PASSWORD_CHANGE_WRONG_PASSWORD,F.PASSWORD_CHANGED,F.EMAIL_ALREADY_EXISTS,F.PROFILE_UPDATED,F.CERTIFICATE_NO_TRANSCRIPTION];F.OTHER,F.MAIL_CHANGED,F.MAIL_CHANGE_REQUEST,F.REGISTERED,F.REGISTRATION_CONFIRMED,F.PASSWORD_RESET_REQUESTED,F.PASSWORD_RESET_SET,F.USER_ALREADY_EXISTS;const qr={TITLE:"common.feedback",OK_BUTTON:"common.ok"},$E=()=>{},Xr=e=>Object.entries(e).reduce((t,r)=>T(h({},t),{[r[1]]:r[0]}),{}),nc=(e,t)=>t.reduce((r,a)=>Object.assign(r,{[a[e]]:(r[a[e]]||[]).concat(a)}),{}),rc=e=>e.filter(t=>!!t.target),In=e=>e.additionalInformation&&e.additionalInformation.includes("final_test"),ac=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),Zr=e=>e>999999?`${Math.floor(e/1e6)}MB`:`${Math.floor(e/1e3)}KB`,wn=e=>{for(let t=e.length-1;t>0;t--){const r=Math.floor(Math.random()*(t+1));[e[t],e[r]]=[e[r],e[t]]}return e},Yt=(e,t)=>Math.round(e/t*100)||0,sc=(e,t)=>Math.floor(Math.random()*(t-e))+e,oc=(e,t,r=1)=>[...e].sort((a,s)=>a[t]===s[t]?0:a[t]e&&D[e.toUpperCase()],Se=e=>e&&ic[e.toLowerCase()],q={window:be()?global.window||{}:window,document:be()?{}:document,navigator:be()?{}:navigator,localStorage:be()?{}:window.localStorage},Ve={graphQL:{baseUrl:"/graphql"},dw:{baseUrl:"https://www.dw.com",mobileUrl:"https://m.dw.com"},reCaptcha:{siteKey:"6Ld5YwUTAAAAAJnUx8sjEIS5VSJ94AdGcC0BfDXV"},download:{videoBaseUrl:"https://tvdownloaddw-a.akamaihd.net/downloads/Events/mp4/",audioBaseUrl:"https://radiodownloaddw-a.akamaihd.net/downloads/Events/dwelle/"}},Tn={COURSE:"c",GRAMMAR:"gr",LESSON:"l",PLACEMENT:"placement",FINAL:"final"},lc=Xr(Tn),cc=e=>{const t=e.replace(/([A-Z])/g,"_$1").slice(1).toUpperCase();return Tn[e]||Tn[t]||e.toLowerCase()},dc=e=>lc[e]||e.toUpperCase(),uc={general:"a-zA-Z",numbers:"0-9",whiteSpaces:" ",allowedSpecial:"\\-\xE4\xF6\xFC\xC4\xD6\xDC\xDF",arabic:"\\u0600-\\u06FF",cyrillic:"\\u0400-\\u04FF",greek_and_coptic:"\\u0370-\\u03FF",chinese:"\\u4E00-\\u9FFF",devanagari:"\\u0900-\\u097F",bengali:"\\u0980-\\u09FF",ethiopian:"\\u1200-\\u137F"},mc=new RegExp(`[^${Object.values(uc).join("")}]`,"g"),Ae=e=>e.replace(mc,"").replace(/\s/g,"-").toLowerCase(),pc=e=>encodeURIComponent(Ae(e)),gc=()=>be()?null:q.window.location.href,hc=({videoUrl:e})=>`${Ve.download.videoBaseUrl}${e}`,fc=({audioUrl:e})=>`${Ve.download.audioBaseUrl}${e}`,Ec=({staticBaseHost:e,downloadId:t,filename:r})=>`${e}/downloads/${t}/${r.toLowerCase()}`,xc=({articleId:e,name:t})=>`${Ve.dw.baseUrl}/de/${Ae(t)}/a-${e}`,vc=({id:e,name:t,langCode:r})=>`${Ve.dw.baseUrl}/${r}/${Ae(t)}/s-${e}`,yc=({from:e=q.window.location.search,value:t})=>new URLSearchParams(e).get(t),Sc=e=>new URLSearchParams(e).toString(),Jr=Object.freeze({[D.ENGLISH]:36519788,[D.GERMAN]:36519653,[D.ARABIC]:36519905,[D.PERSIAN]:45477054,[D.PORTUGUESE_BRAZIL]:45476784,[D.RUSSIAN]:45476947,[D.SPANISH]:47994050,[D.FRENCH]:47994032,[D.CHINESE]:47993840,[D.POLISH]:50080753}),ea=e=>Jr[e],Nn=e=>Object.values(Jr).includes(e),ta="/overview",Ac="/user/register",_n="/user/profile",na="/user/password/change",Lc="/user/password/reset",ra="/user/vocabularyTrainer",On="/user/vocabularyTrainerStart",aa="/user/feedback/status",sa="/grammar",bc="/help",oa="/vocabulary",ia="/legal",la="/placementDashboard",Rc="ler",Cc="c-",Ic="l-",wc="e-",Tc="gr-",Pn="lv",ca="rs-",$n="la",da="lm",ua="le",Nc="ler",_c="sum",Oc="sum",ma="target",pa=e=>e&&e.errorCode,Re=(e,t)=>`/${t}${e}`,Pc=e=>e?e.includes("-")?e.substring(0,e.indexOf("-")):e:null,mt=e=>Re(ta,e),$c=e=>Re(sa,e),kc=e=>Re(oa,e),ga=e=>Re(la,e),jt=(e,t,r,a)=>`${Me(t,e,r)}/${wc}${a}`,Gc=(e,t,r,a)=>`${Me(t,e,r)}/${Tc}${a}`,Dc=(e,t,r)=>`${Me(t,e,r)}/${$n}`,Mc=(e,t,r)=>`${Me(t,e,r)}/${Pn}`,Uc=(e,t,r,a)=>`${Me(t,e,r)}/${ca}${a}`,Bc=e=>Re(_n,e),Fc=e=>Re(na,e),Wc=(e,t,r)=>Re(`/${r}/${Cc}${e}`,t),Me=(e,t,r)=>Re(`/${r}/${Ic}${e}`,t),Vc=e=>`${e}/${Rc}`,ha=(e,t)=>`${e}/gr-${t}`,fa=e=>`${e}/${Pn}`,Ea=e=>`${e}/${$n}`,xa=(e,t)=>`${e}/${ca}${t}`,Hc=e=>`${e}/${da}`,Kc=e=>`${e}/${ua}`,va=e=>`${e}/${Oc}`,ya=(e,t)=>e.replace("/l-",`/${t}-`),kn=({courseId:e,isFinalTest:t,lessonPath:r})=>t?ya(r,"final"):Nn(e)?ya(r,"placement"):Vc(r),Sa=e=>Re(bc,e),Yc=e=>Re(ia,e),jc=e=>Re(On,e),zc=e=>Re(ra,e),qc=(e,t)=>tc.includes(e)?Re(_n,t):mt(t),ne=(e,t)=>Re(`${aa}/${e}`,t),Aa=(e,t,r)=>{const a=e+ne(F.LOGIN,t);return Zc(a,t,!1,r)},Xc=(e,t)=>t?`?${ma}=${encodeURIComponent(t)}`:"",Zc=(e,t,r,a)=>{const s=Xc(t,a);return`${r?Ye.AS_URL_WITH_DOMAIN:Ye.AS_URL}login?service=${encodeURIComponent(`${e}${s}`)}&locale=${Pc(t)}`},pt=({id:e,name:t,language:r,__typename:a})=>{const s=Qr(r),o=r?`/${s}`:"";if(e===ea(s))return ga(s);const i=t?`/${pc(t)}`:"";return`${o}${i}/${cc(a)}-${e}`},La=({namedUrl:e})=>`${Ve.dw.mobileUrl}${e}`,Qc=({langCode:e})=>`${Ve.dw.baseUrl}/${e}`,Jc=()=>`${Ve.dw.mobileUrl}/contact`,Gn="local-storage",ba=e=>be()?null:JSON.parse(q.localStorage.getItem(e)),Dn=e=>{const[t,r]=c.exports.useState(ba(e)),a=s=>{be()||(q.localStorage.setItem(e,JSON.stringify(s)),r(s),q.window.dispatchEvent(new Event(Gn)))};return c.exports.useEffect(()=>{const s=()=>{r(ba(e))};return q.window.addEventListener("storage",s),q.window.addEventListener(Gn,s),()=>{q.window.removeEventListener("storage",s),q.window.removeEventListener(Gn,s)}},[]),[t,a]},ed="_simp",td="_trad",Mn=`${D.CHINESE}${ed}`,Un=`${D.CHINESE}${td}`,Ra=[{translationKey:D.GERMAN,langCode:D.GERMAN},{translationKey:D.ENGLISH,langCode:D.ENGLISH},{translationKey:D.ARABIC,langCode:D.ARABIC},{translationKey:D.RUSSIAN,langCode:D.RUSSIAN},{translationKey:D.PERSIAN,langCode:D.PERSIAN},{translationKey:D.SPANISH,langCode:D.SPANISH},{translationKey:D.PORTUGUESE_BRAZIL,langCode:D.PORTUGUESE_BRAZIL},{translationKey:D.POLISH,langCode:D.POLISH},{translationKey:D.FRENCH,langCode:D.FRENCH},{translationKey:Mn,langCode:D.CHINESE},{translationKey:Un,langCode:D.CHINESE},{translationKey:D.TURKISH,langCode:D.TURKISH}],gt=({callback:e,delay:t=100,conditional:r=!0},a=[])=>{const s=c.exports.useRef();c.exports.useEffect(()=>{s.current=e},[e]),c.exports.useEffect(()=>{const o=()=>s.current();if(be()||!r)return;const i=q.window.setTimeout(o,t);return()=>q.window.clearTimeout(i)},[t,r,...a])},nd=(e,t)=>new Promise((r,a)=>{const s=q.document.createElement("script");s.async=!1,s.src=e,t.appendChild(s),s.addEventListener("load",r,{once:!0}),s.addEventListener("error",a,{once:!0})}),rd=(e=[],t)=>{c.exports.useEffect(async()=>{if(e.length>0){const r=e.map(s=>`script[src="${s}"]`);q.document.querySelectorAll(r).length!==e.length?Promise.all(e.map(s=>nd(s,q.document.body))).then(t):t()}},[e])},ad=["/tongwen/tongwen_core.min.js","/tongwen/tongwen_table_s2t.min.js","/tongwen/tongwen_table_t2s.min.js","/tongwen/tongwen_table_ps2t.min.js","/tongwen/tongwen_table_pt2s.min.js"],Ca="isTraditionalChin",Bn="zhongwen",Ia="simp",wa="trad",sd="\u7B80",od="\u7E41",id=(e,t)=>{const r=e===D.CHINESE,a=r?ad:[],[s,o]=c.exports.useState(!1),[i,l]=c.exports.useState(!1);rd(a,()=>o(!0));const[u,m]=Dn(Ca),{search:p}=Nt(),f=b=>{q.document.getElementById(t).textContent=b};return c.exports.useEffect(()=>{if(p){const b=p.replace("?",""),S=new URLSearchParams(b).get(Bn);S===Ia?m(!1):S===wa&&m(!0)}},[]),gt({callback:()=>{r&&s&&(u?TongWen.trans2Trad(q.document):TongWen.trans2Simp(q.document),l(!0))},delay:300}),gt({callback:()=>{f(u?sd:od)},delay:300},[u,i]),{isTraditionalChin:u,trans2Simple:()=>{s&&(TongWen.trans2Simp(q.document),m(!1))},trans2Traditional:()=>{s&&(TongWen.trans2Trad(q.document),m(!0))}}},ld=({languageTranslationKey:e,currentLanguage:t,isTraditionalChin:r})=>t===D.CHINESE?r&&e===Un||!r&&e===Mn:e===t,cd=({languageTranslationKey:e,language:t})=>{const r=mt(t);return e===Mn?`${r}?${Bn}=${Ia}`:e===Un?`${r}?${Bn}=${wa}`:r},dd=({language:e,translationKey:t,langCode:r})=>{const{i18n:a}=Ge(),[s]=Dn(Ca);return n(ud,{className:`lang-${t}`,children:d("a",{className:"lang-nav",href:cd({languageTranslationKey:t,language:e}),role:"button",children:[n("span",{children:`${a.t(`header.menu.language.${t}`)} - ${a.t(`header.menu.language.native.${t}`)}`}),n("span",{className:z("icon",{hidden:!ld({languageTranslationKey:t,currentLanguage:r,isTraditionalChin:s})}),children:n("i",{children:n(ec,{})})})]})})},ud=_("li")`
- border-bottom: 1px solid ${g.LG_BLUE_4};
- display: block;
- float: left;
- width: 100%;
-
- &:first-child {
- border-top: 1px solid ${g.LG_BLUE_4};
- }
-
- span {
- padding: 0 10px;
- }
-
- .lang-nav {
- display: inline-block;
- padding: 20px 25px;
- width: 100%;
-
- @media (min-width: ${C.min.tablet}px) {
- padding: 20px;
- }
- }
-`,Ta="API_CALL",Fn=({url:e="",method:t="GET",data:r=null,onSuccess:a=()=>{},onFailure:s=()=>{},headersOverride:o=null})=>({type:Ta,payload:{url:e,method:t,data:r,onSuccess:a,onFailure:s,headersOverride:o}}),md="application/json",Ce={headers:{"Content-Type":md}},Na=e=>new RegExp(`[?&]${encodeURIComponent(e)}=([^&]*)`),pd=(e,t,r)=>{const s=r(t).exec(e);if(s)return decodeURIComponent(s[1])},gd=(e,t)=>pd(e.search,t,Na),_a=(e,t)=>{const r=Na(t),a=e.search?e.search.replace(r,""):"";return a&&a[0]!=="?"?`?${a.substring(1)}`:a},hd=e=>new RegExp(/(\/e-[0-9]+|\/ler|\/placement-[0-9]+|\/final-[0-9]+)$/,"g").test(e),fd=e=>gd(e,Ye.TICKET_PARAM_NAME),Ed=(e,t)=>encodeURIComponent(e+t.pathname+_a(t,Ye.TICKET_PARAM_NAME)),xd=({userData:e,captchaToken:t,langCode:r})=>{const{sex:a,firstName:s,lastName:o,email:i,password:l,country:u,teacher:m,newsletter:p,year:f}=e;return h({sex:a,firstName:s,lastName:o,email:i,password:l,country:u,"g-recaptcha-response":t,teacher:m,newsletter:p,recaptcha:t,contactLanguage:r},f&&Oa({year:f}))},vd=({data:e})=>{const a=e,{year:t}=a,r=Oe(a,["year"]);return h(h({},r),t&&Oa({year:t}))},Oa=({year:e})=>({dateOfBirth:`${e}-01-01`}),yd=e=>{if(!e)return{};const t=e.split("-");return{year:t[0],month:t[1],day:t[2]}},Pa="public/logout",Sd="public/user",Ad="protected/user",Wn="profile",Ld="registration",ht=Ye.PS_URL,bd=`${ht}${Sd}`,zt=`${ht}${Ad}`,Rd=`${ht}public/registration/confirmation`,Cd=({userData:e,captchaToken:t,langCode:r})=>{const a=xd({userData:e,captchaToken:t,langCode:r});return fetch(`${bd}/${Ld}`,h({method:"POST",body:JSON.stringify(a),dataType:"json"},Ce))},Id=()=>fetch(zt,{method:"DELETE"}).catch(e=>{console.error(`Something went wrong: ${JSON.stringify(e)}`)}),wd=()=>fetch(`${zt}/${Wn}`,h({},Ce)).catch(e=>{console.error(`Unable to retrieve user:${JSON.stringify(e)}`)}),Td=e=>{const t=vd({data:e});return fetch(`${zt}/${Wn}`,T(h({},Ce),{method:"POST",body:JSON.stringify(t)})).then(r=>r.ok?r.json():Promise.reject(r))},Nd=(e,t)=>{const r=`${ht}public/login?ticket=${e}&ticketDomain=${t}`;return fetch(r)},_d=e=>fetch(`${Rd}?confirmationId=${e}`,T(h({},Ce),{method:"POST"})),qt=(e,t)=>e.reduce((r,a)=>r+a[t],0),Od=["userId","lastModifiedDate","cosLessonVersion"],Pd=["cosExerciseVersion"],$d=["minCorrectScore"],$a=e=>{const t=Vn(e,Od),{exerciseProgresses:r}=t,a=kd(r);return T(h({},t),{exerciseProgresses:a})},kd=e=>e.map(t=>{const r=Vn(t,Pd),{inquiryProgresses:a}=r,s=Gd(a);return T(h({},r),{inquiryProgresses:s})}),Gd=e=>e.map(t=>Vn(t,$d)),Vn=(e,t)=>{const r=h({},e);return t.forEach(a=>{a in r&&delete r[a]}),r},Dd=(e,t,r)=>{const a=r?`(handicap: ${r})`:"";return B`fragment ${t}${e}${r||""} on ${t} {
- learningMetaInfo${a} {
- achievableScore
- exerciseCount
- }
- }
- `},Hn={name:"Score",fragment({type:e,addLearningMetaInfo:t=!0,handicap:r}){return t?Dd(this.name,e,r):B`fragment ${e}${this.name}${r||""} on ${e} {
- id
- }
- `}},Md=({inquiryId:e,score:t,achievableScore:r})=>({inquiryId:e,score:t,maxScore:r}),Ud=({langCode:e,lessonId:t,courseId:r,lessonAchievableScore:a,exerciseId:s,allExerciseCount:o,exerciseProgress:i,exerciseAchievableScore:l})=>({language:e,cosLessonId:t,cosCourseId:r,maxPointsForAllExercises:a,cosExerciseId:s,allExerciseCount:o,exerciseProgress:i,exerciseAchievableScore:l}),Bd=({lessonProgresses:e=[]})=>({lessons:e.map(r=>$a(r))}),Fd=({courseProgresses:e=[]})=>({courses:e}),Wd=({lessons:e,lessonProgress:t})=>{const r=$a(t);return jn({lessons:e,lessonProgress:r})?{lessons:[...e.filter(o=>o.cosLessonId!==r.cosLessonId),r]}:{lessons:[...e,r]}},Vd=({lessons:e,lessonId:t})=>Kn({lessons:e,lessonId:t})?{lessons:[...e.filter(s=>s.cosLessonId!==t)]}:{lessons:e},Hd=({lessons:e,courseId:t})=>({lessons:e.filter(r=>r.cosCourseId!==t)}),Kd=({courses:e,courseId:t})=>Yn({courses:e,courseId:t})?{courses:[...e.filter(s=>s.cosCourseId!==t)]}:{courses:e},Yd=({courses:e,courseProgress:t})=>Yn({courses:e,courseId:t.cosCourseId})?{courses:[...e.filter(s=>s.cosCourseId!==t.cosCourseId),t]}:{courses:[...e,t]},Kn=({lessons:e,lessonId:t})=>e.find(r=>r.cosLessonId===t),Yn=({courses:e,courseId:t})=>e.find(r=>r.cosCourseId===t),jn=({lessons:e,lessonProgress:t})=>e.find(r=>r.cosLessonId===t.cosLessonId),jd=({lessons:e,lessonId:t,exerciseId:r})=>{const a=Kn({lessons:e,lessonId:t});if(!a)return[];const{exerciseProgresses:s}=a,o=s.find(l=>l.cosExerciseId===r);if(!o)return[];const{inquiryProgresses:i=[]}=o;return i},zd=({lessons:e,lessonProgress:t})=>{const{exerciseProgress:r}=t;if(r.inquiryProgresses.length===0)return{lessons:e};const a=jn({lessons:e,lessonProgress:t});return a?{lessons:[...e.filter(o=>o.cosLessonId!==t.cosLessonId),Xd(a,t)]}:{lessons:[...e,Zd(t)]}},qd=(e,t)=>{const{exerciseProgresses:r}=e,a=r.find(s=>s.cosExerciseId===t.cosExerciseId);return a?[...r.filter(o=>o.cosExerciseId!==t.cosExerciseId),Qd(a,t)]:[...r,ka(t)]},Xd=(e,t)=>{const r=[...qd(e,t)],a=r.length,s=T(h({},e),{doneExerciseCount:a,exerciseProgresses:r});return T(h({},s),{resultPoints:qt(s.exerciseProgresses,"resultPoints")})},Zd=e=>{const t=[ka(e)],{cosLessonId:r,cosCourseId:a,allExerciseCount:s,maxPointsForAllExercises:o,language:i}=e,l={language:i,cosLessonId:r,cosCourseId:a,allExerciseCount:s,doneExerciseCount:t.length,maxPointsForAllExercises:o,exerciseProgresses:t};return T(h({},l),{resultPoints:qt(l.exerciseProgresses,"resultPoints")})},ka=e=>{const{cosExerciseId:t,exerciseProgress:r,exerciseAchievableScore:a}=e;return{cosExerciseId:t,maxPoints:a,resultPoints:qt(r.inquiryProgresses,"score"),inquiryProgresses:r.inquiryProgresses}},Qd=(e,t)=>{const{cosExerciseId:r,exerciseProgress:a,exerciseAchievableScore:s}=t,i=[...e.inquiryProgresses.filter(l=>!a.inquiryProgresses.some(u=>u.inquiryId===l.inquiryId)),...a.inquiryProgresses];return{cosExerciseId:r,maxPoints:s,resultPoints:qt(i,"score"),inquiryProgresses:i}},Jd="course/progress",eu="lesson/progress",tu="lesson/progresses",nt=`${Ye.PS_URL}protected`,zn="lesson",qn="course",rt=e=>console.error(`Something went wrong on service call: ${e.url}, status code: ${e.status}`),Ga=(e,t)=>{const r=t.toLowerCase();return fetch(`${nt}/${r}/progress/${e}`,h({},Ce)).then(a=>a.ok?a.text():Promise.reject(a)).then(a=>a?JSON.parse(a):null).catch(rt)},Da=(e,t)=>{const r=t.toLowerCase();return fetch(`${nt}/${r}/progress`,h({method:"POST",body:JSON.stringify({ids:e})},Ce)).then(a=>a.json()).catch(rt)},nu=(e,t)=>{const r=t.toLowerCase();return fetch(`${nt}/${r}/progress/reset/${e}`,{method:"DELETE"}).catch(rt)},ru=e=>fetch(`${nt}/${eu}/save`,h({method:"POST",body:JSON.stringify(e),dataType:"json"},Ce)).catch(rt),au=e=>fetch(`${nt}/${tu}/save`,h({method:"POST",body:JSON.stringify(e),dataType:"json"},Ce)).catch(rt),su=(e,t)=>fetch(`${nt}/lesson?last=${e}&lang=${t}`,h({},Ce)).then(r=>r.json()).catch(rt),ou=e=>fetch(`${nt}/${Jd}/init`,h({method:"POST",body:JSON.stringify(e)},Ce)).then(t=>t.json()).catch(rt),Ma="ADD_LESSON_PROGRESS",Ua="READ_LESSON_PROGRESS",Ba="READ_LESSON_PROGRESSES",Fa="DELETE_LESSON_PROGRESS",Wa="ADD_COURSE_PROGRESS",Va="READ_COURSE_PROGRESSES",Ha="DELETE_COURSE_PROGRESS",Ka="DELETE_LESSON_PROGRESSES",Ya="REMOVE_LEARN_PROGRESS",ja="LESSON_PROGRESS_SYNC_NEEDED",iu=e=>t=>{t(fu(e)),t(Au(e))},Xt=e=>t=>{t(yu(e)),t(Xa(e,zn))},za=e=>(t,r)=>{const{user:a}=r();a.isLoggedIn&&Ga(e,zn).then(s=>t(Eu(s)))},lu=e=>(t,r)=>{const{user:a}=r();a.isLoggedIn&&Da(e,zn).then(s=>t(xu(s)))},qa=e=>(t,r)=>{const{user:a}=r();a.isLoggedIn&&Ga(e,qn).then(s=>{s&&t(gu(s))})},cu=e=>(t,r)=>{const{user:a}=r();a.isLoggedIn&&Da(e,qn).then(s=>{s&&t(hu(s))})},du=e=>(t,r)=>{const{user:a}=r();a.isLoggedIn&&ou(e).then(s=>t(qa(s.cosCourseId)))},uu=e=>t=>{t(Su(+e)),t(Xa(e,qn)),t(vu(+e))},mu=()=>({type:Ya}),Xn=e=>({type:ja,payload:e}),pu=()=>(e,t)=>{const{learnProgress:r}=t(),{lessons:a}=r;return au(a).then(()=>e(Xn(!1)))},gu=e=>({type:Wa,payload:e}),hu=e=>({type:Va,payload:e}),fu=e=>({type:Ma,payload:e}),Eu=e=>({type:Ua,payload:e}),xu=e=>({type:Ba,payload:e}),vu=e=>({type:Ka,payload:e}),yu=e=>({type:Fa,payload:e}),Su=e=>({type:Ha,payload:e}),Au=e=>(t,r)=>{const{user:a,learnProgress:{lessons:s}}=r();if(a.isLoggedIn){const o=jn({lessons:s,lessonProgress:e});return o?ru(o):Promise.resolve("no progress available")}return Promise.resolve("nothing to do")},Xa=(e,t)=>(r,a)=>{const{user:s}=a();return s.isLoggedIn?nu(e,t):Promise.resolve("nothing to do")},Za={lessons:[],courses:[],isSyncRequired:!1},Lu=(e=Za,t)=>{switch(t.type){case Ma:const r=zd({lessons:e.lessons,lessonProgress:t.payload})||{lessons:[]};return h(h({},e),r);case Ua:return t.payload?h(h({},e),Wd({lessons:e.lessons,lessonProgress:t.payload})):e;case Ba:return h(h({},e),Bd({lessonProgresses:t.payload}));case Fa:return h(h({},e),Vd({lessons:e.lessons,lessonId:t.payload}));case Wa:return h(h({},e),Yd({courses:e.courses,courseProgress:t.payload}));case Va:return h(h({},e),Fd({courseProgresses:t.payload}));case Ha:return h(h({},e),Kd({courses:e.courses,courseId:t.payload}));case Ka:return h(h({},e),Hd({lessons:e.lessons,courseId:t.payload}));case ja:return T(h({},e),{isSyncRequired:t.payload});case Ya:return Za;default:return e}},Qa="SET_USER",Ja="REMOVE_USER",es="API_ERROR",ts="LOGOUT_REQUEST_CALLED_FLAG",ns="SESSION_TIMEOUT",bu=()=>Fn({url:`${zt}/${Wn}`,onSuccess:as,onFailure:Zn,headersOverride:h({},Ce)}),Ru=()=>Fn({url:`${ht}${Pa}`,onSuccess:rs,onFailure:Zn}),Cu=()=>Fn({url:`${ht}${Pa}`,onSuccess:rs,onFailure:Zn}),rs=()=>e=>{e(Iu()),e(mu())},as=e=>({type:Qa,payload:e}),Iu=()=>({type:Ja}),Zn=()=>({type:es}),wu=e=>({type:ts,payload:e}),Tu=()=>({type:ns}),Qn={userData:null,isLoggedIn:!1,hasLogOutRequestBeenCalled:!1,apiErrorHasOccurred:!1},Nu=(e=Qn,t)=>{switch(t.type){case Qa:return{userData:t.payload,isLoggedIn:!0,apiErrorHasOccurred:!1};case Ja:return T(h({},Qn),{hasLogOutRequestBeenCalled:!0});case es:return T(h({},e),{apiErrorHasOccurred:!0});case ts:return T(h({},e),{hasLogOutRequestBeenCalled:t.payload});case ns:return Qn;default:return e}},Ue=e=>e.user,ft=e=>e.user.userData,_u=c.exports.createContext(q),Zt=()=>c.exports.useContext(_u),Ou=({isNavMenuOpen:e,toggleIsNavMenuOpen:t,isLanguageSubMenuOpen:r,setIsLanguageSubMenuOpen:a,className:s})=>{const{origin:o}=Zt().window.location,{langCode:i}=W(),{isLoggedIn:l}=J(Ue),u=l?void 0:"hidden",m=Le(),p=f=>{f.preventDefault(),m(Ru())};return n("div",{id:"nav-user-menu",className:s,"aria-expanded":e,style:{maxHeight:e?1500:0},children:d($u,{"aria-label":"Main navigation submenu",children:[n("li",{children:n(ue,{to:mt(i),className:"course-nav",onClick:t,children:n(R,{translation:"header.menu.home"})})}),n("li",{children:n(ue,{to:$c(i),className:"course-nav",onClick:t,children:n(R,{translation:"header.menu.grammar"})})}),n("li",{children:n(ue,{to:kc(i),className:"course-nav",onClick:t,children:n(R,{translation:"header.menu.vocabulary"})})}),n("li",{id:"vocabularyTrainerButton",className:u,children:n(ue,{to:jc(i),onClick:t,className:"course-nav",children:n(R,{translation:"header.menu.vocabularyTrainer"})})}),n("li",{id:"profileButton",className:u,children:d(ue,{to:Bc(i),className:"course-nav",onClick:t,children:[n(R,{translation:"header.menu.myArea"}),n(Jn,{children:n("i",{children:n(zr,{})})})]})}),n("li",{children:n(ue,{to:Sa(i),className:"course-nav",onClick:t,children:n(R,{translation:"metadata.help"})})}),n("li",{id:"languageMenu",children:d("nav",{children:[d(ue,{id:"languageMenuButton",className:`course-nav ${r?"collapsed":"collapse in"}`,"data-toggle":"collapse","data-parent":"languageMenu",to:"#","data-target":"#nav-lang-menu",onClick:f=>{f.preventDefault(),a(!r)},children:[n(R,{translation:"header.menu.language.title"}),n(Jn,{children:n("i",{children:n(ql,{})})})]}),n("div",{id:"navbar-lang",className:"nav-list navbar-collapse",children:n("div",{id:"nav-lang-menu",className:"collapse in",style:{transition:"all 0.35s ease-in-out",maxHeight:r?Object.keys(Ra).length*85:1,visibility:r?"visible":"hidden"},children:n("ul",{children:Ra.map((f,v)=>n(dd,{langCode:i,language:f.langCode,translationKey:f.translationKey},v))})})})]})}),n("li",{id:"signInButton",className:l?"hidden":void 0,style:{borderBottom:0},children:d("a",{className:"course-nav",href:Aa(o,i),children:[n(R,{translation:"header.menu.login"}),n(Jn,{children:n("i",{children:n(zr,{})})})]})}),n("li",{id:"signOutButton",className:u,style:{borderBottom:0},children:n("a",{className:"course-nav",onKeyUp:p,onClick:p,children:n(R,{translation:"header.menu.logout"})})})]})})},Pu=_(Ou)`
- background-color: ${g.LG_BLUE_1};
- border-top: 1px solid ${g.LG_BLUE_4};
- box-shadow: ${e=>e.isNavMenuOpen?`0 9px 10px ${g.LG_TRANSPARENT_BLACK_40}`:"hidden"};
- display: block;
- visibility: ${e=>e.isNavMenuOpen?"visible":"hidden"};
- overflow: hidden;
- position: relative;
- right: 0;
- transition: all 0.3s linear;
- z-index: 100;
-
- @media (min-width: ${C.min.tablet}px) {
- top: -5px;
- }
- @media (min-width: ${C.min.desktop}px) {
- position: absolute;
- /*! @noflip */
- right: 0;
- top: 85px;
- width: 400px;
- }
-
- .course-nav {
- display: inline-block;
- padding: 20px;
- width: 100%;
- }
-
- #languageMenu {
- padding: 0;
- &:hover {
- background: ${g.LG_BLACK};
- }
- }
-`,$u=_("ul")`
- box-shadow: 1px 10px 20px 0 ${g.LG_TRANSPARENT_BLACK_25};
- float: left;
- margin: 0;
- padding: 0;
- text-align: left;
- width: 100%;
-
- ${Yr}
-
- > li {
- border-bottom: 1px solid ${g.LG_BLUE_4};
- display: block;
- padding: 0;
- width: 100%;
- }
-
- a {
- background-color: ${g.LG_BLUE_1};
- color: ${g.LG_WHITE};
- display: block;
- font-size: 18px;
- font-weight: 700;
- line-height: 23px;
- padding: 20px;
- text-decoration: none;
- text-transform: uppercase;
-
- &:hover,
- &:active {
- background-color: ${g.LG_BLACK};
- }
-
- @media (min-width: ${C.min.tablet}px) {
- font-size: 22px;
- line-height: 43px;
- }
-
- @media (min-width: ${C.min.desktop}px) {
- font-size: 18px;
- line-height: 23px;
- }
- }
-
- #navbar-lang {
- padding: 0;
-
- ul {
- margin-top: 0;
- padding-left: 0;
- }
- }
-
- .collapse.in {
- overflow: hidden;
- display: block;
- }
-`,Jn=_("span")`
- margin-left: 10px;
- margin-top: -1px;
- opacity: 0.7;
- position: absolute;
-`,ku="https://learngerman.dw.com/";var ss=ku+"static/media/nav-cross-black-md.f5825c8f.svg";const Gu="https://learngerman.dw.com/";var er=Gu+"static/media/nav-cross-black-lg.4c2e3c0d.svg";const Du="https://learngerman.dw.com/";var os=Du+"static/media/nav-cross-xs.fec778ad.svg";const Mu="https://learngerman.dw.com/";var is=Mu+"static/media/nav-cross-lg.a759f43e.svg";const He=_("span")`
- margin-top: 4px;
- display: block;
- border-radius: 0;
- background-color: ${g.LG_WHITE};
- width: 21px;
- height: 3px;
-
- @media (max-width: ${C.max.tablet}px) {
- width: 14px;
- height: 2px;
- background-color: ${g.LG_BLUE_6};
- }
-
- @media (min-width: ${C.min.tablet}px) and (max-width: ${C.max.tablet}px) {
- margin-top: 5px;
- width: 21px;
- height: 3px;
- background-color: ${g.LG_BLUE_6};
- }
-`,Uu=({isNavMenuOpen:e,toggleIsNavMenuOpen:t,setIsLanguageSubMenuOpen:r,className:a})=>d("button",{onClick:()=>{t(),r(!1)},type:"button",className:a,"data-toggle":"collapse","data-target":"#nav-user-menu","aria-haspopup":"true","aria-controls":"navbar","aria-expanded":e,children:[e&&n("span",{className:"close-menu"}),n("span",{className:"screen-reader-only",children:"Toggle navigation"}),!e&&d(k,{children:[n(He,{}),n(He,{}),n(He,{})]})]}),ls=`
- &:hover {
- .close-menu {
- background: url(${os});
- background-size: cover;
- }
- }
- &:hover {
- ${He} {
- background-color: ${g.LG_BLACK};
- }
- }
-`,Bu=`
- @media (hover: hover) and (pointer: fine) {
- ${ls}
- }
- @media (hover: none) and (pointer: coarse) {
- ${ls}
- }
-`,Fu=`
- height: 12px;
- width: 13px;
-`,Wu=`
- height: 21px;
- width: 22px;
-`,Vu=_(Uu)`
- z-index: 3000;
- display: block;
- position: fixed;
- background-color: transparent;
- background-image: none;
- padding: 0;
- /*! @noflip */
- right: 20px;
- top: 13px;
-
- border: none;
- border-radius: 0;
-
- -webkit-appearance: button;
- cursor: pointer;
-
- @media (max-width: ${C.max.mobile}px) {
- top: 20px;
- &:hover {
- .close-menu {
- ${Fu}
- }
- }
- }
-
- @media (min-width: ${C.min.tablet}px) and (max-width: ${C.max.tablet}px) {
- top: 28px;
- &:hover {
- .close-menu {
- ${Wu}
- }
- }
- }
-
- @media (min-width: ${C.min.desktop}px) {
- margin-top: 32px;
- z-index: 1;
- position: absolute;
- top: 0;
- /*! @noflip */
- right: 30px;
- }
-
- ${Bu}
-
- &:focus {
- outline: 0;
- .close-menu {
- background: url(${er});
- background-size: cover;
- }
- }
-
- .close-menu {
- background: url(${is});
- display: block;
- height: 21px;
- margin-top: 5px;
- /*! @noflip */
- right: 15px;
- width: 22px;
-
- @media (max-width: ${C.min.desktop}px) {
- background: url(${os});
- height: 12px;
- width: 13px;
- }
-
- @media (min-width: ${C.min.tablet}px) and (max-width: ${C.max.tablet}px) {
- background: url(${ss});
- height: 21px;
- margin-top: 5px;
- width: 22px;
- }
-
- @media (min-width: ${C.min.desktop}px) {
- background: url(${ss});
- height: 21px;
- margin-top: 0px;
- position: absolute;
- /*! @noflip */
- right: 0px;
- width: 22px;
- }
- }
-
- .screen-reader-only {
- border: none;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
- }
-`,Hu=({langCode:e,title:t,className:r})=>n("div",{id:"main-nav",className:r,children:n(ju,{to:mt(e),children:n(R,{translation:t})})}),Ku="85px",Yu=_(Hu)`
- align-items: center;
- display: flex;
- height: 85px;
- justify-content: flex-start;
- /*! @noflip */
- padding-left: 5px;
- /*! @noflip */
- padding-right: ${Ku};
-
- @media (max-width: ${C.max.mobile}px) {
- display: none;
- }
-`,ju=_(ue)`
- color: ${g.LG_WHITE};
- font-family: Arial;
- font-size: 23px;
- font-weight: 600;
- opacity: 1;
- text-decoration: none;
- text-transform: uppercase;
- padding: 15px;
-
- &:hover,
- &:focus,
- &:active {
- color: ${g.LG_WHITE};
- text-decoration: none;
- }
-`,cs="zh-convert",zu=({className:e,langCode:t})=>{const{isTraditionalChin:r,trans2Simple:a,trans2Traditional:s}=id(t,cs);return n("button",{id:cs,className:e,onClick:r?a:s})},qu=_(zu)`
- background-color: ${g.LG_WHITE};
- padding: 9px 0;
- margin-right: 0;
- position: absolute;
- right: 43px;
- top: 11px;
- z-index: 10000;
- color: ${g.LG_BLUE_6};
- text-decoration: none;
- border: none;
-
- @media (max-width: 767px) {
- margin-top: 0;
- margin-right: 10px;
- }
-
- @media (max-width: 1200px) {
- margin-right: 0;
- }
-
- @media (max-width: 1199px) and (min-width: 768px) {
- top: 25px;
- margin-right: 30px;
- font-size: 30px;
- }
-
- @media (min-width: 1200px) {
- background-color: ${g.DW_LIGHT_BLUE};
- z-index: 1;
- display: block;
- float: right;
- padding: 24px 0;
- margin-right: 26px;
- margin-bottom: 4px;
- font-size: 30px;
- text-decoration: none;
- color: ${g.LG_WHITE};
- }
-`,Xu=({className:e,title:t})=>{const[r,{toggleOnClick:a}]=Kt(),[s,o]=c.exports.useState(!1),{langCode:i}=W();return d("nav",{className:e,role:"navigation","aria-label":"Main navigation",children:[i===D.CHINESE&&n(qu,{langCode:i}),n(Yu,{langCode:i,title:t}),n(Vu,{isNavMenuOpen:r,toggleIsNavMenuOpen:a,setIsLanguageSubMenuOpen:o}),n("div",{id:"navbar",className:"navigation-container",children:n(Pu,{isNavMenuOpen:r,toggleIsNavMenuOpen:a,isLanguageSubMenuOpen:s,setIsLanguageSubMenuOpen:o})})]})},Zu=_(Xu)`
- position: relative;
-
- @media (max-width: ${C.max.mobile}px) {
- margin-bottom: 0px;
- }
-
- @media (min-width: ${C.min.tablet}px) and (max-width: ${C.max.tablet}px) {
- margin-bottom: -7px;
- }
-
- @media (min-width: ${C.min.desktop}px) {
- background-color: ${g.LG_BLUE_1};
- height: 85px;
- left: 0px;
- margin-left: 0px;
- margin-right: 0px;
- position: relative;
- right: inherit;
- top: inherit;
- }
-
- .navigation-container {
- border-top: 1px solid transparent;
- box-shadow: inset 0 1px 0 ${g.LG_TRANSPARENT_WHITE_10};
- overflow-x: visible;
- padding: 0px;
- -webkit-overflow-scrolling: touch;
-
- @media (max-width: ${C.max.mobile}px) {
- padding: 60px 0 0 0;
- }
-
- @media (max-width: ${C.max.tablet}px) {
- border: none;
- }
- }
-`,Qu=({className:e})=>{const t="header.bar";return d("header",{className:e,children:[n(Bl,{title:t}),n(Al,{}),n(Zu,{title:t})]})},Ju=_(Qu)`
- display: grid;
- background: ${g.LG_WHITE};
- background-image: none;
- border: none;
- height: auto;
- min-height: 50px;
-
- @media (min-width: ${C.min.tablet}px) {
- border-radius: 4px;
- margin-bottom: 0px;
- }
-
- @media (min-width: ${C.min.desktop}px) {
- border: none;
- height: 200px;
- margin: 0;
- margin-bottom: 20px;
- }
-`,em=me`
- /* @noflip */
- .richtext-content-container > span > p[dir=ltr] {
- text-align: left;
- }
-`,je=({content:e,isContainer:t=!0,className:r})=>d("div",{className:z({"richtext-content-container":t},r),children:[n(em,{}),n(tt,{dangerouslySetInnerHTML:{__html:e}})]}),Qt=(e,t)=>t/e*100,Pe={landscape:Qt(16,9),landscape_legacy:Qt(4,3),portrait:Qt(3,4),square:Qt(1,1)},ds=(e,t)=>r=>`${t}/${e}_${r.id}.jpg`,Te=Object.freeze({legacy:{id:4,aspectRatio:[Pe.landscape_legacy,Pe.portrait]},free:{id:7},sm:{id:503,aspectRatio:Pe.landscape},sm_richtext:{id:503,aspectRatio:[Pe.landscape,Pe.portrait]},md:{id:505,aspectRatio:Pe.landscape},md_richtext:{id:505,aspectRatio:[Pe.landscape,Pe.portrait]},lg:{id:507,aspectRatio:Pe.landscape},lg_richtext:{id:507,aspectRatio:[Pe.landscape,Pe.portrait]},full:{id:509,aspectRatio:Pe.landscape}});let us=null;function tm(e){us=e}function ms(){return us}const nm=c.exports.createContext({getFrontendConfig:ms}),$e=()=>c.exports.useContext(nm).getFrontendConfig(),rm=({sources:e,fallbackUrl:t,alt:r,className:a,aspectRatio:s})=>d("picture",{className:a,style:s,children:[e.map((o,i)=>c.exports.createElement("source",T(h({},o),{key:i}))),n("img",{className:"img-responsive",src:t,alt:r})]}),Xe=r=>{var a=r,{imageId:e}=a,t=Oe(a,["imageId"]);const{imageBasePath:s}=$e(),o=ds(e,s),i={fallbackUrl:o(Te.full),sources:[{media:`(min-width: ${C.min.full}px)`,srcSet:o(Te.full)},{media:`(min-width: ${C.min.tabletLandscape}px)`,srcSet:o(Te.lg)},{media:`(min-width: ${C.min.tablet}px)`,srcSet:o(Te.md)},{media:`(min-width: ${C.min.mobile}px)`,srcSet:o(Te.sm)}]},l=h(h({},i),t);return n(rm,h({},l))},tr=({selector:e,componentFn:t,node:r,param:a=null,elementType:s="span"})=>([...r.querySelectorAll(e)].forEach((o,i)=>{const l=q.document.createElement(s),u=o.className;l.setAttribute("class",`render-container ${u}`.trim()),o.parentNode.replaceChild(l,o);const m=a?t(o,a,i):t(o,i);Wt.render(m,l)}),{document:q.document}),am=e=>{const{imageBasePath:t}=ms(),r=e.getAttribute("data-format"),a=r.includes("LEGACY"),s=r==="FREE_IMAGE",o=e.getAttribute("data-id"),i=ds(o,t),l=e.getAttribute("data-aspect-ratio"),u={fallbackUrl:i(Te.md_richtext),sources:[{media:`(min-width: ${C.min.desktop}px)`,srcSet:i(Te.lg_richtext)},{media:`(min-width: ${C.min.tablet}px)`,srcSet:i(Te.md_richtext)},{media:`(max-width: ${C.max.mobile}px)`,srcSet:i(Te.sm_richtext)}]},m={fallbackUrl:i(Te.legacy),sources:[{srcSet:i(Te.legacy)}]},p={fallbackUrl:i(Te.free),sources:[{srcSet:i(Te.free)}],aspectRatio:{paddingBottom:`${l}%`,height:0}},f=()=>a?m:s?p:u,v=h({imageId:o,alt:e.getAttribute("alt")},f());return n(Xe,h({className:r},v))},nr=e=>{tr({selector:".placeholder-image img",node:document,componentFn:am,elementType:"div"})},ps=({trigger:e="staticTrigger"})=>{gt({callback:()=>{nr()},delay:10},[e])},at=({children:e,isStandalone:t=!1})=>n("div",{className:"headline-container row",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8 ",children:n("div",{className:z("exercise-headline",{standalone:t}),children:e})})}),gs={name:"Legal",partial(){return`legal(appName: "mdl") {
- ... on Article {
- id
- shortTitle
- text
- }
- }
- `}},sm=({className:e,legal:t})=>{ps({});const{text:r,shortTitle:a}=t||{};return d("div",{className:z("section exercise-container vocabulary copy",e),children:[n(at,{isStandalone:!0,children:n("h2",{children:a})}),n("div",{className:"row",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n(je,{content:r})})})]})},om=_(sm)`
- .img-caption {
- display: none;
- }
-`,hs={name:"Footer",fragment(){return B`fragment ${this.name} on Query {
- footer(lang: $lang) {
- accessibility(appName: "mdl") {
- namedUrl
- }
- policy(appName: "mdl") {
- namedUrl
- }
- ${gs.partial()}
- }
- }
- `}},im=({className:e,data:t})=>{const{isRtl:r}=De(),{langCode:a}=W(),s=r?"rtl":"";return n("footer",{className:`${e} ${s}`,"aria-label":"Main Footer",children:n("ul",{className:s,children:lm({langCode:a,data:t}).map(o=>n("li",{className:s,children:n(R,{isA:"a",className:"footer-link",translation:o.translation,href:o.href,target:o.target,role:o.role,"aria-label":o.aria})},o.id))})})},lm=({langCode:e,data:t})=>[{translation:{key:"footer.copyright",parameters:{first:new Date().getFullYear()}},id:0,aria:"footer.copyright",role:"Firm name"},{translation:"footer.dw",id:1,href:Qc({langCode:e}),target:"_blank",aria:"footer.dw",role:"link"},{translation:"footer.privacyPolicy",id:2,href:La({namedUrl:t.footer.policy.namedUrl}),target:"_blank",aria:"footer.privacyPolicy",role:"link"},{translation:"footer.accessibility",id:3,href:La({namedUrl:t.footer.accessibility.namedUrl}),target:"_blank",aria:"footer.accessibility",role:"link"},{translation:"footer.legal",id:4,href:Yc(e),target:"",aria:"footer.legal",role:"link"},{translation:"footer.contact",id:5,href:Jc(),target:"_blank",aria:"footer.contact",role:"link"}],cm=_(im)`
- box-sizing: border-box;
- display: flex;
- flex-wrap: wrap;
- flex-direction: row;
- align-items: center;
- width: 100%;
- min-height: 90px;
- font-family: Helvetica, Arial, sans-serif;
- line-height: 45px;
- margin: 20px 0;
- background: ${g.LG_BLUE_7};
-
- ul {
- display: flex;
- flex-flow: row wrap;
- flex-direction: row;
- max-width: 100%;
- list-style-type: none;
- padding: 10px 0;
- text-align: center;
- margin: 0;
- }
-
- li {
- margin-right: 12px;
- padding: 0 0 0 12px;
-
- &.rtl {
- direction: rtl;
- }
- }
-
- .footer-link {
- text-decoration: none;
- font-size: 15px;
- color: ${g.LG_BLUE_4};
- background-color: transparent;
- :hover,
- :active,
- :focus {
- color: ${g.LG_WHITE};
- }
- }
-
- @media (max-width: ${C.max.tablet}px) {
- margin: 0;
- }
-
- @media (max-width: ${C.max.mobile}px) {
- max-width: 100%;
- min-height: 65px;
-
- ul {
- justify-content: center;
- }
- }
-`,dm=({className:e})=>n("div",{className:`${e} container loading`,children:n("p",{children:"Loading ..."})}),rr=_(dm)``,um=({className:e,error:t})=>n("div",{className:`${e}`,children:n("p",{children:t})}),fs=_(um)`
- color: red;
-`,mm=e=>e&&Object.values(e).filter(t=>t).length>0,pe=({query:e,queryVariables:t,children:r})=>{const{loading:a,error:s,data:o={},refetch:i}=Wr(e,{variables:t});if(a)return n(rr,{});if(s){const{message:l="error while fetching data"}=s;return n(fs,{error:l})}return mm(o)?r(o,i):n(fs,{error:"no data available"})};let Es=null;function pm(e){Es=e}function gm(){return Es}const hm=c.exports.createContext({getMetadata:gm}),fm=()=>c.exports.useContext(hm).getMetadata(),Em=B`
- query translationsAndConfig($lang: Language!) {
- i18n: i18nByLang(lang: $lang, appName: "mdl") {
- all
- }
- config {
- imageBasePath
- staticBaseHost
- gtmId(appName: "mdl")
- gtmLevel1Id(appName: "mdl")
- }
- iso639ByLang(lang: $lang)
- ...${hs.name}
- }
- ${hs.fragment()}
-`,xm=({children:e})=>{const{langCode:t}=W(),r={lang:Se(t||"en")};return n(pe,{query:Em,queryVariables:r,children:a=>(a.i18n&&_l(JSON.parse(a.i18n.all)),a.config&&tm(a.config),a.iso639ByLang&&pm(a.iso639ByLang),e(a))})},vm=r=>{var a=r,{children:e}=a,t=Oe(a,["children"]);return n("div",T(h({},t),{children:!be()&&e}))},ym=({footerData:e})=>{const{isLoggedIn:t}=J(Ue),[r,a]=Dn("hasAcceptedGdpr"),{namedUrl:s}=e.footer.policy||{};return t||r?null:n(vm,{children:n("div",{className:"cookie",style:{left:0},children:d("div",{className:"cookie__wrap",children:[n("div",{className:"cookie__item",children:n(R,{isA:"p",className:"cookie__text",translation:"common.gdpr.overlay.text"})}),d("div",{className:"cookie__buttons",children:[n(R,{isA:"a",translation:"common.gdpr.overlay.moreButton",className:"cookie__btn cookie__btn--more",href:`${Ve.dw.baseUrl}${s}`,target:"_blank"}),n(R,{isA:"a",translation:"common.gdpr.overlay.okButton",className:"cookie__btn cookie__btn--ok",href:"#",onClick:()=>a(!0)})]})]})})})},I=Object.freeze({HELP:"HELP",VOCABULARY:"VOCABULARY",ALPHABETICAL_ORDER:"ALPHABETICAL_ORDER",LEGAL:"LEGAL",OVERVIEW:"OVERVIEW",COURSE:"COURSE",LESSON:"LESSON",EXERCISE:"EXERCISE",LESSON_EXERCISE_RESULT:"LESSON_EXERCISE_RESULT",LESSON_SUMMARY:"LESSON_SUMMARY",GRAMMAR:"GRAMMAR",GRAMMAR_DETAIL:"GRAMMAR_DETAIL",GRAMMAR_OVERVIEW:"GRAMMAR_OVERVIEW",VOCABULARY_OVERVIEW:"VOCABULARY_OVERVIEW",REGIONAL_STUDIES:"REGIONAL_STUDIES",PLACEMENT_TEST:"PLACEMENT_TEST",FINAL_TEST:"FINAL_TEST",MANUSCRIPT:"MANUSCRIPT",USER_PROFILE:"USER_PROFILE",PASSWORD_CHANGE:"PASSWORD_CHANGE",PASSWORD_RESET:"PASSWORD_RESET",PASSWORD_SET:"PASSWORD_SET",REGISTER_USER:"REGISTER_USER",FEEDBACK_STATUS:"FEEDBACK_STATUS",EXTRAS:"EXTRAS",PLACEMENT_DASHBOARD:"PLACEMENT_DASHBOARD",VOCABULARY_TRAINER:"VOCABULARY_TRAINER",NOT_FOUND_PAGE:"NOT_FOUND"}),Et=Object.freeze({[I.OVERVIEW]:5001,[I.GRAMMAR_OVERVIEW]:5002,[I.VOCABULARY_OVERVIEW]:5003,[I.VOCABULARY_TRAINER]:5004,[I.REGISTER_USER]:5005,[I.USER_PROFILE]:5006,[I.PASSWORD_CHANGE]:5007,[I.PASSWORD_RESET]:5008,[I.PASSWORD_SET]:5009,[I.FEEDBACK_STATUS]:5010,[I.NOT_FOUND_PAGE]:5011}),Jt="lesson.menu.vocabulary",en="lesson.exercises.result.title",xt="lesson.menu.grammar",xs="lesson.menu.regionalStudies",vs="lesson.menu.manuscript",ys="lesson.menu.extras",tn="lesson.exercises.result.general",Sm=Object.freeze({[I.ALPHABETICAL_ORDER]:["lesson.menu.alphabeticalOrder"],[I.OVERVIEW]:["metadata.overview"],[I.GRAMMAR_DETAIL]:[xt],[I.HELP]:["common.help"],[I.VOCABULARY_OVERVIEW]:[Jt],[I.USER_PROFILE]:["profile.edit.title"],[I.FEEDBACK_STATUS]:["common.feedback"],[I.REGISTER_USER]:["profile.register.title"],[I.VOCABULARY]:[Jt],[I.LEGAL]:["metadata.legal"],[I.LESSON_EXERCISE_RESULT]:[en],[I.LESSON_SUMMARY]:[en],[I.GRAMMAR]:[xt],[I.GRAMMAR_OVERVIEW]:[xt],[I.REGIONAL_STUDIES]:[xs],[I.MANUSCRIPT]:[vs],[I.EXTRAS]:[ys],[I.VOCABULARY_TRAINER]:["header.menu.vocabularyTrainer"],[I.PLACEMENT_DASHBOARD]:["header.menu.levelTest"],[I.PASSWORD_CHANGE]:["profile.edit.password.change.title"],[I.PASSWORD_RESET]:["profile.edit.password.reset.title"],[I.PASSWORD_SET]:["profile.edit.password.set.title"],[I.FINAL_TEST]:[tn],[I.PLACEMENT_TEST]:[tn,"header.menu.levelTest"]}),Am=Object.freeze({[I.HELP]:"metadata.description.help",[I.VOCABULARY]:"metadata.description.vocabulary",[I.LEGAL]:"metadata.description.legal",[I.OVERVIEW]:"metadata.description.overview",[I.GRAMMAR]:"metadata.description.grammar",[I.REGIONAL_STUDIES]:"metadata.description.regionalStudies",[I.MANUSCRIPT]:"metadata.description.manuscript",[I.REGISTER_USER]:"metadata.description.register",[I.EXTRAS]:"metadata.description.extras"}),Lm=Object.freeze({[I.VOCABULARY]:Jt,[I.LESSON_EXERCISE_RESULT]:en,[I.LESSON_SUMMARY]:en,[I.GRAMMAR]:xt,[I.GRAMMAR_OVERVIEW]:xt,[I.GRAMMAR_DETAIL]:xt,[I.VOCABULARY_OVERVIEW]:Jt,[I.REGIONAL_STUDIES]:xs,[I.MANUSCRIPT]:vs,[I.EXTRAS]:ys,[I.FINAL_TEST]:tn,[I.PLACEMENT_TEST]:tn}),bm=({titleParts:e})=>e.filter(Boolean).join(" | "),Rm=({keywords:e})=>e.filter(Boolean).join(","),Ss=({html:e})=>e&&e.replace(/<.*?>/g," "),Cm=({pageType:e,translationFirst:t,contentName:r,parentContentName:a}={})=>{const{i18n:s}=Ge(),o=Sm[e],i=o?o.map(m=>s.t(m)):[],l=s.t("metadata.siteName"),u=t?[...i,r,a,l]:[r,...i,a,l];return bm({titleParts:u})},Im=({pageType:e,contentName:t,teaser:r,description:a,useTeaserAsDescription:s,useDescriptionTranslation:o}={})=>{const i=te({key:Am[e],parameters:{first:t}});return s&&Ss({html:r})||o&&i||Ss({html:a})},wm=({pageType:e,useOnlyCmsKeywords:t,keywordStrings:r}={})=>{const a=te("metadata.keywords"),o=te(Lm[e])||a,i=t?r:[...r,o];return Rm({keywords:i})},he={name:"MetaData",fragment({type:e}){return B`fragment ${this.name} on ${e} {
- name
- keywordStrings
- description
- teaser
- }
- `}},le=({pageType:e,content:t={},parentContentName:r,translationFirst:a=!1,useOnlyCmsKeywords:s=!1,useTeaserAsDescription:o=!1,useDescriptionTranslation:i=!1,addKeywordsAndDescription:l=!0})=>{const{name:u,keywordStrings:m=[],description:p,teaser:f}=t,v=te("metadata.siteName"),y=fm(),b=Cm({pageType:e,translationFirst:a,contentName:u,parentContentName:r}),A=Im({pageType:e,contentName:u,teaser:f,description:p,useTeaserAsDescription:o,useDescriptionTranslation:i}),S=wm({pageType:e,useOnlyCmsKeywords:s,keywordStrings:m}),x=gc(),E=l&&A;return d(Vt,{children:[n("html",{lang:y}),n("title",{children:b}),n("meta",{name:"copyright",content:`\xA9 ${new Date().getFullYear()} Deutsche Welle (www.dw.com)`}),E&&n("meta",{name:"description",content:A}),E&&n("meta",{property:"og:description",content:A}),l&&S&&n("meta",{name:"keywords",content:S}),n("meta",{property:"og:title",content:b}),n("meta",{property:"og:type",content:"website"}),n("meta",{property:"og:site_name",content:v}),n("meta",{property:"og:url",content:x})]})},X={getForErrorCode(e,t){const r=pa(e);return X.error(r,t)},getForPasswordChangeErrorCode(e,t){const r=pa(e);return X.errorPasswordChange(r,t)},forLogin(e,t){return ne(F.LOGIN,t)},forLogout(e){return ne(F.LOGOUT,e)},forUserDelete(e){return ne(F.DELETED,e)},forInvalidToken(e){return ne(F.INVALID_TOKEN,e)},forProfileServiceUnavailable(e){return ne(F.PROFILE_SERVICE_UNAVAILABLE,e)},forSessionTimeout(e,t){return ne(F.SESSION_TIMEOUT,t)},forMissingUserProfile(e,t){return ne(F.MISSING_USER_PROFILE,t)},forForcedLogout(e){return ne(F.FORCED_LOGOUT,e)},forPasswordChanged(e){return ne(F.PASSWORD_CHANGED,e)},forMailChanged(e){return ne(F.MAIL_CHANGED,e)},forMailChangeRequest(e){return ne(F.MAIL_CHANGE_REQUEST,e)},forRegistered(e){return ne(F.REGISTERED,e)},forRegistrationConfirm(e){return ne(F.REGISTRATION_CONFIRMED,e)},forPasswordResetRequest(e){return ne(F.PASSWORD_RESET_REQUESTED,e)},forSetPassword(e){return ne(F.PASSWORD_RESET_SET,e)},forProfileUpdated(e){return ne(F.PROFILE_UPDATED,e)},forVocabularyTrainerUnavailable(e){return ne(F.VOCABULARY_TRAINER_UNAVAILABLE,e)},forVocabularyTrainerNoVocabularies(e){return ne(F.VOCABULARY_TRAINER_NO_VOCABULARIES,e)},forCertificateMissingTranscription(e){return ne(F.CERTIFICATE_NO_TRANSCRIPTION,e)},forInvalidCertificate(e){return ne(F.INVALID_CERTIFICATE,e)},forGeneralError(e){return ne(F.OTHER,e)},error(e,t){return ne(e||F.OTHER,t)},errorPasswordChange(e,t){return ne(e?F.PASSWORD_CHANGE+e:F.OTHER,t)},getFeedbackContentKey(e){return`client.status.${e.toLowerCase().replace(/_+./g,r=>r.slice(-1).toUpperCase())}`}},Tm=(e,t)=>{const r=Le(),{origin:a}=Zt().window.location,s=fd(e),o=ge();c.exports.useEffect(()=>{const i=Ed(a,e);s&&i&&Nd(s,i).then(l=>{if(l.ok)r(bu());else throw new Error(l.status)}).then(()=>{o.push({search:_a(e,Ye.TICKET_PARAM_NAME)})}).catch(()=>{o.push(X.forGeneralError(t))})},[s,e.pathname])},Nm=e=>{const t=ge(),r=Le(),a=J(Ue);c.exports.useEffect(()=>{a.hasLogOutRequestBeenCalled&&(t.push(X.forLogout(e)),r(wu(!1)))},[a.hasLogOutRequestBeenCalled])},_m=({className:e,children:t})=>n("div",{className:e,"aria-label":"Page Container",children:n("div",{className:"content-container",children:t})}),Om=_(_m)`
- background: ${g.LG_WHITE};
- display: grid;
- margin: 0 auto;
- overflow-x: hidden !important;
- padding: 0;
- width: 100%;
-
- @media (min-width: ${C.min.desktop}px) {
- margin: 40px auto;
- min-height: 600px;
- padding: 0 20px;
- width: 1240px;
-
- .content-container {
- width: 1200px;
- }
- }
-`,Pm=()=>{const[e,t]=c.exports.useState({}),[r,a]=c.exports.useState("");return c.exports.useEffect(()=>{const s=q.window.location,o=s.pathname?s.pathname.split("/"):[],i=o.length>1?o[1]:"";t(s),a(i)},[]),{location:e,langCode:r}},$m=e=>{const t=Le(),{isLoggedIn:r}=J(Ue),a=ge();c.exports.useEffect(()=>{r&&wd().then(s=>{s.status===401&&(t(Tu()),a.push(X.forSessionTimeout("",e)))}).catch(()=>{a.push(X.forGeneralError(e))})},[r])},km=[D.ARABIC,D.DARI,D.HAUSA,D.PASHTO,D.PERSIAN,D.URDU],ar=e=>km.includes(e),Ot=e=>t=>{const{lessons:r}=t.learnProgress;return Kn({lessons:r,lessonId:e})},Gm=(e,t)=>r=>{if(!e||!t)return[];const{lessons:a}=r.learnProgress;return jd({lessons:a,lessonId:e,exerciseId:t})},As=e=>t=>{const{courses:r}=t.learnProgress;return{courseProgress:Yn({courses:r,courseId:e})}},Dm=e=>e.learnProgress.isSyncRequired,Mm=()=>{const{isLoggedIn:e}=J(Ue),t=J(Dm),r=Le();c.exports.useEffect(()=>{e&&t&&r(pu())},[e])};var Um="data:image/jpeg;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2JnLWR3LWRlc2t0b3AuNGFlYzA3M2YuanBnIjs=",Bm="data:font/woff;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL0RXVGhlQW50aXF1YUItVzdCb2xkLjczYTM1NzgzLndvZmYiOw==",Fm="data:font/woff2;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL0RXVGhlQW50aXF1YUItVzdCb2xkLmM3MzljZjBkLndvZmYyIjs=",Wm="data:font/woff;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2R3dGhlYW50aXF1YWItdzVwbGFpbi45NGM1YjgwNC53b2ZmIjs=",Vm="data:font/woff2;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2R3dGhlYW50aXF1YWItdzVwbGFpbi41MjRhNWVhYy53b2ZmMiI7",Hm="data:font/woff;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL0RXVGhlQW50aXF1YUItVzVQbGFpbkl0YWxpYy4wYzgwNmZlMS53b2ZmIjs=",Km="data:font/woff2;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL0RXVGhlQW50aXF1YUItVzVQbGFpbkl0YWxpYy4zOTA5MzdhZi53b2ZmMiI7";const Ym=me`
- * {
- box-sizing: border-box;
- font-family: Helvetica, Arial, sans-serif;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- }
- &:after, &:before {
- box-sizing: border-box;
- }
- html {
- -webkit-tap-highlight-color: transparent;
- }
- body {
- direction: ltr;
- text-align: left;
- background: url(${Um}) center top no-repeat ${g.LG_GRAY_3};
- @font-face {
- font-family: DWTheAntiquaBBold;
- src: url(${Bm}) format("woff"),
- url(${Fm}) format("woff2");
- font-style: normal;
- font-weight: 400
- }
- @font-face {
- font-family: DWTheAntiquaB;
- src: url(${Wm}) format("woff"),
- url(${Vm}) format("woff2");
- font-style: normal;
- font-weight: 400
- }
- @font-face {
- font-family: DWTheAntiquaBItalic;
- src: url(${Hm}) format("woff"),
- url(${Km}) format("woff2");
- font-style: normal;
- font-weight: 400
- }
- }
- svg:not(:root) {
- overflow: hidden;
- }
-`,jm=({children:e})=>{const{langCode:t}=W(),{location:r}=Pm();Tm(r,t),Nm(t),$m(t),Mm();const a=ar(t);return n(Pi,{stylisPlugins:a?[$i]:[],children:d(k,{children:[n(Ym,{}),n(Om,{children:e})]})})},zm=()=>n(Vt,{children:n("script",{children:`(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
-j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
-'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
-})(window,document,'script','dataLayer','GTM-${$e().gtmId}');`})}),qm=({dataLayer:e})=>{const t={display:"none",visibility:"hidden"},{gtmId:r}=$e();return n("noscript",{children:n("iframe",{title:`GTM-${r}`,src:`https://www.googletagmanager.com/ns.html?id=GTM-${r}&${Sc(e)}`,height:"0",width:"0",style:t})})},Xm=e=>{const{search:t}=Nt();return yc({from:t,value:e})},Ls=()=>{const e=Zt().window.location.href.split("?")[0],t=Xm("maca"),{gtmLevel1Id:r}=$e();return{gtmLevel1Id:r,macaParam:t,pageUrl:e}},Zm=e=>(e==null?void 0:e.length)>0,Qm=({nav:e})=>[...e.navsToRoot,e],Jm=e=>e.__typename==="Person"?e.fullName:e.name,sr=({navs:e,index:t})=>(e[t]||{}).name,ep={name:"GtmDataLayer",partial(){return`
- ...on ModelAspect {
- id
- gtmLanguageCode
- gtmContentType
- }
- ...on DeliveryAspect {
- gtmContentDate
- }
- ...on NamedAspect {
- name
- }
- ...on AssociationsAspect {
- navigations {
- id
- name
- navsToRoot {
- name
- }
- }
- subjects {
- name
- }
- topics:categories {
- originId
- }
- departments {
- name
- }
- }
- `}},bs=({content:e,level1Id:t,macaParam:r,pageUrl:a,courseId:s,noContentPageId:o})=>{var u,m,p;const i=Zm(e.navigations)?e.navigations:[{navsToRoot:[]}],l=Qm({nav:i[0]});return{categoryLevel1:sr({navs:l,index:0}),categoryLevel2:sr({navs:l,index:1}),categoryLevel3:sr({navs:l,index:2}),contentTitle:Jm(e),contentLanguage:e.gtmLanguageCode,pageOID:e.id,contentType:e.gtmContentType,date:e.gtmContentDate,subject:e.subjects?(u=e.subjects[0])==null?void 0:u.name:{},topicIds:(m=e.topics)==null?void 0:m.map(f=>f.originId),pageSID:i[0].id,departmentName:e.departments?(p=e.departments[0])==null?void 0:p.name:{},categoryType:1,displayForm:5,level1ID:t,macaParam:r,pageUrl:a,courseId:s,noContentPageId:o}},Pt={initDataLayerScript:e=>{const t=T(h({},e),{event:"onPageChange"});return`
- if(!window.dataLayer) {
- window.dataLayer = [${JSON.stringify(t)}]
- };`.trim()},generateDataLayer:({content:e,level1Id:t,macaParam:r,pageUrl:a,courseId:s,noContentPageId:o})=>({pageData:T(h({},bs({content:e,level1Id:t,macaParam:r,pageUrl:a,courseId:s,noContentPageId:o})),{embeddings:{}})}),pushToGoogleTagManager:({datalayerObj:e,withReset:t=!1})=>{setTimeout(()=>{var r;t&&Pt.resetDataLayer(),(r=q.window.dataLayer)==null||r.push(e)},0)},resetDataLayer:()=>{q.window.dataLayer.push(function(){this.reset()})}},or=c.exports.createContext({}),tp=()=>c.exports.useContext(or),fe=ep,np=({content:e,noContentPageId:t,push:r=!1})=>{const{gtmLevel1Id:a,macaParam:s,pageUrl:o}=Ls(),{courseId:i}=tp(),l=Pt.generateDataLayer({content:e,macaParam:s,level1Id:a,pageUrl:o,courseId:i,noContentPageId:t});return r&&Pt.pushToGoogleTagManager({withReset:!0,datalayerObj:h({event:"onPageChange"},l)}),d(k,{children:[n(Vt,{children:n("script",{children:Pt.initDataLayerScript(l)})}),n(qm,{dataLayer:l})]})},Ee=({content:e={},noContentPageId:t})=>{const r=!be()&&!!q.window.dataLayer;return d(k,{children:[n(np,{content:e,noContentPageId:t,push:r}),!r&&n(zm,{})]})},ir=c.exports.memo(Ee),Ne=({children:e})=>n(jm,{children:n(xm,{children:t=>d(k,{children:[n(Ju,{}),e,n(cm,{data:t}),n(ym,{footerData:t})]})})}),vt=({component:e,pageType:t,addDescriptionAndKeywordsMeta:r,useDescriptionTranslation:a})=>d(Ne,{children:[n(le,{pageType:t,addKeywordsAndDescription:r,useDescriptionTranslation:a}),n(ir,{noContentPageId:Et[t]}),n(e,{})]}),Rs=()=>d(Ne,{children:[n(ir,{noContentPageId:Et.NOT_FOUND}),n("div",{children:"Page not found (404)."})]}),rp=Object.freeze(["36519718","39902336","53437698","53074503","54554235"]),Cs=e=>rp.includes(e),ap=({className:e,aria:t,children:r})=>n("aside",{"aria-label":t,className:e,children:n("div",{className:"content",children:r})}),Is=_(ap)`
- display: flex;
- align-items: center;
- color: ${g.LG_WHITE};
-
- @media (max-width: ${C.max.mobile}px) {
- max-height: 240px;
- background-size: 150%;
- font-size: 28px;
- line-height: 32px;
- }
-`,nn=({imageId:e,imageBasePath:t})=>`${t}/${e}`,sp=_(Is)`
- background: url(${nn}_509.jpg) center center / cover no-repeat;
- height: 320px;
-
- .content {
- width: 100%;
- padding: 0 20px;
- }
-
- .title {
- margin: 0;
- white-space: nowrap;
- overflow-x: hidden;
- text-overflow: ellipsis;
- }
-
- .identifier {
- text-transform: uppercase;
- font: 700 40px Helvetica, Arial, sans-serif;
- opacity: 0.5;
- }
-
- .description {
- /* @noflip */
- direction: ltr;
- font: 400 40px DWTheAntiquaB, Georgia, serif;
- opacity: 1;
- margin: 0 8px;
- }
-
- @media (max-width: ${C.max.tablet}px) {
- .identifier,
- .description {
- font-size: 36px;
- }
- }
-
- @media (max-width: 992px) {
- background: url(${nn}_507.jpg) center center / cover no-repeat;
-
- .identifier,
- .description {
- font-size: 32px;
- }
- }
-
- @media (max-width: ${C.max.mobile}px) {
- .identifier,
- .description {
- font-size: 28px;
- }
- }
-
- @media (max-width: 480px) {
- background: url(${nn}_503.jpg) center center / cover no-repeat;
- }
-
- @media (max-width: 360px) {
- background: url(${nn}_501.jpg) center center / cover no-repeat;
- }
-`;function lr(){return lr=Object.assign||function(e){for(var t=1;t=0)&&(!Object.prototype.propertyIsEnumerable.call(e,a)||(r[a]=e[a]))}return r}function ip(e,t){if(e==null)return{};var r={},a=Object.keys(e),s,o;for(o=0;o=0)&&(r[s]=e[s]);return r}var lp=c.exports.createElement("g",{className:"arrowBox",fillRule:"evenodd"},c.exports.createElement("g",{className:"arrowArrow",transform:"translate(12, 12), rotate(0 0 0) scale(1.0)"},c.exports.createElement("polygon",{points:"12 -4.7125 0 4.9375 -12 -4.6875 -10.375 -5.5 0 0.125 10.375 -5.5"})));function cp(e,t){var r=e.title,a=e.titleId,s=op(e,["title","titleId"]);return c.exports.createElement("svg",lr({viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",ref:t,"aria-labelledby":a},s),r?c.exports.createElement("title",{id:a},r):null,lp)}var dp=c.exports.forwardRef(cp);const up=_(e=>n(dp,h({},e)))``,mp=s=>{var o=s,{className:e,isUp:t,fill:r}=o,a=Oe(o,["className","isUp","fill"]);const i=z(e,{up:t});return n(up,h({className:i,fill:r},a))},ws=_(mp)`
- position: absolute;
- width: 28px;
- height: 24px;
- fill: ${({fill:e})=>e};
- &.up {
- transform: rotate(180deg);
- }
-`,pp=({className:e,groupNameTranslationKey:t,isOpen:r,onClick:a,onKeyPress:s})=>d("div",{className:z(e,"header"),role:"button",tabIndex:"0",onClick:a,onKeyPress:s,"aria-label":"course.header",children:[n(R,{className:z("title"),isA:"h2","aria-label":"course.groupName",translation:t||"course.otherLessons"}),n(ws,{className:"toggleable-arrow",fill:g.LG_GRAY_13,isUp:r})]}),gp=_(pp)`
- display: flex;
- justify-content: space-between;
- align-items: center;
- width: 100%;
- border-top: 1px solid ${g.LG_GRAY_TRANSPARENT_1};
- height: 163px;
- pointer-events: none;
-
- .title {
- height: 25px;
- background-color: ${g.LG_WHITE};
- color: ${g.LG_GRAY_13};
- white-space: nowrap;
- overflow-x: hidden;
- text-overflow: ellipsis;
- font-family: Helvetica, Arial, sans-serif;
- font-weight: 700;
- font-size: 22px;
- line-height: 23px;
- margin: 0;
- padding: 0 20px;
- }
-
- .toggleable-arrow {
- display: none;
- }
-
- @media (max-width: ${C.max.tablet}px) {
- height: 94px;
- pointer-events: all;
-
- .title {
- padding: 0 45px 0 20px;
- border-top: 0;
- }
-
- .toggleable-arrow {
- display: inline-block;
- right: 40px;
- }
- }
-`,hp=({className:e,lessonProgress:t})=>{const{resultPoints:r,maxPointsForAllExercises:a}=t;return d("div",{className:e,children:[n("span",{className:(()=>{const o=Yt(r,a);return o>=70?"good":o<=40?"low":"mid"})(),children:r}),n("span",{children:"/"}),n("span",{children:a})]})},fp=_(hp)`
- font-size: 14px;
-
- .low {
- color: ${g.LG_RED_SCORE};
- }
- .mid {
- color: ${g.LG_GRAY_11};
- }
- .good {
- color: ${g.LG_GREEN_SCORE};
- }
-`,Ep=({className:e,onClickReset:t})=>n("button",{onClick:r=>t(r),className:e,children:n(R,{translation:"course.reset"})}),Ts=_(Ep)`
- background-color: ${g.LG_GRAY_2};
- border: 1px solid transparent;
- color: ${g.LG_WHITE};
- font-size: 12px;
- min-height: 31px;
- padding: 3px 10px;
-`,xp=_(Ts)`
- min-height: 27px;
- padding: 1px 7px;
-`,yt={GRAY:"gray",WHITE:"white"},Ze=Object.freeze({EMPTY:"empty",HALF:"half",FULL:"full"}),rn="common.progress",vp=e=>{switch(e){case Ze.EMPTY:return`${rn}.none`;case Ze.HALF:return`${rn}.half`;case Ze.FULL:return`${rn}.full`;default:return`${rn}.none`}},yp=({className:e,progress:t,color:r=yt.GRAY})=>{const a=te(vp(t));return n("div",{className:e,title:a,children:n("div",{className:z("background",r),children:n("div",{className:z("icon",t,r)})})})},$t=_(yp)`
- width: 16px;
- height: 16px;
- margin: 0;
- text-align: right;
-
- div {
- margin: 0;
- }
-
- .background.white {
- border: 2px solid ${g.LG_WHITE};
- }
-
- .background.gray {
- border: 2px solid ${g.LG_GRAY_2};
- }
-
- .background {
- height: 100%;
- width: 100%;
- border-radius: 50%;
- box-sizing: border-box;
-
- .icon {
- height: 100%;
- }
-
- .icon.white {
- background: ${g.LG_WHITE};
- }
-
- .icon.gray {
- background: ${g.LG_GRAY_2};
- }
-
- .icon.full {
- width: 100%;
- }
-
- .icon.half {
- width: 50%;
- }
-
- .icon.empty {
- width: 0;
- }
- }
-`,Sp=Ye.PS_URL,Ap=`${Sp}protected/certificate/`,Lp=e=>fetch(`${Ap}${e}`,{headers:{"Content-Type":"application/pdf"}}).then(t=>t.ok?t:t.json().then(r=>Promise.reject(r))),Ns=async({id:e,langCode:t,history:r})=>{e||r.push(X.forInvalidCertificate(t));try{const a=await Lp(e);a.blob().then(s=>{const i=a.headers.get("Content-Disposition").split("filename=")[1].replace("?","\u2013"),l=window.URL.createObjectURL(s),u=document.createElement("a");u.href=l,u.download=decodeURIComponent(i),u.click()})}catch(a){a.errorCode===F.MISSING_TRANSCRIPTION?r.push(X.forCertificateMissingTranscription(t)):r.push(X.forInvalidCertificate(t))}},bp="https://learngerman.dw.com/";var Rp=bp+"static/media/icon-course-cert-gray.0fdcab0c.svg";const Cp=({className:e,id:t})=>{const r=ge(),{langCode:a}=W(),s=te("common.progress.cert");return n("div",{role:"none",onClick:async()=>{t&&await Ns({id:t,langCode:a,history:r})},children:n("img",{alt:"progress-icon cert",className:e,src:Rp,title:s})})},Ip=_(Cp)`
- width: 16px;
- height: 24px;
- cursor: pointer;
-`,wp="https://learngerman.dw.com/";var Tp=wp+"static/media/star-white.d32dc96a.svg";const Np="https://learngerman.dw.com/";var _p=Np+"static/media/star-gray.84ad33dd.svg";const Op={[yt.GRAY]:_p,[yt.WHITE]:Tp},Pp=({className:e,color:t})=>{const r=te("common.progress.good");return n("img",{alt:"Progress icon - star",className:e,src:Op[t],title:r})},$p=_(Pp)`
- width: 16px;
- height: 16px;
-`,an=({learnProgress:e,color:t=yt.GRAY,finalLessonId:r})=>(()=>{if(!e)return n($t,{progress:Ze.EMPTY,color:t});const{resultPoints:s,maxPointsForAllExercises:o,doneExerciseCount:i,allExerciseCount:l,finalTestPassed:u}=e;return i===0?n($t,{progress:Ze.EMPTY,color:t}):u?n(Ip,{id:r}):i=80?n($p,{color:t}):n($t,{progress:Ze.FULL,color:t}):n($t,{progress:Ze.EMPTY,color:t})})(),kp=({lesson:e,className:t,onClickReset:r})=>{const a=e.id,s=J(Ot(a)),o=i=>{r(i,a)};return n(k,{children:d(ue,{className:t,to:pt({id:e.id,name:e.shortTitle,language:e.language,__typename:"Lesson"}),tabIndex:0,children:[n(_t,{className:"title",isA:"h3","aria-label":"lesson.title",children:e.shortTitle}),n("div",{className:"tile-progress",children:n(an,{learnProgress:s})}),n(_t,{className:"learningTarget","aria-label":"lesson.learningTarget",children:e.learningTargetHeadline}),s&&d(k,{children:[n(fp,{className:"lessonScore",lessonProgress:s,onClickReset:r,lessonId:e.id}),n(xp,{className:"resetButton",onClickReset:o})]}),n(_t,{className:"categories","aria-label":"lesson.categories",children:e.grammarDescription})]})})},_s="5px",Gp=_(kp)`
- border-top: 1px solid ${g.LG_GRAY_TRANSPARENT_1};
- color: ${g.LG_GRAY_8};
- display: grid;
- font-size: 14px;
- grid-template-columns: 1fr auto;
- grid-template-rows: repeat(3, 1fr);
- height: 102px;
- padding: 10px 20px;
- overflow-y: hidden;
- text-decoration: none;
-
- &:hover {
- color: ${g.LG_GRAY_8};
- text-decoration: none;
- }
-
- .title {
- color: ${g.LG_GRAY_9};
- font-family: DWTheAntiquaBBold, Georgia-Bold, serif;
- font-size: 17px;
- line-height: 24px;
- margin: 0;
- overflow-x: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- .learningTarget,
- .categories {
- font-family: DWTheAntiquaB, Georgia, serif;
- overflow-x: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- .categories {
- grid-column: 1 / 2;
- }
-
- .tile-progress {
- display: flex;
- justify-content: flex-end;
- padding: 5px 0 0 0;
- padding-right: ${_s};
- }
-
- .lessonScore {
- grid-column-start: 2;
- justify-self: flex-end;
- padding-right: ${_s};
- }
-
- .resetButton {
- grid-column-start: 2;
- grid-row-start: 3;
- justify-self: center;
- }
-`,Dp=({className:e,groupedLessons:t,onClickReset:r,isOpen:a=!0})=>n("ul",{className:z(e,"lesson-list",{collapsed:!a}),"aria-expanded":a,"aria-label":"lesson.list",children:t.map(s=>n("li",{className:"lesson-item",children:n(Gp,{lesson:s.target,onClickReset:r})},s.id))}),Mp=_(Dp)`
- transition: max-height 0.3s linear;
- overflow-y: hidden;
- visibility: visible;
- max-height: ${e=>e.groupedLessons.length*102}px;
- list-style-type: none;
- margin: 0;
- padding: 0;
-
- @media (max-width: ${C.max.tablet}px) {
- background-color: ${g.LG_GRAY_3};
-
- &:last-child {
- border-bottom: 0;
- }
-
- &.collapsed {
- visibility: hidden;
- max-height: 0;
- }
- }
-`,Up=({groupNameTranslationKey:e,groupedLessons:t,onClickReset:r})=>{const a=q.window.innerWidth>=C.min.desktop,[s,{toggleOnClick:o,toggleOnKeyPress:i}]=Kt({initialState:a});return d("div",{className:"accordion","aria-label":"course.accordion",children:[n(gp,{isOpen:s,groupNameTranslationKey:e,onClick:o,onKeyPress:i}),n(Mp,{isOpen:s,groupedLessons:t,onClickReset:r})]})},Bp=({className:e,groupedLessons:t,onClickResetLesson:r})=>n("ul",{className:e,"aria-label":"course.list",children:Object.keys(t).map(a=>n("li",{className:"course",children:n(Up,{groupNameTranslationKey:t[a][0].groupName,groupedLessons:t[a],onClickReset:r})},t[a][0].id))}),Fp=_(Bp)`
- * {
- box-sizing: border-box;
- }
-
- display: grid;
- grid-template-columns: repeat(4, 1fr);
- width: 100%;
- list-style-type: none;
- margin: 0;
- padding: 0;
-
- .course {
- display: inline-block;
- background: ${g.LG_WHITE};
-
- &:nth-child(odd) {
- .accordion .lesson-list {
- background-color: ${g.LG_GRAY_3};
- }
- }
- }
-
- @media (max-width: ${C.max.tablet}px) {
- grid-template-columns: 100%;
- }
-`,Wp=me`
- body {
- overflow: hidden;
- padding-right: 17px;
- }
-`,cr=({isOpen:e,children:t})=>{if(!e)return null;const r=d(k,{children:[n(Wp,{}),t]});return Wt.createPortal(r,document.body)},Vp=({titleKey:e,className:t,handleClick:r})=>{const{isRtl:a}=De(),s=te(e);return n("button",{className:z(`${t} button`,{rtl:a}),"aria-label":s,onClick:r,children:s})},xe=_(Vp)`
- display: inline-block;
- width: 100%;
- background: ${g.LG_BLUE_1};
- box-sizing: border-box;
- border: none;
- height: 50px;
- text-decoration: none;
- justify-content: center;
- align-items: center;
- line-height: 33px;
- color: ${g.LG_WHITE};
- font: 400 17px Helvetica, Arial, sans-serif;
- text-align: center;
- :active,
- :hover,
- :focus {
- transition: all 0.1s linear;
- background-color: ${g.LG_GRAY_10};
- color: ${g.LG_WHITE};
- }
-
- .rtl {
- direction: rtl;
- }
-`,Hp=({className:e,fadeIn:t,descriptionKey:r,leftButtonKey:a,rightButtonKey:s,onConfirmClicked:o,onCancelClicked:i})=>{const{isRtl:l}=De(),m=`${e} fade ${t?"in":""}`;return d("div",{className:l?`${m} rtl`:`${m}`,children:[n("div",{className:"modal-background"}),n("div",{className:"modal-dialogue",children:d("div",{className:"modal-content",children:[n("div",{className:"modal-body",children:n(R,{isA:"p",translation:r})}),d("div",{className:"modal-footer",children:[n(jp,{titleKey:a,handleClick:o,className:e}),n(Yp,{titleKey:s,handleClick:i,className:e})]})]})})]})},Kp=_(Hp)`
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 10040;
-
- .modal-background {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background: ${g.LG_BLACK};
- opacity: 0.5;
- font-family: Helvetica, Arial, sans-serif;
- font-weight: 400;
- font-size: 15px;
- }
- .modal-dialogue {
- position: relative;
- background-color: ${g.LG_WHITE};
- width: 900px;
- margin: 30px auto;
-
- .modal-content {
- position: relative;
- background-color: ${g.LG_WHITE};
- background-clip: padding-box;
- border-radius: 0;
- outline: 0;
- box-shadow: 0 3px 9px ${g.LG_TRANSPARENT_BLACK_50};
- border: 1px solid ${g.LG_TRANSPARENT_BLACK_20};
-
- .modal-body {
- position: relative;
- padding: 15px;
- font-size: 15px;
-
- p {
- margin: 0 0 10px;
- }
- }
- }
-
- .modal-footer {
- padding: 35px 10px;
- text-align: right;
- border-top: 1px solid ${g.LG_GRAY_4};
- display: flex;
- flex-flow: row;
- justify-content: space-evenly;
-
- button {
- position: relative;
- margin: 0 7px;
- width: 100%;
- }
- }
- }
-
- &.fade {
- opacity: 0;
- -webkit-transition: opacity 0.15s linear;
- -o-transition: opacity 0.15s linear;
- transition: opacity 0.15s linear;
- }
-
- &.fade.in {
- opacity: 1;
- }
-
- &.rtl {
- direction: rtl;
- }
-
- @media (max-width: ${C.max.tablet}px) {
- .modal-dialogue {
- width: 600px;
- .modal-footer {
- flex-flow: column;
- button {
- margin: 15px 0;
- }
- }
- }
- }
-
- @media (max-width: ${C.max.mobile}px) {
- .modal-dialogue {
- width: auto;
- margin: 10px;
- .modal-footer {
- flex-flow: column;
- button {
- margin: 15px 0;
- }
- }
- }
- }
-`,Yp=_(xe)`
- background: ${g.LG_WHITE};
- color: ${g.LG_BLUE_1};
- border: 1px solid ${g.LG_BLUE_1};
- box-sizing: border-box;
-
- :hover {
- border-color: ${g.LG_BLACK};
- }
-`,jp=xe,Os=({fadeIn:e,onConfirmClicked:t,onCancelClicked:r})=>n(Kp,{fadeIn:e,descriptionKey:"lesson.modal.confirm",leftButtonKey:"lesson.modal.reset",rightButtonKey:"lesson.modal.cancel",onConfirmClicked:t,onCancelClicked:r}),zp=({className:e,courseId:t,finalLessonId:r,onClickResetCourse:a})=>{const{courseProgress:s}=J(As(t));return d("div",{className:e,children:[n(Ts,{onClickReset:a}),n(an,{learnProgress:s,finalLessonId:r})]})},qp=_(zp)`
- display: flex;
- justify-content: flex-end;
- align-items: center;
- padding-right: 25px;
-
- > * {
- margin: 14px;
- }
-`,st={0:"",2:"A1",4:"A2",8:"B1",16:"B2"},dr=e=>[...e].sort((t,r)=>t.dkLearningLevel===0&&r.dkLearningLevel===0?0:t.dkLearningLevel-r.dkLearningLevel||t.id-r.id),Xp=me`
- #courses {
- .title,
- span[aria-label*="lesson"] {
- /* @noflip */
- direction: ltr;
- }
- .content .title {
- /* @noflip */
- text-align: left;
- }
- }
-`,Zp=({data:e,contentId:t})=>{const r=Cs(t),{name:a,dkLearningLevel:s,contentLinks:o,mainContentImageLink:i,learningMetaInfo:{achievableScore:l,exerciseCount:u}={}}=e.content,m=rc(o),p=m.filter(O=>In(O)).map(O=>O.target.id),f=m.map(O=>O.target.id),v=nc("groupName",m),{imageBasePath:y}=$e(),[b,A]=c.exports.useState(!1),[S,x]=c.exports.useState(null),E=Le();c.exports.useEffect(()=>{E(du({allExerciseCount:u,maxPointsForAllExercises:l,cosCourseId:t})),E(lu(f)),E(qa(t))},[]);const N=()=>{A(!0)},$=(O,H)=>{O.preventDefault(),x(H),A(!0)},w=()=>{S?(E(Xt(S)),x(null)):E(uu(t)),A(!1)},L=()=>{x(null),A(!1)};return d("div",{className:"section","data-course-id":t,id:"courses",children:[r&&n(Xp,{}),n("div",{className:"row",children:n("div",{className:"col-xs-12",children:n("div",{className:"respHeaderImgContainer course-headline",children:n(sp,{imageId:i.targetId,imageBasePath:y,children:d("h1",{className:"title",children:[n(R,{tabIndex:0,translation:st[s],className:"identifier"}),n(R,{tabIndex:0,translation:a,className:"description"})]})})})})}),n("div",{className:"row",children:n(qp,{courseId:+t,finalLessonId:p,onClickResetCourse:N})}),n("div",{className:"row course-list learn-status",children:n(Fp,{groupedLessons:v,onClickResetLesson:$})}),n(cr,{isOpen:b,children:n(Os,{fadeIn:!0,onConfirmClicked:w,onCancelClicked:L})})]})},ur={name:"ImageOGMetaData",fragment({type:e}){return B`fragment ${e}${this.name} on ${e} {
- mainContentImage {
- id
- imageFormats
- }
- }
- `}},Ps=e=>e.find(t=>t.includes("MASTER_LANDSCAPE")),Qp=({id:e,imageFormats:t,imageBasePath:r})=>{if(Ps(t))return{url:`${r}/${e}_401.jpg`,width:700,height:394}},$s=({image:e})=>{const{imageBasePath:t}=$e();if(!e)return null;const{url:r,width:a,height:s}=Qp(T(h({},e),{imageBasePath:t}))||{};return r?d(Vt,{children:[n("meta",{property:"og:image:type",content:"image/jpeg"}),n("meta",{property:"og:image",content:r}),n("meta",{property:"og:image:width",content:a}),n("meta",{property:"og:image:height",content:s})]}):null},Jp=({addMetaInfo:e,handicap:t})=>B`
- query CoursePage($id: Int!, $lang: Language!) {
- content(id: $id, lang: $lang) {
- ... on Course {
- name
- dkLearningLevel
- mainContentImageLink {
- description
- targetId
- }
- contentLinks(targetTypes: LESSON) {
- id
- additionalInformation
- groupName
- target {
- ... on Lesson {
- id
- language
- shortTitle
- learningTargetHeadline
- grammarDescription
- }
- }
- }
- ...CourseImageOGMetaData
- ...${`CourseScore${t||""}`}
- ...${he.name}
- ${fe.partial()}
- }
- }
- }
- ${Hn.fragment({type:"Course",addLearningMetaInfo:e,handicap:t})}
- ${ur.fragment({type:"Course"})}
- ${he.fragment({type:"Course"})}
-`,eg=({contentId:e,langCode:t})=>{const{isLoggedIn:r}=J(Ue),{handicap:a}=J(ft)||{},s={id:+e,lang:Se(t)};return n(Ne,{children:n(pe,{query:Jp({addMetaInfo:r,handicap:a}),queryVariables:s,children:o=>d(or.Provider,{value:{courseId:+e},children:[n(le,{pageType:I.COURSE,content:o.content,useOnlyCmsKeywords:!0}),n($s,{image:o.content.mainContentImage}),n(Ee,{content:o.content}),n(Zp,{data:o,contentId:e})]})})})},ks="",Gs="",tg='',ng="
",Ms=e=>rg(e).replace(new RegExp(ks,"g"),`${tg}${Gs}`).replace(new RegExp(Ds,"g"),`${Ds}${ng}`),rg=e=>e.replace(new RegExp(ks,"g"),Gs);class Us extends c.exports.Component{constructor(){super(...arguments);Fr(this,"state",{})}componentDidMount(){const t=this.props.delayTime||100,r=setTimeout(()=>this.props.actionToBeDelayed(),t);this.setState((a,s)=>({timeoutHandle:r}))}componentWillUnmount(){clearTimeout(this.state.timeoutHandle)}render(){const o=this.props,{render:t,actionToBeDelayed:r,delayTime:a}=o,s=Oe(o,["render","actionToBeDelayed","delayTime"]);return t(s)}}const ag=({className:e,fadeIn:t,knowledgeType:r,imageId:a,imageName:s,audioFile:o,title:i,shortTitle:l,name:u,text:m,subTitle:p,onClose:f,isRtl:v})=>{const y=c.exports.useRef(),b=c.exports.useRef(),A=c.exports.useRef(),S=t?"in":"",x=r==="INITIAL_SOUND",E=L=>{L.preventDefault(),y.current.play()},N=()=>{b.current.classList.remove("in"),A.current.classList.remove("in"),f&&f()},$=n("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":"Close",onClick:N,children:n("span",{"aria-hidden":"true",children:"\u2A2F"})}),w=L=>d("a",{className:"audio-modal-link audio-example",href:"/#",onClick:O=>E(O),role:"button",tabIndex:0,children:[n("h4",{className:"modal-title",id:"mySmallModalLabel",children:L}),n("audio",{ref:y,className:"audio-modal-file initialized",tabIndex:"0",children:n("source",{src:o,type:"audio/MP3"})})]});return d(k,{children:[n("div",{className:z(e,"modal fade",{in:S}),ref:b,children:n("div",{className:"modal-dialog-glossar modal-sm",role:"document",children:d("div",{className:"modal-content m-bubble",children:[x&&d("div",{className:"modal-header no-line",children:[$,n("h2",{className:"modal-title",id:"mySmallModalLabel",children:l})]}),!x&&d("div",{className:"modal-header",children:[$,w(i),p&&n("h5",{className:"modal-title",id:"mySmallModalLabelSubline",children:p})]}),x&&d("div",{className:"modal-body",children:[n(Xe,{imageId:a,alt:s}),w(u),n(je,{className:"richText",content:m})]}),!x&&d("div",{className:"modal-body",children:[a&&n(Xe,{imageId:a,alt:s}),n(je,{className:z("richText",{"override-rtl":v}),content:m})]})]})})}),n("div",{className:z(e,"modal-backdrop fade",{rtl:v,in:S}),role:"button",tabIndex:"0","aria-label":"Close",ref:A,onClick:N,onKeyPress:N})]})},sg=_(ag)`
- display: block;
- &.modal {
- pointer-events: none;
- }
- .modal-dialog-glossar {
- pointer-events: all;
- }
- &.modal-backdrop {
- cursor: default;
- }
- div.modal-body {
- div.richText {
- margin: 0;
- p {
- margin: 0 0 10px;
- }
- }
- }
- .audio-example {
- background-image: inherit;
- padding-left: 0px;
- padding-right: 0px;
- margin-right: 0px;
- }
-`,og=({children:e,knowledge:t,isRtl:r})=>{const[a,{toggleOnClick:s,toggleOnKeyPress:o}]=Kt(),i=c.exports.useRef(null),l="A, a;\xC4, \xE4;E, e;I, i;O, o;\xD6, \xF6;U, u;\xDC, \xFC;Eu, eu;Au, au;ie;Ei, ei".split(";"),u={consonants:"anlaut-modal consonants",vocals:"anlaut-modal vocals",glossary:"glossar-modal custom-modal"},m=()=>t.knowledgeType==="VOCABULARY"?u.glossary:l.includes(t.shortTitle)?u.vocals:u.consonants,p=()=>d(k,{children:[n("a",{className:m(),href:"#",onClick:y=>f(y),onKeyPress:y=>v(y),children:e})," ",a&&n(sg,{fadeIn:a,knowledgeType:t.knowledgeType,imageId:t.mainContentImage?t.mainContentImage.id:null,imageName:t.mainContentImage?t.mainContentImage.name:null,audioFile:t.audios&&t.audios[0]?t.audios[0].mp3Src:null,title:t.name,shortTitle:t.shortTitle,name:t.name,text:t.text,subTitle:t.subTitle,onClose:()=>{s()},isRtl:r})]});c.exports.useEffect(()=>{Wt.render(n(p,{}),i.current)},[a]);const f=y=>{y.preventDefault(),s()},v=y=>{y.preventDefault(),o(y)};return n("span",{ref:i})},ig=(e,{knowledges:t,isRtl:r})=>n(og,{knowledge:t.find(a=>a.id===parseInt(e.dataset.id,10)),isRtl:r,children:e.textContent}),Bs=e=>{tr({selector:".placeholder.editable",node:document,componentFn:ig,param:e})},St={name:"Knowledges",fragment({type:e}){return B`fragment ${e}${this.name} on ${e} {
- knowledges {
- id
- text
- knowledgeType
- shortTitle
- subTitle
- name
- mainContentImage {
- id
- name
- }
- audios {
- mp3Src
- }
- }
- }
- `}},lg=B`
- query LessonKnowledge($knowledgeId: Int!, $lessonLang: Language!) {
- content(id: $knowledgeId, lang: $lessonLang) {
- ... on Knowledge {
- name
- text
- }
- ...KnowledgeKnowledges
- ${fe.partial()}
- }
- }
- ${St.fragment({type:"Knowledge"})}
-`,cg=({pageType:e,lessonName:t,lessonKeywordStrings:r})=>{const{langCode:a,contentId:s}=W(),{isRtl:o}=De(),i={knowledgeId:+s,lessonLang:Se(a)};return n(pe,{query:lg,queryVariables:i,children:l=>{const{content:u}=l,{name:m,text:p,knowledges:f}=u,v=Ms(p);return d(k,{children:[n(le,{pageType:e,content:T(h({},u),{keywordStrings:r}),parentContentName:t,useDescriptionTranslation:!0}),n(Ee,{content:u}),n(at,{children:n("h2",{dir:"auto",children:m})}),n("div",{className:"row vocabulary",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n(Us,{actionToBeDelayed:()=>{nr(),Bs({knowledges:f,isRtl:o})},delayTime:10,render:()=>n(je,{content:v})})})}),n("div",{className:"row vocabulary",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n("div",{className:"richtext-content-container",children:" "})})})]})}})},sn=({trigger:e,knowledges:t,ignore:r=!1})=>{const{isRtl:a}=De();gt({callback:()=>{r||Bs({knowledges:t,isRtl:a})},delay:10},[e])},dg=({data:e})=>{const{name:t,text:r,knowledges:a}=e.content,s=Ms(r);return sn({knowledges:a}),d("div",{className:"section exercise-container vocabulary copy",children:[n(at,{children:n("h2",{dir:"auto",children:t})}),n("div",{className:"row vocabulary",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n(Us,{actionToBeDelayed:nr,delayTime:10,render:()=>n(je,{content:s})})})})]})},ug=B`
- query GrammarPage($id: Int!, $lang: Language!) {
- content(id: $id, lang: $lang) {
- ... on Knowledge {
- name
- text
- }
- ...KnowledgeKnowledges
- ${fe.partial()}
- }
- }
- ${St.fragment({type:"Knowledge"})}
-`,mg=({contentId:e,langCode:t})=>{const r={id:+e,lang:Se(t)};return n(Ne,{children:n(pe,{query:ug,queryVariables:r,children:a=>d(k,{children:[n(le,{pageType:I.GRAMMAR_DETAIL,content:a.content}),n(Ee,{content:a.content}),n(dg,{data:a})]})})})};var Fs="data:image/jpeg;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2NvdXJzZV9sYW5kaW5nLTEyMDB4Njc1LmY2OGRjNWI1LmpwZyI7",pg="data:image/jpeg;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2NvdXJzZV9sYW5kaW5nLTk5Mng1NTguNDMwOWU4NjEuanBnIjs=",gg="data:image/jpeg;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2NvdXJzZV9sYW5kaW5nLTc2OHg0MzIuZDU0YmMwOTkuanBnIjs=",hg="data:image/jpeg;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2NvdXJzZV9sYW5kaW5nLTQ4MHgyNzAuNWE4Mjg2OWUuanBnIjs=";const fg=_(Is)`
- height: 400px;
- background-size: 100%;
- text-align: center;
- justify-content: center;
- background: url(${Fs}) center/cover no-repeat;
-
- .content {
- position: static;
- display: flex;
- flex-flow: column;
-
- .title {
- color: ${g.LG_ORANGE_DARK};
- font-family: DWTheAntiquaB, Georgia, serif;
- font-size: 54px;
- font-weight: 400;
- height: 60px;
- line-height: 50px;
- margin: 0 0 30px 0;
- opacity: 1;
- width: 100%;
- }
-
- .description {
- font: 400 23px/27.6px DWTheAntiquaB, Georgia, serif;
- margin: 0 0 10px;
- font-size: 23px;
- color: ${g.LG_ORANGE_DARK};
- width: 100%;
- }
- }
-
- @media (max-width: ${C.max.mobile}px) {
- .content {
- .title {
- font-size: 28px;
- margin-bottom: -20px;
- }
-
- .description {
- font-size: 16px;
- }
- }
- }
-
- @media (min-width: ${C.min.mobile}px) {
- background: url(${hg}) center/cover no-repeat;
- }
-
- @media (min-width: ${C.min.tablet}px) {
- background: url(${gg}) center/cover no-repeat;
- .title {
- margin-bottom: 0;
- }
- }
-
- @media (min-width: ${C.min.tabletLandscape}px) {
- background: url(${pg}) center/cover no-repeat;
- }
-
- @media (min-width: ${C.min.full}px) {
- background: url(${Fs}) center/cover no-repeat;
- }
-`,Eg=B`
- fragment Tile on Course {
- id
- name
- language
- subTitle
- dkLearningLevel
- }
-`,xg=({className:e,data:t})=>{const{dkLearningLevel:r,name:a,subTitle:s,id:o}=t,{courseProgress:i}=J(As(o)),{isLoggedIn:l}=J(Ue);return d(vg,{linkData:t,className:e,children:[l&&n("div",{className:"tile-progress",children:n(an,{learnProgress:i,color:yt.WHITE})}),n("h2",{className:"tile-learningLevel",children:st[r]}),n(R,{isA:"p",translation:a,className:"tile-name","aria-label":"tile.placement.name"}),n(R,{isA:"p",translation:s,className:"tile-subTitle","aria-label":"tile.placement.subTitle"})]})},vg=({children:e,linkData:t,className:r})=>t.href?n("a",{className:`${r} tile-container`,href:t.href,children:e}):n(ue,{className:`${r} tile-container`,to:pt(t),children:e},t.id),Ws=_(xg)`
- --absElemOffset: 84px;
- padding: var(--absElemOffset) 20px 20px 20px;
- display: flex;
- flex-direction: column;
- width: 300px;
- height: 250px;
- box-sizing: border-box;
- position: relative;
- border-color: ${g.LG_WHITE};
- border-style: solid;
- border-width: 1px 1px 0 0;
- background-color: ${({backgroundColor:e})=>e};
- color: ${g.LG_WHITE};
-
- &:nth-child(4n) {
- border-right-width: 0;
- }
-
- &.tile-container {
- text-decoration: none;
- :hover,
- :active,
- :focus {
- color: ${g.LG_TRANSPARENT_WHITE_50};
- }
- }
-
- .tile-learningLevel {
- font: 400 70px / var(--absElemOffset) Helvetica, Arial, sans-serif;
- height: var(--absElemOffset);
- text-align: start;
- margin: 0;
- padding: 0;
- position: absolute;
- top: 0;
- }
-
- .tile-name {
- font: 400 23px/25px DWTheAntiquaBBold, Georgia, serif;
- margin: 0 0 7px;
- width: 100%;
- }
-
- .tile-subTitle {
- font: 400 16px/25px DWTheAntiquaB, Georgia, serif;
- max-height: 60%;
- opacity: 0.9;
- max-width: 95%;
- }
-
- .tile-progress {
- position: absolute;
- top: 0;
- padding-top: 20px;
- width: calc(100% - 40px);
- height: var(--absElemOffset);
- display: flex;
- justify-content: flex-end;
- }
-
- @media (max-width: ${C.max.tablet}px) {
- --absElemOffset: 64px;
- height: 180px;
- width: 100%;
- border-width: 1px 1px 0 0;
-
- &:nth-child(2n) {
- border-right-width: 0;
- }
-
- .tile-learningLevel {
- font: 400 54px/64px Helvetica, Arial, sans-serif;
- height: var(--absElemOffset);
- }
-
- .tile-name {
- font-size: 22px;
- }
-
- .tile-subTitle {
- font-size: 15px;
- }
-
- .tile-progress {
- height: var(--absElemOffset);
- padding-top: 15px;
- }
- }
-
- @media (max-width: ${C.max.mobile}px) {
- height: 90px;
- padding: 10px;
- border-width: 1px 0 0 0;
- justify-content: center;
-
- .tile-learningLevel {
- line-height: 90px;
- font-size: 36px;
- width: 58px;
- height: 90px;
- margin: 0 0 0 6px;
- }
-
- .tile-name {
- position: relative;
- font-size: 17px;
- line-height: 19px;
- font-weight: 400;
- margin: 0 25px 3px 64px;
- width: calc(100% - 89px);
- }
-
- .tile-subTitle {
- font-size: 14px;
- font-weight: 400;
- line-height: 19px;
- flex-direction: row;
- margin: 0 25px 0 64px;
- width: calc(100% - 89px);
- }
-
- .tile-progress {
- width: calc(100% - 20px);
- }
- }
-`,yg=({className:e})=>{const{isRtl:t}=De();return n("div",{className:`${e} ${t?"rtl":""}`})},Sg=_(yg)`
- border-top: 1px solid ${g.LG_WHITE};
- border-right: 1px solid ${g.LG_WHITE};
- background: ${g.DW_LIGHT_BLUE};
- text-decoration: none;
-
- @media (max-width: ${C.max.tablet}px) {
- height: 180px;
- width: 100%;
-
- &.rtl {
- border-right-width: 0;
- }
- }
-
- @media (max-width: ${C.max.mobile}px) {
- display: none;
- }
-`,Ag=({className:e,backgroundColor:t})=>n(Ws,{className:e,backgroundColor:t,data:{dkLearningLevel:0,name:"dashboard.dw.title",subTitle:"dashboard.dw.text",href:"https://www.dw.com/en/learn-german/s-2469"}}),Lg=_(Ag)`
- .tile-progress {
- display: none;
- }
-`,Vs=[`${g.LG_ORANGE}`,`${g.LG_ORANGE_DARK}`,`${g.LG_PINK}`,`${g.LG_RED}`,`${g.LG_GREEN_LIGHT}`,`${g.LG_GREEN}`,`${g.DW_LIGHT_BLUE}`,`${g.LG_BLUE_5}`],Hs=e=>{e.scrollIntoView({behavior:"smooth",block:"center",inline:"nearest"})},bg=()=>`id-${Math.random().toString(36).substr(2,16)}`,Rg=({className:e,data:t})=>d("nav",{className:e,children:[t.map((r,a)=>{const s=n(Ws,{backgroundColor:Vs[a%Vs.length],data:r},r.id);return t.length%2==0&&t.indexOf(r)===t.length-1?d(c.exports.Fragment,{children:[s,n(Sg,{})]},bg()):s}),n(Lg,{backgroundColor:g.LG_BLUE_5})]}),Cg=_(Rg)`
- display: grid;
- grid-template-columns: repeat(4, 1fr);
- width: 100%;
- min-height: 500px;
- border-bottom: 1px solid ${g.LG_WHITE};
-
- @media (min-width: ${C.min.desktop}px) {
- width: 1200px;
- }
-
- @media (max-width: ${C.max.tablet}px) {
- grid-template-columns: repeat(2, 1fr);
- }
-
- @media (max-width: ${C.max.mobile}px) {
- grid-template-columns: 1fr;
- width: 100%;
- }
-`,Ig=({data:e})=>{const t=Le();return c.exports.useEffect(()=>{const r=e.map(a=>a.id);t(cu(r))},[e,t]),d("main",{"aria-label":"dashboard",children:[d(fg,{children:[n(R,{isA:"h1",tabIndex:0,translation:"dashboard.title",className:"title"}),n(R,{isA:"p",tabIndex:0,translation:"dashboard.subTitle",className:"description"})]}),n(Cg,{data:e})]})},wg=B`
- query DashboardPage($type: ModelType!, $courseLang: Language!, $amount: Int!) {
- # Get courses in the selected language till A2 level
- contentsByLang: contentsByType(
- type: $type
- lang: $courseLang
- amount: $amount
- filters: { field: "dkLearningLevel", value: ["0", "2", "4"] }
- ) {
- ...Tile
- ... on Course {
- ${fe.partial()}
- }
- }
- # Get B1 courses in German
- contentsInGerman: contentsByType(
- type: $type
- lang: GERMAN
- amount: $amount
- filters: { field: "dkLearningLevel", value: ["8", "16"] }
- ) {
- ...Tile
- }
- }
- ${Eg}
-`,Tg=()=>{const{langCode:e}=W(),t={type:"COURSE",courseLang:Se(e),amount:10};return n(Ne,{children:n(pe,{query:wg,queryVariables:t,children:r=>d(k,{children:[n(le,{pageType:I.OVERVIEW,useDescriptionTranslation:!0}),n(Ee,{noContentPageId:Et.OVERVIEW}),n(Ig,{data:[...dr(r.contentsByLang),...r.contentsInGerman]})]})})})},Ng=({className:e})=>n("div",{className:e,children:d("div",{className:"grammarOverviewHeader-wrapper",children:[n(R,{translation:"header.menu.grammar",isA:"h1"}),n(R,{translation:"grammar.overview.description",isA:"p"})]})}),_g=_(Ng)`
- display: block;
- width: 100%;
- background-color: ${g.LG_GRAY_3};
- color: ${g.LG_GRAY_9};
-
- .grammarOverviewHeader-wrapper {
- height: 320px;
- display: flex;
- flex-direction: column;
- justify-content: space-between;
-
- h1 {
- padding: 125px 20px 0 20px;
- margin: 20px 0 10px;
- }
-
- p {
- padding: 0 20px 10px;
- margin: 0 0 10px;
- }
- }
-
- @media (min-width: ${C.min.desktop}px) {
- margin-bottom: 20px;
- }
-
- @media (max-width: ${C.max.mobile}px) {
- .grammarOverviewHeader-wrapper {
- height: 240px;
-
- h1 {
- padding: 78px 20px 0 20px;
- }
- }
- }
-`,Og=({title:e,contents:t,className:r})=>{const a=c.exports.useRef(null),[s,{toggleOnClick:o}]=Kt(),i=a.current?a.current.scrollHeight:"0";return d("div",{className:r,children:[d("button",{tabIndex:0,className:"accordionItem-btn",onClick:o,children:[n(R,{translation:e,isA:"p",className:r}),n(ws,{className:"toggleable-arrow",fill:g.LG_WHITE,isUp:s})]}),n($g,{height:i,isOpen:s,ref:a,"aria-expanded":s,children:t.map(l=>n("div",{className:"accordionItem-text",children:n(ue,{tabIndex:s?0:-1,to:pt({id:l.id,name:l.shortTitle,language:l.language,__typename:l.knowledgeType}),children:l.shortTitle})},l.id))})]})},Pg=_(Og)`
- font-family: DWTheAntiquaB, Georgia, serif;
- font-weight: 400;
- font-size: 18px;
- line-height: 25px;
- text-align: left;
-
- display: flex;
- flex-direction: column;
- margin: 0px;
-
- .accordionItem-btn {
- display: flex;
- position: relative;
- width: 100%;
- padding: 20px;
- background-color: ${({backgroundColor:e})=>e};
- color: ${g.LG_WHITE};
- cursor: pointer;
- align-items: center;
- border: none;
- :hover {
- background-color: ${g.LG_GRAY_9};
- }
- :focus {
- color: ${g.LG_BAHAMA_BLUE};
- text-decoration: underline;
- }
- }
-
- .toggleable-arrow {
- right: 18px;
- }
-`,$g=_.div`
- max-height: ${({isOpen:e,height:t})=>e?t:"1"}px;
- overflow: hidden;
- background-color: ${g.LG_WHITE};
- transition: max-height 0.7s;
-
- .accordionItem-text {
- font-size: 18px;
- line-height: 25px;
- border-bottom-width: 1px;
- border-bottom-style: solid;
- border-bottom-color: ${g.LG_GRAY_12};
-
- a {
- color: ${g.LG_GRAY_9};
- text-decoration: none;
- padding: 20px;
- display: block;
- &:hover {
- color: ${g.LG_WHITE};
- background-color: ${g.LG_GRAY_9};
- }
- }
-
- @media (max-width: ${C.max.mobile}px) {
- font-size: 15px;
- line-height: 20px;
- }
- }
-`,Ks=[`${g.LG_GREEN_YELLOW}`,`${g.DW_LIGHT_BLUE}`,`${g.LG_ORANGE}`,`${g.LG_RED}`,`${g.LG_GREEN_YELLOW}`,`${g.LG_PINK}`,`${g.LG_ORANGE_DARK}`,`${g.LG_ORANGE}`,`${g.LG_RED_DARK}`,`${g.DW_LIGHT_BLUE}`,`${g.LG_GREEN}`,`${g.LG_ORANGE}`],kg=({className:e,data:t})=>n("div",{className:e,children:t.map((r,a)=>n(Pg,{backgroundColor:Ks[a%Ks.length],title:r.headline,contents:r.grammars,className:e},r.id))}),Gg=_(kg)`
- display: block;
-`,Dg=e=>Object.values(e.grammarOverview).filter(t=>Array.isArray(t.grammars)&&t.grammars.length),Mg=e=>d(k,{children:[n(_g,{}),n(Gg,{data:Dg(e)})]}),Ug=B`
- fragment GrammarOverviewItems on GrammarOverviewCategory {
- id
- headline
- grammars {
- id
- shortTitle
- language
- knowledgeType
- }
- }
-`,Bg=B`
- query GrammarOverviewPage($lang: Language!) {
- grammarOverview(lang: $lang) {
- verbs {
- ...GrammarOverviewItems
- }
- tenses {
- ...GrammarOverviewItems
- }
- nounsAndArticles {
- ...GrammarOverviewItems
- }
- declination {
- ...GrammarOverviewItems
- }
- negation {
- ...GrammarOverviewItems
- }
- pronoun {
- ...GrammarOverviewItems
- }
- prepositions {
- ...GrammarOverviewItems
- }
- adjectivesAndAdverbs {
- ...GrammarOverviewItems
- }
- sentenceStructure {
- ...GrammarOverviewItems
- }
- numbers {
- ...GrammarOverviewItems
- }
- spellingOrthography {
- ...GrammarOverviewItems
- }
- others {
- ...GrammarOverviewItems
- }
- }
- }
- ${Ug}
-`,Fg=()=>{const{langCode:e}=W(),t={lang:Se(e)};return n(Ne,{children:n(pe,{query:Bg,queryVariables:t,children:r=>d(k,{children:[n(le,{pageType:I.GRAMMAR_OVERVIEW}),n(Ee,{noContentPageId:Et.GRAMMAR_OVERVIEW}),n(Mg,h({},r))]})})})},ee={langCodeRegex:"[a-z]{2}-?0?0?2?[briaf]{0,2}",titlePathRegex:".*",contentIdRegex:"\\d+",contentTypeRegex:"[a-z_]{1,15}",knowledgeTypeRegex:"lv|la",knowledgeWithContentIdTypeRegex:"gr|rs",feedbackTypes:Object.values(F).join("|")},Be=({to:e,translationKey:t,id:r,ariaLabel:a,target:s,rel:o,onClick:i,onKeyPress:l})=>{const u=te(t);return n(Wg,{children:n(ue,{to:e,id:r,target:s,rel:o,onClick:i,onKeyPress:l,className:"lesson-menu-link","aria-label":a,children:u})})},Wg=_("li")`
- padding: 0;
- text-align: center;
- width: 100%;
-
- @media (min-width: ${C.min.tablet}px) {
- border-bottom: 1px solid ${g.LG_WHITE};
- }
-
- .lesson-menu-link {
- color: ${g.LG_WHITE};
- font-family: Helvetica, Arial, sans-serif;
- font-size: 17px;
- font-weight: 700;
- display: inline-block;
- padding: 20px;
- text-decoration: none;
- width: 100%;
-
- // mouse, touch pad
- @media (hover: hover) and (pointer: fine) {
- &:hover {
- background-color: ${g.LG_ORANGE1};
- }
- }
- // smartphones, touchscreens
- @media (hover: none) and (pointer: coarse) {
- &:hover {
- background-color: ${g.LG_ORANGE1};
- }
- }
- &:active {
- background-color: ${g.LG_ORANGE1};
- }
- &:focus {
- background-color: ${g.LG_BLACK};
- }
-
- @media (min-width: ${C.min.tablet}px) {
- font-size: 21px;
- }
- }
-`,Vg=({lessonName:e})=>n(Hg,{children:n("h1",{className:"title",children:e})}),Hg=_("div")`
- align-items: center;
- display: flex;
- justify-content: center;
- min-height: 60px;
-
- .title {
- color: ${g.LG_WHITE};
- font-size: 18px;
- line-height: 1.3;
- margin: 15px 0;
- padding: 0 50px;
- text-align: center;
- }
-
- @media (min-width: ${C.min.tablet}px) {
- min-height: 85px;
-
- .title {
- font-size: 25px;
- padding: 0 65px;
- }
- }
-
- @media (min-width: ${C.min.desktop}px) {
- .title {
- font-size: 34px;
- }
- }
-`,Kg=({isMenuCollapsed:e,setIsMenuCollapsed:t})=>n(jg,{children:d("button",{onClick:()=>t(!e),type:"button",className:e?"icon-toggle collapsed":"icon-toggle collapse","data-toggle":e?"collapsed":"collapse","data-target":"#lecture-nav-user-menu","aria-expanded":e,"aria-controls":"navbar",children:[n("span",{className:"title",children:n(R,{translation:"lesson.menu.inLesson"})}),d("div",{className:"burger-menu-toggle-container",children:[n("span",{className:"sr-only",children:n(R,{translation:"lesson.menu.toggleNavigation"})}),!e&&n("span",{className:"close-menu"}),e&&d(k,{children:[n(He,{}),n(He,{})]})]})]})}),Ys=`
- background-color: transparent;
- background-image: none;
- border: 0;
- border-radius: 0;
- margin: 0;
- padding: 0;
-`,js=`
- &:hover ${He} {
- background-color: ${g.LG_BLACK};
- }
- &:hover .close-menu {
- background: url(${er});
- background-size: cover;
- }
-`,Yg=`
- @media (hover: hover) and (pointer: fine) {
- ${js}
- }
- @media (hover: none) and (pointer: coarse) {
- ${js}
- }
-`,jg=_("div")`
- position: absolute;
- /*! @noflip */
- right: 20px;
- top: calc(50% - 10px);
-
- @media (min-width: ${C.min.desktop}px) {
- /*! @noflip */
- right: 30px;
- }
-
- .title {
- display: none;
- }
-
- ${He} {
- background-color: ${g.LG_WHITE};
- padding: 0;
- }
-
- .close-menu {
- background: url(${is});
- background-size: cover;
- display: block;
- height: 15px;
- margin-top: 6px;
- /*! @noflip */
- right: 15px;
- width: 15px;
-
- @media (min-width: ${C.min.tablet}px) {
- height: 21px;
- margin-top: 2px;
- width: 22px;
- }
- }
-
- .collapse {
- display: block;
- ${Ys}
- }
-
- .collapsed {
- ${Ys}
- }
-
- .burger-menu-toggle-container {
- margin: 0;
- position: relative;
- }
-
- .icon-toggle {
- ${Yg}
-
- &:active ${He},
- &:focus ${He} {
- background-color: ${g.LG_BLACK};
- }
-
- &:focus .close-menu,
- &:active .close-menu {
- background: url(${er});
- background-size: cover;
- }
- }
-`,K=Object.freeze({EXERCISE:"EXERCISE",GRAMMAR:"GRAMMAR",VOCABULARY_GLOSSARY:"VOCABULARY_GLOSSARY",REGIONAL_STUDIES:"REGIONAL_STUDIES",PHONEMIC_CHART:"PHONEMIC_CHART",MANUSCRIPT:"MANUSCRIPT",DOWNLOAD:"DOWNLOAD"}),_e=(e,t)=>e.some(r=>r.lessonPart===t),zs=(e,t)=>{const r=e.find(a=>a.lessonPart===t);return r?r.targetId:null},zg=e=>e.filter(t=>[K.GRAMMAR,K.VOCABULARY_GLOSSARY,K.REGIONAL_STUDIES].includes(t.lessonPart)),mr=e=>e.filter(t=>t.lessonPart===K.EXERCISE),qs=({lessonContentLinksFromCourse:e,currentLessonId:t})=>{const r=e.find(a=>a.targetId===+t&&In(a));return Boolean(r)},qg=({lessonOverviewParts:e,lessonPath:t})=>Xg({lessonOverviewParts:e,lessonPath:t}).filter(r=>r.hasInfo),Xg=({lessonOverviewParts:e,lessonPath:t})=>{const r=zs(e,K.GRAMMAR),a=zs(e,K.REGIONAL_STUDIES);return[{name:"grammar",hasInfo:_e(e,K.GRAMMAR),url:ha(t,r)},{name:"alphabeticalOrder",hasInfo:_e(e,K.PHONEMIC_CHART),url:Ea(t)},{name:"vocabulary",hasInfo:_e(e,K.VOCABULARY_GLOSSARY),url:fa(t)},{name:"regionalStudies",hasInfo:_e(e,K.REGIONAL_STUDIES),url:xa(t,a)}]},Xs=({lessonId:e,lessonName:t,lessonOverviewParts:r,courseId:a,courseName:s,isFromPlacementCourse:o,isFinalTest:i,firstExercisePath:l})=>{const{langCode:u}=W(),[m,p]=c.exports.useState(!0),[f,v]=c.exports.useState(!1),y=Le(),b=ge(),A=te("lesson.menu.grammar_aria"),S=te("lesson.menu.vocabulary_aria"),x=()=>{y(Xt(+e)),v(!1),b.push(Me(e,u,Ae(t)))},E=()=>{v(!1)},N=H=>_e(r,H)&&r.find(U=>U.lessonPart===H).targetId,$=N(K.GRAMMAR),w=N(K.REGIONAL_STUDIES),L=Me(e,u,Ae(t)),O=_e(r,K.EXERCISE)&&!o&&!i;return n(Zg,{children:d("div",{className:"lesson-nav-layout-wrapper",children:[d("div",{className:"lesson-title-button-container-wrapper",children:[n(Vg,{lessonName:t}),n(Kg,{isMenuCollapsed:m,setIsMenuCollapsed:p})]}),n("div",{className:"lesson-nav-menu-container-wrapper",children:n("div",{id:"lecture-nav-user-menu",className:"collapse in lesson-nav-menu-wrapper","aria-expanded":!m,style:{transition:"all 0.3s linear",maxHeight:m?0:800,visibility:m?"hidden":"visible",boxShadow:m&&"none"},children:d("ul",{className:"lesson-nav-menu",children:[n(Be,{onClick:()=>p(!m),to:L,translationKey:"lesson.menu.description",progressIconClass:"half"}),_e(r,K.EXERCISE)&&n(Be,{onClick:()=>{i&&y(Xt(+e)),p(!m)},to:l,id:"exercise-list",translationKey:"lesson.menu.exercises",progressIconClass:"full"}),_e(r,K.GRAMMAR)&&n(Be,{onClick:()=>p(!m),to:ha(L,$),id:"grammar",translationKey:"lesson.menu.grammar",progressIconClass:"none",ariaLabel:A,rel:"noopener noreferrer",target:"_blank"}),_e(r,K.PHONEMIC_CHART)&&n(Be,{onClick:()=>p(!m),to:Ea(L),id:"alphabetical-order",translationKey:"lesson.menu.alphabeticalOrder",progressIconClass:"full",rel:"noopener noreferrer",target:"_blank"}),_e(r,K.VOCABULARY_GLOSSARY)&&n(Be,{onClick:()=>p(!m),to:fa(L),id:"vocabulary",translationKey:"lesson.menu.vocabulary",progressIconClass:"full",ariaLabel:S,rel:"noopener noreferrer",target:"_blank"}),_e(r,K.REGIONAL_STUDIES)&&n(Be,{onClick:()=>p(!m),to:xa(L,w),id:"regional-studies",translationKey:"lesson.menu.regionalStudies",progressIconClass:"none",target:"_blank",rel:"noopener noreferrer"}),_e(r,K.MANUSCRIPT)&&n(Be,{onClick:()=>p(!m),to:Hc(L),id:"manuscript",translationKey:"lesson.menu.manuscript",progressIconClass:"none"}),_e(r,K.DOWNLOAD)&&n(Be,{onClick:()=>p(!m),to:Kc(L),id:"extras",translationKey:"lesson.menu.extras",progressIconClass:"none"}),O&&d(k,{children:[n(Be,{onClick:()=>{p(!m),v(!0)},to:"#",id:"reset",translationKey:"lesson.menu.reset"}),n(cr,{isOpen:f,children:n(Os,{fadeIn:f,onConfirmClicked:x,onCancelClicked:E})})]}),a&&!o&&n(Be,{onClick:()=>p(!m),to:Wc(a,u,Ae(s)),id:"course-overview",translationKey:"lesson.menu.courseOverview"}),o&&n(Be,{onClick:()=>p(!m),to:ga(u),id:"placement-dashboard",translationKey:"lesson.menu.placementDashboard"})]})})})]})})},Zg=_("nav")`
- display: grid;
-
- @media (min-width: ${C.min.desktop}px) {
- margin-bottom: 20px;
- }
-
- .lesson-nav-layout-wrapper {
- background-color: ${g.LG_ORANGE};
- position: relative;
- top: 0;
- width: 100%;
- z-index: 3;
- }
-
- .lesson-title-button-container-wrapper {
- display: grid;
- }
-
- .lesson-nav-menu-container-wrapper {
- position: absolute;
- width: 100%;
- }
-
- .lesson-nav-menu-wrapper {
- border-top: 1px solid ${g.LG_WHITE};
- box-shadow: 1px 10px 20px 0 ${g.LG_TRANSPARENT_BLACK_25};
- margin: 0;
- padding: 0;
- width: 100%;
-
- @media (min-width: ${C.min.desktop}px) {
- box-shadow: none;
- }
- }
-
- .lesson-nav-menu {
- background-color: ${g.LG_ORANGE};
- list-style-type: none;
- margin: 0;
- padding: 0;
- width: 100%;
-
- ${Yr}
-
- @media (min-width: ${C.min.desktop}px) {
- /* @noflip */
- float: right;
- width: 400px;
- }
- }
-`;function pr(){return pr=Object.assign||function(e){for(var t=1;t=0)&&(!Object.prototype.propertyIsEnumerable.call(e,a)||(r[a]=e[a]))}return r}function Jg(e,t){if(e==null)return{};var r={},a=Object.keys(e),s,o;for(o=0;o=0)&&(r[s]=e[s]);return r}function eh(e,t){var r=e.title,a=e.titleId,s=Qg(e,["title","titleId"]);return c.exports.createElement("svg",pr({width:"18px",height:"18px",viewBox:"0 0 18 18",xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",xmlSpace:"preserve",style:{fillRule:"evenodd",clipRule:"evenodd",strokeLinejoin:"round",strokeMiterlimit:1.41421},ref:t,"aria-labelledby":a},s),r?c.exports.createElement("title",{id:a},r):null,c.exports.createElement("path",{d:"M9,0C13.967,0 18,4.033 18,9C18,13.967 13.967,18 9,18C4.033,18 0,13.967 0,9C0,4.033 4.033,0 9,0ZM12.189,14.994L12.189,14.343L10.027,13.623L10.027,6.966C8.269,6.966 7.525,7.069 6.206,7.289L6.206,7.903C7.113,8.041 7.538,8.144 7.977,8.337L7.977,13.657C7.181,13.849 6.502,14.013 5.87,14.343L5.87,14.994L12.189,14.994ZM8.984,5.417C8.544,5.417 8.31,5.322 8.007,5.02C7.705,4.718 7.61,4.484 7.61,4.044C7.61,3.605 7.705,3.37 8.007,3.068C8.31,2.765 8.544,2.67 8.984,2.67C9.424,2.67 9.657,2.765 9.96,3.068C10.262,3.37 10.357,3.605 10.357,4.044C10.357,4.484 10.262,4.718 9.96,5.02C9.657,5.322 9.424,5.417 8.984,5.417Z",style:{fill:"#f08c00"}}))}var gr=c.exports.forwardRef(eh);const th=B`
- fragment LessonContentDescription on Lesson {
- id
- description
- learningTargetHeadline
- learningTargetDescription
- }
-`,nh=({content:e,firstExercisePath:t,isFinalTest:r,isHintHidden:a})=>{const{id:s,description:o,learningTargetHeadline:i,learningTargetDescription:l,knowledges:u}=e;sn({knowledges:u});const m=Le(),p=()=>{r&&m(Xt(s))};return n("div",{className:"row",children:d("div",{className:"col-xs-12",children:[d("div",{className:"main-info-content ",children:[n("div",{className:"richtext-content-container override-strong",children:n("span",{className:"description",children:n(tt,{dangerouslySetInnerHTML:{__html:o}})})}),d("div",{className:"richtext-content-container override-strong",children:[n("h2",{className:"learningTargetHeadline",children:i}),n("p",{}),n(tt,{dangerouslySetInnerHTML:{__html:l}}),n("p",{})]})]}),n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:d("div",{className:`exercise-hint ${a&&"hidden"}`,children:[n("span",{className:"hint ",children:n(gr,{})}),n(R,{translation:"lesson.noexercise"})]})}),n("div",{className:"start-lecture",children:n("div",{className:"col-xs-12 col-md-4 col-md-offset-4",children:n(ue,{to:t,id:"start-lesson",className:"btn main",onClick:p,children:n(R,{translation:"lesson.start"})})})})]})})},rh=Object.freeze({GERMAN:"Deutsch/Deutsch",ENGLISH:"English",RUSSIAN:"\u0420\u0443\u0441\u0441\u043A\u0438\u0439",CHINESE:"\u4E2D\u6587",PORTUGUESE_BRAZIL:"Portugu\xEAs",ALBANIAN:"Shqip",AMHARIC:"\u12A0\u121B\u122D\u129B",ARABIC:"\u0639\u0631\u0628\u064A",BENGALI:"\u09AC\u09BE\u0982\u09B2\u09BE",BOSNIAN:"Bosanski",BULGARIAN:"\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438",DARI:"\u062F\u0631\u06CC",FRENCH:"Fran\xE7ais",GREEK:"\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC",HAUSA:"Hausa",HINDI:"\u0939\u093F\u0928\u094D\u0926\u0940",INDONESIAN:"Bahasa Indonesia",KISWAHILI:"Kiswahili",CROATIAN:"Hrvatski",MACEDONIAN:"\u041C\u0430\u043A\u0435\u0434\u043E\u043D\u0441\u043A\u0438",PASHTO:"\u067E\u069A\u062A\u0648",PERSIAN:"\u0641\u0627\u0631\u0633\u06CC",POLISH:"Polski",ROMANIAN:"Rom\xE2n\u0103",SERBIAN:"Srpski",SPANISH:"Espa\xF1ol",TURKISH:"T\xFCrk\xE7e",UKRANIAN:"\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430 \u043C\u043E\u0432\u0430",URDU:"\u0627\u0631\u062F\u0648"}),ah="modulepreload",Zs={},sh="/",ze=function(t,r){return!r||r.length===0?t():Promise.all(r.map(a=>{if(a=`${sh}${a}`,a in Zs)return;Zs[a]=!0;const s=a.endsWith(".css"),o=s?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${a}"]${o}`))return;const i=document.createElement("link");if(i.rel=s?"stylesheet":ah,s||(i.as="script",i.crossOrigin=""),i.href=a,document.head.appendChild(i),s)return new Promise((l,u)=>{i.addEventListener("load",l),i.addEventListener("error",u)})})).then(()=>t())},oh=({text:e=""})=>/]*video-js vjs-fluid[^>]*>/g.test(e),ih=({text:e=""})=>/]*video-js vjs-fluid[^>]*>/g.test(e),Qs=({__typename:e,text:t=""})=>e==="Video"||oh({text:t}),Js=({__typename:e,text:t=""})=>e==="Audio"||ih({text:t}),lh=e=>Qs(e)&&!Js(e),ch=e=>Js(e)&&!Qs(e),eo=async()=>Promise.all([ze(()=>import("./videojs-contrib-quality-levels.es.3c9f1f86.js"),["assets/videojs-contrib-quality-levels.es.3c9f1f86.js","assets/video.es.046d6735.js","assets/vendor.5e871953.js"]),ze(()=>import("./videojs-hls-quality-selector.es.819e7d97.js"),["assets/videojs-hls-quality-selector.es.819e7d97.js","assets/video.es.046d6735.js","assets/vendor.5e871953.js"]),ze(()=>Promise.resolve({}),["assets/videojs-hls-quality-selector.2c84279b.css"])]),to=async()=>Promise.all([ze(()=>import("./plugin.b7c20a4b.js"),["assets/plugin.b7c20a4b.js","assets/vendor.5e871953.js","assets/video.es.046d6735.js"]),ze(()=>Promise.resolve({}),["assets/videojs-seek-buttons.49164b12.css"])]),dh=async()=>{const[e]=await Promise.all([ze(()=>import("./video.es.046d6735.js").then(function(t){return t.a}),["assets/video.es.046d6735.js","assets/vendor.5e871953.js"]),ze(()=>Promise.resolve({}),["assets/video-js.min.94f84163.css"])]);return{videojs:e.default}},no={bigPlayButton:!1},uh=h({},no),mh=T(h({},no),{controlBar:{pictureInPictureToggle:!1,fullscreenToggle:!1},playbackRates:[1,1.3,1.5]}),ph=e=>{if(e.tagName==="AUDIO")return mh;if(e.tagName==="VIDEO")return uh},gh=async()=>Promise.all([eo(),to()]),hh=async e=>lh(e)?eo():ch(e)?to():gh(),fh=async e=>{const{videojs:t}=await dh();return await hh(e),t},Eh=e=>{e.seekButtons({forward:30,back:10})},xh=e=>{e.hlsQualitySelector()},vh=e=>{e.isAudio()?Eh(e):xh(e)},yh=async e=>({playerLib:await fh(e),document:q.window.document,init:vh}),Sh=async({playerLib:e,document:t,init:r})=>{const{durationBarComponentName:a}=await ze(()=>import("./VjsDurationInfoBar.bf4a69ea.js"),["assets/VjsDurationInfoBar.bf4a69ea.js","assets/vendor.5e871953.js","assets/video.es.046d6735.js"]),{videoPlayButtonComponentName:s}=await ze(()=>import("./VjsPlayButton.12b55f32.js"),["assets/VjsPlayButton.12b55f32.js","assets/vendor.5e871953.js","assets/video.es.046d6735.js"]);[...t.querySelectorAll(".video-js:not(.rendered)")].forEach(i=>{i.classList.add("rendered");const l=e(i,ph(i));l.addChild(a),l.addChild(s),r(l)})},Ah=e=>{c.exports.useEffect(()=>{let t=!1;async function r(){const a=await yh(e);t||await Sh(a)}return be()||r(),()=>{t=!0}},[e])},Lh="addEmbeddings",bh=({dictionary:e})=>{c.exports.useEffect(()=>{Pt.pushToGoogleTagManager({datalayerObj:{event:Lh,pageData:{embeddings:e}}})},[])},ro=e=>{const{level1Id:t,macaParam:r,pageUrl:a}=Ls(),s={[e.id]:bs({content:e,level1Id:t,macaParam:r,pageUrl:a})};bh({dictionary:s})},hr={name:"MediaInputVideo",fragment({type:e}){return B`fragment ${e}${this.name} on ${e} {
- videos {
- name
- contentDate
- language
- posterImageUrl
- hlsVideoSrc
- formattedDuration
- subtitles {
- trackId: targetId
- srcLanguage
- language
- subtitleUrl
- }
- ${fe.partial()}
- }
- }
- `}},fr=({data:e})=>{Ah(e.content),ro(e.content.videos[0]);const{type:t="application/x-mpegURL",subtitles:r,posterImageUrl:a,hlsVideoSrc:s,formattedDuration:o}=e.content.videos[0];return d("video",{className:"video-js vjs-fluid",preload:"none",controls:!0,poster:a,"data-duration":o,children:[n("source",{src:s,type:t}),r.map(i=>n("track",{default:!0,src:i.subtitleUrl,srcLang:i.srcLanguage,label:rh[i.language]},i.trackId)),d("p",{className:"vjs-no-js",children:["To view this video please enable JavaScript, and consider upgrading to a web browser that"," ",n("a",{href:"https://videojs.com/html5-video-support/",rel:"noopener noreferrer",target:"_blank",children:"supports HTML5 video"})]})]})},Rh={name:"MediaInputImage",fragment({type:e}){return B`fragment ${e}${this.name} on ${e} {
- mainContentImage {
- imageId: id
- imageName: name
- }
- }
- `}},ao=({data:e})=>{const{imageId:t,imageName:r}=e.content.mainContentImage||{};return t?n(Xe,{imageId:t,alt:r}):null},Ch={name:"MediaInputAudio",fragment({type:e}){return B`fragment ${e}${this.name} on ${e} {
- audios {
- id
- name
- contentDate
- mainContentImage {
- imageId: id
- imageName: name
- }
- mp3Src
- audioResourceLinks {
- url
- duration
- size
- }
- ${fe.partial()}
- }
- }
- `}},so=({data:e})=>{const t=c.exports.useRef();if(ro(e.content.audios[0]),!e.content.audios[0])return null;const{id:r,name:a,contentDate:s,mainContentImage:o,mp3Src:i}=e.content.audios[0],{imageId:l,imageName:u}=o||e.content.mainContentImage||{},{duration:m,size:p}=e.content.audios[0].audioResourceLinks[0],f=v=>{v.preventDefault(),t.current.play()};return d("div",{className:"input-header-audio",children:[l&&n("a",{className:"audio-trigger",href:"/#",onClick:v=>f(v),style:{cursor:"pointer"},role:"button",tabIndex:0,children:n(Xe,{imageId:l,alt:u})}),d("audio",{ref:t,controls:!0,id:r,className:"initialized",xttype:"audio",xtrefresh:"5",xtstream:"1",xtlocation:"ext",xtmode:"clip",xtextension:"17",xtplayer:r,"content-date":s,xtrichname:a,xtduration:m,xtsize:p,children:[n("source",{src:i}),n(R,{translation:"common.avplayer.playerNotSupported"})]})]})},Er={name:"MediaInputChooser",fragment({type:e}){return B`fragment ${e}${this.name} on ${e} {
- ...${e}MediaInputImage
- ...${e}MediaInputAudio
- ...${e}MediaInputVideo
- }
- ${Rh.fragment({type:e})}
- ${Ch.fragment({type:e})}
- ${hr.fragment({type:e})}
- `}},oo=({data:e})=>{const{videos:t,audios:r}=e.content,a=t.length>0?n(fr,{data:e}):r.length>0?n(so,{data:e}):e.content.mainContentImage?n("div",{className:"respHeaderImgContainer course-headline",children:n(ao,{data:e})}):null;return n("div",{className:"row",children:n("div",{className:"col-xs-12",children:n("div",{className:"input-header-container",children:a})})})},Ih=B`
- query LessonInformation($lessonId: Int!, $lang: Language!) {
- content(id: $lessonId, lang: $lang) {
- ... on Lesson {
- ...LessonMediaInputChooser
- ...LessonContentDescription
- ...LessonKnowledges
- ...${he.name}
- ${fe.partial()}
- }
- }
- }
- ${Er.fragment({type:"Lesson"})}
- ${th}
- ${St.fragment({type:"Lesson"})}
- ${he.fragment({type:"Lesson"})}
-`,wh=({lessonLang:e,firstExercisePath:t,isFinalTest:r,courseName:a,isContentDescriptionHintVisible:s=!1,ogImage:o})=>{const{lessonId:i}=W(),l={lessonId:+i,lang:e};return n(pe,{query:Ih,queryVariables:l,children:u=>d(k,{children:[n(le,{pageType:I.LESSON,content:u.content,parentContentName:a,useOnlyCmsKeywords:!0,useTeaserAsDescription:!0}),n($s,{image:o}),n(Ee,{content:u.content}),n(oo,{data:u}),n(nh,{content:u.content,firstExercisePath:t,isFinalTest:r,isHintHidden:!s})]})})},on=Object.freeze({ADD_DONE_INQUIRY:"ADD_DONE_INQUIRY",RESET:"RESET"}),Th=(e,t)=>{switch(t.type){case on.ADD_DONE_INQUIRY:return T(h({},e),{inquiryProgresses:[...e.inquiryProgresses,Md({inquiryId:t.inquiryId,score:t.score,achievableScore:t.achievableScore})],numberOfDoneInquiries:e.numberOfDoneInquiries+1,currentExerciseScore:e.currentExerciseScore+t.score});case on.RESET:return io;default:throw new Error("unexpected action type")}},io={inquiryProgresses:[],numberOfDoneInquiries:0,currentExerciseScore:0},lo=c.exports.createContext(null),Nh=({isFromPlacementCourse:e,children:t})=>{const[r,a]=c.exports.useReducer(Th,io);return n(lo.Provider,{value:[T(h({},r),{isFromPlacementCourse:e}),a],children:t})},xr=()=>{const[e,t]=c.exports.useContext(lo);return{exerciseProgress:e,addDoneInquiry:({inquiryId:s,score:o,achievableScore:i})=>{t({type:on.ADD_DONE_INQUIRY,inquiryId:s,score:o,achievableScore:i})},resetProgress:()=>{t({type:on.RESET})}}},co=n(R,{id:"outOf",className:"darkgray",translation:"exercise.outOf"}),uo=n(R,{id:"number-of-points-earned-text",className:"darkgray",translation:"exercise.pointsEarned"}),mo=n(R,{id:"number-of-exercises-solved-text",className:"darkgray",translation:"exercise.exercisesResolved"}),_h=({amountOfInquiries:e})=>{const{exerciseProgress:t}=xr(),{langCode:r}=W(),a=ar(r),s=n("span",{id:"number-of-solved",children:t.numberOfDoneInquiries}),o=n("span",{id:"number-of-all-inquiries",children:e}),i=n("span",{id:"number-of-points-earned",children:t.currentExerciseScore});return n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n("p",{className:"exerciseStats",children:a?d(k,{children:[s,"\xA0",co,"\xA0",mo,"\xA0",o,"\xA0",uo,"\xA0",i]}):d(k,{children:[s,"\xA0",co,"\xA0",o,"\xA0",mo,".\xA0",i,"\xA0",uo,"."]})})})},Oh=()=>{const{pathname:e}=Nt();c.exports.useEffect(()=>{!be()&&q.window.scrollTo(0,0)},[e])},ln=({title:e,top:t,bottom:r})=>n("div",{className:"row noVMargins",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n("div",{className:z("exercise-nav",{top:t,bottom:r}),children:n(R,{isA:"div",className:"exercise-nav-title",style:{direction:"ltr"},translation:e})})})}),po={name:"LessonExerciseHeadline",fragment(){return B`fragment ${this.name} on Exercise {
- name
- description
- }
- `}},Ph=({data:e})=>{const{name:t,description:r}=e.content;return d(at,{children:[n("h2",{dir:"auto",children:t}),n("div",{dir:"auto",dangerouslySetInnerHTML:{__html:r}})]})},ot=c.exports.forwardRef(({src:e},t)=>n("div",{className:"exercise-audio-feedback",children:n("audio",{className:"exercise-audio-file feedback-audio initialized",tabIndex:"-1",width:"100%",preload:"none",ref:t,children:n("source",{src:e,type:"audio/MP3"})})})),$h=c.exports.forwardRef((e,t)=>n(ot,{ref:t,src:"/assets/audio/signal_sound_failure.mp3"})),kh=c.exports.forwardRef((e,t)=>n(ot,{ref:t,src:"/assets/audio/signal_sound_success.mp3"})),go=c.exports.createContext([{},()=>{},{},{}]),it=e=>{const[t,r]=c.exports.useState([]),a=c.exports.useRef(),s=c.exports.useRef();return d(go.Provider,{value:[t,r,a,s],children:[n($h,{ref:a}),n(kh,{ref:s}),e.children]})},At=({inputText:e})=>e&&n("div",{className:"headline-container row",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n("div",{className:"exercise-headline",children:n(je,{content:e})})})}),lt=()=>{const[e,t,r,a]=c.exports.useContext(go),s=m=>{const p=e[m];e.forEach(f=>{f!==p&&(f.current.pause(),f.current.currentTime=0)})};return{playAudio:(m,p)=>{m.preventDefault();const f=e.indexOf(p);s(f),e[f].current.play()},addRef:m=>{e.push(m),t(e)},playWrongDefaultAudioFeedBack:()=>{r.current.play()},playCorrectDefaultAudioFeedBack:()=>{a.current.play()}}},Gh=me`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-`,vr=({audio:e,inquiryText:t})=>{const[r,a]=c.exports.useState(!1),[s,o]=c.exports.useState(!1),i=te("exercise.playAudio"),{target:l}=e||{},{mp3Src:u,mainContentImage:m}=l||{},p=c.exports.useRef(),{addRef:f,playAudio:v}=lt(),{imageBasePath:y}=$e();c.exports.useEffect(()=>{f(p)},[f]);const b=()=>{a(!0)},A=()=>{a(!1),o(!0)},S=()=>{a(!1)},x=()=>r?"playing":s?"ending":"",E=t||i;return d(k,{children:[d("a",{href:"#!",className:`bubble audio ${x()} alwaysLtr`,"aria-label":`Audio - ${E}`,onClick:N=>v(N,p),children:[n(Gh,{}),n("audio",{className:`exercise-audio-file initialized${r?" playing-now":""}`,tabIndex:"0",width:"100%",preload:"none",onPlaying:b,onEnded:A,onPause:S,ref:p,children:n("source",{src:u,type:"audio/MP3"})}),n("div",{className:"bubble-text-audio",children:E}),n("div",{className:"exercise-play-audio"})]}),m&&n("div",{className:"bubble-image-container",children:n("img",{className:"img-responsive",src:`${y}/${m.imageId}_501.jpg`,alt:m.imageName})})]})},Dh=me`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-`,yr=({inquiryText:e})=>d(k,{children:[n(Dh,{}),n("div",{className:"bubble text alwaysLtr",children:e})]}),Mh=({inquiryText:e,mainContentImage:t})=>{const{id:r,name:a}=t,{imageBasePath:s}=$e();return d(k,{children:[n(yr,{inquiryText:e}),n("div",{className:"bubble-image-container",children:n("img",{className:"img-responsive",src:`${s}/${r}_501.jpg`,alt:a})})]})},Uh=({inquiryText:e,videos:t})=>d(k,{children:[n(yr,{inquiryText:e}),n("div",{className:"bubble-image-container",children:n(fr,{data:{content:{videos:t}}})})]}),cn=e=>e.find(t=>t.mainContent),kt=(e,t)=>t.find(a=>!a.mainContent)||(e?cn(t):void 0),qe=Object.freeze({TEXT:"TEXT",IMAGE:"IMAGE",AUDIO:"AUDIO",VIDEO:"VIDEO"}),ho={name:"LessonExerciseQuestion",fragment(){return B`fragment ${this.name} on Inquiry {
- inquiryText
- mainContentImage {
- id
- name
- }
- audios: contentLinks(targetTypes: [AUDIO]) {
- id
- mainContent
- target {
- ...on Audio {
- mp3Src
- mainContentImage {
- imageId: id
- imageName: name
- }
- }
- }
- }
- ...Inquiry${hr.name}
- }
- ${hr.fragment({type:"Inquiry"})}
- `}},fo=({inquiry:e})=>{const{videos:t,audios:r,mainContentImage:a}=e;return a?qe.IMAGE:t.length>0?qe.VIDEO:cn(r)?qe.AUDIO:qe.TEXT},Lt=({inquiry:e,useSubInquiryTextAsLabel:t=!1})=>{const{inquiryText:r,videos:a,audios:s,mainContentImage:o,subInquiries:i}=e,l=fo({inquiry:e}),m=(()=>r||(i&&t?i[0].subInquiryText:""))(),p=cn(s);switch(l){case qe.IMAGE:return n(Mh,{inquiryText:r,mainContentImage:o});case qe.VIDEO:return n(Uh,{inquiryText:r,videos:a});case qe.AUDIO:return n(vr,{audio:p,inquiryText:m});case qe.TEXT:return n(yr,{inquiryText:m});default:return null}},Bh=i=>{var l=i,{className:e,btnClass:t,children:r,disabled:a,fullWidth:s}=l,o=Oe(l,["className","btnClass","children","disabled","fullWidth"]);return n("div",{className:e,children:n("button",T(h({className:t,disabled:a,"aria-disabled":a},o),{children:n(tt,{children:r})}))})},Eo=_(Bh)`
- width: ${e=>e.fullWidth?"100%":"40%"};
-
- button {
- border-radius: 25px;
- width: 100%;
- height: 38px;
- background: ${g.LG_WHITE};
- color: ${g.LG_BLUE_1};
- border: 1px solid ${g.LG_BLUE_1};
- transition: 0.2s;
- outline: none;
- }
-`,Fh=({className:e,isDisabled:t,handleClick:r,fullWidth:a,children:s})=>n(Eo,{className:e,btnClass:`solve-button-${t?"gray":"blue"}`,disabled:t,onClick:r,fullWidth:a,children:s}),xo=`
- background: ${g.LG_WHITE};
- color: ${g.LG_GRAY_1};
- border: 1px solid ${g.LG_GRAY_1};
- opacity: 0.65;
-`,vo=_(Fh)`
- .solve-button-gray {
- ${xo}
- }
-
- button.solve-button-blue {
- &:hover {
- background: ${e=>e.fullWidth?g.DW_LIGHT_BLUE:g.LG_GRAY_10};
- color: ${g.LG_WHITE};
- border: 1px solid ${e=>e.fullWidth?g.DW_LIGHT_BLUE:g.LG_GRAY_1};
- }
-
- &:active,
- &:focus {
- ${xo}
- }
- }
-`,Wh=({className:e,handleClick:t,isDisabled:r,children:a})=>n(Eo,{className:e,btnClass:`check-button-${r?"gray":"blue"}`,disabled:r,onClick:t,children:a}),Vh=_(Wh)`
- .check-button-blue {
- &:hover {
- color: ${g.LG_WHITE};
- background: ${g.LG_BLUE_1};
- }
- }
-
- .check-button-gray {
- background: ${g.LG_WHITE};
- color: ${g.LG_GRAY_1};
- border-color: ${g.LG_GRAY_1};
- opacity: 0.65;
- }
-`,Hh=({className:e,isSolveButtonDisabled:t,isCheckButtonDisabled:r,handleSolveClicked:a,handleCheckClicked:s})=>d("div",{className:e,children:[n(vo,{handleClick:a,isDisabled:t,children:n(R,{translation:"exercise.resolve"})}),n(Vh,{handleClick:s,isDisabled:r,children:n(R,{translation:"exercise.check"})})]}),Gt=_(Hh)`
- /* @noflip */
- direction: ltr;
- display: flex;
- margin: auto;
- justify-content: space-between;
- padding: 20px 0;
- margin-bottom: 50px;
- width: 770px;
- > * {
- width: 376px;
- }
-
- @media (max-width: ${C.max.tablet}px) {
- width: 79.825%;
- padding: 20px 20px;
- > * {
- width: 48%;
- }
- }
-
- @media (max-width: ${C.max.mobile}px) {
- width: 97%;
- }
-`,yo=[{placeholder:"#p#",size:"medium",maxLength:15},{placeholder:"#ps#",size:"small",maxLength:7},{placeholder:"#pm#",size:"medium",maxLength:15},{placeholder:"#pl#",size:"full",maxLength:null}],Sr=(e,t)=>e.map(a=>a.subInquiryText).join(t),bt=e=>{let t=e;const r=a=>{t=t.replace(new RegExp(a.placeholder,"g"),`${a.size} `)};return yo.forEach(r),t},Z=Object.freeze({INITIAL:"INITIAL",WRONG:"WRONG",CORRECT:"CORRECT",SOLVED:"SOLVED"}),Kh=({index:e,pulldownData:t,inquiryState:r,checkEntry:a,onHandleItemSelected:s,isDisabled:o})=>{const[i,l]=c.exports.useState(!1),u=()=>{switch(r){case Z.CORRECT:case Z.WRONG:return a(t)?"correct-input":"wrong-input";case Z.SOLVED:return"solved-input";default:return""}},m=()=>{o||l(!i)};return d("div",{className:z(`btn-group answer-select-dropdown-container placeholder-cloze cloze-${t.id}`,i?"open":"",r!==Z.INITIAL?"solved-input":""),children:[d("button",{type:"button",className:z("btn btn-default dropdown-toggle",u(),o?"disabled":""),"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":i,onClick:m,children:[t.selectedValue," ",t.selectedValue==="..."?n("span",{className:"caret"}):null]}),n("ul",{className:"dropdown-menu",children:t.alternatives.map((p,f)=>n("li",{children:n("a",{className:"answer-select-dropdown",href:"#","data-answer-select":p.id,"data-exercise-answer-id":p.id,"data-index":f,onClick:v=>{s(v,e,p.alternativeText),l(!1)},children:p.alternativeText})},p.id))})]},t.id)},Yh=({selector:e,createComponent:t,scopeClassName:r,node:a})=>{tr({selector:r?`.${r} ${e||".placeholder-cloze"}`:e||".placeholder-cloze",node:a,componentFn:(s,o)=>t(o,s)})},jh=({selector:e,createComponent:t,trigger:r="staticTrigger",scopeClassName:a,node:s})=>{gt({callback:()=>{Yh({selector:e,createComponent:t,scopeClassName:a,node:s?s.current:q.window.document})},delay:10},[r])},dn=({content:e,createComponent:t,trigger:r,scopeClassName:a,className:s,isA:o="div",update:i=!1,node:l})=>(jh({createComponent:t,trigger:r,scopeClassName:a,node:l}),c.exports.createElement(tt,{isA:o,className:s,key:i?r:null,dangerouslySetInnerHTML:{__html:e}})),zh=({className:e,inquiry:t,onChange:r,inquiryState:a,isDisabled:s})=>{const{subInquiries:o,clozeLayoutType:i}=t,l=o.map(E=>T(h({},E),{selectedValue:"..."})),u=E=>E.alternatives.some(N=>E.selectedValue===N.alternativeText&&N.isCorrect),m=()=>p.filter(E=>u(E)).length,[p,f]=c.exports.useState(l),v=c.exports.useRef(null),y=(E,N,$)=>{E.preventDefault();const w=[...p];w[N].selectedValue=$,f(w),r(m())};c.exports.useEffect(()=>{a===Z.SOLVED&&f(E=>{const N=[...E];return E.forEach(($,w)=>{N[w].selectedValue=$.alternatives.find(L=>L.isCorrect).alternativeText}),N})},[a]);const b=E=>n(Kh,{index:E,pulldownData:p[E],inquiryState:a,isDisabled:s,checkEntry:u,onHandleItemSelected:y}),A=(E=!1)=>N=>n("div",{ref:v,className:z(e,"exercise-cloze-text-big",E?"dropwdowns-inline":""),children:n(dn,{content:N,createComponent:b,className:"form-group",trigger:a,isA:"div",update:!0,node:v})}),x={CONTINUOUS_TEXT:{cmp:A(!0),answerContent:()=>bt(t.text)},SINGLE_SENTENCE:{cmp:A(!1),answerContent:()=>bt(Sr(o,"
"))}}[i];return x==null?null:x.cmp(x.answerContent())},qh=_(zh)`
- &.exercise-cloze-text-big div.form-group p {
- display: block;
- }
-
- /* @noflip */
- text-align: left;
- /* @noflip */
- direction: ltr;
-`;function Ar(){return Ar=Object.assign||function(e){for(var t=1;t=0)&&(!Object.prototype.propertyIsEnumerable.call(e,a)||(r[a]=e[a]))}return r}function Zh(e,t){if(e==null)return{};var r={},a=Object.keys(e),s,o;for(o=0;o=0)&&(r[s]=e[s]);return r}function Qh(e,t){var r=e.title,a=e.titleId,s=Xh(e,["title","titleId"]);return c.exports.createElement("svg",Ar({width:"10px",height:"18px",viewBox:"0 0 10 18",xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",style:{fillRule:"evenodd"},ref:t,"aria-labelledby":a},s),r?c.exports.createElement("title",{id:a},r):null,c.exports.createElement("path",{d:"M369.101562,1457.80899 L369.101562,1456.85041 C369.918135,1456.42437 370.841202,1456.08709 371.870793,1455.83857 L371.870793,1448.22319 C371.302743,1447.97467 370.432929,1447.76165 369.261326,1447.58413 L369.261326,1446.67881 C370.965476,1446.39478 372.953622,1446.25277 375.225823,1446.25277 L375.225823,1455.83857 L378.101562,1456.85041 L378.101562,1457.80899 L369.101562,1457.80899 Z M373.308663,1444.17585 C372.740613,1444.17585 372.261328,1443.98059 371.870793,1443.59005 C371.480259,1443.19952 371.284994,1442.72023 371.284994,1442.15218 C371.284994,1441.58413 371.480259,1441.10485 371.870793,1440.71431 C372.261328,1440.32378 372.740613,1440.12851 373.308663,1440.12851 C373.876713,1440.12851 374.355998,1440.32378 374.746533,1440.71431 C375.137067,1441.10485 375.332332,1441.58413 375.332332,1442.15218 C375.332332,1442.72023 375.137067,1443.19952 374.746533,1443.59005 C374.355998,1443.98059 373.876713,1444.17585 373.308663,1444.17585 L373.308663,1444.17585 Z",style:{fill:"#f08c00"},transform:"translate(-369.000000, -1440.000000)"}))}var Jh=c.exports.forwardRef(Qh);const ef=me`
- /* @noflip */
- .exercise-container .exercise-hint span.hint {
- right: 0
- }
-
- @media (min-width: 768px) {
- .exercise-container .exercise-hint p {
- text-align: left;
- }
- }
-`,Qe=({description:e,isSimpleIconHint:t=!1,isA:r="div"})=>e&&d("div",{className:"exercise-hint",children:[n(ef,{}),n("span",{className:"hint",children:t?n(Jh,{}):n(gr,{})}),n(r,{dir:"auto",dangerouslySetInnerHTML:{__html:e}})]}),So=_("div")`
- display: grid;
-
- br {
- content: '';
- display: block;
- height: 10px;
- }
-`,tf=/\s\s+/g,nf=/[\u002D\u2010\u2027\u2011\u2013\u2014\u2212]/g,Ao=",\\.!\\?:;\\-",rf=new RegExp(` ([${Ao}])`,"g"),af=new RegExp(`([${Ao}]) `,"g"),Lo=e=>e&&e.trim().replace(tf," ").replace(nf,"-").replace(rf,"$1").replace(af,"$1"),Rt=(e,t)=>Lo(e)===Lo(t),sf=me`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-`,of=({inquiry:e,onChange:t,inquiryState:r,isDisabled:a})=>{const{subInquiries:s,clozeLayoutType:o,id:i}=e,l=`inquiry_${i}`,u=s.map(P=>T(h({},P),{selectedAnswer:void 0})),m=s.map(P=>({text:P.alternatives[0].alternativeText,id:P.alternatives[0].id})),[p,f]=c.exports.useState(u),[v,y]=c.exports.useState(m),b=P=>{let G=!1;const M=p.map(oe=>!oe.selectedAnswer&&!G?(G=!0,T(h({},oe),{selectedAnswer:P})):h({},oe));f(M)},A=P=>{const G=p.map(M=>M.selectedAnswer&&M.selectedAnswer.id===P.id?T(h({},M),{selectedAnswer:void 0}):h({},M));f(G)},S=P=>{const G=v.filter(M=>M.id!==P.id);y(G)},x=P=>{const G=[P,...v];y(G)},E=(P,G,M,oe)=>{const ve={text:G,id:+M};P.preventDefault(),a||(oe?(A(ve),x(ve)):(b(ve),S(ve)))},N=(P,G)=>p[G].alternatives.some(M=>Rt(P,M.alternativeText)&&M.isCorrect);c.exports.useEffect(()=>{r===Z.SOLVED&&(f(s.map(P=>T(h({},P),{selectedAnswer:{text:P.alternatives[0].alternativeText,id:P.alternatives[0].id}}))),y([]))},[r,s]),c.exports.useEffect(()=>{r!==Z.SOLVED&&t(p.filter((P,G)=>p[G].alternatives.some(M=>P.selectedAnswer&&Rt(P.selectedAnswer.text,M.alternativeText)&&M.isCorrect)).length)},[r,t,p]),c.exports.useEffect(()=>{y(P=>wn(P.slice(0)).map(G=>h({},G)))},[]);const $=()=>n("div",{className:"cloze-sorting-target"}),w=({selectedAnswer:P,index:G})=>n("div",{className:"cloze-sorting-target filled",children:re(P,G,!0)}),L=({clozeData:P,index:G})=>{const{selectedAnswer:M}=P;return n(k,{children:M?n(w,{selectedAnswer:M,index:G}):n($,{})})},O=P=>{const G=p[P];return n(L,{clozeData:G,index:P})},H=P=>n("div",{className:"answer cloze-text answer-sorting-target dropwdowns-inline alwaysLtr",children:d(So,{children:[n("p",{}),n(dn,{content:P,createComponent:O,trigger:[p,r],scopeClassName:l})]})}),U=P=>n("div",{className:"answer cloze-text answer-sorting-target alwaysLtr",children:n(So,{children:n(dn,{content:P,createComponent:O,trigger:[p,r],scopeClassName:l})})}),V=(P,G,M)=>{const oe="btn answer-sorting-btn alwaysLtr";return M?z(oe,(r===Z.CORRECT||r===Z.WRONG)&&N(P,G)?"correct-input":"",r===Z.WRONG&&!N(P,G)?"wrong-input":"",r===Z.SOLVED?"solved-input":""):oe},re=(P,G,M)=>n("a",{role:"",href:"#!",className:V(P.text,G,M),"aria-selected":M,id:P.id,onClick:oe=>E(oe,P.text,P.id,M),children:P.text},P.id),ae={CONTINUOUS_TEXT:{cmp:H,answerContent:()=>bt(e.text)},SINGLE_SENTENCE:{cmp:U,answerContent:()=>bt(Sr(s," "))}}[o];return ae==null?null:d(k,{children:[n(sf,{}),n("div",{className:l,children:ae.cmp(ae.answerContent())}),n("div",{className:`${l} answer-sorting-collection`,"aria-multiselectable":"true",children:v.map((P,G)=>re(P,G,!1))})]})};function Lr(){return Lr=Object.assign||function(e){for(var t=1;t=0)&&(!Object.prototype.propertyIsEnumerable.call(e,a)||(r[a]=e[a]))}return r}function cf(e,t){if(e==null)return{};var r={},a=Object.keys(e),s,o;for(o=0;o=0)&&(r[s]=e[s]);return r}var df=c.exports.createElement("rect",{width:2,height:2,x:2,y:6}),uf=c.exports.createElement("rect",{width:2,height:2,x:5,y:6}),mf=c.exports.createElement("rect",{width:2,height:2,x:8,y:6}),pf=c.exports.createElement("path",{d:"m 11,6 3,0 0,5 -2,0 0,-3 -1,0 z"}),gf=c.exports.createElement("rect",{width:2,height:2,x:12,y:12}),hf=c.exports.createElement("rect",{width:6,height:2,x:5,y:12}),ff=c.exports.createElement("rect",{width:2,height:2,x:9,y:9}),Ef=c.exports.createElement("rect",{width:2,height:2,x:6,y:9}),xf=c.exports.createElement("rect",{width:2,height:2,x:2,y:12}),vf=c.exports.createElement("rect",{width:3,height:2,x:2,y:9});function yf(e,t){var r=e.title,a=e.titleId,s=lf(e,["title","titleId"]);return c.exports.createElement("svg",Lr({xmlns:"http://www.w3.org/2000/svg",width:16,height:16,style:{fill:"#888"},ref:t,"aria-labelledby":a},s),r?c.exports.createElement("title",{id:a},r):null,c.exports.createElement("g",null,c.exports.createElement("path",{style:{fill:"none",stroke:"#888"},d:"M 0.5,4.5 15.5,4.5 15.5,15.5 0.5,15.5 Z"}),df,uf,mf,pf,gf,hf,ff,Ef,xf,vf))}var Sf=c.exports.forwardRef(yf);const Af=_(Sf)`
- display: none;
-
- @media (min-width: ${C.max.tabletLandscape}px) {
- display: block;
- .placeholder-cloze > & {
- display: inline-block;
- }
- }
-`,bo=c.exports.forwardRef(({inquiryState:e,input:t,isDisabled:r,onChange:a,onKeyPress:s,isPlaceholderDisabled:o=!1},i)=>{const l=te("exercise.typeHere"),u=()=>{switch(e){case Z.WRONG:return"#be232d";case Z.CORRECT:return"#82b905";case Z.SOLVED:case Z.INITIAL:default:return"#d1c9c2"}},m=p=>{s&&s(p)};return n(Lf,{"aria-autocomplete":"none",rows:8,placeholder:o?"":l,value:t,"aria-haspopup":"true",role:"textbox",borderColor:u(),isDisabled:r(),onChange:a,onKeyPress:m,ref:i})}),Lf=_.textarea`
- padding: 5px 10px;
- border: 2px solid ${({borderColor:e})=>e};
- resize: vertical;
- height: 8em;
- overflow: auto;
- /* @noflip */
- text-align: left;
- width: 95%;
-
- ${({isDisabled:e})=>e&&Tt`
- cursor: not-allowed;
- opacity: 1;
- background-color: #eee;
- `}
-
- &:empty:not(:focus):before {
- content: attr(placeholder);
- color: grey;
- }
-
- &:focus {
- border-color: #66afe9;
- outline: 0;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
- }
-`,bf={layout:{default:["^ 1 2 3 4 5 6 7 8 9 0 \xDF \xB4 {bksp}","{tab} q w e r t z u i o p \xFC +","{lock} a s d f g h j k l \xF6 \xE4 # {enter}","{shift} < y x c v b n m , . - {shift}",".com @ {space}"],shift:['\xB0 ! " \xA7 $ % & / ( ) = ? ` {bksp}',"{tab} Q W E R T Z U I O P \xDC *","{lock} A S D F G H J K L \xD6 \xC4 ' {enter}","{shift} > Y X C V B N M ; : _ {shift}",".com @ {space}"]}},Ro=({inputMaxLength:e,onChange:t,inputValue:r,inputClassName:a="",isTextArea:s=!1})=>{const[o,i]=c.exports.useState(!1),[l,u]=c.exports.useState("default"),m=c.exports.useRef(),p=c.exports.useRef(),f=c.exports.useRef();c.exports.useEffect(()=>{o&&m.current.setInput(r),p.current&&p.current.focus(),f.current&&f.current.focus()},[o]);const v=()=>{i(!o)},y=E=>{E==="{enter}"&&v(),(E==="{shift}"||E==="{lock}")&&A()},b=E=>{E.charCode===13&&v()},A=()=>{u(l==="default"?"shift":"default")},S=E=>{m.current.setInput(E),t(E)},x=E=>{S(E.target.value)};return d(k,{children:[n(Af,{onClick:v}),o&&d(k,{children:[d("div",{className:"ui-keyboard center-block dropdown-menu ui-keyboard-has-focus",style:{width:"540px",direction:"ltr"},children:[d("div",{className:"ui-keyboard-preview-wrapper",children:[n("button",{onClick:v,className:"close","aria-label":"Close",children:n("span",{"aria-hidden":"true",children:"\xD7"})}),!s&&n("input",{className:z(a,"ui-keyboard-preview"),value:r,onChange:x,onKeyPress:b,maxLength:e,ref:p}),s&&n(bo,{input:r,onChange:x,isDisabled:()=>!1,onKeyPress:b,isPlaceholderDisabled:!0,ref:f})]}),n(ki,h({keyboardRef:E=>m.current=E,className:"keyboard",onChange:S,onKeyPress:y,layoutName:l},bf))]}),n(Rf,{onClick:v})]})]})},Rf=_.div`
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 990;
-`,Cf=({inquiryState:e,index:t,clozeData:r,config:a,handleOnInputChange:s,isDisabled:o})=>{const i=r.id,[l,u]=c.exports.useState(e===Z.SOLVED?r.alternatives[0].alternativeText:r.userAnswer),[m,p]=c.exports.useState(Rt(r.alternatives[0].alternativeText,r.userAnswer)),f=S=>{y(S.target.value)},v=S=>{y(S)},y=S=>{o||(u(S),p(s(t,S)))},b=()=>{switch(e){case Z.CORRECT:case Z.WRONG:return m?"correct-input":"wrong-input";case Z.SOLVED:return"solved-input";default:return""}},A=`answer-input-cloze-${a.size} cloze-${r.id} answer-input-cloze-element form-control onscreen-kb input-sm`;return d(k,{children:[n("input",{type:"text","aria-required":"true",id:i,disabled:o,maxLength:a.maxLength,className:z(A,"ui-keyboard-input",b()),"aria-label":"exercise-input","data-exercise-answer-id":r.alternatives[0].id,"aria-haspopup":"true",onChange:f,value:l,autoComplete:"off"}),!o&&n(Ro,{onChange:v,inputValue:l,inputClassName:A})]})},If=me`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-`,wf=({inquiry:e,onChange:t,inquiryState:r,isDisabled:a})=>{const{subInquiries:s,clozeLayoutType:o,id:i}=e,l=`inquiry_${i}`,u=s.map(x=>T(h({},x),{userAnswer:""})),[m,p]=c.exports.useState(u);c.exports.useEffect(()=>{r===Z.SOLVED&&p(s.map(x=>T(h({},x),{userAnswer:x.alternatives[0].alternativeText})))},[r,s]);const f=(x,E)=>{const N=[...m];return N[x].userAnswer=E,p(N),t(N.filter($=>Rt($.userAnswer,$.alternatives[0].alternativeText)).length),v(x,E)},v=(x,E)=>Rt(E,m[x].alternatives[0].alternativeText),y=(x,E)=>{const N=m[x],$=yo.find(w=>w.size===E.innerText);return n(Cf,{inquiryState:r,index:x,clozeData:N,config:$,handleOnInputChange:f,isDisabled:a})},A={CONTINUOUS_TEXT:{answerContent:()=>bt(e.text)},SINGLE_SENTENCE:{answerContent:()=>bt(Sr(s,"
"))}}[o];if(A==null)return null;const S=A.answerContent();return d("div",{className:l,children:[n(If,{}),n("div",{className:"exercise-cloze-text-big alwaysLtr",children:n("div",{className:"form-group",children:n(dn,{content:S,createComponent:y,trigger:r,update:!0,scopeClassName:l,isA:"div"})})})]})},ct=({inquiryId:e,achievableScore:t,subInquiries:r=1})=>{const[a,s]=c.exports.useState(!0),[o,i]=c.exports.useState(!1),[l,u]=c.exports.useState(!1),[m,p]=c.exports.useState(0),[f,v]=c.exports.useState(Z.INITIAL),{addDoneInquiry:y,exerciseProgress:b}=xr(),{isFromPlacementCourse:A}=b,S=()=>f===Z.CORRECT||f===Z.SOLVED||f===Z.WRONG&&A,x=()=>{i(!0),s(!0)},E=({score:L=0})=>{l||(y({inquiryId:e,achievableScore:t,score:L}),u(!0))};return{isSolveButtonDisabled:a,isCheckButtonDisabled:o,inquiryState:f,isDisabled:S,isFromPlacementCourse:A,handleCorrectAnswer:()=>{v(Z.CORRECT),E({score:t}),x()},handleWrongAnswer:(L=0)=>{v(Z.WRONG),E({score:t*L/r}),p(m+1),A&&i(!0),s(!1)},handleSolved:()=>{v(Z.SOLVED),E({}),x()}}},Tf=({inquiry:e,initiallyCorrectInquiries:t=0})=>{const{exerciseId:r}=W(),{audios:a,inquiryDescription:s,id:o,learningMetaInfo:{achievableScore:i},mainContentImage:l}=e,{clozeType:u}=e.subInquiries[0],[m,p]=c.exports.useState(t),{playWrongDefaultAudioFeedBack:f,playCorrectDefaultAudioFeedBack:v}=lt(),y=Boolean(l),b=kt(y,a),{target:A}=b||{},{mp3Src:S}=A||{},x=c.exports.useRef(),{isSolveButtonDisabled:E,isCheckButtonDisabled:N,handleCorrectAnswer:$,handleWrongAnswer:w,handleSolved:L,inquiryState:O,isDisabled:H}=ct({inquiryId:o,achievableScore:i,subInquiries:e.subInquiries.length}),U=oe=>{p(oe)},V=()=>{L(),ce()},re=()=>{m===e.subInquiries.length?($(),ce()):(w(m),f())},ce=()=>{S?x.current.play():v()},ae=()=>{switch(u){case"PULLDOWN":return n(qh,{inquiry:e,onChange:U,inquiryState:O,isDisabled:H()});case"CHOOSE":return n(of,{inquiry:e,onChange:U,inquiryState:O,isDisabled:H()});case"WRITING":return n(wf,{inquiry:e,onChange:U,inquiryState:O,isDisabled:H()});default:return null}},P=fo({inquiry:e}),G=ae(),M=n("div",{className:"row",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n(Qe,{description:s})})});return d("div",{className:"exercise-questions","data-type":"cloze","data-exercise-id":r,children:[n("div",{className:"question-row row",children:P===qe.TEXT&&u!=="CHOOSE"?d(k,{children:[d("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:[n(ot,{ref:x,src:S}),n(Lt,{inquiry:e}),G]}),M]}):d(k,{children:[d("div",{className:"col-sm-offset-1 col-sm-5 col-lg-offset-2 col-lg-4",children:[n(ot,{ref:x,src:S}),n(Lt,{inquiry:e})]}),n("div",{className:"col-sm-5 col-lg-4 answer-dictation-target",children:G}),M]})}),n("div",{className:"row form-group inline-check",children:n(Gt,{handleCheckClicked:re,handleSolveClicked:V,isCheckButtonDisabled:N,isSolveButtonDisabled:E})})]})},Co={name:"clozeExercise",fragment(){return B`fragment ${this.name} on Inquiry {
- text
- clozeLayoutType
- subInquiries {
- clozeType
- }
- }
- `}},Nf=({data:e})=>{const{inputText:t,inquiries:r}=e.content;return d(it,{children:[n(At,{inputText:t}),r.map(a=>n(Tf,{inquiry:a},a.id))]})},_f=({inquiry:e})=>{const[t,r]=c.exports.useState(""),{inquiryDescription:a,audios:s,text:o,learningMetaInfo:{achievableScore:i},id:l}=e,u=cn(s),{isSolveButtonDisabled:m,isCheckButtonDisabled:p,inquiryState:f,handleCorrectAnswer:v,handleWrongAnswer:y,handleSolved:b,isDisabled:A}=ct({inquiryId:l,achievableScore:i}),{playWrongDefaultAudioFeedBack:S,playCorrectDefaultAudioFeedBack:x}=lt(),E=()=>{r(o),b()},N=()=>{Rt(o,t)?(v(),x()):(y(),S())};return d("div",{className:"exercise-questions","aria-atomic":"true",children:[d("div",{className:"question-row row",children:[n("div",{className:"col-sm-offset-1 col-sm-5 col-lg-offset-2 col-lg-4",children:n(vr,{audio:u})}),d("div",{className:"col-sm-5 col-lg-4 answer-dictation-target",children:[n(bo,{isDisabled:A,inquiryState:f,input:t,onChange:w=>{const L=w.target.value;r(L)}}),!A()&&n(Ro,{onChange:r,inputValue:t,isTextArea:!0})]}),n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n(Qe,{description:a})})]}),n(Gt,{handleCheckClicked:()=>N(),handleSolveClicked:()=>E(),isSolveButtonDisabled:m,isCheckButtonDisabled:p})]})},Of=({data:e})=>{const{inquiries:t}=e.content;return n(it,{children:t.map(r=>n(_f,{inquiry:r},r.id))})},br=Object.freeze({TEXT:"TEXT",IMAGE:"IMAGE",AUDIO:"AUDIO",VIDEO:"VIDEO"}),Pf=me`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-
- .pair-select-container .pairsToUse .left .btn {
- /* @noflip */
- float: left;
- /* @noflip */
- clear: left;
- }
-`,un=({answer:e,answersBlocked:t,mediaType:r,isLeftAnswer:a=!1,isMatched:s=!1,onAnswerClicked:o})=>{const i=a?e.subInquiryText:e.alternatives[0].alternativeText,l=r===br.IMAGE,m=`btn ${l?a?"image-pair-left ":"image-pair-right ":""}removeHover`,{imageBasePath:p}=$e();return d("a",{href:"/#",className:z(s?((y,b)=>b?`${m} solved`:y===null?m:`${m} ${y?"correct solved":"wrong"}`)(e.isCorrectlyMatched,e.isSolved):((y,b)=>`${m} ${y?"tapped":b?"waiting inactive":""}`)(e.isSelected,t),"alwaysLtr"),"data-exercise-answer-id":a?e.id:e.alternatives[0].id,onClick:o,children:[n(Pf,{}),!a&&l?n("img",{className:"img-responsive",src:`${p}/${e.alternatives[0].images[0].id}_501.jpg`,alt:i}):i]})},Io="SHUFFLE_RIGHT_ANSWERS",wo="MATCH_ANSWERS_PAIR",To="BLOCK_ANSWERS",No="RESET_MATCHED_ANSWERS_PAIR",_o="CHECK_ANSWERS",Oo="SOLVE_ANSWERS",$f=(e,t)=>{const{selectedId:r,isLeft:a,selectedIndex:s,subInquiries:o,initialLeftAnswers:i}=t.payload||{};switch(t.type){case Io:{const l=[...e.rightAnswers].sort(()=>.25-Math.random());return T(h({},e),{rightAnswers:l})}case wo:{const l=e.leftAnswers.find(m=>a?m.id===r:m.isSelected),u=e.rightAnswers.find(m=>a?m.isSelected:m.alternatives[0].id===r);return T(h({},e),{leftMatchedAnswers:[...e.leftMatchedAnswers,T(h({},l),{isSelected:!1})],rightMatchedAnswers:[...e.rightMatchedAnswers,T(h({},u),{isSelected:!1})],leftAnswers:e.leftAnswers.filter(m=>m!==l),rightAnswers:e.rightAnswers.filter(m=>m!==u),isLeftAnswerBlocked:!1,isRightAnswerBlocked:!1})}case To:{const u=(a?e.leftAnswers:e.rightAnswers).map(m=>{const p=a?m.id===r:m.alternatives[0].id===r;return T(h({},m),{isSelected:p&&!m.isSelected})});return T(h({},e),{leftAnswers:a?u:e.leftAnswers,rightAnswers:a?e.rightAnswers:u,isLeftAnswerBlocked:a?u.some(m=>m.isSelected):e.isLeftAnswerBlocked,isRightAnswerBlocked:a?e.isRightAnswerBlocked:u.some(m=>m.isSelected)})}case No:{const l=e.leftMatchedAnswers[s],u=e.rightMatchedAnswers[s];return T(h({},e),{leftMatchedAnswers:e.leftMatchedAnswers.filter(m=>m!==l),rightMatchedAnswers:e.rightMatchedAnswers.filter(m=>m!==u),leftAnswers:[...e.leftAnswers,T(h({},l),{isCorrectlyMatched:null})],rightAnswers:[...e.rightAnswers,T(h({},u),{isCorrectlyMatched:null})]})}case _o:{const l=e.leftMatchedAnswers.map((p,f)=>T(h({},p),{isCorrectlyMatched:p.id===e.rightMatchedAnswers[f].id})),u=e.rightMatchedAnswers.map((p,f)=>T(h({},p),{isCorrectlyMatched:p.id===e.leftMatchedAnswers[f].id})),m=l.length===o.length&&l.every(p=>p.isCorrectlyMatched);return T(h({},e),{leftMatchedAnswers:l,rightMatchedAnswers:u,solvedWrongCounter:m?0:e.solvedWrongCounter+1,isAllMatchedCorrectly:m})}case Oo:{const l=i.map(u=>T(h({},u),{isSolved:!0}));return T(h({},e),{leftAnswers:[],rightAnswers:[],leftMatchedAnswers:l,rightMatchedAnswers:l,isSolvedCorrect:!0})}default:return e}},kf=me`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-
- /* @noflip */
- .pair-select-container .pairsToUse.used .right .btn {
- float: left;
- clear: left;
- }
-`,Gf=({inquiry:e})=>{const{id:t,inquiryText:r,inquiryDescription:a,subInquiries:s,mediaType:o,learningMetaInfo:{achievableScore:i}}=e,l=s.map(L=>T(h({},L),{isSelected:!1,isCorrectlyMatched:null,isSolved:!1})),[u,m]=c.exports.useReducer($f,{isLeftAnswerBlocked:!1,isRightAnswerBlocked:!1,leftAnswers:l,rightAnswers:l,leftMatchedAnswers:[],rightMatchedAnswers:[],isAllMatchedCorrectly:!1,solvedWrongCounter:0,isSolvedCorrect:!1}),{isSolveButtonDisabled:p,isCheckButtonDisabled:f,handleCorrectAnswer:v,handleWrongAnswer:y,handleSolved:b,isFromPlacementCourse:A}=ct({inquiryId:t,achievableScore:i}),{playWrongDefaultAudioFeedBack:S,playCorrectDefaultAudioFeedBack:x}=lt();c.exports.useEffect(()=>{u.isAllMatchedCorrectly&&(v(),x()),u.isSolvedCorrect&&b()},[u.isAllMatchedCorrectly,u.isSolvedCorrect]),c.exports.useEffect(()=>{u.solvedWrongCounter>0&&(y(),S())},[u.solvedWrongCounter]),c.exports.useEffect(()=>{m({type:Io})},[]);const E=(L,O,H)=>{L.preventDefault(),(H?u.isRightAnswerBlocked:u.isLeftAnswerBlocked)||u.solvedWrongCounter>0&&A?m({type:wo,payload:{selectedId:O,isLeft:H}}):m({type:To,payload:{selectedId:O,isLeft:H}})},N=(L,O)=>{L.preventDefault(),!(u.leftMatchedAnswers[O].isCorrectlyMatched||u.leftMatchedAnswers[O].isSolved||u.solvedWrongCounter>0&&A)&&m({type:No,payload:{selectedIndex:O}})},$=L=>{L.preventDefault(),m({type:_o,payload:{subInquiries:s}})},w=L=>{L.preventDefault(),m({type:Oo,payload:{initialLeftAnswers:l}})};return d("div",{className:"question-row row",children:[d("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:[n(kf,{}),n("div",{className:"bubble text alwaysLtr",children:r}),d("div",{className:"pair-select-container ",children:[d("div",{className:"row pairsToUse answer-pairs-container",children:[n("div",{className:"col-xs-6 left",children:u.leftAnswers.map(L=>n(un,{answer:L,mediaType:o,isLeftAnswer:!0,answersBlocked:u.isLeftAnswerBlocked,onAnswerClicked:O=>E(O,L.id,!0)},L.id))}),n("div",{className:"col-xs-6 right",children:u.rightAnswers.map(L=>n(un,{answer:L,mediaType:o,answersBlocked:u.isRightAnswerBlocked,onAnswerClicked:O=>E(O,L.alternatives[0].id,!1)},L.alternatives[0].id))})]}),n(R,{isA:"p",translation:"exercise.matchedPairs"}),d("div",{className:"row pairsToUse used answer-pairs-target",children:[n("div",{className:"col-xs-6 left",children:u.leftMatchedAnswers.map((L,O)=>n(un,{answer:L,mediaType:o,isLeftAnswer:!0,isMatched:!0,onAnswerClicked:H=>N(H,O)},L.id))}),n("div",{className:"col-xs-6 right",children:u.rightMatchedAnswers.map((L,O)=>n(un,{answer:L,mediaType:o,isMatched:!0,onAnswerClicked:H=>N(H,O)},L.alternatives[0].id))})]})]})]}),a&&n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n(Qe,{description:a})}),n(Gt,{isSolveButtonDisabled:p,isCheckButtonDisabled:f,handleSolveClicked:L=>w(L),handleCheckClicked:L=>$(L)})]})},Df=({data:e})=>{const{exerciseId:t}=W(),{inputText:r,inquiries:a}=e.content;return d(it,{children:[n(At,{inputText:r}),n("div",{className:"exercise-questions","data-type":"allocationpairs","data-exercise-id":t,children:a.map(s=>n(Gf,{inquiry:s},s.id))})]})},Y=Object.freeze({INITIAL:"initial",SELECTED:"selected",WRONG:"wrong",CORRECT:"correct",SOLVED:"solved"}),Mf=me`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-`,Uf=c.exports.forwardRef(({answer:e,handleAnswerClicked:t},r)=>{const a=({answerState:o})=>{switch(o){case Y.INITIAL:return"Not selected";case Y.SOLVED:case Y.SELECTED:return"Selected";case Y.CORRECT:return"Correct";case Y.WRONG:return"Wrong";default:throw new Error("invalid answerState")}},s=({answerState:o})=>{switch(o){case Y.INITIAL:return"";case Y.SELECTED:return"selected";case Y.CORRECT:return"correct";case Y.WRONG:return"wrong";case Y.SOLVED:return"solved";default:throw new Error("invalid answerState")}};return d("a",{className:"answer-link-container",role:"button",href:"/#","aria-label":`${e.alternativeText} - ${a(e)}`,"aria-selected":e.answerState!==Y.INITIAL,"data-exercise-answer-id":e.id,onClick:t,ref:r,children:[n(Mf,{}),n("div",{className:`answer text-choice removeHover ${s(e)} alwaysLtr`,children:e.alternativeText})]})}),Bf=c.exports.forwardRef(({answer:e,handleAnswerClicked:t},r)=>{const{imageBasePath:a}=$e();return n("a",{className:`image-choice removeHover ${(({answerState:o})=>{switch(o){case Y.INITIAL:return"";case Y.SELECTED:return"selected-image";case Y.CORRECT:return"correct-image";case Y.WRONG:return"wrong-image";case Y.SOLVED:return"solved-image";default:throw new Error("invalid answerState")}})(e)}`,role:"button",href:"/#","aria-selected":e.answerState===Y.SELECTED,"data-exercise-answer-id":e.id,onClick:t,ref:r,children:n("img",{className:"img-responsive",src:`${a}/${e.images[0].id}_501.jpg`,alt:e.alternativeText})})}),Po={name:"LessonExerciseAnswer",fragment(){return B`fragment ${this.name} on Inquiry {
- subInquiries {
- id
- subInquiryText: inquiryText
- subInquiryDescription: inquiryDescription
- images {
- id
- }
- alternatives {
- id
- alternativeText
- isCorrect
- images {
- id
- }
- }
- }
- }
- `}},$o=({answerMediaType:e,answer:t,index:r,onAnswerClicked:a,addRef:s})=>{const o=e===br.TEXT.toLowerCase()?Uf:Bf;return n(o,{answer:t,handleAnswerClicked:i=>a(i,r),ref:i=>{s(r,i)}},t.id)},ko=()=>{const e=c.exports.useRef(!1),t=r=>{e.current=r};return c.exports.useEffect(()=>(t(!0),()=>t(!1))),e},Ff=({inquiry:e,exerciseId:t})=>{const{id:r,inquiryDescription:a,audios:s,subInquiries:o,mediaType:i,mainContentImage:l,learningMetaInfo:{achievableScore:u}}=e,m=Boolean(l),p=kt(m,s),{target:f}=p||{},{mp3Src:v}=f||{},{alternatives:y}=o[0],b=[],A=i.toLowerCase(),[S,x]=c.exports.useState(!1),[E,N]=c.exports.useState(y.map(Q=>T(h({},Q),{answerState:Y.INITIAL}))),{isSolveButtonDisabled:$,isCheckButtonDisabled:w,handleCorrectAnswer:L,handleWrongAnswer:O,handleSolved:H,isFromPlacementCourse:U}=ct({inquiryId:r,achievableScore:u}),{playWrongDefaultAudioFeedBack:V,playCorrectDefaultAudioFeedBack:re}=lt(),ce=c.exports.useRef(),ae=c.exports.useRef(E),P=ko();c.exports.useEffect(()=>{ae.current=E});const G=Q=>{const de=E.map((ke,Ke)=>{if(Ke!==Q)return ke;const We=ke.answerState===Y.SELECTED?Y.INITIAL:Y.SELECTED;return T(h({},ke),{answerState:We})});N(de)},M=Q=>Q.filter(ke=>{const{answerState:Ke,isCorrect:We}=ke;return Ke===Y.WRONG||Ke===Y.INITIAL&&We}).length===0,oe=(Q,de,ke)=>{const Ke=Q.map(We=>ke&&ke(We)===!0?We:T(h({},We),{answerState:de(We)}));return N(Ke),Ke},ve=()=>{v?ce.current.play():re()},Fe=(Q,de)=>{b[Q]=de},ie=(Q,de)=>{Q.preventDefault(),!S&&(b[de].blur(),G(de))},j=()=>{H(),ve(),oe(E,Q=>Q.isCorrect?Y.SOLVED:Y.INITIAL),x(!0)},we=()=>{const Q=oe(E,de=>de.isCorrect?Y.CORRECT:Y.WRONG,de=>de.answerState!==Y.SELECTED);M(Q)?(L(),ve(),x(!0)):(O(),U&&x(!0),V(),setTimeout(()=>{P.current&&oe(ae.current,de=>de.answerState===Y.WRONG&&!U?Y.INITIAL:de.answerState)},3e3))};return d("div",{className:`exercise-questions ${S?"finished":""}`,"data-type":`allocation${A}`,"data-exercise-id":t,"aria-atomic":"true",children:[d("div",{className:"question-row row",children:[n("div",{className:"col-sm-offset-1 col-sm-5 col-lg-offset-2 col-lg-4",children:n(Lt,{inquiry:e})}),n("div",{className:"col-sm-5 col-lg-4",children:n("div",{className:`answer-multiple-${A}`,"aria-multiselectable":"true",children:E.map((Q,de)=>n($o,{answerMediaType:A,answer:Q,index:de,onAnswerClicked:ie,addRef:Fe},Q.id))})})]}),n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n(Qe,{description:a})}),n(Gt,{isSolveButtonDisabled:$,isCheckButtonDisabled:w,handleCheckClicked:we,handleSolveClicked:j}),v&&n(ot,{ref:ce,src:v})]})},Wf=({data:e})=>{const{id:t,inputText:r,inquiries:a}=e.content;return d(it,{children:[n(At,{inputText:r}),a.map(s=>n(Ff,{exerciseId:t,inquiry:s},s.id))]})},Vf=({answer:e,handleAnswerClicked:t})=>{const{index:r,isSelected:a,label:s}=e,o=te(s);return n(k,{children:n("a",{role:"","aria-selected":a,"aria-label":`${o}${a?" - Correct":""}`,href:"/#",className:"answer-link-container","data-exercise-answer-id":r,onClick:t,children:n("div",{className:`answer text-choice ${a?"correct":""}`,children:o})})})},Hf=({audios:e,mainContentImage:t})=>{const{isRtl:r}=De(),a=te("exercise.howWasItWithOnlyFeedbackAudio"),s=te("exercise.howWasIt"),o=Boolean(t),i=kt(o,e),l=i?i.target.mp3Src:null;return n("div",{className:"col-sm-offset-1 col-sm-5 col-lg-offset-2 col-lg-4",children:l?(()=>{const p=l.includes("Loesungsaudio.mp3")&&e.length===1?a:s;return n(vr,{audio:i,inquiryText:p})})():n("div",{className:`bubble text${r?" override-rtl":""}`,children:n(R,{translation:"exercise.howWasIt"})})})},Kf=({inquiry:e})=>{const{audios:t,mainContentImage:r,learningMetaInfo:{achievableScore:a},id:s}=e,o=[{label:"exercise.02",index:1,isSelected:!1},{label:"exercise.01",index:0,isSelected:!1}],{handleCorrectAnswer:i,handleWrongAnswer:l}=ct({inquiryId:s,achievableScore:a}),[u,m]=c.exports.useState(!1),[p,f]=c.exports.useState(o),v=A=>{const S=p.map((x,E)=>T(h({},x),{isSelected:E===A?!0:x.isSelected}));f(S)},y=A=>{A===0?i():l()},b=(A,S)=>{A.preventDefault(),!u&&(y(S),v(S),m(!0))};return n("div",{className:`exercise-questions ${u?"finished":""}`,"data-type":"allocationaudiopronunce","data-exercise-id":e.id,children:d("div",{className:"question-row row",children:[n(Hf,{audios:t,mainContentImage:r}),n("div",{className:"col-sm-5 col-lg-4",children:n("div",{className:"answer-multiple-text","aria-multiselectable":"false",children:p.map((A,S)=>n(Vf,{answer:A,handleAnswerClicked:x=>b(x,S)},`${s}-${S}`))})})]})})},Yf=me`
- /* @noflip */
- .answer {
- direction: ltr;
- text-align: left;
- }
-`,jf=({inquiry:e})=>{const{inquiryDescription:t,subInquiries:r}=e,{subInquiryDescription:a}=r[0];return d(k,{children:[n("div",{className:"exercise-questions",children:d("div",{className:"question-row row",children:[n("div",{className:"col-sm-offset-1 col-sm-5 col-lg-offset-2 col-lg-4",children:n(Lt,{inquiry:e,useSubInquiryTextAsLabel:!0})}),d("div",{className:"col-sm-5 col-lg-4",children:[n(Yf,{}),a&&n("div",{className:"answer",children:a})]})]})}),n("div",{className:"row",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n(Qe,{description:t})})}),n(Kf,{inquiry:e})]})},zf=({data:e})=>{const{inputText:t,inquiries:r}=e.content;return d(it,{children:[n(At,{inputText:t}),r.map(a=>n(jf,{inquiry:a},a.id))]})},qf=({exerciseId:e,inquiry:t})=>{const{id:r,inquiryDescription:a,audios:s,subInquiries:o,mainContentImage:i,learningMetaInfo:{achievableScore:l}}=t,u=Boolean(i),m=kt(u,s),{target:p}=m||{},{mp3Src:f}=p||{},{alternatives:v}=o[0],y=t.mediaType.toLowerCase(),b=[],[A,S]=c.exports.useState(!1),[x,E]=c.exports.useState(v.map(G=>T(h({},G),{answerState:Y.INITIAL}))),{playWrongDefaultAudioFeedBack:N,playCorrectDefaultAudioFeedBack:$}=lt(),w=c.exports.useRef(),L=c.exports.useRef(x),{handleCorrectAnswer:O,handleWrongAnswer:H,isFromPlacementCourse:U}=ct({inquiryId:r,achievableScore:l}),V=ko();c.exports.useEffect(()=>{L.current=x});const re=({index:G,chosenAnswerIndex:M,selectCurrentAnswer:oe,answer:ve})=>{const{answerState:Fe,isCorrect:ie}=ve;return G===M?oe?ie?Y.CORRECT:Y.WRONG:Y.INITIAL:Fe},ce=(G,M)=>{const ve=(M?[...x]:[...L.current]).map((Fe,ie)=>T(h({},Fe),{answerState:re({index:ie,chosenAnswerIndex:G,selectCurrentAnswer:M,answer:Fe})}));E(ve)},ae=(G,M)=>{b[G]=M},P=(G,M)=>{G.preventDefault(),b[M].blur(),!A&&(ce(M,!0),x[M].isCorrect?(O(),S(!0),f?w.current.play():$()):(H(),U&&S(!0),N(),setTimeout(()=>{V.current&&ce(M,U)},3e3)))};return d("div",{className:"exercise-questions","data-type":`allocation${y}`,"data-exercise-id":e,"aria-atomic":"true",children:[d("div",{className:"question-row row",children:[n("div",{className:"col-sm-offset-1 col-sm-5 col-lg-offset-2 col-lg-4",children:n(Lt,{inquiry:t})}),n("div",{className:"col-sm-5 col-lg-4",children:n("div",{className:`answer-multiple-${y}`,"aria-multiselectable":"false",children:x.map((G,M)=>n($o,{answerMediaType:y,answer:G,index:M,onAnswerClicked:P,addRef:ae},G.id))})})]}),n("div",{className:"row",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n(Qe,{description:a})})}),f&&n(ot,{ref:w,src:f})]})},Xf=({data:e})=>{const{id:t,inputText:r,inquiries:a}=e.content;return d(it,{children:[n(At,{inputText:r}),a.map(s=>n(qf,{exerciseId:t,inquiry:s},s.id))]})},Go={name:"SortingExercise",fragment(){return B`fragment ${this.name} on Inquiry {
- alternatives {
- id
- order
- alternativeText
- contentLinks {
- targetId
- }
- }
- }
- `}},Zf=me`
- /* @noflip */
- .dotted-outline {
- text-align: left;
- direction: ltr;
- }
-`,Qf=({inquiry:e})=>{const{alternatives:t,audios:r,id:a,inquiryDescription:s,mainContentImage:o,learningMetaInfo:{achievableScore:i}}=e,l=e.mediaType.toLowerCase(),u=Boolean(o),m=kt(u,r),{target:p}=m||{},{mp3Src:f}=p||{},{imageBasePath:v}=$e(),y=c.exports.useRef(),{playWrongDefaultAudioFeedBack:b,playCorrectDefaultAudioFeedBack:A}=lt(),{isSolveButtonDisabled:S,isCheckButtonDisabled:x,handleCorrectAnswer:E,handleWrongAnswer:N,handleSolved:$,inquiryState:w,isDisabled:L}=ct({inquiryId:a,achievableScore:i}),[O,H]=c.exports.useState([]),[U,V]=c.exports.useState(t);c.exports.useEffect(()=>{V(ie=>wn(ie.slice(0)).map(j=>T(h({},j),{isSelected:!1})))},[]);const re=(ie,j)=>ie.order===j+1,ce=(ie,j)=>ie.alternativeText===t[j].alternativeText,ae=O.length&&O.every((ie,j)=>re(ie,j)||ce(ie,j)),P=()=>f?y.current.play():A(),G=()=>{H(oc(t,"order")),V([]),P(),$()},M=()=>{ae?(E(),P()):(N(),b())},oe=(ie,j)=>{if(ie.preventDefault(),L())return;const we=T(h({},j),{isSelected:!j.isSelected});j.isSelected?(V(Q=>[we,...Q]),H(O.filter(Q=>Q.id!==we.id))):(H(Q=>[...Q,we]),V(U.filter(Q=>Q.id!==we.id)))},ve=(ie,j)=>{const{alternativeText:we,contentLinks:Q}=j,de=j.id,ke=ie===br.TEXT.toLowerCase(),Ke=ke?"btn":"image",We=ke?we:n("img",{className:"img-responsive",src:`${v}/${Q[0].targetId}_501.jpg`,alt:we});return d("a",{role:"",onClick:Ti=>oe(Ti,j),href:"#",className:`btn answer-sorting-${Ke} alwaysLtr`,"aria-selected":j.isSelected,"data-exercise-answer-id":de,children:[n(Zf,{}),We]},de)};function Fe(){switch(w){case Z.WRONG:return"wrong-outline";case Z.CORRECT:return"correct-outline";case Z.SOLVED:case Z.INITIAL:default:return""}}return d(k,{children:[n("div",{className:"exercise-questions","data-exercise-id":a,children:d("div",{className:"question-row row",children:[d("div",{className:"col-sm-offset-1 col-sm-5 col-lg-offset-2 col-lg-4",children:[n(ot,{ref:y,src:f}),n(Lt,{inquiry:e})]}),d("div",{className:"col-sm-5 col-lg-4",children:[n("div",{className:`dotted-outline ${Fe()}`,children:n("div",{className:"col-xs-12 answer-sorting-target",children:O.map(ie=>ve(l,ie))})}),n("div",{className:"answer-sorting-collection","aria-multiselectable":"false",children:U.map(ie=>ve(l,ie))})]})]})}),n("div",{className:"row",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n(Qe,{description:s})})}),n("div",{className:"row form-group inline-check",children:n(Gt,{handleCheckClicked:M,handleSolveClicked:G,isCheckButtonDisabled:x,isSolveButtonDisabled:S})})]})},Jf=({data:e})=>{const{inputText:t,inquiries:r}=e.content;return d(it,{children:[n(At,{inputText:t}),r.map(a=>n(Qf,{inquiry:a},a.id))]})},e0=()=>{Gi(t=>{t.preventDefault()});const e=te("client.exercise.interrupt");return n(Di,{message:(t,r)=>r==="POP"?e:hd(t.pathname)?!0:e})},Do=({title:e,children:t})=>d("div",{className:"section exercise-container vocabulary copy",children:[n(ln,{title:e,top:!0}),t,n(ln,{title:e,bottom:!0})]}),Rr=()=>n("div",{className:"row vocabulary list-end",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8 vocabulary-entry"})}),t0=({title:e,children:t,className:r})=>{const a=te(e);return d("details",{className:r,children:[n("summary",{className:"row noVMargins",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n("h4",{children:a})})}),n(n0,{children:t})]})},n0=_.div`
- overflow: hidden;
- background-color: ${g.LG_WHITE};
- transition: max-height 0.7s;
- margin-bottom: 20px;
-`,r0=_(t0)`
- button {
- outline: none;
- padding: 0;
- display: flex;
- position: relative;
- cursor: pointer;
- border: none;
- background-color: ${g.LG_WHITE};
- width: 10em;
- }
- .toggleable-arrow {
- position: relative;
- top: 0.1em;
- margin-left: 0.2em;
- width: 20px;
- height: 17px;
- }
-`,Mo=B`
- fragment LessonManuscript on Lesson {
- id
- manuscript
- }
-`,a0=me`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- }
-`,Uo=({content:e,isStandalone:t=!0})=>{const{knowledges:r,manuscript:a}=e,s=t?Do:r0;return sn({knowledges:r,ignore:!t}),d(s,{title:"lesson.menu.manuscript",children:[n(a0,{}),n("div",{className:"row vocabulary",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n(je,{content:a,className:"override-ltr alwaysLtr"})})}),n(Rr,{})]})},Bo={name:"LessonExerciseItem",fragment(){return B`fragment ${this.name} on Inquiry {
- id
- inquiryDescription
- inquiryType
- selectionType
- sortingType
- mediaType
- learningMetaInfo {
- achievableScore
- }
- ...${Po.name}
- ...${ho.name}
- ...${Go.name}
- ...${Co.name}
- }
-
- ${ho.fragment()}
- ${Po.fragment()}
- ${Go.fragment()}
- ${Co.fragment()}
- `}},s0=(e,t)=>{switch(e){case"SINGLE":return n(Xf,{data:t});case"DIRECT":return n(Df,{data:t});case"MULTIPLE":return n(Wf,{data:t});default:return null}},o0=e=>{const{inquiryType:t,selectionType:r}=e.content.inquiries[0];switch(t){case"ASSOCIATION":return s0(r,e);case"DICTATION":return n(Of,{data:e});case"REPEAT":return n(zf,{data:e});case"CLOZE":return n(Nf,{data:e});case"SORTING":return n(Jf,{data:e});default:return"OTHER EXERCISE TYPE PLACEHOLDER"}},i0=e=>{const{inputType:t}=e.content;switch(t){case"NONE":return null;case"TEXT":return null;case"IMAGE":return n(ao,{data:e});case"AUDIO":return n("div",{className:"input-header-video",children:n(so,{data:e})});case"VIDEO":if(e.content.videos.length>0)return n("div",{className:"input-header-video",children:n(fr,{data:e})});default:return null}},l0=({data:e,exerciseCounter:t,manuscriptContent:r})=>{const a=o0(e),s=i0(e);return sn({knowledges:[...e.content.knowledges,...r.knowledges]}),d(k,{children:[n(e0,{}),s&&n("div",{className:"row",children:n("div",{className:"col-xs-12 lecture-exercise-nav",children:s})}),n(ln,{title:t,top:!0}),n(Ph,{data:e}),r.manuscript&&n(Uo,{content:r,isStandalone:!1}),a]})},Fo="SET_IMPROVE_MODE_FOR_LESSON",Wo="REMOVE_IMPROVE_MODE_FOR_LESSON",Cr=Object.freeze({IMPROVE:"IMPROVE"}),c0=e=>({type:Fo,payload:e}),d0=e=>({type:Wo,payload:e}),Vo=({cosLessonId:e,lessons:t})=>t.find(r=>r.cosLessonId===e),u0=({cosLessonId:e,lessons:t})=>Vo({cosLessonId:e,lessons:t})?[...t.filter(s=>s.cosLessonId!==e),{cosLessonId:e,mode:Cr.IMPROVE}]:[...t,{cosLessonId:e,mode:Cr.IMPROVE}],m0=({cosLessonId:e,lessons:t})=>Vo({cosLessonId:e,lessons:t})?[...t.filter(s=>s.cosLessonId!==e)]:[...t],p0=[],g0=(e=p0,t)=>{switch(t.type){case Fo:return u0({cosLessonId:t.payload,lessons:e});case Wo:return m0({cosLessonId:t.payload,lessons:e});default:return e}},Ho=e=>t=>t.lessonExerciseMode.some(r=>r.cosLessonId===e&&r.mode===Cr.IMPROVE),Ir=({lessonName:e,lessonExerciseOverviewItems:t,courseId:r,isFinalTest:a})=>{const{langCode:s,lessonId:o,exerciseId:i}=W(),l=J(Ot(+o)),u=J(Ho(+o)),m=J(Gm(+o,+i)),p=E=>{if(!!E)return jt(s,o,Ae(E.exerciseName),E.exerciseId)},f=E=>E.map(N=>({exerciseId:N.targetId,exerciseName:N.target.name})),v=E=>E.filter(N=>{const $=l.exerciseProgresses.find(w=>w.cosExerciseId===N.exerciseId);return $?$.maxPoints!==$.resultPoints:!0}),y=E=>{const N=f(t);if(!l||a)return jt(s,o,Ae(N[0].exerciseName),N[0].exerciseId);let $;if(u||E)$=v(N)[0];else{const L=l.exerciseProgresses.map(O=>O.cosExerciseId);$=N.find(O=>!L.includes(O.exerciseId))}if($)return jt(s,o,Ae($.exerciseName),$.exerciseId);const w=Me(o,s,Ae(e));return kn({courseId:r,isFinalTest:a,lessonPath:w})},b=()=>{const E=t.find(N=>N.targetId===+i);return t.indexOf(E)},A=()=>{const E=f(t);if(u){const $=[...E].splice(b()+1),w=v($),[L]=w;return p(L)}const N=E[b()+1];return p(N)},S=()=>l?l.maxPointsForAllExercises===l.resultPoints:!1,x=E=>{if(!u)return E;const{content:N,content:{inquiries:$=[]}}=E,w=$.filter(L=>{const O=m.find(H=>H.inquiryId===L.id);return!O||O.score!==O.maxScore});return{content:T(h({},N),{inquiries:w})}};return{firstExerciseLink:E=>y(E),nextExerciseLink:()=>A(),isFullScoreAchieved:()=>S(),currentExerciseCount:b()+1,allExerciseCount:t.length,filterExerciseDataIfInImproveMode:E=>x(E)}},h0=({handicap:e})=>B`
- query LessonExercise($exerciseId: Int!, $lessonLang: Language!) {
- content(id: $exerciseId, lang: $lessonLang) {
- ... on Exercise {
- id
- name
- inputType
- inputText
- images {
- id
- }
- inquiries {
- ...${Bo.name}
- }
- ...${po.name}
- ...ExerciseMediaInputChooser
- ...${`ExerciseScore${e||""}`}
- ...ExerciseKnowledges
- ...${he.name}
- ${fe.partial()}
- }
- }
- }
- ${po.fragment()}
- ${Bo.fragment()}
- ${Er.fragment({type:"Exercise"})}
- ${Hn.fragment({type:"Exercise",handicap:e})}
- ${St.fragment({type:"Exercise"})}
- ${he.fragment({type:"Exercise"})}
-`,f0=({lessonExerciseOverviewItems:e,lessonLang:t,lessonName:r,lessonAchievableScore:a,courseId:s,manuscriptContent:o,isFinalTest:i})=>{Oh();const l=ge(),{langCode:u,lessonId:m,exerciseId:p}=W(),{exerciseProgress:f,resetProgress:v}=xr(),{handicap:y}=J(ft)||{},b=Le(),A=+m,S=+p,x=J(Ho(A)),{nextExerciseLink:E,currentExerciseCount:N,allExerciseCount:$,filterExerciseDataIfInImproveMode:w}=Ir({lessonName:r,lessonExerciseOverviewItems:e,courseId:s,isFinalTest:i});c.exports.useEffect(()=>{const V=l.listen((re,ce)=>{ce==="POP"&&(v(),x&&l.push(kn({courseId:s,lessonName:r,lessonPath:L})))});return()=>V()},[l]),c.exports.useEffect(()=>{b(za(A))},[A]);const L=Me(m,u,Ae(r)),O={exerciseId:S,lessonLang:t},H=`${N} / ${$}`,U=({exerciseAchievableScore:V})=>{const re=Ud({langCode:u,lessonId:A,courseId:s,lessonAchievableScore:a,exerciseId:S,allExerciseCount:$,exerciseProgress:f,exerciseAchievableScore:V});b(iu(re)),v();const ce=E()||kn({courseId:s,isFinalTest:i,lessonPath:L});l.push(ce)};return n(pe,{query:h0({handicap:y}),queryVariables:O,children:V=>{const{content:re}=V,{learningMetaInfo:{achievableScore:ce}}=re,ae=w(V),P=ae.content.inquiries.length;return d(k,{children:[n(le,{pageType:I.EXERCISE,content:re,parentContentName:r,useOnlyCmsKeywords:!0}),n(Ee,{content:V.content}),d("div",{className:"section exercise-container ltr-container",children:[n(l0,{data:ae,exerciseCounter:H,manuscriptContent:o}),d("div",{className:"row",children:[n(_h,{amountOfInquiries:P}),n("div",{className:"col-xs-offset-2 col-xs-8 col-sm-offset-4 col-sm-4",children:n("div",{className:"exercise-check",children:n(xe,{id:"nextButton",className:"btn main",titleKey:"common.next",handleClick:()=>U({exerciseAchievableScore:ce})})})})]}),n(ln,{title:H,bottom:!0,style:{direction:"ltr"}})]})]})}})},E0=({data:e})=>{const{name:t,subTitle:r,audios:a,text:s}=e,o=a[0],i=o?o.mp3Src:"",l=o&&o.mainContentImageLink,u=c.exports.useRef(),m=p=>{p.preventDefault(),u.current.play()};return d("div",{className:"row vocabulary",children:[n("div",{className:"col-sm-offset-1 col-sm-3 col-lg-offset-2 col-lg-3 vocabulary-entry",children:n("div",{className:"richtext-content-container override-ltr",children:d("p",{children:[d("a",{className:"audio-wortschatz-link audio-link",href:"/#",onClick:p=>m(p),role:"button",children:[n("span",{id:"vocab-title",children:n("strong",{dir:"auto",children:t})}),n("audio",{className:"audio-modal-file initialized",tabIndex:"0",width:"100%",ref:u,children:n("source",{src:i,type:"audio/MP3"})})]}),n("br",{}),r&&n("span",{id:"vocab-subtitle",children:r})]})})}),n("div",{className:"col-sm-3 col-lg-2 vocabulary-entry",children:l&&n("div",{className:"richtext-content-container",children:n(Xe,{imageId:o.mainContentImageLink.targetId,alt:t})})}),n("div",{className:"col-sm-4 col-lg-3 vocabulary-entry",children:n("div",{className:"richtext-content-container",dangerouslySetInnerHTML:{__html:s}})})]})},x0=Mi`
- query LessonVocabulary($lessonId: Int!, $lessonLang: Language!) {
- content(id: $lessonId, lang: $lessonLang) {
- ... on Lesson {
- vocabularies {
- id
- name
- subTitle
- text
- audios {
- mp3Src
- mainContentImageLink {
- targetId
- }
- }
- }
- ...${he.name}
- ${fe.partial()}
- }
- }
- }
- ${he.fragment({type:"Lesson"})}
-`,v0=me`
- /* @noflip */
- .override-ltr {
- text-align: left;
- }
-
- @media (min-width: 768px) {
- /* @noflip */
- .col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9 {
- float:right
- }
-
- /* @noflip */
- div.row.vocabulary div.col-sm-4 p {
- margin-right: auto;
- margin-left: 20px
- }
-
- /* @noflip */
- .col-sm-offset-1 {
- margin-right: 8.33333333%;
- margin-left: 0;
- }
- }
-
- @media (min-width: 1200px) {
- /* @noflip */
- .col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9 {
- float:right
- }
-
- /* @noflip */
- .col-lg-offset-2 {
- margin-right: 16.66666667%;
- margin-left: 0
- }
- }
-`,y0=()=>{const{langCode:e,lessonId:t}=W(),r={lessonId:+t,lessonLang:Se(e)},a=ar(e);return n(pe,{query:x0,queryVariables:r,children:s=>{const{content:o}=s,{vocabularies:i}=o;return d(k,{children:[a&&n(v0,{}),n(le,{pageType:I.VOCABULARY,content:o,translationFirst:!0,useDescriptionTranslation:!0}),n(Ee,{content:o}),i.map(l=>n(E0,{data:l},l.name))]})}})},S0=Object.freeze({[K.PHONEMIC_CHART]:"",[K.EXERCISE]:"",[K.GRAMMAR]:"lesson.menu.grammar",[K.VOCABULARY_GLOSSARY]:"lesson.menu.vocabulary",[K.REGIONAL_STUDIES]:"lesson.menu.regionalStudies",[K.MANUSCRIPT]:"",[K.DOWNLOAD]:""}),A0=e=>S0[e],Ko=(e,t)=>e&&e.lessonPart===K.GRAMMAR?e.target.name:e&&e.lessonPart===K.VOCABULARY_GLOSSARY?t("lesson.aria.vocabulary"):"",Yo=({position:e,currentItem:t,previousItem:r,nextItem:a,moveTo:s})=>{const{i18n:o}=Ge();return n("div",{className:"row noVMargins",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:d("div",{className:`exercise-nav ${e}`,children:[n("div",{className:"exercise-nav-title",children:t&&o.t(A0(t.lessonPart))}),r&&n(ue,{className:"prev-exercise",to:s(r),"aria-label":Ko(r,o.t)}),a&&n(ue,{className:"next-exercise",to:s(a),"aria-label":Ko(a,o.t)})]})})})},L0={[Pn]:K.VOCABULARY_GLOSSARY,[$n]:K.PHONEMIC_CHART},b0=({lessonName:e,lessonKeywordStrings:t,lessonKnowledgeOverviewItems:r})=>{const a=ge(),{langCode:s,lessonId:o,knowledgeType:i,contentId:l}=W(),u=Me(o,s,Ae(e)),p=(()=>l?r.find(x=>x.targetId.toString()===l):r.find(x=>x.lessonPart===L0[i]))(),f=r.indexOf(p),v=r[f-1],y=r[f+1],b=x=>{const E=Ae(x.target.name);return x.lessonPart===K.GRAMMAR?Gc(s,o,E,x.targetId):x.lessonPart===K.REGIONAL_STUDIES?Uc(s,o,E,x.targetId):x.lessonPart===K.PHONEMIC_CHART?Dc(s,o,E):Mc(s,o,E)},A=()=>{if([K.GRAMMAR,K.REGIONAL_STUDIES].includes(p.lessonPart)){const x=p.lessonPart===K.GRAMMAR?I.GRAMMAR:I.REGIONAL_STUDIES;return n(cg,{pageType:x,lessonName:e,lessonKeywordStrings:t})}return p.lessonPart===K.PHONEMIC_CHART?d(k,{children:[n(le,{pageType:I.ALPHABETICAL_ORDER}),n("h1",{children:"Phonemic Chart component"})]}):n(y0,{})},S=()=>{const x=y?b(y):va(u);a.push(x)};return d("div",{className:"section exercise-container vocabulary copy",children:[n(Yo,{position:"top",currentItem:p,previousItem:v,nextItem:y,moveTo:b}),p&&A(),n(Rr,{}),n("div",{className:"row",children:n("div",{className:"col-xs-offset-2 col-xs-8 col-sm-offset-4 col-sm-4",children:n("div",{className:"exercise-check",children:n(xe,{titleKey:y?"common.next":"exercise.toSummary",handleClick:S})})})}),n(Yo,{position:"bottom",currentItem:p,previousItem:v,nextItem:y,moveTo:b})]})},R0=B`
- query ManuscriptPage($id: Int!, $lang: Language!) {
- content(id: $id, lang: $lang) {
- ...LessonMediaInputChooser
- ...LessonManuscript
- ...LessonKnowledges
- ...${he.name}
- ${fe.partial()}
- }
- }
- ${Er.fragment({type:"Lesson"})}
- ${Mo}
- ${St.fragment({type:"Lesson"})}
- ${he.fragment({type:"Lesson"})}
-`,C0=({contentId:e,language:t})=>{const r={id:+e,lang:t};return n(pe,{query:R0,queryVariables:r,children:a=>d(k,{children:[n(le,{pageType:I.MANUSCRIPT,content:a.content,translationFirst:!0,useDescriptionTranslation:!0}),n(Ee,{content:a.content}),n(oo,{data:a}),n(Uo,h({},a))]})})},mn=({title:e,children:t})=>d(k,{children:[n("div",{className:"row vocabulary",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n(R,{isA:"h3",translation:e})})}),n("div",{className:"row vocabulary",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n("div",{className:"richtext-content-container",children:t})})})]}),I0=({data:e})=>e.map(({targetId:t,target:{name:r},name:a})=>n("div",{children:n("p",{className:"grammarLink",children:n("a",{href:xc({articleId:t,name:r}),children:a})})},t)),w0=({data:e})=>{const t=(r,a,s,o)=>`${r} | ${a} | ${Zr(s)} (${ac(o)})`;return e.map(r=>r.target.audioResourceLinks.map(({id:a,url:s,format:o,size:i,variant:l})=>n("div",{children:n("p",{className:"grammarLink",children:n("a",{href:fc({audioUrl:s}),children:t(r.name,o,i,l)})})},a)))},T0=({data:e})=>{const{staticBaseHost:t}=$e();return e.map(({targetId:r,target:{filename:a},name:s})=>n("div",{children:n("p",{className:"grammarLink",children:n("a",{href:Ec({staticBaseHost:t,downloadId:r,filename:a}),children:s})})},r))},jo={name:"VideoResourceLinks",fragment(){return B`fragment ${this.name} on Video {
- id
- name
- videoResourceLinks {
- id
- url
- techFormat
- size
- format
- }
- }
- `}},N0=({data:e})=>{const t=s=>s.videoResourceLinks.filter(o=>o.techFormat.includes("PODCAST")),r=[].concat(...e.map(s=>t(s.target).map(o=>T(h({},o),{name:s.name})))),a=(s,o,i,l)=>`${s} | ${o} | ${Zr(i)} (${l.slice(-2)})`;return r.map(({id:s,url:o,name:i,format:l,size:u,techFormat:m})=>n("p",{className:"grammarLink",children:n("a",{href:hc({videoUrl:o}),children:a(i,l,u,m)})},s))},_0=B`
- fragment LessonExtras on Lesson {
- id
- contentLinks(targetTypes: [ARTICLE, DOWNLOAD, AUDIO, VIDEO]) {
- id
- name
- targetId
- targetType
- target {
- ... on Download {
- filename
- }
- ... on Article {
- name
- }
- ... on Audio {
- id
- name
- audioResourceLinks {
- id
- url
- size
- format
- variant
- }
- }
- ...${jo.name}
- }
- }
- }
- ${jo.fragment()}
-`,pn=e=>t=>t.targetType===e,O0=({content:e={}})=>{const{contentLinks:t=[]}=e,r=t.filter(pn("DOWNLOAD")),a=t.filter(pn("ARTICLE")),s=t.filter(pn("AUDIO")),o=t.filter(pn("VIDEO")),[i,l,u,m]=[!!r.length,!!o.length,!!s.length,!!a.length];return d(Do,{title:"lesson.menu.extras",children:[n(at,{children:n(R,{isA:"h2",translation:"lesson.menu.extras"})}),i&&n(mn,{title:"lesson.downloads",children:n(T0,{data:r})}),(l||u)&&d(mn,{title:"lesson.audioVideos",children:[l&&n(N0,{data:o}),u&&n(w0,{data:s})]}),m&&n(mn,{title:"lesson.links.internal",children:n(I0,{data:a})}),n(Rr,{})]})},P0=B`
- query LessonExtrasPage($id: Int!, $lang: Language!) {
- content(id: $id, lang: $lang) {
- ...LessonExtras
- ...${he.name}
- ${fe.partial()}
- }
- }
- ${_0}
- ${he.fragment({type:"Lesson"})}
-`,$0=({contentId:e,language:t})=>{const r={id:+e,lang:t};return n(pe,{query:P0,queryVariables:r,children:({content:a})=>d(k,{children:[n(le,{pageType:I.EXTRAS,content:a,translationFirst:!0,useDescriptionTranslation:!0}),n(Ee,{content:a}),n(O0,{content:a})]})})},Ct=Object.freeze({CONTINUE:"CONTINUE",IMPROVE:"IMPROVE",SAVE:"SAVE"}),k0=(e,t)=>{const r="lesson.exercises.result";switch(e){case Ct.CONTINUE:return`${r}.notSave`;case Ct.IMPROVE:return t?`${r}.correct`:`${r}.loginFixErrors`;case Ct.SAVE:return t?`${r}.save`:`${r}.loginSave`;default:throw new Error("invalid action")}},wr=({name:e,actionType:t,onClickAction:r,href:a})=>{const{isLoggedIn:s}=J(Ue),o=k0(t,s);return n(R,{isA:"a",translation:o,onClick:r,className:e,href:a})},dt=Object.freeze({GOOD:80,MEDIUM:60,BAD:40}),Tr=({lessonId:e,showFeedback:t=!1,showTitle:r=!0})=>{const a=J(Ot(e)),{allExerciseCount:s=0,doneExerciseCount:o=0,maxPointsForAllExercises:i=0,resultPoints:l=0}=a||{},u=Yt(l,i);return d(k,{children:[r&&n("div",{className:"exercise-nav top",children:n("div",{className:"exercise-nav-title",children:n(R,{translation:"lesson.exercises.result.title",isA:"div",className:"exercise-nav-title"})})}),t&&n("div",{className:"row",children:n("div",{className:"col-xs-12",children:n(R,{translation:`course.result.${(()=>{const p=sc(1,3);return u>=dt.GOOD?`good${p}`:u>=dt.MEDIUM?`mid${p}`:`bad${p}`})()}`,isA:"div",className:"exercise-results-header"})})}),n("div",{className:"exercise-results",children:n("div",{className:"exercise-results-list",children:d("div",{className:"result-headline score",children:[n("h1",{children:d("div",{className:"result-points",dir:"ltr",children:[u,"%"]})}),d("p",{children:[n(R,{translation:"lesson.exercises.result.title",className:"exercise-results-header"}),": ",`${o}/${s}`]})]})})})]})},zo=me`
- @media (min-width: 1200px) {
- /* @noflip */
- .col-lg-push-1 {
- right: 8.33333333%;
- left: 0;
- }
- }
- @media (min-width: 1200px) {
- /* @noflip */
- .col-lg-pull-1 {
- left: 8.33333333%;
- right: auto;
- }
- }
- /* @noflip */
- .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 {
- position: relative;
- min-height: 1px;
- padding-left: 20px;
- padding-right: 20px;
- }
-`,G0=({lessonOverviewParts:e,lessonId:t,lessonName:r,courseId:a,isFinalTest:s,lessonKeywordStrings:o,data:i})=>{const{isLoggedIn:l}=J(Ue),{i18n:u}=Ge(),{langCode:m}=W(),{location:p}=Zt().window,f=Le(),v=ge(),y=mr(e),{firstExerciseLink:b,isFullScoreAchieved:A}=Ir({lessonName:r,lessonExerciseOverviewItems:y,courseId:a,isFinalTest:s});c.exports.useEffect(()=>{f(d0(t))},[]);const S=Me(t,m,Ae(r)),x=qg({lessonOverviewParts:e,lessonPath:S}),E=!l||l&&!A(),N="lesson.exercises.result",$=()=>x[0]?x[0].url:va(S),L=(ae=>{const P=x.map(G=>ae(`${N}.${G.name}`)).join(", ");return P&&d("p",{children:[ae(`${N}.whatsNext`)," ",P,"."]})})(u.t),O=$(),H=u.t(`${N}.hint`),U=()=>{if(l){f(c0(t));const ae=b(!0);v.push(ae)}else f(Xn(!0))},V=()=>{l?v.push(O):f(Xn(!0))},re=()=>{v.push(O)},ce=l?void 0:Aa(p.origin,m,p.pathname);return d(k,{children:[n(le,{pageType:I.LESSON_EXERCISE_RESULT,content:{name:r,keywordStrings:o},translationFirst:!0}),n(Ee,{content:i}),n(zo,{}),n("div",{className:"col-lg-pull-1 col-lg-10 col-lg-push-1 col-xs-12",children:d("div",{className:"exercise-container",children:[n(Tr,{lessonId:t,showFeedback:!0}),n("div",{className:"row",children:d("div",{className:"col-xs-12",children:[n("div",{className:"exercise-infos",children:L}),!l&&n(Qe,{description:H,isSimpleIconHint:"true",isA:"p"})]})}),n("div",{className:"exercise-actions",children:n("div",{className:"row",children:n("div",{className:"col-xs-12",children:d("div",{className:"row",children:[E&&n("div",{className:"col-xs-12 col-lg-4",children:n(wr,{name:"btn secondary",actionType:Ct.IMPROVE,onClickAction:U,href:ce})}),n("div",{className:"col-xs-12 col-lg-4",children:!l&&n(wr,{name:"btn secondary",actionType:Ct.CONTINUE,onClickAction:re})}),n("div",{className:"col-xs-12 col-lg-4",children:n(wr,{name:"btn main",actionType:Ct.SAVE,onClickAction:V,href:ce})})]})})})})]})})]})},D0=({data:e,lessonId:t,language:r})=>{const{content:a}=e,{contentLinks:s}=a,o=s.find(p=>p.targetId===t),i=s.indexOf(o),l=()=>{const p=s[i+1]||{},{lesson:f}=p;if(!f)return{url:mt(Qr(r)),redirectMessage:"lesson.exercises.result.toDashboard"};const{shortTitle:v,id:y}=f,b=pt({id:y,name:v,language:r,__typename:"Lesson"}),S=In(p)?"lesson.exercises.result.toFinalTest":"lesson.exercises.result.nextLesson";return{url:b,redirectMessage:S}},{url:u,redirectMessage:m}=l();return d(k,{children:[n(zo,{}),n("div",{className:"col-lg-pull-1 col-lg-10 col-lg-push-1 col-xs-12",children:d("div",{className:"exercise-container",children:[n(Tr,{lessonId:o.targetId}),n("div",{className:"row",children:n("div",{className:"col-xs-12",children:n("div",{className:"exercise-infos",children:n(R,{translation:m,isA:"p"})})})}),n("div",{className:"exercise-actions",children:n("div",{className:"row",children:n("div",{className:"col-xs-12",children:n("div",{className:"row",children:n("div",{className:"col-xs-12 col-md-4 col-md-offset-4",children:n(ue,{className:"btn main",to:u,children:n(R,{translation:"common.next"})})})})})})})]})})]})},M0=B`
- query LessonSummaryPage($id: Int!, $lang: Language!) {
- content(id: $id, lang: $lang) {
- ... on Course {
- id
- contentLinks(targetTypes: LESSON) {
- additionalInformation
- targetId
- lesson: target {
- ... on Lesson {
- id
- shortTitle
- }
- }
- }
- ${fe.partial()}
- }
- }
- }
-`,U0=({courseId:e,lessonId:t,language:r,lessonName:a,lessonKeywordStrings:s})=>{const o={id:+e,lang:r};return n(pe,{query:M0,queryVariables:o,children:i=>d(k,{children:[n(le,{pageType:I.LESSON_SUMMARY,content:{name:a,keywordStrings:s},translationFirst:!0}),n(Ee,{content:i.content}),n(D0,{data:i,lessonId:t,language:r,lessonName:a})]})})},qo={fragment({scope:e,handicap:t}){const r=t?`(handicap: ${t})`:"";return B`
- fragment ${e}OverviewParts${t||""} on Lesson {
- overviewParts${r} {
- targetId
- lessonPart
- target {
- ... on Exercise {
- name
- ${fe.partial()}
- }
- ... on Knowledge {
- name
- }
- }
- }
- }
- `}},B0=me`
- #lesson {
- .title,
- .main-info-content,
- .exercise-container,
- .input-header-container {
- /* @noflip */
- direction: ltr;
- /* @noflip */
- text-align: left;
- }
- }
-`,F0=({data:e})=>{const{content:t}=e,{name:r,language:a,overviewParts:s,learningMetaInfo:{achievableScore:o},manuscript:i,knowledges:l,mainContentImage:u,keywordStrings:m}=t,p=zg(s),f=mr(s),v={manuscript:i,knowledges:l},{path:y}=Ui(),{lessonId:b}=W(),A=+b,{id:S,name:x,contentLinks:E,mainContentImage:N}=e.contentsByType[0],$=Nn(S),w=qs({lessonContentLinksFromCourse:E,currentLessonId:A}),L=u&&Ps(u.imageFormats)?u:N,{firstExerciseLink:O}=Ir({lessonName:r,lessonExerciseOverviewItems:f,courseId:S,isFinalTest:w}),H=O();return n(or.Provider,{value:{courseId:S},children:d("div",{id:"lesson",children:[Cs(S.toString())&&n(B0,{}),n(Xs,{lessonId:b,lessonName:r,lessonOverviewParts:s,courseId:S,courseName:x,isFromPlacementCourse:$,isFinalTest:w,firstExercisePath:H}),n(se,{exact:!0,path:y,render:()=>n(wh,{lessonLang:a,firstExercisePath:H,courseName:x,isFinalTest:w,ogImage:L})}),n(se,{exact:!0,path:`${y}/e-:exerciseId(${ee.contentIdRegex})`,render:()=>n(Nh,{isFromPlacementCourse:$,children:n(f0,{lessonExerciseOverviewItems:f,lessonLang:a,lessonName:r,lessonAchievableScore:o,courseId:S,manuscriptContent:v,isFinalTest:w})})}),n(se,{exact:!0,path:[`${y}/:knowledgeType(${ee.knowledgeTypeRegex})`,`${y}/:knowledgeType(${ee.knowledgeWithContentIdTypeRegex})-:contentId(${ee.contentIdRegex})`],render:()=>n(b0,{lessonName:r,lessonKeywordStrings:m,lessonKnowledgeOverviewItems:p})}),n(se,{exact:!0,path:`${y}/${da}`,render:()=>n(C0,{language:a,contentId:A})}),n(se,{exact:!0,path:`${y}/${ua}`,render:()=>n($0,{language:a,contentId:A})}),n(se,{exact:!0,path:`${y}/${Nc}`,render:()=>n(G0,{lessonOverviewParts:s,lessonId:A,lessonName:r,courseId:S,isFinalTest:w,lessonKeywordStrings:m,data:e})}),n(se,{exact:!0,path:`${y}/${_c}`,render:()=>n(U0,{courseId:S,lessonId:A,language:a,lessonName:r,lessonKeywordStrings:m})})]})})},W0=({handicap:e})=>B`
- query LessonPage($lessonId: Int!, $lessonIdString: String!, $lang: Language!) {
- content(id: $lessonId, lang: $lang) {
- ... on Lesson {
- id
- name
- language
- ...${`LessonOverviewParts${e||""}`}
- ...${`LessonScore${e||""}`}
- ...${he.name}
- }
- ...LessonManuscript
- ...LessonKnowledges
- ...LessonImageOGMetaData
- ${fe.partial()}
- }
- contentsByType(
- lang: $lang
- type: COURSE
- amount: 1
- filters: { field: "contentLinks.targetId", value: [$lessonIdString] }
- ) {
- ... on Course {
- id
- name
- contentLinks(targetTypes: LESSON) {
- targetId
- additionalInformation
- }
- }
- ...CourseImageOGMetaData
- }
- }
- ${qo.fragment({scope:"Lesson",handicap:e})}
- ${Hn.fragment({type:"Lesson",handicap:e})}
- ${Mo}
- ${St.fragment({type:"Lesson"})}
- ${ur.fragment({type:"Lesson"})}
- ${ur.fragment({type:"Course"})}
- ${he.fragment({type:"Lesson"})}
-`,Xo=()=>{const{langCode:e,lessonId:t}=W(),{handicap:r}=J(ft)||{},a={lessonId:+t,lessonIdString:t,lang:Se(e)};return n(Ne,{children:n(pe,{query:W0({handicap:r}),queryVariables:a,children:(s,o)=>s.content?n(F0,{data:s,queryVariables:a}):(o(T(h({},a),{lang:Se(D.GERMAN)})),null)})})},Nr=({path:e,component:t,render:r,feedbackType:a})=>{const{isLoggedIn:s}=J(Ue),o=t;return n(se,{exact:!0,path:e,render:({match:i})=>s?o?n(o,{}):r():n(Vr,{to:ne(a,i.params.langCode)})})},V0=({confirmationId:e})=>{const{langCode:t}=W(),r=ge();return c.exports.useEffect(()=>{_d(e).then(async a=>{if(a.ok)r.push(X.forRegistrationConfirm(t));else{const s=await a.json();r.push(X.getForErrorCode(s,t))}}).catch(a=>{r.push(X.getForErrorCode(a,t))})},[]),n(rr,{})},It=(e,t)=>t?`${e} has-error`:e,H0=(e,t)=>t?`${e} has-nested-errors`:e,wt={SAFE_MONGO_CHARACTERS_ONLY:"safeMongoCharactersOnly",TRANSCRIPTION:"transcription"},Dt=e=>`client.validator.${e}`,_r=({name:e,validationErrorTranslationKey:t,validationType:r,customErrorTranslationKey:a,t:s})=>{const o=s(t);switch(r){case"required":return s(Dt("required"),{first:o});case"pattern":return s(Dt(a||e),{first:o});case"differsFromEmail":return s(Dt("differFromEmail"));case"passwordRetype":return s(Dt("equalTo"));default:return""}},ye=m=>{var p=m,{titleTranslationKey:e,placeholderTranslationKey:t=e,name:r,type:a,register:s,validationError:o,isLabelVisible:i=!1,customErrorTranslationKey:l}=p,u=Oe(p,["titleTranslationKey","placeholderTranslationKey","name","type","register","validationError","isLabelVisible","customErrorTranslationKey"]);const{i18n:f}=Ge();return d("div",{className:It("form-group",o),"aria-live":"assertive",children:[n(R,{isA:"label",className:`control-label ${!i&&"hidden"}`,translation:e}),n("input",h(h({className:"form-control",name:r,type:a,placeholder:f.t(t)},s),u)),o&&n("small",{className:"help-block",children:_r({name:r,validationErrorTranslationKey:e,validationType:o.type,customErrorTranslationKey:l,t:f.t})})]})},Mt=i=>{var l=i,{name:e,defaultOptionKey:t,options:r,validationError:a,register:s}=l,o=Oe(l,["name","defaultOptionKey","options","validationError","register"]);const{i18n:u}=Ge();return d("div",{className:It("form-group",a),"aria-live":"assertive",children:[d("select",T(h(h({className:"form-control",name:e},s),o),{children:[n("option",{value:"",children:u.t(t)}),r&&r.map(m=>{const{key:p,name:f,value:v,ariaKey:y}=m;return n("option",{dir:"auto",value:v,"aria-label":y?u.t(y):null,children:p?u.t(p):f},v)})]})),a&&n("small",{className:"help-block",children:_r({name:e,validationErrorTranslationKey:t,validationType:a.type,t:u.t})})]})},Or=i=>{var l=i,{name:e,labelText:t,validationErrorTranslationKey:r,register:a,validationError:s}=l,o=Oe(l,["name","labelText","validationErrorTranslationKey","register","validationError"]);const{i18n:u}=Ge();return n("div",{className:"custom-checkbox",children:d("div",{className:It("form-group",s),children:[d("div",{className:"input-group",children:[n("span",{className:"input-group-addon",children:n("input",h(h({className:"form-control",name:e,type:"checkbox","aria-label":e},a),o))}),n("label",{className:"checkbox-label",children:t})]}),s&&n("small",{className:"help-block",children:_r({name:e,validationErrorTranslationKey:r,validationType:s.type,t:u.t})})]})})},Zo=({register:e,errors:t,initialDateOfBirth:r,translationPrefix:a="profile.register"})=>{const{year:s}=yd(r),o=t.year,i=te(`${a}.placeholder.yearOfBirth`);return d("div",{className:H0("form-group",o),"aria-live":"assertive",children:[d("div",{className:It("input-group",o),children:[n(R,{className:"input-group-addon",translation:`${a}.dateOfBirth`}),n("div",{className:"padding-none",children:n("input",h({className:"form-control",type:"number","aria-labelledby":"dateOfBirth","aria-label":"Year",placeholder:i,name:"year",defaultValue:s},e("year",{min:1900,max:9999,maxLength:4})))})]}),o&&n("small",{className:"help-block",children:n(R,{translation:"client.validator.date"})})]})},Pr=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,Qo=/^[\sa-zA-ZäöüÄÖÜß-]*$/,gn=/^[^\u0027\u0022;{}<>&:\\]+$/,Jo=e=>{if(!e)return!1;const t=8;let r=0;const a=3;return[/[0-9]/,/[^A-Za-z_0-9]/,/[A-Z]/,/[a-z]/].forEach(o=>{e.match(o)!==null&&(r+=1)}),e.length>=t&&r>=a},ei=(e,t)=>!!(t&&t===e),ti=(e,t)=>{const r=4,a=t,{length:s}=a;let o;for(let i=0;i(t(T(h({},e),{captchaError:!e.isCaptchaPassed})),e.isCaptchaPassed),ni={validateCaptcha:K0},ri=({languageCode:e,onSuccess:t,onExpired:r})=>{const a=s=>{s&&t(s)};return n(Bi,{hl:e,sitekey:Ve.reCaptcha.siteKey,onChange:a,onExpired:r})},$r=[{value:"\xEF\xBB\xBFAF",name:"Afghanistan"},{value:"AL",name:"Albania"},{value:"DZ",name:"Algeria"},{value:"AS",name:"American Samoa"},{value:"AD",name:"Andorra"},{value:"AO",name:"Angola"},{value:"AI",name:"Anguilla"},{value:"AQ",name:"Antarctica"},{value:"AG",name:"Antigua and Barbuda"},{value:"AR",name:"Argentina"},{value:"AM",name:"Armenia"},{value:"AW",name:"Aruba"},{value:"AU",name:"Australia"},{value:"AT",name:"Austria"},{value:"AZ",name:"Azerbaijan"},{value:"BS",name:"Bahamas"},{value:"BH",name:"Bahrain"},{value:"BD",name:"Bangladesh"},{value:"BB",name:"Barbados"},{value:"BY",name:"Belarus"},{value:"BE",name:"Belgium"},{value:"BZ",name:"Belize"},{value:"BJ",name:"Benin"},{value:"BM",name:"Bermuda"},{value:"BT",name:"Bhutan"},{value:"BO",name:"Bolivia"},{value:"BA",name:"Bosnia and Herzegovina"},{value:"BW",name:"Botswana"},{value:"BV",name:"Bouvet Island"},{value:"BR",name:"Brazil"},{value:"IO",name:"British Indian Ocean Territory"},{value:"BN",name:"Brunei Darussalam"},{value:"BG",name:"Bulgaria"},{value:"BF",name:"Burkina Faso"},{value:"BI",name:"Burundi"},{value:"CI",name:"C\xF4te d'Ivoire"},{value:"CV",name:"Cabo Verde"},{value:"KH",name:"Cambodia"},{value:"CM",name:"Cameroon"},{value:"CA",name:"Canada"},{value:"KY",name:"Cayman Islands"},{value:"CF",name:"Central African Republic"},{value:"TD",name:"Chad"},{value:"CL",name:"Chile"},{value:"CN",name:"China"},{value:"CX",name:"Christmas Island"},{value:"CC",name:"Cocos Islands"},{value:"CO",name:"Colombia"},{value:"KM",name:"Comoros"},{value:"CG",name:"Congo"},{value:"CK",name:"Cook Islands"},{value:"CR",name:"Costa Rica"},{value:"HR",name:"Croatia"},{value:"CU",name:"Cuba"},{value:"CY",name:"Cyprus"},{value:"CZ",name:"Czech Republic"},{value:"CD",name:"Dem. Rep. of Congo"},{value:"DK",name:"Denmark"},{value:"DJ",name:"Djibouti"},{value:"DM",name:"Dominica"},{value:"DO",name:"Dominican Republic"},{value:"EC",name:"Ecuador"},{value:"EG",name:"Egypt"},{value:"SV",name:"El Salvador"},{value:"GQ",name:"Equatorial Guinea"},{value:"ER",name:"Eritrea"},{value:"EE",name:"Estonia"},{value:"ET",name:"Ethiopia"},{value:"FK",name:"Falkland Islands"},{value:"FO",name:"Faroe Islands"},{value:"FJ",name:"Fiji"},{value:"FI",name:"Finland"},{value:"FR",name:"France"},{value:"GF",name:"French Guyana"},{value:"PF",name:"French Polynesia"},{value:"TF",name:"French Southern and Antarctic Territories"},{value:"GA",name:"Gabon"},{value:"GM",name:"Gambia"},{value:"GE",name:"Georgia"},{value:"DE",name:"Germany"},{value:"GH",name:"Ghana"},{value:"GI",name:"Gibraltar"},{value:"GB",name:"Great Britain"},{value:"GR",name:"Greece"},{value:"GL",name:"Greenland"},{value:"GD",name:"Grenada"},{value:"GP",name:"Guadeloupe"},{value:"GU",name:"Guam"},{value:"GT",name:"Guatemala"},{value:"GN",name:"Guinea"},{value:"GW",name:"Guinea-Bissau"},{value:"GY",name:"Guyana"},{value:"HT",name:"Haiti"},{value:"HM",name:"Heard and the McDonald Islands"},{value:"HN",name:"Honduras"},{value:"HK",name:"Hong Kong"},{value:"HU",name:"Hungary"},{value:"IS",name:"Iceland"},{value:"IN",name:"India"},{value:"ID",name:"Indonesia"},{value:"IR",name:"Iran"},{value:"IQ",name:"Iraq"},{value:"IE",name:"Ireland"},{value:"IL",name:"Israel"},{value:"IT",name:"Italy"},{value:"JM",name:"Jamaica"},{value:"JP",name:"Japan"},{value:"JO",name:"Jordan"},{value:"KZ",name:"Kazakhstan"},{value:"KE",name:"Kenya"},{value:"KI",name:"Kiribati"},{value:"KP",name:"Korea (Democratic People's Republic of)"},{value:"KR",name:"Korea (Republic)"},{value:"KO",name:"Kosovo"},{value:"KW",name:"Kuwait"},{value:"KG",name:"Kyrgyzstan"},{value:"LA",name:"Lao"},{value:"LV",name:"Latvia"},{value:"LB",name:"Lebanon"},{value:"LS",name:"Lesotho"},{value:"LR",name:"Liberia"},{value:"LY",name:"Libya"},{value:"LI",name:"Liechtenstein"},{value:"LT",name:"Lithuania"},{value:"LU",name:"Luxembourg"},{value:"MO",name:"Macau"},{value:"MK",name:"Macedonia"},{value:"MG",name:"Madagascar"},{value:"MW",name:"Malawi"},{value:"MY",name:"Malaysia"},{value:"MV",name:"Maldivian"},{value:"ML",name:"Mali"},{value:"MT",name:"Malta"},{value:"MH",name:"Marshall Islands"},{value:"MQ",name:"Martinique"},{value:"MR",name:"Mauritania"},{value:"MU",name:"Mauritius"},{value:"YT",name:"Mayotte"},{value:"MX",name:"Mexico"},{value:"FM",name:"Micronesia"},{value:"MD",name:"Moldova"},{value:"MC",name:"Monaco"},{value:"MN",name:"Mongolia"},{value:"ME",name:"Montenegro"},{value:"MS",name:"Montserrat"},{value:"MA",name:"Morocco"},{value:"MZ",name:"Mozambique"},{value:"MM",name:"Myanmar"},{value:"NA",name:"Namibia"},{value:"NR",name:"Nauru"},{value:"NP",name:"Nepal"},{value:"NL",name:"Netherlands"},{value:"AN",name:"Netherlands Antilles"},{value:"NC",name:"New Caledonia"},{value:"NZ",name:"New Zealand"},{value:"NI",name:"Nicaragua"},{value:"NE",name:"Niger"},{value:"NG",name:"Nigeria"},{value:"NU",name:"Niue"},{value:"NF",name:"Norfolk Island"},{value:"MP",name:"Northern Mariana Islands"},{value:"NO",name:"Norway"},{value:"OM",name:"Oman"},{value:"PK",name:"Pakistan"},{value:"PW",name:"Palau"},{value:"PS",name:"Palestine"},{value:"PA",name:"Panama"},{value:"PG",name:"Papua New Guinea"},{value:"PY",name:"Paraguay"},{value:"PE",name:"Peru"},{value:"PH",name:"Philippines"},{value:"PN",name:"Pitcairn"},{value:"PL",name:"Poland"},{value:"PT",name:"Portugal"},{value:"PR",name:"Puerto Rico"},{value:"QA",name:"Qatar"},{value:"RE",name:"R\xE9union"},{value:"SS",name:"Republic of South Sudan"},{value:"RO",name:"Romania"},{value:"RU",name:"Russia"},{value:"RW",name:"Rwanda"},{value:"SH",name:"Saint Helena"},{value:"KN",name:"Saint Kitts and Nevis"},{value:"LC",name:"Saint Lucia"},{value:"VC",name:"Saint Vincent & the Grenadines"},{value:"WS",name:"Samoa"},{value:"SM",name:"San Marino"},{value:"ST",name:"Sao Tom\xE9 and Principe"},{value:"SA",name:"Saudi Arabia"},{value:"SN",name:"Senegal"},{value:"RS",name:"Serbia"},{value:"SC",name:"Seychelles"},{value:"SL",name:"Sierra Leone"},{value:"SG",name:"Singapore"},{value:"SK",name:"Slovakia"},{value:"SI",name:"Slovenia"},{value:"SB",name:"Solomon Islands"},{value:"SO",name:"Somalia"},{value:"ZA",name:"South Africa"},{value:"GS",name:"South Georgia and the South Sandwich Islands"},{value:"ES",name:"Spain"},{value:"LK",name:"Sri Lanka"},{value:"PM",name:"St. Pierre and Miquelon"},{value:"SD",name:"Sudan"},{value:"SR",name:"Suriname"},{value:"SJ",name:"Svalbard and Jan Mayen"},{value:"SZ",name:"Swaziland"},{value:"SE",name:"Sweden"},{value:"CH",name:"Switzerland"},{value:"SY",name:"Syrian Arab Republic"},{value:"TW",name:"Taiwan, R.O.C."},{value:"TJ",name:"Tajikistan"},{value:"TZ",name:"Tanzania"},{value:"TH",name:"Thailand"},{value:"TL",name:"Timor-Leste"},{value:"TG",name:"Togo"},{value:"TK",name:"Tokelau"},{value:"TO",name:"Tonga"},{value:"TT",name:"Trinidad & Tobago"},{value:"TN",name:"Tunisia"},{value:"TR",name:"Turkey"},{value:"TM",name:"Turkmenistan"},{value:"TC",name:"Turks and Caicos Islands"},{value:"TV",name:"Tuvalu"},{value:"UG",name:"Uganda"},{value:"UA",name:"Ukraine"},{value:"AE",name:"United Arab Emirates"},{value:"UM",name:"United States Minor Outlying Islands"},{value:"US",name:"United States of America"},{value:"UY",name:"Uruguay"},{value:"UZ",name:"Uzbekistan"},{value:"VU",name:"Vanuatu"},{value:"VA",name:"Vatican City"},{value:"VE",name:"Venezuela"},{value:"VN",name:"Viet Nam"},{value:"VI",name:"Virgin Islands"},{value:"VG",name:"Virgin Islands (brit.)"},{value:"WF",name:"Wallis and Futuna"},{value:"EH",name:"Western Sahara"},{value:"YE",name:"Yemen"},{value:"ZM",name:"Zambia"},{value:"ZW",name:"Zimbabwe"}];Object.freeze($r);const Y0=Object.freeze([{value:D.GERMAN,name:"German"},{value:D.ENGLISH,name:"English"},{value:D.ARABIC,name:"Arabic"},{value:D.RUSSIAN,name:"Russian"},{value:"fa",name:"Persian"},{value:D.SPANISH,name:"Spanish"}]),Je="profile.edit",Ut=`${Je}.profession`,ai=Object.freeze([{value:"FEMALE",key:`${Je}.sex.female`},{value:"MALE",key:`${Je}.sex.male`},{value:"OTHER",key:`${Je}.sex.other`}]),j0=Object.freeze([{value:"ZFA_TEACHER",key:`${Ut}.zfa_teacher`},{value:"PRIVATE_TEACHER",key:`${Ut}.private_teacher`},{value:"INSTITUTE_MANAGER",key:`${Ut}.institute_manager`},{value:"INSTITUTE_EMPLOYEE",key:`${Ut}.institute_employee`},{value:"OTHER",key:`${Ut}.other`}]),hn=`${Je}.languageLevel`,z0=Object.freeze([{value:"ZERO",key:`${hn}.zero`},{value:"BEGINNER",key:`${hn}.beginner`},{value:"INTERMEDIATE",key:`${hn}.intermediate`},{value:"EXPERT",key:`${hn}.expert`}]),fn=`${Je}.writingReadingLevel`,q0=Object.freeze([{value:"ZERO",key:`${fn}.zero`},{value:"NOT_LATIN",key:`${fn}.not_latin`},{value:"UNCERTAIN",key:`${fn}.uncertain`},{value:"CAN",key:`${fn}.can`}]),et=`${Je}.handicap`,X0=Object.freeze([{value:"BLIND",key:`${et}.blind.title`,ariaKey:`${et}.blind.aria`},{value:"POOR_EYESIGHT",key:`${et}.poor_eyesight.title`,ariaKey:`${et}.blind.aria`},{value:"WEAK_HEARING",key:`${et}.weak_hearing.title`,ariaKey:`${et}.blind.aria`},{value:"MOUSE_USAGE",key:`${et}.mouse_usage.title`,ariaKey:`${et}.blind.aria`}]),kr=`${Je}.learningType`,Z0=Object.freeze([{value:"MUSIC",key:`${kr}.music`},{value:"AUDIO",key:`${kr}.audio`},{value:"AUTHENTIC_TEXT",key:`${kr}.authentic_text`}]),Q0=()=>{const{i18n:e}=Ge(),[t,r]=c.exports.useState({isCaptchaPassed:!1,captchaError:!1,captchaToken:null}),a=c.exports.useRef(),{langCode:s}=W(),o=ge(),{register:i,handleSubmit:l,getValues:u,formState:{errors:m}}=ut({mode:"onSubmit",reValidateMode:"onSubmit"}),p=te("client.recaptcha"),f=te({key:"client.validator.required",parameters:{first:p}}),v=(w,L)=>`
- ${L}
- `,y=w=>v("https://p.dw.com/p/1Edck",w("profile.register.privacyPolicy")),b=w=>v("https://p.dw.com/p/16hIr",w("profile.register.agb")),S=[{name:"gdpr",labelTextFunc:w=>{const L=w("profile.register.agbAndPrivacyPolicyFormat",{dataPrivacyPolicy:y(w),conditionsOfParticipation:b(w)});return d(k,{children:[n(R,{translation:"common.gdpr.overlay.agree"}),"\xA0",n(R,{translation:"common.gdpr.overlay.dissent"}),"\xA0",n(tt,{dangerouslySetInnerHTML:{__html:L}})]})},validationErrorTranslationKey:"client.acceptTermsConditions",register:i("gdpr",{required:!0}),validationError:m.gdpr},{name:"teacher",labelText:n(R,{translation:"profile.register.teacher"}),register:i("teacher")},{name:"newsletter",labelText:n(R,{translation:"profile.register.newsletter"}),register:i("newsletter")}],x=async w=>{if(ni.validateCaptcha(t,r))try{const L=await Cd({userData:w,captchaToken:t.captchaToken,langCode:s});if(L.ok)o.push(X.forRegistered(s));else{const O=await L.json();o.push(X.getForErrorCode(O,s))}}catch(L){o.push(X.getForErrorCode(L,s))}else Hs(a.current)},E=w=>{r(T(h({},t),{isCaptchaPassed:!0,captchaToken:w}))},N=()=>{r(T(h({},t),{isCaptchaPassed:!1,captchaToken:null}))},$=w=>{w.preventDefault(),o.push(mt(s))};return n("div",{className:"section",children:d("div",{className:"container",children:[n("div",{className:"row",children:d("div",{className:"col-md-6 col-md-offset-3",children:[n(R,{isA:"h1",translation:"profile.register.title"}),n(R,{isA:"p",translation:"profile.register.subtitle"})]})}),n("div",{className:"row",children:n("div",{className:"col-md-6 col-md-offset-3",children:d("form",{id:"main-form","data-id":"register-user",className:"validate",onSubmit:l(x),children:[n(ye,{titleTranslationKey:"profile.register.firstName",name:"firstName",register:i("firstName",{required:!0,pattern:gn}),validationError:m.firstName,customErrorTranslationKey:wt.SAFE_MONGO_CHARACTERS_ONLY}),n(ye,{titleTranslationKey:"profile.register.lastName",name:"lastName",register:i("lastName",{required:!0,pattern:gn}),validationError:m.lastName,customErrorTranslationKey:wt.SAFE_MONGO_CHARACTERS_ONLY}),n(Mt,{name:"sex",validationError:m.sex,register:i("sex",{required:!0}),defaultOptionKey:"profile.register.sex.title",options:ai}),n("hr",{}),n(ye,{titleTranslationKey:"profile.register.email",name:"email",register:i("email",{required:!0,pattern:Pr}),validationError:m.email}),n(ye,{titleTranslationKey:"profile.register.password",name:"password",type:"password",register:i("password",{required:!0,validate:{pattern:w=>Jo(w,u().email),differsFromEmail:w=>ti(w,u().email)}}),validationError:m.password}),n(ye,{titleTranslationKey:"profile.register.passwordRetype",name:"passwordRetype",type:"password",register:i("passwordRetype",{required:!0,validate:{passwordRetype:w=>ei(w,u().password)}}),validationError:m.passwordRetype}),n(Mt,{name:"country",validationError:m.country,register:i("country",{required:!0}),defaultOptionKey:"profile.register.country",options:$r}),n(Zo,{register:i,errors:m,translationPrefix:"profile.register"}),S.map(w=>n(Or,{name:w.name,labelText:w.labelTextFunc?w.labelTextFunc(e.t):w.labelText,validationErrorTranslationKey:"client.acceptTermsConditions",register:w.register,validationError:w.validationError},w.name)),n("div",{ref:a,className:"custom-checkbox","aria-live":"assertive",children:n("div",{className:It("form-group",t.captchaError),children:d("div",{className:"input-group",children:[n(ri,{languageCode:s,onSuccess:E,onExpired:N}),t.captchaError&&n("small",{className:"help-block",children:f})]})})}),n(xe,{titleKey:"profile.register.save",className:"btn main"}),n(xe,{titleKey:"profile.register.cancel",className:"btn secondary",handleClick:w=>$(w)})]})})})]})})},J0=({userData:e,captchaToken:t})=>({email:e.email,recaptcha:t}),En=Ye.PS_URL,e1=`${En}public/user/password/reset`,t1=`${En}public/user/password/reset-request`,n1=`${En}protected/user/password`,r1=(e,t)=>fetch(`${n1}/change`,h({method:"POST",body:JSON.stringify({oldPassword:e,newPassword:t})},Ce)),a1=({userData:e,captchaToken:t})=>{const r=J0({userData:e,captchaToken:t});return fetch(t1,h({method:"POST",body:JSON.stringify(r)},Ce)).then(a=>a.ok?Promise.resolve(a):Promise.reject(a))},s1=(e,t)=>fetch(e1,h({method:"POST",body:JSON.stringify({newPassword:e,passwordResetToken:t})},Ce)).then(r=>r.ok?Promise.resolve(r):Promise.reject(r)),o1=e=>fetch(`${En}public/user/mail?token=${e}`).then(t=>t.text()).catch(t=>console.log(t)),si=({passwordTitleKey:e,passwordPlaceholderKey:t,passwordRepeatTitleKey:r,passwordRepeatPlaceholderKey:a,email:s,register:o,errors:i,getValues:l})=>d(k,{children:[n(ye,{titleTranslationKey:e,placeholderTranslationKey:t,name:"password",type:"password",register:o("password",{required:!0,validate:{pattern:u=>Jo(u),differsFromEmail:u=>ti(u,s)}}),validationError:i.password}),n(ye,{titleTranslationKey:r,placeholderTranslationKey:a,name:"passwordRetype",type:"password",register:o("passwordRetype",{required:!0,validate:{passwordRetype:u=>ei(u,l().password)}}),validationError:i.passwordRetype})]}),i1=()=>{const{langCode:e}=W(),t=ge(),{register:r,handleSubmit:a,getValues:s,formState:{errors:o}}=ut({mode:"onSubmit",reValidateMode:"onSubmit"}),{email:i}=J(ft);return n("div",{className:"section",children:d("div",{className:"container",children:[n("div",{className:"row",children:d("div",{className:"col-md-6 col-md-offset-3",children:[n(R,{isA:"h1",translation:"profile.edit.password.change.title"}),d("p",{children:[n(R,{translation:"profile.edit.password.change.subtitle"}),n("br",{}),"\xA0",n("br",{}),"\xA0"]})]})}),n("div",{className:"row",children:n("div",{className:"col-md-6 col-md-offset-3 text-center",children:d("form",{onSubmit:a(async u=>{const{oldPassword:m,password:p}=u;try{const f=await r1(m,p);if(f.ok)t.push(X.forPasswordChanged(e));else{const v=await f.json();t.push(X.getForPasswordChangeErrorCode(v,e))}}catch(f){t.push(X.forGeneralError(e))}}),children:[n(ye,{titleTranslationKey:"profile.edit.password.change.oldPassword",placeholderTranslationKey:"profile.edit.password.change.oldPassword",name:"oldPassword",type:"password",register:r("oldPassword",{required:!0}),validationError:o.oldPassword}),n(si,{passwordTitleKey:"profile.edit.password.change.newPassword",passwordPlaceholderKey:"profile.edit.password.change.newPassword",passwordRepeatTitleKey:"profile.edit.password.change.newPasswordRepeat",passwordRepeatPlaceholderKey:"profile.edit.password.change.newPasswordRepeat",email:i,errors:o,register:r,getValues:s}),n(xe,{className:"btn main",titleKey:"profile.edit.password.change.save"})]})})})]})})},l1=()=>{const[e,t]=c.exports.useState({isCaptchaPassed:!1,captchaError:!1,captchaToken:null}),{langCode:r}=W(),a=c.exports.useRef(),s=ge(),{register:o,handleSubmit:i,formState:{errors:l}}=ut({mode:"onSubmit",reValidateMode:"onSubmit"}),u=te("client.recaptcha"),m=te({key:"client.validator.required",parameters:{first:u}}),p=async y=>{if(!ni.validateCaptcha(e,t)){Hs(a.current);return}try{await a1({userData:y,captchaToken:e.captchaToken}),s.push(X.forPasswordResetRequest(r))}catch(b){s.push(X.getForErrorCode(b,r))}},f=y=>{t(T(h({},e),{isCaptchaPassed:!0,captchaToken:y}))},v=()=>{t(T(h({},e),{isCaptchaPassed:!1,captchaToken:null}))};return n("div",{className:"section",children:d("div",{className:"container",children:[n("div",{className:"row",children:d("div",{className:"col-md-6 col-md-offset-3",children:[n(R,{isA:"h1",translation:"profile.edit.password.reset.title"}),n(R,{isA:"p",translation:"profile.edit.password.reset.subtitle"}),n("br",{}),"\xA0",n("br",{}),"\xA0"]})}),n("div",{className:"row",children:n("div",{className:"col-md-6 col-md-offset-3 text-center",children:d("form",{onSubmit:i(p),children:[n("div",{className:"form-group",style:{textAlign:"left"},children:n(ye,{name:"email",titleTranslationKey:"profile.edit.password.reset.email",register:o("email",{required:!0,pattern:Pr}),validationError:l.email})}),n("div",{ref:a,className:"custom-checkbox","aria-live":"assertive",children:n("div",{className:It("form-group",e.captchaError),children:d("div",{className:"input-group",children:[n(ri,{languageCode:r,onSuccess:f,onExpired:v}),e.captchaError&&n("small",{className:"help-block",children:m})]})})}),n(xe,{className:"btn main",titleKey:"profile.edit.password.reset.submit"})]})})})]})})},c1=()=>{const{langCode:e,feedbackType:t}=W(),{search:r}=Nt(),a=X.getFeedbackContentKey(t),i=new URLSearchParams(r).get(ma)||qc(t,e);return n("div",{className:"section",children:n("div",{className:"container",children:n("div",{className:"row",children:n("div",{className:"col-md-6 col-md-offset-3",children:d("div",{children:[n(R,{isA:"h1",translation:qr.TITLE}),n(R,{isA:"p",translation:a}),n(ue,{to:i,children:n(xe,{titleKey:qr.OK_BUTTON,className:"btn main"})})]})})})})})},d1=({onClose:e})=>{const{langCode:t}=W(),r=ge(),a=Le(),{register:s,handleSubmit:o}=ut({mode:"onSubmit"}),i=te("profile.edit.modal.confirmDelete");return d(k,{children:[n("div",{className:"modal fade modal-delete-account in",style:{display:"block"},children:n("div",{className:"modal-dialog modal-sm",role:"document",children:n("div",{className:"modal-content m-bubble",children:d("form",{id:"main-form","data-id":"delete-user",className:"validate",onSubmit:o(async()=>{try{const u=await Id();if(u.ok)a(Cu()),r.push(X.forUserDelete(t));else{const m=await u.json();r.push(X.getForErrorCode(m,t))}}catch(u){r.push(X.getForErrorCode(u,t))}}),children:[d("div",{className:"modal-header",children:[n("button",{onClick:e,className:"close","aria-label":"Close",children:n("span",{"aria-hidden":"true",children:"\xD7"})}),n(R,{translation:"profile.edit.modal.title",isA:"h4",className:"modal-title"})]}),d("div",{className:"modal-body",children:[n(R,{translation:"profile.edit.modal.confirmQuestion"}),d("div",{className:"custom-checkbox",children:[n(Or,{name:"confirmUserDelete",labelText:i,register:s("confirmUserDelete",{required:!0})}),n(xe,{titleKey:"profile.edit.modal.deleteAccount",className:"btn main"}),n(xe,{titleKey:"profile.edit.modal.cancel",className:"btn secondary",handleClick:e})]})]})]})})})}),n("div",{className:"modal-backdrop fade in"})]})},u1=()=>{const e=ge(),{langCode:t}=W(),r=Le(),a=J(ft),{i18n:s}=Ge(),[o,i]=c.exports.useState(!1),{register:l,handleSubmit:u,getValues:m,formState:{errors:p}}=ut({mode:"onSubmit",reValidateMode:"onSubmit"}),f=[{name:"contactLanguage",options:Y0,translationKeySuffix:""},{name:"profession",options:j0},{name:"languageLevel",options:z0},{name:"writingReadingLevel",options:q0},{name:"handicap",options:X0},{name:"learningType",options:Z0}],v=[{name:"teacher",translationKeySuffix:".teacher"},{name:"newsletter",translationKeySuffix:".newsletter.subscribe"},{name:"signalSoundDisabled",translationKeySuffix:".signalSoundTurnOff"}],y=S=>{const x=h({},S);return f.forEach(E=>{x[E.name]===""&&delete x[E.name]}),x},b=async S=>{const x=y(S);try{const E=await Td(x);r(as(E)),E.email!==m().email?e.push(X.forMailChangeRequest(t)):e.push(X.forProfileUpdated(t))}catch(E){e.push(X.getForErrorCode(E,t))}},A=()=>{i(!o)};return n("div",{className:"section",children:d("div",{className:"container",children:[n("div",{className:"row",children:d("div",{className:"col-md-6 col-md-offset-3",children:[n(R,{isA:"h1",translation:"profile.edit.title"}),n(R,{isA:"p",translation:"profile.edit.subtitle"})]})}),n("div",{className:"row",children:d("div",{className:"col-md-6 col-md-offset-3",children:[d("form",{id:"main-form","data-id":"update-profile",className:"validate",onSubmit:u(b),children:[n(ye,{titleTranslationKey:"profile.edit.firstName",name:"firstName",register:l("firstName",{required:!0,pattern:gn}),validationError:p.firstName,customErrorTranslationKey:wt.SAFE_MONGO_CHARACTERS_ONLY,defaultValue:a.firstName}),n(ye,{titleTranslationKey:"profile.edit.lastName",name:"lastName",register:l("lastName",{required:!0,pattern:gn}),validationError:p.lastName,customErrorTranslationKey:wt.SAFE_MONGO_CHARACTERS_ONLY,defaultValue:a.lastName}),n(ye,{titleTranslationKey:"profile.edit.firstNameTranscription",name:"firstNameTranscription",register:l("firstNameTranscription",{pattern:Qo}),validationError:p.firstNameTranscription,customErrorTranslationKey:wt.TRANSCRIPTION,defaultValue:a.firstNameTranscription}),n(ye,{titleTranslationKey:"profile.edit.lastNameTranscription",name:"lastNameTranscription",register:l("lastNameTranscription",{pattern:Qo}),validationError:p.lastNameTranscription,customErrorTranslationKey:wt.TRANSCRIPTION,defaultValue:a.lastNameTranscription}),n(Mt,{name:"sex",validationError:p.sex,register:l("sex",{required:!0}),defaultOptionKey:"profile.edit.sex.title",options:ai,defaultValue:a.sex}),n(ye,{titleTranslationKey:"profile.edit.email",name:"email",register:l("email",{required:!0,pattern:Pr}),validationError:p.email,defaultValue:a.email}),n("hr",{}),n(ye,{titleTranslationKey:"profile.edit.street",name:"streetName",register:l("streetName"),validationError:p.streetName,defaultValue:a.streetName}),n(ye,{titleTranslationKey:"profile.edit.postalCode",name:"postalCode",register:l("postalCode"),validationError:p.postalCode,defaultValue:a.postalCode}),n(ye,{titleTranslationKey:"profile.edit.city",name:"city",register:l("city"),validationError:p.city,defaultValue:a.city}),n(Mt,{name:"country",validationError:p.country,register:l("country"),defaultOptionKey:"profile.edit.country",options:$r,defaultValue:a.country}),n(Zo,{register:l,errors:p,initialDateOfBirth:a.dateOfBirth,translationPrefix:"profile.edit"}),n("hr",{}),f.map(({name:S,options:x,translationKeySuffix:E=".title"})=>c.exports.createElement(Mt,{name:S,register:l(S),options:x,key:S,validationError:p[S],defaultOptionKey:`profile.edit.${S}${E}`,defaultValue:a[S]})),v.map(({name:S,translationKeySuffix:x})=>c.exports.createElement(Or,{name:S,register:l(S),key:S,labelText:s.t(`profile.edit${x}`),defaultChecked:a[S]})),n(xe,{titleKey:"profile.edit.save",className:"btn main"})]}),n(ue,{to:Fc(t),className:"btn secondary user-profile-button",children:n(R,{translation:"profile.edit.passwordChange"})}),n(xe,{titleKey:"profile.edit.deleteAccount",className:"btn secondary",handleClick:A}),n(cr,{isOpen:o,children:n(d1,{onClose:A})})]})})]})})},m1=({confirmationId:e})=>{const t=ge(),{langCode:r}=W(),[a,s]=c.exports.useState(null);c.exports.useEffect(()=>{o1(e).then(p=>{p.includes("@")?s(p):t.push(X.forInvalidToken(r))}).catch(p=>{t.push(X.getForErrorCode(p,r))})},[]);const{register:o,handleSubmit:i,getValues:l,formState:{errors:u}}=ut({mode:"onSubmit",reValidateMode:"onSubmit"});return a?n("div",{className:"section",children:d("div",{className:"container",children:[n("div",{className:"row",children:d("div",{className:"col-md-6 col-md-offset-3",children:[n(R,{isA:"h1",translation:"profile.edit.password.set.title"}),d("p",{children:[n(R,{translation:"profile.edit.password.set.subtitle"}),n("br",{}),"\xA0",n("br",{}),"\xA0"]})]})}),n("div",{className:"row",children:n("div",{className:"col-md-6 col-md-offset-3 text-center",children:d("form",{onSubmit:i(async()=>{try{await s1(l().password,e),t.push(X.forSetPassword(r))}catch(p){t.push(X.getForErrorCode(p,r))}}),style:{textAlign:"left"},children:[n(si,{passwordTitleKey:"profile.register.password",passwordPlaceholderKey:"client.newPassword",passwordRepeatTitleKey:"profile.register.passwordRetype",passwordRepeatPlaceholderKey:"client.newPasswordRepeat",email:a,errors:u,register:o,getValues:l}),n(xe,{className:"btn main",titleKey:"profile.edit.password.set.submit"})]})})})]})}):n(rr,{})},p1=({lesson:e,index:t})=>{const{dkLearningLevel:r,id:a,name:s,subTitle:o}=e,i=J(Ot(a)),l=st[r];return n(ue,{className:"main-course-container",to:pt(e),children:d("div",{className:`main-course ${l} assess${t+1}`,children:[n("span",{className:"progress-icon",children:n(an,{learnProgress:i,color:yt.GRAY})}),n("h2",{className:"tile-learningLevel",children:l}),n(R,{isA:"p",translation:s,className:"course-title","aria-label":"course-title"}),n(R,{isA:"p",translation:o})]})})},g1=me`
- div.allcourses .main-course {
- float: left;
- text-align: left
- }
-
- div.allcourses .main-course h2 {
- float: left;
- margin: 0 6px 0 0
- }
-
- @media (max-width: 767px) {
- div.allcourses .main-course h2 {
- margin: 5px 6px 0 10px
- }
- }
-
- div.allcourses .main-course p.course-title {
- margin: 6px 0 0
- }
-
- div.allcourses .main-course span.progress-icon {
- float: right;
- margin-top: 20px
- }
-
- div.allcourses .main-course span.progress-icon.half {
- margin-left: 8px
- }
-
- @media (min-width: 768px) {
- div.allcourses .main-course p {
- clear: left
- }
-
- div.allcourses .main-course p.course-title {
- margin: 32px 7px 0 16px
- }
- }
-
- @media (min-width: 992px) {
- div.allcourses .main-course span.progress-icon.half {
- margin-left: 10px
- }
- }
-
- @media (max-width: 767px) {
- div.allcourses .main-course[class*=assess] {
- height: 180px
- }
-
- div.allcourses .main-course[class*=assess] span.progress-icon {
- margin-top: 5px
- }
-
- div.allcourses .main-course[class*=assess] h2 {
- font-size: 36px;
- line-height: 40px;
- display: inline;
- float: none;
- width: auto;
- margin: 0
- }
-
- div.allcourses .main-course[class*=assess] p {
- max-width: 100%;
- max-height: 100%;
- overflow: visible;
- opacity: 1;
- margin: 0
- }
- }
-`,h1=({data:e})=>{const{name:t,subTitle:r,mainContentImageLink:a,lessons:s}=e.content;return n("div",{className:"section",children:n("div",{className:"row",children:d("div",{className:"col-xs-12",children:[d("div",{className:"respHeaderImgContainer course-headline allcourses-title",children:[d("div",{className:"course-headline-wrapper",children:[n("div",{className:"col-xs-12",children:n("h1",{children:t})}),n("div",{className:"col-xs-12",children:n("p",{children:r})})]}),n(Xe,{imageId:a.targetId,alt:a.name})]}),n(g1,{}),d("div",{className:"allcourses",children:[s.map((o,i)=>n(p1,{lesson:o,index:i},o.id)),n("a",{href:"#",className:"main-course-container hidden-xs",children:n("div",{className:"main-course assess4"})})]})]})})})},f1=B`
- query PlacementTestPage($id: Int!, $lang: Language!) {
- content(id: $id, lang: $lang) {
- ... on Course {
- id
- name
- subTitle
- mainContentImageLink {
- name
- targetId
- }
- lessons {
- subTitle: teaser
- id
- name
- language
- dkLearningLevel
- }
- ...${he.name}
- ${fe.partial()}
- }
- }
- }
- ${he.fragment({type:"Course"})}
-`,E1=()=>{const{langCode:e}=W(),r={id:ea(e),lang:Se(e)};return n(Ne,{children:n(pe,{query:f1,queryVariables:r,children:a=>d(k,{children:[n(le,{pageType:I.PLACEMENT_DASHBOARD,content:a.content,useOnlyCmsKeywords:!0}),n(Ee,{content:a.content}),n(h1,{data:a})]})})})},Ie=Object.freeze({LAST_LESSON:1,LAST_THREE_LESSONS:3,LAST_TEN_LESSONS:10,ALL_LESSONS:0}),Bt=Object.freeze({[Ie.LAST_LESSON]:"vocabularyTrainer.last",[Ie.LAST_THREE_LESSONS]:"vocabularyTrainer.last3",[Ie.LAST_TEN_LESSONS]:"vocabularyTrainer.last10",[Ie.ALL_LESSONS]:"vocabularyTrainer.all"}),x1=({setLastLessonsIds:e,setNumberOfVocabularies:t,handleExerciseStart:r})=>{const[a,s]=c.exports.useState(Ie.LAST_LESSON),{langCode:o}=W(),{i18n:i}=Ge(),l=async m=>{const p=await su(m,o);s(m),e&&e(p)},u=m=>{m.preventDefault(),r&&r()};return c.exports.useEffect(()=>{l(Ie.LAST_LESSON)},[]),d("form",{onSubmit:u,children:[n("div",{className:"headline-container row voc-start",children:n("div",{className:"col-sm-offset-2 col-sm-8 col-lg-offset-3 col-lg-6",children:n("div",{className:"exercise-headline",id:"user-choice",children:n(R,{isA:"p",translation:Bt[a]})})})}),n("div",{className:"row voc-button-stack",id:"button-stack",children:d("div",{className:"col-sm-offset-2 col-sm-8 col-lg-offset-3 col-lg-6",children:[n(xe,{titleKey:"vocabularyTrainer.10words",className:"btn main",handleClick:()=>t(10)}),n(xe,{titleKey:"vocabularyTrainer.30words",className:"btn main",handleClick:()=>t(30)}),n(xe,{titleKey:"vocabularyTrainer.50words",className:"btn main",handleClick:()=>t(50)})]})}),n("div",{className:"row",children:d("div",{className:"col-sm-offset-2 col-sm-8 col-lg-offset-3 col-lg-6 voc-start",children:[n("div",{className:"exercise-headline",children:n("p",{children:n(R,{translation:"vocabularyTrainer.others"})})}),n("div",{className:"form-group",children:d("select",{className:"form-control",id:"vokabel-trainer-select-lecture",name:"country",required:"","aria-label":"select lesson",onChange:m=>l(m.target.value),onBlur:m=>l(m.target.value),children:[n("option",{value:Ie.LAST_LESSON,children:i.t(Bt[Ie.LAST_LESSON])}),n("option",{value:Ie.LAST_THREE_LESSONS,children:i.t(Bt[Ie.LAST_THREE_LESSONS])}),n("option",{value:Ie.LAST_TEN_LESSONS,children:i.t(Bt[Ie.LAST_TEN_LESSONS])}),n("option",{value:Ie.ALL_LESSONS,children:i.t(Bt[Ie.ALL_LESSONS])})]})}),n("div",{className:"need-help-link",children:n(ue,{to:Sa(o),children:n(R,{translation:"vocabularyTrainer.needhelp"})})})]})})]})},v1=({number:e,total:t,top:r,bottom:a,className:s})=>{const{isRtl:o}=De(),i=d("div",{className:"exercise-nav-title rtl",children:[n(R,{isA:"em",translation:"vocabularyTrainer.correct"}),` ${e} `,n(R,{isA:"span",translation:"vocabularyTrainer.outOf"}),n("span",{"data-value":"total",children:` ${t}`})]}),l=d("div",{className:"exercise-nav-title",children:[`${e} `,n(R,{isA:"span",translation:"vocabularyTrainer.outOf"}),n("span",{"data-value":"total",children:` ${t} `}),n(R,{isA:"em",translation:"vocabularyTrainer.correct"})]});return n("div",{className:z("row noVMargins",s),children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n("div",{className:z("exercise-nav",{top:r,bottom:a}),children:o?i:l})})})},oi=_(v1)`
- & div.exercise-nav div.exercise-nav-title.rtl {
- direction: rtl;
- }
-`,y1=({children:e,mainContentImage:t})=>d("div",{className:"bubble-image-container",children:[t&&n(Xe,{imageId:t.id,alt:t.name}),n(je,{content:e,isContainer:!1,className:"bubble image bubble-text-image"})]}),S1=me`
- /* @noflip */
- .alwaysLtr {
- text-align: left;
- direction: ltr;
- }
-`,A1=({vocabulary:{text:e,audios:t,subTitle:r,name:a},onSolved:s,isHidden:o,className:i})=>{const l=c.exports.useRef(),{mp3Src:u,mainContentImage:m}=t[0]||{},[p,f]=c.exports.useState(!1),[v,y]=c.exports.useState(""),[b,A]=c.exports.useState(!1),S=N=>{N.preventDefault(),f(!0),A(!0),u||(y("ending"),s())},x=N=>{N.preventDefault(),l.current.play(),y("playing")},E=()=>{y("ending"),s()};return c.exports.useEffect(()=>{o||(f(!1),y(""),A(!1))},[e,o]),d(k,{children:[n("div",{className:"exercise-questions",children:d("div",{className:z("question-row row",i),dir:"ltr",children:[n("div",{className:"col-sm-offset-1 col-sm-5 col-lg-offset-2 col-lg-4",children:n(y1,{mainContentImage:m,children:e})}),d("div",{className:"col-sm-5 col-lg-4",children:[n(S1,{}),p?d("a",{onClick:x,href:"#",className:z("bubble audio right",v,"alwaysLtr"),"aria-label":"Audio - ",children:[n("audio",{autoPlay:!0,onEnded:E,ref:l,className:"exercise-audio-file initialized",tabIndex:"0",children:n("source",{src:u,type:"audio/mpeg"})}),n("span",{children:a}),r&&n("span",{className:"hint",children:r}),n("div",{className:"exercise-play-audio"})]}):n("div",{className:"answer-multiple-text",children:n("a",{href:"/#",onClick:S,className:"answer-link-container",children:n("div",{className:"answer pronunciation-text-choice",children:"..."})})})]})]})}),!o&&n("div",{className:"row form-group topless",children:n("div",{className:"col-sm-offset-4 col-sm-4 col-lg-offset-4 col-lg-4 col-xs-12 active",children:n(vo,{handleClick:S,isDisabled:b,fullWidth:!0,children:n(R,{translation:"exercise.resolve"})})})})]})},L1=_(A1)`
- & .answer-multiple-text:hover:after {
- -webkit-transition: all 0.3s linear;
- -moz-transition: all 0.3s linear;
- -o-transition: all 0.3s linear;
- transition: all 0.3s linear;
- border-left-color: #0098ff;
- }
- & .bubble .hint {
- display: block;
- font-size: 80%;
- font-style: italic;
- }
-`;function Gr(){return Gr=Object.assign||function(e){for(var t=1;t=0)&&(!Object.prototype.propertyIsEnumerable.call(e,a)||(r[a]=e[a]))}return r}function R1(e,t){if(e==null)return{};var r={},a=Object.keys(e),s,o;for(o=0;o=0)&&(r[s]=e[s]);return r}function C1(e,t){var r=e.title,a=e.titleId,s=b1(e,["title","titleId"]);return c.exports.createElement("svg",Gr({width:"100%",height:"100%",viewBox:"0 0 55 54",xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",xmlSpace:"preserve",style:{fillRule:"evenodd",clipRule:"evenodd",strokeLinejoin:"round",strokeMiterlimit:1.41421},ref:t,"aria-labelledby":a},s),r?c.exports.createElement("title",{id:a},r):null,c.exports.createElement("circle",{className:"dot",cx:27.5,cy:27,r:27,style:{fill:"#A9A094"}}),c.exports.createElement("g",{id:"face"},c.exports.createElement("path",{d:"M26.439,37.092l-11.313,-11.314l-2.829,2.829l11.314,11.313l2.828,-2.828Z",style:{fill:"#fff"}}),c.exports.createElement("path",{d:"M39.874,18l-19.092,19.092l2.829,2.828l19.092,-19.092l-2.829,-2.828Z",style:{fill:"#fff"}})))}var I1=c.exports.forwardRef(C1);function Dr(){return Dr=Object.assign||function(e){for(var t=1;t=0)&&(!Object.prototype.propertyIsEnumerable.call(e,a)||(r[a]=e[a]))}return r}function T1(e,t){if(e==null)return{};var r={},a=Object.keys(e),s,o;for(o=0;o=0)&&(r[s]=e[s]);return r}function N1(e,t){var r=e.title,a=e.titleId,s=w1(e,["title","titleId"]);return c.exports.createElement("svg",Dr({width:"100%",height:"100%",viewBox:"0 0 55 54",xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",xmlSpace:"preserve",style:{fillRule:"evenodd",clipRule:"evenodd",strokeLinejoin:"round",strokeMiterlimit:1.41421},ref:t,"aria-labelledby":a},s),r?c.exports.createElement("title",{id:a},r):null,c.exports.createElement("circle",{className:"dot",cx:27.5,cy:27,r:27,style:{fill:"#A9A094"}}),c.exports.createElement("g",{id:"face"},c.exports.createElement("circle",{cx:18.5,cy:18.5,r:3.5,style:{fill:"#fff"}}),c.exports.createElement("circle",{cx:36.5,cy:18.5,r:3.5,style:{fill:"#fff"}}),c.exports.createElement("path",{d:"M40.902,32.312l-26.41,5.613l0.624,2.935l26.41,-5.614l-0.624,-2.934Z",style:{fill:"#fff"}})))}var _1=c.exports.forwardRef(N1);const O1=_(I1)``,P1=_(_1)``,$1=({handleCorrectAnswer:e,handleWrongAnswer:t,className:r})=>{const a=Object.freeze({INITIAL:"initial",WRONG:"wrong",CORRECT:"correct"}),{isRtl:s}=De(),[o,i]=c.exports.useState(a.INITIAL),l=m=>{m.preventDefault(),i(a.CORRECT),e()},u=m=>{m.preventDefault(),i(a.WRONG),t()};return d("div",{className:z("smileys-ltr",r,{isRtl:s}),children:[n("div",{className:"col-xs-offset-3 col-xs-3 col-sm-offset-4 col-sm-2 col-lg-offset-5 col-lg-1",children:n("a",{href:"#",className:z("smileys",o===a.CORRECT?"fine":null),onClick:l,children:n(O1,{})})}),n("div",{className:"col-xs-offset-0 col-xs-3 col-sm-offset-0 col-sm-2 col-lg-offset-0 col-lg-1",children:n("a",{href:"#",className:z("smileys",o===a.WRONG?"notsogood":null),onClick:u,children:n(P1,{})})})]})},k1=_($1)`
- @media (min-width: 768px) {
- &.isRtl .col-lg-offset-5 {
- margin-right: 0;
- margin-left: 33.3333%;
- }
- }
-`,xn=Object.freeze({INITIAL:"initial",BUSY:"busy",READY:"ready"}),G1=({delay:e})=>{const[t,r]=c.exports.useState({status:xn.INITIAL});gt({callback:()=>{t.status===xn.BUSY&&t.onTransitionEnd(),r({status:xn.READY})},delay:e},[t]);const a=s=>{r(T(h({},s),{status:xn.BUSY}))};return{transitionStatus:t.status,startTransition:a}},D1=({vocabularies:e,handleExerciseEnd:t,className:r})=>{const[a,s]=c.exports.useState(!1),[o,i]=c.exports.useState(0),[l,u]=c.exports.useState(e),m=ge(),{langCode:p}=W(),f=x=>{const E=x.slice(1);u(E),s(!1),E.length||t()},{transitionStatus:v,startTransition:y}=G1({delay:300});c.exports.useEffect(()=>{e.length===0&&m.push(ne(F.VOCABULARY_TRAINER_NO_VOCABULARIES,p))},[m,p,e.length]);const b=()=>{s(!0)},A=()=>{y({onTransitionEnd:()=>f(l)}),i(x=>x+1)},S=()=>{const x=[...l,l[0]];y({onTransitionEnd:()=>f(x)})};return l.length?d("div",{className:z("section exercise-container ltr-container",r,v),children:[n(oi,{top:!0,number:o,total:e.length}),n(L1,{vocabulary:l[0],onSolved:b,isHidden:a}),a&&n("div",{className:"row form-group topless",children:n(k1,{handleCorrectAnswer:A,handleWrongAnswer:S})}),n(oi,{bottom:!0,number:o,total:e.length})]}):null},M1=_(D1)`
- &.busy {
- opacity: 0;
- }
- &.ready {
- opacity: 1;
- }
- & {
- opacity: 0;
- -webkit-transition: opacity 0.3s ease;
- -moz-transition: opacity 0.3s ease;
- -o-transition: opacity 0.3s ease;
- transition: opacity 0.3s ease;
- }
-`,ii={field:"knowledgeType",operator:"match",value:"VOCABULARY"},li=(e,t)=>e?[ii,{field:t,operator:"match",value:e}]:[ii],vn=({langCode:e,offset:t=0,amount:r=12,searchQuery:a,sort:s=!0})=>({lang:Se(e),offset:t,amount:r,originalCondition:li(a,"name_partial"),translationCondition:li(a,"text_partial"),sort:!a&&s?[{field:"name_not_analyzed",order:"ASC"}]:[]}),ci={name:"vocabularyFragment",fragment(){return B`
- fragment ${this.name} on Knowledge {
- id
- text
- name
- subTitle
- }
- `}},U1={name:"searchResult",fragment(){return B`
- fragment ${this.name} on SearchResult {
- totalHits
- amount
- offset
- hits {
- ...vocabularyFragment
- }
- }
- ${ci.fragment()}
- `}},di=e=>`${e}: findContents(
- lang: $lang
- types: [KNOWLEDGE]
- offset: $offset
- amount: $amount
- must: $${e}Condition
- should: []
- mustNot: []
- sort: $sort
- ) {
- ...searchResult
- }
- `,ui=B`
- query VocabularySearch(
- $lang: Language!, $offset: Int!
- $amount: Int!
- $originalCondition: [QueryConditionInput!]
- $translationCondition: [QueryConditionInput!]
- $sort: [QuerySortInput!]
- ) {
- ${di("original")}
- ${di("translation")}
- }
- ${U1.fragment()}
- `,B1=B`
- query VocabularyTrainer($keys: [ContentKeyInput]!, $lang: Language!) {
- contents(keys: $keys, lang: $lang) {
- ... on Lesson {
- id
- vocabularies {
- ...vocabularyFragment
- audios {
- mp3Src
- mainContentImage {
- id
- name
- }
- }
- }
- }
- }
- }
- ${ci.fragment()}
-`,F1=(e,t)=>({keys:e.map(r=>({id:r,type:"LESSON"})),lang:Se(t)}),W1=()=>{const[e,t]=c.exports.useState([]),[r,a]=c.exports.useState(0),[s,o]=c.exports.useState(!1),{langCode:i}=W(),l=Nt(),u=ge(),m=()=>{o(!0)},p=()=>{o(!1)};c.exports.useEffect(()=>{l.pathname.includes(On)&&(o(!1),t([]),u.replace(zc(i))),s&&!e.length&&u.push(ne(F.VOCABULARY_TRAINER_NO_VOCABULARIES,i))},[u,i,e.length,s,l.pathname]);const f=({contents:v})=>{const y=v.map(A=>A?A.vocabularies:[]).flat(1),b=Array.from(new Set(y));return wn(b).slice(0,r)};return s?n(pe,{query:B1,queryVariables:F1(e,i),children:v=>n(M1,{vocabularies:f(v),handleExerciseEnd:p})}):n(x1,{setLastLessonsIds:t,setNumberOfVocabularies:a,handleExerciseStart:m})},V1=B`
- fragment PlacementResult on Course {
- id
- name
- language
- dkLearningLevel
- }
-`,H1=e=>{const t=[];return Object.keys(st).forEach(r=>{const a=e.find(s=>s.dkLearningLevel===+r);a&&t.push(a)}),t},K1=({data:e})=>{const{lesson:t,course:r,dkCourses:a}=e,{dkLearningLevel:s}=r,o=H1(a),{dwLinks:i,id:l,name:u,overviewParts:m,dkLearningLevel:p}=t,{id:f,name:v,contentLinks:y}=r,b=Le();c.exports.useEffect(()=>{b(za(l))},[]);const A=ge(),{isLoggedIn:S}=J(Ue),{langCode:x}=W(),E=J(Ot(l)),{maxPointsForAllExercises:N=0,resultPoints:$=0,finalTest:w}=E||{},L=Nn(f),O=qs({lessonContentLinksFromCourse:y,currentLessonId:l}),U=st[O?s:p]||"A1",V=Yt($,N),re=()=>V>=dt.GOOD?"veryGood":V>=dt.MEDIUM?"good":V>=dt.BAD?"bad":"veryBad",ae=(()=>{if(V<=dt.MEDIUM)return U;const j=Object.values(st),we=j.indexOf(U);return j[we+1]||U})(),P=()=>{const j=o.find(we=>st[we.dkLearningLevel]===ae);return j?pt(j):null},G=async()=>{await Ns({id:l,langCode:x,history:A})},M=P(),oe=S&&w&&V>=dt.MEDIUM,ve=mr(m),Fe=jt(x,l,Ae(ve[0].target.name),ve[0].targetId);return d(k,{children:[n(()=>O?n(le,{pageType:I.FINAL_TEST,content:t,translationFirst:!0}):L?n(le,{pageType:I.PLACEMENT_TEST}):n(le,{}),{}),n(Ee,{content:t}),n(Xs,{lessonId:l,lessonName:u,lessonOverviewParts:m,firstExercisePath:Fe,courseId:f,courseName:v,isFromPlacementCourse:L,isFinalTest:O}),n("div",{className:"section",children:n("div",{className:"row",children:n("div",{className:"col-xs-12",children:d("div",{className:"section exercise-container copy",children:[n("div",{className:"row breakout",children:n("div",{className:"col-xs-12 col-lg-offset-2 col-lg-8",children:n("div",{className:"result-headline score",children:n(Tr,{lessonId:l,showTitle:!1})})})}),n(at,{children:n(R,{isA:"p",translation:`placementTest.${U}.${re()}`})}),oe&&n("div",{className:"row noVMargins",id:"courseCertificateDiv",children:n("div",{className:"col-xs-offset-2 col-xs-8 col-sm-offset-4 col-sm-4",children:n(R,{isA:"button",translation:"course.certificate",onClick:G,className:"btn secondary"})})}),M&&d(k,{children:[n("div",{className:"row breakout",children:n("div",{className:"col-xs-12 col-lg-offset-2 col-lg-8",children:d("div",{className:"result-headline recommendation",children:[n(R,{translation:"placementTest.recommendation",isA:"p"}),n("h1",{children:ae})]})})}),n("div",{className:"row noVMargins",children:n("div",{className:"col-xs-offset-2 col-xs-8 col-sm-offset-4 col-sm-4",children:n(ue,{to:M,className:"btn main",children:n(R,{translation:"common.next"})})})})]}),i&&i.length>0&&n(mn,{title:"placementTest.moreStuff",children:i.map(j=>j.name.includes(ae)?d("div",{children:[n("p",{className:"grammarLink",children:n("a",{href:vc(T(h({},j),{langCode:x})),children:j.name})}),n("p",{className:"grammarLinkText",children:j.description})]},j.id):"")})]})})})})]})},Y1=({handicap:e})=>B`
- query PlacementResultPage($id: Int!, $lessonIdString: String!, $amount: Int!, $lang: Language!, $type: ModelType!) {
- lesson: content(id: $id, lang: $lang) {
- ... on Lesson {
- id
- name
- dkLearningLevel
- dwLinks: contentLinks(targetTypes: [NAVIGATION]) {
- id: targetId
- description
- name
- }
- }
- ...${`PlacementOverviewParts${e||""}`}
- ...${he.name}
- ${fe.partial()}
- }
-
- dkCourses: contentsByType(
- type: $type
- lang: $lang
- amount: $amount
- filters: { field: "dkLearningLevel", value: ["2", "4"] }
- ) {
- ...PlacementResult
- }
-
- dkCoursesInGerman: contentsByType(
- type: $type
- lang: GERMAN
- amount: $amount
- filters: { field: "dkLearningLevel", value: ["8"] }
- ) {
- ...PlacementResult
- }
-
- currentCourse: contentsByType(
- lang: $lang
- type: COURSE
- amount: 1
- filters: { field: "contentLinks.targetId", value: [$lessonIdString] }
- ) {
- ... on Course {
- id
- name
- dkLearningLevel
- contentLinks(targetTypes: LESSON) {
- targetId
- additionalInformation
- }
- }
- }
- }
- ${qo.fragment({scope:"Placement",handicap:e})}
- ${V1}
- ${he.fragment({type:"Lesson"})}
-`,mi=({contentId:e})=>{const{langCode:t}=W(),{handicap:r}=J(ft)||{},a={amount:10,id:+e,lessonIdString:e,lang:Se(t),type:"COURSE"};return n(Ne,{children:n(pe,{query:Y1({handicap:r}),queryVariables:a,children:s=>n(K1,{data:{dkCourses:[...dr(s.dkCourses),...dr(s.dkCoursesInGerman)],lesson:s.lesson,course:s.currentCourse[0]}})})})},pi={name:"Help",fragment(){return B`fragment ${this.name} on Article {
- id
- shortTitle
- text
- }
- `}},j1=({className:e,help:t})=>{ps({});const{shortTitle:r,text:a}=t;return d("div",{className:e,children:[n("div",{id:"page-header-container",children:n("h1",{children:r})}),n(je,{className:"content",content:a})]})},z1=_(j1)`
- .content {
- margin: 10px;
- }
-`,q1=B`
- query HelpPage($lang: Language!) {
- help(lang: $lang, appName: "mdl") {
- ...${pi.name}
- ${fe.partial()}
- }
- }
- ${pi.fragment()}
-`,X1=()=>{const{langCode:e}=W(),t={lang:Se(e)};return n(Ne,{children:n(pe,{query:q1,queryVariables:t,children:({help:r})=>d(k,{children:[n(le,{pageType:I.HELP,useDescriptionTranslation:!0}),n(Ee,{content:r}),n(z1,{help:r})]})})})},Z1=B`
- query footer($lang: Language!) {
- footer(lang: $lang) {
- ${gs.partial()}
- ${fe.partial()}
- }
- }
-`,Q1=()=>{const{langCode:e}=W(),t={lang:Se(e)};return n(Ne,{children:n(pe,{query:Z1,queryVariables:t,children:({footer:r})=>d(k,{children:[n(le,{pageType:I.LEGAL,useDescriptionTranslation:!0}),n(Ee,{content:r}),n(om,{legal:r.legal})]})})})};function J1(e,t){const[r,a]=c.exports.useState(e);return c.exports.useEffect(()=>{const s=setTimeout(()=>{a(e)},t);return()=>{clearTimeout(s)}},[t,e]),r}const eE=38,tE=40,nE=13,rE=27,aE=8,kE=Object.freeze({TAB:"Tab",ENTER:"Enter",SPACEBAR:" ",ARROW_LEFT:"ArrowLeft",ARROW_RIGHT:"ArrowRight",ESCAPE:"Escape"}),gi="TYPE_SET_INPUT",hi="TYPE_GET_CACHED_RESULTS",fi="TYPE_RESET_CURSOR_AND_SET_HINTS_DATA",Ei="TYPE_SET_HINTS_OPENED",xi="TYPE_SET_HINTS_CLOSED",vi="TYPE_SET_CURSOR_ARROW_UP",yi="TYPE_SET_CURSOR_ARROW_DOWN",Si="TYPE_KEY_ESCAPE_CLICKED",Ai="TYPE_KEY_BACKSPACE_CLICKED",Li="TYPE_KEY_ANY_CLICKED",bi="TYPE_ITEM_CLICKED",Ri="TYPE_KEY_ENTER_CLICKED",sE=(e,t)=>{switch(t.type){case hi:return T(h({},e),{vocabularyItems:e.recentlySearched.get(e.input),isOpened:!e.isEscapeClicked&&!e.isEnterClicked&&e.recentlySearched.get(e.input)?e.recentlySearched.get(e.input).length>0:!1,isEscapeClicked:!1,isEnterClicked:!1});case fi:{const{response:r,searchQuery:a}=t.payload;return T(h({},e),{vocabularyItems:r?r.slice(0,Math.min(8,r.length)):[],recentlySearched:e.recentlySearched.set(a,r||[]),cursor:-1,isOpened:!e.isEnterClicked&&!e.isEscapeClicked&&r?r.length>0:!1})}case Ei:return T(h({},e),{isOpened:!0});case xi:return T(h({},e),{isOpened:!1});case gi:return h(h({},e),t.payload);case vi:{const r=e.cursor===-1?e.vocabularyItems.length-1:(e.cursor-1)%e.vocabularyItems.length;return T(h({},e),{isOpened:!0,cursor:r,input:e.vocabularyItems[r!==-1?r:0]})}case yi:{const r=(e.cursor+1)%e.vocabularyItems.length;return T(h({},e),{isOpened:!0,cursor:r,input:e.vocabularyItems[r]})}case Si:return T(h({},e),{cursor:-1,input:"",isOpened:!1,isEscapeClicked:!0,vocabularyItems:[]});case Ai:return T(h(h({},e),t.payload),{cursor:-1,vocabularyItems:t.payload.input===""?[]:e.vocabularyItems,isEnterClicked:!1,isEscapeClicked:!1});case bi:return T(h(h({},e),t.payload),{cursor:-1,isOpened:!1});case Li:return T(h(h({},e),t.payload),{cursor:-1,isOpened:!0});case Ri:return T(h(h({},e),t.payload),{cursor:-1,isOpened:!1,isEnterClicked:!0});default:return e}},Mr=e=>{const t=[...e.original.hits,...e.translation.hits.map(a=>T(h({},a),{translation:!0}))],r=new Set;return t.filter(a=>r.has(a.id)?!1:(r.add(a.id),!0),r)},oE=(e,t)=>{c.exports.useEffect(()=>{e.recentlySearched.get(e.input)&&e.cursor===-1&&t({type:hi})},[e.searchQuery,e.cursor])},iE=(e,t,r,a)=>{const{langCode:s}=W();c.exports.useEffect(()=>{if(e){const{searchQuery:o}=t;t.recentlySearched.get(e)||a(vn({langCode:s,searchQuery:o,sort:!1})).then(i=>r({type:fi,payload:{searchQuery:e,response:Mr(i.data)}}))}},[e])},Ci=new RegExp("[^\\p{L} @]","gui"),lE=({className:e,onItemSelected:t})=>{const{langCode:r}=W(),{refetch:a}=Wr(ui,{variables:vn({langCode:r})}),[s,o]=c.exports.useReducer(sE,{input:"",searchQuery:"",vocabularyItems:[],cursor:-1,isOpened:!1,recentlySearched:new Map,isEscapeClicked:!1,isEnterClicked:!1,amount:6,offset:0}),{isRtl:i}=De(),l=te("vocabularyOverview.placeholder"),u=te("vocabularyOverview.aria"),{isOpened:m,input:p,cursor:f,vocabularyItems:v,searchQuery:y}=s,b=J1(y,350);oE(s,o),iE(b,s,o,a);const A=c.exports.useRef(null),S=()=>{o({type:Ei})},x=()=>{o({type:xi})},E=U=>{const V=U.target.tagName==="STRONG"?U.target.parentNode:U.target,{textContent:re}=V;o({type:bi,payload:{input:re}}),t(re)},N=U=>{switch(U.keyCode){case eE:o({type:vi});break;case tE:o({type:yi});break;case nE:const V=p;t(V),o({type:Ri,payload:{searchQuery:V}});break;case rE:o({type:Si});break;case aE:o({type:Ai,payload:{input:U.target.value,searchQuery:U.target.value}});break;default:o({type:Li,payload:{input:U.target.value,searchQuery:U.target.value}})}},$=y.replace(Ci),w=new RegExp(`((?:(?:\\p{P}|\\p{Z} )*)((\\p{L}*)${$}(\\p{L}*))(?:(?:\\p{P}|\\p{Z} )*))`,"imu"),L=v.map(U=>{const V=U.translation?U.text.replace(/<[^>]*>?/gm,"").trim():U.name,re=w.exec(V);return re?re[2]:null}).filter(U=>!!U),O=[...new Set(L)],H=U=>U.replace(new RegExp(y.replace(Ci,""),"gi"),V=>`${V} `);return n("div",{className:e,role:"search",children:n("div",{className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:n("div",{id:"the-basics",className:i?"rtl":"",children:d("span",{className:"twitter-typeahead",children:[n("input",{type:"search",className:"form-control input-lg typeahead tt-input",id:"search-vocabulary",placeholder:l,"aria-labelledby":u,autoComplete:"off",dir:"auto",value:p,onChange:U=>o({type:gi,payload:{input:U.target.value}}),onKeyUp:N,onBlur:x,onFocus:S,ref:A}),n("div",{className:z("tt-menu",{"tt-open":m}),children:n("div",{className:"tt-dataset tt-dataset-vocabularies",children:O&&O.length>0&&O.map((U,V)=>n("div",{id:V,className:`override-strong tt-suggestion tt-selectable ${f===V&&"tt-cursor"}`,onMouseDown:E,dangerouslySetInnerHTML:{__html:H(U)}},V))})})]})})})})},cE=_(lE)`
- .tt-menu {
- visibility: hidden;
- }
-
- .tt-open {
- visibility: visible;
- }
-
- .twitter-typeahead {
- position: relative;
- display: inline-block;
- }
-`,dE=({handleClick:e,style:t})=>n("div",{className:"row",style:t,children:n("div",{className:"col-xs-offset-2 col-xs-8 col-sm-offset-4 col-sm-4 col-lg-offset-5 col-lg-2",children:n("div",{className:"exercise-check",children:n(xe,{handleClick:e,titleKey:"vocabularyOverview.more"})})})}),uE=({item:e})=>d("div",{className:"row vocabulary",children:[n("div",{className:"col-sm-offset-1 col-sm-3 col-lg-offset-2 col-lg-3 vocabulary-entry",children:n("div",{className:"richtext-content-container",children:d("p",{children:[n("span",{dir:"auto",children:n("strong",{children:e.name})}),n("br",{}),e.subTitle]})})}),n("div",{className:"col-sm-3 col-lg-2 vocabulary-entry",children:n("div",{className:"richtext-content-container"})}),n("div",{className:"col-sm-4 col-lg-3 vocabulary-entry",children:n("div",{className:"richtext-content-container",dangerouslySetInnerHTML:{__html:e.text}})})]}),mE=({data:e,refetch:t})=>{const{langCode:r}=W(),[a,s]=c.exports.useState(0),[o,i]=c.exports.useState(Mr(e)),[l,u]=c.exports.useState(!1),[m,p]=c.exports.useState(""),f=v=>{t(vn({langCode:r,offset:a,searchQuery:m})).then(y=>{const b=Mr(y.data);i(v?A=>[...A,...b]:b),u(b.length>0),b.length>0&&s(A=>A+12)})};return c.exports.useEffect(()=>{f()},[m]),n("div",{className:"section",children:n("div",{className:"row",children:d("div",{className:"col-xs-12",children:[d("div",{className:"section exercise-container",children:[n(at,{}),n("div",{className:"row",children:n(cE,{onItemSelected:v=>{s(0),p(v)}})})]}),n("header",{children:d("div",{className:"section exercise-container vocabulary copy",children:[n("div",{className:"vocabularies",children:o.map(v=>n(uE,{item:v},v.id))}),n("div",{style:{visibility:l?"hidden":"visible"},className:"col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8",children:d("div",{className:"exercise-hint",children:[n("span",{className:"hint",children:n(gr,{})}),n(R,{translation:"vocabularyOverview.noMoreVocabularies"})]})}),n(dE,{style:{visibility:l?"visible":"hidden"},handleClick:()=>f(!0)})]})})]})})})},pE=()=>{const{langCode:e}=W(),t=vn({langCode:e});return n(Ne,{children:n(pe,{query:ui,queryVariables:t,children:(r,a)=>d(k,{children:[n(le,{pageType:I.VOCABULARY_OVERVIEW}),n(Ee,{noContentPageId:Et.VOCABULARY_OVERVIEW}),n(mE,{data:r,refetch:a})]})})})},gE={COURSE:{type:"Course",component:eg},GRAMMAR:{type:"Grammar",component:mg},LESSON:{type:"Lesson",component:Xo},PLACEMENT:{type:"Placement",component:mi},FINAL:{type:"Final",component:mi}},hE=()=>{const e=W(),t=gE[dc(e.typeId)],r=t.component;return n(r,T(h({},e),{type:t.type}))},fE=()=>d(Fi,{children:[n(se,{exact:!0,path:"/",render:()=>n(Vr,{to:{pathname:"/en/overview"}})}),n(se,{exact:!0,path:`/:langCode(${ee.langCodeRegex})${ta}`,component:Tg}),n(se,{path:`/:langCode(${ee.langCodeRegex})/:title(${ee.titlePathRegex})?/l-:lessonId(${ee.contentIdRegex})`,component:Xo}),n(se,{path:`/:langCode(${ee.langCodeRegex})/:title(${ee.titlePathRegex})?/:typeId(${ee.contentTypeRegex})-:contentId(${ee.contentIdRegex})`,component:hE}),n(se,{exact:!0,path:`/:langCode(${ee.langCodeRegex})${sa}`,component:Fg}),n(se,{exact:!0,path:`/:langCode(${ee.langCodeRegex})/help`,component:X1}),n(se,{exact:!0,path:`/:langCode(${ee.langCodeRegex})${ia}`,component:Q1}),n(se,{exact:!0,path:`/:langCode(${ee.langCodeRegex})${oa}`,component:pE}),n(se,{exact:!0,path:`/:langCode(${ee.langCodeRegex})${Ac}`,render:()=>vt({component:Q0,pageType:I.REGISTER_USER,useDescriptionTranslation:!0})}),n(se,{path:`/:langCode(${ee.langCodeRegex})/user/password/set`,render:({location:e})=>d(Ne,{children:[n(le,{pageType:I.PASSWORD_SET,addKeywordsAndDescription:!1}),n(ir,{noContentPageId:Et.PASSWORD_SET}),n(m1,{confirmationId:new URLSearchParams(e.search).get("confirmationId")})]})}),n(se,{path:`/:langCode(${ee.langCodeRegex})/user/register/confirm`,render:({location:e})=>n(V0,{confirmationId:new URLSearchParams(e.search).get("confirmationId")})}),n(Nr,{path:`/:langCode(${ee.langCodeRegex})${_n}`,render:()=>vt({component:u1,pageType:I.USER_PROFILE,addDescriptionAndKeywordsMeta:!1}),feedbackType:F.MISSING_USER_PROFILE}),n(Nr,{exact:!0,path:`/:langCode(${ee.langCodeRegex})${na}`,render:()=>vt({component:i1,pageType:I.PASSWORD_CHANGE,addDescriptionAndKeywordsMeta:!1})}),n(Nr,{exact:!0,path:[`/:langCode(${ee.langCodeRegex})${ra}`,`/:langCode(${ee.langCodeRegex})${On}`],render:()=>vt({component:W1,pageType:I.VOCABULARY_TRAINER,addDescriptionAndKeywordsMeta:!1})}),n(se,{exact:!0,path:`/:langCode(${ee.langCodeRegex})${Lc}`,render:()=>vt({component:l1,pageType:I.PASSWORD_RESET,addDescriptionAndKeywordsMeta:!1})}),n(se,{exact:!0,path:`/:langCode(${ee.langCodeRegex})${aa}/:feedbackType(${ee.feedbackTypes})`,render:()=>vt({component:c1,pageType:I.FEEDBACK_STATUS,addDescriptionAndKeywordsMeta:!1})}),n(se,{exact:!0,path:`/:langCode(${ee.langCodeRegex})${la}`,component:E1}),n(se,{exact:!0,path:`/:langCode(${ee.langCodeRegex})`,component:Rs}),n(se,{component:Rs})]}),EE={ModelAspect:["Exercise","Knowledge","Article","Category","Course","Subject","GeographicLocation","Lesson","Navigation","Person","Image","Audio","Video","Widget","Livestream","Download","Keyword","ImageGallery","GalleryImage","GeographicRegion","ExternalLink","PhysicalImage","ContentComposition","InformationSpace","CompositionComponent","CompositionComponentConfiguration"],DeliveryAspect:["Exercise","Knowledge","Article","Category","Course","Lesson","Navigation","Person","Image","Audio","Video","Widget","ImageGallery","GeographicRegion","ContentComposition"],NamedAspect:["Exercise","Knowledge","Article","Category","Course","Subject","GeographicLocation","Lesson","Navigation","Person","Image","Audio","Video","Widget","Livestream","Download","Keyword","ImageGallery","GalleryImage","GeographicRegion","ExternalLink","ContentComposition","InformationSpace"],AssociationsAspect:["Exercise","Knowledge","Article","Course","Lesson","Navigation","Person","Image","Audio","Video","Widget","ImageGallery","GalleryImage"],TextualAspect:["Article","Person","Audio","Video","ImageGallery"],ContactAspect:["Article","Person","Audio","Video","ImageGallery"],MetadataAspect:["Article","Audio","Video","ImageGallery"],DkMetadataAspect:["Article"],GeographicLocationAspect:["GeographicLocation"],TreeAspect:["Category","Navigation","GeographicRegion"],DeletionAspect:["Image","Audio","Video"],PlaybackResourceAspect:["Audio","Video"],BinaryDataAspect:["Download","PhysicalImage"],SocialMediaAspect:["Article","Audio","Video","ImageGallery"],FooterAspect:["Article","Navigation","Person","Audio","Video","ImageGallery"],BetaLayerAspect:["Article","Navigation","Person","Audio","Video","ImageGallery"],UrlAspect:["Article","Navigation","Person","Audio","Video","ImageGallery"],PersonRelatedContent:["Article","Audio","Video","Image","ImageGallery"],Content:["Article","Category","Subject","GeographicLocation","Navigation","Person","Image","Audio","Video","Widget","Livestream","Download","Keyword","ImageGallery","GalleryImage","GeographicRegion","CocoContent"]},xE=Wi({user:Nu,learnProgress:Lu,lessonExerciseMode:g0}),vE=({dispatch:e})=>t=>r=>{if(t(r),r.type!==Ta)return;const{url:a,method:s,data:o,onSuccess:i,onFailure:l,headers:u}=r.payload,m=["GET","DELETE"].includes(s)?"params":"data";fetch(a,{method:s,headers:u,[m]:o}).then(p=>{const f=p.headers.get("content-type");return f&&f.indexOf("application/json")!==-1?p.json():{}}).then(p=>{e(i(p))}).catch(p=>{e(l(p))})},yE=zi(xE),Ii=Vi("learngerman"),SE=Hi(Ii),AE=q.window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__||Ki,LE=AE(Yi(vE,qi,SE))(ji),wi=LE(yE),bE=Xi(Ii);be()||bE(wi);const RE=new Zi({possibleTypes:EE,addTypename:!0}),CE=Qi({sha256:Ji,useGETForHashedQueries:!0}).concat(el({uri:Ve.graphQL.baseUrl})),IE=new tl({link:CE,ssrForceFetchDelay:100,cache:RE.restore(window.__APOLLO_STATE__)});Wt.render(n(nl,{client:IE,children:n(rl,{store:wi,children:n(al,{children:n(sl,{children:n(fE,{})})})})}),document.getElementById("root"));il();export{PE as S,NE as a,g as c,kE as k,_E as m,$E as n,OE as s,te as u};
-//# sourceMappingURL=index.962b7ca8.js.map
diff --git a/sources-gen/dist/assets/index.962b7ca8.js.map b/sources-gen/dist/assets/index.962b7ca8.js.map
deleted file mode 100644
index e3d13e7..0000000
--- a/sources-gen/dist/assets/index.962b7ca8.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.962b7ca8.js","sources":["../../vite/modulepreload-polyfill","../../serviceWorker.jsx","../../utils/css.jsx","../../assets/svg/dw-logo.svg.js","../../assets/icons/DwLogo.jsx","../../assets/svg/dw-claim.svg.js","../../assets/icons/DwClaim.jsx","../../components/Logo/Logo.jsx","../../components/Header/DesktopBanner.jsx","../../assets/svg/dw-logo-tablet.svg.js","../../assets/svg/dw-logo-mobile.svg.js","../../components/Text/Text.jsx","../../utils/jsonPath.jsx","../../utils/i18n.jsx","../../context/I18nContext.jsx","../../hooks/useTranslation.jsx","../../context/rtlContext.jsx","../../hooks/useRtl.jsx","../../components/I18n/I18nText.jsx","../../components/Header/MobileBanner.jsx","../../hooks/useToggle.jsx","../../assets/svg/icon-user-navi.svg.js","../../assets/svg/icon-language-world-w.svg.js","../../assets/svg/tick.svg.js","../../utils/ssr.jsx","../../constants/userUrl.jsx","../../constants/feedback.jsx","../../utils/commons.jsx","../../utils/mappers/langMapper.jsx","../../utils/globals.jsx","../../config.jsx","../../utils/url/url.jsx","../../utils/mappers/placementTestCourseIds.jsx","../../utils/url/urlFactory.jsx","../../hooks/useLocalStorage.jsx","../../constants/menuLanguageCodes.jsx","../../hooks/useTimeout.jsx","../../hooks/useScripts.jsx","../../hooks/useChineseSimpleTraditionalSwitch.jsx","../../components/NavMenu/LanguageSelectionButton/LanguageSelectionButton.jsx","../../state/common/apiActions.jsx","../../constants/services.jsx","../../utils/url/urlUtils.jsx","../../utils/userUtils.jsx","../../services/userService.jsx","../../state/progress/utils.jsx","../../state/progress/serverDataFilterUtils.jsx","../../state/progress/learnProgress.jsx","../../services/learnProgressService.jsx","../../state/progress/learnProgressDuck.jsx","../../state/user/userDuck.jsx","../../state/user/userSelectors.jsx","../../context/GlobalsContext.jsx","../../components/NavMenu/NavMenu.jsx","../../assets/svg/nav-cross-black-md.svg.js","../../assets/svg/nav-cross-black-lg.svg.js","../../assets/svg/nav-cross-xs.svg.js","../../assets/svg/nav-cross-lg.svg.js","../../components/IconBar/IconBar.jsx","../../components/BurgerButton/BurgerButton.jsx","../../components/Header/NavigationContainer/OnlyDesktopBrand.jsx","../../components/Header/ChineseVariantSwitch.jsx","../../components/Header/NavigationContainer/NavigationContainer.jsx","../../components/Header/Header.jsx","../../components/RichText/RichText.jsx","../../utils/imgUtils.jsx","../../hooks/useFrontendConfig.jsx","../../components/Picture/Picture.jsx","../../components/DwPicture/DwPicture.jsx","../../utils/replacers/replaceCommons.jsx","../../utils/replacers/imageReplacer.jsx","../../utils/replacers/useImagePlaceholderReplacementEffect.jsx","../../components/ContentContainer/ContentHeadline/ContentHeadline.jsx","../../components/LegalNotice/LegalNotice.jsx","../../components/Footer/Footer.jsx","../../components/commons/LoadingMessage.jsx","../../components/commons/ErrorMessage.jsx","../../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling.jsx","../../hooks/useMetadata.jsx","../../components/I18n/I18nConfigLoader.jsx","../../components/GdprLayer/BrowserOnly.jsx","../../components/GdprLayer/GdprLayer.jsx","../../constants/pageTypes.jsx","../../utils/pageMetadata.jsx","../../hooks/useMetaTitle.jsx","../../hooks/useMetaDescription.jsx","../../hooks/useMetaKeywords.jsx","../../components/Page/PageMetaData.jsx","../../utils/url/feedbackHelpers.jsx","../../hooks/useValidateTicketAndLoginUser.jsx","../../hooks/useRedirectAfterLogOut.jsx","../../components/Page/PageLayout.jsx","../../hooks/useLocationGetter.jsx","../../hooks/useCheckSessionTimeout.jsx","../../utils/mappers/rtlLanguages.jsx","../../state/progress/learnProgressSelectors.jsx","../../hooks/useSyncLessonProgress.jsx","../../assets/images/bg-dw-desktop.jpg","../../assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff","../../assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff2","../../assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff","../../assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff2","../../assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff","../../assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff2","../../pages/MainPage.jsx","../../components/GoogleTagManager/GtmLoadScript.jsx","../../components/GoogleTagManager/GtmNoScriptFallback.jsx","../../hooks/useLocationQueryParam.jsx","../../components/GoogleTagManager/hooks/useStaticInfoForGtm.jsx","../../components/GoogleTagManager/TrackingUtils.jsx","../../hooks/useCourseData.jsx","../../components/GoogleTagManager/GtmDataLayer.jsx","../../components/GoogleTagManager/GtmScriptWithDataLayer.jsx","../../components/GoogleTagManager/index.jsx","../../components/Page/PageContainer.jsx","../../pages/Default404Page.jsx","../../constants/isLtrContentOnly.jsx","../../components/HeroTemplate/HeroTemplate.jsx","../../components/Course/CourseHeroImage/CourseHeroImage.jsx","../../assets/svg/toggleableArrow.svg.js","../../assets/icons/ToggleableArrowIcon.jsx","../../components/ToggleableArrow/ToggleableArrow.jsx","../../components/Course/CourseList/CourseHeader/CourseHeader.jsx","../../components/Course/CourseList/LessionItem/LessonScore.jsx","../../components/Course/Progress/ProgressResetButton.jsx","../../components/ProgressIcon/progressIconColors.jsx","../../components/ProgressIcon/ProgressIcon.jsx","../../services/certificateService.jsx","../../utils/certificateUtils.jsx","../../assets/svg/icon-course-cert-gray.svg.js","../../components/ProgressIcon/CertificateIcon.jsx","../../assets/svg/star-white.svg.js","../../assets/svg/star-gray.svg.js","../../components/ProgressIcon/ProgressIconStar.jsx","../../components/LearnProgressIcon/LearnProgressIcon.jsx","../../components/Course/CourseList/LessionItem/LessonItem.jsx","../../components/Course/CourseList/LessonList/LessonList.jsx","../../components/Course/CourseList/CourseAccordion/CourseAccordion.jsx","../../components/Course/CourseList/CourseList.jsx","../../components/Modal/DisableScrollingStyles.jsx","../../components/Modal/ModalIntegration.jsx","../../components/StandardButton/StandardButton.jsx","../../components/Modal/Modal.jsx","../../components/Modal/ResetModal.jsx","../../components/Course/Progress/CourseProgress.jsx","../../utils/learningLevelUtils.jsx","../../components/Course/CourseOverview.jsx","../../components/ImageOGMetaData/ImageOGMetaData.jsx","../../pages/CoursePage.jsx","../../utils/replacers/htmlReplacer.jsx","../../components/WithRenderDelay/WithRenderDelay.jsx","../../components/Modal/KnowledgeModal/KnowledgeModal.jsx","../../components/Modal/KnowledgeModal/Knowledge.jsx","../../utils/replacers/knowledgeReplacer.jsx","../../components/Lesson/LessonKnowledge/LessonKnowledge.jsx","../../components/Modal/KnowledgeModal/useKnowledgePlaceholderReplacementEffect.jsx","../../components/GrammarItem/GrammarItem.jsx","../../pages/GrammarPage.jsx","../../assets/images/landing/course_landing-1200x675.jpg","../../assets/images/landing/course_landing-992x558.jpg","../../assets/images/landing/course_landing-768x432.jpg","../../assets/images/landing/course_landing-480x270.jpg","../../components/MainHeroImage/MainHeroImage.jsx","../../components/Dashboard/Tiles/Tile/Tile.jsx","../../components/Dashboard/Tiles/Tile/BlankTile.jsx","../../components/Dashboard/Tiles/Tile/MoreCoursesTile.jsx","../../constants/tileColors.jsx","../../utils/htmlUtils.jsx","../../components/Dashboard/Tiles/Tiles.jsx","../../components/Dashboard/Dashboard.jsx","../../pages/DashboardPage.jsx","../../components/GrammarOverview/GrammarOverviewHeader.jsx","../../components/Accordion/AccordionItem/AccordionItem.jsx","../../constants/grammarOverviewColors.jsx","../../components/Accordion/Accordion.jsx","../../components/GrammarOverview/GrammarOverview.jsx","../../pages/GrammarOverviewPage.jsx","../../utils/url/pathAnalyser.jsx","../../components/Lesson/LessonMenu/LessonMenuItem/LessonMenuItem.jsx","../../components/Lesson/LessonMenu/LessonTitleAndBurgerButton/LessonTitle.jsx","../../components/Lesson/LessonMenu/LessonTitleAndBurgerButton/LessonBurgerButton.jsx","../../constants/lessonParts.jsx","../../utils/lessonUtils.jsx","../../components/Lesson/LessonMenu/LessonMenu.jsx","../../assets/svg/icon-hint-circle-orange.svg.js","../../components/Lesson/LessonContentDescription/LessonContentDescription.jsx","../../utils/mappers/subtitlesLabel.jsx","../../vite/preload-helper","../../video/videoTypeMatcher.jsx","../../video/videoPlugins.jsx","../../video/audioPlugins.jsx","../../video/videojs.jsx","../../video/api.jsx","../../video/useVideoPlayerEffect.jsx","../../components/GoogleTagManager/hooks/useAddEmbeddingsToGtm.jsx","../../components/GoogleTagManager/hooks/useMediaTracking.jsx","../../components/MediaInput/MediaInputVideo/MediaInputVideo.jsx","../../components/MediaInput/MediaInputImage/MediaInputImage.jsx","../../components/MediaInput/MediaInputAudio/MediaInputAudio.jsx","../../components/Lesson/MediaInputChooser/MediaInputChooser.jsx","../../components/Lesson/LessonInformation/LessonInformation.jsx","../../components/Lesson/LessonExercise/workflow/ExerciseProgress.jsx","../../components/Lesson/LessonExercise/LessonExerciseStats/LessonExerciseStats.jsx","../../hooks/useScrollToTop.jsx","../../components/ContentContainer/ContentNavTitle/ContentNavTitle.jsx","../../components/Lesson/LessonExercise/LessonExerciseHeadline/LessonExerciseHeadline.jsx","../../components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseHiddenAudio.jsx","../../components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseSoundFailureHiddenAudio.jsx","../../components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseSoundSuccessHiddenAudio.jsx","../../context/AudioContext.jsx","../../components/Lesson/LessonExercise/LessonExerciseTextInput/LessonExerciseTextInput.jsx","../../hooks/useAudio.jsx","../../components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionAudio.jsx","../../components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionText.jsx","../../components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionImage.jsx","../../components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionVideo.jsx","../../utils/audioUtils.jsx","../../components/Lesson/LessonExercise/LessonExerciseQuestion/QuestionTypes/questionTypes.jsx","../../components/Lesson/LessonExercise/LessonExerciseQuestion/LessonExerciseQuestion.jsx","../../components/SolveCheckButton/ButtonTemplate.jsx","../../components/SolveCheckButton/SolveButton.jsx","../../components/SolveCheckButton/CheckButton.jsx","../../components/SolveCheckButton/SolveCheckButton.jsx","../../components/Lesson/LessonExercise/ClozeExercise/clozeExerciseUtils.jsx","../../components/Lesson/LessonExercise/workflow/inquiryState.jsx","../../components/Lesson/LessonExercise/ClozeExercise/ClozePulldown.jsx","../../utils/replacers/exerciseReplacer.jsx","../../components/Lesson/LessonExercise/ClozeExercise/usePlaceholderReplacementEffect.jsx","../../components/Lesson/LessonExercise/ClozeExercise/ExerciseRichText.jsx","../../components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/PulldownAnswer.jsx","../../assets/svg/icon-hint.svg.js","../../components/Lesson/LessonExercise/LessonExerciseHint/LessonExerciseHint.jsx","../../components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/ContainerTextContent.jsx","../../components/Lesson/LessonExercise/utils/exerciseUtils.jsx","../../components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/ChooseAnswer.jsx","../../assets/svg/keyboard.svg.js","../../components/Lesson/LessonExercise/Keyboard/KeyboardIcon.jsx","../../components/Input/TextAreaInput/TextAreaInput.jsx","../../components/Lesson/LessonExercise/Keyboard/KeyboardWrapper.jsx","../../components/Lesson/LessonExercise/ClozeExercise/ClozeInput.jsx","../../components/Lesson/LessonExercise/ClozeExercise/AnswerTypes/WritingAnswer.jsx","../../components/Lesson/LessonExercise/workflow/useInquiryHandling.jsx","../../components/Lesson/LessonExercise/ClozeExercise/ClozeExerciseRow.jsx","../../components/Lesson/LessonExercise/ClozeExercise/ClozeExercise.jsx","../../components/Lesson/LessonExercise/DictationExercise/DictationExerciseRow.jsx","../../components/Lesson/LessonExercise/DictationExercise/DictationExercise.jsx","../../constants/inquiryMediaTypes.jsx","../../components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyAnswer/ManyToManyAnswer.jsx","../../components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyQuestionRow/manyToManyQuestionRowReducer.jsx","../../components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyQuestionRow/ManyToManyQuestionRow.jsx","../../components/Lesson/LessonExercise/ManyToManyExercise/ManyToManyExercise.jsx","../../components/Lesson/LessonExercise/LessonExerciseAnswer/answerState.jsx","../../components/Lesson/LessonExercise/LessonExerciseAnswer/LessonExerciseTextAnswer/LessonExerciseTextAnswer.jsx","../../components/Lesson/LessonExercise/LessonExerciseAnswer/LessonExerciseImageAnswer/LessonExerciseImageAnswer.jsx","../../components/Lesson/LessonExercise/LessonExerciseAnswer/ExerciseAnswer.jsx","../../hooks/useIsMountedRef.jsx","../../components/Lesson/LessonExercise/MultiSelectionExercise/MultiSelectionQuestionRow.jsx","../../components/Lesson/LessonExercise/MultiSelectionExercise/MultiSelectionExercise.jsx","../../components/Lesson/LessonExercise/RepeatExercise/SelfAssessment/SelfAssessmentAnswer.jsx","../../components/Lesson/LessonExercise/RepeatExercise/SelfAssessment/SelfAssessmentQuestion.jsx","../../components/Lesson/LessonExercise/RepeatExercise/SelfAssessment/SelfAssessment.jsx","../../components/Lesson/LessonExercise/RepeatExercise/RepeatExerciseRow.jsx","../../components/Lesson/LessonExercise/RepeatExercise/RepeatExercise.jsx","../../components/Lesson/LessonExercise/SingleSelectionExercise/SingleSelectionQuestionRow/SingleSelectionQuestionRow.jsx","../../components/Lesson/LessonExercise/SingleSelectionExercise/SingleSelectionExercise.jsx","../../components/Lesson/LessonExercise/SortingExercise/SortingExerciseRow.jsx","../../components/Lesson/LessonExercise/SortingExercise/SortingExercise.jsx","../../components/Lesson/LessonExercise/LessonExerciseItem/ExerciseLeavingPrompt.jsx","../../components/ContentContainer/ContentContainer.jsx","../../components/ContentContainer/ContentBottomLine/ContentBottomLine.jsx","../../components/ContentContainer/AccordionContainer.jsx","../../components/Manuscript/Manuscript.jsx","../../components/Lesson/LessonExercise/LessonExerciseItem/LessonExerciseItem.jsx","../../state/mode/lessonExerciseModeDuck.jsx","../../state/mode/lessonExerciseModeSelectors.jsx","../../hooks/useExerciseManager.jsx","../../components/Lesson/LessonExercise/LessonExerciseNavigation/LessonExerciseNavigation.jsx","../../components/Lesson/LessonVocabulary/VocabularyRow/VocabularyRow.jsx","../../components/Lesson/LessonVocabulary/LessonVocabulary.jsx","../../utils/mappers/lessonPartToTranslationCode.jsx","../../components/Lesson/LessonKnowledgeNavigation/NavigationRow/NavigationRow.jsx","../../components/Lesson/LessonKnowledgeNavigation/LessonKnowledgeNavigation.jsx","../../pages/ManuscriptPage.jsx","../../components/ContentContainer/ContentSection/ContentSection.jsx","../../components/Lesson/LessonExtras/Links/ArticleLinks.jsx","../../components/Lesson/LessonExtras/Links/AudioLinks.jsx","../../components/Lesson/LessonExtras/Links/DownloadLinks.jsx","../../components/Lesson/LessonExtras/Links/VideoLinks.jsx","../../components/Lesson/LessonExtras/LessonExtras.jsx","../../pages/LessonExtrasPage.jsx","../../components/Lesson/LessonExercise/LessonExerciseResult/ExerciseAction.jsx","../../constants/marks.jsx","../../components/Lesson/LessonExercise/LessonExerciseResult/Summary.jsx","../../components/Lesson/LessonExercise/LessonExerciseResult/LessonExerciseResult.jsx","../../components/Lesson/LessonSummary/LessonSummary.jsx","../../pages/LessonSummaryPage.jsx","../../components/Lesson/Lesson.jsx","../../pages/LessonPage.jsx","../../components/RestrictedRoute/RestrictedRoute.jsx","../../components/user/ConfirmUserRegistrationContainer.jsx","../../utils/errorClassAssigner.jsx","../../utils/validation/validationMessages.jsx","../../components/Input/Input.jsx","../../components/Select/Select.jsx","../../components/Checkbox/Checkbox.jsx","../../components/Input/BirthDateInput/BirthDateInput.jsx","../../utils/validation/validators.jsx","../../components/ReCaptcha/ReCaptcha.jsx","../../constants/countries.jsx","../../constants/userInputOptions.jsx","../../components/user/Registration.jsx","../../utils/mappers/passwordReset.jsx","../../services/passwordService.jsx","../../components/Input/NewPassword/NewPasswordInputs.jsx","../../components/user/PasswordChange.jsx","../../components/user/PasswordReset.jsx","../../components/StatusFeedback/StatusFeedback.jsx","../../components/Modal/DeleteAccountModal/DeleteAccountModal.jsx","../../components/user/UserProfile.jsx","../../components/user/SetNewPassword.jsx","../../components/PlacementTest/PlacementTest.jsx","../../pages/PlacementTestPage.jsx","../../components/VocabularyTrainer/VocabularyTrainerStart.jsx","../../components/VocabularyTrainer/VocabularyTrainerStatus.jsx","../../components/VocabularyTrainer/BubbleContainer.jsx","../../components/VocabularyTrainer/VocabularyTrainerItem.jsx","../../assets/svg/smiley-positive.svg.js","../../assets/svg/smiley-negative.svg.js","../../assets/icons/Smiley.jsx","../../components/VocabularyTrainer/VocabularyTrainerSmileys.jsx","../../hooks/useTransition.jsx","../../components/VocabularyTrainer/VocabularyTrainerExercise.jsx","../../components/Vocabulary/VocabularyQuery.jsx","../../components/VocabularyTrainer/VocabularyTrainer.jsx","../../components/PlacementResult/PlacementAndFinalTestResult.jsx","../../pages/PlacementAndFinalTestResultPage.jsx","../../components/Help/Help.jsx","../../pages/HelpPage.jsx","../../pages/LegalPage.jsx","../../hooks/useDebounce.jsx","../../constants/keyCodes.jsx","../../components/Vocabulary/VocabularySearch/duck/vocabularySearchDuck.jsx","../../hooks/vocabularySearchHooks.jsx","../../components/Vocabulary/VocabularySearch/VocabularySearch.jsx","../../components/Vocabulary/VocabularyMoreButton/VocabularyMoreButton.jsx","../../components/Vocabulary/VocabularyItem.jsx","../../components/Vocabulary/Vocabulary.jsx","../../pages/VocabularyPage.jsx","../../components/App.jsx","../../utils/apolloClient.jsx","../../state/rootReducers.jsx","../../state/middlewares/apiMiddleware.jsx","../../state/store.jsx","../../index.jsx"],"sourcesContent":["const p = function polyfill() {\n const relList = document.createElement('link').relList;\n if (relList && relList.supports && relList.supports('modulepreload')) {\n return;\n }\n for (const link of document.querySelectorAll('link[rel=\"modulepreload\"]')) {\n processPreload(link);\n }\n new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type !== 'childList') {\n continue;\n }\n for (const node of mutation.addedNodes) {\n if (node.tagName === 'LINK' && node.rel === 'modulepreload')\n processPreload(node);\n }\n }\n }).observe(document, { childList: true, subtree: true });\n function getFetchOpts(script) {\n const fetchOpts = {};\n if (script.integrity)\n fetchOpts.integrity = script.integrity;\n if (script.referrerpolicy)\n fetchOpts.referrerPolicy = script.referrerpolicy;\n if (script.crossorigin === 'use-credentials')\n fetchOpts.credentials = 'include';\n else if (script.crossorigin === 'anonymous')\n fetchOpts.credentials = 'omit';\n else\n fetchOpts.credentials = 'same-origin';\n return fetchOpts;\n }\n function processPreload(link) {\n if (link.ep)\n // ep marker = processed\n return;\n link.ep = true;\n // prepopulate the load record\n const fetchOpts = getFetchOpts(link);\n fetch(link.href, fetchOpts);\n }\n};__VITE_IS_MODERN__&&p();","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/),\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA',\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.',\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import { css } from 'styled-components';\n\nexport const resolutions = Object.freeze({\n min: Object.freeze({\n zero: 0,\n mobile: 320,\n tablet: 768,\n tabletLandscape: 1024,\n desktop: 1200,\n full: 1280,\n }),\n max: Object.freeze({\n mobile: 767,\n tablet: 1199,\n tabletLandscape: 992,\n desktop: Number.MAX_SAFE_INTEGER,\n }),\n});\n\nconst wrapInMedia = (sizes, type) =>\n Object.keys(sizes).reduce(\n (acc, label) => ({\n ...acc,\n ...{\n // eslint-disable-next-line fp/no-rest-parameters\n [label]: (...args) => css`\n @media (${type}-width: ${sizes[label]}px) {\n ${css(...args)}\n }\n `,\n },\n }),\n {},\n );\n\nexport const mediaMin = wrapInMedia(resolutions.min, 'min');\nexport const mediaMax = wrapInMedia(resolutions.max, 'max');\n\n// eslint-disable-next-line fp/no-rest-parameters\nconst wrapInHoverPointerMedia = (hover, pointer) => (...args) => css`\n @media (hover: ${hover}) and (pointer: ${pointer}) {\n ${css(...args)}\n }\n`;\n\n/* https://medium.com/@ferie/detect-a-touch-device-with-only-css-9f8e30fa1134 */\n/* https://media.kulturbanause.de/2017/05/interaction-type-media-queries.html */\nexport const mediaDevice = {\n mouse: wrapInHoverPointerMedia('hover', 'fine'),\n touch: wrapInHoverPointerMedia('none', 'coarse'),\n};\n\nexport const colors = Object.freeze({\n LG_WHITE: '#FFF',\n LG_BLACK: '#000',\n\n LG_ORANGE: '#F08C00',\n LG_ORANGE_DARK: '#E1500F',\n LG_PINK: '#DC1978',\n LG_RED: '#BE0046',\n LG_RED_SCORE: '#BE232D',\n LG_RED_DARK: '#B20028',\n LG_GREEN_YELLOW: '#CDBE00',\n LG_GREEN_LIGHT: '#91B423',\n LG_GREEN: '#55911E',\n LG_GREEN_SCORE: '#82B905',\n\n DW_BLUE: '#002D5A',\n DW_DARK_BLUE: '#032F59',\n DW_LIGHT_BLUE: '#0098FF',\n\n LG_BLUE_1: '#0098FF',\n LG_BLUE_2: '#0096FA',\n LG_BLUE_3: '#1B9EFD',\n LG_BLUE_4: '#99d7ff',\n LG_BLUE_5: '#1464A5',\n LG_BLUE_6: '#032F59',\n LG_BLUE_7: '#1B9EFD',\n\n LG_BAHAMA_BLUE: '#23527c',\n\n LG_GRAY_1: '#938A7F',\n LG_GRAY_2: '#BBB',\n LG_GRAY_3: '#F5F4F2',\n LG_GRAY_4: '#ddd',\n LG_GRAY_5: '#444',\n LG_GRAY_6: '#ccc',\n LG_GRAY_7: '#eee',\n LG_GRAY_8: '#9B9B9B',\n LG_GRAY_9: '#3e3e3e',\n LG_GRAY_10: '#252629',\n LG_GRAY_11: '#666',\n LG_GRAY_12: '#E6E1DD',\n LG_GRAY_13: '#4a4a4a',\n LG_GRAY_14: '#e7e7e7',\n LG_GRAY_15: '#777777',\n\n LG_ORANGE1: '#bf6f00',\n\n LIGHT_KHAKI: '#f4f3f2',\n\n LG_GRAY_TRANSPARENT_1: 'rgba(128,128,128,.5)',\n LG_GRAY_TRANSPARENT_15: 'rgba(128,128,128,.15)',\n LG_TRANSPARENT_BLACK_075: 'rgba(0,0,0,0.075)',\n LG_TRANSPARENT_BLACK_20: 'rgba(0,0,0,0.2)',\n LG_TRANSPARENT_BLACK_25: 'rgba(0,0,0,0.25)',\n LG_TRANSPARENT_BLACK_30: 'rgba(0,0,0,0.3)',\n LG_TRANSPARENT_BLACK_40: 'rgba(0,0,0,0.4)',\n LG_TRANSPARENT_BLACK_50: 'rgba(0,0,0,0.5)',\n LG_TRANSPARENT_WHITE_10: 'rgba(255,255,255,0.1)',\n LG_TRANSPARENT_WHITE_15: 'rgba(255,255,255,0.15)',\n LG_TRANSPARENT_WHITE_25: 'rgba(255,255,255,0.25)',\n LG_TRANSPARENT_WHITE_50: 'rgba(255,255,255,0.5)',\n});\n\nexport const selector = Object.freeze({\n composition: Object.freeze({\n even: ':first-child:nth-last-child(2n)',\n odd: ':first-child:nth-last-child(2n+1)',\n _369: ':first-child:nth-last-child(3n)',\n _258: ':first-child:nth-last-child(3n+2)',\n _4710: ':first-child:nth-last-child(3n+1)',\n }),\n notFirst: ':not(:first-child)',\n notLast: ':not(:last-child)',\n disabled: '[disabled]:not([disabled=\"false\"])',\n topElements: numberOfElements => `:nth-child(-n+${numberOfElements})`,\n justNElements: numberOfElements => `:first-child:nth-last-child(${numberOfElements})`,\n});\n\nexport const clearfix = `\n &:after {\n display: table;\n content: \"\";\n clear: both;\n }\n `;\n","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"g\", {\n className: \"logoBox\",\n fillRule: \"evenodd\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n className: \"logoLogo\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M15.5929091,3.39736364 C22.287,3.39736364 27.714,8.82381818 27.714,15.5184545 C27.714,22.2125455 22.287,27.6392727 15.5929091,27.6392727 C8.89881818,27.6392727 3.47181818,22.2125455 3.47181818,15.5184545 C3.47181818,8.82381818 8.89881818,3.39736364 15.5929091,3.39736364 L15.5929091,3.39736364 Z M26.9959091,5.16463636 C29.8276364,1.99527273 33.9458182,0 38.5303636,0 C47.0694545,0 53.9920909,6.92236364 53.9920909,15.4617273 C53.9920909,24.0010909 47.0694545,30.9234545 38.5303636,30.9234545 C33.9458182,30.9234545 29.8276364,28.9281818 26.9959091,25.7585455 C24.1644545,28.9281818 20.046,30.9234545 15.4614545,30.9234545 C6.92209091,30.9234545 0,24.0010909 0,15.4617273 C0,6.92236364 6.92209091,1.93784382e-15 15.4614545,1.93784382e-15 C20.046,1.93784382e-15 24.1644545,1.99527273 26.9959091,5.16463636 L26.9959091,5.16463636 Z M15.9913636,13.0819091 L12.6553636,13.0819091 L12.6553636,18.0845455 L15.9913636,18.0845455 C18.4150909,18.0845455 19.2714545,17.0787273 19.2714545,15.5833636 C19.2714545,14.088 18.4085455,13.0819091 15.9913636,13.0819091 L15.9913636,13.0819091 Z M16.4511818,9.59536364 C19.8250909,9.59536364 23.2835455,11.292 23.2835455,15.5828182 C23.2835455,19.8739091 19.8250909,21.5705455 16.4511818,21.5705455 L8.886,21.5705455 L8.886,9.59536364 L16.4511818,9.59536364 L16.4511818,9.59536364 Z M35.4119983,15.9318147 L37.5403715,10.1204985 L40.4334297,10.1204985 L42.5618029,15.9318147 L44.2678615,10.1204985 L48.0692727,10.1204985 L44.4908946,21.3263197 L41.2676315,21.3263197 L38.9674938,15.9016908 L36.7070387,21.3263197 L33.483486,21.3263197 L29.9048182,10.1204985 L33.7062294,10.1204985 L35.4119983,15.9318147 L35.4119983,15.9318147 Z\",\n id: \"Shape\"\n})));\n\nfunction SvgDwLogo(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n viewBox: \"0 0 54 31\",\n xmlns: \"http://www.w3.org/2000/svg\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgDwLogo);\nexport default __webpack_public_path__ + \"static/media/dw-logo.ff9012af.svg\";\nexport { ForwardRef as ReactComponent };","import styled from 'styled-components';\nimport { ReactComponent as Logo } from '../svg/dw-logo.svg';\n\nexport const StyledLogo = styled(props => )``;\n","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgDwClaim(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n viewBox: \"225 40 330 35\",\n xmlns: \"http://www.w3.org/2000/svg\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"g\", {\n className: \"claimBox\"\n }, /*#__PURE__*/React.createElement(\"g\", {\n className: \"claimClaim\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M268.479,73.127l0,-1.301c-0.655,-0.522 -1.526,-1.045 -2.443,-1.435l-3.042,-23.86c1.13,-0.305 2.35,-0.913 3.31,-1.478l0,-1.305l-8.012,0l-8.704,23.028l-8.882,-23.028l-8.007,0l0,1.305c0.999,0.523 2.222,1.131 3.348,1.478l-2.999,23.948c-0.743,0.263 -1.614,0.785 -2.354,1.347l0,1.301l8.793,0l0,-1.301c-0.824,-0.522 -1.741,-0.996 -3.046,-1.347l1.568,-21.769l0.043,0l9.4,24.417l2.481,0l9.184,-24.68l0.046,0l2.438,21.901c-1.134,0.305 -2.311,0.916 -3.224,1.478l0,1.301l10.102,0ZM290.589,69.346c-1.305,0.391 -2.35,0.478 -2.35,0.478c0,0 -0.352,-0.867 -0.352,-2.7l0,-9.88c0,-4.354 -2.733,-6.181 -7.478,-6.181c-2.832,0 -5.142,0.519 -7.186,1.304l0,5.659l1.525,0c0,0 0.956,-1.529 1.564,-3.967c0,0 1.265,-0.913 3.18,-0.913c2.922,0 4.312,1.919 4.312,4.88l0,2.438c-7.666,-0.04 -12.102,3.61 -12.102,7.14c0,3.44 2.392,5.918 5.917,5.918c2.701,0 5.402,-1.739 6.618,-4.041l0.046,0c0,0 0.043,2.259 1.173,4.132c3.174,-0.919 5.697,-2.871 5.697,-2.871l-0.564,-1.396ZM283.804,65.821c0,2.871 -2.439,4.79 -4.49,4.79c-1.954,0 -3.44,-1.568 -3.44,-3.789c0,-2.224 1.614,-4.447 7.93,-4.315l0,3.314ZM316.618,71.35c-1.78,-0.306 -3.042,-0.785 -3.042,-0.785l0,-29.467c-4.264,-0.093 -7.399,0.56 -7.399,0.56l0,1.348c2.001,0.348 3.312,0.781 3.312,0.781l0,7.581c0,0 -1.83,-0.213 -3.75,-0.213c-6.528,0 -11.49,4 -11.49,12.187c0,6.092 3.085,10.18 8.182,10.18c3.657,0 6.315,-2.303 7.36,-4.873l0.046,0.043c0,-0.004 -0.305,1.869 -0.263,4.566c3.956,0.132 7.044,-0.525 7.044,-0.525l0,-1.383ZM309.489,63.514c0,4.004 -2.445,7.139 -5.356,7.139c-3.617,0 -5.622,-3.355 -5.622,-8.231c0,-6.01 2.398,-9.144 6.443,-9.144c1.876,0 3.355,0.433 4.535,1.222l0,9.014ZM337.997,60.162c0,-5.488 -2.695,-9.099 -8.487,-9.099c-6.27,0 -9.792,4.741 -9.792,11.576c0,7.098 3.522,10.84 9.71,10.84c3.265,0 6.262,-1.219 8.569,-3l-0.74,-1.699c-1.567,1.083 -4.13,1.873 -6.27,1.873c-4.399,0 -6.966,-2.744 -6.966,-8.278l0,-0.607l13.976,0l0,-1.606ZM333.649,59.81l-9.539,0c0.306,-3.743 1.912,-6.664 4.962,-6.664c3.096,0 4.616,2.882 4.577,6.664ZM367.076,47.274l0,-5.793c-1.222,-0.298 -2.654,-0.476 -4.048,-0.476c-5.487,0 -8.049,2.957 -8.049,7.705l0,2.744l-4.18,0l0,2.087l4.18,0l0,16.985c-2.087,0.521 -3.527,1.3 -3.527,1.3l0,1.301l11.225,0l0,-1.301c0,0 -1.522,-0.736 -3.615,-1.3l0,-16.985l5.747,0l0,-2.087l-5.747,0l0,-3.219c0,-3.356 0.696,-5.229 3.398,-5.229c0.568,0 1.172,0.085 1.698,0.26c0.345,2.047 1.39,4.008 1.39,4.008l1.528,0ZM387.793,61.776c0,-6.842 -3.824,-10.713 -9.966,-10.713c-6.269,0 -11.529,4.134 -11.529,11.707c0,6.881 3.82,10.752 9.966,10.752c6.269,0 11.529,-4.173 11.529,-11.746ZM383.446,62.553c0,5.666 -2.263,8.576 -5.967,8.576c-4.396,0 -6.834,-3.699 -6.834,-9.141c0,-5.666 2.263,-8.576 5.92,-8.576c4.397,0 6.881,3.739 6.881,9.141ZM407.337,51.543c-0.824,-0.305 -1.954,-0.522 -3.088,-0.522c-2.741,0 -4.443,2.128 -5.616,5.476l-0.132,0c0.264,-1.691 0.349,-3.39 0.349,-5.171c-2.385,-0.088 -5.349,0.128 -7.265,0.522l0,1.344c1.088,0.171 2.311,0.476 3.309,0.824l0,16.51c-1.215,0.304 -2.26,0.738 -3.309,1.3l0,1.301l10.837,0l0,-1.301c-1.088,-0.522 -2.222,-0.957 -3.441,-1.3l0,-8.407c0,-3.746 1.483,-7.313 4.4,-7.313c1.305,0 2.389,0.432 3.394,0.909l0.562,-4.172ZM457.531,73.127l0,-1.301c0,0 -1.35,-0.824 -2.957,-1.3c0,0 0.175,-4.052 0.175,-9.799c0,-6.536 -2.307,-9.664 -6.874,-9.664c-3.664,0 -6.493,2.083 -7.581,4.869l-0.046,0c-0.437,-2.569 -2.389,-4.869 -6.525,-4.869c-3.441,0 -6.273,2.129 -7.361,4.788l-0.086,0c0,0 0.303,-1.835 0.303,-4.525c-4.169,-0.131 -7.35,0.522 -7.35,0.522l0,1.344c1.956,0.349 3.309,0.824 3.309,0.824l0,16.51c-1.788,0.429 -3.309,1.3 -3.309,1.3l0,1.301l10.186,0l0,-1.255c0,0 -1.4,-0.782 -2.793,-1.307l0,-9.535c0,-3.391 2.093,-7.231 5.622,-7.231c3.526,0 4.265,2.965 4.265,5.752l0,11.014c-1.087,0.437 -2.093,0.959 -2.786,1.307l0,1.255l9.663,0l0,-1.255c-0.697,-0.301 -1.741,-0.87 -2.786,-1.307l0,-9.535c0,-3.391 2.047,-7.231 5.705,-7.231c3.308,0 4.353,3.139 4.353,8.016c0,4.918 -0.171,8.75 -0.171,8.75c-1.528,0.525 -2.79,1.307 -2.79,1.307l0,1.255l9.834,0ZM468.72,44.573c0,-1.563 -1.13,-2.741 -2.741,-2.741c-1.567,0 -2.74,1.178 -2.74,2.741c0,1.525 1.173,2.698 2.74,2.698c1.611,0 2.741,-1.173 2.741,-2.698ZM471.072,73.127l0,-1.301c0,0 -1.396,-0.824 -3.052,-1.3l0,-19.2c-4.254,-0.131 -7.393,0.522 -7.393,0.522l0,1.344c1.916,0.349 3.306,0.824 3.306,0.824l0,16.51c-1.739,0.429 -3.306,1.3 -3.306,1.3l0,1.301l10.445,0ZM498.628,73.127l0,-1.301c0,0 -1.355,-0.824 -2.965,-1.3c0,0 0.221,-4.098 0.221,-9.799c0,-6.536 -2.26,-9.664 -7.009,-9.664c-3.831,0 -6.532,2.218 -7.577,4.788l-0.085,0c0,0 0.302,-1.835 0.302,-4.525c-4.173,-0.131 -7.354,0.522 -7.354,0.522l0,1.344c1.966,0.349 3.313,0.824 3.313,0.824l0,16.51c-1.83,0.476 -3.313,1.3 -3.313,1.3l0,1.301l10.321,0l0,-1.255c0,0 -1.353,-0.782 -2.921,-1.307l0,-9.535c0,-3.438 2.089,-7.231 5.793,-7.231c3.441,0 4.4,3.139 4.4,8.016c0,4.918 -0.178,8.75 -0.178,8.75c-1.567,0.525 -2.918,1.307 -2.918,1.307l0,1.255l9.97,0ZM524.395,71.35c-1.781,-0.306 -3.046,-0.785 -3.046,-0.785l0,-29.467c-4.258,-0.093 -7.396,0.56 -7.396,0.56l0,1.348c2,0.348 3.313,0.781 3.313,0.781l0,7.581c0,0 -1.834,-0.213 -3.75,-0.213c-6.533,0 -11.491,4 -11.491,12.187c0,6.092 3.089,10.18 8.185,10.18c3.654,0 6.316,-2.303 7.353,-4.873l0.047,0.043c0,-0.004 -0.305,1.869 -0.263,4.566c3.955,0.132 7.048,-0.525 7.048,-0.525l0,-1.383ZM517.266,63.514c0,4.004 -2.446,7.139 -5.357,7.139c-3.618,0 -5.622,-3.355 -5.622,-8.231c0,-6.01 2.395,-9.144 6.445,-9.144c1.875,0 3.353,0.433 4.534,1.222l0,9.014ZM542.812,66.949c0,-7.228 -10.406,-5.483 -10.406,-11.013c0,-1.653 1.049,-2.698 2.917,-2.698c1.266,0 2.401,0.303 3.05,0.647c0.31,1.27 0.742,2.57 1.305,3.572l1.563,0l0,-5.829c-1.304,-0.348 -3.128,-0.565 -5.001,-0.565c-4.662,0 -7.837,2.605 -7.837,5.961c0,7.445 10.319,5.576 10.319,11.017c0,2.09 -1.309,2.961 -3.227,2.961c-1.607,0 -3,-0.437 -4.045,-0.871c-0.26,-1.174 -0.821,-2.488 -1.308,-3.572l-1.603,0l0,6.223c1.734,0.437 3.604,0.654 5.829,0.654c4.401,0 8.444,-2.694 8.444,-6.487ZM552.995,70.781c0,-1.567 -1.174,-2.693 -2.698,-2.693c-1.564,0 -2.74,1.126 -2.74,2.693c0,1.565 1.176,2.741 2.74,2.741c1.524,0 2.698,-1.176 2.698,-2.741Z\",\n style: {\n fillRule: \"nonzero\"\n }\n }))));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgDwClaim);\nexport default __webpack_public_path__ + \"static/media/dw-claim.dad03c02.svg\";\nexport { ForwardRef as ReactComponent };","import styled from 'styled-components';\nimport { ReactComponent as ClaimLogo } from '../svg/dw-claim.svg';\n\nexport const StyledClaimLogo = styled(props => )``;\n","import styled from 'styled-components';\nimport { StyledLogo as LogoIcon } from '../../assets/icons/DwLogo';\nimport { StyledClaimLogo as ClaimIcon } from '../../assets/icons/DwClaim';\nimport { colors, resolutions } from '../../utils/css';\n\nexport const Logo = ({ className, url = 'https://dw.com' }) => {\n return (\n \n \n \n \n );\n};\n\nexport const StyledLogo = styled(Logo)`\n display: inline-block;\n margin: 0 20px;\n direction: ltr;\n\n svg.logo {\n width: 40px;\n height: 23px;\n fill: ${colors.DW_DARK_BLUE};\n transition: fill 80ms cubic-bezier(0.43, 0, 0.09, 1) 67ms;\n }\n\n svg.claim {\n display: none;\n }\n\n @media (min-width: ${resolutions.min.tablet}px) {\n svg.logo {\n width: 54px;\n height: 31px;\n }\n\n svg.claim {\n display: none;\n }\n }\n\n @media (min-width: ${resolutions.min.desktop}px) {\n svg.logo {\n width: 88px;\n height: 50px;\n }\n\n svg.claim {\n display: inline-block;\n margin: 0 12px;\n width: 140px;\n height: 50px;\n fill: ${colors.DW_LIGHT_BLUE};\n transition: fill 80ms cubic-bezier(0.43, 0, 0.09, 1) 67ms;\n }\n }\n`;\n","import styled from 'styled-components';\nimport { resolutions } from '../../utils/css';\nimport { StyledLogo as Logo } from '../Logo/Logo';\n\nexport const DesktopBanner = ({ className }) => {\n return (\n \n );\n};\n\nexport const StyledDesktopBanner = styled(DesktopBanner)`\n display: grid;\n height: 110px;\n margin-left: -20px;\n margin-right: -20px;\n padding: 26px 15px;\n width: 100%;\n\n @media (max-width: ${resolutions.max.tablet}px) {\n display: none !important;\n }\n`;\n","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nexport default __webpack_public_path__ + \"static/media/dw-logo-tablet.ac032dbb.svg\";","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nexport default __webpack_public_path__ + \"static/media/dw-logo-mobile.7e6e58ec.svg\";","import styled from 'styled-components';\nimport { colors } from '../../utils/css';\n\n// eslint-disable-next-line react/prop-types,no-unused-vars\nexport const Text = ({\n isA = 'span',\n children,\n // eslint-disable-next-line no-unused-vars\n isRtl,\n className,\n ...restProps\n}) => {\n const Tag = isA;\n return (\n \n {children}\n \n );\n};\n\nexport const StyledText = styled(Text)`\n direction: ${({ isRtl }) => (isRtl ? 'rtl' : 'ltr')};\n`;\n\nexport const StyledTextGray12 = styled(StyledText)`\n color: ${colors.LG_GRAY_12};\n`;\n","// watch out - arrays not supported ;) Maybe in future\n// we should replace this small function with something more powerful\n// but let us wait till it is really needed.\n\nfunction accessPathByArr(keysArr, obj) {\n if (!obj) {\n return null;\n }\n const objPartial = obj[keysArr[0]];\n\n if (!objPartial) {\n return null;\n }\n if (keysArr.length === 1) {\n return objPartial;\n }\n return accessPathByArr(keysArr.slice(1), objPartial);\n}\n\nexport function accessPath(pathStr, obj) {\n if (!pathStr) {\n return obj;\n }\n return accessPathByArr(pathStr.split('.'), obj);\n}\n","import { accessPath } from './jsonPath';\n\n// eslint-disable-next-line fp/no-let\nlet translations = null;\n\nexport const replaceInPattern = (pattern, options) =>\n Object.keys(options).reduce((acc, nextVar) => {\n const varNameRegex = new RegExp(/\\${/.source + nextVar + /}/.source, 'g'); // ${nextVar}\n return acc.replace(varNameRegex, options[nextVar]);\n }, pattern);\n\nconst retrieveLabel = key => {\n const translation = accessPath(key, translations);\n if (!translation) {\n return key;\n }\n return translation;\n};\n\nexport function hasTranslations() {\n return !!translations;\n}\n\nexport function setTranslations(inTranslations) {\n translations = inTranslations; // eslint-disable-line fp/no-mutation\n}\n\nexport function clearTranslations() {\n translations = null; // eslint-disable-line fp/no-mutation\n}\n\nexport function t(key, options) {\n const label = retrieveLabel(key);\n return options ? replaceInPattern(label, options) : label;\n}\n\nexport function gqlQueryByLang(lang) {\n const langValue = lang || '$lang';\n return `\n i18n: i18nByLang(lang: ${langValue}, appName: \"mdl\"){\n all\n }\n `;\n}\n\nexport function gqlQueryByContent({ id, lang } = {}) {\n const idValue = id || '$id';\n const langValue = lang || '$lang';\n\n return `\n i18n: i18nByContent (id: ${idValue}, lang: ${langValue}){\n all\n }\n `;\n}\n","import { createContext, useContext } from 'react';\nimport { t, clearTranslations, hasTranslations } from '../utils/i18n';\n\nconst i18n = { t, clearTranslations, hasTranslations };\n\nexport const I18nContext = createContext({ i18n });\n\nexport const useI18nContext = () => useContext(I18nContext);\n","import { useI18nContext } from '../context/I18nContext';\n\nconst isPlainKey = translation => typeof translation === 'string' || !translation;\n\nconst normalizeTranslation = translation =>\n isPlainKey(translation) ? { key: translation, parameters: {} } : translation;\n\nexport const useTranslation = translation => {\n const { i18n } = useI18nContext();\n const { key, parameters } = normalizeTranslation(translation);\n if (!key) {\n return null;\n }\n return i18n.t(key, parameters);\n};\n","import { createContext, useState } from 'react';\n\n/**\n * @deprecated since we use StylisRTLPlugin in MainPage we should not need to distinguish between\n * ltr/rtl in components because it's managed globally. This context still exists for old copy&paste\n * components because it has not been removed yet. The isRtl result of this provider is now always\n * undefined because the value is not set anymore.\n */\nexport const RtlContext = createContext({});\n\nexport const RtlProvider = props => {\n const { initialIsRtl = false, children } = props;\n\n const [isRtl, setIsRtlValue] = useState(initialIsRtl);\n const setIsRtl = isRtlValue => setIsRtlValue(isRtlValue);\n\n const isRtlContext = {\n isRtl,\n setIsRtl,\n };\n\n return {children} ;\n};\n","import { useContext } from 'react';\nimport { RtlContext } from '../context/rtlContext';\n\n/**\n * @deprecated since we use StylisRTLPlugin in MainPage we should not need to distinguish between\n * ltr/rtl in components because it's managed globally. This context still exists for old copy&paste\n * components because it has not been removed yet. The isRtl result of this provider is now always\n * undefined because the value is not set anymore.\n */\nexport const useRtlContext = () => useContext(RtlContext);\n","import { StyledText as Text } from '../Text/Text';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { useRtlContext } from '../../hooks/useRtl';\n\nexport const I18nText = ({ translation, isA, className, ...restProps }) => {\n const { isRtl } = useRtlContext();\n const label = useTranslation(translation);\n\n return {label} ;\n};\n","import styled from 'styled-components';\nimport { colors, resolutions } from '../../utils/css';\nimport dwLogoTablet from '../../assets/svg/dw-logo-tablet.svg';\nimport dwLogoMobile from '../../assets/svg/dw-logo-mobile.svg';\nimport { I18nText } from '../I18n/I18nText';\n\nexport const MobileBanner = ({ className, title }) => {\n return (\n \n );\n};\n\nexport const StyledMobileBanner = styled(MobileBanner)`\n border-width: 0 0 1px;\n box-shadow: inset 0 1px 0 ${colors.LG_TRANSPARENT_WHITE_15},\n 0 1px 5px ${colors.LG_TRANSPARENT_BLACK_075};\n line-height: 23px;\n position: fixed;\n left: 0px;\n right: 0px;\n top: 0px;\n z-index: 1030;\n\n @media (min-width: ${resolutions.min.tablet}px) {\n border-radius: 0px;\n height: 80px;\n }\n\n @media (min-width: ${resolutions.min.desktop}px) {\n display: none !important;\n }\n\n .mobile-banner {\n background: ${colors.LG_WHITE};\n border-bottom: 1px solid ${colors.LG_GRAY_14};\n height: 60px;\n margin-bottom: 0px;\n min-height: 50px;\n position: relative;\n width: 100%;\n z-index: 100;\n\n &:before,\n &:after {\n display: table;\n content: ' ';\n }\n\n @media (min-width: ${resolutions.min.tablet}px) {\n height: 80px;\n }\n }\n\n .mobile-banner-logo {\n background: url(${dwLogoMobile});\n color: ${colors.LG_GRAY_15};\n display: inline-block;\n /*! @noflip */\n float: left;\n font-size: 18px;\n font-weight: 400;\n height: 23px;\n line-height: 20px;\n margin: 17px 15px 0 15px;\n padding: 0;\n text-shadow: 0 1px 0 ${colors.LG_TRANSPARENT_WHITE_25};\n width: 40px;\n\n @media (min-width: ${resolutions.min.tablet}px) and (max-width: ${resolutions.max.tablet}px) {\n background: url(${dwLogoTablet});\n height: 31px;\n margin-top: 24px;\n width: 54px;\n }\n }\n\n .mobile-banner-brand {\n color: ${colors.LG_BLUE_5};\n font-size: 17px;\n margin: 19px auto 0 auto;\n position: relative;\n text-align: center;\n text-transform: uppercase;\n width: auto;\n\n @media (min-width: ${resolutions.min.tablet}px) and (max-width: ${resolutions.max.tablet}px) {\n font-size: 27px;\n margin: 23px auto 0 auto;\n padding-top: 8px;\n width: 300px;\n }\n }\n`;\n","/* eslint-disable no-shadow */\nimport { useCallback, useState } from 'react';\n\nexport const useToggle = ({ initialState = false, key = 'Enter' } = {}) => {\n const [isEnabled, setEnabled] = useState(initialState);\n const toggleOnClick = useCallback(() => {\n setEnabled(isEnabled => !isEnabled);\n }, []);\n\n const toggleOnKeyPress = useCallback(\n e => {\n if (e.key === key) {\n setEnabled(isEnabled => !isEnabled);\n }\n },\n [key],\n );\n\n return [isEnabled, { toggleOnClick, toggleOnKeyPress }];\n};\n","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"desc\", null, \"Person Icon\");\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"g\", {\n id: \"Seiten\",\n stroke: \"none\",\n strokeWidth: 1,\n fill: \"none\",\n fillRule: \"evenodd\",\n opacity: 1\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"06-desk-lektionsinfo+burger\",\n transform: \"translate(-1146.000000, -501.000000)\",\n fill: \"#FFFFFF\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n id: \"burgernavi-d\",\n transform: \"translate(920.000000, 170.000000)\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M241.86087,345.655072 C239.603853,344.603859 238.150728,344.078261 237.501449,344.078261 L233.976812,345.284058 L230.35942,344.078261 C230.081158,344.078261 229.578748,344.209661 228.852174,344.472464 C228.1256,344.735267 227.468602,344.990337 226.881159,345.237681 L226,345.655072 L226,347 L241.86087,347 L241.86087,345.655072 Z M229.988406,340.507246 C231.008701,342.64059 232.338156,343.707246 233.976812,343.707246 C235.584549,343.707246 236.898546,342.64059 237.918841,340.507246 C238.289857,340.383574 238.591303,339.997105 238.823188,339.347826 C239.055074,338.698547 239.155556,338.072467 239.124638,337.469565 C239.09372,336.866664 238.954591,336.565217 238.707246,336.565217 C239.047345,335.606758 239.047345,334.802902 238.707246,334.153623 C238.676328,334.060869 238.629952,333.944928 238.568116,333.805797 C238.50628,333.666666 238.343963,333.419325 238.081159,333.063768 C237.818356,332.708211 237.524639,332.391306 237.2,332.113043 C236.875361,331.834781 236.427056,331.579711 235.855072,331.347826 C235.283089,331.115941 234.657008,331 233.976812,331 C232.925599,331 231.998072,331.262799 231.194203,331.788406 C230.390334,332.314012 229.849277,332.839611 229.571014,333.365217 L229.2,334.153623 L229.153623,334.292754 C229.122705,334.35459 229.099517,334.455072 229.084058,334.594203 C229.068599,334.733334 229.05314,334.887922 229.037681,335.057971 C229.022222,335.22802 229.029952,335.444443 229.06087,335.707246 C229.091788,335.97005 229.138164,336.256037 229.2,336.565217 C228.952656,336.565217 228.813527,336.866664 228.782609,337.469565 C228.751691,338.072467 228.852173,338.698547 229.084058,339.347826 C229.315943,339.997105 229.617389,340.383574 229.988406,340.507246 L229.988406,340.507246 Z M230.127536,335.776812 C230.127536,335.684058 230.166183,335.591305 230.243478,335.498551 C230.320773,335.405797 230.552655,335.282126 230.93913,335.127536 C231.325606,334.972946 231.889851,335.05024 232.631884,335.35942 C233.373917,335.637683 234.085021,335.714976 234.765217,335.591304 C235.445414,335.467632 235.971013,335.313044 236.342029,335.127536 C236.713045,334.942028 236.991303,334.756523 237.176812,334.571014 C237.331402,334.571014 237.462801,334.764249 237.571014,335.150725 C237.679228,335.5372 237.733333,335.869564 237.733333,336.147826 L237.733333,337.353623 C237.918842,337.353623 238.042512,337.369082 238.104348,337.4 C238.166184,337.430918 238.197101,337.570047 238.197101,337.817391 C238.197101,338.064736 238.135266,338.435746 238.011594,338.930435 C237.733332,339.456041 237.455074,339.718841 237.176812,339.718841 C237.084058,339.966185 236.952658,340.259902 236.782609,340.6 C236.61256,340.940098 236.257008,341.403862 235.715942,341.991304 C235.174877,342.578747 234.595172,342.872464 233.976812,342.872464 C233.358451,342.872464 232.786476,342.609664 232.26087,342.084058 C231.735263,341.558451 231.364252,341.032853 231.147826,340.507246 L230.823188,339.718841 C230.699516,339.718841 230.560387,339.649276 230.405797,339.510145 C230.251207,339.371014 230.127537,339.239614 230.034783,339.115942 L229.895652,338.930435 C229.61739,337.879222 229.694684,337.353623 230.127536,337.353623 L230.127536,335.776812 Z\",\n id: \"Shape\"\n}))));\n\nfunction SvgIconUserNavi(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"16px\",\n height: \"16px\",\n viewBox: \"0 0 16 16\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title === undefined ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, \"Avatar\") : title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2, _ref3);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgIconUserNavi);\nexport default __webpack_public_path__ + \"static/media/icon-user-navi.68643217.svg\";\nexport { ForwardRef as ReactComponent };","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgIconLanguageWorldW(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"16px\",\n height: \"16px\",\n viewBox: \"0 0 16 16\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n xmlSpace: \"preserve\",\n style: {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n strokeLinejoin: \"round\",\n strokeMiterlimit: 1.41421\n },\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M7.976,0.026c-1.443,0 -2.784,0.36 -4.021,1.082c-1.208,0.707 -2.165,1.665 -2.872,2.873c-0.722,1.252 -1.083,2.599 -1.083,4.043c0,1.443 0.361,2.784 1.083,4.021c0.707,1.208 1.664,2.165 2.872,2.872c1.237,0.722 2.578,1.083 4.021,1.083c1.444,0 2.784,-0.361 4.021,-1.083c1.208,-0.707 2.166,-1.664 2.873,-2.872c0.736,-1.237 1.104,-2.578 1.104,-4.021c0,-1.444 -0.36,-2.784 -1.082,-4.021c-0.707,-1.208 -1.665,-2.166 -2.873,-2.873c-1.252,-0.736 -2.599,-1.104 -4.043,-1.104Zm3.005,6.451c1.208,-0.25 2.268,-0.641 3.182,-1.171c0.383,0.855 0.574,1.76 0.574,2.718c0,1.149 -0.272,2.209 -0.817,3.181c-0.973,-0.486 -1.974,-0.832 -3.005,-1.038c0.088,-0.692 0.132,-1.407 0.132,-2.143c0,-0.53 -0.022,-1.046 -0.066,-1.547Zm2.629,-2.165c-0.942,0.398 -1.878,0.677 -2.806,0.84c-0.25,-1.429 -0.648,-2.659 -1.193,-3.69c0.825,0.206 1.584,0.556 2.276,1.049c0.692,0.494 1.267,1.094 1.723,1.801Zm-3.734,3.712c0,0.781 -0.037,1.429 -0.11,1.944c-0.634,-0.073 -1.23,-0.11 -1.79,-0.11c-0.56,0 -1.156,0.037 -1.789,0.11c-0.074,-0.692 -0.111,-1.34 -0.111,-1.944c0,-0.309 0.015,-0.759 0.044,-1.348c0.516,0.074 1.138,0.111 1.867,0.111c0.729,0 1.344,-0.037 1.845,-0.111c0.03,0.589 0.044,1.039 0.044,1.348Zm-1.414,-6.739c0.589,1.178 0.995,2.526 1.215,4.043c-0.736,0.059 -1.303,0.089 -1.701,0.089c-0.398,0 -0.965,-0.03 -1.701,-0.089c0.236,-1.517 0.641,-2.865 1.215,-4.043c0.103,-0.015 0.265,-0.022 0.486,-0.022c0.221,0 0.383,0.007 0.486,0.022Zm-2.121,0.177c-0.56,1.09 -0.957,2.32 -1.193,3.69c-0.972,-0.192 -1.907,-0.472 -2.806,-0.84c0.471,-0.707 1.05,-1.307 1.734,-1.801c0.685,-0.493 1.44,-0.843 2.265,-1.049Zm-4.551,3.844c0.942,0.53 2.003,0.921 3.181,1.171c-0.044,0.501 -0.066,1.017 -0.066,1.547c0,0.736 0.044,1.451 0.133,2.143c-1.032,0.206 -2.033,0.552 -3.005,1.038c-0.531,-0.986 -0.796,-2.047 -0.796,-3.181c0,-0.943 0.184,-1.849 0.553,-2.718Zm0.906,6.894c0.824,-0.324 1.679,-0.56 2.563,-0.707c0.235,1.119 0.596,2.143 1.082,3.071c-0.722,-0.192 -1.395,-0.49 -2.021,-0.895c-0.627,-0.405 -1.168,-0.895 -1.624,-1.469Zm4.794,2.541c-0.486,-0.973 -0.854,-2.114 -1.105,-3.425c0.531,-0.044 1.068,-0.066 1.613,-0.066c0.545,0 1.068,0.022 1.569,0.066c-0.25,1.311 -0.619,2.452 -1.105,3.425c-0.103,0.014 -0.265,0.022 -0.486,0.022c-0.221,0 -0.383,-0.008 -0.486,-0.022Zm2.121,-0.177c0.486,-0.928 0.847,-1.952 1.083,-3.071c0.898,0.147 1.76,0.383 2.585,0.707c-0.471,0.589 -1.02,1.086 -1.646,1.491c-0.626,0.405 -1.3,0.696 -2.022,0.873Z\",\n style: {\n fill: \"#fff\",\n fillRule: \"nonzero\"\n }\n }));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgIconLanguageWorldW);\nexport default __webpack_public_path__ + \"static/media/icon-language-world-w.bb8502bb.svg\";\nexport { ForwardRef as ReactComponent };","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"none\",\n fillRule: \"evenodd\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M-2.5-2.5h17v17h-17z\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#FFF\",\n d: \"M12.906 1.219C7.434 4.9 5.47 10.25 5.47 10.25H4.406S2.581 7.472.688 6.531l.53-1.062c2.089.469 3.72 1.593 3.72 1.593s1.78-3.61 7.437-6.906l.531 1.063z\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M-4 16h20V-4H-4z\"\n}));\n\nfunction SvgTick(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 13,\n height: 11,\n viewBox: \"0 0 13 11\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgTick);\nexport default __webpack_public_path__ + \"static/media/tick.adf0c598.svg\";\nexport { ForwardRef as ReactComponent };","export function isServer() {\n return !(typeof window !== 'undefined' && window.document);\n}\n// CommonJS export to be able to use it on server and client\n//module.exports = {\n// isServer,\n//};\n","import { isServer } from '../utils/ssr';\n\nconst domainWithProtocol = isServer() ? '' : window.location.origin;\n\nexport const USER = {\n AS_URL: '/auth/',\n AS_URL_WITH_DOMAIN: `${domainWithProtocol}/auth/`,\n PS_URL: `${domainWithProtocol}/profiles/`,\n LOGGED_USER_RESOURCE: `${domainWithProtocol}/profiles/protected/user`,\n TICKET_PARAM_NAME: 'ticket',\n};\n","export const FEEDBACK_TYPES = {\n OTHER: 'OTHER',\n LOGIN: 'LOGIN',\n LOGIN_ERROR: 'LOGIN_ERROR',\n LOGIN_FB: 'LOGIN_FB',\n LOGOUT: 'LOGOUT',\n SESSION_TIMEOUT: 'SESSION_TIMEOUT',\n PROFILE_SERVICE_UNAVAILABLE: 'PROFILE_SERVICE_UNAVAILABLE',\n MISSING_USER_PROFILE: 'MISSING_USER_PROFILE',\n FORCED_LOGOUT: 'FORCED_LOGOUT',\n PASSWORD_CHANGED: 'PASSWORD_CHANGED',\n MAIL_CHANGED: 'MAIL_CHANGED',\n MAIL_CHANGE_REQUEST: 'MAIL_CHANGE_REQUEST',\n EMAIL_ALREADY_EXISTS: 'EMAIL_ALREADY_EXISTS',\n REGISTERED: 'REGISTERED',\n REGISTRATION_CONFIRMED: 'REGISTRATION_CONFIRMED',\n DELETED: 'DELETED',\n INVALID_TOKEN: 'INVALID_TOKEN',\n PASSWORD_RESET_REQUESTED: 'PASSWORD_RESET_REQUESTED',\n PASSWORD_RESET_SET: 'PASSWORD_RESET_SET',\n PASSWORD_CHANGE_WRONG_PASSWORD: 'PASSWORD_CHANGE_WRONG_PASSWORD',\n PROFILE_UPDATED: 'PROFILE_UPDATED',\n PASSWORD_CHANGE: 'PASSWORD_CHANGE_',\n INVALID_CERTIFICATE: 'INVALID_CERTIFICATE',\n VOCABULARY_TRAINER_UNAVAILABLE: 'VOCABULARY_TRAINER_UNAVAILABLE',\n VOCABULARY_TRAINER_NO_VOCABULARIES: 'VOCABULARY_TRAINER_NO_VOCABULARIES',\n CERTIFICATE_NO_TRANSCRIPTION: 'CERTIFICATE_NO_TRANSCRIPTION',\n MISSING_TRANSCRIPTION: 'MISSING_TRANSCRIPTION',\n USER_ALREADY_EXISTS: 'USER_ALREADY_EXISTS',\n USER_ALREADY_CONFIRMED: 'USER_ALREADY_CONFIRMED',\n};\n\nexport const TYPES_WITH_PROFILE_PAGE_AS_TARGET = [\n FEEDBACK_TYPES.PASSWORD_CHANGE_WRONG_PASSWORD,\n FEEDBACK_TYPES.PASSWORD_CHANGED,\n FEEDBACK_TYPES.EMAIL_ALREADY_EXISTS,\n FEEDBACK_TYPES.PROFILE_UPDATED,\n FEEDBACK_TYPES.CERTIFICATE_NO_TRANSCRIPTION,\n];\n\nexport const TYPES_WITH_HOME_PAGE_AS_TARGET = [\n FEEDBACK_TYPES.OTHER,\n FEEDBACK_TYPES.MAIL_CHANGED,\n FEEDBACK_TYPES.MAIL_CHANGE_REQUEST,\n FEEDBACK_TYPES.REGISTERED,\n FEEDBACK_TYPES.REGISTRATION_CONFIRMED,\n FEEDBACK_TYPES.PASSWORD_RESET_REQUESTED,\n FEEDBACK_TYPES.PASSWORD_RESET_SET,\n FEEDBACK_TYPES.USER_ALREADY_EXISTS,\n];\n\nexport const COMMON_FEEDBACK_TRANSLATION_KEYS = {\n TITLE: 'common.feedback',\n OK_BUTTON: 'common.ok',\n};\n","export const noop = () => {};\n\nexport const invert = inMap =>\n Object.entries(inMap).reduce((acc, next) => ({ ...acc, [next[1]]: next[0] }), {});\n\nexport const not = predicate => args => !predicate(args);\n\n// eslint-disable-next-line fp/no-rest-parameters\nexport const pipe = (...fns) => fns.reduce((v, f) => (...args) => f(v(...args)));\n\n// a functionality that groups a collection of items together into an object based on a given key\nexport const groupBy = (key, array) =>\n array.reduce(\n // eslint-disable-next-line fp/no-mutating-assign\n (acc, next) => Object.assign(acc, { [next[key]]: (acc[next[key]] || []).concat(next) }),\n {},\n );\n\nexport const removeContentLinksWithEmptyTarget = contentLinks =>\n contentLinks.filter(contentLink => !!contentLink.target);\n\nexport const isFinalTestPredicate = contentLink =>\n contentLink.additionalInformation && contentLink.additionalInformation.includes('final_test');\n\nexport const capitalize = text => text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();\n\nexport const getMediaFileSizeInKBorMB = fileSizeInBytes =>\n fileSizeInBytes > 999999\n ? `${Math.floor(fileSizeInBytes / 1000000)}MB`\n : `${Math.floor(fileSizeInBytes / 1000)}KB`;\n\nexport const shuffle = array => {\n // eslint-disable-next-line\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n // eslint-disable-next-line\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n};\n\nexport const calculatePercentage = (fraction, total) => Math.round((fraction / total) * 100) || 0;\n\nexport const generateRandomNumber = (min, max) => Math.floor(Math.random() * (max - min)) + min;\n\nexport const sortObjectsByProp = (array, prop, order = 1) => {\n // eslint-disable-next-line fp/no-mutating-methods\n return [...array].sort((a, b) => {\n if (a[prop] === b[prop]) {\n return 0;\n }\n return a[prop] < b[prop] ? -order : order;\n });\n};\n","import { invert } from '../commons';\n\nexport const LANG_CODES = Object.freeze({\n NEUTRAL: '',\n GERMAN: 'de',\n ENGLISH: 'en',\n RUSSIAN: 'ru',\n CHINESE: 'zh',\n PORTUGUESE_BRAZIL: 'pt-br',\n ALBANIAN: 'sq',\n AMHARIC: 'am',\n ARABIC: 'ar',\n BENGALI: 'bn',\n BOSNIAN: 'bs',\n BULGARIAN: 'bg',\n DARI: 'fa-af',\n FRENCH: 'fr',\n GREEK: 'el',\n HAUSA: 'ha',\n HINDI: 'hi',\n INDONESIAN: 'id',\n KISWAHILI: 'sw',\n CROATIAN: 'hr',\n MACEDONIAN: 'mk',\n PASHTO: 'ps',\n PERSIAN: 'fa-ir',\n POLISH: 'pl',\n PORTUGUESE_AFRICA: 'pt-002',\n ROMANIAN: 'ro',\n SERBIAN: 'sr',\n SPANISH: 'es',\n TURKISH: 'tr',\n UKRANIAN: 'uk',\n URDU: 'ur',\n});\n\nconst codeToLang = invert(LANG_CODES);\n\nexport const toLangCode = lang => lang && LANG_CODES[lang.toUpperCase()];\nexport const toLang = code => code && codeToLang[code.toLowerCase()];\n","import { isServer } from './ssr';\n\nconst globals = {\n window: isServer() ? global.window || {} : window,\n document: isServer() ? {} : document,\n navigator: isServer() ? {} : navigator,\n localStorage: isServer() ? {} : window.localStorage,\n};\n\nexport default globals;\n","const process={\n env:{\n\n //REACT_APP_GRAPHQL_BASE_URL: \"https://learngerman.dw.com/\",\n //REACT_APP_GRAPHQL_BASE_URL: \"https://sutty.vm:4002/graphql\",\n REACT_APP_GRAPHQL_BASE_URL: null,\n REACT_APP_RECAPTCHA_SITEKEY: null,\n }\n}\n\nconst config = {\n graphQL: {\n baseUrl: process.env.REACT_APP_GRAPHQL_BASE_URL || '/graphql',\n },\n dw: {\n baseUrl: 'https://www.dw.com',\n mobileUrl: 'https://m.dw.com',\n },\n reCaptcha: {\n siteKey: process.env.REACT_APP_RECAPTCHA_SITEKEY || '6Ld5YwUTAAAAAJnUx8sjEIS5VSJ94AdGcC0BfDXV',\n },\n // static urls used on download page. Will be replaced with webapi based solution (LG-719).\n download: {\n videoBaseUrl: 'https://tvdownloaddw-a.akamaihd.net/downloads/Events/mp4/',\n audioBaseUrl: 'https://radiodownloaddw-a.akamaihd.net/downloads/Events/dwelle/',\n },\n};\n\nexport default config;\n","import { invert } from '../commons';\nimport { isServer } from '../ssr';\nimport globals from '../globals';\nimport config from '../../config';\n\nconst typeToUrlPrefixMap = {\n COURSE: 'c',\n GRAMMAR: 'gr',\n LESSON: 'l',\n PLACEMENT: 'placement',\n FINAL: 'final',\n};\nconst urlPrefixToTypeMap = invert(typeToUrlPrefixMap);\n\nexport const typeToUrlPrefix = type => {\n const typeName = type\n .replace(/([A-Z])/g, '_$1')\n .slice(1)\n .toUpperCase();\n return typeToUrlPrefixMap[type] || typeToUrlPrefixMap[typeName] || type.toLowerCase();\n};\n\nexport const urlPrefixToType = typeId => urlPrefixToTypeMap[typeId] || typeId.toUpperCase();\n\n// If it gets too complex here, then maybe better to avoid negative match\n// and list special characters. But then watch out for very special characters ◕◡◕ 😛\nconst allowedUrlCharactersRegexParts = {\n general: 'a-zA-Z',\n numbers: '0-9',\n whiteSpaces: ' ',\n allowedSpecial: '\\\\-äöüÄÖÜß',\n arabic: '\\\\u0600-\\\\u06FF',\n cyrillic: '\\\\u0400-\\\\u04FF',\n greek_and_coptic: '\\\\u0370-\\\\u03FF',\n chinese: '\\\\u4E00-\\\\u9FFF',\n devanagari: '\\\\u0900-\\\\u097F',\n bengali: '\\\\u0980-\\\\u09FF',\n ethiopian: '\\\\u1200-\\\\u137F',\n};\nconst onlySpecialCharactersRegex = new RegExp(\n `[^${Object.values(allowedUrlCharactersRegexParts).join('')}]`,\n 'g',\n);\n\nexport const normalizeUrlName = name =>\n name.replace(onlySpecialCharactersRegex, '').replace(/\\s/g, '-').toLowerCase();\n\nexport const encodeUrlNamePart = name => encodeURIComponent(normalizeUrlName(name));\n\nexport const urlForNav = ({ id }) => `/s-${id}`;\n\nexport const urlHostNameFromString = ({ url }) => {\n try {\n return new URL(url).hostname;\n } catch (e) {\n console.log(`error parsing url : ${url}\\n`, e);\n return false;\n }\n};\n\nexport const mainContentFullUrl = () => (isServer() ? null : globals.window.location.href);\n\nexport const getVideoDownloadUrl = ({ videoUrl }) => `${config.download.videoBaseUrl}${videoUrl}`;\n\nexport const getAudioDownloadUrl = ({ audioUrl }) => `${config.download.audioBaseUrl}${audioUrl}`;\n\nexport const getDownloadUrl = ({ staticBaseHost, downloadId, filename }) =>\n `${staticBaseHost}/downloads/${downloadId}/${filename.toLowerCase()}`;\n\nexport const getArticleUrl = ({ articleId, name }) =>\n `${config.dw.baseUrl}/de/${normalizeUrlName(name)}/a-${articleId}`;\n\nexport const getDWStructureUrl = ({ id, name, langCode }) =>\n `${config.dw.baseUrl}/${langCode}/${normalizeUrlName(name)}/s-${id}`;\n\nexport const getQueryParamValueFrom = ({ from = globals.window.location.search, value }) =>\n new URLSearchParams(from).get(value);\nexport const objectToQueryParams = obj => new URLSearchParams(obj).toString();\n","import { LANG_CODES } from './langMapper';\n\nconst PLACEMENT_TEST_COURSE_IDS = Object.freeze({\n [LANG_CODES.ENGLISH]: 36519788,\n [LANG_CODES.GERMAN]: 36519653,\n [LANG_CODES.ARABIC]: 36519905,\n [LANG_CODES.PERSIAN]: 45477054,\n [LANG_CODES.PORTUGUESE_BRAZIL]: 45476784,\n [LANG_CODES.RUSSIAN]: 45476947,\n [LANG_CODES.SPANISH]: 47994050,\n [LANG_CODES.FRENCH]: 47994032,\n [LANG_CODES.CHINESE]: 47993840,\n [LANG_CODES.POLISH]: 50080753,\n});\n\nexport const getPlacementTestIdForLangCode = langCode => PLACEMENT_TEST_COURSE_IDS[langCode];\n\nexport const isPlacementTestCourse = courseId => {\n const allIds = Object.values(PLACEMENT_TEST_COURSE_IDS);\n return allIds.includes(courseId);\n};\n","import { USER } from '../../constants/userUrl';\nimport { FEEDBACK_TYPES, TYPES_WITH_PROFILE_PAGE_AS_TARGET } from '../../constants/feedback';\nimport { toLangCode } from '../mappers/langMapper';\nimport { encodeUrlNamePart, typeToUrlPrefix } from './url';\nimport {\n getPlacementTestIdForLangCode,\n isPlacementTestCourse,\n} from '../mappers/placementTestCourseIds';\nimport config from '../../config';\n\nexport const PAGE_OVERVIEW = '/overview';\nexport const PAGE_REGISTRATION = '/user/register';\nexport const PAGE_PROFILE = '/user/profile';\nexport const PAGE_PASSWORD_CHANGE = '/user/password/change';\nexport const PAGE_PASSWORD_RESET = '/user/password/reset';\nexport const PAGE_VOCABULARY_TRAINER = '/user/vocabularyTrainer';\nexport const PAGE_VOCABULARY_TRAINER_START = '/user/vocabularyTrainerStart';\nexport const STATUS_FEEDBACK = '/user/feedback/status';\nexport const PAGE_GRAMMAR = '/grammar';\nconst PAGE_HELP = '/help';\nexport const PAGE_VOCABULARY = '/vocabulary';\nexport const PAGE_LEGAL = '/legal';\nexport const PAGE_PLACEMENT_TEST = '/placementDashboard';\nexport const EXERCISES_RESULT_URL_SUFFIX = 'ler';\nconst COURSE_PREFIX = 'c-';\nconst LESSON_PREFIX = 'l-';\nconst EXERCISE_PREFIX = 'e-';\nconst LESSON_GRAMMAR_URL_SUFFIX = 'gr-';\nexport const LESSON_VOCABULARY_URL_SUFFIX = 'lv';\nconst LESSON_REGIONAL_STUDIES_SUFFIX = 'rs-';\nexport const ALPHABETICAL_ORDER_URL_SUFFIX = 'la';\nexport const LESSON_MANUSCRIPT_SUFFIX = 'lm';\nexport const LESSON_EXTRAS_SUFFIX = 'le';\nexport const LESSON_EXERCISE_RESULT_SUFFIX = 'ler';\nexport const LESSON_SUMMARY_SUFFIX = 'sum';\nconst SUMMARY_URL_SUFFIX = 'sum';\nexport const URL_SEARCH_PARAM_TARGET_PATH = 'target';\n\nexport const getErrorCode = errorResponse => errorResponse && errorResponse.errorCode;\n\nexport const getPrefixedLanguageUrl = (url, langCode) => `/${langCode}${url}`;\nexport const getCasLanguageParam = langCode => {\n if (!langCode) {\n return null;\n }\n return langCode.includes('-') ? langCode.substring(0, langCode.indexOf('-')) : langCode;\n};\n\nexport const getDashboardUrl = langCode => getPrefixedLanguageUrl(PAGE_OVERVIEW, langCode);\n\nexport const getGrammarUrl = langCode => getPrefixedLanguageUrl(PAGE_GRAMMAR, langCode);\n\nexport const getVocabularyPageUrl = langCode => getPrefixedLanguageUrl(PAGE_VOCABULARY, langCode);\n\nexport const getPlacementDashboardUrl = langCode =>\n getPrefixedLanguageUrl(PAGE_PLACEMENT_TEST, langCode);\n\nexport const getLessonExerciseUrl = (languageCode, lessonId, normalizedUrlName, lessonPartId) =>\n `${getLessonUrl(lessonId, languageCode, normalizedUrlName)}/${EXERCISE_PREFIX}${lessonPartId}`;\n\nexport const getLessonGrammarUrl = (languageCode, lessonId, normalizedUrlName, lessonPartId) =>\n `${getLessonUrl(\n lessonId,\n languageCode,\n normalizedUrlName,\n )}/${LESSON_GRAMMAR_URL_SUFFIX}${lessonPartId}`;\n\nexport const getLessonPhonemicChartUrl = (languageCode, lessonId, normalizedUrlName) =>\n `${getLessonUrl(lessonId, languageCode, normalizedUrlName)}/${ALPHABETICAL_ORDER_URL_SUFFIX}`;\n\nexport const getLessonVocabularyUrl = (languageCode, lessonId, normalizedUrlName) =>\n `${getLessonUrl(lessonId, languageCode, normalizedUrlName)}/${LESSON_VOCABULARY_URL_SUFFIX}`;\n\nexport const getLessonRegionalStudiesUrl = (\n languageCode,\n lessonId,\n normalizedUrlName,\n lessonPartId,\n) =>\n `${getLessonUrl(\n lessonId,\n languageCode,\n normalizedUrlName,\n )}/${LESSON_REGIONAL_STUDIES_SUFFIX}${lessonPartId}`;\n\nexport const getRegisterUrl = langCode => getPrefixedLanguageUrl(PAGE_REGISTRATION, langCode);\n\nexport const getUserProfileUrl = langCode => getPrefixedLanguageUrl(PAGE_PROFILE, langCode);\n\nexport const getPasswordChangeUrl = langCode =>\n getPrefixedLanguageUrl(PAGE_PASSWORD_CHANGE, langCode);\n\nexport const getPasswordResetUrl = langCode =>\n getPrefixedLanguageUrl(PAGE_PASSWORD_RESET, langCode);\n\nexport const getCourseUrl = (courseId, langCode, normalizedUrlCourseName) =>\n getPrefixedLanguageUrl(`/${normalizedUrlCourseName}/${COURSE_PREFIX}${courseId}`, langCode);\n\nexport const getLessonUrl = (lessonId, languageCode, normalizedUrlLessonName) =>\n getPrefixedLanguageUrl(`/${normalizedUrlLessonName}/${LESSON_PREFIX}${lessonId}`, languageCode);\n\nexport const getLessonExercisesResultUrl = lessonUrl =>\n `${lessonUrl}/${EXERCISES_RESULT_URL_SUFFIX}`;\n\nexport const getFirstGrammarUrl = (lessonUrl, firstGrammarId) =>\n `${lessonUrl}/gr-${firstGrammarId}`;\n\nexport const getVocabularyUrl = lessonUrl => `${lessonUrl}/${LESSON_VOCABULARY_URL_SUFFIX}`;\n\nexport const getAlphabeticalOrderUrl = lessonUrl => `${lessonUrl}/${ALPHABETICAL_ORDER_URL_SUFFIX}`;\n\nexport const getFirstRegionalStudiesUrl = (lessonUrl, firstRegionalStudiesId) =>\n `${lessonUrl}/${LESSON_REGIONAL_STUDIES_SUFFIX}${firstRegionalStudiesId}`;\n\nexport const getManuscriptUrl = lessonUrl => `${lessonUrl}/${LESSON_MANUSCRIPT_SUFFIX}`;\n\nexport const getExtrasUrl = lessonUrl => `${lessonUrl}/${LESSON_EXTRAS_SUFFIX}`;\n\nexport const getSummaryUrl = lessonUrl => `${lessonUrl}/${SUMMARY_URL_SUFFIX}`;\n\nexport const getPlacementTestResultUrl = ({ langCode, id, name }) =>\n getPrefixedLanguageUrl(`/${name}/placement-${id}`, langCode);\n\nexport const transformUrlContentPrefix = (lessonPath, type) =>\n lessonPath.replace('/l-', `/${type}-`);\n\nexport const createLinkToResultPage = ({ courseId, isFinalTest, lessonPath }) => {\n if (isFinalTest) return transformUrlContentPrefix(lessonPath, 'final');\n\n if (isPlacementTestCourse(courseId)) return transformUrlContentPrefix(lessonPath, 'placement');\n\n return getLessonExercisesResultUrl(lessonPath);\n};\n\nexport const getHelpUrl = langCode => getPrefixedLanguageUrl(PAGE_HELP, langCode);\nexport const getLegalUrl = langCode => getPrefixedLanguageUrl(PAGE_LEGAL, langCode);\n\nexport const getCourseCertificateUrl = paramUrl =>\n getPrefixedLanguageUrl(`/certificate/${paramUrl}`);\n\nexport const getVocabularyTrainerStartPage = langCode =>\n getPrefixedLanguageUrl(PAGE_VOCABULARY_TRAINER_START, langCode);\n\nexport const getVocabularyTrainerPage = langCode =>\n getPrefixedLanguageUrl(PAGE_VOCABULARY_TRAINER, langCode);\n\nexport const getTargetPageUrl = (type, langCode) => {\n return TYPES_WITH_PROFILE_PAGE_AS_TARGET.includes(type)\n ? getPrefixedLanguageUrl(PAGE_PROFILE, langCode)\n : getDashboardUrl(langCode);\n};\n\nexport const getFeedbackUrl = (type, langCode) =>\n getPrefixedLanguageUrl(`${STATUS_FEEDBACK}/${type}`, langCode);\n\nexport const getLoginPage = (origin, langCode, targetPath) => {\n const callbackUrl = origin + getFeedbackUrl(FEEDBACK_TYPES.LOGIN, langCode);\n return getLoginRedirectUrl(callbackUrl, langCode, false, targetPath);\n};\n\nconst getLoginUrlSearchParamsString = (langCode, targetPath) => {\n return targetPath ? `?${URL_SEARCH_PARAM_TARGET_PATH}=${encodeURIComponent(targetPath)}` : '';\n};\n\nexport const getLoginRedirectUrl = (callbackUrl, langCode, withDomain, targetPath) => {\n const urlSearchParams = getLoginUrlSearchParamsString(langCode, targetPath);\n const AUTH_SERVICE_PREFIX = withDomain ? USER.AS_URL_WITH_DOMAIN : USER.AS_URL;\n return `${AUTH_SERVICE_PREFIX}login?service=${encodeURIComponent(\n `${callbackUrl}${urlSearchParams}`,\n )}&locale=${getCasLanguageParam(langCode)}`;\n};\n\nexport const getContentUrl = ({ id, name, language, __typename }) => {\n const langCode = toLangCode(language);\n const langUrlPart = language ? `/${langCode}` : '';\n\n if (id === getPlacementTestIdForLangCode(langCode)) {\n return getPlacementDashboardUrl(langCode);\n }\n\n const nameUrlPart = name ? `/${encodeUrlNamePart(name)}` : '';\n return `${langUrlPart}${nameUrlPart}/${typeToUrlPrefix(__typename)}-${id}`;\n};\n\nexport const getFooterLinkForNamedUrl = ({ namedUrl }) => `${config.dw.mobileUrl}${namedUrl}`;\n\nexport const getDwUrlWithLang = ({ langCode }) => `${config.dw.baseUrl}/${langCode}`;\n\nexport const getDwContactUrl = () => `${config.dw.mobileUrl}/contact`;\n","import { useState, useEffect } from 'react';\nimport globals from '../utils/globals';\nimport { isServer } from '../utils/ssr';\n\nconst CUSTOM_LS_EVENT_NAME = 'local-storage';\n\nconst readValue = key => {\n if (isServer()) {\n return null;\n }\n return JSON.parse(globals.localStorage.getItem(key));\n};\n\nexport const useLocalStorage = key => {\n const [storedValue, setStoredValue] = useState(readValue(key));\n\n const setValue = value => {\n if (!isServer()) {\n globals.localStorage.setItem(key, JSON.stringify(value));\n setStoredValue(value);\n\n // We dispatch a custom event so every useLocalStorage hook are notified\n globals.window.dispatchEvent(new Event(CUSTOM_LS_EVENT_NAME));\n }\n };\n\n useEffect(() => {\n const handleStorageChange = () => {\n setStoredValue(readValue(key));\n };\n\n // this only works for other documents, not the current one\n globals.window.addEventListener('storage', handleStorageChange);\n // this is a custom event, triggered in writeValueToLocalStorage\n globals.window.addEventListener(CUSTOM_LS_EVENT_NAME, handleStorageChange);\n\n return () => {\n globals.window.removeEventListener('storage', handleStorageChange);\n globals.window.removeEventListener(CUSTOM_LS_EVENT_NAME, handleStorageChange);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return [storedValue, setValue];\n};\n","import { LANG_CODES } from '../utils/mappers/langMapper';\n\nconst CHINESE_SIMP_POSTFIX = '_simp';\nconst CHINESE_TRAD_POSTFIX = '_trad';\n\nexport const CHINESE_SIMP_TRANSLATION_KEY = `${LANG_CODES.CHINESE}${CHINESE_SIMP_POSTFIX}`;\nexport const CHINESE_TRAD_TRANSLATION_KEY = `${LANG_CODES.CHINESE}${CHINESE_TRAD_POSTFIX}`;\n\nexport const MENU_LANGUAGES = [\n { translationKey: LANG_CODES.GERMAN, langCode: LANG_CODES.GERMAN },\n { translationKey: LANG_CODES.ENGLISH, langCode: LANG_CODES.ENGLISH },\n { translationKey: LANG_CODES.ARABIC, langCode: LANG_CODES.ARABIC },\n { translationKey: LANG_CODES.RUSSIAN, langCode: LANG_CODES.RUSSIAN },\n { translationKey: LANG_CODES.PERSIAN, langCode: LANG_CODES.PERSIAN },\n { translationKey: LANG_CODES.SPANISH, langCode: LANG_CODES.SPANISH },\n { translationKey: LANG_CODES.PORTUGUESE_BRAZIL, langCode: LANG_CODES.PORTUGUESE_BRAZIL },\n { translationKey: LANG_CODES.POLISH, langCode: LANG_CODES.POLISH },\n { translationKey: LANG_CODES.FRENCH, langCode: LANG_CODES.FRENCH },\n { translationKey: CHINESE_SIMP_TRANSLATION_KEY, langCode: LANG_CODES.CHINESE },\n { translationKey: CHINESE_TRAD_TRANSLATION_KEY, langCode: LANG_CODES.CHINESE },\n { translationKey: LANG_CODES.TURKISH, langCode: LANG_CODES.TURKISH },\n];\n","import { useEffect, useRef } from 'react';\nimport { isServer } from '../utils/ssr';\nimport globals from '../utils/globals';\n\nexport const useTimeout = ({ callback, delay = 100, conditional = true }, triggers = []) => {\n const savedCallback = useRef();\n\n useEffect(() => {\n // eslint-disable-next-line fp/no-mutation\n savedCallback.current = callback;\n }, [callback]);\n\n useEffect(() => {\n const tick = () => savedCallback.current();\n if (isServer() || !conditional) {\n return undefined;\n }\n const handleId = globals.window.setTimeout(tick, delay);\n return () => globals.window.clearTimeout(handleId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [delay, conditional, ...triggers]);\n};\n","/* eslint-disable fp/no-mutation, react-hooks/exhaustive-deps */\nimport { useEffect } from 'react';\nimport globals from '../utils/globals';\n\nconst loadScript = (url, target) =>\n new Promise((resolve, reject) => {\n const tag = globals.document.createElement('script');\n tag.async = false;\n tag.src = url;\n target.appendChild(tag);\n tag.addEventListener('load', resolve, {\n once: true,\n });\n tag.addEventListener('error', reject, {\n once: true,\n });\n });\n\nexport const useScripts = (scriptUrls = [], cb) => {\n useEffect(async () => {\n if (scriptUrls.length > 0) {\n const querySelectorForAllScriptTags = scriptUrls.map(\n scriptUrl => `script[src=\"${scriptUrl}\"]`,\n );\n const existingScriptTags = globals.document.querySelectorAll(querySelectorForAllScriptTags);\n if (existingScriptTags.length !== scriptUrls.length) {\n Promise.all(scriptUrls.map(url => loadScript(url, globals.document.body))).then(cb);\n } else {\n cb();\n }\n }\n }, [scriptUrls]);\n};\n","/* eslint-disable no-undef, react-hooks/exhaustive-deps */\nimport { useEffect, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { useLocalStorage } from './useLocalStorage';\nimport { useTimeout } from './useTimeout';\nimport globals from '../utils/globals';\nimport { useScripts } from './useScripts';\nimport { LANG_CODES } from '../utils/mappers/langMapper';\n\n// located in public folder\n// @VisibleForTesting\nexport const tongwenScripts = [\n '/tongwen/tongwen_core.min.js',\n '/tongwen/tongwen_table_s2t.min.js',\n '/tongwen/tongwen_table_t2s.min.js',\n '/tongwen/tongwen_table_ps2t.min.js',\n '/tongwen/tongwen_table_pt2s.min.js',\n];\n\nexport const TRADITIONAL_CHIN_LOCAL_STORAGE_KEY = 'isTraditionalChin';\nexport const URL_GET_PARAM_NAME = 'zhongwen';\nexport const URL_GET_PARAM_SIMPLIFIED = 'simp';\nexport const URL_GET_PARAM_TRADITIONAL = 'trad';\n\nconst TOGGLE_BUTTON_SIMPLE_TEXT_CONTENT = '简';\nconst TOGGLE_BUTTON_TRADITIONAL_TEXT_CONTENT = '繁';\n\nexport const useChineseSimpleTraditionalSwitch = (langCode, toggleButtonId) => {\n const isChineseLangCode = langCode === LANG_CODES.CHINESE;\n const scripts = isChineseLangCode ? tongwenScripts : [];\n const [isScriptsLoaded, setScriptsLoaded] = useState(false);\n const [isTranslatedFirstTime, setTranslatedFirstTime] = useState(false);\n useScripts(scripts, () => setScriptsLoaded(true));\n\n const [isTraditionalChin, setIsTraditionalChin] = useLocalStorage(\n TRADITIONAL_CHIN_LOCAL_STORAGE_KEY,\n );\n const { search } = useLocation();\n\n const setToggleButtonTextContent = content => {\n // eslint-disable-next-line fp/no-mutation\n globals.document.getElementById(toggleButtonId).textContent = content;\n };\n\n // used to consider url request param if available\n useEffect(() => {\n if (search) {\n const cleanedSearch = search.replace('?', '');\n const urlParams = new URLSearchParams(cleanedSearch);\n const chineseVersionRequestParam = urlParams.get(URL_GET_PARAM_NAME);\n if (chineseVersionRequestParam === URL_GET_PARAM_SIMPLIFIED) {\n setIsTraditionalChin(false);\n } else if (chineseVersionRequestParam === URL_GET_PARAM_TRADITIONAL) {\n setIsTraditionalChin(true);\n }\n }\n }, []);\n\n // translate content on first load related to current local storage value\n useTimeout({\n callback: () => {\n if (isChineseLangCode && isScriptsLoaded) {\n isTraditionalChin\n ? TongWen.trans2Trad(globals.document)\n : TongWen.trans2Simp(globals.document);\n setTranslatedFirstTime(true);\n }\n },\n delay: 300,\n });\n\n // if translated initially or later with toggling button - we need to set button content again\n // because the simple one is also translated into the traditional one.\n useTimeout(\n {\n callback: () => {\n if (isTraditionalChin) {\n setToggleButtonTextContent(TOGGLE_BUTTON_SIMPLE_TEXT_CONTENT);\n } else {\n setToggleButtonTextContent(TOGGLE_BUTTON_TRADITIONAL_TEXT_CONTENT);\n }\n },\n delay: 300,\n },\n [isTraditionalChin, isTranslatedFirstTime],\n );\n\n const trans2Simple = () => {\n if (isScriptsLoaded) {\n TongWen.trans2Simp(globals.document);\n setIsTraditionalChin(false);\n }\n };\n\n const trans2Traditional = () => {\n if (isScriptsLoaded) {\n TongWen.trans2Trad(globals.document);\n setIsTraditionalChin(true);\n }\n };\n\n return { isTraditionalChin, trans2Simple, trans2Traditional };\n};\n","import classnames from 'classnames';\nimport styled from 'styled-components';\nimport { ReactComponent as TickImg } from '../../../assets/svg/tick.svg';\nimport { getDashboardUrl } from '../../../utils/url/urlFactory';\nimport { useI18nContext } from '../../../context/I18nContext';\nimport { useLocalStorage } from '../../../hooks/useLocalStorage';\nimport { LANG_CODES } from '../../../utils/mappers/langMapper';\nimport {\n CHINESE_SIMP_TRANSLATION_KEY,\n CHINESE_TRAD_TRANSLATION_KEY,\n} from '../../../constants/menuLanguageCodes';\nimport {\n TRADITIONAL_CHIN_LOCAL_STORAGE_KEY,\n URL_GET_PARAM_NAME,\n URL_GET_PARAM_SIMPLIFIED,\n URL_GET_PARAM_TRADITIONAL,\n} from '../../../hooks/useChineseSimpleTraditionalSwitch';\nimport { colors, resolutions } from '../../../utils/css';\n\nconst isLanguageSelected = ({ languageTranslationKey, currentLanguage, isTraditionalChin }) => {\n const isCurrentLanguageChinese = currentLanguage === LANG_CODES.CHINESE;\n if (isCurrentLanguageChinese) {\n return (\n (isTraditionalChin && languageTranslationKey === CHINESE_TRAD_TRANSLATION_KEY) ||\n (!isTraditionalChin && languageTranslationKey === CHINESE_SIMP_TRANSLATION_KEY)\n );\n }\n return languageTranslationKey === currentLanguage;\n};\n\nconst getDashBoardUrlForLanguage = ({ languageTranslationKey, language }) => {\n const dashboardBaseUrl = getDashboardUrl(language);\n if (languageTranslationKey === CHINESE_SIMP_TRANSLATION_KEY) {\n return `${dashboardBaseUrl}?${URL_GET_PARAM_NAME}=${URL_GET_PARAM_SIMPLIFIED}`;\n }\n if (languageTranslationKey === CHINESE_TRAD_TRANSLATION_KEY) {\n return `${dashboardBaseUrl}?${URL_GET_PARAM_NAME}=${URL_GET_PARAM_TRADITIONAL}`;\n }\n return dashboardBaseUrl;\n};\n\nexport const LanguageSelectionButton = ({\n language,\n translationKey: languageTranslationKey,\n langCode: currentLanguage,\n}) => {\n const { i18n } = useI18nContext();\n const [isTraditionalChin] = useLocalStorage(TRADITIONAL_CHIN_LOCAL_STORAGE_KEY);\n\n return (\n \n \n \n {`${i18n.t(`header.menu.language.${languageTranslationKey}`)} - ${i18n.t(\n `header.menu.language.native.${languageTranslationKey}`,\n )}`}\n \n \n \n \n \n \n \n \n );\n};\n\nexport const StyledLanguageSelectionButton = styled('li')`\n border-bottom: 1px solid ${colors.LG_BLUE_4};\n display: block;\n float: left;\n width: 100%;\n\n &:first-child {\n border-top: 1px solid ${colors.LG_BLUE_4};\n }\n\n span {\n padding: 0 10px;\n }\n\n .lang-nav {\n display: inline-block;\n padding: 20px 25px;\n width: 100%;\n\n @media (min-width: ${resolutions.min.tablet}px) {\n padding: 20px;\n }\n }\n`;\n","export const API_CALL = 'API_CALL';\n\nexport const apiAction = ({\n url = '',\n method = 'GET',\n data = null,\n onSuccess = () => {},\n onFailure = () => {},\n headersOverride = null,\n}) => ({\n type: API_CALL,\n payload: {\n url,\n method,\n data,\n onSuccess,\n onFailure,\n headersOverride,\n },\n});\n","export const JSON_CONTENT_TYPE = 'application/json';\n\nexport const BASIC_JSON_CONTENT_TYPE_HEADER = {\n headers: {\n 'Content-Type': JSON_CONTENT_TYPE,\n },\n};\n","export const buildParamRegex = paramName =>\n new RegExp(`[?&]${encodeURIComponent(paramName)}=([^&]*)`);\n\n// eslint-disable-next-line consistent-return\nexport const getFromUrl = (url, name, regexBuilder) => {\n const paramRegex = regexBuilder(name);\n const matchArray = paramRegex.exec(url);\n if (matchArray) {\n return decodeURIComponent(matchArray[1]);\n }\n};\n\nexport const getSearchParam = (location, name) =>\n getFromUrl(location.search, name, buildParamRegex);\n\nexport const removeSearchParam = (location, name) => {\n const paramRegex = buildParamRegex(name);\n const rawWiththoutParam = location.search ? location.search.replace(paramRegex, '') : '';\n if (rawWiththoutParam && rawWiththoutParam[0] !== '?') {\n return `?${rawWiththoutParam.substring(1)}`;\n }\n return rawWiththoutParam;\n};\n\nexport const containsSearchParam = (location, name) => {\n const paramRegex = buildParamRegex(name);\n return paramRegex.test(location.search);\n};\n\nexport const getPathVariable = (location, name) =>\n getFromUrl(location.pathname, name, buildPathVariableRegex);\n\nconst buildPathVariableRegex = pathVariablePrefix =>\n new RegExp(`${encodeURIComponent(pathVariablePrefix)}-(\\\\d*)`);\n\nexport const isPathInExerciseNavigationWhiteList = pathname => {\n const permittedNavigationPathsRegexp = new RegExp(\n /(\\/e-[0-9]+|\\/ler|\\/placement-[0-9]+|\\/final-[0-9]+)$/,\n 'g',\n );\n return permittedNavigationPathsRegexp.test(pathname);\n};\n","import { getSearchParam, removeSearchParam } from './url/urlUtils';\nimport { USER } from '../constants/userUrl';\n\nexport const getTicketFromUrlParam = location => getSearchParam(location, USER.TICKET_PARAM_NAME);\n\nexport const getTicketDomain = (origin, location) =>\n encodeURIComponent(\n origin + location.pathname + removeSearchParam(location, USER.TICKET_PARAM_NAME),\n );\n\nexport const formatRegistrationUserData = ({ userData, captchaToken, langCode }) => {\n const {\n sex,\n firstName,\n lastName,\n email,\n password,\n country,\n teacher,\n newsletter,\n year,\n } = userData;\n\n return {\n sex,\n firstName,\n lastName,\n email,\n password,\n country,\n 'g-recaptcha-response': captchaToken,\n teacher,\n newsletter,\n recaptcha: captchaToken,\n contactLanguage: langCode,\n ...(year && createDateOfBirth({ year })),\n };\n};\n\nexport const formatUserProfileData = ({ data }) => {\n const { year, ...restProps } = data;\n\n return {\n ...restProps,\n ...(year && createDateOfBirth({ year })),\n };\n};\n\nconst createDateOfBirth = ({ year }) => ({\n dateOfBirth: `${year}-01-01`,\n});\n\nexport const deconstructDateOfBirth = dateOfBirth => {\n if (!dateOfBirth) return {};\n\n const datePartials = dateOfBirth.split('-');\n\n return {\n year: datePartials[0],\n month: datePartials[1],\n day: datePartials[2],\n };\n};\n","import { USER } from '../constants/userUrl';\nimport { BASIC_JSON_CONTENT_TYPE_HEADER } from '../constants/services';\nimport { formatRegistrationUserData, formatUserProfileData } from '../utils/userUtils';\n\nexport const LOGOUT_SUFFIX = 'public/logout';\nconst NOT_LOGGED_USER_SUFFIX = 'public/user';\nconst LOGGED_USER_SUFFIX = 'protected/user';\nexport const PROFILE_SUFFIX = 'profile';\nconst REGISTRATION_SUFFIX = 'registration';\nexport const PS_PREFIX = USER.PS_URL;\nconst NOT_LOGGED_USER_RESOURCE = `${PS_PREFIX}${NOT_LOGGED_USER_SUFFIX}`;\nexport const LOGGED_USER_RESOURCE = `${PS_PREFIX}${LOGGED_USER_SUFFIX}`;\nexport const CONFIRMATION_RESOURCE = `${PS_PREFIX}public/registration/confirmation`;\n\nexport const registerUser = ({ userData, captchaToken, langCode }) => {\n const formattedData = formatRegistrationUserData({ userData, captchaToken, langCode });\n return fetch(`${NOT_LOGGED_USER_RESOURCE}/${REGISTRATION_SUFFIX}`, {\n method: 'POST',\n body: JSON.stringify(formattedData),\n dataType: 'json',\n ...BASIC_JSON_CONTENT_TYPE_HEADER,\n });\n};\n\nexport const deleteUser = () =>\n fetch(LOGGED_USER_RESOURCE, {\n method: 'DELETE',\n }).catch(msg => {\n console.error(`Something went wrong: ${JSON.stringify(msg)}`);\n });\n\nexport const checkUserProfile = () =>\n fetch(`${LOGGED_USER_RESOURCE}/${PROFILE_SUFFIX}`, {\n ...BASIC_JSON_CONTENT_TYPE_HEADER,\n }).catch(response => {\n console.error(`Unable to retrieve user:${JSON.stringify(response)}`);\n });\n\nexport const getUserProfile = () =>\n fetch(`${LOGGED_USER_RESOURCE}/${PROFILE_SUFFIX}`, {\n ...BASIC_JSON_CONTENT_TYPE_HEADER,\n })\n .then(response => response.json())\n .catch(response => {\n console.error(`Unable to retrieve user:${JSON.stringify(response)}`);\n });\n\nexport const updateUserProfile = data => {\n const userData = formatUserProfileData({ data });\n return fetch(`${LOGGED_USER_RESOURCE}/${PROFILE_SUFFIX}`, {\n ...BASIC_JSON_CONTENT_TYPE_HEADER,\n method: 'POST',\n body: JSON.stringify(userData),\n }).then(response => (response.ok ? response.json() : Promise.reject(response)));\n};\n\nexport const validateUserTicket = (ticket, ticketDomain) => {\n const VALIDATE_TICKET_URL = `${PS_PREFIX}public/login?ticket=${ticket}&ticketDomain=${ticketDomain}`;\n\n return fetch(VALIDATE_TICKET_URL);\n};\n\nexport const getUserByToken = token => fetch(`${NOT_LOGGED_USER_RESOURCE}/mail?token=${token}`);\n\nexport const confirmUserRegistration = confirmationId => {\n return fetch(`${CONFIRMATION_RESOURCE}?confirmationId=${confirmationId}`, {\n ...BASIC_JSON_CONTENT_TYPE_HEADER,\n method: 'POST',\n });\n};\n\nexport const userService = {\n deleteUser,\n updateUserProfile,\n};\n","export const sumScore = (contentsWithScore, scoreFieldName) =>\n contentsWithScore.reduce(\n (acc, nextContentWithScore) => acc + nextContentWithScore[scoreFieldName],\n 0,\n );\n","const filterLessonFields = ['userId', 'lastModifiedDate', 'cosLessonVersion'];\nconst filterExerciseFields = ['cosExerciseVersion'];\nconst filterInquiryFields = ['minCorrectScore'];\n\n/**\n * Function which is responsible for removing currently not needed/wanted attributes from\n * server response on all hierarchy levels (lesson->exercise->inquiry). Those attributes\n * are provided from the server due to the current data model.\n *\n * @param payload - the server response with lesson progress data\n * @returns {*&{exerciseProgresses}}\n */\nexport const filterDataFromService = payload => {\n const filteredLessonData = removeObjectAttributes(payload, filterLessonFields);\n const { exerciseProgresses } = filteredLessonData;\n const filteredExerciseProgresses = filterExerciseData(exerciseProgresses);\n\n return { ...filteredLessonData, exerciseProgresses: filteredExerciseProgresses };\n};\n\nconst filterExerciseData = exerciseProgresses => {\n return exerciseProgresses.map(exerciseProgress => {\n const filteredExerciseProgress = removeObjectAttributes(exerciseProgress, filterExerciseFields);\n const { inquiryProgresses } = filteredExerciseProgress;\n const filteredInquiryProgresses = filterInquiryData(inquiryProgresses);\n\n return { ...filteredExerciseProgress, inquiryProgresses: filteredInquiryProgresses };\n });\n};\n\nconst filterInquiryData = inquiryProgresses => {\n return inquiryProgresses.map(inquiryProgress =>\n removeObjectAttributes(inquiryProgress, filterInquiryFields),\n );\n};\n\nconst removeObjectAttributes = (sourceObject, attributesToRemoveArray) => {\n const targetObject = { ...sourceObject };\n attributesToRemoveArray.forEach(field => {\n if (field in targetObject) {\n // eslint-disable-next-line fp/no-delete\n delete targetObject[field];\n }\n });\n return targetObject;\n};\n","import gql from 'graphql-tag';\nimport { sumScore } from './utils';\nimport { filterDataFromService } from './serverDataFilterUtils';\n\n/**\n * the following data structure is generated here as lesson progress state for the global state\n{\n cosLessonId: 37250531,\n cosCourseId: 36519789,\n doneExerciseCount: 1,\n allExerciseCount: 12,\n maxPointsForAllExercises: 35,\n resultPoints: 1,\n exerciseProgresses: [\n {\n cosExerciseId: 42382962,\n resultPoints: 1,\n maxPoints: 2,\n inquiryProgresses: [\n {\n inquiryId: 42382995,\n score: 1,\n maxScore: 1,\n },\n {\n inquiryId: 42382999,\n score: 0,\n maxScore: 1,\n }\n ]\n }],\n}\n */\n\nconst getLearningMetaInfoFragment = (name, type, handicap) => {\n const targetHandicap = handicap ? `(handicap: ${handicap})` : '';\n\n return gql`fragment ${type}${name}${handicap || ''} on ${type} {\n learningMetaInfo${targetHandicap} {\n achievableScore\n exerciseCount\n }\n }\n `;\n};\n\nexport const scoreFragment = {\n name: 'Score',\n fragment({ type, addLearningMetaInfo = true, handicap }) {\n return addLearningMetaInfo\n ? getLearningMetaInfoFragment(this.name, type, handicap)\n : gql`fragment ${type}${this.name}${handicap || ''} on ${type} {\n id\n }\n `;\n },\n};\n\nexport const createInquiryProgressMetaData = ({ inquiryId, score, achievableScore }) => {\n return { inquiryId, score, maxScore: achievableScore };\n};\n\nexport const createLearnProgressData = ({\n langCode,\n lessonId,\n courseId,\n lessonAchievableScore,\n exerciseId,\n allExerciseCount,\n exerciseProgress,\n exerciseAchievableScore,\n}) => {\n return {\n language: langCode,\n cosLessonId: lessonId,\n cosCourseId: courseId,\n maxPointsForAllExercises: lessonAchievableScore,\n cosExerciseId: exerciseId,\n allExerciseCount,\n exerciseProgress,\n exerciseAchievableScore,\n };\n};\n\nexport const initializeLessonLearnProgressWithDataFromServer = ({ lessonProgresses = [] }) => {\n const filteredLessonProgresses = lessonProgresses.map(lessonProgress =>\n filterDataFromService(lessonProgress),\n );\n return { lessons: filteredLessonProgresses };\n};\n\nexport const initializeCourseLearnProgressWithDataFromServer = ({ courseProgresses = [] }) => {\n return { courses: courseProgresses };\n};\n\nexport const updateLessonProgressFromService = ({ lessons, lessonProgress }) => {\n const filteredLessonProgress = filterDataFromService(lessonProgress);\n const existingLesson = findExistingLesson({ lessons, lessonProgress: filteredLessonProgress });\n if (existingLesson) {\n const otherLessons = lessons.filter(\n lesson => lesson.cosLessonId !== filteredLessonProgress.cosLessonId,\n );\n return { lessons: [...otherLessons, filteredLessonProgress] };\n }\n return {\n lessons: [...lessons, filteredLessonProgress],\n };\n};\n\nexport const deleteLessonProgressById = ({ lessons, lessonId }) => {\n const lessonProgressToDelete = findExistingLessonById({ lessons, lessonId });\n if (!lessonProgressToDelete) {\n return { lessons };\n }\n const otherLessons = lessons.filter(lesson => lesson.cosLessonId !== lessonId);\n return { lessons: [...otherLessons] };\n};\n\nexport const deleteLessonProgressesByCourseId = ({ lessons, courseId }) => {\n return { lessons: lessons.filter(lesson => lesson.cosCourseId !== courseId) };\n};\n\nexport const deleteCourseProgressById = ({ courses, courseId }) => {\n const courseProgressToDelete = findExistingCourseById({ courses, courseId });\n if (!courseProgressToDelete) {\n return { courses };\n }\n const otherCourses = courses.filter(course => course.cosCourseId !== courseId);\n return { courses: [...otherCourses] };\n};\n\nexport const addCourseProgressData = ({ courses, courseProgress }) => {\n const existingCourseProgress = findExistingCourseById({\n courses,\n courseId: courseProgress.cosCourseId,\n });\n\n if (existingCourseProgress) {\n const otherCourses = courses.filter(\n course => course.cosCourseId !== courseProgress.cosCourseId,\n );\n return {\n courses: [...otherCourses, courseProgress],\n };\n }\n\n return { courses: [...courses, courseProgress] };\n};\n\nexport const findExistingLessonById = ({ lessons, lessonId }) => {\n return lessons.find(lesson => lesson.cosLessonId === lessonId);\n};\n\nexport const findExistingCourseById = ({ courses, courseId }) => {\n return courses.find(course => course.cosCourseId === courseId);\n};\n\nexport const findExistingLesson = ({ lessons, lessonProgress }) => {\n return lessons.find(lesson => lesson.cosLessonId === lessonProgress.cosLessonId);\n};\n\nexport const findInquiryProgress = ({ lessons, lessonId, exerciseId }) => {\n const lesson = findExistingLessonById({ lessons, lessonId });\n if (!lesson) {\n return [];\n }\n const { exerciseProgresses } = lesson;\n\n const currentExerciseProgress = exerciseProgresses.find(\n exerciseProgress => exerciseProgress.cosExerciseId === exerciseId,\n );\n\n if (!currentExerciseProgress) {\n return [];\n }\n const { inquiryProgresses = [] } = currentExerciseProgress;\n return inquiryProgresses;\n};\n\nexport const generateLessonProgress = ({ lessons, lessonProgress }) => {\n const { exerciseProgress } = lessonProgress;\n if (exerciseProgress.inquiryProgresses.length === 0) {\n return { lessons };\n }\n const existingLesson = findExistingLesson({ lessons, lessonProgress });\n if (existingLesson) {\n const otherLessons = lessons.filter(\n lesson => lesson.cosLessonId !== lessonProgress.cosLessonId,\n );\n return {\n lessons: [...otherLessons, updateExistingLessonMetaData(existingLesson, lessonProgress)],\n };\n }\n return {\n lessons: [...lessons, createNewLessonMetaData(lessonProgress)],\n };\n};\n\nconst updateExerciseMetaDataForExistingLesson = (existingLesson, lessonProgress) => {\n const { exerciseProgresses } = existingLesson;\n const existingExercise = exerciseProgresses.find(\n exercise => exercise.cosExerciseId === lessonProgress.cosExerciseId,\n );\n if (existingExercise) {\n const otherExercises = exerciseProgresses.filter(\n exercise => exercise.cosExerciseId !== lessonProgress.cosExerciseId,\n );\n return [...otherExercises, updateExerciseMetaData(existingExercise, lessonProgress)];\n }\n return [...exerciseProgresses, createNewExerciseMetaData(lessonProgress)];\n};\n\nconst updateExistingLessonMetaData = (existingLesson, lessonProgress) => {\n const newExerciseProgresses = [\n ...updateExerciseMetaDataForExistingLesson(existingLesson, lessonProgress),\n ];\n const newDoneExerciseCount = newExerciseProgresses.length;\n\n const updatedLesson = {\n ...existingLesson,\n doneExerciseCount: newDoneExerciseCount,\n exerciseProgresses: newExerciseProgresses,\n };\n return {\n ...updatedLesson,\n resultPoints: sumScore(updatedLesson.exerciseProgresses, 'resultPoints'),\n };\n};\n\nconst createNewLessonMetaData = lessonProgress => {\n const exerciseProgresses = [createNewExerciseMetaData(lessonProgress)];\n const {\n cosLessonId,\n cosCourseId,\n allExerciseCount,\n maxPointsForAllExercises,\n language,\n } = lessonProgress;\n const newLesson = {\n language,\n cosLessonId,\n cosCourseId,\n allExerciseCount,\n doneExerciseCount: exerciseProgresses.length,\n maxPointsForAllExercises,\n exerciseProgresses,\n };\n\n return { ...newLesson, resultPoints: sumScore(newLesson.exerciseProgresses, 'resultPoints') };\n};\n\nconst createNewExerciseMetaData = lessonProgress => {\n const { cosExerciseId, exerciseProgress, exerciseAchievableScore } = lessonProgress;\n return {\n cosExerciseId,\n maxPoints: exerciseAchievableScore,\n resultPoints: sumScore(exerciseProgress.inquiryProgresses, 'score'),\n inquiryProgresses: exerciseProgress.inquiryProgresses,\n };\n};\n\nconst updateExerciseMetaData = (existingExercise, lessonProgress) => {\n const { cosExerciseId, exerciseProgress, exerciseAchievableScore } = lessonProgress;\n\n const cleanedExistingInquiryProgresses = existingExercise.inquiryProgresses.filter(\n inquiryProgress =>\n !exerciseProgress.inquiryProgresses.some(\n newInquiryProgress => newInquiryProgress.inquiryId === inquiryProgress.inquiryId,\n ),\n );\n\n const inquiryProgresses = [\n ...cleanedExistingInquiryProgresses,\n ...exerciseProgress.inquiryProgresses,\n ];\n\n return {\n cosExerciseId,\n maxPoints: exerciseAchievableScore,\n resultPoints: sumScore(inquiryProgresses, 'score'),\n inquiryProgresses,\n };\n};\n","import { BASIC_JSON_CONTENT_TYPE_HEADER } from '../constants/services';\nimport { USER } from '../constants/userUrl';\n\nconst COURSE_PROGRESS = 'course/progress';\nconst LESSON_PROGRESS = 'lesson/progress';\nconst LESSON_PROGRESSES = 'lesson/progresses';\nconst PROTECTED_URL = `${USER.PS_URL}protected`;\n\nexport const LESSON_TYPE = 'lesson';\nexport const COURSE_TYPE = 'course';\n\nconst handleError = response =>\n console.error(\n `Something went wrong on service call: ${response.url}, status code: ${response.status}`,\n );\n\nexport const getProgress = (id, type) => {\n const contentType = type.toLowerCase();\n return fetch(`${PROTECTED_URL}/${contentType}/progress/${id}`, {\n ...BASIC_JSON_CONTENT_TYPE_HEADER,\n })\n .then(response => (response.ok ? response.text() : Promise.reject(response)))\n .then(text => (text ? JSON.parse(text) : null))\n .catch(handleError);\n};\n\nexport const getProgresses = (ids, type) => {\n const contentType = type.toLowerCase();\n return fetch(`${PROTECTED_URL}/${contentType}/progress`, {\n method: 'POST',\n body: JSON.stringify({ ids }),\n ...BASIC_JSON_CONTENT_TYPE_HEADER,\n })\n .then(response => response.json())\n .catch(handleError);\n};\n\nexport const deleteLearnProgress = (id, type) => {\n const contentType = type.toLowerCase();\n return fetch(`${PROTECTED_URL}/${contentType}/progress/reset/${id}`, {\n method: 'DELETE',\n }).catch(handleError);\n};\n\nexport const saveLessonProgress = lessonProgressData => {\n return fetch(`${PROTECTED_URL}/${LESSON_PROGRESS}/save`, {\n method: 'POST',\n body: JSON.stringify(lessonProgressData),\n dataType: 'json',\n ...BASIC_JSON_CONTENT_TYPE_HEADER,\n }).catch(handleError);\n};\n\nexport const saveLessonProgresses = lessonProgressesData => {\n return fetch(`${PROTECTED_URL}/${LESSON_PROGRESSES}/save`, {\n method: 'POST',\n body: JSON.stringify(lessonProgressesData),\n dataType: 'json',\n ...BASIC_JSON_CONTENT_TYPE_HEADER,\n }).catch(handleError);\n};\n\nexport const getLastEditedLessonsIds = (numberOfLessons, language) => {\n return fetch(`${PROTECTED_URL}/lesson?last=${numberOfLessons}&lang=${language}`, {\n ...BASIC_JSON_CONTENT_TYPE_HEADER,\n })\n .then(response => response.json())\n .catch(handleError);\n};\n\nexport const initCourseProgress = initialCourseProgressData => {\n return fetch(`${PROTECTED_URL}/${COURSE_PROGRESS}/init`, {\n method: 'POST',\n body: JSON.stringify(initialCourseProgressData),\n ...BASIC_JSON_CONTENT_TYPE_HEADER,\n })\n .then(response => response.json())\n .catch(handleError);\n};\n","import {\n addCourseProgressData,\n deleteCourseProgressById,\n deleteLessonProgressById,\n deleteLessonProgressesByCourseId,\n findExistingLesson,\n generateLessonProgress,\n initializeCourseLearnProgressWithDataFromServer,\n initializeLessonLearnProgressWithDataFromServer,\n updateLessonProgressFromService,\n} from './learnProgress';\nimport {\n COURSE_TYPE,\n deleteLearnProgress,\n getProgress,\n getProgresses,\n initCourseProgress,\n LESSON_TYPE,\n saveLessonProgress,\n saveLessonProgresses,\n} from '../../services/learnProgressService';\n\nexport const ADD_LESSON_PROGRESS = 'ADD_LESSON_PROGRESS';\nexport const READ_LESSON_PROGRESS = 'READ_LESSON_PROGRESS';\nexport const READ_LESSON_PROGRESSES = 'READ_LESSON_PROGRESSES';\nexport const DELETE_LESSON_PROGRESS = 'DELETE_LESSON_PROGRESS';\nexport const READ_COURSE_PROGRESS = 'ADD_COURSE_PROGRESS';\nexport const READ_COURSE_PROGRESSES = 'READ_COURSE_PROGRESSES';\nexport const DELETE_COURSE_PROGRESS = 'DELETE_COURSE_PROGRESS';\nexport const DELETE_LESSON_PROGRESSES = 'DELETE_LESSON_PROGRESSES';\nexport const REMOVE_LEARN_PROGRESS = 'REMOVE_LEARN_PROGRESS';\nexport const LESSON_PROGRESS_SYNC_NEEDED = 'LESSON_PROGRESS_SYNC_NEEDED';\n\n// external used actions\nexport const addLessonProgress = lessonProgress => {\n return dispatch => {\n dispatch(addProgress(lessonProgress));\n dispatch(saveProgressOnServer(lessonProgress));\n };\n};\n\nexport const deleteLessonProgress = lessonId => {\n return dispatch => {\n dispatch(deleteLProgress(lessonId));\n dispatch(deleteProgressOnServer(lessonId, LESSON_TYPE));\n };\n};\n\nexport const readLessonProgress = lessonId => {\n return (dispatch, getState) => {\n const { user } = getState();\n if (user.isLoggedIn) {\n getProgress(lessonId, LESSON_TYPE).then(progress => dispatch(readProgress(progress)));\n }\n };\n};\n\nexport const readLessonProgresses = lessonIds => {\n return (dispatch, getState) => {\n const { user } = getState();\n if (user.isLoggedIn) {\n getProgresses(lessonIds, LESSON_TYPE).then(progresses =>\n dispatch(readProgresses(progresses)),\n );\n }\n };\n};\n\nexport const readCourseProgress = courseId => {\n return (dispatch, getState) => {\n const { user } = getState();\n if (user.isLoggedIn) {\n getProgress(courseId, COURSE_TYPE).then(courseProgress => {\n if (courseProgress) {\n dispatch(addCourseProgress(courseProgress));\n }\n });\n }\n };\n};\n\nexport const readCourseProgresses = courseIds => {\n return (dispatch, getState) => {\n const { user } = getState();\n if (user.isLoggedIn) {\n getProgresses(courseIds, COURSE_TYPE).then(courseProgresses => {\n if (courseProgresses) {\n dispatch(readCProgresses(courseProgresses));\n }\n });\n }\n };\n};\n\nexport const initCourse = initialCourseData => {\n return (dispatch, getState) => {\n const { user } = getState();\n if (user.isLoggedIn) {\n initCourseProgress(initialCourseData).then(courseProgress =>\n dispatch(readCourseProgress(courseProgress.cosCourseId)),\n );\n }\n };\n};\n\nexport const deleteCourseProgress = courseId => {\n return dispatch => {\n dispatch(deleteCProgress(+courseId));\n dispatch(deleteProgressOnServer(courseId, COURSE_TYPE));\n dispatch(deleteLessonProgresses(+courseId));\n };\n};\n\nexport const removeProgress = () => ({\n type: REMOVE_LEARN_PROGRESS,\n});\n\nexport const setLessonProgressSyncNeeded = isSyncNeeded => ({\n type: LESSON_PROGRESS_SYNC_NEEDED,\n payload: isSyncNeeded,\n});\n\nexport const syncLessonProgress = () => {\n return (dispatch, getState) => {\n const { learnProgress } = getState();\n const { lessons } = learnProgress;\n return saveLessonProgresses(lessons).then(() => dispatch(setLessonProgressSyncNeeded(false)));\n };\n};\n\n// internal actions\n\nconst addCourseProgress = courseProgress => ({\n type: READ_COURSE_PROGRESS,\n payload: courseProgress,\n});\n\nconst readCProgresses = courseProgresses => ({\n type: READ_COURSE_PROGRESSES,\n payload: courseProgresses,\n});\n\nconst addProgress = lessonProgress => ({\n type: ADD_LESSON_PROGRESS,\n payload: lessonProgress,\n});\n\nconst readProgress = lessonProgress => ({\n type: READ_LESSON_PROGRESS,\n payload: lessonProgress,\n});\n\nconst readProgresses = lessonProgresses => ({\n type: READ_LESSON_PROGRESSES,\n payload: lessonProgresses,\n});\n\nconst deleteLessonProgresses = courseId => ({\n type: DELETE_LESSON_PROGRESSES,\n payload: courseId,\n});\n\nconst deleteLProgress = lessonId => ({\n type: DELETE_LESSON_PROGRESS,\n payload: lessonId,\n});\n\nconst deleteCProgress = courseId => ({\n type: DELETE_COURSE_PROGRESS,\n payload: courseId,\n});\n\n// @VisibleForTesting\nexport const saveProgressOnServer = lessonProgress => {\n return (dispatch, getState) => {\n const {\n user,\n learnProgress: { lessons },\n } = getState();\n if (user.isLoggedIn) {\n const progress = findExistingLesson({ lessons, lessonProgress });\n return progress ? saveLessonProgress(progress) : Promise.resolve('no progress available');\n }\n return Promise.resolve('nothing to do');\n };\n};\n\n// @VisibleForTesting\nexport const deleteProgressOnServer = (contentId, type) => {\n return (dispatch, getState) => {\n const { user } = getState();\n if (user.isLoggedIn) {\n return deleteLearnProgress(contentId, type);\n }\n return Promise.resolve('nothing to do');\n };\n};\n\nconst initialState = { lessons: [], courses: [], isSyncRequired: false };\n\nexport const learnProgressReducer = (state = initialState, action) => {\n switch (action.type) {\n case ADD_LESSON_PROGRESS:\n // eslint-disable-next-line no-case-declarations\n const lessonProgress = generateLessonProgress({\n lessons: state.lessons,\n lessonProgress: action.payload,\n }) || { lessons: [] };\n return {\n ...state,\n ...lessonProgress,\n };\n case READ_LESSON_PROGRESS:\n if (!action.payload) {\n return state;\n }\n return {\n ...state,\n ...updateLessonProgressFromService({\n lessons: state.lessons,\n lessonProgress: action.payload,\n }),\n };\n case READ_LESSON_PROGRESSES:\n return {\n ...state,\n ...initializeLessonLearnProgressWithDataFromServer({\n lessonProgresses: action.payload,\n }),\n };\n case DELETE_LESSON_PROGRESS:\n return {\n ...state,\n ...deleteLessonProgressById({\n lessons: state.lessons,\n lessonId: action.payload,\n }),\n };\n case READ_COURSE_PROGRESS:\n return {\n ...state,\n ...addCourseProgressData({ courses: state.courses, courseProgress: action.payload }),\n };\n case READ_COURSE_PROGRESSES:\n return {\n ...state,\n ...initializeCourseLearnProgressWithDataFromServer({\n courseProgresses: action.payload,\n }),\n };\n case DELETE_COURSE_PROGRESS:\n return {\n ...state,\n ...deleteCourseProgressById({\n courses: state.courses,\n courseId: action.payload,\n }),\n };\n case DELETE_LESSON_PROGRESSES:\n return {\n ...state,\n ...deleteLessonProgressesByCourseId({ lessons: state.lessons, courseId: action.payload }),\n };\n case LESSON_PROGRESS_SYNC_NEEDED:\n return {\n ...state,\n isSyncRequired: action.payload,\n };\n case REMOVE_LEARN_PROGRESS:\n return initialState;\n default:\n return state;\n }\n};\n","import { apiAction } from '../common/apiActions';\nimport {\n LOGGED_USER_RESOURCE,\n LOGOUT_SUFFIX,\n PROFILE_SUFFIX,\n PS_PREFIX,\n} from '../../services/userService';\nimport { BASIC_JSON_CONTENT_TYPE_HEADER } from '../../constants/services';\nimport { removeProgress } from '../progress/learnProgressDuck';\n\nexport const SET_USER = 'SET_USER';\nexport const REMOVE_USER = 'REMOVE_USER';\nexport const API_ERROR = 'API_ERROR';\nconst LOGOUT_REQUEST_CALLED_FLAG = 'LOGOUT_REQUEST_CALLED_FLAG';\nconst SESSION_TIMEOUT = 'SESSION_TIMEOUT';\n\nexport const logInUser = () =>\n apiAction({\n url: `${LOGGED_USER_RESOURCE}/${PROFILE_SUFFIX}`,\n onSuccess: setUser,\n onFailure: setApiError,\n headersOverride: { ...BASIC_JSON_CONTENT_TYPE_HEADER },\n });\n\nexport const logOutUser = () =>\n apiAction({\n url: `${PS_PREFIX}${LOGOUT_SUFFIX}`,\n onSuccess: removeUserData,\n onFailure: setApiError,\n });\n\nexport const deleteUserAccount = () =>\n apiAction({\n url: `${PS_PREFIX}${LOGOUT_SUFFIX}`,\n onSuccess: removeUserData,\n onFailure: setApiError,\n });\n\nexport const removeUserData = () => {\n return dispatch => {\n dispatch(removeUser());\n dispatch(removeProgress());\n };\n};\n\nexport const setUser = data => ({\n type: SET_USER,\n payload: data,\n});\n\nexport const removeUser = () => ({\n type: REMOVE_USER,\n});\n\nexport const setApiError = () => ({\n type: API_ERROR,\n});\n\nexport const setHasLogOutRequestBeenCalled = hasBeenCalled => ({\n type: LOGOUT_REQUEST_CALLED_FLAG,\n payload: hasBeenCalled,\n});\n\nexport const loginTimeout = () => ({\n type: SESSION_TIMEOUT,\n});\n\nconst initialState = {\n userData: null,\n isLoggedIn: false,\n hasLogOutRequestBeenCalled: false,\n apiErrorHasOccurred: false,\n};\n\nexport const userReducer = (state = initialState, action) => {\n switch (action.type) {\n case SET_USER:\n return {\n userData: action.payload,\n isLoggedIn: true,\n apiErrorHasOccurred: false,\n };\n case REMOVE_USER:\n return {\n ...initialState,\n hasLogOutRequestBeenCalled: true,\n };\n case API_ERROR:\n return {\n ...state,\n apiErrorHasOccurred: true,\n };\n case LOGOUT_REQUEST_CALLED_FLAG:\n return {\n ...state,\n hasLogOutRequestBeenCalled: action.payload,\n };\n case SESSION_TIMEOUT:\n return initialState;\n default:\n return state;\n }\n};\n","export const userSelector = state => state.user;\nexport const userDataSelector = state => state.user.userData;\n","import { createContext, useContext } from 'react';\nimport globals from '../utils/globals';\n\nexport const GlobalsContext = createContext(globals);\n\nexport const useGlobalsContext = () => useContext(GlobalsContext);\n","/* eslint-disable jsx-a11y/anchor-is-valid,jsx-a11y/no-static-element-interactions */\nimport { Link } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useParams } from 'react-router';\nimport styled from 'styled-components';\nimport { colors, resolutions, clearfix } from '../../utils/css';\nimport { ReactComponent as IconUserNavi } from '../../assets/svg/icon-user-navi.svg';\nimport { ReactComponent as IconLanguageWorldW } from '../../assets/svg/icon-language-world-w.svg';\nimport { I18nText } from '../I18n/I18nText';\nimport { LanguageSelectionButton } from './LanguageSelectionButton/LanguageSelectionButton';\nimport { MENU_LANGUAGES } from '../../constants/menuLanguageCodes';\nimport {\n getDashboardUrl,\n getGrammarUrl,\n getHelpUrl,\n getLoginPage,\n getUserProfileUrl,\n getVocabularyPageUrl,\n getVocabularyTrainerStartPage,\n} from '../../utils/url/urlFactory';\nimport { logOutUser } from '../../state/user/userDuck';\nimport { userSelector } from '../../state/user/userSelectors';\nimport { useGlobalsContext } from '../../context/GlobalsContext';\n\nexport const NavMenu = ({\n isNavMenuOpen,\n toggleIsNavMenuOpen,\n isLanguageSubMenuOpen,\n setIsLanguageSubMenuOpen,\n className,\n}) => {\n const { origin } = useGlobalsContext().window.location;\n const { langCode } = useParams();\n const { isLoggedIn } = useSelector(userSelector);\n const isLoggedInClass = !isLoggedIn ? 'hidden' : undefined;\n const dispatch = useDispatch();\n\n const handleLogoutClicked = e => {\n e.preventDefault();\n dispatch(logOutUser());\n };\n\n return (\n \n );\n};\n\nexport const StyledNavMenu = styled(NavMenu)`\n background-color: ${colors.LG_BLUE_1};\n border-top: 1px solid ${colors.LG_BLUE_4};\n box-shadow: ${props =>\n props.isNavMenuOpen ? `0 9px 10px ${colors.LG_TRANSPARENT_BLACK_40}` : 'hidden'};\n display: block;\n visibility: ${props => (props.isNavMenuOpen ? 'visible' : 'hidden')};\n overflow: hidden;\n position: relative;\n right: 0;\n transition: all 0.3s linear;\n z-index: 100;\n\n @media (min-width: ${resolutions.min.tablet}px) {\n top: -5px;\n }\n @media (min-width: ${resolutions.min.desktop}px) {\n position: absolute;\n /*! @noflip */\n right: 0;\n top: 85px;\n width: 400px;\n }\n\n .course-nav {\n display: inline-block;\n padding: 20px;\n width: 100%;\n }\n\n #languageMenu {\n padding: 0;\n &:hover {\n background: ${colors.LG_BLACK};\n }\n }\n`;\n\nexport const StyledNavigationList = styled('ul')`\n box-shadow: 1px 10px 20px 0 ${colors.LG_TRANSPARENT_BLACK_25};\n float: left;\n margin: 0;\n padding: 0;\n text-align: left;\n width: 100%;\n\n ${clearfix}\n\n > li {\n border-bottom: 1px solid ${colors.LG_BLUE_4};\n display: block;\n padding: 0;\n width: 100%;\n }\n\n a {\n background-color: ${colors.LG_BLUE_1};\n color: ${colors.LG_WHITE};\n display: block;\n font-size: 18px;\n font-weight: 700;\n line-height: 23px;\n padding: 20px;\n text-decoration: none;\n text-transform: uppercase;\n\n &:hover,\n &:active {\n background-color: ${colors.LG_BLACK};\n }\n\n @media (min-width: ${resolutions.min.tablet}px) {\n font-size: 22px;\n line-height: 43px;\n }\n\n @media (min-width: ${resolutions.min.desktop}px) {\n font-size: 18px;\n line-height: 23px;\n }\n }\n\n #navbar-lang {\n padding: 0;\n\n ul {\n margin-top: 0;\n padding-left: 0;\n }\n }\n\n .collapse.in {\n overflow: hidden;\n display: block;\n }\n`;\n\nexport const StyledNavMenuIcon = styled('span')`\n margin-left: 10px;\n margin-top: -1px;\n opacity: 0.7;\n position: absolute;\n`;\n","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nexport default __webpack_public_path__ + \"static/media/nav-cross-black-md.f5825c8f.svg\";","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nexport default __webpack_public_path__ + \"static/media/nav-cross-black-lg.4c2e3c0d.svg\";","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nexport default __webpack_public_path__ + \"static/media/nav-cross-xs.fec778ad.svg\";","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nexport default __webpack_public_path__ + \"static/media/nav-cross-lg.a759f43e.svg\";","import styled from 'styled-components';\nimport { colors, resolutions } from '../../utils/css';\n\nexport const StyledIconBar = styled('span')`\n margin-top: 4px;\n display: block;\n border-radius: 0;\n background-color: ${colors.LG_WHITE};\n width: 21px;\n height: 3px;\n\n @media (max-width: ${resolutions.max.tablet}px) {\n width: 14px;\n height: 2px;\n background-color: ${colors.LG_BLUE_6};\n }\n\n @media (min-width: ${resolutions.min.tablet}px) and (max-width: ${resolutions.max.tablet}px) {\n margin-top: 5px;\n width: 21px;\n height: 3px;\n background-color: ${colors.LG_BLUE_6};\n }\n`;\n","import styled from 'styled-components';\nimport { colors, resolutions } from '../../utils/css';\nimport navCrossBlackMd from '../../assets/svg/nav-cross-black-md.svg';\nimport navCrossBlackLg from '../../assets/svg/nav-cross-black-lg.svg';\nimport navCrossXs from '../../assets/svg/nav-cross-xs.svg';\nimport navCrossLg from '../../assets/svg/nav-cross-lg.svg';\nimport { StyledIconBar as IconBar } from '../IconBar/IconBar';\n\nexport const BurgerButton = ({\n isNavMenuOpen,\n toggleIsNavMenuOpen,\n setIsLanguageSubMenuOpen,\n className,\n}) => (\n {\n toggleIsNavMenuOpen();\n setIsLanguageSubMenuOpen(false);\n }}\n type=\"button\"\n className={className}\n data-toggle=\"collapse\"\n data-target=\"#nav-user-menu\"\n aria-haspopup=\"true\"\n aria-controls=\"navbar\"\n aria-expanded={isNavMenuOpen}\n >\n {isNavMenuOpen && }\n Toggle navigation \n\n {!isNavMenuOpen && (\n <>\n \n \n \n >\n )}\n \n);\n\nconst defaultHoverStyles = `\n &:hover {\n .close-menu {\n background: url(${navCrossXs});\n background-size: cover;\n }\n }\n &:hover {\n ${IconBar} {\n background-color: ${colors.LG_BLACK};\n }\n }\n`;\n\n/*\n CSS parsed by a string helper function to return css string with styling blocks as arguments,\n could not be tested with jest-styled-components.\n It reads the media option correctly (media: (hover:hover)). But it throws an unknown error.\n While using string templates passes with known media option.\n*/\nconst mediaHoverDeviceDetection = `\n @media (hover: hover) and (pointer: fine) {\n ${defaultHoverStyles}\n }\n @media (hover: none) and (pointer: coarse) {\n ${defaultHoverStyles}\n }\n`;\n\nconst closeMenuMobile = `\n height: 12px;\n width: 13px;\n`;\n\nconst closeMenuTablet = `\n height: 21px;\n width: 22px;\n`;\n\nexport const StyledBurgerButton = styled(BurgerButton)`\n z-index: 3000;\n display: block;\n position: fixed;\n background-color: transparent;\n background-image: none;\n padding: 0;\n /*! @noflip */\n right: 20px;\n top: 13px;\n\n border: none;\n border-radius: 0;\n\n -webkit-appearance: button;\n cursor: pointer;\n\n @media (max-width: ${resolutions.max.mobile}px) {\n top: 20px;\n &:hover {\n .close-menu {\n ${closeMenuMobile}\n }\n }\n }\n\n @media (min-width: ${resolutions.min.tablet}px) and (max-width: ${resolutions.max.tablet}px) {\n top: 28px;\n &:hover {\n .close-menu {\n ${closeMenuTablet}\n }\n }\n }\n\n @media (min-width: ${resolutions.min.desktop}px) {\n margin-top: 32px;\n z-index: 1;\n position: absolute;\n top: 0;\n /*! @noflip */\n right: 30px;\n }\n\n ${mediaHoverDeviceDetection}\n\n &:focus {\n outline: 0;\n .close-menu {\n background: url(${navCrossBlackLg});\n background-size: cover;\n }\n }\n\n .close-menu {\n background: url(${navCrossLg});\n display: block;\n height: 21px;\n margin-top: 5px;\n /*! @noflip */\n right: 15px;\n width: 22px;\n\n @media (max-width: ${resolutions.min.desktop}px) {\n background: url(${navCrossXs});\n height: 12px;\n width: 13px;\n }\n\n @media (min-width: ${resolutions.min.tablet}px) and (max-width: ${resolutions.max.tablet}px) {\n background: url(${navCrossBlackMd});\n height: 21px;\n margin-top: 5px;\n width: 22px;\n }\n\n @media (min-width: ${resolutions.min.desktop}px) {\n background: url(${navCrossBlackMd});\n height: 21px;\n margin-top: 0px;\n position: absolute;\n /*! @noflip */\n right: 0px;\n width: 22px;\n }\n }\n\n .screen-reader-only {\n border: none;\n clip: rect(0, 0, 0, 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n }\n`;\n","import { Link } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { colors, resolutions } from '../../../utils/css';\nimport { getDashboardUrl } from '../../../utils/url/urlFactory';\nimport { I18nText } from '../../I18n/I18nText';\n\nexport const OnlyDesktopBrand = ({ langCode, title, className }) => {\n return (\n \n \n \n \n
\n );\n};\n\nconst makeRoomForRtl = '85px';\n\nexport const StyledOnlyDesktopBrand = styled(OnlyDesktopBrand)`\n align-items: center;\n display: flex;\n height: 85px;\n justify-content: flex-start;\n /*! @noflip */\n padding-left: 5px;\n /*! @noflip */\n padding-right: ${makeRoomForRtl};\n\n @media (max-width: ${resolutions.max.mobile}px) {\n display: none;\n }\n`;\n\nexport const StyledLink = styled(Link)`\n color: ${colors.LG_WHITE};\n font-family: Arial;\n font-size: 23px;\n font-weight: 600;\n opacity: 1;\n text-decoration: none;\n text-transform: uppercase;\n padding: 15px;\n\n &:hover,\n &:focus,\n &:active {\n color: ${colors.LG_WHITE};\n text-decoration: none;\n }\n`;\n","import styled from 'styled-components';\nimport { useChineseSimpleTraditionalSwitch } from '../../hooks/useChineseSimpleTraditionalSwitch';\nimport { colors } from '../../utils/css';\n\n// @VisibleForTesting\nexport const toggleButtonId = 'zh-convert';\n\nexport const ChineseVariantSwitch = ({ className, langCode }) => {\n const { isTraditionalChin, trans2Simple, trans2Traditional } = useChineseSimpleTraditionalSwitch(\n langCode,\n toggleButtonId,\n );\n\n const transFunction = isTraditionalChin ? trans2Simple : trans2Traditional;\n\n return ;\n};\n\nexport const StyledChineseVariantSwitch = styled(ChineseVariantSwitch)`\n background-color: ${colors.LG_WHITE};\n padding: 9px 0;\n margin-right: 0;\n position: absolute;\n right: 43px;\n top: 11px;\n z-index: 10000;\n color: ${colors.LG_BLUE_6};\n text-decoration: none;\n border: none;\n\n @media (max-width: 767px) {\n margin-top: 0;\n margin-right: 10px;\n }\n\n @media (max-width: 1200px) {\n margin-right: 0;\n }\n\n @media (max-width: 1199px) and (min-width: 768px) {\n top: 25px;\n margin-right: 30px;\n font-size: 30px;\n }\n\n @media (min-width: 1200px) {\n background-color: ${colors.DW_LIGHT_BLUE};\n z-index: 1;\n display: block;\n float: right;\n padding: 24px 0;\n margin-right: 26px;\n margin-bottom: 4px;\n font-size: 30px;\n text-decoration: none;\n color: ${colors.LG_WHITE};\n }\n`;\n","import { useState } from 'react';\nimport { useParams } from 'react-router';\nimport styled from 'styled-components';\nimport { colors, resolutions } from '../../../utils/css';\nimport { useToggle } from '../../../hooks/useToggle';\nimport { StyledNavMenu as NavMenu } from '../../NavMenu/NavMenu';\nimport { StyledBurgerButton as BurgerButton } from '../../BurgerButton/BurgerButton';\nimport { StyledOnlyDesktopBrand as OnlyDesktopBrand } from './OnlyDesktopBrand';\nimport { LANG_CODES } from '../../../utils/mappers/langMapper';\nimport { StyledChineseVariantSwitch as ChineseVariantSwitch } from '../ChineseVariantSwitch';\n\nexport const NavigationContainer = ({ className, title }) => {\n const [isNavMenuOpen, { toggleOnClick: toggleIsNavMenuOpen }] = useToggle();\n const [isLanguageSubMenuOpen, setIsLanguageSubMenuOpen] = useState(false);\n const { langCode } = useParams();\n\n return (\n \n {langCode === LANG_CODES.CHINESE && }\n \n \n \n \n
\n \n );\n};\n\nexport const StyledNavigationContainer = styled(NavigationContainer)`\n position: relative;\n\n @media (max-width: ${resolutions.max.mobile}px) {\n margin-bottom: 0px;\n }\n\n @media (min-width: ${resolutions.min.tablet}px) and (max-width: ${resolutions.max.tablet}px) {\n margin-bottom: -7px;\n }\n\n @media (min-width: ${resolutions.min.desktop}px) {\n background-color: ${colors.LG_BLUE_1};\n height: 85px;\n left: 0px;\n margin-left: 0px;\n margin-right: 0px;\n position: relative;\n right: inherit;\n top: inherit;\n }\n\n .navigation-container {\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 ${colors.LG_TRANSPARENT_WHITE_10};\n overflow-x: visible;\n padding: 0px;\n -webkit-overflow-scrolling: touch;\n\n @media (max-width: ${resolutions.max.mobile}px) {\n padding: 60px 0 0 0;\n }\n\n @media (max-width: ${resolutions.max.tablet}px) {\n border: none;\n }\n }\n`;\n","import styled from 'styled-components';\nimport { StyledDesktopBanner as DesktopBanner } from './DesktopBanner';\nimport { StyledMobileBanner as MobileBanner } from './MobileBanner';\nimport { StyledNavigationContainer as NavigationContainer } from './NavigationContainer/NavigationContainer';\nimport { colors, resolutions } from '../../utils/css';\n\nexport const Header = ({ className }) => {\n const headerTitleKey = 'header.bar';\n return (\n \n );\n};\n\nexport const StyledHeader = styled(Header)`\n display: grid;\n background: ${colors.LG_WHITE};\n background-image: none;\n border: none;\n height: auto;\n min-height: 50px;\n\n @media (min-width: ${resolutions.min.tablet}px) {\n border-radius: 4px;\n margin-bottom: 0px;\n }\n\n @media (min-width: ${resolutions.min.desktop}px) {\n border: none;\n height: 200px;\n margin: 0;\n margin-bottom: 20px;\n }\n`;\n","import classnames from 'classnames';\nimport { createGlobalStyle } from 'styled-components';\nimport { Text } from '../Text/Text';\n\nconst RichtextGlobalStyles = createGlobalStyle`\n /* @noflip */\n .richtext-content-container > span > p[dir=ltr] {\n text-align: left;\n }\n`;\n\nexport const RichText = ({ content, isContainer = true, className }) => (\n \n \n \n
\n);\n","const ratioToPercentage = (widthProportion, heightProportion) =>\n (heightProportion / widthProportion) * 100;\n\nconst ASPECT_RATIO = {\n landscape: ratioToPercentage(16, 9),\n landscape_legacy: ratioToPercentage(4, 3),\n portrait: ratioToPercentage(3, 4),\n square: ratioToPercentage(1, 1),\n};\n\nexport const imgWithFormatFn = (imageId, imageBasePath) => format =>\n `${imageBasePath}/${imageId}_${format.id}.jpg`;\n\nexport const format = Object.freeze({\n legacy: {\n id: 4,\n aspectRatio: [ASPECT_RATIO.landscape_legacy, ASPECT_RATIO.portrait],\n },\n free: {\n id: 7,\n },\n sm: {\n id: 503,\n aspectRatio: ASPECT_RATIO.landscape,\n },\n sm_richtext: {\n id: 503,\n aspectRatio: [ASPECT_RATIO.landscape, ASPECT_RATIO.portrait],\n },\n md: {\n id: 505,\n aspectRatio: ASPECT_RATIO.landscape,\n },\n md_richtext: {\n id: 505,\n aspectRatio: [ASPECT_RATIO.landscape, ASPECT_RATIO.portrait],\n },\n lg: {\n id: 507,\n aspectRatio: ASPECT_RATIO.landscape,\n },\n lg_richtext: {\n id: 507,\n aspectRatio: [ASPECT_RATIO.landscape, ASPECT_RATIO.portrait],\n },\n full: {\n id: 509,\n aspectRatio: ASPECT_RATIO.landscape,\n },\n});\n\nexport const getFormatForWidth = ({ innerWidth, sources = [] }) => {\n const source = sources.find(w => innerWidth >= w.minWidth && innerWidth <= w.maxWidth);\n return source ? source.imgFormat : format.lg;\n};\n\nexport const getImgUrlForWidth = ({ innerWidth, sources = [], imageId, imageBasePath }) => {\n const useFormat = getFormatForWidth({ innerWidth, sources });\n return imgWithFormatFn(imageId, imageBasePath)(useFormat);\n};\n","import { createContext, useContext } from 'react';\n\n// eslint-disable-next-line fp/no-let\nlet frontendConfig = null;\n\nexport function hasFrontendConfig() {\n return !!frontendConfig;\n}\n\nexport function setFrontendConfig(inFrontendConfig) {\n frontendConfig = inFrontendConfig; // eslint-disable-line fp/no-mutation\n}\n\nexport function getFrontendConfig() {\n return frontendConfig;\n}\n\nexport function clearFrontendConfig() {\n frontendConfig = null; // eslint-disable-line fp/no-mutation\n}\n\n// CONTEXT\nexport const FrontendConfigContext = createContext({ getFrontendConfig });\n\n// USAGE HOOK\nexport const useFrontendConfig = () => useContext(FrontendConfigContext).getFrontendConfig();\n","export const Picture = ({ sources, fallbackUrl, alt, className, aspectRatio }) => (\n \n {sources.map((sourceAttributes, index) => (\n \n ))}\n \n \n);\n","import { useFrontendConfig } from '../../hooks/useFrontendConfig';\nimport { imgWithFormatFn, format } from '../../utils/imgUtils';\nimport { resolutions } from '../../utils/css';\nimport { Picture } from '../Picture/Picture';\n\nexport const DwPicture = ({ imageId, ...inProps }) => {\n const { imageBasePath } = useFrontendConfig();\n\n const imgWithFormat = imgWithFormatFn(imageId, imageBasePath);\n\n const defaultProps = {\n fallbackUrl: imgWithFormat(format.full),\n sources: [\n {\n media: `(min-width: ${resolutions.min.full}px)`,\n srcSet: imgWithFormat(format.full),\n },\n {\n media: `(min-width: ${resolutions.min.tabletLandscape}px)`,\n srcSet: imgWithFormat(format.lg),\n },\n {\n media: `(min-width: ${resolutions.min.tablet}px)`,\n srcSet: imgWithFormat(format.md),\n },\n {\n media: `(min-width: ${resolutions.min.mobile}px)`,\n srcSet: imgWithFormat(format.sm),\n },\n ],\n };\n\n const props = { ...defaultProps, ...inProps };\n\n return ;\n};\n","import ReactDOM from 'react-dom';\nimport globals from '../globals';\n\nexport const replaceWithComponent = ({\n selector,\n componentFn,\n node,\n param = null,\n elementType = 'span',\n}) => {\n [...node.querySelectorAll(selector)].forEach((matchedElem, index) => {\n const renderContainer = globals.document.createElement(elementType);\n const placeholderClassNames = matchedElem.className;\n renderContainer.setAttribute('class', `render-container ${placeholderClassNames}`.trim());\n matchedElem.parentNode.replaceChild(renderContainer, matchedElem);\n const componentToRender = param\n ? componentFn(matchedElem, param, index)\n : componentFn(matchedElem, index);\n ReactDOM.render(componentToRender, renderContainer);\n });\n return { document: globals.document };\n};\n","import { imgWithFormatFn, format } from '../imgUtils';\nimport { resolutions } from '../css';\nimport { DwPicture } from '../../components/DwPicture/DwPicture';\nimport { getFrontendConfig } from '../../hooks/useFrontendConfig';\nimport { replaceWithComponent } from './replaceCommons';\n\nexport const mapImgPlaceholderToPicComponent = matchedElem => {\n const { imageBasePath } = getFrontendConfig();\n const rawImageFormat = matchedElem.getAttribute('data-format');\n const isLegacy = rawImageFormat.includes('LEGACY');\n const isFree = rawImageFormat === 'FREE_IMAGE';\n const imageId = matchedElem.getAttribute('data-id');\n const imgWithFormat = imgWithFormatFn(imageId, imageBasePath);\n const imageAspectRatio = matchedElem.getAttribute('data-aspect-ratio');\n\n const imagePropsText = {\n fallbackUrl: imgWithFormat(format.md_richtext),\n sources: [\n {\n media: `(min-width: ${resolutions.min.desktop}px)`,\n srcSet: imgWithFormat(format.lg_richtext),\n },\n {\n media: `(min-width: ${resolutions.min.tablet}px)`,\n srcSet: imgWithFormat(format.md_richtext),\n },\n {\n media: `(max-width: ${resolutions.max.mobile}px)`,\n srcSet: imgWithFormat(format.sm_richtext),\n },\n ],\n };\n\n const imagePropsLegacy = {\n fallbackUrl: imgWithFormat(format.legacy),\n sources: [\n {\n srcSet: imgWithFormat(format.legacy),\n },\n ],\n };\n\n const imagePropsFree = {\n fallbackUrl: imgWithFormat(format.free),\n sources: [\n {\n srcSet: imgWithFormat(format.free),\n },\n ],\n aspectRatio: { paddingBottom: `${imageAspectRatio}%`, height: 0 },\n };\n\n const getImageDisplayProps = () => {\n if (isLegacy) {\n return imagePropsLegacy;\n }\n if (isFree) {\n return imagePropsFree;\n }\n return imagePropsText;\n };\n\n const imageProps = {\n ...{\n imageId,\n alt: matchedElem.getAttribute('alt'),\n },\n ...getImageDisplayProps(),\n };\n return ;\n};\n\n// leave content as parameter as might be needed in future cases\n// eslint-disable-next-line no-unused-vars\nexport const replacePlaceholderImagesWithResponsivePictures = content => {\n replaceWithComponent({\n selector: '.placeholder-image img',\n node: document,\n componentFn: mapImgPlaceholderToPicComponent,\n elementType: 'div',\n });\n};\n","import { replacePlaceholderImagesWithResponsivePictures } from './imageReplacer';\nimport { useTimeout } from '../../hooks/useTimeout';\n\nexport const useImagePlaceholderReplacementEffect = ({ trigger = 'staticTrigger' }) => {\n useTimeout(\n {\n callback: () => {\n replacePlaceholderImagesWithResponsivePictures();\n },\n delay: 10,\n },\n [trigger],\n );\n};\n","import classnames from 'classnames';\n\nexport const ContentHeadline = ({ children, isStandalone = false }) => {\n return (\n \n );\n};\n","import styled from 'styled-components';\nimport classnames from 'classnames';\nimport { RichText } from '../RichText/RichText';\nimport { useImagePlaceholderReplacementEffect } from '../../utils/replacers/useImagePlaceholderReplacementEffect';\nimport { ContentHeadline } from '../ContentContainer/ContentHeadline/ContentHeadline';\n\nexport const legalFragment = {\n name: 'Legal',\n partial() {\n return `legal(appName: \"mdl\") {\n ... on Article {\n id\n shortTitle\n text\n }\n }\n `;\n },\n};\n\nexport const LegalNotice = ({ className, legal }) => {\n useImagePlaceholderReplacementEffect({});\n const { text, shortTitle } = legal || {};\n\n return (\n \n
\n {shortTitle} \n \n
\n
\n );\n};\n\nexport const StyledLegalNotice = styled(LegalNotice)`\n .img-caption {\n display: none;\n }\n`;\n","import styled from 'styled-components';\nimport gql from 'graphql-tag';\nimport { useParams } from 'react-router-dom';\nimport { colors, resolutions } from '../../utils/css';\nimport { I18nText } from '../I18n/I18nText';\nimport {\n getDwContactUrl,\n getDwUrlWithLang,\n getFooterLinkForNamedUrl,\n getLegalUrl,\n} from '../../utils/url/urlFactory';\nimport { useRtlContext } from '../../hooks/useRtl';\nimport { legalFragment } from '../LegalNotice/LegalNotice';\n\nexport const footerFragment = {\n name: 'Footer',\n fragment() {\n return gql`fragment ${this.name} on Query {\n footer(lang: $lang) {\n accessibility(appName: \"mdl\") {\n namedUrl\n }\n policy(appName: \"mdl\") {\n namedUrl\n }\n ${legalFragment.partial()}\n }\n }\n `;\n },\n};\n\nexport const Footer = ({ className, data }) => {\n const { isRtl } = useRtlContext();\n const { langCode } = useParams();\n\n const rtlClass = isRtl ? 'rtl' : '';\n return (\n \n \n {footerData({ langCode, data }).map(footerObject => (\n \n \n \n ))}\n \n \n );\n};\n\nconst footerData = ({ langCode, data }) => [\n {\n translation: {\n key: 'footer.copyright',\n parameters: { first: new Date().getFullYear() },\n },\n id: 0,\n aria: 'footer.copyright',\n role: 'Firm name',\n },\n {\n translation: 'footer.dw',\n id: 1,\n href: getDwUrlWithLang({ langCode }),\n target: '_blank',\n aria: 'footer.dw',\n role: 'link',\n },\n {\n translation: 'footer.privacyPolicy',\n id: 2,\n href: getFooterLinkForNamedUrl({ namedUrl: data.footer.policy.namedUrl }),\n target: '_blank',\n aria: 'footer.privacyPolicy',\n role: 'link',\n },\n {\n translation: 'footer.accessibility',\n id: 3,\n href: getFooterLinkForNamedUrl({ namedUrl: data.footer.accessibility.namedUrl }),\n target: '_blank',\n aria: 'footer.accessibility',\n role: 'link',\n },\n {\n translation: 'footer.legal',\n id: 4,\n href: getLegalUrl(langCode),\n target: '',\n aria: 'footer.legal',\n role: 'link',\n },\n {\n translation: 'footer.contact',\n id: 5,\n href: getDwContactUrl(),\n target: '_blank',\n aria: 'footer.contact',\n role: 'link',\n },\n];\n\nexport const StyledFooter = styled(Footer)`\n box-sizing: border-box;\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n align-items: center;\n width: 100%;\n min-height: 90px;\n font-family: Helvetica, Arial, sans-serif;\n line-height: 45px;\n margin: 20px 0;\n background: ${colors.LG_BLUE_7};\n\n ul {\n display: flex;\n flex-flow: row wrap;\n flex-direction: row;\n max-width: 100%;\n list-style-type: none;\n padding: 10px 0;\n text-align: center;\n margin: 0;\n }\n\n li {\n margin-right: 12px;\n padding: 0 0 0 12px;\n\n &.rtl {\n direction: rtl;\n }\n }\n\n .footer-link {\n text-decoration: none;\n font-size: 15px;\n color: ${colors.LG_BLUE_4};\n background-color: transparent;\n :hover,\n :active,\n :focus {\n color: ${colors.LG_WHITE};\n }\n }\n\n @media (max-width: ${resolutions.max.tablet}px) {\n margin: 0;\n }\n\n @media (max-width: ${resolutions.max.mobile}px) {\n max-width: 100%;\n min-height: 65px;\n\n ul {\n justify-content: center;\n }\n }\n`;\n","import styled from 'styled-components';\n\nconst LoadingMessage = ({ className }) => (\n \n);\n\nexport const StyledLoadingMessage = styled(LoadingMessage)``;\n","import styled from 'styled-components';\n\nconst ErrorMessage = ({ className, error }) => (\n \n);\nexport const StyledErrorMessage = styled(ErrorMessage)`\n color: red;\n`;\n","import { useQuery } from '@apollo/client';\nimport { StyledLoadingMessage as LoadingMessage } from '../commons/LoadingMessage';\nimport { StyledErrorMessage as ErrorMessage } from '../commons/ErrorMessage';\n\nconst hasData = data => data && Object.values(data).filter(item => item).length > 0;\n\nexport const WithGraphQLQueryHandling = ({ query, queryVariables, children }) => {\n const { loading, error, data = {}, refetch } = useQuery(query, {\n variables: queryVariables,\n });\n\n if (loading) {\n return ;\n }\n\n if (error) {\n const { message = 'error while fetching data' } = error;\n return ;\n }\n\n if (!hasData(data)) {\n return ;\n }\n\n return children(data, refetch);\n};\n","import { createContext, useContext } from 'react';\n\n// eslint-disable-next-line fp/no-let\nlet metadata = null;\n\nexport function hasMetadata() {\n return !!metadata;\n}\n\nexport function setMetadata(inMetadata) {\n metadata = inMetadata; // eslint-disable-line fp/no-mutation\n}\n\nexport function getMetadata() {\n return metadata;\n}\n\nexport function clearMetadata() {\n metadata = null; // eslint-disable-line fp/no-mutation\n}\n\n// CONTEXT\nexport const FrontendMetadataContext = createContext({ getMetadata });\n\n// USAGE HOOK\nexport const useMetadata = () => useContext(FrontendMetadataContext).getMetadata();\n","import gql from 'graphql-tag';\nimport { useParams } from 'react-router';\nimport { setTranslations } from '../../utils/i18n';\nimport { setFrontendConfig } from '../../hooks/useFrontendConfig';\nimport { toLang } from '../../utils/mappers/langMapper';\nimport { WithGraphQLQueryHandling } from '../WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { footerFragment } from '../Footer/Footer';\nimport { setMetadata } from '../../hooks/useMetadata';\n\nexport const i18nConfigQuery = gql`\n query translationsAndConfig($lang: Language!) {\n i18n: i18nByLang(lang: $lang, appName: \"mdl\") {\n all\n }\n config {\n imageBasePath\n staticBaseHost\n gtmId(appName: \"mdl\")\n gtmLevel1Id(appName: \"mdl\")\n }\n iso639ByLang(lang: $lang)\n ...${footerFragment.name}\n }\n ${footerFragment.fragment()}\n`;\n\nexport const I18nConfigLoader = ({ children }) => {\n const { langCode } = useParams();\n\n const i18nQueryVariables = { lang: toLang(langCode || 'en') };\n\n return (\n \n {data => {\n if (data.i18n) {\n setTranslations(JSON.parse(data.i18n.all));\n }\n if (data.config) {\n setFrontendConfig(data.config);\n }\n if (data.iso639ByLang) {\n setMetadata(data.iso639ByLang);\n }\n return children(data);\n }}\n \n );\n};\n","import { isServer } from '../../utils/ssr';\n\nexport const BrowserOnly = ({ children, ...restProps }) => (\n {!isServer() && children}
\n);\n","import { useSelector } from 'react-redux';\nimport config from '../../config';\nimport { userSelector } from '../../state/user/userSelectors';\nimport { useLocalStorage } from '../../hooks/useLocalStorage';\nimport { I18nText } from '../I18n/I18nText';\nimport { BrowserOnly } from './BrowserOnly';\n\nexport const GdprLayer = ({ footerData }) => {\n const { isLoggedIn } = useSelector(userSelector);\n const [hasAcceptedGdpr, setHasAcceptedGdpr] = useLocalStorage('hasAcceptedGdpr');\n const { namedUrl } = footerData.footer.policy || {};\n\n if (isLoggedIn || hasAcceptedGdpr) {\n return null;\n }\n\n return (\n \n \n
\n
\n \n
\n
\n \n setHasAcceptedGdpr(true)}\n />\n
\n
\n
\n \n );\n};\n","export const PAGE_TYPES = Object.freeze({\n HELP: 'HELP',\n VOCABULARY: 'VOCABULARY',\n ALPHABETICAL_ORDER: 'ALPHABETICAL_ORDER',\n LEGAL: 'LEGAL',\n OVERVIEW: 'OVERVIEW',\n COURSE: 'COURSE',\n LESSON: 'LESSON',\n EXERCISE: 'EXERCISE',\n LESSON_EXERCISE_RESULT: 'LESSON_EXERCISE_RESULT',\n LESSON_SUMMARY: 'LESSON_SUMMARY',\n GRAMMAR: 'GRAMMAR',\n GRAMMAR_DETAIL: 'GRAMMAR_DETAIL',\n GRAMMAR_OVERVIEW: 'GRAMMAR_OVERVIEW',\n VOCABULARY_OVERVIEW: 'VOCABULARY_OVERVIEW',\n REGIONAL_STUDIES: 'REGIONAL_STUDIES',\n PLACEMENT_TEST: 'PLACEMENT_TEST',\n FINAL_TEST: 'FINAL_TEST',\n MANUSCRIPT: 'MANUSCRIPT',\n USER_PROFILE: 'USER_PROFILE',\n PASSWORD_CHANGE: 'PASSWORD_CHANGE',\n PASSWORD_RESET: 'PASSWORD_RESET',\n PASSWORD_SET: 'PASSWORD_SET',\n REGISTER_USER: 'REGISTER_USER',\n FEEDBACK_STATUS: 'FEEDBACK_STATUS',\n EXTRAS: 'EXTRAS',\n PLACEMENT_DASHBOARD: 'PLACEMENT_DASHBOARD',\n VOCABULARY_TRAINER: 'VOCABULARY_TRAINER',\n NOT_FOUND_PAGE: 'NOT_FOUND',\n});\n\nexport const GTM_NO_CONTENT_PAGE_IDS = Object.freeze({\n [PAGE_TYPES.OVERVIEW]: 5001,\n [PAGE_TYPES.GRAMMAR_OVERVIEW]: 5002,\n [PAGE_TYPES.VOCABULARY_OVERVIEW]: 5003,\n [PAGE_TYPES.VOCABULARY_TRAINER]: 5004,\n [PAGE_TYPES.REGISTER_USER]: 5005,\n [PAGE_TYPES.USER_PROFILE]: 5006,\n [PAGE_TYPES.PASSWORD_CHANGE]: 5007,\n [PAGE_TYPES.PASSWORD_RESET]: 5008,\n [PAGE_TYPES.PASSWORD_SET]: 5009,\n [PAGE_TYPES.FEEDBACK_STATUS]: 5010,\n [PAGE_TYPES.NOT_FOUND_PAGE]: 5011,\n});\n","import { PAGE_TYPES } from '../constants/pageTypes';\n\nconst LESSON_MENU_VOCABULARY_KEY = 'lesson.menu.vocabulary';\nconst LESSON_EXERCISE_RESULT_TITLE_KEY = 'lesson.exercises.result.title';\nconst LESSON_MENU_GRAMMAR_KEY = 'lesson.menu.grammar';\nconst LESSON_MENU_REGIONAL_STUDIES_KEY = 'lesson.menu.regionalStudies';\nconst LESSON_MANUSCRIPT_KEY = 'lesson.menu.manuscript';\nconst LESSON_MENU_EXTRAS_KEY = 'lesson.menu.extras';\nconst LESSON_EXERCISES_RESULT_GENERAL_KEY = 'lesson.exercises.result.general';\n\nexport const PAGE_TYPE_TO_TITLE_TRANSLATION_KEYS = Object.freeze({\n [PAGE_TYPES.ALPHABETICAL_ORDER]: ['lesson.menu.alphabeticalOrder'],\n [PAGE_TYPES.OVERVIEW]: ['metadata.overview'],\n [PAGE_TYPES.GRAMMAR_DETAIL]: [LESSON_MENU_GRAMMAR_KEY],\n [PAGE_TYPES.HELP]: ['common.help'],\n [PAGE_TYPES.VOCABULARY_OVERVIEW]: [LESSON_MENU_VOCABULARY_KEY],\n [PAGE_TYPES.USER_PROFILE]: ['profile.edit.title'],\n [PAGE_TYPES.FEEDBACK_STATUS]: ['common.feedback'],\n [PAGE_TYPES.REGISTER_USER]: ['profile.register.title'],\n [PAGE_TYPES.VOCABULARY]: [LESSON_MENU_VOCABULARY_KEY],\n [PAGE_TYPES.LEGAL]: ['metadata.legal'],\n [PAGE_TYPES.LESSON_EXERCISE_RESULT]: [LESSON_EXERCISE_RESULT_TITLE_KEY],\n [PAGE_TYPES.LESSON_SUMMARY]: [LESSON_EXERCISE_RESULT_TITLE_KEY],\n [PAGE_TYPES.GRAMMAR]: [LESSON_MENU_GRAMMAR_KEY],\n [PAGE_TYPES.GRAMMAR_OVERVIEW]: [LESSON_MENU_GRAMMAR_KEY],\n [PAGE_TYPES.REGIONAL_STUDIES]: [LESSON_MENU_REGIONAL_STUDIES_KEY],\n [PAGE_TYPES.MANUSCRIPT]: [LESSON_MANUSCRIPT_KEY],\n [PAGE_TYPES.EXTRAS]: [LESSON_MENU_EXTRAS_KEY],\n [PAGE_TYPES.VOCABULARY_TRAINER]: ['header.menu.vocabularyTrainer'],\n [PAGE_TYPES.PLACEMENT_DASHBOARD]: ['header.menu.levelTest'],\n [PAGE_TYPES.PASSWORD_CHANGE]: ['profile.edit.password.change.title'],\n [PAGE_TYPES.PASSWORD_RESET]: ['profile.edit.password.reset.title'],\n [PAGE_TYPES.PASSWORD_SET]: ['profile.edit.password.set.title'],\n [PAGE_TYPES.FINAL_TEST]: [LESSON_EXERCISES_RESULT_GENERAL_KEY],\n [PAGE_TYPES.PLACEMENT_TEST]: [LESSON_EXERCISES_RESULT_GENERAL_KEY, 'header.menu.levelTest'],\n});\n\nexport const PAGE_TYPE_TO_DESCRIPTION_TRANSLATION_KEYS = Object.freeze({\n [PAGE_TYPES.HELP]: 'metadata.description.help',\n [PAGE_TYPES.VOCABULARY]: 'metadata.description.vocabulary',\n [PAGE_TYPES.LEGAL]: 'metadata.description.legal',\n [PAGE_TYPES.OVERVIEW]: 'metadata.description.overview',\n [PAGE_TYPES.GRAMMAR]: 'metadata.description.grammar',\n [PAGE_TYPES.REGIONAL_STUDIES]: 'metadata.description.regionalStudies',\n [PAGE_TYPES.MANUSCRIPT]: 'metadata.description.manuscript',\n [PAGE_TYPES.REGISTER_USER]: 'metadata.description.register',\n [PAGE_TYPES.EXTRAS]: 'metadata.description.extras',\n});\n\nexport const PAGE_TYPE_TO_KEYWORDS_TRANSLATION_KEYS = Object.freeze({\n [PAGE_TYPES.VOCABULARY]: LESSON_MENU_VOCABULARY_KEY,\n [PAGE_TYPES.LESSON_EXERCISE_RESULT]: LESSON_EXERCISE_RESULT_TITLE_KEY,\n [PAGE_TYPES.LESSON_SUMMARY]: LESSON_EXERCISE_RESULT_TITLE_KEY,\n [PAGE_TYPES.GRAMMAR]: LESSON_MENU_GRAMMAR_KEY,\n [PAGE_TYPES.GRAMMAR_OVERVIEW]: LESSON_MENU_GRAMMAR_KEY,\n [PAGE_TYPES.GRAMMAR_DETAIL]: LESSON_MENU_GRAMMAR_KEY,\n [PAGE_TYPES.VOCABULARY_OVERVIEW]: LESSON_MENU_VOCABULARY_KEY,\n [PAGE_TYPES.REGIONAL_STUDIES]: LESSON_MENU_REGIONAL_STUDIES_KEY,\n [PAGE_TYPES.MANUSCRIPT]: LESSON_MANUSCRIPT_KEY,\n [PAGE_TYPES.EXTRAS]: LESSON_MENU_EXTRAS_KEY,\n [PAGE_TYPES.FINAL_TEST]: LESSON_EXERCISES_RESULT_GENERAL_KEY,\n [PAGE_TYPES.PLACEMENT_TEST]: LESSON_EXERCISES_RESULT_GENERAL_KEY,\n});\n\nexport const createTitle = ({ titleParts }) => titleParts.filter(Boolean).join(' | ');\nexport const createKeywords = ({ keywords }) => keywords.filter(Boolean).join(',');\n\nexport const html2text = ({ html }) => (html ? html.replace(/<.*?>/g, ' ') : html);\n","import { useI18nContext } from '../context/I18nContext';\nimport { createTitle, PAGE_TYPE_TO_TITLE_TRANSLATION_KEYS } from '../utils/pageMetadata';\n\nexport const useMetaTitle = ({\n pageType,\n translationFirst,\n contentName,\n parentContentName,\n} = {}) => {\n const { i18n } = useI18nContext();\n const pageTitleTranslationKeys = PAGE_TYPE_TO_TITLE_TRANSLATION_KEYS[pageType];\n const pageTitleTranslations = pageTitleTranslationKeys\n ? pageTitleTranslationKeys.map(key => i18n.t(key))\n : [];\n const siteName = i18n.t('metadata.siteName');\n\n const titleParts = translationFirst\n ? [...pageTitleTranslations, contentName, parentContentName, siteName]\n : [contentName, ...pageTitleTranslations, parentContentName, siteName];\n\n return createTitle({ titleParts });\n};\n","import { html2text, PAGE_TYPE_TO_DESCRIPTION_TRANSLATION_KEYS } from '../utils/pageMetadata';\nimport { useTranslation } from './useTranslation';\n\nexport const useMetaDescription = ({\n pageType,\n contentName,\n teaser,\n description,\n useTeaserAsDescription,\n useDescriptionTranslation,\n} = {}) => {\n const descriptionTranslation = useTranslation({\n key: PAGE_TYPE_TO_DESCRIPTION_TRANSLATION_KEYS[pageType],\n parameters: { first: contentName },\n });\n\n return (\n (useTeaserAsDescription && html2text({ html: teaser })) ||\n (useDescriptionTranslation && descriptionTranslation) ||\n html2text({ html: description })\n );\n};\n","import { createKeywords, PAGE_TYPE_TO_KEYWORDS_TRANSLATION_KEYS } from '../utils/pageMetadata';\nimport { useTranslation } from './useTranslation';\n\nexport const useMetaKeywords = ({ pageType, useOnlyCmsKeywords, keywordStrings } = {}) => {\n const defaultKeywords = useTranslation('metadata.keywords');\n const pageKeywords = useTranslation(PAGE_TYPE_TO_KEYWORDS_TRANSLATION_KEYS[pageType]);\n\n const additionalKeyword = pageKeywords || defaultKeywords;\n const keywords = useOnlyCmsKeywords ? keywordStrings : [...keywordStrings, additionalKeyword];\n\n return createKeywords({ keywords });\n};\n","import { Helmet } from 'react-helmet-async';\nimport gql from 'graphql-tag';\nimport { useMetadata } from '../../hooks/useMetadata';\nimport { useMetaTitle } from '../../hooks/useMetaTitle';\nimport { useMetaDescription } from '../../hooks/useMetaDescription';\nimport { useMetaKeywords } from '../../hooks/useMetaKeywords';\nimport { mainContentFullUrl } from '../../utils/url/url';\nimport { useTranslation } from '../../hooks/useTranslation';\n\nexport const pageHeaderMetadataFragment = {\n name: 'PageHeaderMetadata',\n fragment({ type }) {\n return gql`fragment ${this.name} on ${type} {\n iso639Lang\n }\n `;\n },\n};\n\nexport const metaDataFragment = {\n name: 'MetaData',\n fragment({ type }) {\n return gql`fragment ${this.name} on ${type} {\n name\n keywordStrings\n description\n teaser\n }\n `;\n },\n};\n\nexport const PageMetaData = ({\n pageType,\n content = {},\n parentContentName,\n translationFirst = false,\n useOnlyCmsKeywords = false,\n useTeaserAsDescription = false,\n useDescriptionTranslation = false,\n addKeywordsAndDescription = true,\n}) => {\n const { name: contentName, keywordStrings = [], description, teaser } = content;\n const siteName = useTranslation('metadata.siteName');\n const iso639Lang = useMetadata();\n const title = useMetaTitle({ pageType, translationFirst, contentName, parentContentName });\n const descriptionMeta = useMetaDescription({\n pageType,\n contentName,\n teaser,\n description,\n useTeaserAsDescription,\n useDescriptionTranslation,\n });\n const keywordsString = useMetaKeywords({ pageType, useOnlyCmsKeywords, keywordStrings });\n const contentFullUrl = mainContentFullUrl();\n const showDescription = addKeywordsAndDescription && descriptionMeta;\n\n return (\n \n \n {title} \n \n {showDescription && }\n {showDescription && }\n {addKeywordsAndDescription && keywordsString && (\n \n )}\n \n \n \n \n \n );\n};\n","import { getErrorCode, getFeedbackUrl } from './urlFactory';\nimport { FEEDBACK_TYPES } from '../../constants/feedback';\n\nexport const feedbackHelper = {\n getForErrorCode(errorResponse, langCode) {\n const errorCode = getErrorCode(errorResponse);\n return feedbackHelper.error(errorCode, langCode);\n },\n getForPasswordChangeErrorCode(errorResponse, langCode) {\n const errorCode = getErrorCode(errorResponse);\n return feedbackHelper.errorPasswordChange(errorCode, langCode);\n },\n forLogin(redirectUrl, langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.LOGIN, langCode);\n },\n forLogout(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.LOGOUT, langCode);\n },\n forUserDelete(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.DELETED, langCode);\n },\n forInvalidToken(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.INVALID_TOKEN, langCode);\n },\n forProfileServiceUnavailable(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.PROFILE_SERVICE_UNAVAILABLE, langCode);\n },\n forSessionTimeout(redirectUrl, langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.SESSION_TIMEOUT, langCode);\n },\n forMissingUserProfile(redirectUrl, langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.MISSING_USER_PROFILE, langCode);\n },\n forForcedLogout(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.FORCED_LOGOUT, langCode);\n },\n forPasswordChanged(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.PASSWORD_CHANGED, langCode);\n },\n forMailChanged(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.MAIL_CHANGED, langCode);\n },\n forMailChangeRequest(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.MAIL_CHANGE_REQUEST, langCode);\n },\n forRegistered(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.REGISTERED, langCode);\n },\n forRegistrationConfirm(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.REGISTRATION_CONFIRMED, langCode);\n },\n forPasswordResetRequest(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.PASSWORD_RESET_REQUESTED, langCode);\n },\n forSetPassword(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.PASSWORD_RESET_SET, langCode);\n },\n forProfileUpdated(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.PROFILE_UPDATED, langCode);\n },\n forVocabularyTrainerUnavailable(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.VOCABULARY_TRAINER_UNAVAILABLE, langCode);\n },\n forVocabularyTrainerNoVocabularies(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.VOCABULARY_TRAINER_NO_VOCABULARIES, langCode);\n },\n forCertificateMissingTranscription(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.CERTIFICATE_NO_TRANSCRIPTION, langCode);\n },\n forInvalidCertificate(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.INVALID_CERTIFICATE, langCode);\n },\n forGeneralError(langCode) {\n return getFeedbackUrl(FEEDBACK_TYPES.OTHER, langCode);\n },\n error(errorCode, langCode) {\n return getFeedbackUrl(errorCode || FEEDBACK_TYPES.OTHER, langCode);\n },\n errorPasswordChange(errorCode, langCode) {\n return getFeedbackUrl(\n errorCode ? FEEDBACK_TYPES.PASSWORD_CHANGE + errorCode : FEEDBACK_TYPES.OTHER,\n langCode,\n );\n },\n\n getFeedbackContentKey(feedbackType) {\n const typeWithoutUnderline = feedbackType\n .toLowerCase()\n .replace(/_+./g, s => s.slice(-1).toUpperCase());\n return `client.status.${typeWithoutUnderline}`;\n },\n};\n","import { useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { useEffect } from 'react';\nimport { feedbackHelper } from '../utils/url/feedbackHelpers';\nimport { validateUserTicket } from '../services/userService';\nimport { logInUser } from '../state/user/userDuck';\nimport { removeSearchParam } from '../utils/url/urlUtils';\nimport { getTicketDomain, getTicketFromUrlParam } from '../utils/userUtils';\nimport { USER } from '../constants/userUrl';\nimport { useGlobalsContext } from '../context/GlobalsContext';\n\nexport const useValidateTicketAndLoginUser = (location, langCode) => {\n const dispatch = useDispatch();\n const { origin } = useGlobalsContext().window.location;\n const ticket = getTicketFromUrlParam(location);\n const history = useHistory();\n\n useEffect(() => {\n const ticketDomain = getTicketDomain(origin, location);\n if (ticket && ticketDomain) {\n validateUserTicket(ticket, ticketDomain)\n .then(response => {\n if (!response.ok) {\n // eslint-disable-next-line fp/no-throw\n throw new Error(response.status);\n } else {\n dispatch(logInUser());\n }\n })\n .then(() => {\n history.push({\n search: removeSearchParam(location, USER.TICKET_PARAM_NAME),\n });\n })\n .catch(() => {\n history.push(feedbackHelper.forGeneralError(langCode));\n });\n }\n }, [ticket, location.pathname]); // eslint-disable-line react-hooks/exhaustive-deps\n};\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport { useHistory } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useEffect } from 'react';\nimport { feedbackHelper } from '../utils/url/feedbackHelpers';\nimport { setHasLogOutRequestBeenCalled } from '../state/user/userDuck';\nimport { userSelector } from '../state/user/userSelectors';\n\nexport const useRedirectAfterLogOut = langCode => {\n const history = useHistory();\n const dispatch = useDispatch();\n const userState = useSelector(userSelector);\n\n useEffect(() => {\n if (userState.hasLogOutRequestBeenCalled) {\n history.push(feedbackHelper.forLogout(langCode));\n dispatch(setHasLogOutRequestBeenCalled(false));\n }\n }, [userState.hasLogOutRequestBeenCalled]);\n};\n","import styled from 'styled-components';\nimport { colors, resolutions } from '../../utils/css';\n\nconst PageLayout = ({ className, children }) => (\n \n);\n\nexport const StyledPageLayout = styled(PageLayout)`\n background: ${colors.LG_WHITE};\n display: grid;\n margin: 0 auto;\n overflow-x: hidden !important;\n padding: 0;\n width: 100%;\n\n @media (min-width: ${resolutions.min.desktop}px) {\n margin: 40px auto;\n min-height: 600px;\n padding: 0 20px;\n width: 1240px;\n\n .content-container {\n width: 1200px;\n }\n }\n`;\n","import { useEffect, useState } from 'react';\nimport globals from '../utils/globals';\n\nexport const useLocationGetter = () => {\n const [location, setLocation] = useState({});\n const [langCode, setLangCode] = useState('');\n useEffect(() => {\n const locationFromWindow = globals.window.location;\n const pathnameFragments = locationFromWindow.pathname\n ? locationFromWindow.pathname.split('/')\n : [];\n const langCodeFromLocation = pathnameFragments.length > 1 ? pathnameFragments[1] : '';\n setLocation(locationFromWindow);\n setLangCode(langCodeFromLocation);\n }, []);\n return { location, langCode };\n};\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useEffect } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { checkUserProfile } from '../services/userService';\nimport { loginTimeout } from '../state/user/userDuck';\nimport { feedbackHelper } from '../utils/url/feedbackHelpers';\nimport { userSelector } from '../state/user/userSelectors';\n\nexport const useCheckSessionTimeout = langCode => {\n const dispatch = useDispatch();\n const { isLoggedIn } = useSelector(userSelector);\n const history = useHistory();\n\n useEffect(() => {\n if (isLoggedIn) {\n checkUserProfile()\n .then(response => {\n if (response.status === 401) {\n dispatch(loginTimeout());\n history.push(feedbackHelper.forSessionTimeout('', langCode));\n }\n })\n .catch(() => {\n history.push(feedbackHelper.forGeneralError(langCode));\n });\n }\n }, [isLoggedIn]);\n};\n","import { LANG_CODES } from './langMapper';\n\nconst rtlLanguages = [\n LANG_CODES.ARABIC,\n LANG_CODES.DARI,\n LANG_CODES.HAUSA,\n LANG_CODES.PASHTO,\n LANG_CODES.PERSIAN,\n LANG_CODES.URDU,\n];\nexport const isRtlByLangCode = langCode => rtlLanguages.includes(langCode);\n","import {\n findExistingCourseById,\n findExistingLessonById,\n findInquiryProgress,\n} from './learnProgress';\n\nexport const learnProgressSelector = state => state.learnProgress;\n\nexport const findLessonLearnProgressSelector = lessonId => state => {\n const { lessons } = state.learnProgress;\n return findExistingLessonById({ lessons, lessonId });\n};\n\nexport const findInquiryLearnProgressSelector = (lessonId, exerciseId) => state => {\n if (!lessonId || !exerciseId) {\n return [];\n }\n const { lessons } = state.learnProgress;\n return findInquiryProgress({ lessons, lessonId, exerciseId });\n};\n\nexport const findCourseLearnProgressSelector = courseId => state => {\n const { courses } = state.learnProgress;\n return { courseProgress: findExistingCourseById({ courses, courseId }) };\n};\n\nexport const isLessonProgressSyncRequiredSelector = state => state.learnProgress.isSyncRequired;\n","import { useDispatch, useSelector } from 'react-redux';\nimport { useEffect } from 'react';\nimport { userSelector } from '../state/user/userSelectors';\nimport { syncLessonProgress } from '../state/progress/learnProgressDuck';\nimport { isLessonProgressSyncRequiredSelector } from '../state/progress/learnProgressSelectors';\n\nexport const useSyncLearnProgress = () => {\n const { isLoggedIn } = useSelector(userSelector);\n const isLessonProgressSyncRequired = useSelector(isLessonProgressSyncRequiredSelector);\n const dispatch = useDispatch();\n\n useEffect(() => {\n if (isLoggedIn && isLessonProgressSyncRequired) {\n dispatch(syncLessonProgress());\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isLoggedIn]);\n};\n","export default \"data:image/jpeg;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2JnLWR3LWRlc2t0b3AuNGFlYzA3M2YuanBnIjs=\"","export default \"data:font/woff;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL0RXVGhlQW50aXF1YUItVzdCb2xkLjczYTM1NzgzLndvZmYiOw==\"","export default \"data:font/woff2;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL0RXVGhlQW50aXF1YUItVzdCb2xkLmM3MzljZjBkLndvZmYyIjs=\"","export default \"data:font/woff;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2R3dGhlYW50aXF1YWItdzVwbGFpbi45NGM1YjgwNC53b2ZmIjs=\"","export default \"data:font/woff2;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2R3dGhlYW50aXF1YWItdzVwbGFpbi41MjRhNWVhYy53b2ZmMiI7\"","export default \"data:font/woff;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL0RXVGhlQW50aXF1YUItVzVQbGFpbkl0YWxpYy4wYzgwNmZlMS53b2ZmIjs=\"","export default \"data:font/woff2;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL0RXVGhlQW50aXF1YUItVzVQbGFpbkl0YWxpYy4zOTA5MzdhZi53b2ZmMiI7\"","import { createGlobalStyle, StyleSheetManager } from 'styled-components';\nimport stylisRTLPlugin from 'stylis-plugin-rtl';\nimport { useParams } from 'react-router';\nimport { colors } from '../utils/css';\nimport { useValidateTicketAndLoginUser } from '../hooks/useValidateTicketAndLoginUser';\nimport { useRedirectAfterLogOut } from '../hooks/useRedirectAfterLogOut';\nimport { StyledPageLayout as PageLayout } from '../components/Page/PageLayout';\nimport { useLocationGetter } from '../hooks/useLocationGetter';\nimport { useCheckSessionTimeout } from '../hooks/useCheckSessionTimeout';\nimport { isRtlByLangCode } from '../utils/mappers/rtlLanguages';\nimport { useSyncLearnProgress } from '../hooks/useSyncLessonProgress';\nimport bgDWDesktop from '../assets/images/bg-dw-desktop.jpg';\nimport DWTheAntiquaBBoldWoff from '../assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff';\nimport DWTheAntiquaBBoldWoff2 from '../assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff2';\nimport DWTheAntiquaBSPlainWoff from '../assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff';\nimport DWTheAntiquaBSPlainWoff2 from '../assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff2';\nimport DWTheAntiquaBSPlainItalicWoff from '../assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff';\nimport DWTheAntiquaBSPlainItalicWoff2 from '../assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff2';\n\nexport const GlobalStyles = createGlobalStyle`\n * {\n box-sizing: border-box;\n font-family: Helvetica, Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n &:after, &:before {\n box-sizing: border-box;\n }\n html {\n -webkit-tap-highlight-color: transparent;\n }\n body {\n direction: ltr;\n text-align: left;\n background: url(${bgDWDesktop}) center top no-repeat ${colors.LG_GRAY_3};\n @font-face {\n font-family: DWTheAntiquaBBold;\n src: url(${DWTheAntiquaBBoldWoff}) format(\"woff\"),\n url(${DWTheAntiquaBBoldWoff2}) format(\"woff2\");\n font-style: normal;\n font-weight: 400\n }\n @font-face {\n font-family: DWTheAntiquaB;\n src: url(${DWTheAntiquaBSPlainWoff}) format(\"woff\"),\n url(${DWTheAntiquaBSPlainWoff2}) format(\"woff2\");\n font-style: normal;\n font-weight: 400\n }\n @font-face {\n font-family: DWTheAntiquaBItalic;\n src: url(${DWTheAntiquaBSPlainItalicWoff}) format(\"woff\"),\n url(${DWTheAntiquaBSPlainItalicWoff2}) format(\"woff2\");\n font-style: normal;\n font-weight: 400\n }\n }\n svg:not(:root) {\n overflow: hidden;\n }\n`;\n\nexport const MainPage = ({ children }) => {\n const { langCode } = useParams();\n const { location } = useLocationGetter();\n useValidateTicketAndLoginUser(location, langCode);\n useRedirectAfterLogOut(langCode);\n useCheckSessionTimeout(langCode);\n useSyncLearnProgress();\n\n const isRtl = isRtlByLangCode(langCode);\n\n return (\n \n <>\n \n {children} \n >\n \n );\n};\n","import { Helmet } from 'react-helmet-async';\nimport { useFrontendConfig } from '../../hooks/useFrontendConfig';\n\nexport const GtmLoadScript = () => (\n \n \n \n);\n","import { objectToQueryParams } from '../../utils/url/url';\nimport { useFrontendConfig } from '../../hooks/useFrontendConfig';\n\nexport const GtmNoScriptFallback = ({ dataLayer }) => {\n const hideIframeStyles = {\n display: 'none',\n visibility: 'hidden',\n };\n const { gtmId } = useFrontendConfig();\n return (\n \n \n \n );\n};\n","import { useLocation } from 'react-router-dom';\nimport { getQueryParamValueFrom } from '../utils/url/url';\n\nexport const useLocationQueryParam = paramName => {\n const { search } = useLocation();\n\n return getQueryParamValueFrom({ from: search, value: paramName });\n};\n","import { useGlobalsContext } from '../../../context/GlobalsContext';\nimport { useLocationQueryParam } from '../../../hooks/useLocationQueryParam';\nimport { useFrontendConfig } from '../../../hooks/useFrontendConfig';\n\nexport const useStaticInfoForGtm = () => {\n const pageUrl = useGlobalsContext().window.location.href.split('?')[0];\n const macaParam = useLocationQueryParam('maca');\n const { gtmLevel1Id } = useFrontendConfig();\n\n return { gtmLevel1Id, macaParam, pageUrl };\n};\n","import gql from 'graphql-tag';\nimport globals from '../../utils/globals';\n\nconst isValidList = list => list?.length > 0;\n\nconst addCurrentNavToRootList = ({ nav }) => [...nav.navsToRoot, nav];\n\n// eslint-disable-next-line no-underscore-dangle\nconst contentTitle = content => (content.__typename === 'Person' ? content.fullName : content.name);\n\nconst pickCategoryName = ({ navs, index }) => (navs[index] || {}).name;\n\nexport const gtmDataLayerPartial = {\n name: 'GtmDataLayer',\n partial() {\n return `\n ...on ModelAspect {\n id\n gtmLanguageCode\n gtmContentType\n }\n ...on DeliveryAspect {\n gtmContentDate\n }\n ...on NamedAspect {\n name\n }\n ...on AssociationsAspect {\n navigations {\n id\n name\n navsToRoot {\n name\n }\n }\n subjects {\n name\n }\n topics:categories {\n originId\n }\n departments {\n name\n }\n }\n `;\n },\n};\n\nexport const mediaInfoForTrackingFragment = {\n name: 'MediaInfoForTrackingFragment',\n fragment({ type }) {\n return gql`fragment ${this.name} on ${type} {\n videos {\n ${gtmDataLayerPartial.partial()}\n }\n audios {\n ${gtmDataLayerPartial.partial()}\n }\n }\n `;\n },\n};\n\nexport const generateContentGtmInfo = ({\n content,\n level1Id,\n macaParam,\n pageUrl,\n courseId,\n noContentPageId,\n}) => {\n const navs = isValidList(content.navigations) ? content.navigations : [{ navsToRoot: [] }];\n const alignedNavs = addCurrentNavToRootList({ nav: navs[0] });\n\n return {\n categoryLevel1: pickCategoryName({ navs: alignedNavs, index: 0 }),\n categoryLevel2: pickCategoryName({ navs: alignedNavs, index: 1 }),\n categoryLevel3: pickCategoryName({ navs: alignedNavs, index: 2 }),\n contentTitle: contentTitle(content),\n contentLanguage: content.gtmLanguageCode,\n pageOID: content.id,\n contentType: content.gtmContentType,\n date: content.gtmContentDate,\n subject: content.subjects ? content.subjects[0]?.name : {},\n topicIds: content.topics?.map(topic => topic.originId),\n pageSID: navs[0].id,\n departmentName: content.departments ? content.departments[0]?.name : {},\n categoryType: 1,\n displayForm: 5,\n level1ID: level1Id,\n macaParam,\n pageUrl,\n courseId,\n noContentPageId,\n };\n};\n\nexport const TrackingUtils = {\n initDataLayerScript: datalayer => {\n const initialDataLayer = {\n ...datalayer,\n event: 'onPageChange',\n };\n\n return `\n if(!window.dataLayer) {\n window.dataLayer = [${JSON.stringify(initialDataLayer)}]\n };`.trim();\n },\n generateDataLayer: ({ content, level1Id, macaParam, pageUrl, courseId, noContentPageId }) => ({\n pageData: {\n ...generateContentGtmInfo({\n content,\n level1Id,\n macaParam,\n pageUrl,\n courseId,\n noContentPageId,\n }),\n embeddings: {},\n },\n }),\n pushToGoogleTagManager: ({ datalayerObj, withReset = false }) => {\n setTimeout(() => {\n if (withReset) {\n TrackingUtils.resetDataLayer();\n }\n // eslint-disable-next-line fp/no-mutating-methods\n globals.window.dataLayer?.push(datalayerObj);\n }, 0);\n },\n resetDataLayer: () => {\n // eslint-disable-next-line fp/no-mutating-methods\n globals.window.dataLayer.push(function dontUseArrowFunction() {\n this.reset();\n });\n },\n};\n","import { createContext, useContext } from 'react';\n\n// CONTEXT\nexport const CourseDataContext = createContext({});\n\n// USAGE HOOK\nexport const useCourseData = () => useContext(CourseDataContext);\n","import { Helmet } from 'react-helmet-async';\nimport { GtmNoScriptFallback } from './GtmNoScriptFallback';\nimport { useStaticInfoForGtm } from './hooks/useStaticInfoForGtm';\nimport { gtmDataLayerPartial, TrackingUtils } from './TrackingUtils';\nimport { useCourseData } from '../../hooks/useCourseData';\n\nexport const gtmDataLayerFragment = gtmDataLayerPartial;\n\nexport const GtmDataLayer = ({ content, noContentPageId, push = false }) => {\n const { gtmLevel1Id: level1Id, macaParam, pageUrl } = useStaticInfoForGtm();\n const { courseId } = useCourseData();\n\n const dataLayer = TrackingUtils.generateDataLayer({\n content,\n macaParam,\n level1Id,\n pageUrl,\n courseId,\n noContentPageId,\n });\n\n if (push) {\n TrackingUtils.pushToGoogleTagManager({\n withReset: true,\n datalayerObj: {\n event: 'onPageChange',\n ...dataLayer,\n },\n });\n }\n\n return (\n <>\n \n \n \n \n >\n );\n};\n","import { isServer } from '../../utils/ssr';\nimport globals from '../../utils/globals';\n\nimport { GtmLoadScript } from './GtmLoadScript';\nimport { GtmDataLayer } from './GtmDataLayer';\n\nexport { gtmDataLayerFragment } from './GtmDataLayer';\n\nexport const GtmScriptWithDataLayer = ({ content = {}, noContentPageId }) => {\n const isGtmAlreadyInitialized = !isServer() && !!globals.window.dataLayer;\n return (\n <>\n \n {!isGtmAlreadyInitialized && }\n >\n );\n};\n","import { memo } from 'react';\nimport { GtmScriptWithDataLayer as NotMemoGtmScriptWithDataLayer } from './GtmScriptWithDataLayer';\n\nexport { gtmDataLayerFragment } from './GtmScriptWithDataLayer';\n\nexport const GtmScriptWithDataLayer = memo(NotMemoGtmScriptWithDataLayer);\n","import { StyledHeader as Header } from '../Header/Header';\nimport { StyledFooter as Footer } from '../Footer/Footer';\nimport { I18nConfigLoader } from '../I18n/I18nConfigLoader';\nimport { GdprLayer } from '../GdprLayer/GdprLayer';\nimport { PageMetaData } from './PageMetaData';\nimport { MainPage } from '../../pages/MainPage';\nimport { GtmScriptWithDataLayer } from '../GoogleTagManager';\nimport { GTM_NO_CONTENT_PAGE_IDS } from '../../constants/pageTypes';\n\nexport const PageContainer = ({ children }) => {\n return (\n \n \n {data => (\n <>\n \n {children}\n \n \n >\n )}\n \n \n );\n};\n\nexport const withPageContainerAndMetadata = ({\n component: TargetComponent,\n pageType,\n addDescriptionAndKeywordsMeta,\n useDescriptionTranslation,\n}) => (\n \n \n \n \n \n);\n","import { PageContainer } from '../components/Page/PageContainer';\nimport { GtmScriptWithDataLayer } from '../components/GoogleTagManager';\nimport { GTM_NO_CONTENT_PAGE_IDS } from '../constants/pageTypes';\n\nexport const Default404Page = () => (\n \n \n Page not found (404).
\n \n);\n","/**\n * Represents Courses that are delivered in one Content Language typically German.\n * @constructor\n * @param {array} 36519718 - B1 Nicos Weg\n * @param {array} 39902336 - B1 Deutsch im Job – Profis gesucht\n * @param {array} 53437698 - B1 Jojo sucht das Glück\n * @param {array} 53074503 - Das Deutschlandlabor\n * @param {array} 55320903 - Ticket nach Berlin\n * @param {array} 54554235 - Das Bandtagebuch mit Einshoch6\n */\nexport const MONOLINGUAL_COURSES_IDS = Object.freeze([\n '36519718',\n '39902336',\n '53437698',\n '53074503',\n '54554235',\n]);\n\nexport const isMonolingualCourse = courseId => MONOLINGUAL_COURSES_IDS.includes(courseId);\n","import styled from 'styled-components';\nimport { colors, resolutions } from '../../utils/css';\n\nconst HeroTemplate = ({ className, aria, children }) => (\n \n);\nexport const StyledHeroTemplate = styled(HeroTemplate)`\n display: flex;\n align-items: center;\n color: ${colors.LG_WHITE};\n\n @media (max-width: ${resolutions.max.mobile}px) {\n max-height: 240px;\n background-size: 150%;\n font-size: 28px;\n line-height: 32px;\n }\n`;\n","import styled from 'styled-components';\nimport { StyledHeroTemplate as HeroTemplate } from '../../HeroTemplate/HeroTemplate';\nimport { resolutions } from '../../../utils/css';\n\nconst determineImage = ({ imageId, imageBasePath }) => {\n return `${imageBasePath}/${imageId}`;\n};\n\nexport const StyledCourseHeroImage = styled(HeroTemplate)`\n background: url(${determineImage}_509.jpg) center center / cover no-repeat;\n height: 320px;\n\n .content {\n width: 100%;\n padding: 0 20px;\n }\n\n .title {\n margin: 0;\n white-space: nowrap;\n overflow-x: hidden;\n text-overflow: ellipsis;\n }\n\n .identifier {\n text-transform: uppercase;\n font: 700 40px Helvetica, Arial, sans-serif;\n opacity: 0.5;\n }\n\n .description {\n /* @noflip */\n direction: ltr;\n font: 400 40px DWTheAntiquaB, Georgia, serif;\n opacity: 1;\n margin: 0 8px;\n }\n\n @media (max-width: ${resolutions.max.tablet}px) {\n .identifier,\n .description {\n font-size: 36px;\n }\n }\n\n @media (max-width: 992px) {\n background: url(${determineImage}_507.jpg) center center / cover no-repeat;\n\n .identifier,\n .description {\n font-size: 32px;\n }\n }\n\n @media (max-width: ${resolutions.max.mobile}px) {\n .identifier,\n .description {\n font-size: 28px;\n }\n }\n\n @media (max-width: 480px) {\n background: url(${determineImage}_503.jpg) center center / cover no-repeat;\n }\n\n @media (max-width: 360px) {\n background: url(${determineImage}_501.jpg) center center / cover no-repeat;\n }\n`;\n","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"g\", {\n className: \"arrowBox\",\n fillRule: \"evenodd\"\n}, /*#__PURE__*/React.createElement(\"g\", {\n className: \"arrowArrow\",\n transform: \"translate(12, 12), rotate(0 0 0) scale(1.0)\"\n}, /*#__PURE__*/React.createElement(\"polygon\", {\n points: \"12 -4.7125 0 4.9375 -12 -4.6875 -10.375 -5.5 0 0.125 10.375 -5.5\"\n})));\n\nfunction SvgToggleableArrow(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n viewBox: \"0 0 24 24\",\n xmlns: \"http://www.w3.org/2000/svg\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgToggleableArrow);\nexport default __webpack_public_path__ + \"static/media/toggleableArrow.a17a06a6.svg\";\nexport { ForwardRef as ReactComponent };","import styled from 'styled-components';\nimport { ReactComponent as ToggleableArrowIcon } from '../svg/toggleableArrow.svg';\n\nexport const StyledToggleableArrowIcon = styled(props => )``;\n","import styled from 'styled-components';\nimport classnames from 'classnames';\nimport { StyledToggleableArrowIcon as ToggleableArrowIcon } from '../../assets/icons/ToggleableArrowIcon';\n\nconst ToggleableArrow = ({ className, isUp, fill, ...restProps }) => {\n const classNames = classnames(className, {\n up: isUp,\n });\n return ;\n};\n\nexport const StyledToggleableArrow = styled(ToggleableArrow)`\n position: absolute;\n width: 28px;\n height: 24px;\n fill: ${({ fill }) => fill};\n &.up {\n transform: rotate(180deg);\n }\n`;\n","import styled from 'styled-components';\nimport classnames from 'classnames';\nimport { I18nText } from '../../../I18n/I18nText';\nimport { colors, resolutions } from '../../../../utils/css';\nimport { StyledToggleableArrow as ToggleableArrow } from '../../../ToggleableArrow/ToggleableArrow';\n\nconst CourseHeader = ({ className, groupNameTranslationKey, isOpen, onClick, onKeyPress }) => {\n return (\n \n \n \n
\n );\n};\n\nexport const StyledCourseHeader = styled(CourseHeader)`\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n border-top: 1px solid ${colors.LG_GRAY_TRANSPARENT_1};\n height: 163px;\n pointer-events: none;\n\n .title {\n height: 25px;\n background-color: ${colors.LG_WHITE};\n color: ${colors.LG_GRAY_13};\n white-space: nowrap;\n overflow-x: hidden;\n text-overflow: ellipsis;\n font-family: Helvetica, Arial, sans-serif;\n font-weight: 700;\n font-size: 22px;\n line-height: 23px;\n margin: 0;\n padding: 0 20px;\n }\n\n .toggleable-arrow {\n display: none;\n }\n\n @media (max-width: ${resolutions.max.tablet}px) {\n height: 94px;\n pointer-events: all;\n\n .title {\n padding: 0 45px 0 20px;\n border-top: 0;\n }\n\n .toggleable-arrow {\n display: inline-block;\n right: 40px;\n }\n }\n`;\n","import styled from 'styled-components';\nimport { colors } from '../../../../utils/css';\nimport { calculatePercentage } from '../../../../utils/commons';\n\nexport const LessonScore = ({ className, lessonProgress }) => {\n const { resultPoints, maxPointsForAllExercises } = lessonProgress;\n\n const resultPointsClassName = () => {\n const resultInPercentage = calculatePercentage(resultPoints, maxPointsForAllExercises);\n\n if (resultInPercentage >= 70) {\n return 'good';\n }\n if (resultInPercentage <= 40) {\n return 'low';\n }\n return 'mid';\n };\n\n return (\n \n {resultPoints} \n / \n {maxPointsForAllExercises} \n
\n );\n};\n\nexport const StyledLessonScore = styled(LessonScore)`\n font-size: 14px;\n\n .low {\n color: ${colors.LG_RED_SCORE};\n }\n .mid {\n color: ${colors.LG_GRAY_11};\n }\n .good {\n color: ${colors.LG_GREEN_SCORE};\n }\n`;\n","import styled from 'styled-components';\nimport { I18nText } from '../../I18n/I18nText';\nimport { colors } from '../../../utils/css';\n\nexport const ProgressResetButton = ({ className, onClickReset }) => {\n return (\n onClickReset(e)} className={className}>\n \n \n );\n};\n\nexport const StyledProgressResetButton = styled(ProgressResetButton)`\n background-color: ${colors.LG_GRAY_2};\n border: 1px solid transparent;\n color: ${colors.LG_WHITE};\n font-size: 12px;\n min-height: 31px;\n padding: 3px 10px;\n`;\n\nexport const StyledSmallProgressResetButton = styled(StyledProgressResetButton)`\n min-height: 27px;\n padding: 1px 7px;\n`;\n","export const progressIconColors = {\n GRAY: 'gray',\n WHITE: 'white',\n};\n","import styled from 'styled-components';\nimport classnames from 'classnames';\nimport { colors } from '../../utils/css';\nimport { progressIconColors } from './progressIconColors';\nimport { useTranslation } from '../../hooks/useTranslation';\n\nexport const progressState = Object.freeze({\n EMPTY: 'empty',\n HALF: 'half',\n FULL: 'full',\n});\n\nconst translationKeyPrefix = 'common.progress';\n\nconst getTitleTranslationKey = progress => {\n switch (progress) {\n case progressState.EMPTY:\n return `${translationKeyPrefix}.none`;\n case progressState.HALF:\n return `${translationKeyPrefix}.half`;\n case progressState.FULL:\n return `${translationKeyPrefix}.full`;\n default:\n return `${translationKeyPrefix}.none`;\n }\n};\n\nconst ProgressIcon = ({ className, progress, color = progressIconColors.GRAY }) => {\n const title = useTranslation(getTitleTranslationKey(progress));\n\n return (\n \n );\n};\n\nexport const StyledProgressIcon = styled(ProgressIcon)`\n width: 16px;\n height: 16px;\n margin: 0;\n text-align: right;\n\n div {\n margin: 0;\n }\n\n .background.white {\n border: 2px solid ${colors.LG_WHITE};\n }\n\n .background.gray {\n border: 2px solid ${colors.LG_GRAY_2};\n }\n\n .background {\n height: 100%;\n width: 100%;\n border-radius: 50%;\n box-sizing: border-box;\n\n .icon {\n height: 100%;\n }\n\n .icon.white {\n background: ${colors.LG_WHITE};\n }\n\n .icon.gray {\n background: ${colors.LG_GRAY_2};\n }\n\n .icon.full {\n width: 100%;\n }\n\n .icon.half {\n width: 50%;\n }\n\n .icon.empty {\n width: 0;\n }\n }\n`;\n","import { USER } from '../constants/userUrl';\n\nexport const PS_PREFIX = USER.PS_URL;\nexport const CERTIFICATE_URL = `${PS_PREFIX}protected/certificate/`;\n\nexport const getCertificate = id => {\n return fetch(`${CERTIFICATE_URL}${id}`, {\n headers: {\n 'Content-Type': 'application/pdf',\n },\n }).then(response => (response.ok ? response : response.json().then(err => Promise.reject(err))));\n};\n","import { getCertificate } from '../services/certificateService';\nimport { FEEDBACK_TYPES } from '../constants/feedback';\nimport { feedbackHelper } from './url/feedbackHelpers';\n\nexport const handleCertificateGeneration = async ({ id, langCode, history }) => {\n if (!id) {\n history.push(feedbackHelper.forInvalidCertificate(langCode));\n }\n\n try {\n const response = await getCertificate(id);\n response.blob().then(blob => {\n const headerFilename = response.headers.get('Content-Disposition').split('filename=')[1];\n const filename = headerFilename.replace('?', '–');\n const url = window.URL.createObjectURL(blob);\n const downloadLink = document.createElement('a');\n // eslint-disable-next-line fp/no-mutation\n downloadLink.href = url;\n // eslint-disable-next-line fp/no-mutation\n downloadLink.download = decodeURIComponent(filename);\n downloadLink.click();\n });\n } catch (error) {\n error.errorCode === FEEDBACK_TYPES.MISSING_TRANSCRIPTION\n ? history.push(feedbackHelper.forCertificateMissingTranscription(langCode))\n : history.push(feedbackHelper.forInvalidCertificate(langCode));\n }\n};\n","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nexport default __webpack_public_path__ + \"static/media/icon-course-cert-gray.0fdcab0c.svg\";","import styled from 'styled-components';\nimport { useHistory } from 'react-router-dom';\nimport { useParams } from 'react-router';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { handleCertificateGeneration } from '../../utils/certificateUtils';\nimport CertificateGray from '../../assets/svg/icon-course-cert-gray.svg';\n\nexport const CertificateIcon = ({ className, id }) => {\n const history = useHistory();\n const { langCode } = useParams();\n const title = useTranslation('common.progress.cert');\n\n const handleOnCertificateClick = async () => {\n if (id) {\n await handleCertificateGeneration({ id, langCode, history });\n }\n };\n\n return (\n \n
\n
\n );\n};\n\nexport const StyledCertificateIcon = styled(CertificateIcon)`\n width: 16px;\n height: 24px;\n cursor: pointer;\n`;\n","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nexport default __webpack_public_path__ + \"static/media/star-white.d32dc96a.svg\";","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nexport default __webpack_public_path__ + \"static/media/star-gray.84ad33dd.svg\";","import styled from 'styled-components';\nimport StarWhite from '../../assets/svg/star-white.svg';\nimport StarGrey from '../../assets/svg/star-gray.svg';\nimport { progressIconColors } from './progressIconColors';\nimport { useTranslation } from '../../hooks/useTranslation';\n\nconst starsMapping = {\n [progressIconColors.GRAY]: StarGrey,\n [progressIconColors.WHITE]: StarWhite,\n};\n\nexport const ProgressIconStar = ({ className, color }) => {\n const title = useTranslation('common.progress.good');\n\n return (\n \n );\n};\n\nexport const StyledProgressIconStar = styled(ProgressIconStar)`\n width: 16px;\n height: 16px;\n`;\n","import { progressState, StyledProgressIcon as ProgressIcon } from '../ProgressIcon/ProgressIcon';\nimport { calculatePercentage } from '../../utils/commons';\nimport { StyledCertificateIcon } from '../ProgressIcon/CertificateIcon';\nimport { StyledProgressIconStar } from '../ProgressIcon/ProgressIconStar';\nimport { progressIconColors } from '../ProgressIcon/progressIconColors';\n\nexport const LearnProgressIcon = ({\n learnProgress,\n color = progressIconColors.GRAY,\n finalLessonId,\n}) => {\n const getProgressIcon = () => {\n if (!learnProgress) {\n return ;\n }\n\n const {\n resultPoints,\n maxPointsForAllExercises,\n doneExerciseCount,\n allExerciseCount,\n finalTestPassed,\n } = learnProgress;\n\n if (doneExerciseCount === 0) {\n return ;\n }\n if (finalTestPassed) {\n return ;\n }\n if (doneExerciseCount < allExerciseCount) {\n return ;\n }\n if (doneExerciseCount === allExerciseCount) {\n const resultInPercentage = calculatePercentage(resultPoints, maxPointsForAllExercises);\n if (resultInPercentage >= 80) {\n return ;\n }\n return ;\n }\n\n return ;\n };\n\n return getProgressIcon();\n};\n","import styled from 'styled-components';\nimport { Link } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { StyledText as Text } from '../../../Text/Text';\nimport { colors } from '../../../../utils/css';\nimport { getContentUrl } from '../../../../utils/url/urlFactory';\nimport { StyledLessonScore as LessonScore } from './LessonScore';\nimport { StyledSmallProgressResetButton as ProgressResetButton } from '../../Progress/ProgressResetButton';\nimport { LearnProgressIcon } from '../../../LearnProgressIcon/LearnProgressIcon';\nimport { findLessonLearnProgressSelector } from '../../../../state/progress/learnProgressSelectors';\n\nexport const LessonItem = ({ lesson, className, onClickReset }) => {\n const lessonId = lesson.id;\n const lessonProgress = useSelector(findLessonLearnProgressSelector(lessonId));\n\n const onHandleResetClick = e => {\n onClickReset(e, lessonId);\n };\n\n return (\n <>\n \n \n {lesson.shortTitle}\n \n \n \n
\n \n {lesson.learningTargetHeadline}\n \n {lessonProgress && (\n <>\n \n \n >\n )}\n \n {lesson.grammarDescription}\n \n \n >\n );\n};\n\nconst alignProgressData = '5px';\n\nexport const StyledLessonItem = styled(LessonItem)`\n border-top: 1px solid ${colors.LG_GRAY_TRANSPARENT_1};\n color: ${colors.LG_GRAY_8};\n display: grid;\n font-size: 14px;\n grid-template-columns: 1fr auto;\n grid-template-rows: repeat(3, 1fr);\n height: 102px;\n padding: 10px 20px;\n overflow-y: hidden;\n text-decoration: none;\n\n &:hover {\n color: ${colors.LG_GRAY_8};\n text-decoration: none;\n }\n\n .title {\n color: ${colors.LG_GRAY_9};\n font-family: DWTheAntiquaBBold, Georgia-Bold, serif;\n font-size: 17px;\n line-height: 24px;\n margin: 0;\n overflow-x: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .learningTarget,\n .categories {\n font-family: DWTheAntiquaB, Georgia, serif;\n overflow-x: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .categories {\n grid-column: 1 / 2;\n }\n\n .tile-progress {\n display: flex;\n justify-content: flex-end;\n padding: 5px 0 0 0;\n padding-right: ${alignProgressData};\n }\n\n .lessonScore {\n grid-column-start: 2;\n justify-self: flex-end;\n padding-right: ${alignProgressData};\n }\n\n .resetButton {\n grid-column-start: 2;\n grid-row-start: 3;\n justify-self: center;\n }\n`;\n","import styled from 'styled-components';\nimport classnames from 'classnames';\nimport { colors, resolutions } from '../../../../utils/css';\nimport { StyledLessonItem as LessonItem } from '../LessionItem/LessonItem';\n\nexport const LessonList = ({ className, groupedLessons, onClickReset, isOpen = true }) => (\n // eslint-disable-next-line jsx-a11y/role-supports-aria-props\n \n {groupedLessons.map(lesson => (\n \n \n \n ))}\n \n);\n\nexport const StyledLessonList = styled(LessonList)`\n transition: max-height 0.3s linear;\n overflow-y: hidden;\n visibility: visible;\n max-height: ${props => props.groupedLessons.length * 102}px;\n list-style-type: none;\n margin: 0;\n padding: 0;\n\n @media (max-width: ${resolutions.max.tablet}px) {\n background-color: ${colors.LG_GRAY_3};\n\n &:last-child {\n border-bottom: 0;\n }\n\n &.collapsed {\n visibility: hidden;\n max-height: 0;\n }\n }\n`;\n","import { resolutions } from '../../../../utils/css';\nimport { useToggle } from '../../../../hooks/useToggle';\nimport { StyledCourseHeader as CourseHeader } from '../CourseHeader/CourseHeader';\nimport { StyledLessonList as LessonList } from '../LessonList/LessonList';\nimport globals from '../../../../utils/globals';\n\nexport const CourseAccordion = ({ groupNameTranslationKey, groupedLessons, onClickReset }) => {\n const isOnDesktop = globals.window.innerWidth >= resolutions.min.desktop;\n const [isOpen, { toggleOnClick, toggleOnKeyPress }] = useToggle({ initialState: isOnDesktop });\n\n return (\n \n \n \n
\n );\n};\n","import styled from 'styled-components';\nimport { colors, resolutions } from '../../../utils/css';\nimport { CourseAccordion } from './CourseAccordion/CourseAccordion';\n\nexport const CourseList = ({ className, groupedLessons, onClickResetLesson }) => (\n \n {Object.keys(groupedLessons).map(key => (\n // group lessons by their group names\n \n \n \n ))}\n \n);\n\nexport const StyledCourseList = styled(CourseList)`\n * {\n box-sizing: border-box;\n }\n\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n width: 100%;\n list-style-type: none;\n margin: 0;\n padding: 0;\n\n .course {\n display: inline-block;\n background: ${colors.LG_WHITE};\n\n &:nth-child(odd) {\n .accordion .lesson-list {\n background-color: ${colors.LG_GRAY_3};\n }\n }\n }\n\n @media (max-width: ${resolutions.max.tablet}px) {\n grid-template-columns: 100%;\n }\n`;\n","import { createGlobalStyle } from 'styled-components';\n\nexport const DisableScrollingStyles = createGlobalStyle`\n body {\n overflow: hidden;\n padding-right: 17px;\n }\n`;\n","import ReactDOM from 'react-dom';\nimport { DisableScrollingStyles } from './DisableScrollingStyles';\n\nexport const ModalIntegration = ({ isOpen, children }) => {\n if (!isOpen) return null;\n const componentToCreate = (\n <>\n \n {children}\n >\n );\n return ReactDOM.createPortal(componentToCreate, document.body);\n};\n","import styled from 'styled-components';\nimport classnames from 'classnames';\nimport { colors } from '../../utils/css';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { useRtlContext } from '../../hooks/useRtl';\n\nconst StandardButton = ({ titleKey, className, handleClick }) => {\n const { isRtl } = useRtlContext();\n const label = useTranslation(titleKey);\n\n return (\n \n {label}\n \n );\n};\n\nexport const StyledStandardButton = styled(StandardButton)`\n display: inline-block;\n width: 100%;\n background: ${colors.LG_BLUE_1};\n box-sizing: border-box;\n border: none;\n height: 50px;\n text-decoration: none;\n justify-content: center;\n align-items: center;\n line-height: 33px;\n color: ${colors.LG_WHITE};\n font: 400 17px Helvetica, Arial, sans-serif;\n text-align: center;\n :active,\n :hover,\n :focus {\n transition: all 0.1s linear;\n background-color: ${colors.LG_GRAY_10};\n color: ${colors.LG_WHITE};\n }\n\n .rtl {\n direction: rtl;\n }\n`;\n","import styled from 'styled-components';\nimport { StyledStandardButton as StandardButton } from '../StandardButton/StandardButton';\nimport { colors, resolutions } from '../../utils/css';\nimport { I18nText } from '../I18n/I18nText';\nimport { useRtlContext } from '../../hooks/useRtl';\n\nexport const Modal = ({\n className,\n fadeIn,\n descriptionKey,\n leftButtonKey,\n rightButtonKey,\n onConfirmClicked,\n onCancelClicked,\n}) => {\n const { isRtl } = useRtlContext();\n\n const faded = fadeIn ? 'in' : '';\n const classNameString = `${className} fade ${faded}`;\n return (\n \n );\n};\n\nexport const StyledModal = styled(Modal)`\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 10040;\n\n .modal-background {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: ${colors.LG_BLACK};\n opacity: 0.5;\n font-family: Helvetica, Arial, sans-serif;\n font-weight: 400;\n font-size: 15px;\n }\n .modal-dialogue {\n position: relative;\n background-color: ${colors.LG_WHITE};\n width: 900px;\n margin: 30px auto;\n\n .modal-content {\n position: relative;\n background-color: ${colors.LG_WHITE};\n background-clip: padding-box;\n border-radius: 0;\n outline: 0;\n box-shadow: 0 3px 9px ${colors.LG_TRANSPARENT_BLACK_50};\n border: 1px solid ${colors.LG_TRANSPARENT_BLACK_20};\n\n .modal-body {\n position: relative;\n padding: 15px;\n font-size: 15px;\n\n p {\n margin: 0 0 10px;\n }\n }\n }\n\n .modal-footer {\n padding: 35px 10px;\n text-align: right;\n border-top: 1px solid ${colors.LG_GRAY_4};\n display: flex;\n flex-flow: row;\n justify-content: space-evenly;\n\n button {\n position: relative;\n margin: 0 7px;\n width: 100%;\n }\n }\n }\n\n &.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n }\n\n &.fade.in {\n opacity: 1;\n }\n\n &.rtl {\n direction: rtl;\n }\n\n @media (max-width: ${resolutions.max.tablet}px) {\n .modal-dialogue {\n width: 600px;\n .modal-footer {\n flex-flow: column;\n button {\n margin: 15px 0;\n }\n }\n }\n }\n\n @media (max-width: ${resolutions.max.mobile}px) {\n .modal-dialogue {\n width: auto;\n margin: 10px;\n .modal-footer {\n flex-flow: column;\n button {\n margin: 15px 0;\n }\n }\n }\n }\n`;\n\nexport const RightButton = styled(StandardButton)`\n background: ${colors.LG_WHITE};\n color: ${colors.LG_BLUE_1};\n border: 1px solid ${colors.LG_BLUE_1};\n box-sizing: border-box;\n\n :hover {\n border-color: ${colors.LG_BLACK};\n }\n`;\n\nexport const LeftButton = StandardButton;\n","import { StyledModal as Modal } from './Modal';\n\nexport const ResetModal = ({ fadeIn, onConfirmClicked, onCancelClicked }) => {\n const descriptionKey = 'lesson.modal.confirm';\n const leftButtonKey = 'lesson.modal.reset';\n const rightButtonKey = 'lesson.modal.cancel';\n return (\n \n );\n};\n","import styled from 'styled-components';\nimport { useSelector } from 'react-redux';\nimport { StyledProgressResetButton as ProgressResetButton } from './ProgressResetButton';\nimport { LearnProgressIcon } from '../../LearnProgressIcon/LearnProgressIcon';\nimport { findCourseLearnProgressSelector } from '../../../state/progress/learnProgressSelectors';\n\nexport const CourseProgress = ({ className, courseId, finalLessonId, onClickResetCourse }) => {\n const { courseProgress } = useSelector(findCourseLearnProgressSelector(courseId));\n\n return (\n \n );\n};\n\nexport const StyledCourseProgress = styled(CourseProgress)`\n display: flex;\n justify-content: flex-end;\n align-items: center;\n padding-right: 25px;\n\n > * {\n margin: 14px;\n }\n`;\n","// converts dkLearningLevel value to string learning levels\nexport const learningLevelMapper = {\n 0: '',\n 2: 'A1',\n 4: 'A2',\n 8: 'B1',\n 16: 'B2',\n};\n\nexport const sortByLearningLevel = coursesToSort =>\n // eslint-disable-next-line fp/no-mutating-methods\n [...coursesToSort].sort((a, b) => {\n if (a.dkLearningLevel === 0 && b.dkLearningLevel === 0) return 0;\n return a.dkLearningLevel - b.dkLearningLevel || a.id - b.id;\n });\n","import { useEffect, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { createGlobalStyle } from 'styled-components';\nimport {\n groupBy,\n isFinalTestPredicate,\n removeContentLinksWithEmptyTarget,\n} from '../../utils/commons';\nimport { useFrontendConfig } from '../../hooks/useFrontendConfig';\nimport {\n deleteCourseProgress,\n deleteLessonProgress,\n initCourse,\n readCourseProgress,\n readLessonProgresses,\n} from '../../state/progress/learnProgressDuck';\nimport { isMonolingualCourse } from '../../constants/isLtrContentOnly';\nimport { StyledCourseHeroImage as CoursePageHeroImage } from './CourseHeroImage/CourseHeroImage';\nimport { I18nText } from '../I18n/I18nText';\nimport { StyledCourseList as CourseList } from './CourseList/CourseList';\nimport { ModalIntegration } from '../Modal/ModalIntegration';\nimport { ResetModal } from '../Modal/ResetModal';\nimport { StyledCourseProgress as CourseProgress } from './Progress/CourseProgress';\nimport { learningLevelMapper } from '../../utils/learningLevelUtils';\n\nexport const LTRContentCourseOverviewStyle = createGlobalStyle`\n #courses {\n .title,\n span[aria-label*=\"lesson\"] {\n /* @noflip */\n direction: ltr;\n }\n .content .title {\n /* @noflip */\n text-align: left;\n }\n }\n`;\n\nexport const CourseOverview = ({ data, contentId }) => {\n const isMonoLingualCourse = isMonolingualCourse(contentId);\n\n const {\n name,\n dkLearningLevel,\n contentLinks: lessonContentLinks,\n mainContentImageLink,\n learningMetaInfo: { achievableScore, exerciseCount } = {},\n } = data.content;\n const filteredContentLinks = removeContentLinksWithEmptyTarget(lessonContentLinks);\n const finalLessonId = filteredContentLinks\n .filter(contentLink => isFinalTestPredicate(contentLink))\n .map(contentLink => contentLink.target.id);\n const allLessonIds = filteredContentLinks.map(contentLink => contentLink.target.id);\n const groupedLessons = groupBy('groupName', filteredContentLinks);\n const { imageBasePath } = useFrontendConfig();\n const [isResetModalOpen, setResetModalOpen] = useState(false);\n const [lessonIdToDelete, setLessonIdToDelete] = useState(null);\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch(\n initCourse({\n allExerciseCount: exerciseCount,\n maxPointsForAllExercises: achievableScore,\n cosCourseId: contentId,\n }),\n );\n dispatch(readLessonProgresses(allLessonIds));\n dispatch(readCourseProgress(contentId));\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const onClickResetCourse = () => {\n setResetModalOpen(true);\n };\n\n const onClickResetLesson = (e, lessonId) => {\n e.preventDefault();\n setLessonIdToDelete(lessonId);\n setResetModalOpen(true);\n };\n\n const onConfirmResetProgress = () => {\n if (lessonIdToDelete) {\n dispatch(deleteLessonProgress(lessonIdToDelete));\n setLessonIdToDelete(null);\n } else {\n dispatch(deleteCourseProgress(contentId));\n }\n setResetModalOpen(false);\n };\n\n const onCancelResetModal = () => {\n setLessonIdToDelete(null);\n setResetModalOpen(false);\n };\n\n return (\n \n {isMonoLingualCourse &&
}\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n \n
\n );\n};\n","import gql from 'graphql-tag';\nimport { Helmet } from 'react-helmet-async';\nimport { useFrontendConfig } from '../../hooks/useFrontendConfig';\n\nexport const imageOGMetaDataFragment = {\n name: 'ImageOGMetaData',\n fragment({ type }) {\n return gql`fragment ${type}${this.name} on ${type} {\n mainContentImage {\n id\n imageFormats\n }\n }\n `;\n },\n};\n\nexport const hasCorrectImageFormat = imageFormats =>\n imageFormats.find(format => format.includes('MASTER_LANDSCAPE'));\n\nconst createImageSharingData = ({ id, imageFormats, imageBasePath }) => {\n if (hasCorrectImageFormat(imageFormats)) {\n return {\n url: `${imageBasePath}/${id}_401.jpg`,\n width: 700,\n height: 394,\n };\n }\n return undefined;\n};\n\nexport const ImageOGMetaData = ({ image }) => {\n const { imageBasePath } = useFrontendConfig();\n\n if (!image) {\n return null;\n }\n\n const { url, width, height } = createImageSharingData({ ...image, imageBasePath }) || {};\n\n if (!url) {\n return null;\n }\n\n return (\n \n \n \n \n \n \n );\n};\n","import gql from 'graphql-tag';\nimport { useSelector } from 'react-redux';\nimport { toLang } from '../utils/mappers/langMapper';\nimport { PageContainer } from '../components/Page/PageContainer';\nimport { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { CourseOverview } from '../components/Course/CourseOverview';\nimport { scoreFragment } from '../state/progress/learnProgress';\nimport { userDataSelector, userSelector } from '../state/user/userSelectors';\nimport { metaDataFragment, PageMetaData } from '../components/Page/PageMetaData';\nimport { PAGE_TYPES } from '../constants/pageTypes';\nimport {\n ImageOGMetaData,\n imageOGMetaDataFragment,\n} from '../components/ImageOGMetaData/ImageOGMetaData';\nimport {\n gtmDataLayerFragment,\n GtmScriptWithDataLayer,\n} from '../components/GoogleTagManager/GtmScriptWithDataLayer';\nimport { CourseDataContext } from '../hooks/useCourseData';\n\nexport const coursePageQuery = ({ addMetaInfo, handicap }) => gql`\n query CoursePage($id: Int!, $lang: Language!) {\n content(id: $id, lang: $lang) {\n ... on Course {\n name\n dkLearningLevel\n mainContentImageLink {\n description\n targetId\n }\n contentLinks(targetTypes: LESSON) {\n id\n additionalInformation\n groupName\n target {\n ... on Lesson {\n id\n language\n shortTitle\n learningTargetHeadline\n grammarDescription\n }\n }\n }\n ...CourseImageOGMetaData\n ...${`CourseScore${handicap || ''}`}\n ...${metaDataFragment.name}\n ${gtmDataLayerFragment.partial()}\n }\n }\n }\n ${scoreFragment.fragment({ type: 'Course', addLearningMetaInfo: addMetaInfo, handicap })}\n ${imageOGMetaDataFragment.fragment({ type: 'Course' })}\n ${metaDataFragment.fragment({ type: 'Course' })}\n`;\n\nexport const CoursePage = ({ contentId, langCode }) => {\n const { isLoggedIn } = useSelector(userSelector);\n const { handicap } = useSelector(userDataSelector) || {};\n\n const coursePageQueryVariables = {\n id: +contentId,\n lang: toLang(langCode),\n };\n\n return (\n \n \n {data => (\n \n \n \n \n \n \n )}\n \n \n );\n};\n","const TABLE_WITH_ATTRIBUTES = '';\nconst OPEN_TABLE_TAG = '';\nconst CLOSE_TABLE_TAG = '
';\nconst TABLE_WRAPPER_DIV = '';\nconst DIV_CLOSING = '
';\n\nexport const wrapTablesWithDiv = htmlString => {\n const text = removeAttributesFromTables(htmlString);\n const textReplacedOpenings = text.replace(\n new RegExp(TABLE_WITH_ATTRIBUTES, 'g'),\n `${TABLE_WRAPPER_DIV}${OPEN_TABLE_TAG}`,\n );\n const textReplacedClosings = textReplacedOpenings.replace(\n new RegExp(CLOSE_TABLE_TAG, 'g'),\n `${CLOSE_TABLE_TAG}${DIV_CLOSING}`,\n );\n return textReplacedClosings;\n};\n\nconst removeAttributesFromTables = htmlString =>\n htmlString.replace(new RegExp(TABLE_WITH_ATTRIBUTES, 'g'), OPEN_TABLE_TAG);\n","import { Component } from 'react';\n\nexport class WithRenderDelay extends Component {\n state = {};\n\n componentDidMount() {\n const delayTime = this.props.delayTime || 100;\n const timeoutHandle = setTimeout(() => this.props.actionToBeDelayed(), delayTime);\n this.setState((prevState, props) => ({ timeoutHandle }));\n }\n\n componentWillUnmount() {\n clearTimeout(this.state.timeoutHandle);\n }\n\n render() {\n // eslint-disable-next-line no-unused-vars\n const { render, actionToBeDelayed, delayTime, ...restProps } = this.props;\n return render(restProps);\n }\n}\n","import { useRef } from 'react';\nimport styled from 'styled-components';\nimport classnames from 'classnames';\nimport { DwPicture } from '../../DwPicture/DwPicture';\nimport { RichText } from '../../RichText/RichText';\n\nconst KnowledgeModalContainer = ({\n className,\n fadeIn,\n knowledgeType,\n imageId,\n imageName,\n audioFile,\n title,\n shortTitle,\n name,\n text,\n subTitle,\n onClose,\n isRtl,\n}) => {\n const audioRef = useRef();\n const closeModalRef = useRef();\n const closeBackdropRef = useRef();\n const faded = fadeIn ? 'in' : '';\n const initialSound = knowledgeType === 'INITIAL_SOUND';\n\n const playAudio = e => {\n e.preventDefault();\n audioRef.current.play();\n };\n\n const closeModal = () => {\n closeModalRef.current.classList.remove('in');\n closeBackdropRef.current.classList.remove('in');\n if (onClose) {\n onClose();\n }\n };\n\n const closeButton = (\n \n ⨯ \n \n );\n\n const audioLink = linkTitle => (\n playAudio(e)}\n role=\"button\"\n tabIndex={0}\n >\n \n {linkTitle}\n \n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n \n \n \n );\n\n return (\n <>\n \n
\n
\n {initialSound && (\n
\n {closeButton}\n
\n {shortTitle}\n \n \n )}\n\n {!initialSound && (\n
\n {closeButton}\n {audioLink(title)}\n {subTitle && (\n
\n {subTitle}\n \n )}\n \n )}\n\n {initialSound && (\n
\n \n {audioLink(name)}\n \n
\n )}\n {!initialSound && (\n
\n {imageId && }\n \n
\n )}\n
\n
\n
\n
\n >\n );\n};\n\nexport const KnowledgeModal = styled(KnowledgeModalContainer)`\n display: block;\n &.modal {\n pointer-events: none;\n }\n .modal-dialog-glossar {\n pointer-events: all;\n }\n &.modal-backdrop {\n cursor: default;\n }\n div.modal-body {\n div.richText {\n margin: 0;\n p {\n margin: 0 0 10px;\n }\n }\n }\n .audio-example {\n background-image: inherit;\n padding-left: 0px;\n padding-right: 0px;\n margin-right: 0px;\n }\n`;\n","import { useEffect, useRef } from 'react';\nimport ReactDOM from 'react-dom';\nimport { useToggle } from '../../../hooks/useToggle';\nimport { KnowledgeModal } from './KnowledgeModal';\n\nexport const Knowledge = ({ children, knowledge, isRtl }) => {\n const [isOpen, { toggleOnClick, toggleOnKeyPress }] = useToggle();\n const wrapper = useRef(null);\n const vocals = 'A, a;Ä, ä;E, e;I, i;O, o;Ö, ö;U, u;Ü, ü;Eu, eu;Au, au;ie;Ei, ei'.split(';');\n const classMap = {\n consonants: 'anlaut-modal consonants',\n vocals: 'anlaut-modal vocals',\n glossary: 'glossar-modal custom-modal',\n };\n const getClassName = () => {\n if (knowledge.knowledgeType === 'VOCABULARY') {\n return classMap.glossary;\n }\n if (vocals.includes(knowledge.shortTitle)) {\n return classMap.vocals;\n }\n return classMap.consonants;\n };\n\n const KnowledgeModalContainer = () => {\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}\n handleClick(e)}\n onKeyPress={e => handleKeyPress(e)}\n >\n {children}\n {' '}\n {isOpen && (\n {\n toggleOnClick();\n }}\n isRtl={isRtl}\n />\n )}\n >\n );\n };\n\n useEffect(() => {\n ReactDOM.render( , wrapper.current);\n }, [isOpen]);\n\n const handleClick = e => {\n e.preventDefault();\n toggleOnClick();\n };\n\n const handleKeyPress = e => {\n e.preventDefault();\n toggleOnKeyPress(e);\n };\n\n return ;\n};\n","import { Knowledge } from '../../components/Modal/KnowledgeModal/Knowledge';\nimport { replaceWithComponent } from './replaceCommons';\n\nexport const placeholderToKnowledgeComponent = (matchedElement, { knowledges, isRtl }) => {\n return (\n element.id === parseInt(matchedElement.dataset.id, 10))}\n isRtl={isRtl}\n >\n {matchedElement.textContent}\n \n );\n};\n\nexport const replacePlaceholderMarkupWithKnowledges = param => {\n replaceWithComponent({\n selector: '.placeholder.editable',\n node: document,\n componentFn: placeholderToKnowledgeComponent,\n param,\n });\n};\n","import gql from 'graphql-tag';\nimport { useParams } from 'react-router';\nimport { wrapTablesWithDiv } from '../../../utils/replacers/htmlReplacer';\nimport { replacePlaceholderImagesWithResponsivePictures } from '../../../utils/replacers/imageReplacer';\nimport { WithRenderDelay } from '../../WithRenderDelay/WithRenderDelay';\nimport { RichText } from '../../RichText/RichText';\nimport { toLang } from '../../../utils/mappers/langMapper';\nimport { WithGraphQLQueryHandling } from '../../WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { replacePlaceholderMarkupWithKnowledges } from '../../../utils/replacers/knowledgeReplacer';\nimport { ContentHeadline } from '../../ContentContainer/ContentHeadline/ContentHeadline';\nimport { useRtlContext } from '../../../hooks/useRtl';\nimport { PageMetaData } from '../../Page/PageMetaData';\nimport { gtmDataLayerFragment } from '../../GoogleTagManager';\nimport { GtmScriptWithDataLayer } from '../../GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const knowledgesFragment = {\n name: 'Knowledges',\n fragment({ type }) {\n return gql`fragment ${type}${this.name} on ${type} {\n knowledges {\n id\n text\n knowledgeType\n shortTitle\n subTitle\n name\n mainContentImage {\n id\n name\n }\n audios {\n mp3Src\n }\n }\n }\n `;\n },\n};\nexport const lessonKnowledgeQuery = gql`\n query LessonKnowledge($knowledgeId: Int!, $lessonLang: Language!) {\n content(id: $knowledgeId, lang: $lessonLang) {\n ... on Knowledge {\n name\n text\n }\n ...KnowledgeKnowledges\n ${gtmDataLayerFragment.partial()}\n }\n }\n ${knowledgesFragment.fragment({ type: 'Knowledge' })}\n`;\n\nexport const LessonKnowledge = ({ pageType, lessonName, lessonKeywordStrings }) => {\n const { langCode, contentId } = useParams();\n const { isRtl } = useRtlContext();\n const lessonKnowledgeQueryVariables = {\n knowledgeId: +contentId,\n lessonLang: toLang(langCode),\n };\n\n return (\n \n {data => {\n const { content } = data;\n const { name, text, knowledges } = content;\n const knowledgeContent = wrapTablesWithDiv(text);\n\n return (\n <>\n \n \n \n {name} \n \n \n
\n {\n replacePlaceholderImagesWithResponsivePictures();\n replacePlaceholderMarkupWithKnowledges({ knowledges, isRtl });\n }}\n delayTime={10}\n render={() => }\n />\n
\n
\n \n >\n );\n }}\n \n );\n};\n","import { useTimeout } from '../../../hooks/useTimeout';\nimport { replacePlaceholderMarkupWithKnowledges } from '../../../utils/replacers/knowledgeReplacer';\nimport { useRtlContext } from '../../../hooks/useRtl';\n\nexport const useKnowledgePlaceholderReplacementEffect = ({\n trigger,\n knowledges,\n ignore = false,\n}) => {\n const { isRtl } = useRtlContext();\n useTimeout(\n {\n callback: () => {\n if (!ignore) {\n replacePlaceholderMarkupWithKnowledges({ knowledges, isRtl });\n }\n },\n delay: 10,\n },\n [trigger],\n );\n};\n","import { wrapTablesWithDiv } from '../../utils/replacers/htmlReplacer';\nimport { useKnowledgePlaceholderReplacementEffect } from '../Modal/KnowledgeModal/useKnowledgePlaceholderReplacementEffect';\nimport { WithRenderDelay } from '../WithRenderDelay/WithRenderDelay';\nimport { replacePlaceholderImagesWithResponsivePictures } from '../../utils/replacers/imageReplacer';\nimport { RichText } from '../RichText/RichText';\nimport { ContentHeadline } from '../ContentContainer/ContentHeadline/ContentHeadline';\n\nexport const GrammarItem = ({ data }) => {\n const { name, text, knowledges } = data.content;\n const markup = wrapTablesWithDiv(text);\n\n useKnowledgePlaceholderReplacementEffect({ knowledges });\n\n return (\n \n );\n};\n","import gql from 'graphql-tag';\nimport { toLang } from '../utils/mappers/langMapper';\nimport { PageContainer } from '../components/Page/PageContainer';\nimport { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { knowledgesFragment } from '../components/Lesson/LessonKnowledge/LessonKnowledge';\nimport { GrammarItem } from '../components/GrammarItem/GrammarItem';\nimport { PageMetaData } from '../components/Page/PageMetaData';\nimport { PAGE_TYPES } from '../constants/pageTypes';\nimport {\n gtmDataLayerFragment,\n GtmScriptWithDataLayer,\n} from '../components/GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const grammarPageQuery = gql`\n query GrammarPage($id: Int!, $lang: Language!) {\n content(id: $id, lang: $lang) {\n ... on Knowledge {\n name\n text\n }\n ...KnowledgeKnowledges\n ${gtmDataLayerFragment.partial()}\n }\n }\n ${knowledgesFragment.fragment({ type: 'Knowledge' })}\n`;\n\nexport const GrammarPage = ({ contentId, langCode }) => {\n const grammarPageQueryVariables = {\n id: +contentId,\n lang: toLang(langCode),\n };\n\n return (\n \n \n {data => (\n <>\n \n \n \n >\n )}\n \n \n );\n};\n","export default \"data:image/jpeg;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2NvdXJzZV9sYW5kaW5nLTEyMDB4Njc1LmY2OGRjNWI1LmpwZyI7\"","export default \"data:image/jpeg;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2NvdXJzZV9sYW5kaW5nLTk5Mng1NTguNDMwOWU4NjEuanBnIjs=\"","export default \"data:image/jpeg;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2NvdXJzZV9sYW5kaW5nLTc2OHg0MzIuZDU0YmMwOTkuanBnIjs=\"","export default \"data:image/jpeg;base64,ZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyAic3RhdGljL21lZGlhL2NvdXJzZV9sYW5kaW5nLTQ4MHgyNzAuNWE4Mjg2OWUuanBnIjs=\"","import styled from 'styled-components';\nimport { colors, resolutions } from '../../utils/css';\nimport { StyledHeroTemplate } from '../HeroTemplate/HeroTemplate';\nimport landingImgFull from '../../assets/images/landing/course_landing-1200x675.jpg';\nimport landingImgTabletLandscape from '../../assets/images/landing/course_landing-992x558.jpg';\nimport landingImgTablet from '../../assets/images/landing/course_landing-768x432.jpg';\nimport landingImgMobile from '../../assets/images/landing/course_landing-480x270.jpg';\n\nexport const StyledMainHeroImage = styled(StyledHeroTemplate)`\n height: 400px;\n background-size: 100%;\n text-align: center;\n justify-content: center;\n background: url(${landingImgFull}) center/cover no-repeat;\n\n .content {\n position: static;\n display: flex;\n flex-flow: column;\n\n .title {\n color: ${colors.LG_ORANGE_DARK};\n font-family: DWTheAntiquaB, Georgia, serif;\n font-size: 54px;\n font-weight: 400;\n height: 60px;\n line-height: 50px;\n margin: 0 0 30px 0;\n opacity: 1;\n width: 100%;\n }\n\n .description {\n font: 400 23px/27.6px DWTheAntiquaB, Georgia, serif;\n margin: 0 0 10px;\n font-size: 23px;\n color: ${colors.LG_ORANGE_DARK};\n width: 100%;\n }\n }\n\n @media (max-width: ${resolutions.max.mobile}px) {\n .content {\n .title {\n font-size: 28px;\n margin-bottom: -20px;\n }\n\n .description {\n font-size: 16px;\n }\n }\n }\n\n @media (min-width: ${resolutions.min.mobile}px) {\n background: url(${landingImgMobile}) center/cover no-repeat;\n }\n\n @media (min-width: ${resolutions.min.tablet}px) {\n background: url(${landingImgTablet}) center/cover no-repeat;\n .title {\n margin-bottom: 0;\n }\n }\n\n @media (min-width: ${resolutions.min.tabletLandscape}px) {\n background: url(${landingImgTabletLandscape}) center/cover no-repeat;\n }\n\n @media (min-width: ${resolutions.min.full}px) {\n background: url(${landingImgFull}) center/cover no-repeat;\n }\n`;\n","import styled from 'styled-components';\nimport gql from 'graphql-tag';\nimport { Link } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { colors, resolutions } from '../../../../utils/css';\nimport { I18nText } from '../../../I18n/I18nText';\nimport { learningLevelMapper } from '../../../../utils/learningLevelUtils';\nimport { getContentUrl } from '../../../../utils/url/urlFactory';\nimport { LearnProgressIcon } from '../../../LearnProgressIcon/LearnProgressIcon';\nimport { findCourseLearnProgressSelector } from '../../../../state/progress/learnProgressSelectors';\nimport { userSelector } from '../../../../state/user/userSelectors';\nimport { progressIconColors } from '../../../ProgressIcon/progressIconColors';\n\nexport const tileFragment = gql`\n fragment Tile on Course {\n id\n name\n language\n subTitle\n dkLearningLevel\n }\n`;\n\nexport const Tile = ({ className, data }) => {\n const { dkLearningLevel, name, subTitle, id } = data;\n const { courseProgress } = useSelector(findCourseLearnProgressSelector(id));\n const { isLoggedIn } = useSelector(userSelector);\n\n return (\n \n {isLoggedIn && (\n \n \n
\n )}\n {learningLevelMapper[dkLearningLevel]} \n \n \n \n );\n};\n\nconst LinkWrapper = ({ children, linkData, className }) => {\n return linkData.href ? (\n \n {children}\n \n ) : (\n \n {children}\n \n );\n};\n\nexport const StyledTile = styled(Tile)`\n --absElemOffset: 84px;\n padding: var(--absElemOffset) 20px 20px 20px;\n display: flex;\n flex-direction: column;\n width: 300px;\n height: 250px;\n box-sizing: border-box;\n position: relative;\n border-color: ${colors.LG_WHITE};\n border-style: solid;\n border-width: 1px 1px 0 0;\n background-color: ${({ backgroundColor }) => backgroundColor};\n color: ${colors.LG_WHITE};\n\n &:nth-child(4n) {\n border-right-width: 0;\n }\n\n &.tile-container {\n text-decoration: none;\n :hover,\n :active,\n :focus {\n color: ${colors.LG_TRANSPARENT_WHITE_50};\n }\n }\n\n .tile-learningLevel {\n font: 400 70px / var(--absElemOffset) Helvetica, Arial, sans-serif;\n height: var(--absElemOffset);\n text-align: start;\n margin: 0;\n padding: 0;\n position: absolute;\n top: 0;\n }\n\n .tile-name {\n font: 400 23px/25px DWTheAntiquaBBold, Georgia, serif;\n margin: 0 0 7px;\n width: 100%;\n }\n\n .tile-subTitle {\n font: 400 16px/25px DWTheAntiquaB, Georgia, serif;\n max-height: 60%;\n opacity: 0.9;\n max-width: 95%;\n }\n\n .tile-progress {\n position: absolute;\n top: 0;\n padding-top: 20px;\n width: calc(100% - 40px);\n height: var(--absElemOffset);\n display: flex;\n justify-content: flex-end;\n }\n\n @media (max-width: ${resolutions.max.tablet}px) {\n --absElemOffset: 64px;\n height: 180px;\n width: 100%;\n border-width: 1px 1px 0 0;\n\n &:nth-child(2n) {\n border-right-width: 0;\n }\n\n .tile-learningLevel {\n font: 400 54px/64px Helvetica, Arial, sans-serif;\n height: var(--absElemOffset);\n }\n\n .tile-name {\n font-size: 22px;\n }\n\n .tile-subTitle {\n font-size: 15px;\n }\n\n .tile-progress {\n height: var(--absElemOffset);\n padding-top: 15px;\n }\n }\n\n @media (max-width: ${resolutions.max.mobile}px) {\n height: 90px;\n padding: 10px;\n border-width: 1px 0 0 0;\n justify-content: center;\n\n .tile-learningLevel {\n line-height: 90px;\n font-size: 36px;\n width: 58px;\n height: 90px;\n margin: 0 0 0 6px;\n }\n\n .tile-name {\n position: relative;\n font-size: 17px;\n line-height: 19px;\n font-weight: 400;\n margin: 0 25px 3px 64px;\n width: calc(100% - 89px);\n }\n\n .tile-subTitle {\n font-size: 14px;\n font-weight: 400;\n line-height: 19px;\n flex-direction: row;\n margin: 0 25px 0 64px;\n width: calc(100% - 89px);\n }\n\n .tile-progress {\n width: calc(100% - 20px);\n }\n }\n`;\n","import styled from 'styled-components';\nimport { colors, resolutions } from '../../../../utils/css';\nimport { useRtlContext } from '../../../../hooks/useRtl';\n\nconst BlankTile = ({ className }) => {\n const { isRtl } = useRtlContext();\n return
;\n};\n\nexport const StyledBlankTile = styled(BlankTile)`\n border-top: 1px solid ${colors.LG_WHITE};\n border-right: 1px solid ${colors.LG_WHITE};\n background: ${colors.DW_LIGHT_BLUE};\n text-decoration: none;\n\n @media (max-width: ${resolutions.max.tablet}px) {\n height: 180px;\n width: 100%;\n\n &.rtl {\n border-right-width: 0;\n }\n }\n\n @media (max-width: ${resolutions.max.mobile}px) {\n display: none;\n }\n`;\n","import styled from 'styled-components';\nimport { StyledTile as Tile } from './Tile';\n\nexport const MoreCoursesTile = ({ className, backgroundColor }) => (\n \n);\n\nexport const StyledMoreCoursesTile = styled(MoreCoursesTile)`\n .tile-progress {\n display: none;\n }\n`;\n","import { colors } from '../utils/css';\n\nexport const tileColors = [\n `${colors.LG_ORANGE}`,\n `${colors.LG_ORANGE_DARK}`,\n `${colors.LG_PINK}`,\n `${colors.LG_RED}`,\n `${colors.LG_GREEN_LIGHT}`,\n `${colors.LG_GREEN}`,\n `${colors.DW_LIGHT_BLUE}`,\n `${colors.LG_BLUE_5}`,\n];\n","export const scrollIntoViewCenter = htmlElement => {\n htmlElement.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'nearest',\n });\n};\n\n// Creates a string that can be used for dynamic id and key attributes\nexport const uniqueId = () => `id-${Math.random().toString(36).substr(2, 16)}`;\n","import { Fragment } from 'react';\nimport styled from 'styled-components';\nimport { colors, resolutions } from '../../../utils/css';\nimport { StyledTile as Tile } from './Tile/Tile';\nimport { StyledBlankTile as BlankTile } from './Tile/BlankTile';\nimport { StyledMoreCoursesTile as MoreCoursesTile } from './Tile/MoreCoursesTile';\nimport { tileColors } from '../../../constants/tileColors';\nimport { uniqueId } from '../../../utils/htmlUtils';\n\nexport const Tiles = ({ className, data }) => {\n return (\n \n {data.map((tileData, index) => {\n const tileElement = (\n \n );\n // check if the number of the fetched tiles is even and if it is,\n // then add a blank tile as penultimate\n return data.length % 2 === 0 && data.indexOf(tileData) === data.length - 1 ? (\n \n {tileElement}\n \n \n ) : (\n tileElement\n );\n })}\n \n \n );\n};\n\nexport const StyledTiles = styled(Tiles)`\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n width: 100%;\n min-height: 500px;\n border-bottom: 1px solid ${colors.LG_WHITE};\n\n @media (min-width: ${resolutions.min.desktop}px) {\n width: 1200px;\n }\n\n @media (max-width: ${resolutions.max.tablet}px) {\n grid-template-columns: repeat(2, 1fr);\n }\n\n @media (max-width: ${resolutions.max.mobile}px) {\n grid-template-columns: 1fr;\n width: 100%;\n }\n`;\n","import { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { StyledMainHeroImage } from '../MainHeroImage/MainHeroImage';\nimport { StyledTiles } from './Tiles/Tiles';\nimport { I18nText } from '../I18n/I18nText';\nimport { readCourseProgresses } from '../../state/progress/learnProgressDuck';\n\nexport const Dashboard = ({ data }) => {\n const dispatch = useDispatch();\n\n useEffect(() => {\n const courseIds = data.map(course => course.id);\n dispatch(readCourseProgresses(courseIds));\n }, [data, dispatch]);\n\n return (\n \n \n \n \n \n \n \n );\n};\n","import gql from 'graphql-tag';\nimport { useParams } from 'react-router';\nimport { Dashboard } from '../components/Dashboard/Dashboard';\nimport { tileFragment } from '../components/Dashboard/Tiles/Tile/Tile';\nimport { sortByLearningLevel } from '../utils/learningLevelUtils';\nimport { toLang } from '../utils/mappers/langMapper';\nimport { PageContainer } from '../components/Page/PageContainer';\nimport { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { PageMetaData } from '../components/Page/PageMetaData';\nimport { GTM_NO_CONTENT_PAGE_IDS, PAGE_TYPES } from '../constants/pageTypes';\nimport {\n gtmDataLayerFragment,\n GtmScriptWithDataLayer,\n} from '../components/GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const dashboardPageQuery = gql`\n query DashboardPage($type: ModelType!, $courseLang: Language!, $amount: Int!) {\n # Get courses in the selected language till A2 level\n contentsByLang: contentsByType(\n type: $type\n lang: $courseLang\n amount: $amount\n filters: { field: \"dkLearningLevel\", value: [\"0\", \"2\", \"4\"] }\n ) {\n ...Tile\n ... on Course {\n ${gtmDataLayerFragment.partial()}\n }\n }\n # Get B1 courses in German\n contentsInGerman: contentsByType(\n type: $type\n lang: GERMAN\n amount: $amount\n filters: { field: \"dkLearningLevel\", value: [\"8\", \"16\"] }\n ) {\n ...Tile\n }\n }\n ${tileFragment}\n`;\n\nexport const DashboardPage = () => {\n const { langCode } = useParams();\n\n const dashboardPageQueryVariables = {\n type: 'COURSE',\n courseLang: toLang(langCode),\n amount: 10,\n };\n\n return (\n \n \n {data => (\n <>\n \n \n \n >\n )}\n \n \n );\n};\n","import styled from 'styled-components';\nimport { I18nText } from '../I18n/I18nText';\nimport { colors, resolutions } from '../../utils/css';\n\nexport const GrammarOverviewHeader = ({ className }) => {\n return (\n \n );\n};\n\nexport const StyledGrammarOverviewHeader = styled(GrammarOverviewHeader)`\n display: block;\n width: 100%;\n background-color: ${colors.LG_GRAY_3};\n color: ${colors.LG_GRAY_9};\n\n .grammarOverviewHeader-wrapper {\n height: 320px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n h1 {\n padding: 125px 20px 0 20px;\n margin: 20px 0 10px;\n }\n\n p {\n padding: 0 20px 10px;\n margin: 0 0 10px;\n }\n }\n\n @media (min-width: ${resolutions.min.desktop}px) {\n margin-bottom: 20px;\n }\n\n @media (max-width: ${resolutions.max.mobile}px) {\n .grammarOverviewHeader-wrapper {\n height: 240px;\n\n h1 {\n padding: 78px 20px 0 20px;\n }\n }\n }\n`;\n","import { useRef } from 'react';\nimport styled from 'styled-components';\nimport { Link } from 'react-router-dom';\nimport { useToggle } from '../../../hooks/useToggle';\nimport { colors, resolutions } from '../../../utils/css';\nimport { StyledToggleableArrow as ToggleableArrow } from '../../ToggleableArrow/ToggleableArrow';\nimport { I18nText } from '../../I18n/I18nText';\nimport { getContentUrl } from '../../../utils/url/urlFactory';\n\nexport const AccordionItem = ({ title, contents, className }) => {\n const element = useRef(null);\n const [isOpen, { toggleOnClick }] = useToggle();\n const height = element.current ? element.current.scrollHeight : '0';\n return (\n \n
\n \n \n \n
\n {contents.map(content => (\n \n \n {content.shortTitle}\n \n
\n ))}\n \n
\n );\n};\n\nexport const StyledAccordionItem = styled(AccordionItem)`\n font-family: DWTheAntiquaB, Georgia, serif;\n font-weight: 400;\n font-size: 18px;\n line-height: 25px;\n text-align: left;\n\n display: flex;\n flex-direction: column;\n margin: 0px;\n\n .accordionItem-btn {\n display: flex;\n position: relative;\n width: 100%;\n padding: 20px;\n background-color: ${({ backgroundColor }) => backgroundColor};\n color: ${colors.LG_WHITE};\n cursor: pointer;\n align-items: center;\n border: none;\n :hover {\n background-color: ${colors.LG_GRAY_9};\n }\n :focus {\n color: ${colors.LG_BAHAMA_BLUE};\n text-decoration: underline;\n }\n }\n\n .toggleable-arrow {\n right: 18px;\n }\n`;\n\nexport const AccordionItemContent = styled.div`\n max-height: ${({ isOpen, height }) => (isOpen ? height : '1')}px;\n overflow: hidden;\n background-color: ${colors.LG_WHITE};\n transition: max-height 0.7s;\n\n .accordionItem-text {\n font-size: 18px;\n line-height: 25px;\n border-bottom-width: 1px;\n border-bottom-style: solid;\n border-bottom-color: ${colors.LG_GRAY_12};\n\n a {\n color: ${colors.LG_GRAY_9};\n text-decoration: none;\n padding: 20px;\n display: block;\n &:hover {\n color: ${colors.LG_WHITE};\n background-color: ${colors.LG_GRAY_9};\n }\n }\n\n @media (max-width: ${resolutions.max.mobile}px) {\n font-size: 15px;\n line-height: 20px;\n }\n }\n`;\n","import { colors } from '../utils/css';\n\nexport const grammarOverviewColors = [\n `${colors.LG_GREEN_YELLOW}`,\n `${colors.DW_LIGHT_BLUE}`,\n `${colors.LG_ORANGE}`,\n `${colors.LG_RED}`,\n `${colors.LG_GREEN_YELLOW}`,\n `${colors.LG_PINK}`,\n `${colors.LG_ORANGE_DARK}`,\n `${colors.LG_ORANGE}`,\n `${colors.LG_RED_DARK}`,\n `${colors.DW_LIGHT_BLUE}`,\n `${colors.LG_GREEN}`,\n `${colors.LG_ORANGE}`,\n];\n","import styled from 'styled-components';\nimport { StyledAccordionItem as AccordionItem } from './AccordionItem/AccordionItem';\nimport { grammarOverviewColors } from '../../constants/grammarOverviewColors';\n\nexport const Accordion = ({ className, data }) => {\n return (\n \n {data.map((accordionData, index) => (\n
\n ))}\n
\n );\n};\n\nexport const StyledAccordion = styled(Accordion)`\n display: block;\n`;\n","import { StyledGrammarOverviewHeader as GrammarOverviewHeader } from './GrammarOverviewHeader';\nimport { StyledAccordion as Accordion } from '../Accordion/Accordion';\n\nconst removeEmptyGrammars = data =>\n Object.values(data.grammarOverview).filter(\n item => Array.isArray(item.grammars) && item.grammars.length,\n );\n\nexport const GrammarOverview = data => (\n <>\n \n \n >\n);\n","import gql from 'graphql-tag';\nimport { useParams } from 'react-router';\nimport { toLang } from '../utils/mappers/langMapper';\nimport { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { PageContainer } from '../components/Page/PageContainer';\nimport { GrammarOverview } from '../components/GrammarOverview/GrammarOverview';\nimport { PageMetaData } from '../components/Page/PageMetaData';\nimport { GTM_NO_CONTENT_PAGE_IDS, PAGE_TYPES } from '../constants/pageTypes';\nimport { GtmScriptWithDataLayer } from '../components/GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const grammarOverviewPageFragment = gql`\n fragment GrammarOverviewItems on GrammarOverviewCategory {\n id\n headline\n grammars {\n id\n shortTitle\n language\n knowledgeType\n }\n }\n`;\n\nexport const grammarOverviewPageQuery = gql`\n query GrammarOverviewPage($lang: Language!) {\n grammarOverview(lang: $lang) {\n verbs {\n ...GrammarOverviewItems\n }\n tenses {\n ...GrammarOverviewItems\n }\n nounsAndArticles {\n ...GrammarOverviewItems\n }\n declination {\n ...GrammarOverviewItems\n }\n negation {\n ...GrammarOverviewItems\n }\n pronoun {\n ...GrammarOverviewItems\n }\n prepositions {\n ...GrammarOverviewItems\n }\n adjectivesAndAdverbs {\n ...GrammarOverviewItems\n }\n sentenceStructure {\n ...GrammarOverviewItems\n }\n numbers {\n ...GrammarOverviewItems\n }\n spellingOrthography {\n ...GrammarOverviewItems\n }\n others {\n ...GrammarOverviewItems\n }\n }\n }\n ${grammarOverviewPageFragment}\n`;\n\nexport const GrammarOverviewPage = () => {\n const { langCode } = useParams();\n\n const grammarPageQueryVariables = { lang: toLang(langCode) };\n\n return (\n \n \n {data => (\n <>\n \n \n \n >\n )}\n \n \n );\n};\n","import { toLangCode } from '../mappers/langMapper';\nimport { encodeUrlNamePart, normalizeUrlName } from './url';\nimport { FEEDBACK_TYPES } from '../../constants/feedback';\n\nexport const pathPartials = {\n // IMPORTANT: Avoid groups in regex, always check here: https://pshrmn.github.io/route-tester/\n langCodeRegex: '[a-z]{2}-?0?0?2?[briaf]{0,2}',\n titlePathRegex: '.*',\n contentIdRegex: '\\\\d+',\n contentTypeRegex: '[a-z_]{1,15}',\n knowledgeTypeRegex: 'lv|la',\n knowledgeWithContentIdTypeRegex: 'gr|rs',\n feedbackTypes: Object.values(FEEDBACK_TYPES).join('|'),\n};\n\nexport const alignTitleRedirect = ({ title, language }) => ({ params, url }) => {\n const { typeId, contentId, title: titleFromPath } = params;\n if (titleFromPath !== normalizeUrlName(title.replace(/\\//g, ''))) {\n return {\n redirect: true,\n path: `/${toLangCode(language)}/${encodeUrlNamePart(title)}/${typeId}-${contentId}`,\n };\n }\n\n return {\n redirect: false,\n path: url,\n };\n};\n\nexport const notFoundRedirect = statement => ({ params, url }) => {\n const { langCode } = params;\n if (statement) {\n const langFromUrl = langCode ? `/${langCode}` : '/en';\n return {\n redirect: true,\n path: `${langFromUrl}/404?from=${url}`,\n };\n }\n return {\n redirect: false,\n path: url,\n };\n};\n\nexport const checkRedirects = ({ fns = [], match }) =>\n fns.reduce(\n (initial, fn) => {\n if (!initial.redirect) {\n const result = fn()(match) || {};\n return result.redirect ? result : initial;\n }\n return initial;\n },\n {\n redirect: false,\n path: match.url,\n },\n );\n","import { Link } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { colors, resolutions } from '../../../../utils/css';\nimport { useTranslation } from '../../../../hooks/useTranslation';\n\nexport const LessonMenuItem = ({\n to,\n translationKey,\n id,\n ariaLabel,\n target,\n rel,\n onClick,\n onKeyPress,\n}) => {\n const label = useTranslation(translationKey);\n return (\n \n \n {label}\n \n \n );\n};\n\nexport const StyledLessonMenuItem = styled('li')`\n padding: 0;\n text-align: center;\n width: 100%;\n\n @media (min-width: ${resolutions.min.tablet}px) {\n border-bottom: 1px solid ${colors.LG_WHITE};\n }\n\n .lesson-menu-link {\n color: ${colors.LG_WHITE};\n font-family: Helvetica, Arial, sans-serif;\n font-size: 17px;\n font-weight: 700;\n display: inline-block;\n padding: 20px;\n text-decoration: none;\n width: 100%;\n\n // mouse, touch pad\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n background-color: ${colors.LG_ORANGE1};\n }\n }\n // smartphones, touchscreens\n @media (hover: none) and (pointer: coarse) {\n &:hover {\n background-color: ${colors.LG_ORANGE1};\n }\n }\n &:active {\n background-color: ${colors.LG_ORANGE1};\n }\n &:focus {\n background-color: ${colors.LG_BLACK};\n }\n\n @media (min-width: ${resolutions.min.tablet}px) {\n font-size: 21px;\n }\n }\n`;\n","import styled from 'styled-components';\nimport { colors, resolutions } from '../../../../utils/css';\n\nexport const LessonTitle = ({ lessonName }) => (\n \n {lessonName} \n \n);\n\nexport const StyledLessonTitle = styled('div')`\n align-items: center;\n display: flex;\n justify-content: center;\n min-height: 60px;\n\n .title {\n color: ${colors.LG_WHITE};\n font-size: 18px;\n line-height: 1.3;\n margin: 15px 0;\n padding: 0 50px;\n text-align: center;\n }\n\n @media (min-width: ${resolutions.min.tablet}px) {\n min-height: 85px;\n\n .title {\n font-size: 25px;\n padding: 0 65px;\n }\n }\n\n @media (min-width: ${resolutions.min.desktop}px) {\n .title {\n font-size: 34px;\n }\n }\n`;\n","import styled from 'styled-components';\nimport { colors, resolutions } from '../../../../utils/css';\nimport navCrossBlackLg from '../../../../assets/svg/nav-cross-black-lg.svg';\nimport navCrossLg from '../../../../assets/svg/nav-cross-lg.svg';\nimport { StyledIconBar as IconBar } from '../../../IconBar/IconBar';\nimport { I18nText } from '../../../I18n/I18nText';\n\nexport const LessonBurgerButton = ({ isMenuCollapsed, setIsMenuCollapsed }) => (\n \n setIsMenuCollapsed(!isMenuCollapsed)}\n type=\"button\"\n className={isMenuCollapsed ? 'icon-toggle collapsed' : 'icon-toggle collapse'}\n data-toggle={isMenuCollapsed ? 'collapsed' : 'collapse'}\n data-target=\"#lecture-nav-user-menu\"\n aria-expanded={isMenuCollapsed}\n aria-controls=\"navbar\"\n >\n \n \n \n \n \n \n \n {!isMenuCollapsed && }\n\n {isMenuCollapsed && (\n <>\n \n \n >\n )}\n
\n \n \n);\n\nconst buttonStyle = `\n background-color: transparent;\n background-image: none;\n border: 0;\n border-radius: 0;\n margin: 0;\n padding: 0;\n`;\n\nconst defaultHoverStyles = `\n &:hover ${IconBar} {\n background-color: ${colors.LG_BLACK};\n }\n &:hover .close-menu {\n background: url(${navCrossBlackLg});\n background-size: cover;\n } \n`;\n// mouse, touch pad, smartphones, touchscreens\nconst mediaHoverDeviceDetection = `\n @media (hover: hover) and (pointer: fine) {\n ${defaultHoverStyles}\n }\n @media (hover: none) and (pointer: coarse) {\n ${defaultHoverStyles}\n }\n`;\n\nexport const StyledLessonBurgerButton = styled('div')`\n position: absolute;\n /*! @noflip */\n right: 20px;\n top: calc(50% - 10px);\n\n @media (min-width: ${resolutions.min.desktop}px) {\n /*! @noflip */\n right: 30px;\n }\n\n .title {\n display: none;\n }\n\n ${IconBar} {\n background-color: ${colors.LG_WHITE};\n padding: 0;\n }\n\n .close-menu {\n background: url(${navCrossLg});\n background-size: cover;\n display: block;\n height: 15px;\n margin-top: 6px;\n /*! @noflip */\n right: 15px;\n width: 15px;\n\n @media (min-width: ${resolutions.min.tablet}px) {\n height: 21px;\n margin-top: 2px;\n width: 22px;\n }\n }\n\n .collapse {\n display: block;\n ${buttonStyle}\n }\n\n .collapsed {\n ${buttonStyle}\n }\n\n .burger-menu-toggle-container {\n margin: 0;\n position: relative;\n }\n\n .icon-toggle {\n ${mediaHoverDeviceDetection}\n\n &:active ${IconBar}, \n &:focus ${IconBar} {\n background-color: ${colors.LG_BLACK};\n }\n\n &:focus .close-menu,\n &:active .close-menu {\n background: url(${navCrossBlackLg});\n background-size: cover;\n }\n }\n`;\n","export const LESSON_PARTS = Object.freeze({\n EXERCISE: 'EXERCISE',\n GRAMMAR: 'GRAMMAR',\n VOCABULARY_GLOSSARY: 'VOCABULARY_GLOSSARY',\n REGIONAL_STUDIES: 'REGIONAL_STUDIES',\n PHONEMIC_CHART: 'PHONEMIC_CHART',\n MANUSCRIPT: 'MANUSCRIPT',\n DOWNLOAD: 'DOWNLOAD',\n});\n","import { LESSON_PARTS } from '../constants/lessonParts';\nimport { isFinalTestPredicate } from './commons';\nimport {\n getAlphabeticalOrderUrl,\n getFirstGrammarUrl,\n getFirstRegionalStudiesUrl,\n getVocabularyUrl,\n} from './url/urlFactory';\n\nexport const hasLessonPart = (lessonOverviewParts, lessonPart) => {\n return lessonOverviewParts.some(part => part.lessonPart === lessonPart);\n};\n\nexport const getFirstIdOfLessonPart = (lessonOverviewParts, lessonPart) => {\n const targetOverviewPart = lessonOverviewParts.find(part => part.lessonPart === lessonPart);\n return targetOverviewPart ? targetOverviewPart.targetId : null;\n};\n\nexport const filterLessonKnowledgeOverviewItems = lessonOverviewParts =>\n lessonOverviewParts.filter(part =>\n [\n LESSON_PARTS.GRAMMAR,\n LESSON_PARTS.VOCABULARY_GLOSSARY,\n LESSON_PARTS.REGIONAL_STUDIES,\n ].includes(part.lessonPart),\n );\n\nexport const filterLessonExerciseOverviewItems = lessonOverviewParts =>\n lessonOverviewParts.filter(part => part.lessonPart === LESSON_PARTS.EXERCISE);\n\nexport const isFinalTestLesson = ({ lessonContentLinksFromCourse, currentLessonId }) => {\n const finalTestLessonContentLink = lessonContentLinksFromCourse.find(\n contentLink => contentLink.targetId === +currentLessonId && isFinalTestPredicate(contentLink),\n );\n return Boolean(finalTestLessonContentLink);\n};\n\nexport const filteredAssembledInfos = ({ lessonOverviewParts, lessonPath }) => {\n return assembleOverviewInfos({ lessonOverviewParts, lessonPath }).filter(info => info.hasInfo);\n};\n\nexport const assembleOverviewInfos = ({ lessonOverviewParts, lessonPath }) => {\n const firstGrammarId = getFirstIdOfLessonPart(lessonOverviewParts, LESSON_PARTS.GRAMMAR);\n const firstRegionalStudiesId = getFirstIdOfLessonPart(\n lessonOverviewParts,\n LESSON_PARTS.REGIONAL_STUDIES,\n );\n\n return [\n {\n name: 'grammar',\n hasInfo: hasLessonPart(lessonOverviewParts, LESSON_PARTS.GRAMMAR),\n url: getFirstGrammarUrl(lessonPath, firstGrammarId),\n },\n {\n name: 'alphabeticalOrder',\n hasInfo: hasLessonPart(lessonOverviewParts, LESSON_PARTS.PHONEMIC_CHART),\n url: getAlphabeticalOrderUrl(lessonPath),\n },\n {\n name: 'vocabulary',\n hasInfo: hasLessonPart(lessonOverviewParts, LESSON_PARTS.VOCABULARY_GLOSSARY),\n url: getVocabularyUrl(lessonPath),\n },\n {\n name: 'regionalStudies',\n hasInfo: hasLessonPart(lessonOverviewParts, LESSON_PARTS.REGIONAL_STUDIES),\n url: getFirstRegionalStudiesUrl(lessonPath, firstRegionalStudiesId),\n },\n ];\n};\n","import styled from 'styled-components';\nimport { useState } from 'react';\nimport { useParams } from 'react-router';\nimport { useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { colors, resolutions, clearfix } from '../../../utils/css';\nimport { LessonMenuItem } from './LessonMenuItem/LessonMenuItem';\nimport { LessonTitle } from './LessonTitleAndBurgerButton/LessonTitle';\nimport { LessonBurgerButton } from './LessonTitleAndBurgerButton/LessonBurgerButton';\nimport { LESSON_PARTS } from '../../../constants/lessonParts';\nimport {\n getAlphabeticalOrderUrl,\n getCourseUrl,\n getExtrasUrl,\n getFirstGrammarUrl,\n getFirstRegionalStudiesUrl,\n getLessonUrl,\n getManuscriptUrl,\n getPlacementDashboardUrl,\n getVocabularyUrl,\n} from '../../../utils/url/urlFactory';\nimport { normalizeUrlName } from '../../../utils/url/url';\nimport { hasLessonPart } from '../../../utils/lessonUtils';\nimport { ModalIntegration } from '../../Modal/ModalIntegration';\nimport { ResetModal } from '../../Modal/ResetModal';\nimport { deleteLessonProgress } from '../../../state/progress/learnProgressDuck';\nimport { useTranslation } from '../../../hooks/useTranslation';\n\nexport const LessonMenu = ({\n lessonId,\n lessonName,\n lessonOverviewParts,\n courseId,\n courseName,\n isFromPlacementCourse,\n isFinalTest,\n firstExercisePath,\n}) => {\n const { langCode } = useParams();\n const [isMenuCollapsed, setIsMenuCollapsed] = useState(true);\n const [isResetModalOpen, setResetModalOpen] = useState(false);\n\n const dispatch = useDispatch();\n const history = useHistory();\n\n const grammarAria = useTranslation('lesson.menu.grammar_aria');\n const vocabularyAria = useTranslation('lesson.menu.vocabulary_aria');\n\n const onConfirmResetLessonProgress = () => {\n dispatch(deleteLessonProgress(+lessonId));\n setResetModalOpen(false);\n history.push(getLessonUrl(lessonId, langCode, normalizeUrlName(lessonName)));\n };\n\n const onCancelResetLessonProgress = () => {\n setResetModalOpen(false);\n };\n\n const getFirstOfTypeId = lessonPart =>\n hasLessonPart(lessonOverviewParts, lessonPart) &&\n lessonOverviewParts.find(part => part.lessonPart === lessonPart).targetId;\n\n const firstGrammarId = getFirstOfTypeId(LESSON_PARTS.GRAMMAR);\n const firstRegionalStudiesId = getFirstOfTypeId(LESSON_PARTS.REGIONAL_STUDIES);\n\n const lessonPath = getLessonUrl(lessonId, langCode, normalizeUrlName(lessonName));\n\n const hasExercisesReset =\n hasLessonPart(lessonOverviewParts, LESSON_PARTS.EXERCISE) &&\n !isFromPlacementCourse &&\n !isFinalTest;\n\n return (\n \n \n \n );\n};\n\nexport const StyledLessonMenu = styled('nav')`\n display: grid;\n\n @media (min-width: ${resolutions.min.desktop}px) {\n margin-bottom: 20px;\n }\n\n .lesson-nav-layout-wrapper {\n background-color: ${colors.LG_ORANGE};\n position: relative;\n top: 0;\n width: 100%;\n z-index: 3;\n }\n\n .lesson-title-button-container-wrapper {\n display: grid;\n }\n\n .lesson-nav-menu-container-wrapper {\n position: absolute;\n width: 100%;\n }\n\n .lesson-nav-menu-wrapper {\n border-top: 1px solid ${colors.LG_WHITE};\n box-shadow: 1px 10px 20px 0 ${colors.LG_TRANSPARENT_BLACK_25};\n margin: 0;\n padding: 0;\n width: 100%;\n\n @media (min-width: ${resolutions.min.desktop}px) {\n box-shadow: none;\n }\n }\n\n .lesson-nav-menu {\n background-color: ${colors.LG_ORANGE};\n list-style-type: none;\n margin: 0;\n padding: 0;\n width: 100%;\n\n ${clearfix}\n\n @media (min-width: ${resolutions.min.desktop}px) {\n /* @noflip */\n float: right;\n width: 400px;\n }\n }\n`;\n","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgIconHintCircleOrange(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"18px\",\n height: \"18px\",\n viewBox: \"0 0 18 18\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n xmlSpace: \"preserve\",\n style: {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n strokeLinejoin: \"round\",\n strokeMiterlimit: 1.41421\n },\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M9,0C13.967,0 18,4.033 18,9C18,13.967 13.967,18 9,18C4.033,18 0,13.967 0,9C0,4.033 4.033,0 9,0ZM12.189,14.994L12.189,14.343L10.027,13.623L10.027,6.966C8.269,6.966 7.525,7.069 6.206,7.289L6.206,7.903C7.113,8.041 7.538,8.144 7.977,8.337L7.977,13.657C7.181,13.849 6.502,14.013 5.87,14.343L5.87,14.994L12.189,14.994ZM8.984,5.417C8.544,5.417 8.31,5.322 8.007,5.02C7.705,4.718 7.61,4.484 7.61,4.044C7.61,3.605 7.705,3.37 8.007,3.068C8.31,2.765 8.544,2.67 8.984,2.67C9.424,2.67 9.657,2.765 9.96,3.068C10.262,3.37 10.357,3.605 10.357,4.044C10.357,4.484 10.262,4.718 9.96,5.02C9.657,5.322 9.424,5.417 8.984,5.417Z\",\n style: {\n fill: \"#f08c00\"\n }\n }));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgIconHintCircleOrange);\nexport default __webpack_public_path__ + \"static/media/icon-hint-circle-orange.764164ab.svg\";\nexport { ForwardRef as ReactComponent };","import { Link } from 'react-router-dom';\nimport gql from 'graphql-tag';\nimport { useDispatch } from 'react-redux';\nimport { I18nText } from '../../I18n/I18nText';\nimport { ReactComponent as IconHintCircleOrange } from '../../../assets/svg/icon-hint-circle-orange.svg';\nimport { Text } from '../../Text/Text';\nimport { useKnowledgePlaceholderReplacementEffect } from '../../Modal/KnowledgeModal/useKnowledgePlaceholderReplacementEffect';\nimport { deleteLessonProgress } from '../../../state/progress/learnProgressDuck';\n\nexport const lessonContentDescriptionFragment = gql`\n fragment LessonContentDescription on Lesson {\n id\n description\n learningTargetHeadline\n learningTargetDescription\n }\n`;\n\nexport const LessonContentDescription = ({\n content,\n firstExercisePath,\n isFinalTest,\n isHintHidden,\n}) => {\n const {\n id: lessonid,\n description,\n learningTargetHeadline,\n learningTargetDescription,\n knowledges,\n } = content;\n\n useKnowledgePlaceholderReplacementEffect({ knowledges });\n const dispatch = useDispatch();\n\n const deleteProgressIfFinalTest = () => {\n if (isFinalTest) {\n dispatch(deleteLessonProgress(lessonid));\n }\n };\n\n return (\n \n
\n
\n
\n \n \n \n
\n
\n
{learningTargetHeadline} \n
\n
\n
\n
\n
\n
\n
\n
\n
\n );\n};\n","export const subtitlesLabels = Object.freeze({\n GERMAN: 'Deutsch/Deutsch',\n ENGLISH: 'English',\n RUSSIAN: 'Русский',\n CHINESE: '中文',\n PORTUGUESE_BRAZIL: 'Português',\n ALBANIAN: 'Shqip',\n AMHARIC: 'አማርኛ',\n ARABIC: 'عربي',\n BENGALI: 'বাংলা',\n BOSNIAN: 'Bosanski',\n BULGARIAN: 'Български',\n DARI: 'دری',\n FRENCH: 'Français',\n GREEK: 'Ελληνικά',\n HAUSA: 'Hausa',\n HINDI: 'हिन्दी',\n INDONESIAN: 'Bahasa Indonesia',\n KISWAHILI: 'Kiswahili',\n CROATIAN: 'Hrvatski',\n MACEDONIAN: 'Македонски',\n PASHTO: 'پښتو',\n PERSIAN: 'فارسی',\n POLISH: 'Polski',\n ROMANIAN: 'Română',\n SERBIAN: 'Srpski',\n SPANISH: 'Español',\n TURKISH: 'Türkçe',\n UKRANIAN: 'Українська мова',\n URDU: 'اردو',\n});\n","const scriptRel = 'modulepreload';const seen = {};const base = '/';export const __vitePreload = function preload(baseModule, deps) {\n // @ts-ignore\n if (!__VITE_IS_MODERN__ || !deps || deps.length === 0) {\n return baseModule();\n }\n return Promise.all(deps.map((dep) => {\n // @ts-ignore\n dep = `${base}${dep}`;\n // @ts-ignore\n if (dep in seen)\n return;\n // @ts-ignore\n seen[dep] = true;\n const isCss = dep.endsWith('.css');\n const cssSelector = isCss ? '[rel=\"stylesheet\"]' : '';\n // @ts-ignore check if the file is already preloaded by SSR markup\n if (document.querySelector(`link[href=\"${dep}\"]${cssSelector}`)) {\n return;\n }\n // @ts-ignore\n const link = document.createElement('link');\n // @ts-ignore\n link.rel = isCss ? 'stylesheet' : scriptRel;\n if (!isCss) {\n link.as = 'script';\n link.crossOrigin = '';\n }\n link.href = dep;\n // @ts-ignore\n document.head.appendChild(link);\n if (isCss) {\n return new Promise((res, rej) => {\n link.addEventListener('load', res);\n link.addEventListener('error', rej);\n });\n }\n })).then(() => baseModule());\n}","const hasVideoPlaceholdersInRichText = ({ text = '' }) =>\n /]*video-js vjs-fluid[^>]*>/g.test(text);\nconst hasAudioPlaceholdersInRichText = ({ text = '' }) =>\n /]*video-js vjs-fluid[^>]*>/g.test(text);\n\nconst hasVideoPlayer = ({ __typename, text = '' }) =>\n __typename === 'Video' || hasVideoPlaceholdersInRichText({ text });\nconst hasAudioPlayer = ({ __typename, text = '' }) =>\n __typename === 'Audio' || hasAudioPlaceholdersInRichText({ text });\n\nexport const hasVideosOnly = content => hasVideoPlayer(content) && !hasAudioPlayer(content);\nexport const hasAudiosOnly = content => hasAudioPlayer(content) && !hasVideoPlayer(content);\n\nexport const hasPlayer = content => hasVideoPlayer(content) || hasAudioPlayer(content);\n","export const importVideoPlugins = async () =>\n Promise.all([\n import(/* webpackChunkName: 'playerPlugins-video' */ 'videojs-contrib-quality-levels'),\n import(/* webpackChunkName: 'playerPlugins-video' */ 'videojs-hls-quality-selector'),\n import(\n /* webpackChunkName: 'playerPlugins-video' */ 'videojs-hls-quality-selector/dist/videojs-hls-quality-selector.css'\n ),\n ]);\n","export const importAudioPlugins = async () =>\n Promise.all([\n import(/* webpackChunkName: 'playerPlugins-audio' */ 'videojs-seek-buttons'),\n import(\n /* webpackChunkName: 'playerPlugins-audio' */ 'videojs-seek-buttons/dist/videojs-seek-buttons.css'\n ),\n ]);\n","export const importVideoJs = async () => {\n const [videojsModule] = await Promise.all([\n import('video.js'),\n import('video.js/dist/video-js.min.css'),\n ]);\n return { videojs: videojsModule.default };\n};\n","import globals from '../utils/globals';\nimport { hasVideosOnly, hasAudiosOnly } from './videoTypeMatcher';\nimport { importVideoPlugins } from './videoPlugins';\nimport { importAudioPlugins } from './audioPlugins';\nimport { importVideoJs } from './videojs';\n\nconst commonOptions = {\n bigPlayButton: false,\n};\n\nconst videoOptions = {\n ...commonOptions,\n};\n\nconst audioOptions = {\n ...commonOptions,\n controlBar: {\n pictureInPictureToggle: false,\n fullscreenToggle: false,\n },\n playbackRates: [1, 1.3, 1.5],\n};\n\nexport const getOptions = videoNode => {\n if (videoNode.tagName === 'AUDIO') {\n return audioOptions;\n }\n if (videoNode.tagName === 'VIDEO') {\n return videoOptions;\n }\n return undefined;\n};\n\nconst importAllPlugins = async () => Promise.all([importVideoPlugins(), importAudioPlugins()]);\n\nconst importPlayerPlugins = async content => {\n if (hasVideosOnly(content)) {\n return importVideoPlugins();\n }\n if (hasAudiosOnly(content)) {\n return importAudioPlugins();\n }\n\n return importAllPlugins();\n};\n\nconst getPlayerWithPlugins = async content => {\n const { videojs } = await importVideoJs();\n await importPlayerPlugins(content);\n return videojs;\n};\n\nconst initAudio = player => {\n player.seekButtons({\n forward: 30,\n back: 10,\n });\n};\n\n// eslint-disable-next-line no-unused-vars\nconst initVideo = player => {\n player.hlsQualitySelector();\n};\n\nconst initPluginsForPlayer = player => {\n if (player.isAudio()) {\n initAudio(player);\n } else {\n initVideo(player);\n }\n};\n\nexport const loadVideoJsApi = async content => {\n const playerLib = await getPlayerWithPlugins(content);\n return {\n playerLib,\n document: globals.window.document,\n init: initPluginsForPlayer,\n };\n};\n","/* eslint-disable max-len */\nimport { useEffect } from 'react';\n\nimport { loadVideoJsApi, getOptions } from './api';\nimport { isServer } from '../utils/ssr';\n\nconst renderVideoJsPlayers = async ({ playerLib, document, init }) => {\n const { durationBarComponentName } = await import(\n /* webpackChunkName: 'player-custom' */ '../components/MediaInput/MediaInputVideo/CustomPlayerComponents/InfoBar/VjsDurationInfoBar'\n );\n // const { videoMediaTagComponentName } = await import(/* webpackChunkName: 'player-custom' */'./components/VjsMediaTag');\n const { videoPlayButtonComponentName } = await import(\n /* webpackChunkName: 'player-custom' */ '../components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/VjsPlayButton'\n );\n\n const videoPlaceholderNodes = [...document.querySelectorAll('.video-js:not(.rendered)')];\n videoPlaceholderNodes.forEach(playerNode => {\n playerNode.classList.add('rendered');\n const player = playerLib(playerNode, getOptions(playerNode));\n\n player.addChild(durationBarComponentName);\n // player.addChild(videoMediaTagComponentName);\n player.addChild(videoPlayButtonComponentName);\n init(player);\n });\n};\n\nexport const useVideoPlayerEffect = content => {\n useEffect(() => {\n let didCancel = false; // eslint-disable-line fp/no-let\n\n async function convertVideoJsNodes() {\n const loadedApi = await loadVideoJsApi(content);\n if (!didCancel) {\n await renderVideoJsPlayers(loadedApi);\n }\n }\n\n if (!isServer()) {\n convertVideoJsNodes();\n }\n return () => {\n didCancel = true; // eslint-disable-line fp/no-mutation\n };\n }, [content]);\n};\n","import { useEffect } from 'react';\nimport { TrackingUtils } from '../TrackingUtils';\n\nconst eventName = 'addEmbeddings';\n\nexport const useAddEmbeddingsToGtm = ({ dictionary }) => {\n useEffect(() => {\n TrackingUtils.pushToGoogleTagManager({\n datalayerObj: {\n event: eventName,\n pageData: {\n embeddings: dictionary,\n },\n },\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n};\n","import { useStaticInfoForGtm } from './useStaticInfoForGtm';\nimport { generateContentGtmInfo } from '../TrackingUtils';\nimport { useAddEmbeddingsToGtm } from './useAddEmbeddingsToGtm';\n\nexport const useMediaTracking = content => {\n const { level1Id, macaParam, pageUrl } = useStaticInfoForGtm();\n const contentDictionary = {\n [content.id]: generateContentGtmInfo({\n content,\n level1Id,\n macaParam,\n pageUrl,\n }),\n };\n\n useAddEmbeddingsToGtm({ dictionary: contentDictionary });\n};\n","import gql from 'graphql-tag';\nimport { subtitlesLabels } from '../../../utils/mappers/subtitlesLabel';\nimport { useVideoPlayerEffect } from '../../../video/useVideoPlayerEffect';\nimport { useMediaTracking } from '../../GoogleTagManager/hooks/useMediaTracking';\nimport { gtmDataLayerFragment } from '../../GoogleTagManager';\n\nexport const mediaInputVideoFragment = {\n name: 'MediaInputVideo',\n fragment({ type }) {\n return gql`fragment ${type}${this.name} on ${type} {\n videos {\n name\n contentDate\n language \n posterImageUrl\n hlsVideoSrc\n formattedDuration\n subtitles {\n trackId: targetId\n srcLanguage\n language\n subtitleUrl\n }\n ${gtmDataLayerFragment.partial()}\n }\n }\n `;\n },\n};\n\nexport const MediaInputVideo = ({ data }) => {\n useVideoPlayerEffect(data.content);\n useMediaTracking(data.content.videos[0]);\n const {\n type = 'application/x-mpegURL',\n subtitles,\n posterImageUrl,\n hlsVideoSrc,\n formattedDuration,\n } = data.content.videos[0];\n\n return (\n // eslint-disable-next-line jsx-a11y/media-has-caption\n \n \n {subtitles.map(subtitle => (\n \n ))}\n \n To view this video please enable JavaScript, and consider upgrading to a web browser that{' '}\n \n supports HTML5 video\n \n
\n \n );\n};\n","import gql from 'graphql-tag';\nimport { DwPicture } from '../../DwPicture/DwPicture';\n\nexport const mediaInputImageFragment = {\n name: 'MediaInputImage',\n fragment({ type }) {\n return gql`fragment ${type}${this.name} on ${type} {\n mainContentImage {\n imageId: id\n imageName: name\n }\n }\n `;\n },\n};\n\nexport const MediaInputImage = ({ data }) => {\n const { imageId, imageName } = data.content.mainContentImage || {};\n\n return imageId ? : null;\n};\n","/* eslint-disable jsx-a11y/media-has-caption */\nimport { useRef } from 'react';\nimport gql from 'graphql-tag';\nimport { DwPicture } from '../../DwPicture/DwPicture';\nimport { I18nText } from '../../I18n/I18nText';\nimport { useMediaTracking } from '../../GoogleTagManager/hooks/useMediaTracking';\nimport { gtmDataLayerFragment } from '../../GoogleTagManager';\n\nexport const mediaInputAudioFragment = {\n name: 'MediaInputAudio',\n fragment({ type }) {\n return gql`fragment ${type}${this.name} on ${type} {\n audios {\n id\n name\n contentDate\n mainContentImage {\n imageId: id\n imageName: name\n }\n mp3Src\n audioResourceLinks {\n url\n duration\n size\n }\n ${gtmDataLayerFragment.partial()}\n }\n }\n `;\n },\n};\n\nexport const MediaInputAudio = ({ data }) => {\n const audioRef = useRef();\n useMediaTracking(data.content.audios[0]);\n\n if (!data.content.audios[0]) return null;\n const { id, name, contentDate, mainContentImage, mp3Src } = data.content.audios[0];\n const { imageId, imageName } = mainContentImage || data.content.mainContentImage || {};\n const { duration, size } = data.content.audios[0].audioResourceLinks[0];\n\n const playAudio = e => {\n e.preventDefault();\n audioRef.current.play();\n };\n\n return (\n \n );\n};\n","/* eslint-disable no-nested-ternary */\nimport gql from 'graphql-tag';\nimport {\n MediaInputVideo,\n mediaInputVideoFragment,\n} from '../../MediaInput/MediaInputVideo/MediaInputVideo';\nimport {\n MediaInputImage,\n mediaInputImageFragment,\n} from '../../MediaInput/MediaInputImage/MediaInputImage';\nimport {\n MediaInputAudio,\n mediaInputAudioFragment,\n} from '../../MediaInput/MediaInputAudio/MediaInputAudio';\n\nexport const mediaInputChooserFragment = {\n name: 'MediaInputChooser',\n fragment({ type }) {\n return gql`fragment ${type}${this.name} on ${type} {\n ...${type}MediaInputImage\n ...${type}MediaInputAudio\n ...${type}MediaInputVideo\n }\n ${mediaInputImageFragment.fragment({ type })}\n ${mediaInputAudioFragment.fragment({ type })}\n ${mediaInputVideoFragment.fragment({ type })}\n `;\n },\n};\n\nexport const MediaInputChooser = ({ data }) => {\n const { videos, audios } = data.content;\n\n const lessonInput =\n videos.length > 0 ? (\n \n ) : audios.length > 0 ? (\n \n ) : data.content.mainContentImage ? (\n \n \n
\n ) : null;\n\n return (\n \n );\n};\n","import { useParams } from 'react-router';\nimport gql from 'graphql-tag';\nimport {\n LessonContentDescription,\n lessonContentDescriptionFragment,\n} from '../LessonContentDescription/LessonContentDescription';\nimport {\n MediaInputChooser,\n mediaInputChooserFragment,\n} from '../MediaInputChooser/MediaInputChooser';\nimport { ImageOGMetaData } from '../../ImageOGMetaData/ImageOGMetaData';\nimport { knowledgesFragment } from '../LessonKnowledge/LessonKnowledge';\nimport { WithGraphQLQueryHandling } from '../../WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { metaDataFragment, PageMetaData } from '../../Page/PageMetaData';\nimport { PAGE_TYPES } from '../../../constants/pageTypes';\nimport {\n gtmDataLayerFragment,\n GtmScriptWithDataLayer,\n} from '../../GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const lessonInformationQuery = gql`\n query LessonInformation($lessonId: Int!, $lang: Language!) {\n content(id: $lessonId, lang: $lang) {\n ... on Lesson {\n ...LessonMediaInputChooser\n ...LessonContentDescription\n ...LessonKnowledges\n ...${metaDataFragment.name}\n ${gtmDataLayerFragment.partial()}\n }\n }\n }\n ${mediaInputChooserFragment.fragment({ type: 'Lesson' })}\n ${lessonContentDescriptionFragment}\n ${knowledgesFragment.fragment({ type: 'Lesson' })}\n ${metaDataFragment.fragment({ type: 'Lesson' })}\n`;\n\nexport const LessonInformation = ({\n lessonLang,\n firstExercisePath,\n isFinalTest,\n courseName,\n isContentDescriptionHintVisible = false,\n ogImage,\n}) => {\n const { lessonId } = useParams();\n\n const lessonInformationQueryVariables = {\n lessonId: +lessonId,\n lang: lessonLang,\n };\n\n return (\n \n {data => (\n <>\n \n \n \n \n \n >\n )}\n \n );\n};\n","import { createContext, useContext, useReducer } from 'react';\nimport { createInquiryProgressMetaData } from '../../../../state/progress/learnProgress';\n\n// Actions\nexport const EXERCISE_PROGRESS_ACTION_TYPES = Object.freeze({\n ADD_DONE_INQUIRY: 'ADD_DONE_INQUIRY',\n RESET: 'RESET',\n});\n\n// Reducer\nconst exerciseProgressReducer = (state, action) => {\n switch (action.type) {\n case EXERCISE_PROGRESS_ACTION_TYPES.ADD_DONE_INQUIRY:\n return {\n ...state,\n inquiryProgresses: [\n ...state.inquiryProgresses,\n createInquiryProgressMetaData({\n inquiryId: action.inquiryId,\n score: action.score,\n achievableScore: action.achievableScore,\n }),\n ],\n numberOfDoneInquiries: state.numberOfDoneInquiries + 1,\n currentExerciseScore: state.currentExerciseScore + action.score,\n };\n case EXERCISE_PROGRESS_ACTION_TYPES.RESET:\n return initialState;\n default:\n // eslint-disable-next-line fp/no-throw\n throw new Error('unexpected action type');\n }\n};\n\nconst initialState = {\n inquiryProgresses: [],\n numberOfDoneInquiries: 0,\n currentExerciseScore: 0,\n};\n\nexport const ExerciseProgressContext = createContext(null);\n\nexport const ExerciseProgressProvider = ({ isFromPlacementCourse, children }) => {\n const [exerciseStats, dispatch] = useReducer(exerciseProgressReducer, initialState);\n\n return (\n \n {children}\n \n );\n};\n\n// usage hook with \"action creators\"\nexport const useExerciseProgress = () => {\n const [exerciseProgress, dispatch] = useContext(ExerciseProgressContext);\n\n const addDoneInquiry = ({ inquiryId, score, achievableScore }) => {\n dispatch({\n type: EXERCISE_PROGRESS_ACTION_TYPES.ADD_DONE_INQUIRY,\n inquiryId,\n score,\n achievableScore,\n });\n };\n\n const resetProgress = () => {\n dispatch({ type: EXERCISE_PROGRESS_ACTION_TYPES.RESET });\n };\n\n return { exerciseProgress, addDoneInquiry, resetProgress };\n};\n","import { useParams } from 'react-router';\nimport { I18nText } from '../../../I18n/I18nText';\nimport { useExerciseProgress } from '../workflow/ExerciseProgress';\nimport { isRtlByLangCode } from '../../../../utils/mappers/rtlLanguages';\n\nconst outOfText = ;\nconst numberOfPointsEarnedText = (\n \n);\nconst numberOfExercisesSolvedText = (\n \n);\n\nexport const LessonExerciseStats = ({ amountOfInquiries }) => {\n const { exerciseProgress } = useExerciseProgress();\n const { langCode } = useParams();\n const isRtlLang = isRtlByLangCode(langCode);\n\n const numberOfDoneInquiriesSpan = (\n {exerciseProgress.numberOfDoneInquiries} \n );\n const amountOfInquiriesSpan = {amountOfInquiries} ;\n const scoreSpan = (\n {exerciseProgress.currentExerciseScore} \n );\n\n const ltrStats = (\n <>\n {numberOfDoneInquiriesSpan}\n \n {outOfText}\n \n {amountOfInquiriesSpan}\n \n {numberOfExercisesSolvedText}. \n {scoreSpan}\n \n {numberOfPointsEarnedText}.\n >\n );\n\n const rtlStats = (\n <>\n {numberOfDoneInquiriesSpan}\n \n {outOfText}\n \n {numberOfExercisesSolvedText}\n \n {amountOfInquiriesSpan}\n \n {numberOfPointsEarnedText}\n \n {scoreSpan}\n >\n );\n\n return (\n \n
{isRtlLang ? rtlStats : ltrStats}
\n
\n );\n};\n","import { useEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { isServer } from '../utils/ssr';\nimport globals from '../utils/globals';\n\nexport const useScrollToTop = () => {\n const { pathname } = useLocation();\n\n useEffect(() => {\n !isServer() && globals.window.scrollTo(0, 0);\n }, [pathname]);\n};\n","import classnames from 'classnames';\nimport { I18nText } from '../../I18n/I18nText';\n\nexport const ContentNavTitle = ({ title, top, bottom }) => (\n \n);\n","import gql from 'graphql-tag';\nimport { ContentHeadline } from '../../../ContentContainer/ContentHeadline/ContentHeadline';\n\nexport const lessonExerciseHeadlineFragment = {\n name: 'LessonExerciseHeadline',\n fragment() {\n return gql`fragment ${this.name} on Exercise {\n name\n description\n }\n `;\n },\n};\n\nexport const LessonExerciseHeadline = ({ data }) => {\n const { name, description } = data.content;\n return (\n \n {name} \n
\n \n );\n};\n","/* eslint-disable jsx-a11y/media-has-caption */\nimport { forwardRef } from 'react';\n\nexport const LessonExerciseHiddenAudio = forwardRef(({ src }, ref) => (\n \n));\n","import { forwardRef } from 'react';\nimport { LessonExerciseHiddenAudio } from './LessonExerciseHiddenAudio';\n\nexport const LessonExerciseSoundFailureHiddenAudio = forwardRef((_, ref) => (\n \n));\n","import { forwardRef } from 'react';\nimport { LessonExerciseHiddenAudio } from './LessonExerciseHiddenAudio';\n\nexport const LessonExerciseSoundSuccessHiddenAudio = forwardRef((_, ref) => (\n \n));\n","import { createContext, useRef, useState } from 'react';\nimport { LessonExerciseSoundFailureHiddenAudio } from '../components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseSoundFailureHiddenAudio';\nimport { LessonExerciseSoundSuccessHiddenAudio } from '../components/Lesson/LessonExercise/LessonExerciseHiddenAudio/LessonExerciseSoundSuccessHiddenAudio';\n\nexport const AudioContext = createContext([{}, () => {}, {}, {}]);\n\nexport const AudioProvider = props => {\n const [questionAudiosRefArray, setQuestionAudiosRefArray] = useState([]);\n const wrongAnswerAudioRef = useRef();\n const correctAnswerAudioRef = useRef();\n\n return (\n \n \n \n {props.children}\n \n );\n};\n","import { RichText } from '../../../RichText/RichText';\n\nexport const LessonExerciseTextInput = ({ inputText }) =>\n inputText && (\n \n );\n","import { useContext } from 'react';\nimport { AudioContext } from '../context/AudioContext';\n\nexport const useAudio = () => {\n const [\n audiosRefArray,\n setAudiosRefArray,\n wrongAnswerAudioRef,\n correctAnswerAudioRef,\n ] = useContext(AudioContext);\n\n const stopOtherAudios = index => {\n const currentAudio = audiosRefArray[index];\n audiosRefArray.forEach(audio => {\n if (audio !== currentAudio) {\n audio.current.pause();\n // eslint-disable-next-line fp/no-mutation,no-param-reassign\n audio.current.currentTime = 0;\n }\n });\n };\n const playAudio = (e, ref) => {\n e.preventDefault();\n const index = audiosRefArray.indexOf(ref);\n stopOtherAudios(index);\n audiosRefArray[index].current.play();\n };\n\n const addRef = ref => {\n // eslint-disable-next-line fp/no-mutating-methods\n audiosRefArray.push(ref);\n setAudiosRefArray(audiosRefArray);\n };\n\n const playWrongDefaultAudioFeedBack = () => {\n wrongAnswerAudioRef.current.play();\n };\n\n const playCorrectDefaultAudioFeedBack = () => {\n correctAnswerAudioRef.current.play();\n };\n\n return {\n playAudio,\n addRef,\n playWrongDefaultAudioFeedBack,\n playCorrectDefaultAudioFeedBack,\n };\n};\n","/* eslint-disable jsx-a11y/role-supports-aria-props */\nimport { useEffect, useRef, useState } from 'react';\nimport { createGlobalStyle } from 'styled-components';\nimport { useAudio } from '../../../../../hooks/useAudio';\nimport { useTranslation } from '../../../../../hooks/useTranslation';\nimport { useFrontendConfig } from '../../../../../hooks/useFrontendConfig';\n\nconst LessonExerciseQuestionAudioGlobalStyles = createGlobalStyle` \n /* @noflip */\n .alwaysLtr {\n text-align: left;\n direction: ltr;\n }\n`;\n\nexport const LessonExerciseQuestionAudio = ({ audio, inquiryText }) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [hasEnded, setHasEnded] = useState(false);\n\n const playAudioLabel = useTranslation('exercise.playAudio');\n const { target: answerAudio } = audio || {};\n const { mp3Src: audioUrl, mainContentImage } = answerAudio || {};\n\n const audioRef = useRef();\n const { addRef, playAudio } = useAudio();\n\n const { imageBasePath } = useFrontendConfig();\n\n useEffect(() => {\n addRef(audioRef);\n }, [addRef]);\n\n const handleOnPlaying = () => {\n setIsPlaying(true);\n };\n\n const handleOnEnded = () => {\n setIsPlaying(false);\n setHasEnded(true);\n };\n\n const handleOnPaused = () => {\n setIsPlaying(false);\n };\n\n const getBubbleAudioLabel = () => {\n if (isPlaying) return 'playing';\n\n if (hasEnded) return 'ending';\n\n return '';\n };\n\n const audioLabel = inquiryText || playAudioLabel;\n return (\n <>\n playAudio(e, audioRef)}\n >\n \n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n \n \n {audioLabel}
\n
\n \n {mainContentImage && (\n \n
\n
\n )}\n >\n );\n};\n","import { createGlobalStyle } from 'styled-components';\n\nexport const LessonExerciseQuestionTextGlobalStyles = createGlobalStyle` \n /* @noflip */\n .alwaysLtr {\n text-align: left;\n direction: ltr;\n }\n`;\n\nexport const LessonExerciseQuestionText = ({ inquiryText }) => (\n <>\n \n {inquiryText}
\n >\n);\n","import { LessonExerciseQuestionText } from './LessonExerciseQuestionText';\nimport { useFrontendConfig } from '../../../../../hooks/useFrontendConfig';\n\nexport const LessonExerciseQuestionImage = ({ inquiryText, mainContentImage }) => {\n const { id, name } = mainContentImage;\n const { imageBasePath } = useFrontendConfig();\n return (\n <>\n \n \n
\n
\n >\n );\n};\n","import { LessonExerciseQuestionText } from './LessonExerciseQuestionText';\nimport { MediaInputVideo } from '../../../../MediaInput/MediaInputVideo/MediaInputVideo';\n\nexport const LessonExerciseQuestionVideo = ({ inquiryText, videos }) => (\n <>\n \n \n \n
\n >\n);\n","export const findQuestionAudio = audios => audios.find(audio => audio.mainContent);\n\nexport const findFeedbackAudio = (isSolutionAudioFallbackMode, audios) => {\n const feedbackAudio = audios.find(audio => !audio.mainContent);\n return feedbackAudio || (isSolutionAudioFallbackMode ? findQuestionAudio(audios) : undefined);\n};\n","export const QUESTION_TYPES = Object.freeze({\n TEXT: 'TEXT',\n IMAGE: 'IMAGE',\n AUDIO: 'AUDIO',\n VIDEO: 'VIDEO',\n});\n","import gql from 'graphql-tag';\nimport { LessonExerciseQuestionAudio } from './QuestionTypes/LessonExerciseQuestionAudio';\nimport { LessonExerciseQuestionImage } from './QuestionTypes/LessonExerciseQuestionImage';\nimport { LessonExerciseQuestionText } from './QuestionTypes/LessonExerciseQuestionText';\nimport { LessonExerciseQuestionVideo } from './QuestionTypes/LessonExerciseQuestionVideo';\nimport { findQuestionAudio } from '../../../../utils/audioUtils';\nimport { QUESTION_TYPES } from './QuestionTypes/questionTypes';\nimport { mediaInputVideoFragment } from '../../../MediaInput/MediaInputVideo/MediaInputVideo';\n\nexport const lessonExerciseQuestionFragment = {\n name: 'LessonExerciseQuestion',\n fragment() {\n return gql`fragment ${this.name} on Inquiry {\n inquiryText\n mainContentImage {\n id\n name\n }\n audios: contentLinks(targetTypes: [AUDIO]) {\n id\n mainContent\n target {\n ...on Audio {\n mp3Src\n mainContentImage {\n imageId: id\n imageName: name\n }\n }\n }\n }\n ...Inquiry${mediaInputVideoFragment.name}\n } \n ${mediaInputVideoFragment.fragment({ type: 'Inquiry' })}\n `;\n },\n};\n\nexport const exerciseQuestionTypeSelector = ({ inquiry }) => {\n const { videos, audios, mainContentImage } = inquiry;\n if (mainContentImage) {\n return QUESTION_TYPES.IMAGE;\n }\n if (videos.length > 0) {\n return QUESTION_TYPES.VIDEO;\n }\n if (findQuestionAudio(audios)) {\n return QUESTION_TYPES.AUDIO;\n }\n return QUESTION_TYPES.TEXT;\n};\n\nexport const LessonExerciseQuestion = ({ inquiry, useSubInquiryTextAsLabel = false }) => {\n const { inquiryText, videos, audios, mainContentImage, subInquiries } = inquiry;\n const questionType = exerciseQuestionTypeSelector({ inquiry });\n\n const getLabelText = () => {\n if (inquiryText) return inquiryText;\n if (subInquiries && useSubInquiryTextAsLabel) return subInquiries[0].subInquiryText;\n return '';\n };\n\n const labelText = getLabelText(inquiryText, subInquiries);\n const questionAudio = findQuestionAudio(audios);\n\n switch (questionType) {\n case QUESTION_TYPES.IMAGE:\n return ;\n case QUESTION_TYPES.VIDEO:\n return ;\n case QUESTION_TYPES.AUDIO:\n return ;\n case QUESTION_TYPES.TEXT:\n return ;\n default:\n return null;\n }\n};\n","import styled from 'styled-components';\nimport { colors } from '../../utils/css';\nimport { Text } from '../Text/Text';\n\n// eslint-disable-next-line no-unused-vars\nconst ButtonTemplate = ({ className, btnClass, children, disabled, fullWidth, ...restProps }) => (\n \n \n {children} \n \n
\n);\nexport const StyledButtonTemplate = styled(ButtonTemplate)`\n width: ${props => (props.fullWidth ? '100%' : '40%')};\n\n button {\n border-radius: 25px;\n width: 100%;\n height: 38px;\n background: ${colors.LG_WHITE};\n color: ${colors.LG_BLUE_1};\n border: 1px solid ${colors.LG_BLUE_1};\n transition: 0.2s;\n outline: none;\n }\n`;\n","import styled from 'styled-components';\nimport { StyledButtonTemplate } from './ButtonTemplate';\nimport { colors } from '../../utils/css';\n\nexport const SolveButton = ({ className, isDisabled, handleClick, fullWidth, children }) => (\n \n {children}\n \n);\n\nconst grayActiveFocus = `\n background: ${colors.LG_WHITE};\n color: ${colors.LG_GRAY_1};\n border: 1px solid ${colors.LG_GRAY_1};\n opacity: 0.65;\n`;\n\nexport const StyledSolveButton = styled(SolveButton)`\n .solve-button-gray {\n ${grayActiveFocus}\n }\n\n button.solve-button-blue {\n &:hover {\n background: ${props => (props.fullWidth ? colors.DW_LIGHT_BLUE : colors.LG_GRAY_10)};\n color: ${colors.LG_WHITE};\n border: 1px solid ${props => (props.fullWidth ? colors.DW_LIGHT_BLUE : colors.LG_GRAY_1)};\n }\n\n &:active,\n &:focus {\n ${grayActiveFocus}\n }\n }\n`;\n","import styled from 'styled-components';\nimport { StyledButtonTemplate } from './ButtonTemplate';\nimport { colors } from '../../utils/css';\n\nexport const CheckButton = ({ className, handleClick, isDisabled, children }) => (\n \n {children}\n \n);\n\nexport const StyledCheckButton = styled(CheckButton)`\n .check-button-blue {\n &:hover {\n color: ${colors.LG_WHITE};\n background: ${colors.LG_BLUE_1};\n }\n }\n\n .check-button-gray {\n background: ${colors.LG_WHITE};\n color: ${colors.LG_GRAY_1};\n border-color: ${colors.LG_GRAY_1};\n opacity: 0.65;\n }\n`;\n","import styled from 'styled-components';\nimport { StyledSolveButton } from './SolveButton';\nimport { StyledCheckButton } from './CheckButton';\nimport { I18nText } from '../I18n/I18nText';\nimport { resolutions } from '../../utils/css';\n\nexport const SolveCheckButton = ({\n className,\n isSolveButtonDisabled,\n isCheckButtonDisabled,\n handleSolveClicked,\n handleCheckClicked,\n}) => (\n \n \n \n \n \n \n \n
\n);\n\nexport const StyledSolveCheckButton = styled(SolveCheckButton)`\n /* @noflip */\n direction: ltr;\n display: flex;\n margin: auto;\n justify-content: space-between;\n padding: 20px 0;\n margin-bottom: 50px;\n width: 770px;\n > * {\n width: 376px;\n }\n\n @media (max-width: ${resolutions.max.tablet}px) {\n width: 79.825%;\n padding: 20px 20px;\n > * {\n width: 48%;\n }\n }\n\n @media (max-width: ${resolutions.max.mobile}px) {\n width: 97%;\n }\n`;\n","export const placeholderConfig = [\n { placeholder: '#p#', size: 'medium', maxLength: 15 },\n { placeholder: '#ps#', size: 'small', maxLength: 7 },\n { placeholder: '#pm#', size: 'medium', maxLength: 15 },\n { placeholder: '#pl#', size: 'full', maxLength: null },\n];\n\nexport const createSingleSentenceAnswerContent = (subInquiries, arrayJoinString) => {\n const sentences = subInquiries.map(subInquiry => subInquiry.subInquiryText);\n return sentences.join(arrayJoinString);\n};\n\nexport const cleanupAndAddPlaceholderComponents = answertext => {\n // eslint-disable-next-line fp/no-let\n let answerWithReplacePlaceholders = answertext;\n\n const replaceInString = config => {\n // eslint-disable-next-line fp/no-mutation\n answerWithReplacePlaceholders = answerWithReplacePlaceholders.replace(\n new RegExp(config.placeholder, 'g'),\n `${config.size} `,\n );\n };\n\n placeholderConfig.forEach(replaceInString);\n return answerWithReplacePlaceholders;\n};\n","export const INQUIRY_STATE = Object.freeze({\n INITIAL: 'INITIAL',\n WRONG: 'WRONG',\n CORRECT: 'CORRECT',\n SOLVED: 'SOLVED',\n});\n","/* eslint-disable jsx-a11y/anchor-is-valid,jsx-a11y/aria-role,comma-dangle */\nimport { useState } from 'react';\nimport classnames from 'classnames';\nimport { INQUIRY_STATE } from '../workflow/inquiryState';\n\nexport const ClozePulldown = ({\n index,\n pulldownData,\n inquiryState,\n checkEntry,\n onHandleItemSelected,\n isDisabled,\n}) => {\n const [isToggled, setIsToggled] = useState(false);\n const getInputClassName = () => {\n switch (inquiryState) {\n case INQUIRY_STATE.CORRECT:\n case INQUIRY_STATE.WRONG:\n return checkEntry(pulldownData) ? 'correct-input' : 'wrong-input';\n case INQUIRY_STATE.SOLVED:\n return 'solved-input';\n default:\n return '';\n }\n };\n\n const onPulldownClicked = () => {\n if (!isDisabled) {\n setIsToggled(!isToggled);\n }\n };\n\n return (\n \n
\n {pulldownData.selectedValue}{' '}\n {pulldownData.selectedValue === '...' ? : null}\n \n
\n
\n );\n};\n","import { replaceWithComponent } from './replaceCommons';\n\nexport const replacePlaceholderWithAnswerComponent = ({\n selector,\n createComponent,\n scopeClassName,\n node,\n}) => {\n replaceWithComponent({\n selector: scopeClassName\n ? `.${scopeClassName} ${selector || '.placeholder-cloze'}`\n : selector || '.placeholder-cloze',\n node,\n componentFn: (matchedElem, index) => createComponent(index, matchedElem),\n });\n};\n","import globals from '../../../../utils/globals';\nimport { replacePlaceholderWithAnswerComponent } from '../../../../utils/replacers/exerciseReplacer';\nimport { useTimeout } from '../../../../hooks/useTimeout';\n\nexport const usePlaceholderReplacementEffect = ({\n selector,\n createComponent,\n trigger = 'staticTrigger',\n scopeClassName,\n node,\n}) => {\n useTimeout(\n {\n callback: () => {\n replacePlaceholderWithAnswerComponent({\n selector,\n createComponent,\n scopeClassName,\n node: node ? node.current : globals.window.document,\n });\n },\n delay: 10,\n },\n [trigger],\n );\n};\n","import { usePlaceholderReplacementEffect } from './usePlaceholderReplacementEffect';\nimport { Text } from '../../../Text/Text';\n\nexport const ExerciseRichText = ({\n content,\n createComponent,\n trigger,\n scopeClassName,\n className,\n isA = 'div',\n update = false,\n node,\n}) => {\n usePlaceholderReplacementEffect({ createComponent, trigger, scopeClassName, node });\n return (\n \n );\n};\n","import { useState, useEffect, useRef } from 'react';\nimport classnames from 'classnames';\nimport styled from 'styled-components';\nimport {\n cleanupAndAddPlaceholderComponents,\n createSingleSentenceAnswerContent,\n} from '../clozeExerciseUtils';\nimport { INQUIRY_STATE } from '../../workflow/inquiryState';\nimport { ClozePulldown } from '../ClozePulldown';\nimport { ExerciseRichText } from '../ExerciseRichText';\n\nexport const PulldownAnswer = ({ className, inquiry, onChange, inquiryState, isDisabled }) => {\n const { subInquiries, clozeLayoutType } = inquiry;\n const initialClozePulldownData = subInquiries.map(subInquiry => {\n return {\n ...subInquiry,\n selectedValue: '...',\n };\n });\n\n const checkEntry = entry =>\n entry.alternatives.some(\n alternative => entry.selectedValue === alternative.alternativeText && alternative.isCorrect,\n );\n const checkAnswer = () => clozePulldownData.filter(data => checkEntry(data)).length;\n\n const [clozePulldownData, setClozePulldownData] = useState(initialClozePulldownData);\n const node = useRef(null);\n\n const onHandleItemSelected = (e, index, answer) => {\n e.preventDefault();\n const newClozeData = [...clozePulldownData];\n // eslint-disable-next-line fp/no-mutation\n newClozeData[index].selectedValue = answer;\n setClozePulldownData(newClozeData);\n onChange(checkAnswer());\n };\n\n useEffect(() => {\n if (inquiryState === INQUIRY_STATE.SOLVED) {\n setClozePulldownData(pulldownData => {\n const newClozeData = [...pulldownData];\n pulldownData.forEach((value, index) => {\n // eslint-disable-next-line fp/no-mutation\n newClozeData[index].selectedValue = value.alternatives.find(\n alternative => alternative.isCorrect,\n ).alternativeText;\n });\n return newClozeData;\n });\n }\n }, [inquiryState]);\n\n const createPulldown = index => (\n \n );\n\n const partialComponent = (inline = false) => answerContent => (\n \n \n
\n );\n\n const clozeLayoutTypeConfig = {\n CONTINUOUS_TEXT: {\n cmp: partialComponent(true),\n answerContent: () => cleanupAndAddPlaceholderComponents(inquiry.text),\n },\n SINGLE_SENTENCE: {\n cmp: partialComponent(false),\n answerContent: () =>\n cleanupAndAddPlaceholderComponents(\n createSingleSentenceAnswerContent(subInquiries, '
'),\n ),\n },\n };\n\n const selectedClozeLayoutConfig = clozeLayoutTypeConfig[clozeLayoutType];\n\n if (selectedClozeLayoutConfig == null) {\n return null;\n }\n\n return selectedClozeLayoutConfig.cmp(selectedClozeLayoutConfig.answerContent());\n};\n\nexport const StyledPulldownAnswer = styled(PulldownAnswer)`\n &.exercise-cloze-text-big div.form-group p {\n display: block;\n }\n\n /* @noflip */\n text-align: left;\n /* @noflip */\n direction: ltr;\n`;\n","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgIconHint(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"10px\",\n height: \"18px\",\n viewBox: \"0 0 10 18\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n style: {\n fillRule: \"evenodd\"\n },\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M369.101562,1457.80899 L369.101562,1456.85041 C369.918135,1456.42437 370.841202,1456.08709 371.870793,1455.83857 L371.870793,1448.22319 C371.302743,1447.97467 370.432929,1447.76165 369.261326,1447.58413 L369.261326,1446.67881 C370.965476,1446.39478 372.953622,1446.25277 375.225823,1446.25277 L375.225823,1455.83857 L378.101562,1456.85041 L378.101562,1457.80899 L369.101562,1457.80899 Z M373.308663,1444.17585 C372.740613,1444.17585 372.261328,1443.98059 371.870793,1443.59005 C371.480259,1443.19952 371.284994,1442.72023 371.284994,1442.15218 C371.284994,1441.58413 371.480259,1441.10485 371.870793,1440.71431 C372.261328,1440.32378 372.740613,1440.12851 373.308663,1440.12851 C373.876713,1440.12851 374.355998,1440.32378 374.746533,1440.71431 C375.137067,1441.10485 375.332332,1441.58413 375.332332,1442.15218 C375.332332,1442.72023 375.137067,1443.19952 374.746533,1443.59005 C374.355998,1443.98059 373.876713,1444.17585 373.308663,1444.17585 L373.308663,1444.17585 Z\",\n style: {\n fill: \"#f08c00\"\n },\n transform: \"translate(-369.000000, -1440.000000)\"\n }));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgIconHint);\nexport default __webpack_public_path__ + \"static/media/icon-hint.484f8f25.svg\";\nexport { ForwardRef as ReactComponent };","import { createGlobalStyle } from 'styled-components';\nimport { ReactComponent as IconHintSimple } from '../../../../assets/svg/icon-hint.svg';\nimport { ReactComponent as IconHintCircleOrange } from '../../../../assets/svg/icon-hint-circle-orange.svg';\n\nexport const LessonExerciseHintGlobalStyles = createGlobalStyle`\n /* @noflip */\n .exercise-container .exercise-hint span.hint {\n right: 0\n }\n \n @media (min-width: 768px) {\n .exercise-container .exercise-hint p {\n text-align: left;\n }\n }\n`;\n\nexport const LessonExerciseHint = ({ description, isSimpleIconHint = false, isA = 'div' }) => {\n const hintSVG = isSimpleIconHint ? : ;\n const Tag = isA;\n\n return (\n description && (\n \n \n {hintSVG} \n \n
\n )\n );\n};\n","import styled from 'styled-components';\n\nexport const StyledContainerTextContent = styled('div')`\n display: grid;\n\n br {\n content: '';\n display: block;\n height: 10px;\n }\n`;\n","const MULTIPLE_WHITESPACES_REGEX = /\\s\\s+/g;\nconst MINUS_CHARACTERS_REGEX = /[\\u002D\\u2010\\u2027\\u2011\\u2013\\u2014\\u2212]/g;\nconst SPECIAL_CHARACTERS = ',\\\\.!\\\\?:;\\\\-';\nconst WHITESPACE_BEFORE_SPECIAL_REGEX = new RegExp(` ([${SPECIAL_CHARACTERS}])`, 'g');\nconst WHITESPACE_AFTER_SPECIAL_REGEX = new RegExp(`([${SPECIAL_CHARACTERS}]) `, 'g');\n\nexport const normalizeText = str => {\n if (!str) {\n return str;\n }\n return str\n .trim()\n .replace(MULTIPLE_WHITESPACES_REGEX, ' ')\n .replace(MINUS_CHARACTERS_REGEX, '-')\n .replace(WHITESPACE_BEFORE_SPECIAL_REGEX, '$1')\n .replace(WHITESPACE_AFTER_SPECIAL_REGEX, '$1');\n};\n\nexport const isNormalizedTextEqual = (str1, str2) => {\n return normalizeText(str1) === normalizeText(str2);\n};\n","/* eslint-disable jsx-a11y/anchor-is-valid,jsx-a11y/aria-role */\nimport { useState, useEffect } from 'react';\nimport classnames from 'classnames';\nimport { createGlobalStyle } from 'styled-components';\nimport {\n cleanupAndAddPlaceholderComponents,\n createSingleSentenceAnswerContent,\n} from '../clozeExerciseUtils';\nimport { ExerciseRichText } from '../ExerciseRichText';\nimport { StyledContainerTextContent } from './ContainerTextContent';\nimport { INQUIRY_STATE } from '../../workflow/inquiryState';\nimport { shuffle } from '../../../../../utils/commons';\nimport { isNormalizedTextEqual } from '../../utils/exerciseUtils';\n\nconst ChooseAnswerGlobalStyles = createGlobalStyle` \n /* @noflip */\n .alwaysLtr {\n text-align: left;\n direction: ltr;\n }\n`;\n\nexport const ChooseAnswer = ({ inquiry, onChange, inquiryState, isDisabled }) => {\n const { subInquiries, clozeLayoutType, id } = inquiry;\n\n const scopeClassName = `inquiry_${id}`;\n\n const initialClozeChooseData = subInquiries.map(subInquiry => {\n return {\n ...subInquiry,\n selectedAnswer: undefined,\n };\n });\n const initialSelectableAnswers = subInquiries.map(subInquiry => ({\n text: subInquiry.alternatives[0].alternativeText,\n id: subInquiry.alternatives[0].id,\n }));\n\n const [clozeChooseData, setClozeChooseData] = useState(initialClozeChooseData);\n const [selectableAnswers, setSelectableAnswers] = useState(initialSelectableAnswers);\n\n const setSelectedAnswer = answer => {\n // eslint-disable-next-line fp/no-let\n let updated = false;\n const newClozeData = clozeChooseData.map(clozeData => {\n if (!clozeData.selectedAnswer && !updated) {\n // eslint-disable-next-line fp/no-mutation\n updated = true;\n return { ...clozeData, selectedAnswer: answer };\n }\n return { ...clozeData };\n });\n setClozeChooseData(newClozeData);\n };\n\n const removeSelectedAnswer = answer => {\n const newClozeData = clozeChooseData.map(clozeData => {\n if (clozeData.selectedAnswer && clozeData.selectedAnswer.id === answer.id) {\n return { ...clozeData, selectedAnswer: undefined };\n }\n return { ...clozeData };\n });\n setClozeChooseData(newClozeData);\n };\n\n const removeSelectableAnswer = answer => {\n const newSelectableAnswers = selectableAnswers.filter(\n selectableAnswer => selectableAnswer.id !== answer.id,\n );\n setSelectableAnswers(newSelectableAnswers);\n };\n\n const addSelectableAnswer = answer => {\n const newSelectableAnswers = [answer, ...selectableAnswers];\n setSelectableAnswers(newSelectableAnswers);\n };\n\n const handleAnswerClicked = (e, answerText, answerId, isSelectedAnswer) => {\n const answer = { text: answerText, id: +answerId };\n e.preventDefault();\n if (!isDisabled) {\n if (isSelectedAnswer) {\n removeSelectedAnswer(answer);\n addSelectableAnswer(answer);\n } else {\n setSelectedAnswer(answer);\n removeSelectableAnswer(answer);\n }\n }\n };\n\n const checkEntry = (answerText, index) => {\n return clozeChooseData[index].alternatives.some(\n alternative =>\n isNormalizedTextEqual(answerText, alternative.alternativeText) && alternative.isCorrect,\n );\n };\n useEffect(() => {\n if (inquiryState === INQUIRY_STATE.SOLVED) {\n setClozeChooseData(\n subInquiries.map(subInquiry => ({\n ...subInquiry,\n selectedAnswer: {\n text: subInquiry.alternatives[0].alternativeText,\n id: subInquiry.alternatives[0].id,\n },\n })),\n );\n setSelectableAnswers([]);\n }\n }, [inquiryState, subInquiries]);\n useEffect(() => {\n if (inquiryState !== INQUIRY_STATE.SOLVED) {\n onChange(\n clozeChooseData.filter((data, index) =>\n clozeChooseData[index].alternatives.some(\n alternative =>\n data.selectedAnswer &&\n isNormalizedTextEqual(data.selectedAnswer.text, alternative.alternativeText) &&\n alternative.isCorrect,\n ),\n ).length,\n );\n }\n }, [inquiryState, onChange, clozeChooseData]);\n useEffect(() => {\n setSelectableAnswers(answers =>\n shuffle(answers.slice(0)).map(answer => {\n return {\n ...answer,\n };\n }),\n );\n }, []);\n\n const EmptyPlaceholder = () =>
;\n const FilledPlaceholder = ({ selectedAnswer, index }) => (\n {answerLink(selectedAnswer, index, true)}
\n );\n\n const PlaceHolder = ({ clozeData, index }) => {\n const { selectedAnswer } = clozeData;\n return (\n <>\n {selectedAnswer ? (\n \n ) : (\n \n )}\n >\n );\n };\n\n const createPlaceholder = index => {\n const clozeData = clozeChooseData[index];\n return ;\n };\n\n const continuousTextPartialComponent = answerContent => (\n \n );\n\n const singleLinePartialComponent = answerContent => (\n \n \n \n \n
\n );\n const getAnswerClasses = (answerText, index, isSelectedAnswer) => {\n const defaultClasses = 'btn answer-sorting-btn alwaysLtr';\n if (!isSelectedAnswer) {\n return defaultClasses;\n }\n return classnames(\n defaultClasses,\n (inquiryState === INQUIRY_STATE.CORRECT || inquiryState === INQUIRY_STATE.WRONG) &&\n checkEntry(answerText, index)\n ? 'correct-input'\n : '',\n inquiryState === INQUIRY_STATE.WRONG && !checkEntry(answerText, index) ? 'wrong-input' : '',\n inquiryState === INQUIRY_STATE.SOLVED ? 'solved-input' : '',\n );\n };\n const answerLink = (selectableAnswer, index, isSelectedAnswer) => (\n \n handleAnswerClicked(e, selectableAnswer.text, selectableAnswer.id, isSelectedAnswer)\n }\n >\n {selectableAnswer.text}\n \n );\n\n const clozeLayoutTypeConfig = {\n CONTINUOUS_TEXT: {\n cmp: continuousTextPartialComponent,\n answerContent: () => cleanupAndAddPlaceholderComponents(inquiry.text),\n },\n SINGLE_SENTENCE: {\n cmp: singleLinePartialComponent,\n answerContent: () =>\n cleanupAndAddPlaceholderComponents(createSingleSentenceAnswerContent(subInquiries, ' ')),\n },\n };\n\n const selectedClozeLayoutConfig = clozeLayoutTypeConfig[clozeLayoutType];\n\n if (selectedClozeLayoutConfig == null) {\n return null;\n }\n\n return (\n <>\n \n \n {selectedClozeLayoutConfig.cmp(selectedClozeLayoutConfig.answerContent())}\n
\n \n {selectableAnswers.map((selectableAnswer, index) =>\n answerLink(selectableAnswer, index, false, false),\n )}\n
\n >\n );\n};\n","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"rect\", {\n width: 2,\n height: 2,\n x: 2,\n y: 6\n});\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"rect\", {\n width: 2,\n height: 2,\n x: 5,\n y: 6\n});\n\nvar _ref4 = /*#__PURE__*/React.createElement(\"rect\", {\n width: 2,\n height: 2,\n x: 8,\n y: 6\n});\n\nvar _ref5 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m 11,6 3,0 0,5 -2,0 0,-3 -1,0 z\"\n});\n\nvar _ref6 = /*#__PURE__*/React.createElement(\"rect\", {\n width: 2,\n height: 2,\n x: 12,\n y: 12\n});\n\nvar _ref7 = /*#__PURE__*/React.createElement(\"rect\", {\n width: 6,\n height: 2,\n x: 5,\n y: 12\n});\n\nvar _ref8 = /*#__PURE__*/React.createElement(\"rect\", {\n width: 2,\n height: 2,\n x: 9,\n y: 9\n});\n\nvar _ref9 = /*#__PURE__*/React.createElement(\"rect\", {\n width: 2,\n height: 2,\n x: 6,\n y: 9\n});\n\nvar _ref10 = /*#__PURE__*/React.createElement(\"rect\", {\n width: 2,\n height: 2,\n x: 2,\n y: 12\n});\n\nvar _ref11 = /*#__PURE__*/React.createElement(\"rect\", {\n width: 3,\n height: 2,\n x: 2,\n y: 9\n});\n\nfunction SvgKeyboard(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16,\n style: {\n fill: \"#888\"\n },\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"path\", {\n style: {\n fill: \"none\",\n stroke: \"#888\"\n },\n d: \"M 0.5,4.5 15.5,4.5 15.5,15.5 0.5,15.5 Z\"\n }), _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9, _ref10, _ref11));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgKeyboard);\nexport default __webpack_public_path__ + \"static/media/keyboard.3a060932.svg\";\nexport { ForwardRef as ReactComponent };","import styled from 'styled-components';\nimport { ReactComponent as KeyboardIcon } from '../../../../assets/svg/keyboard.svg';\nimport { resolutions } from '../../../../utils/css';\n\nexport const StyledKeyboardIcon = styled(KeyboardIcon)`\n display: none;\n\n @media (min-width: ${resolutions.max.tabletLandscape}px) {\n display: block;\n .placeholder-cloze > & {\n display: inline-block;\n }\n }\n`;\n","import styled, { css } from 'styled-components';\nimport { forwardRef } from 'react';\nimport { INQUIRY_STATE } from '../../Lesson/LessonExercise/workflow/inquiryState';\nimport { useTranslation } from '../../../hooks/useTranslation';\n\nexport const TextAreaInput = forwardRef(\n (\n { inquiryState, input, isDisabled, onChange, onKeyPress, isPlaceholderDisabled = false },\n ref,\n ) => {\n const translatedPlaceholder = useTranslation('exercise.typeHere');\n\n const getBorderColor = () => {\n switch (inquiryState) {\n case INQUIRY_STATE.WRONG:\n return '#be232d';\n case INQUIRY_STATE.CORRECT:\n return '#82b905';\n case INQUIRY_STATE.SOLVED:\n case INQUIRY_STATE.INITIAL:\n default:\n return '#d1c9c2';\n }\n };\n\n const onTextAreaKeyPress = e => {\n if (onKeyPress) {\n onKeyPress(e);\n }\n };\n\n return (\n \n );\n },\n);\n\nconst StyledVerticalTextArea = styled.textarea`\n padding: 5px 10px;\n border: 2px solid ${({ borderColor }) => borderColor};\n resize: vertical;\n height: 8em;\n overflow: auto;\n /* @noflip */\n text-align: left;\n width: 95%;\n\n ${({ isDisabled }) =>\n isDisabled &&\n css`\n cursor: not-allowed;\n opacity: 1;\n background-color: #eee;\n `}\n\n &:empty:not(:focus):before {\n content: attr(placeholder);\n color: grey;\n }\n\n &:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n }\n`;\n","/* eslint-disable fp/no-mutation,no-param-reassign,no-return-assign,react-hooks/exhaustive-deps */\nimport styled from 'styled-components';\nimport classnames from 'classnames';\nimport { useEffect, useRef, useState } from 'react';\nimport './index.css'; // copied file from module path react-simple-keyboard/build/css/index.css due to SSR issues\nimport Keyboard from 'react-simple-keyboard';\nimport { StyledKeyboardIcon as KeyboardIcon } from './KeyboardIcon';\nimport { TextAreaInput } from '../../../Input/TextAreaInput/TextAreaInput';\n\n// copy&pasted from simple-keyboard-layouts module because it was not usable in unit tests\n// import layout from 'simple-keyboard-layouts/build/layouts/german';\nconst layout = {\n layout: {\n default: [\n '^ 1 2 3 4 5 6 7 8 9 0 \\u00DF \\u00B4 {bksp}',\n '{tab} q w e r t z u i o p \\u00FC +',\n '{lock} a s d f g h j k l \\u00F6 \\u00E4 # {enter}',\n '{shift} < y x c v b n m , . - {shift}',\n '.com @ {space}',\n ],\n shift: [\n '\\u00B0 ! \" \\u00A7 $ % & / ( ) = ? ` {bksp}',\n '{tab} Q W E R T Z U I O P \\u00DC *',\n \"{lock} A S D F G H J K L \\u00D6 \\u00C4 ' {enter}\",\n '{shift} > Y X C V B N M ; : _ {shift}',\n '.com @ {space}',\n ],\n },\n};\n\nexport const KeyboardWrapper = ({\n inputMaxLength,\n onChange,\n inputValue,\n inputClassName = '',\n isTextArea = false,\n}) => {\n const [isKeyboardVisible, setKeyboardVisible] = useState(false);\n const [layoutName, setLayoutName] = useState('default');\n const keyboardRef = useRef();\n const inputRef = useRef();\n const textAreaRef = useRef();\n\n useEffect(() => {\n if (isKeyboardVisible) {\n keyboardRef.current.setInput(inputValue);\n }\n if (inputRef.current) {\n inputRef.current.focus();\n }\n if (textAreaRef.current) {\n textAreaRef.current.focus();\n }\n }, [isKeyboardVisible]);\n\n const toggleKeyboard = () => {\n setKeyboardVisible(!isKeyboardVisible);\n };\n\n const handleKeyPress = pressedKey => {\n if (pressedKey === '{enter}') toggleKeyboard();\n if (pressedKey === '{shift}' || pressedKey === '{lock}') handleShift();\n };\n\n const onInputKeyPress = e => {\n if (e.charCode === 13) {\n toggleKeyboard();\n }\n };\n\n const handleShift = () => {\n const newLayoutName = layoutName === 'default' ? 'shift' : 'default';\n setLayoutName(newLayoutName);\n };\n\n const onChangeInput = input => {\n keyboardRef.current.setInput(input);\n onChange(input);\n };\n\n const onChangeLocalInput = e => {\n onChangeInput(e.target.value);\n };\n\n return (\n <>\n \n {isKeyboardVisible && (\n <>\n \n
\n \n × \n \n {!isTextArea && (\n \n )}\n {isTextArea && (\n false,\n onKeyPress: onInputKeyPress,\n isPlaceholderDisabled: true,\n ref: textAreaRef,\n }}\n />\n )}\n
\n
(keyboardRef.current = r)}\n className=\"keyboard\"\n {...{\n onChange: onChangeInput,\n onKeyPress: handleKeyPress,\n layoutName,\n ...layout,\n }}\n />\n \n \n >\n )}\n >\n );\n};\n\nexport const StyledKeyboardBackdrop = styled.div`\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n`;\n","import { useState } from 'react';\nimport classnames from 'classnames';\nimport { INQUIRY_STATE } from '../workflow/inquiryState';\nimport { isNormalizedTextEqual } from '../utils/exerciseUtils';\nimport { KeyboardWrapper } from '../Keyboard/KeyboardWrapper';\n\nexport const ClozeInput = ({\n inquiryState,\n index,\n clozeData,\n config,\n handleOnInputChange,\n isDisabled,\n}) => {\n const fieldNameId = clozeData.id;\n const [value, setValue] = useState(\n inquiryState === INQUIRY_STATE.SOLVED\n ? clozeData.alternatives[0].alternativeText\n : clozeData.userAnswer,\n );\n\n const [isCorrect, setIsCorrect] = useState(\n isNormalizedTextEqual(clozeData.alternatives[0].alternativeText, clozeData.userAnswer),\n );\n\n const handleOnChange = e => {\n handleChange(e.target.value);\n };\n\n const handleKeyboardChange = input => {\n handleChange(input);\n };\n\n const handleChange = input => {\n if (!isDisabled) {\n setValue(input);\n setIsCorrect(handleOnInputChange(index, input));\n }\n };\n\n const getInputClassName = () => {\n switch (inquiryState) {\n case INQUIRY_STATE.CORRECT:\n case INQUIRY_STATE.WRONG:\n return isCorrect ? 'correct-input' : 'wrong-input';\n case INQUIRY_STATE.SOLVED:\n return 'solved-input';\n default:\n return '';\n }\n };\n\n const baseInputClassName = `answer-input-cloze-${config.size} cloze-${clozeData.id} answer-input-cloze-element form-control onscreen-kb input-sm`;\n\n return (\n <>\n \n {!isDisabled && (\n \n )}\n >\n );\n};\n","import { useEffect, useState } from 'react';\nimport { createGlobalStyle } from 'styled-components';\nimport {\n cleanupAndAddPlaceholderComponents,\n createSingleSentenceAnswerContent,\n placeholderConfig,\n} from '../clozeExerciseUtils';\nimport { ExerciseRichText } from '../ExerciseRichText';\nimport { INQUIRY_STATE } from '../../workflow/inquiryState';\nimport { isNormalizedTextEqual } from '../../utils/exerciseUtils';\nimport { ClozeInput } from '../ClozeInput';\n\nconst WritingAnswerGlobalStyles = createGlobalStyle` \n /* @noflip */\n .alwaysLtr {\n text-align: left;\n direction: ltr;\n }\n`;\n\nexport const WritingAnswer = ({ inquiry, onChange, inquiryState, isDisabled }) => {\n const { subInquiries, clozeLayoutType, id } = inquiry;\n const scopeClassName = `inquiry_${id}`;\n\n const initialClozeWritingData = subInquiries.map(subInquiry => {\n return {\n ...subInquiry,\n userAnswer: '',\n };\n });\n\n const [clozeWritingData, setClozeWritingData] = useState(initialClozeWritingData);\n\n useEffect(() => {\n if (inquiryState === INQUIRY_STATE.SOLVED) {\n setClozeWritingData(\n subInquiries.map(subInquiry => ({\n ...subInquiry,\n userAnswer: subInquiry.alternatives[0].alternativeText,\n })),\n );\n }\n }, [inquiryState, subInquiries]);\n\n const handleOnInputChange = (index, value) => {\n const newData = [...clozeWritingData];\n // eslint-disable-next-line fp/no-mutation\n newData[index].userAnswer = value;\n setClozeWritingData(newData);\n onChange(\n newData.filter(answer =>\n isNormalizedTextEqual(answer.userAnswer, answer.alternatives[0].alternativeText),\n ).length,\n );\n\n return checkAnswer(index, value);\n };\n\n const checkAnswer = (index, value) =>\n isNormalizedTextEqual(value, clozeWritingData[index].alternatives[0].alternativeText);\n\n const createPlaceholder = (index, matchedElement) => {\n const clozeData = clozeWritingData[index];\n const config = placeholderConfig.find(entry => entry.size === matchedElement.innerText);\n return (\n \n );\n };\n\n const clozeLayoutTypeConfig = {\n CONTINUOUS_TEXT: {\n answerContent: () => cleanupAndAddPlaceholderComponents(inquiry.text),\n },\n SINGLE_SENTENCE: {\n answerContent: () =>\n cleanupAndAddPlaceholderComponents(\n createSingleSentenceAnswerContent(subInquiries, '
'),\n ),\n },\n };\n\n const selectedClozeLayoutConfig = clozeLayoutTypeConfig[clozeLayoutType];\n\n if (selectedClozeLayoutConfig == null) {\n return null;\n }\n\n const answerContent = selectedClozeLayoutConfig.answerContent();\n\n return (\n \n );\n};\n","import { useState } from 'react';\nimport { INQUIRY_STATE } from './inquiryState';\nimport { useExerciseProgress } from './ExerciseProgress';\n\nexport const useInquiryHandling = ({ inquiryId, achievableScore, subInquiries = 1 }) => {\n const [isSolveButtonDisabled, setSolveButtonDisabled] = useState(true);\n const [isCheckButtonDisabled, setCheckButtonDisabled] = useState(false);\n const [isMarkedAsDone, setMarkedAsDone] = useState(false);\n const [wrongAnswerCount, setWrongAnswerCount] = useState(0);\n const [inquiryState, setInquiryState] = useState(INQUIRY_STATE.INITIAL);\n\n const { addDoneInquiry, exerciseProgress } = useExerciseProgress();\n const { isFromPlacementCourse } = exerciseProgress;\n\n const isDisabled = () => {\n return (\n inquiryState === INQUIRY_STATE.CORRECT ||\n inquiryState === INQUIRY_STATE.SOLVED ||\n (inquiryState === INQUIRY_STATE.WRONG && isFromPlacementCourse)\n );\n };\n\n const disableAllButtons = () => {\n setCheckButtonDisabled(true);\n setSolveButtonDisabled(true);\n };\n\n const checkAndMarkAsDone = ({ score = 0 }) => {\n if (!isMarkedAsDone) {\n addDoneInquiry({ inquiryId, achievableScore, score });\n setMarkedAsDone(true);\n }\n };\n\n const handleCorrectAnswer = () => {\n setInquiryState(INQUIRY_STATE.CORRECT);\n checkAndMarkAsDone({ score: achievableScore });\n disableAllButtons();\n };\n\n const handleWrongAnswer = (correctSubInquiries = 0) => {\n setInquiryState(INQUIRY_STATE.WRONG);\n checkAndMarkAsDone({ score: (achievableScore * correctSubInquiries) / subInquiries });\n setWrongAnswerCount(wrongAnswerCount + 1);\n if (isFromPlacementCourse) setCheckButtonDisabled(true);\n setSolveButtonDisabled(false);\n };\n\n const handleSolved = () => {\n setInquiryState(INQUIRY_STATE.SOLVED);\n checkAndMarkAsDone({});\n disableAllButtons();\n };\n\n return {\n isSolveButtonDisabled,\n isCheckButtonDisabled,\n inquiryState,\n isDisabled,\n isFromPlacementCourse,\n handleCorrectAnswer,\n handleWrongAnswer,\n handleSolved,\n };\n};\n","import { useRef, useState } from 'react';\nimport { useParams } from 'react-router';\nimport {\n exerciseQuestionTypeSelector,\n LessonExerciseQuestion,\n} from '../LessonExerciseQuestion/LessonExerciseQuestion';\nimport { StyledSolveCheckButton } from '../../../SolveCheckButton/SolveCheckButton';\nimport { StyledPulldownAnswer } from './AnswerTypes/PulldownAnswer';\nimport { QUESTION_TYPES } from '../LessonExerciseQuestion/QuestionTypes/questionTypes';\nimport { LessonExerciseHint } from '../LessonExerciseHint/LessonExerciseHint';\nimport { ChooseAnswer } from './AnswerTypes/ChooseAnswer';\nimport { WritingAnswer } from './AnswerTypes/WritingAnswer';\nimport { useAudio } from '../../../../hooks/useAudio';\nimport { useInquiryHandling } from '../workflow/useInquiryHandling';\nimport { findFeedbackAudio } from '../../../../utils/audioUtils';\nimport { LessonExerciseHiddenAudio } from '../LessonExerciseHiddenAudio/LessonExerciseHiddenAudio';\n\nexport const ClozeExerciseRow = ({ inquiry, initiallyCorrectInquiries = 0 }) => {\n const { exerciseId } = useParams();\n const {\n audios,\n inquiryDescription,\n id: inquiryId,\n learningMetaInfo: { achievableScore },\n mainContentImage,\n } = inquiry;\n const { clozeType } = inquiry.subInquiries[0];\n\n const [correctSubInquiries, setCorrectSubInquiries] = useState(initiallyCorrectInquiries);\n const { playWrongDefaultAudioFeedBack, playCorrectDefaultAudioFeedBack } = useAudio();\n const isSolutionAudioFallbackMode = Boolean(mainContentImage);\n const feedbackAudio = findFeedbackAudio(isSolutionAudioFallbackMode, audios);\n const { target: answerAudio } = feedbackAudio || {};\n const { mp3Src: feedbackAudioUrl } = answerAudio || {};\n const feedbackAudioRef = useRef();\n\n const {\n isSolveButtonDisabled,\n isCheckButtonDisabled,\n handleCorrectAnswer,\n handleWrongAnswer,\n handleSolved,\n inquiryState,\n isDisabled,\n } = useInquiryHandling({ inquiryId, achievableScore, subInquiries: inquiry.subInquiries.length });\n\n const onChange = changeResult => {\n setCorrectSubInquiries(changeResult);\n };\n\n const onHandleSolveButtonClicked = () => {\n handleSolved();\n playCorrectAudioFeedBack();\n };\n\n const onHandleCheckButtonClicked = () => {\n if (correctSubInquiries === inquiry.subInquiries.length) {\n handleCorrectAnswer();\n playCorrectAudioFeedBack();\n } else {\n handleWrongAnswer(correctSubInquiries);\n playWrongDefaultAudioFeedBack();\n }\n };\n const playCorrectAudioFeedBack = () => {\n if (feedbackAudioUrl) {\n feedbackAudioRef.current.play();\n } else {\n playCorrectDefaultAudioFeedBack();\n }\n };\n const getAnswerComponent = () => {\n switch (clozeType) {\n case 'PULLDOWN':\n return (\n \n );\n case 'CHOOSE':\n return ;\n case 'WRITING':\n return ;\n default:\n return null;\n }\n };\n\n const questionType = exerciseQuestionTypeSelector({ inquiry });\n const answerComponent = getAnswerComponent();\n\n const lessonExerciseHintPartial = (\n \n );\n\n return (\n \n
\n {questionType === QUESTION_TYPES.TEXT && clozeType !== 'CHOOSE' ? (\n <>\n
\n \n \n {answerComponent}\n
\n {lessonExerciseHintPartial}\n >\n ) : (\n <>\n
\n \n \n
\n
{answerComponent}
\n {lessonExerciseHintPartial}\n >\n )}\n
\n
\n \n
\n
\n );\n};\n","import gql from 'graphql-tag';\nimport { AudioProvider } from '../../../../context/AudioContext';\nimport { LessonExerciseTextInput } from '../LessonExerciseTextInput/LessonExerciseTextInput';\nimport { ClozeExerciseRow } from './ClozeExerciseRow';\n\nexport const clozeExerciseFragment = {\n name: 'clozeExercise',\n fragment() {\n return gql`fragment ${this.name} on Inquiry {\n text\n clozeLayoutType\n subInquiries {\n clozeType\n }\n } \n `;\n },\n};\n\nexport const ClozeExercise = ({ data }) => {\n const { inputText, inquiries } = data.content;\n\n return (\n \n \n {inquiries.map(inquiry => (\n \n ))}\n \n );\n};\n","import { useState } from 'react';\nimport { useInquiryHandling } from '../workflow/useInquiryHandling';\nimport { KeyboardWrapper } from '../Keyboard/KeyboardWrapper';\nimport { TextAreaInput } from '../../../Input/TextAreaInput/TextAreaInput';\nimport { LessonExerciseQuestionAudio } from '../LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionAudio';\nimport { LessonExerciseHint } from '../LessonExerciseHint/LessonExerciseHint';\nimport { StyledSolveCheckButton } from '../../../SolveCheckButton/SolveCheckButton';\nimport { findQuestionAudio } from '../../../../utils/audioUtils';\nimport { useAudio } from '../../../../hooks/useAudio';\nimport { isNormalizedTextEqual } from '../utils/exerciseUtils';\n\nexport const DictationExerciseRow = ({ inquiry }) => {\n const [input, setInput] = useState('');\n\n const {\n inquiryDescription,\n audios,\n text: solutionText,\n learningMetaInfo: { achievableScore },\n id: inquiryId,\n } = inquiry;\n const questionAudio = findQuestionAudio(audios);\n\n const {\n isSolveButtonDisabled,\n isCheckButtonDisabled,\n inquiryState,\n handleCorrectAnswer,\n handleWrongAnswer,\n handleSolved,\n isDisabled,\n } = useInquiryHandling({ inquiryId, achievableScore });\n const { playWrongDefaultAudioFeedBack, playCorrectDefaultAudioFeedBack } = useAudio();\n\n const onSolveClicked = () => {\n setInput(solutionText);\n handleSolved();\n };\n const onCheckClicked = () => {\n if (isNormalizedTextEqual(solutionText, input)) {\n handleCorrectAnswer();\n playCorrectDefaultAudioFeedBack();\n } else {\n handleWrongAnswer();\n playWrongDefaultAudioFeedBack();\n }\n };\n\n const onChange = event => {\n const newInput = event.target.value;\n setInput(newInput);\n };\n\n return (\n \n
\n
\n \n
\n
\n \n {!isDisabled() && (\n \n )}\n
\n
\n \n
\n
\n
onCheckClicked()}\n handleSolveClicked={() => onSolveClicked()}\n isSolveButtonDisabled={isSolveButtonDisabled}\n isCheckButtonDisabled={isCheckButtonDisabled}\n />\n \n );\n};\n","import { DictationExerciseRow } from './DictationExerciseRow';\nimport { AudioProvider } from '../../../../context/AudioContext';\n\nexport const DictationExercise = ({ data }) => {\n const { inquiries } = data.content;\n\n return (\n \n {inquiries.map(inquiry => (\n \n ))}\n \n );\n};\n","export const INQUIRY_MEDIA_TYPE = Object.freeze({\n TEXT: 'TEXT',\n IMAGE: 'IMAGE',\n AUDIO: 'AUDIO',\n VIDEO: 'VIDEO',\n});\n","import { createGlobalStyle } from 'styled-components';\nimport classnames from 'classnames';\nimport { INQUIRY_MEDIA_TYPE } from '../../../../../constants/inquiryMediaTypes';\nimport { useFrontendConfig } from '../../../../../hooks/useFrontendConfig';\n\nconst ManyToManyAnswerGlobalStyles = createGlobalStyle` \n /* @noflip */\n .alwaysLtr {\n text-align: left;\n direction: ltr;\n }\n \n .pair-select-container .pairsToUse .left .btn {\n /* @noflip */\n float: left;\n /* @noflip */\n clear: left;\n }\n`;\n\nexport const ManyToManyAnswer = ({\n answer,\n answersBlocked,\n mediaType,\n isLeftAnswer = false,\n isMatched = false,\n onAnswerClicked,\n}) => {\n const answerText = isLeftAnswer ? answer.subInquiryText : answer.alternatives[0].alternativeText;\n const isImage = mediaType === INQUIRY_MEDIA_TYPE.IMAGE;\n const imagePairClass = isLeftAnswer ? 'image-pair-left ' : 'image-pair-right ';\n const basicClass = `btn ${isImage ? imagePairClass : ''}removeHover`;\n\n const { imageBasePath } = useFrontendConfig();\n const assignAnswerClass = (isSelected, currentSideAnswersBlocked) => {\n const isBlocked = currentSideAnswersBlocked ? 'waiting inactive' : '';\n const status = isSelected ? 'tapped' : isBlocked;\n return `${basicClass} ${status}`;\n };\n\n const assignMatchedAnswerClass = (isCorrectlyMatched, isSolved) => {\n if (isSolved) {\n return `${basicClass} solved`;\n }\n if (isCorrectlyMatched === null) {\n return basicClass;\n }\n const checkedStatus = isCorrectlyMatched ? 'correct solved' : 'wrong';\n return `${basicClass} ${checkedStatus}`;\n };\n\n return (\n \n \n {!isLeftAnswer && isImage ? (\n \n ) : (\n answerText\n )}\n \n );\n};\n","export const SHUFFLE_RIGHT_ANSWERS = 'SHUFFLE_RIGHT_ANSWERS';\nexport const MATCH_ANSWERS_PAIR = 'MATCH_ANSWERS_PAIR';\nexport const BLOCK_ANSWERS = 'BLOCK_ANSWERS';\nexport const RESET_MATCHED_ANSWERS_PAIR = 'RESET_MATCHED_ANSWERS_PAIR';\nexport const CHECK_ANSWERS = 'CHECK_ANSWERS';\nexport const SOLVE_ANSWERS = 'SOLVE_ANSWERS';\n\nexport const reducer = (state, action) => {\n const { selectedId, isLeft, selectedIndex, subInquiries, initialLeftAnswers } =\n action.payload || {};\n\n switch (action.type) {\n case SHUFFLE_RIGHT_ANSWERS: {\n // eslint-disable-next-line fp/no-mutating-methods\n const shuffledRightAnswers = [...state.rightAnswers].sort(() => 0.25 - Math.random());\n return {\n ...state,\n rightAnswers: shuffledRightAnswers,\n };\n }\n case MATCH_ANSWERS_PAIR: {\n const leftMatchedAnswer = state.leftAnswers.find(answer =>\n isLeft ? answer.id === selectedId : answer.isSelected,\n );\n const rightMatchedAnswer = state.rightAnswers.find(answer =>\n isLeft ? answer.isSelected : answer.alternatives[0].id === selectedId,\n );\n\n return {\n ...state,\n leftMatchedAnswers: [\n ...state.leftMatchedAnswers,\n {\n ...leftMatchedAnswer,\n isSelected: false,\n },\n ],\n rightMatchedAnswers: [\n ...state.rightMatchedAnswers,\n {\n ...rightMatchedAnswer,\n isSelected: false,\n },\n ],\n leftAnswers: state.leftAnswers.filter(answer => answer !== leftMatchedAnswer),\n rightAnswers: state.rightAnswers.filter(answer => answer !== rightMatchedAnswer),\n isLeftAnswerBlocked: false,\n isRightAnswerBlocked: false,\n };\n }\n case BLOCK_ANSWERS: {\n const answers = isLeft ? state.leftAnswers : state.rightAnswers;\n const updatedAnswers = answers.map(answer => {\n const isIdEqual = isLeft\n ? answer.id === selectedId\n : answer.alternatives[0].id === selectedId;\n return {\n ...answer,\n isSelected: isIdEqual && !answer.isSelected,\n };\n });\n\n return {\n ...state,\n leftAnswers: isLeft ? updatedAnswers : state.leftAnswers,\n rightAnswers: isLeft ? state.rightAnswers : updatedAnswers,\n isLeftAnswerBlocked: isLeft\n ? updatedAnswers.some(answer => answer.isSelected)\n : state.isLeftAnswerBlocked,\n isRightAnswerBlocked: isLeft\n ? state.isRightAnswerBlocked\n : updatedAnswers.some(answer => answer.isSelected),\n };\n }\n case RESET_MATCHED_ANSWERS_PAIR: {\n const leftMatchedAnswer = state.leftMatchedAnswers[selectedIndex];\n const rightMatchedAnswer = state.rightMatchedAnswers[selectedIndex];\n\n return {\n ...state,\n leftMatchedAnswers: state.leftMatchedAnswers.filter(\n matchedAnswer => matchedAnswer !== leftMatchedAnswer,\n ),\n rightMatchedAnswers: state.rightMatchedAnswers.filter(\n matchedAnswer => matchedAnswer !== rightMatchedAnswer,\n ),\n leftAnswers: [\n ...state.leftAnswers,\n {\n ...leftMatchedAnswer,\n isCorrectlyMatched: null,\n },\n ],\n rightAnswers: [\n ...state.rightAnswers,\n {\n ...rightMatchedAnswer,\n isCorrectlyMatched: null,\n },\n ],\n };\n }\n case CHECK_ANSWERS: {\n const updatedLeftMatchedAnswers = state.leftMatchedAnswers.map((matchedAnswer, index) => {\n return {\n ...matchedAnswer,\n isCorrectlyMatched: matchedAnswer.id === state.rightMatchedAnswers[index].id,\n };\n });\n\n const updatedRightMatchedAnswers = state.rightMatchedAnswers.map((matchedAnswer, index) => {\n return {\n ...matchedAnswer,\n isCorrectlyMatched: matchedAnswer.id === state.leftMatchedAnswers[index].id,\n };\n });\n\n const isAllMatchedCorrectly =\n updatedLeftMatchedAnswers.length === subInquiries.length &&\n updatedLeftMatchedAnswers.every(matchedAnswer => matchedAnswer.isCorrectlyMatched);\n\n return {\n ...state,\n leftMatchedAnswers: updatedLeftMatchedAnswers,\n rightMatchedAnswers: updatedRightMatchedAnswers,\n solvedWrongCounter: isAllMatchedCorrectly ? 0 : state.solvedWrongCounter + 1,\n isAllMatchedCorrectly,\n };\n }\n case SOLVE_ANSWERS: {\n const solvedMatchedAnswers = initialLeftAnswers.map(answer => {\n return {\n ...answer,\n isSolved: true,\n };\n });\n\n return {\n ...state,\n leftAnswers: [],\n rightAnswers: [],\n leftMatchedAnswers: solvedMatchedAnswers,\n rightMatchedAnswers: solvedMatchedAnswers,\n isSolvedCorrect: true,\n };\n }\n default:\n return state;\n }\n};\n","import { useEffect, useReducer } from 'react';\nimport { createGlobalStyle } from 'styled-components';\nimport { ManyToManyAnswer } from '../ManyToManyAnswer/ManyToManyAnswer';\nimport { I18nText } from '../../../../I18n/I18nText';\nimport {\n BLOCK_ANSWERS,\n CHECK_ANSWERS,\n SHUFFLE_RIGHT_ANSWERS,\n MATCH_ANSWERS_PAIR,\n reducer,\n RESET_MATCHED_ANSWERS_PAIR,\n SOLVE_ANSWERS,\n} from './manyToManyQuestionRowReducer';\nimport { LessonExerciseHint } from '../../LessonExerciseHint/LessonExerciseHint';\nimport { StyledSolveCheckButton } from '../../../../SolveCheckButton/SolveCheckButton';\nimport { useInquiryHandling } from '../../workflow/useInquiryHandling';\nimport { useAudio } from '../../../../../hooks/useAudio';\n\nconst ManyToManyQuetsionRowGlobalStyles = createGlobalStyle` \n /* @noflip */\n .alwaysLtr {\n text-align: left;\n direction: ltr;\n }\n \n /* @noflip */\n .pair-select-container .pairsToUse.used .right .btn {\n float: left;\n clear: left;\n }\n`;\n\nexport const ManyToManyQuestionRow = ({ inquiry }) => {\n const {\n id: inquiryId,\n inquiryText,\n inquiryDescription,\n subInquiries,\n mediaType,\n learningMetaInfo: { achievableScore },\n } = inquiry;\n const initialLeftAnswers = subInquiries.map(subInquiry => {\n return {\n ...subInquiry,\n isSelected: false,\n isCorrectlyMatched: null,\n isSolved: false,\n };\n });\n\n const [state, dispatch] = useReducer(reducer, {\n isLeftAnswerBlocked: false,\n isRightAnswerBlocked: false,\n leftAnswers: initialLeftAnswers,\n rightAnswers: initialLeftAnswers,\n leftMatchedAnswers: [],\n rightMatchedAnswers: [],\n isAllMatchedCorrectly: false,\n solvedWrongCounter: 0,\n isSolvedCorrect: false,\n });\n\n const {\n isSolveButtonDisabled,\n isCheckButtonDisabled,\n handleCorrectAnswer,\n handleWrongAnswer,\n handleSolved,\n isFromPlacementCourse,\n } = useInquiryHandling({\n inquiryId,\n achievableScore,\n });\n const { playWrongDefaultAudioFeedBack, playCorrectDefaultAudioFeedBack } = useAudio();\n\n useEffect(() => {\n if (state.isAllMatchedCorrectly) {\n handleCorrectAnswer();\n playCorrectDefaultAudioFeedBack();\n }\n if (state.isSolvedCorrect) {\n handleSolved();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.isAllMatchedCorrectly, state.isSolvedCorrect]);\n\n useEffect(() => {\n if (state.solvedWrongCounter > 0) {\n handleWrongAnswer();\n playWrongDefaultAudioFeedBack();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.solvedWrongCounter]);\n\n useEffect(() => {\n dispatch({\n type: SHUFFLE_RIGHT_ANSWERS,\n });\n }, []);\n\n const onAnswerClicked = (e, selectedId, isLeft) => {\n e.preventDefault();\n const isAnswerBlocked = isLeft ? state.isRightAnswerBlocked : state.isLeftAnswerBlocked;\n if (isAnswerBlocked || (state.solvedWrongCounter > 0 && isFromPlacementCourse)) {\n dispatch({\n type: MATCH_ANSWERS_PAIR,\n payload: {\n selectedId,\n isLeft,\n },\n });\n } else {\n dispatch({\n type: BLOCK_ANSWERS,\n payload: {\n selectedId,\n isLeft,\n },\n });\n }\n };\n\n const onMatchedAnswerClicked = (e, selectedIndex) => {\n e.preventDefault();\n if (\n state.leftMatchedAnswers[selectedIndex].isCorrectlyMatched ||\n state.leftMatchedAnswers[selectedIndex].isSolved ||\n (state.solvedWrongCounter > 0 && isFromPlacementCourse)\n ) {\n return;\n }\n\n dispatch({\n type: RESET_MATCHED_ANSWERS_PAIR,\n payload: {\n selectedIndex,\n },\n });\n };\n\n const onCheckClicked = e => {\n e.preventDefault();\n dispatch({\n type: CHECK_ANSWERS,\n payload: {\n subInquiries,\n },\n });\n };\n\n const onSolveClicked = e => {\n e.preventDefault();\n dispatch({\n type: SOLVE_ANSWERS,\n payload: {\n initialLeftAnswers,\n },\n });\n };\n\n return (\n \n
\n
\n
{inquiryText}
\n
\n
\n
\n {state.leftAnswers.map(answer => (\n onAnswerClicked(e, answer.id, true)}\n />\n ))}\n
\n
\n {state.rightAnswers.map(answer => (\n onAnswerClicked(e, answer.alternatives[0].id, false)}\n />\n ))}\n
\n
\n
\n
\n
\n {state.leftMatchedAnswers.map((matchedAnswer, index) => (\n onMatchedAnswerClicked(e, index)}\n />\n ))}\n
\n
\n {state.rightMatchedAnswers.map((matchedAnswer, index) => (\n onMatchedAnswerClicked(e, index)}\n />\n ))}\n
\n
\n
\n
\n {inquiryDescription && (\n
\n \n
\n )}\n
onSolveClicked(e)}\n handleCheckClicked={e => onCheckClicked(e)}\n />\n \n );\n};\n","/* eslint-disable jsx-a11y/media-has-caption */\nimport { useParams } from 'react-router';\nimport { ManyToManyQuestionRow } from './ManyToManyQuestionRow/ManyToManyQuestionRow';\nimport { LessonExerciseTextInput } from '../LessonExerciseTextInput/LessonExerciseTextInput';\nimport { AudioProvider } from '../../../../context/AudioContext';\n\nexport const ManyToManyExercise = ({ data }) => {\n const { exerciseId } = useParams();\n const { inputText, inquiries } = data.content;\n\n return (\n \n \n \n {inquiries.map(inquiry => (\n \n ))}\n
\n \n );\n};\n","export const ANSWER_STATE = Object.freeze({\n INITIAL: 'initial',\n SELECTED: 'selected',\n WRONG: 'wrong',\n CORRECT: 'correct',\n SOLVED: 'solved',\n});\n","/* eslint-disable jsx-a11y/role-supports-aria-props */\nimport { forwardRef } from 'react';\nimport { createGlobalStyle } from 'styled-components';\nimport { ANSWER_STATE } from '../answerState';\n\nconst LessonExerciseTextAnswerGlobalStyles = createGlobalStyle` \n /* @noflip */\n .alwaysLtr {\n text-align: left;\n direction: ltr;\n }\n`;\n\nexport const LessonExerciseTextAnswer = forwardRef(({ answer, handleAnswerClicked }, ref) => {\n const assignAnswerAriaLabel = ({ answerState }) => {\n switch (answerState) {\n case ANSWER_STATE.INITIAL:\n return 'Not selected';\n case ANSWER_STATE.SOLVED:\n case ANSWER_STATE.SELECTED:\n return 'Selected';\n case ANSWER_STATE.CORRECT:\n return 'Correct';\n case ANSWER_STATE.WRONG:\n return 'Wrong';\n default:\n // eslint-disable-next-line fp/no-throw\n throw new Error('invalid answerState');\n }\n };\n\n const getAnswerClass = ({ answerState }) => {\n switch (answerState) {\n case ANSWER_STATE.INITIAL:\n return '';\n case ANSWER_STATE.SELECTED:\n return 'selected';\n case ANSWER_STATE.CORRECT:\n return 'correct';\n case ANSWER_STATE.WRONG:\n return 'wrong';\n case ANSWER_STATE.SOLVED:\n return 'solved';\n default:\n // eslint-disable-next-line fp/no-throw\n throw new Error('invalid answerState');\n }\n };\n\n return (\n \n \n \n {answer.alternativeText}\n
\n \n );\n});\n","/* eslint-disable jsx-a11y/role-supports-aria-props */\nimport { forwardRef } from 'react';\nimport { ANSWER_STATE } from '../answerState';\nimport { useFrontendConfig } from '../../../../../hooks/useFrontendConfig';\n\nexport const LessonExerciseImageAnswer = forwardRef(({ answer, handleAnswerClicked }, ref) => {\n const { imageBasePath } = useFrontendConfig();\n\n const assignAnswerClass = ({ answerState }) => {\n switch (answerState) {\n case ANSWER_STATE.INITIAL:\n return '';\n case ANSWER_STATE.SELECTED:\n return 'selected-image';\n case ANSWER_STATE.CORRECT:\n return 'correct-image';\n case ANSWER_STATE.WRONG:\n return 'wrong-image';\n case ANSWER_STATE.SOLVED:\n return 'solved-image';\n default:\n // eslint-disable-next-line fp/no-throw\n throw new Error('invalid answerState');\n }\n };\n\n return (\n \n \n \n );\n});\n","import gql from 'graphql-tag';\nimport { INQUIRY_MEDIA_TYPE } from '../../../../constants/inquiryMediaTypes';\nimport { LessonExerciseTextAnswer } from './LessonExerciseTextAnswer/LessonExerciseTextAnswer';\nimport { LessonExerciseImageAnswer } from './LessonExerciseImageAnswer/LessonExerciseImageAnswer';\n\nexport const lessonExerciseAnswerFragment = {\n name: 'LessonExerciseAnswer',\n fragment() {\n return gql`fragment ${this.name} on Inquiry {\n subInquiries {\n id\n subInquiryText: inquiryText\n subInquiryDescription: inquiryDescription\n images {\n id\n }\n alternatives {\n id\n alternativeText\n isCorrect\n images {\n id\n }\n }\n }\n } \n `;\n },\n};\n\nexport const ExerciseAnswer = ({ answerMediaType, answer, index, onAnswerClicked, addRef }) => {\n const Component =\n answerMediaType === INQUIRY_MEDIA_TYPE.TEXT.toLowerCase()\n ? LessonExerciseTextAnswer\n : LessonExerciseImageAnswer;\n return (\n onAnswerClicked(e, index)}\n ref={ref => {\n addRef(index, ref);\n }}\n />\n );\n};\n","import { useEffect, useRef } from 'react';\n\nexport const useIsMountedRef = () => {\n const isMountedRef = useRef(false);\n\n const setMounted = isMounted => {\n // eslint-disable-next-line fp/no-mutation\n isMountedRef.current = isMounted;\n };\n\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n });\n\n return isMountedRef;\n};\n","import { useEffect, useRef, useState } from 'react';\nimport { LessonExerciseHint } from '../LessonExerciseHint/LessonExerciseHint';\nimport { LessonExerciseQuestion } from '../LessonExerciseQuestion/LessonExerciseQuestion';\nimport { StyledSolveCheckButton } from '../../../SolveCheckButton/SolveCheckButton';\nimport { useInquiryHandling } from '../workflow/useInquiryHandling';\nimport { ANSWER_STATE } from '../LessonExerciseAnswer/answerState';\nimport { useAudio } from '../../../../hooks/useAudio';\nimport { findFeedbackAudio } from '../../../../utils/audioUtils';\nimport { LessonExerciseHiddenAudio } from '../LessonExerciseHiddenAudio/LessonExerciseHiddenAudio';\nimport { ExerciseAnswer } from '../LessonExerciseAnswer/ExerciseAnswer';\nimport { useIsMountedRef } from '../../../../hooks/useIsMountedRef';\n\nexport const MultiSelectionQuestionRow = ({ inquiry, exerciseId }) => {\n const {\n id: inquiryId,\n inquiryDescription,\n audios,\n subInquiries,\n mediaType,\n mainContentImage,\n learningMetaInfo: { achievableScore },\n } = inquiry;\n const isSolutionAudioFallbackMode = Boolean(mainContentImage);\n const correctAnswerAudio = findFeedbackAudio(isSolutionAudioFallbackMode, audios);\n const { target: answerAudio } = correctAnswerAudio || {};\n const { mp3Src: correctAnswerAudioUrl } = answerAudio || {};\n const { alternatives } = subInquiries[0];\n const answersRefArray = [];\n const answerMediaType = mediaType.toLowerCase();\n\n const [answersFrozen, setAnswersFrozen] = useState(false);\n const [answers, setAnswers] = useState(\n alternatives.map(alternative => {\n return {\n ...alternative,\n answerState: ANSWER_STATE.INITIAL,\n };\n }),\n );\n const {\n isSolveButtonDisabled,\n isCheckButtonDisabled,\n handleCorrectAnswer,\n handleWrongAnswer,\n handleSolved,\n isFromPlacementCourse,\n } = useInquiryHandling({\n inquiryId,\n achievableScore,\n });\n\n const { playWrongDefaultAudioFeedBack, playCorrectDefaultAudioFeedBack } = useAudio();\n const correctAnswerAudioRef = useRef();\n const answersRef = useRef(answers);\n const isMountedRef = useIsMountedRef();\n\n useEffect(() => {\n // eslint-disable-next-line fp/no-mutation\n answersRef.current = answers;\n });\n\n const selectOrUnselectAnswer = chosenAnswerIndex => {\n const updatedAnswers = answers.map((answer, index) => {\n if (index !== chosenAnswerIndex) {\n return answer;\n }\n const newAnswerState =\n answer.answerState === ANSWER_STATE.SELECTED ? ANSWER_STATE.INITIAL : ANSWER_STATE.SELECTED;\n return {\n ...answer,\n answerState: newAnswerState,\n };\n });\n setAnswers(updatedAnswers);\n };\n\n const isSolvedCorrectly = checkedAnswers => {\n const unsolvedOrWrongAnswers = checkedAnswers.filter(answer => {\n const { answerState, isCorrect } = answer;\n return (\n answerState === ANSWER_STATE.WRONG || (answerState === ANSWER_STATE.INITIAL && isCorrect)\n );\n });\n return unsolvedOrWrongAnswers.length === 0;\n };\n\n const updateAnswers = (answersToUpdate, answerStateEvalFn, skipAnswerConditionalFn) => {\n const updatedAnswers = answersToUpdate.map(answer => {\n if (skipAnswerConditionalFn && skipAnswerConditionalFn(answer) === true) {\n return answer;\n }\n return {\n ...answer,\n answerState: answerStateEvalFn(answer),\n };\n });\n setAnswers(updatedAnswers);\n return updatedAnswers;\n };\n\n const playSuccessAudio = () => {\n if (correctAnswerAudioUrl) {\n correctAnswerAudioRef.current.play();\n } else {\n playCorrectDefaultAudioFeedBack();\n }\n };\n\n const addRef = (index, ref) => {\n // eslint-disable-next-line fp/no-mutation\n answersRefArray[index] = ref;\n };\n\n const onAnswerClicked = (e, chosenAnswerIndex) => {\n e.preventDefault();\n if (answersFrozen) {\n return;\n }\n answersRefArray[chosenAnswerIndex].blur();\n selectOrUnselectAnswer(chosenAnswerIndex);\n };\n\n const onHandleSolveButtonClicked = () => {\n handleSolved();\n playSuccessAudio();\n updateAnswers(answers, answer =>\n answer.isCorrect ? ANSWER_STATE.SOLVED : ANSWER_STATE.INITIAL,\n );\n setAnswersFrozen(true);\n };\n\n const onHandleCheckButtonClicked = () => {\n const checkedAnswers = updateAnswers(\n answers,\n answer => (answer.isCorrect ? ANSWER_STATE.CORRECT : ANSWER_STATE.WRONG),\n answer => answer.answerState !== ANSWER_STATE.SELECTED,\n );\n\n if (isSolvedCorrectly(checkedAnswers)) {\n handleCorrectAnswer();\n playSuccessAudio();\n setAnswersFrozen(true);\n } else {\n handleWrongAnswer();\n if (isFromPlacementCourse) setAnswersFrozen(true);\n playWrongDefaultAudioFeedBack();\n setTimeout(() => {\n if (isMountedRef.current) {\n updateAnswers(answersRef.current, answer =>\n answer.answerState === ANSWER_STATE.WRONG && !isFromPlacementCourse\n ? ANSWER_STATE.INITIAL\n : answer.answerState,\n );\n }\n }, 3000);\n }\n };\n\n return (\n \n
\n
\n \n
\n
\n
\n {answers.map((answer, index) => (\n \n ))}\n
\n
\n
\n
\n \n
\n
\n {correctAnswerAudioUrl && (\n
\n )}\n
\n );\n};\n","import { LessonExerciseTextInput } from '../LessonExerciseTextInput/LessonExerciseTextInput';\nimport { MultiSelectionQuestionRow } from './MultiSelectionQuestionRow';\nimport { AudioProvider } from '../../../../context/AudioContext';\n\nexport const MultiSelectionExercise = ({ data }) => {\n const { id, inputText, inquiries } = data.content;\n\n return (\n \n \n {inquiries.map(inquiry => (\n \n ))}\n \n );\n};\n","/* eslint-disable jsx-a11y/aria-role */\nimport { useTranslation } from '../../../../../hooks/useTranslation';\n\nexport const SelfAssessmentAnswer = ({ answer, handleAnswerClicked }) => {\n const { index, isSelected, label } = answer;\n const answerLabel = useTranslation(label);\n\n return (\n <>\n \n {answerLabel}
\n \n >\n );\n};\n","import { I18nText } from '../../../../I18n/I18nText';\nimport { LessonExerciseQuestionAudio } from '../../LessonExerciseQuestion/QuestionTypes/LessonExerciseQuestionAudio';\nimport { findFeedbackAudio } from '../../../../../utils/audioUtils';\nimport { useTranslation } from '../../../../../hooks/useTranslation';\nimport { useRtlContext } from '../../../../../hooks/useRtl';\n\nexport const SelfAssessmentQuestion = ({ audios, mainContentImage }) => {\n const { isRtl } = useRtlContext();\n\n const howWasItWithOnlyFeedbackAudio = useTranslation('exercise.howWasItWithOnlyFeedbackAudio');\n const howWasItLabel = useTranslation('exercise.howWasIt');\n\n const isSolutionAudioFallbackMode = Boolean(mainContentImage);\n const feedbackAudio = findFeedbackAudio(isSolutionAudioFallbackMode, audios);\n\n const feedbackAudioUrl = feedbackAudio ? feedbackAudio.target.mp3Src : null;\n\n const lessonExerciseQuestionAudio = () => {\n const hasOnlyFeedbackAudio =\n feedbackAudioUrl.includes('Loesungsaudio.mp3') && audios.length === 1;\n const audioLabel = hasOnlyFeedbackAudio ? howWasItWithOnlyFeedbackAudio : howWasItLabel;\n return ;\n };\n\n return (\n \n {feedbackAudioUrl ? (\n lessonExerciseQuestionAudio()\n ) : (\n
\n \n
\n )}\n
\n );\n};\n","import { useState } from 'react';\nimport { SelfAssessmentAnswer } from './SelfAssessmentAnswer';\nimport { SelfAssessmentQuestion } from './SelfAssessmentQuestion';\nimport { useInquiryHandling } from '../../workflow/useInquiryHandling';\n\nexport const SelfAssessment = ({ inquiry }) => {\n const {\n audios,\n mainContentImage,\n learningMetaInfo: { achievableScore },\n id: inquiryId,\n } = inquiry;\n const fixedAnswers = [\n { label: 'exercise.02', index: 1, isSelected: false },\n { label: 'exercise.01', index: 0, isSelected: false },\n ];\n\n const { handleCorrectAnswer, handleWrongAnswer } = useInquiryHandling({\n inquiryId,\n achievableScore,\n });\n\n const [answersFrozen, setAnswersFrozen] = useState(false);\n const [answers, setSelected] = useState(fixedAnswers);\n\n const updateSelected = selectedIndex => {\n const updatedAnswers = answers.map((answer, index) => {\n return {\n ...answer,\n isSelected: index === selectedIndex ? true : answer.isSelected,\n };\n });\n\n setSelected(updatedAnswers);\n };\n\n const evaluateAnswer = selectedIndex => {\n if (selectedIndex === 0) {\n handleCorrectAnswer();\n } else {\n handleWrongAnswer();\n }\n };\n\n const onAnswerClicked = (e, index) => {\n e.preventDefault();\n\n if (answersFrozen) {\n return;\n }\n\n evaluateAnswer(index);\n updateSelected(index);\n setAnswersFrozen(true);\n };\n\n return (\n \n
\n
\n
\n
\n {answers.map((answer, index) => (\n onAnswerClicked(e, index)}\n />\n ))}\n
\n
\n
\n
\n );\n};\n","import { createGlobalStyle } from 'styled-components';\nimport { LessonExerciseHint } from '../LessonExerciseHint/LessonExerciseHint';\nimport { LessonExerciseQuestion } from '../LessonExerciseQuestion/LessonExerciseQuestion';\nimport { SelfAssessment } from './SelfAssessment/SelfAssessment';\n\nexport const RepeatExerciseRowGlobalStyles = createGlobalStyle`\n /* @noflip */\n .answer {\n direction: ltr;\n text-align: left;\n }\n`;\n\nexport const RepeatExerciseRow = ({ inquiry }) => {\n const { inquiryDescription, subInquiries } = inquiry;\n const { subInquiryDescription } = subInquiries[0];\n\n return (\n <>\n \n
\n
\n \n
\n
\n
\n {subInquiryDescription &&
{subInquiryDescription}
}\n
\n
\n
\n \n \n >\n );\n};\n","import { AudioProvider } from '../../../../context/AudioContext';\nimport { LessonExerciseTextInput } from '../LessonExerciseTextInput/LessonExerciseTextInput';\nimport { RepeatExerciseRow } from './RepeatExerciseRow';\n\nexport const RepeatExercise = ({ data }) => {\n const { inputText, inquiries } = data.content;\n return (\n \n \n {inquiries.map(inquiry => (\n \n ))}\n \n );\n};\n","import { useEffect, useRef, useState } from 'react';\nimport { LessonExerciseHiddenAudio } from '../../LessonExerciseHiddenAudio/LessonExerciseHiddenAudio';\nimport { LessonExerciseHint } from '../../LessonExerciseHint/LessonExerciseHint';\nimport { LessonExerciseQuestion } from '../../LessonExerciseQuestion/LessonExerciseQuestion';\nimport { findFeedbackAudio } from '../../../../../utils/audioUtils';\nimport { useAudio } from '../../../../../hooks/useAudio';\nimport { useInquiryHandling } from '../../workflow/useInquiryHandling';\nimport { ANSWER_STATE } from '../../LessonExerciseAnswer/answerState';\nimport { ExerciseAnswer } from '../../LessonExerciseAnswer/ExerciseAnswer';\nimport { useIsMountedRef } from '../../../../../hooks/useIsMountedRef';\n\nexport const SingleSelectionQuestionRow = ({ exerciseId, inquiry }) => {\n const {\n id: inquiryId,\n inquiryDescription,\n audios,\n subInquiries,\n mainContentImage,\n learningMetaInfo: { achievableScore },\n } = inquiry;\n const isSolutionAudioFallbackMode = Boolean(mainContentImage);\n const correctAnswerAudio = findFeedbackAudio(isSolutionAudioFallbackMode, audios);\n const { target: answerAudio } = correctAnswerAudio || {};\n const { mp3Src: correctAnswerAudioUrl } = answerAudio || {};\n const { alternatives } = subInquiries[0];\n const answerMediaType = inquiry.mediaType.toLowerCase();\n const answersRefArray = [];\n\n const [answersFrozen, setAnswersFrozen] = useState(false);\n const [answers, setAnswers] = useState(\n alternatives.map(alternative => {\n return {\n ...alternative,\n answerState: ANSWER_STATE.INITIAL,\n };\n }),\n );\n const { playWrongDefaultAudioFeedBack, playCorrectDefaultAudioFeedBack } = useAudio();\n const correctAnswerAudioRef = useRef();\n const answersRef = useRef(answers);\n const { handleCorrectAnswer, handleWrongAnswer, isFromPlacementCourse } = useInquiryHandling({\n inquiryId,\n achievableScore,\n });\n const isMountedRef = useIsMountedRef();\n\n useEffect(() => {\n // eslint-disable-next-line fp/no-mutation\n answersRef.current = answers;\n });\n\n const getAnswerState = ({ index, chosenAnswerIndex, selectCurrentAnswer, answer }) => {\n const { answerState, isCorrect } = answer;\n if (index === chosenAnswerIndex) {\n if (selectCurrentAnswer) {\n return isCorrect ? ANSWER_STATE.CORRECT : ANSWER_STATE.WRONG;\n }\n return ANSWER_STATE.INITIAL;\n }\n return answerState;\n };\n\n const updateAnswers = (chosenAnswerIndex, selectCurrentAnswer) => {\n const answersCopy = selectCurrentAnswer ? [...answers] : [...answersRef.current];\n const updatedAnswers = answersCopy.map((answer, index) => {\n return {\n ...answer,\n answerState: getAnswerState({ index, chosenAnswerIndex, selectCurrentAnswer, answer }),\n };\n });\n setAnswers(updatedAnswers);\n };\n\n const addRef = (index, ref) => {\n // eslint-disable-next-line fp/no-mutation\n answersRefArray[index] = ref;\n };\n\n const onAnswerClicked = (e, chosenAnswerIndex) => {\n e.preventDefault();\n answersRefArray[chosenAnswerIndex].blur();\n if (answersFrozen) {\n return;\n }\n updateAnswers(chosenAnswerIndex, true);\n\n if (answers[chosenAnswerIndex].isCorrect) {\n handleCorrectAnswer();\n setAnswersFrozen(true);\n if (correctAnswerAudioUrl) {\n correctAnswerAudioRef.current.play();\n } else {\n playCorrectDefaultAudioFeedBack();\n }\n } else {\n handleWrongAnswer();\n if (isFromPlacementCourse) setAnswersFrozen(true);\n playWrongDefaultAudioFeedBack();\n setTimeout(() => {\n if (isMountedRef.current) {\n updateAnswers(chosenAnswerIndex, isFromPlacementCourse);\n }\n }, 3000);\n }\n };\n\n return (\n \n
\n
\n \n
\n
\n
\n {answers.map((answer, index) => (\n \n ))}\n
\n
\n
\n
\n {correctAnswerAudioUrl && (\n
\n )}\n
\n );\n};\n","import { SingleSelectionQuestionRow } from './SingleSelectionQuestionRow/SingleSelectionQuestionRow';\nimport { LessonExerciseTextInput } from '../LessonExerciseTextInput/LessonExerciseTextInput';\nimport { AudioProvider } from '../../../../context/AudioContext';\n\nexport const SingleSelectionExercise = ({ data }) => {\n const { id, inputText, inquiries } = data.content;\n\n return (\n \n \n {inquiries.map(inquiry => (\n \n ))}\n \n );\n};\n","/* eslint-disable jsx-a11y/anchor-is-valid,jsx-a11y/aria-role */\nimport gql from 'graphql-tag';\nimport { useRef, useState, useEffect } from 'react';\nimport { createGlobalStyle } from 'styled-components';\nimport { useFrontendConfig } from '../../../../hooks/useFrontendConfig';\nimport { LessonExerciseQuestion } from '../LessonExerciseQuestion/LessonExerciseQuestion';\nimport { LessonExerciseHint } from '../LessonExerciseHint/LessonExerciseHint';\nimport { LessonExerciseHiddenAudio } from '../LessonExerciseHiddenAudio/LessonExerciseHiddenAudio';\nimport { StyledSolveCheckButton } from '../../../SolveCheckButton/SolveCheckButton';\nimport { INQUIRY_MEDIA_TYPE } from '../../../../constants/inquiryMediaTypes';\nimport { findFeedbackAudio } from '../../../../utils/audioUtils';\nimport { shuffle, sortObjectsByProp } from '../../../../utils/commons';\nimport { useInquiryHandling } from '../workflow/useInquiryHandling';\nimport { useAudio } from '../../../../hooks/useAudio';\nimport { INQUIRY_STATE } from '../workflow/inquiryState';\n\nexport const sortingExerciseFragment = {\n name: 'SortingExercise',\n fragment() {\n return gql`fragment ${this.name} on Inquiry {\n alternatives {\n id \n order\n alternativeText\n contentLinks {\n targetId\n }\n }\n } \n `;\n },\n};\n\nconst SortingExerciseRowAnswerGlobalStyles = createGlobalStyle` \n /* @noflip */\n .dotted-outline {\n text-align: left;\n direction: ltr;\n }\n`;\n\nexport const SortingExerciseRow = ({ inquiry }) => {\n const {\n alternatives,\n audios,\n id: inquiryId,\n inquiryDescription,\n mainContentImage,\n learningMetaInfo: { achievableScore },\n } = inquiry;\n const answerType = inquiry.mediaType.toLowerCase();\n\n const isSolutionAudioFallbackMode = Boolean(mainContentImage);\n const feedbackAudio = findFeedbackAudio(isSolutionAudioFallbackMode, audios);\n const { target: answerAudio } = feedbackAudio || {};\n const { mp3Src: feedbackAudioUrl } = answerAudio || {};\n const { imageBasePath } = useFrontendConfig();\n\n const feedbackAudioRef = useRef();\n const { playWrongDefaultAudioFeedBack, playCorrectDefaultAudioFeedBack } = useAudio();\n\n const {\n isSolveButtonDisabled,\n isCheckButtonDisabled,\n handleCorrectAnswer,\n handleWrongAnswer,\n handleSolved,\n inquiryState,\n isDisabled,\n } = useInquiryHandling({ inquiryId, achievableScore });\n\n const [choosenAnswers, setChoosenAnswers] = useState([]);\n const [selectableAnswers, setSelectableAnswers] = useState(alternatives);\n\n useEffect(() => {\n setSelectableAnswers(answers =>\n shuffle(answers.slice(0)).map(alternative => {\n return {\n ...alternative,\n isSelected: false,\n };\n }),\n );\n }, []);\n\n const isCorrectOrder = (value, index) => value.order === index + 1;\n\n const isDuplicatedValue = (value, index) =>\n value.alternativeText === alternatives[index].alternativeText;\n\n const isCorrect =\n choosenAnswers.length &&\n choosenAnswers.every(\n (value, index) => isCorrectOrder(value, index) || isDuplicatedValue(value, index),\n );\n\n const playCorrectAudio = () =>\n feedbackAudioUrl ? feedbackAudioRef.current.play() : playCorrectDefaultAudioFeedBack();\n\n const onHandleSolveButtonClicked = () => {\n setChoosenAnswers(sortObjectsByProp(alternatives, 'order'));\n setSelectableAnswers([]);\n playCorrectAudio();\n handleSolved();\n };\n\n const onHandleCheckButtonClicked = () => {\n if (isCorrect) {\n handleCorrectAnswer();\n playCorrectAudio();\n } else {\n handleWrongAnswer();\n playWrongDefaultAudioFeedBack();\n }\n };\n\n const onAnswerClicked = (e, selectedAnswer) => {\n e.preventDefault();\n if (isDisabled()) {\n return;\n }\n\n const updateSelection = {\n ...selectedAnswer,\n isSelected: !selectedAnswer.isSelected,\n };\n\n if (selectedAnswer.isSelected) {\n setSelectableAnswers(currentSelectableAnswers => [\n updateSelection,\n ...currentSelectableAnswers,\n ]);\n setChoosenAnswers(choosenAnswers.filter(answer => answer.id !== updateSelection.id));\n } else {\n setChoosenAnswers(currentChoosenAnswers => [...currentChoosenAnswers, updateSelection]);\n setSelectableAnswers(selectableAnswers.filter(answer => answer.id !== updateSelection.id));\n }\n };\n\n const getAnswerLink = (type, answer) => {\n const { alternativeText, contentLinks } = answer;\n const answerID = answer.id;\n const isInquiryMediaTypeText = type === INQUIRY_MEDIA_TYPE.TEXT.toLowerCase();\n const classType = isInquiryMediaTypeText ? 'btn' : 'image';\n const answerContent = isInquiryMediaTypeText ? (\n alternativeText\n ) : (\n \n );\n\n return (\n onAnswerClicked(e, answer)}\n href=\"#\"\n className={`btn answer-sorting-${classType} alwaysLtr`}\n aria-selected={answer.isSelected}\n data-exercise-answer-id={answerID}\n >\n \n {answerContent}\n \n );\n };\n\n function getFeedbackClass() {\n switch (inquiryState) {\n case INQUIRY_STATE.WRONG:\n return 'wrong-outline';\n case INQUIRY_STATE.CORRECT:\n return 'correct-outline';\n case INQUIRY_STATE.SOLVED:\n case INQUIRY_STATE.INITIAL:\n default:\n return '';\n }\n }\n return (\n <>\n \n
\n
\n \n \n
\n
\n
\n
\n {choosenAnswers.map(answer => getAnswerLink(answerType, answer))}\n
\n
\n
\n {selectableAnswers.map(answer => getAnswerLink(answerType, answer))}\n
\n
\n
\n
\n \n \n \n
\n >\n );\n};\n","import { AudioProvider } from '../../../../context/AudioContext';\nimport { LessonExerciseTextInput } from '../LessonExerciseTextInput/LessonExerciseTextInput';\nimport { SortingExerciseRow } from './SortingExerciseRow';\n\nexport const SortingExercise = ({ data }) => {\n const { inputText, inquiries } = data.content;\n return (\n \n \n {inquiries.map(inquiry => (\n \n ))}\n \n );\n};\n","import { Prompt } from 'react-router-dom';\nimport { useBeforeunload } from 'react-beforeunload';\nimport { useTranslation } from '../../../../hooks/useTranslation';\nimport { isPathInExerciseNavigationWhiteList } from '../../../../utils/url/urlUtils';\n\nexport const ExerciseLeavingPrompt = () => {\n useBeforeunload(event => {\n event.preventDefault();\n });\n\n const leaveMessage = useTranslation('client.exercise.interrupt');\n return (\n {\n if (action === 'POP') {\n return leaveMessage;\n }\n return isPathInExerciseNavigationWhiteList(location.pathname) ? true : leaveMessage;\n }}\n />\n );\n};\n","import { ContentNavTitle } from './ContentNavTitle/ContentNavTitle';\n\nexport const ContentContainer = ({ title, children }) => (\n \n \n {children}\n \n
\n);\n","export const ContentBottomLine = () => (\n \n);\n","import styled from 'styled-components';\nimport { useRef } from 'react';\nimport { useToggle } from '../../hooks/useToggle';\nimport { StyledToggleableArrow as ToggleableArrow } from '../ToggleableArrow/ToggleableArrow';\nimport { colors } from '../../utils/css';\nimport { useTranslation } from '../../hooks/useTranslation';\n\nexport const AccordionContainer = ({ title, children, className }) => {\n const titleTranslation = useTranslation(title);\n\n return (\n \n \n \n
\n {titleTranslation}\n \n \n \n \n {children}\n \n \n );\n};\n\nexport const AccordionContainerContent = styled.div`\n overflow: hidden;\n background-color: ${colors.LG_WHITE};\n transition: max-height 0.7s;\n margin-bottom: 20px;\n`;\n\nexport const StyledAccordionContainer = styled(AccordionContainer)`\n button {\n outline: none;\n padding: 0;\n display: flex;\n position: relative;\n cursor: pointer;\n border: none;\n background-color: ${colors.LG_WHITE};\n width: 10em;\n }\n .toggleable-arrow {\n position: relative;\n top: 0.1em;\n margin-left: 0.2em;\n width: 20px;\n height: 17px;\n }\n`;\n","import gql from 'graphql-tag';\nimport { createGlobalStyle } from 'styled-components';\nimport { RichText } from '../RichText/RichText';\nimport { useKnowledgePlaceholderReplacementEffect } from '../Modal/KnowledgeModal/useKnowledgePlaceholderReplacementEffect';\nimport { ContentContainer } from '../ContentContainer/ContentContainer';\nimport { ContentBottomLine } from '../ContentContainer/ContentBottomLine/ContentBottomLine';\nimport { StyledAccordionContainer as AccordionContainer } from '../ContentContainer/AccordionContainer';\n\nexport const manuscriptFragment = gql`\n fragment LessonManuscript on Lesson {\n id\n manuscript\n }\n`;\n\nconst ManuscriptGlobalStyles = createGlobalStyle`\n /* @noflip */\n .alwaysLtr {\n text-align: left;\n }\n`;\n\nexport const Manuscript = ({ content, isStandalone = true }) => {\n const { knowledges, manuscript } = content;\n const ContainerComponent = isStandalone ? ContentContainer : AccordionContainer;\n\n useKnowledgePlaceholderReplacementEffect({ knowledges, ignore: !isStandalone });\n\n return (\n \n \n \n \n \n );\n};\n","import gql from 'graphql-tag';\nimport { ContentNavTitle } from '../../../ContentContainer/ContentNavTitle/ContentNavTitle';\nimport { LessonExerciseHeadline } from '../LessonExerciseHeadline/LessonExerciseHeadline';\nimport { ClozeExercise, clozeExerciseFragment } from '../ClozeExercise/ClozeExercise';\nimport { DictationExercise } from '../DictationExercise/DictationExercise';\nimport { ManyToManyExercise } from '../ManyToManyExercise/ManyToManyExercise';\nimport { MediaInputVideo } from '../../../MediaInput/MediaInputVideo/MediaInputVideo';\nimport { MediaInputImage } from '../../../MediaInput/MediaInputImage/MediaInputImage';\nimport { MediaInputAudio } from '../../../MediaInput/MediaInputAudio/MediaInputAudio';\nimport { MultiSelectionExercise } from '../MultiSelectionExercise/MultiSelectionExercise';\nimport { RepeatExercise } from '../RepeatExercise/RepeatExercise';\nimport { SingleSelectionExercise } from '../SingleSelectionExercise/SingleSelectionExercise';\nimport { SortingExercise } from '../SortingExercise/SortingExercise';\nimport { useKnowledgePlaceholderReplacementEffect } from '../../../Modal/KnowledgeModal/useKnowledgePlaceholderReplacementEffect';\nimport { lessonExerciseAnswerFragment } from '../LessonExerciseAnswer/ExerciseAnswer';\nimport { lessonExerciseQuestionFragment } from '../LessonExerciseQuestion/LessonExerciseQuestion';\nimport { sortingExerciseFragment } from '../SortingExercise/SortingExerciseRow';\nimport { ExerciseLeavingPrompt } from './ExerciseLeavingPrompt';\nimport { Manuscript } from '../../../Manuscript/Manuscript';\n\nexport const lessonExerciseItemFragment = {\n name: 'LessonExerciseItem',\n fragment() {\n return gql`fragment ${this.name} on Inquiry {\n id\n inquiryDescription\n inquiryType\n selectionType\n sortingType\n mediaType\n learningMetaInfo {\n achievableScore\n }\n ...${lessonExerciseAnswerFragment.name}\n ...${lessonExerciseQuestionFragment.name}\n ...${sortingExerciseFragment.name}\n ...${clozeExerciseFragment.name}\n }\n \n ${lessonExerciseQuestionFragment.fragment()}\n ${lessonExerciseAnswerFragment.fragment()}\n ${sortingExerciseFragment.fragment()}\n ${clozeExerciseFragment.fragment()} \n `;\n },\n};\n\nexport const getExerciseComponentBySelectionType = (selectionType, data) => {\n switch (selectionType) {\n case 'SINGLE':\n return ;\n case 'DIRECT':\n return ;\n case 'MULTIPLE':\n return ;\n default:\n return null;\n }\n};\n\nexport const getExerciseComponentByType = data => {\n const { inquiryType, selectionType } = data.content.inquiries[0];\n switch (inquiryType) {\n case 'ASSOCIATION':\n return getExerciseComponentBySelectionType(selectionType, data);\n case 'DICTATION':\n return ;\n case 'REPEAT':\n return ;\n case 'CLOZE':\n return ;\n case 'SORTING':\n return ;\n default:\n return 'OTHER EXERCISE TYPE PLACEHOLDER';\n }\n};\n\nexport const getExerciseMediaInputComponentByType = data => {\n const { inputType } = data.content;\n switch (inputType) {\n case 'NONE':\n return null;\n case 'TEXT':\n return null;\n case 'IMAGE':\n return ;\n case 'AUDIO':\n return (\n \n \n
\n );\n // XXX: Here is the problem. These exercises return inputType == 'VIDEO'\n // even though they don't have any videos (videos == []) causing some\n // code that assumes that there is a video inside videos to fail\n // (the MediaInputVideo component.)\n case 'VIDEO':\n // This \"if\" is our patch. If it isn't true, it fallsthrough to the default\n // behaviour (returning null.)\n if (data.content.videos.length > 0) {\n return (\n \n \n
\n );\n }\n default:\n return null;\n }\n};\n\nexport const LessonExerciseItem = ({ data, exerciseCounter, manuscriptContent }) => {\n const contentComponent = getExerciseComponentByType(data);\n const mediaInputComponent = getExerciseMediaInputComponentByType(data);\n\n useKnowledgePlaceholderReplacementEffect({\n knowledges: [...data.content.knowledges, ...manuscriptContent.knowledges],\n });\n\n return (\n <>\n \n {mediaInputComponent && (\n \n
{mediaInputComponent}
\n
\n )}\n \n \n {manuscriptContent.manuscript && (\n \n )}\n {contentComponent}\n >\n );\n};\n","export const SET_IMPROVE_MODE_FOR_LESSON = 'SET_IMPROVE_MODE_FOR_LESSON';\nexport const REMOVE_IMPROVE_MODE_FOR_LESSON = 'REMOVE_IMPROVE_MODE_FOR_LESSON';\n\nexport const LESSON_EXERCISE_MODE = Object.freeze({\n IMPROVE: 'IMPROVE',\n});\n\n// actions\nexport const setImproveMode = cosLessonId => ({\n type: SET_IMPROVE_MODE_FOR_LESSON,\n payload: cosLessonId,\n});\n\nexport const removeImproveMode = cosLessonId => ({\n type: REMOVE_IMPROVE_MODE_FOR_LESSON,\n payload: cosLessonId,\n});\n\n// helpers\nconst findExistingLesson = ({ cosLessonId, lessons }) => {\n return lessons.find(lesson => lesson.cosLessonId === cosLessonId);\n};\n\nconst addLessonMode = ({ cosLessonId, lessons }) => {\n const existingLesson = findExistingLesson({ cosLessonId, lessons });\n if (existingLesson) {\n const otherLessons = lessons.filter(lesson => lesson.cosLessonId !== cosLessonId);\n return [...otherLessons, { cosLessonId, mode: LESSON_EXERCISE_MODE.IMPROVE }];\n }\n return [...lessons, { cosLessonId, mode: LESSON_EXERCISE_MODE.IMPROVE }];\n};\n\nconst removeLessonMode = ({ cosLessonId, lessons }) => {\n const existingLesson = findExistingLesson({ cosLessonId, lessons });\n if (existingLesson) {\n const otherLessons = lessons.filter(lesson => lesson.cosLessonId !== cosLessonId);\n return [...otherLessons];\n }\n return [...lessons];\n};\n\n// state\nconst initialState = [];\n\n// reducer\nexport const lessonExerciseModeReducer = (state = initialState, action) => {\n switch (action.type) {\n case SET_IMPROVE_MODE_FOR_LESSON:\n return addLessonMode({ cosLessonId: action.payload, lessons: state });\n case REMOVE_IMPROVE_MODE_FOR_LESSON:\n return removeLessonMode({ cosLessonId: action.payload, lessons: state });\n default:\n return state;\n }\n};\n","import { LESSON_EXERCISE_MODE } from './lessonExerciseModeDuck';\n\nexport const isLessonInImproveModeSelector = lessonId => state => {\n return state.lessonExerciseMode.some(\n item => item.cosLessonId === lessonId && item.mode === LESSON_EXERCISE_MODE.IMPROVE,\n );\n};\n","import { useSelector } from 'react-redux';\nimport { useParams } from 'react-router';\nimport {\n findInquiryLearnProgressSelector,\n findLessonLearnProgressSelector,\n} from '../state/progress/learnProgressSelectors';\nimport {\n createLinkToResultPage,\n getLessonExerciseUrl,\n getLessonUrl,\n} from '../utils/url/urlFactory';\nimport { normalizeUrlName } from '../utils/url/url';\nimport { isLessonInImproveModeSelector } from '../state/mode/lessonExerciseModeSelectors';\n\nexport const useExerciseManager = ({\n lessonName,\n lessonExerciseOverviewItems,\n courseId,\n isFinalTest,\n}) => {\n const { langCode, lessonId, exerciseId } = useParams();\n const lessonProgress = useSelector(findLessonLearnProgressSelector(+lessonId));\n const isLessonInImproveMode = useSelector(isLessonInImproveModeSelector(+lessonId));\n const inquiryProgresses = useSelector(findInquiryLearnProgressSelector(+lessonId, +exerciseId));\n\n const generateNextExercisePath = nextItem => {\n if (!nextItem) {\n return undefined;\n }\n\n return getLessonExerciseUrl(\n langCode,\n lessonId,\n normalizeUrlName(nextItem.exerciseName),\n nextItem.exerciseId,\n );\n };\n\n const mapToFlatLessonExercises = lessonExerciseItems => {\n return lessonExerciseItems.map(item => ({\n exerciseId: item.targetId,\n exerciseName: item.target.name,\n }));\n };\n\n const filterExercisesWithNoFullScore = lessonExercises => {\n return lessonExercises.filter(lessonExercise => {\n const existingProgress = lessonProgress.exerciseProgresses.find(\n exerciseProgress => exerciseProgress.cosExerciseId === lessonExercise.exerciseId,\n );\n if (!existingProgress) {\n return true;\n }\n return existingProgress.maxPoints !== existingProgress.resultPoints;\n });\n };\n\n const getFirstExercisePath = isImproveMode => {\n const lessonExercises = mapToFlatLessonExercises(lessonExerciseOverviewItems);\n\n if (!lessonProgress || isFinalTest) {\n return getLessonExerciseUrl(\n langCode,\n lessonId,\n normalizeUrlName(lessonExercises[0].exerciseName),\n lessonExercises[0].exerciseId,\n );\n }\n\n // eslint-disable-next-line fp/no-let\n let firstExerciseItem;\n if (isLessonInImproveMode || isImproveMode) {\n const exercisesWithNoFullScore = filterExercisesWithNoFullScore(lessonExercises);\n // eslint-disable-next-line fp/no-mutation,prefer-destructuring\n firstExerciseItem = exercisesWithNoFullScore[0];\n } else {\n const exerciseIdsWithProgress = lessonProgress.exerciseProgresses.map(\n exerciseProgress => exerciseProgress.cosExerciseId,\n );\n // eslint-disable-next-line fp/no-mutation\n firstExerciseItem = lessonExercises.find(\n exercise => !exerciseIdsWithProgress.includes(exercise.exerciseId),\n );\n }\n\n if (firstExerciseItem) {\n return getLessonExerciseUrl(\n langCode,\n lessonId,\n normalizeUrlName(firstExerciseItem.exerciseName),\n firstExerciseItem.exerciseId,\n );\n }\n\n const lessonPath = getLessonUrl(lessonId, langCode, normalizeUrlName(lessonName));\n return createLinkToResultPage({ courseId, isFinalTest, lessonPath });\n };\n\n const getCurrentIndex = () => {\n const currentExerciseItem = lessonExerciseOverviewItems.find(\n item => item.targetId === +exerciseId,\n );\n return lessonExerciseOverviewItems.indexOf(currentExerciseItem);\n };\n\n const getNextExercisePath = () => {\n const lessonExercises = mapToFlatLessonExercises(lessonExerciseOverviewItems);\n\n if (isLessonInImproveMode) {\n // eslint-disable-next-line fp/no-mutating-methods\n const remainingLessonExercises = [...lessonExercises].splice(getCurrentIndex() + 1);\n const remainingExercisesWithNoFullScore = filterExercisesWithNoFullScore(\n remainingLessonExercises,\n );\n const [nextItem] = remainingExercisesWithNoFullScore;\n return generateNextExercisePath(nextItem);\n }\n const nextItem = lessonExercises[getCurrentIndex() + 1];\n return generateNextExercisePath(nextItem);\n };\n\n const getFullScoreAchieved = () => {\n if (!lessonProgress) {\n return false;\n }\n return lessonProgress.maxPointsForAllExercises === lessonProgress.resultPoints;\n };\n\n const filterExercises = data => {\n if (!isLessonInImproveMode) {\n return data;\n }\n\n const {\n content,\n content: { inquiries = [] },\n } = data;\n\n const remainingInquiries = inquiries.filter(inquiry => {\n const existingProgress = inquiryProgresses.find(\n inquiryProgress => inquiryProgress.inquiryId === inquiry.id,\n );\n return !existingProgress || existingProgress.score !== existingProgress.maxScore;\n });\n\n return { content: { ...content, inquiries: remainingInquiries } };\n };\n\n return {\n firstExerciseLink: isImproveMode => getFirstExercisePath(isImproveMode),\n nextExerciseLink: () => getNextExercisePath(),\n isFullScoreAchieved: () => getFullScoreAchieved(),\n currentExerciseCount: getCurrentIndex() + 1,\n allExerciseCount: lessonExerciseOverviewItems.length,\n filterExerciseDataIfInImproveMode: data => filterExercises(data),\n };\n};\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport { useEffect } from 'react';\nimport gql from 'graphql-tag';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { LessonExerciseStats } from '../LessonExerciseStats/LessonExerciseStats';\nimport { useScrollToTop } from '../../../../hooks/useScrollToTop';\nimport { ContentNavTitle } from '../../../ContentContainer/ContentNavTitle/ContentNavTitle';\nimport { StyledStandardButton } from '../../../StandardButton/StandardButton';\nimport { knowledgesFragment } from '../../LessonKnowledge/LessonKnowledge';\nimport {\n LessonExerciseItem,\n lessonExerciseItemFragment,\n} from '../LessonExerciseItem/LessonExerciseItem';\nimport { normalizeUrlName } from '../../../../utils/url/url';\nimport { createLinkToResultPage, getLessonUrl } from '../../../../utils/url/urlFactory';\nimport { WithGraphQLQueryHandling } from '../../../WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { lessonExerciseHeadlineFragment } from '../LessonExerciseHeadline/LessonExerciseHeadline';\nimport { useExerciseProgress } from '../workflow/ExerciseProgress';\nimport {\n addLessonProgress,\n readLessonProgress,\n} from '../../../../state/progress/learnProgressDuck';\nimport { createLearnProgressData, scoreFragment } from '../../../../state/progress/learnProgress';\nimport { mediaInputChooserFragment } from '../../MediaInputChooser/MediaInputChooser';\nimport { useExerciseManager } from '../../../../hooks/useExerciseManager';\nimport { isLessonInImproveModeSelector } from '../../../../state/mode/lessonExerciseModeSelectors';\nimport { userDataSelector } from '../../../../state/user/userSelectors';\nimport { metaDataFragment, PageMetaData } from '../../../Page/PageMetaData';\nimport { PAGE_TYPES } from '../../../../constants/pageTypes';\nimport {\n gtmDataLayerFragment,\n GtmScriptWithDataLayer,\n} from '../../../GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const lessonExerciseQuery = ({ handicap }) => gql`\n query LessonExercise($exerciseId: Int!, $lessonLang: Language!) {\n content(id: $exerciseId, lang: $lessonLang) {\n ... on Exercise {\n id\n name\n inputType\n inputText\n images {\n id\n }\n inquiries {\n ...${lessonExerciseItemFragment.name}\n }\n ...${lessonExerciseHeadlineFragment.name}\n ...ExerciseMediaInputChooser\n ...${`ExerciseScore${handicap || ''}`}\n ...ExerciseKnowledges\n ...${metaDataFragment.name}\n ${gtmDataLayerFragment.partial()}\n }\n }\n }\n ${lessonExerciseHeadlineFragment.fragment()}\n ${lessonExerciseItemFragment.fragment()}\n ${mediaInputChooserFragment.fragment({ type: 'Exercise' })}\n ${scoreFragment.fragment({ type: 'Exercise', handicap })}\n ${knowledgesFragment.fragment({ type: 'Exercise' })}\n ${metaDataFragment.fragment({ type: 'Exercise' })}\n`;\n\nexport const LessonExerciseNavigation = ({\n lessonExerciseOverviewItems,\n lessonLang,\n lessonName,\n lessonAchievableScore,\n courseId,\n manuscriptContent,\n isFinalTest,\n}) => {\n useScrollToTop();\n const history = useHistory();\n const { langCode, lessonId, exerciseId } = useParams();\n const { exerciseProgress, resetProgress } = useExerciseProgress();\n const { handicap } = useSelector(userDataSelector) || {};\n const dispatch = useDispatch();\n const lessonIdNumber = +lessonId;\n const exerciseIdNumber = +exerciseId;\n\n const isLessonInImproveMode = useSelector(isLessonInImproveModeSelector(lessonIdNumber));\n\n const {\n nextExerciseLink,\n currentExerciseCount,\n allExerciseCount,\n filterExerciseDataIfInImproveMode,\n } = useExerciseManager({\n lessonName,\n lessonExerciseOverviewItems,\n courseId,\n isFinalTest,\n });\n\n useEffect(() => {\n // reset local progress state in case of browser back and forward buttons have been used\n const unlisten = history.listen((location, action) => {\n if (action === 'POP') {\n resetProgress();\n if (isLessonInImproveMode) {\n history.push(createLinkToResultPage({ courseId, lessonName, lessonPath }));\n }\n }\n });\n return () => unlisten();\n }, [history]);\n\n useEffect(() => {\n dispatch(readLessonProgress(lessonIdNumber));\n }, [lessonIdNumber]);\n\n const lessonPath = getLessonUrl(lessonId, langCode, normalizeUrlName(lessonName));\n const lessonExerciseNavQueryVariables = {\n exerciseId: exerciseIdNumber,\n lessonLang,\n };\n\n const exerciseCounter = `${currentExerciseCount} / ${allExerciseCount}`;\n\n const handleNextButtonClick = ({ exerciseAchievableScore }) => {\n const progressMetaData = createLearnProgressData({\n langCode,\n lessonId: lessonIdNumber,\n courseId,\n lessonAchievableScore,\n exerciseId: exerciseIdNumber,\n allExerciseCount,\n exerciseProgress,\n exerciseAchievableScore,\n });\n dispatch(addLessonProgress(progressMetaData));\n resetProgress();\n const nextPath =\n nextExerciseLink() || createLinkToResultPage({ courseId, isFinalTest, lessonPath });\n history.push(nextPath);\n };\n\n return (\n \n {data => {\n const { content } = data;\n const {\n learningMetaInfo: { achievableScore: exerciseAchievableScore },\n } = content;\n\n const filteredData = filterExerciseDataIfInImproveMode(data);\n const amountOfInquiries = filteredData.content.inquiries.length;\n\n return (\n <>\n \n \n \n
\n
\n
\n
\n
\n \n handleNextButtonClick({\n exerciseAchievableScore,\n })\n }\n />\n
\n
\n
\n
\n
\n >\n );\n }}\n \n );\n};\n","import { useRef } from 'react';\nimport { DwPicture } from '../../../DwPicture/DwPicture';\n\nexport const VocabularyRow = ({ data }) => {\n const { name, subTitle, audios, text } = data;\n const audio = audios[0];\n const audioSource = audio ? audio.mp3Src : '';\n const isValidImage = audio && audio.mainContentImageLink;\n\n const audioRef = useRef();\n\n const playAudio = e => {\n e.preventDefault();\n audioRef.current.play();\n };\n\n return (\n \n
\n
\n {isValidImage && (\n
\n \n
\n )}\n
\n
\n
\n );\n};\n","import { gql } from '@apollo/client';\nimport { useParams } from 'react-router';\nimport { createGlobalStyle } from 'styled-components';\nimport { VocabularyRow } from './VocabularyRow/VocabularyRow';\nimport { toLang } from '../../../utils/mappers/langMapper';\nimport { WithGraphQLQueryHandling } from '../../WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { isRtlByLangCode } from '../../../utils/mappers/rtlLanguages';\nimport { metaDataFragment, PageMetaData } from '../../Page/PageMetaData';\nimport { PAGE_TYPES } from '../../../constants/pageTypes';\nimport {\n gtmDataLayerFragment,\n GtmScriptWithDataLayer,\n} from '../../GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const lessonVocabularyQuery = gql`\n query LessonVocabulary($lessonId: Int!, $lessonLang: Language!) {\n content(id: $lessonId, lang: $lessonLang) {\n ... on Lesson {\n vocabularies {\n id\n name\n subTitle\n text\n audios {\n mp3Src\n mainContentImageLink {\n targetId\n }\n }\n }\n ...${metaDataFragment.name}\n ${gtmDataLayerFragment.partial()}\n }\n }\n }\n ${metaDataFragment.fragment({ type: 'Lesson' })}\n`;\n\nconst LessonVocabularyGlobalStyles = createGlobalStyle`\n /* @noflip */\n .override-ltr {\n text-align: left;\n }\n \n @media (min-width: 768px) { \n /* @noflip */\n .col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9 {\n float:right\n } \n \n /* @noflip */\n div.row.vocabulary div.col-sm-4 p {\n margin-right: auto;\n margin-left: 20px\n }\n \n /* @noflip */\n .col-sm-offset-1 {\n margin-right: 8.33333333%;\n margin-left: 0;\n }\n }\n\n @media (min-width: 1200px) {\n /* @noflip */\n .col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9 {\n float:right\n } \n \n /* @noflip */\n .col-lg-offset-2 {\n margin-right: 16.66666667%;\n margin-left: 0\n }\n }\n`;\n\nexport const LessonVocabulary = () => {\n const { langCode, lessonId } = useParams();\n\n const lessonVocabularyQueryVariables = {\n lessonId: +lessonId,\n lessonLang: toLang(langCode),\n };\n\n // TODO: this is only temporary here because the old styles need this distinction\n const isRtl = isRtlByLangCode(langCode);\n\n return (\n \n {data => {\n const { content } = data;\n const { vocabularies } = content;\n\n return (\n <>\n {isRtl && }\n \n \n {vocabularies.map(vocabularyItem => (\n \n ))}\n >\n );\n }}\n \n );\n};\n","import { LESSON_PARTS } from '../../constants/lessonParts';\n\nconst LESSON_PART_TRANSLATION_CODES = Object.freeze({\n [LESSON_PARTS.PHONEMIC_CHART]: '',\n [LESSON_PARTS.EXERCISE]: '',\n [LESSON_PARTS.GRAMMAR]: 'lesson.menu.grammar',\n [LESSON_PARTS.VOCABULARY_GLOSSARY]: 'lesson.menu.vocabulary',\n [LESSON_PARTS.REGIONAL_STUDIES]: 'lesson.menu.regionalStudies',\n [LESSON_PARTS.MANUSCRIPT]: '',\n [LESSON_PARTS.DOWNLOAD]: '',\n});\n\nexport const getTranslationCodeForLessonPart = lessonPart =>\n LESSON_PART_TRANSLATION_CODES[lessonPart];\n","import { Link } from 'react-router-dom';\nimport { getTranslationCodeForLessonPart } from '../../../../utils/mappers/lessonPartToTranslationCode';\nimport { LESSON_PARTS } from '../../../../constants/lessonParts';\nimport { useI18nContext } from '../../../../context/I18nContext';\n\nconst getArrowAriaLabel = (item, t) => {\n if (item && item.lessonPart === LESSON_PARTS.GRAMMAR) {\n return item.target.name;\n }\n if (item && item.lessonPart === LESSON_PARTS.VOCABULARY_GLOSSARY) {\n return t('lesson.aria.vocabulary');\n }\n return '';\n};\n\nexport const NavigationRow = ({ position, currentItem, previousItem, nextItem, moveTo }) => {\n const { i18n } = useI18nContext();\n\n return (\n \n
\n
\n
\n {currentItem && i18n.t(getTranslationCodeForLessonPart(currentItem.lessonPart))}\n
\n {previousItem && (\n
\n )}\n {nextItem && (\n
\n )}\n
\n
\n
\n );\n};\n","import { useHistory, useParams } from 'react-router';\nimport { LessonVocabulary } from '../LessonVocabulary/LessonVocabulary';\nimport { StyledStandardButton as StandardButton } from '../../StandardButton/StandardButton';\nimport { NavigationRow } from './NavigationRow/NavigationRow';\nimport { normalizeUrlName } from '../../../utils/url/url';\nimport {\n ALPHABETICAL_ORDER_URL_SUFFIX,\n LESSON_VOCABULARY_URL_SUFFIX,\n getLessonGrammarUrl,\n getLessonPhonemicChartUrl,\n getLessonRegionalStudiesUrl,\n getLessonVocabularyUrl,\n getSummaryUrl,\n getLessonUrl,\n} from '../../../utils/url/urlFactory';\nimport { LessonKnowledge } from '../LessonKnowledge/LessonKnowledge';\nimport { LESSON_PARTS } from '../../../constants/lessonParts';\nimport { ContentBottomLine } from '../../ContentContainer/ContentBottomLine/ContentBottomLine';\nimport { PAGE_TYPES } from '../../../constants/pageTypes';\nimport { PageMetaData } from '../../Page/PageMetaData';\n\nconst LESSON_PARTS_SUFFIX = {\n [LESSON_VOCABULARY_URL_SUFFIX]: LESSON_PARTS.VOCABULARY_GLOSSARY,\n [ALPHABETICAL_ORDER_URL_SUFFIX]: LESSON_PARTS.PHONEMIC_CHART,\n};\n\nexport const LessonKnowledgeNavigation = ({\n lessonName,\n lessonKeywordStrings,\n lessonKnowledgeOverviewItems,\n}) => {\n const history = useHistory();\n const { langCode, lessonId, knowledgeType, contentId } = useParams();\n const lessonPath = getLessonUrl(lessonId, langCode, normalizeUrlName(lessonName));\n\n const getCurrentItem = () => {\n if (contentId) {\n return lessonKnowledgeOverviewItems.find(item => item.targetId.toString() === contentId);\n }\n return lessonKnowledgeOverviewItems.find(\n item => item.lessonPart === LESSON_PARTS_SUFFIX[knowledgeType],\n );\n };\n\n const currentItem = getCurrentItem();\n const currentItemIndex = lessonKnowledgeOverviewItems.indexOf(currentItem);\n const previousItem = lessonKnowledgeOverviewItems[currentItemIndex - 1];\n const nextItem = lessonKnowledgeOverviewItems[currentItemIndex + 1];\n\n const moveTo = item => {\n const normalizedName = normalizeUrlName(item.target.name);\n if (item.lessonPart === LESSON_PARTS.GRAMMAR) {\n return getLessonGrammarUrl(langCode, lessonId, normalizedName, item.targetId);\n }\n if (item.lessonPart === LESSON_PARTS.REGIONAL_STUDIES) {\n return getLessonRegionalStudiesUrl(langCode, lessonId, normalizedName, item.targetId);\n }\n if (item.lessonPart === LESSON_PARTS.PHONEMIC_CHART) {\n return getLessonPhonemicChartUrl(langCode, lessonId, normalizedName);\n }\n return getLessonVocabularyUrl(langCode, lessonId, normalizedName);\n };\n\n const getCurrentComponent = () => {\n if ([LESSON_PARTS.GRAMMAR, LESSON_PARTS.REGIONAL_STUDIES].includes(currentItem.lessonPart)) {\n const pageType =\n currentItem.lessonPart === LESSON_PARTS.GRAMMAR\n ? PAGE_TYPES.GRAMMAR\n : PAGE_TYPES.REGIONAL_STUDIES;\n return (\n \n );\n }\n\n if (currentItem.lessonPart === LESSON_PARTS.PHONEMIC_CHART) {\n // TODO - create Phonemic Chart component and keep PageMetaData (but extend with content)\n return (\n <>\n \n Phonemic Chart component \n >\n );\n }\n return ;\n };\n\n const goNextWithButton = () => {\n const nextPath = nextItem ? moveTo(nextItem) : getSummaryUrl(lessonPath);\n history.push(nextPath);\n };\n\n return (\n \n
\n {currentItem && getCurrentComponent()}\n
\n
\n
\n
\n );\n};\n","import gql from 'graphql-tag';\nimport { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { manuscriptFragment, Manuscript } from '../components/Manuscript/Manuscript';\nimport { knowledgesFragment } from '../components/Lesson/LessonKnowledge/LessonKnowledge';\nimport {\n MediaInputChooser,\n mediaInputChooserFragment,\n} from '../components/Lesson/MediaInputChooser/MediaInputChooser';\nimport { metaDataFragment, PageMetaData } from '../components/Page/PageMetaData';\nimport { PAGE_TYPES } from '../constants/pageTypes';\nimport {\n gtmDataLayerFragment,\n GtmScriptWithDataLayer,\n} from '../components/GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const ManuscriptQuery = gql`\n query ManuscriptPage($id: Int!, $lang: Language!) {\n content(id: $id, lang: $lang) {\n ...LessonMediaInputChooser\n ...LessonManuscript\n ...LessonKnowledges\n ...${metaDataFragment.name}\n ${gtmDataLayerFragment.partial()}\n }\n }\n ${mediaInputChooserFragment.fragment({ type: 'Lesson' })}\n ${manuscriptFragment}\n ${knowledgesFragment.fragment({ type: 'Lesson' })}\n ${metaDataFragment.fragment({ type: 'Lesson' })}\n`;\n\nexport const ManuscriptPage = ({ contentId, language }) => {\n const ManuscriptPageQueryVariables = {\n id: +contentId,\n lang: language,\n };\n\n return (\n \n {data => (\n <>\n \n \n \n \n >\n )}\n \n );\n};\n","import { I18nText } from '../../I18n/I18nText';\n\nexport const ContentSection = ({ title, children }) => (\n <>\n \n \n >\n);\n","import { getArticleUrl } from '../../../../utils/url/url';\n\nexport const ArticleLinks = ({ data }) => {\n return data.map(({ targetId, target: { name: targetName }, name }) => (\n \n ));\n};\n","import { capitalize, getMediaFileSizeInKBorMB } from '../../../../utils/commons';\nimport { getAudioDownloadUrl } from '../../../../utils/url/url';\n\nexport const AudioLinks = ({ data }) => {\n const getAudioLinkTitle = (name, format, size, variant) =>\n `${name} | ${format} | ${getMediaFileSizeInKBorMB(size)} (${capitalize(variant)})`;\n\n return data.map(audioLink =>\n audioLink.target.audioResourceLinks.map(({ id, url, format, size, variant }) => (\n \n )),\n );\n};\n","import { getDownloadUrl } from '../../../../utils/url/url';\nimport { useFrontendConfig } from '../../../../hooks/useFrontendConfig';\n\nexport const DownloadLinks = ({ data }) => {\n const { staticBaseHost } = useFrontendConfig();\n\n return data.map(({ targetId, target: { filename }, name }) => (\n \n ));\n};\n","import gql from 'graphql-tag';\nimport { getMediaFileSizeInKBorMB } from '../../../../utils/commons';\nimport { getVideoDownloadUrl } from '../../../../utils/url/url';\n\nexport const videoResourceLinksFragment = {\n name: 'VideoResourceLinks',\n fragment() {\n return gql`fragment ${this.name} on Video {\n id\n name\n videoResourceLinks {\n id\n url\n techFormat\n size\n format\n }\n } \n `;\n },\n};\n\nexport const VideoLinks = ({ data }) => {\n const getVideoLinksByFormat = video =>\n video.videoResourceLinks.filter(videoLink => videoLink.techFormat.includes('PODCAST'));\n\n const videos = [].concat(\n ...data.map(video =>\n getVideoLinksByFormat(video.target).map(link => ({ ...link, name: video.name })),\n ),\n );\n\n const getVideoLinkTitle = (name, format, size, techFormat) =>\n `${name} | ${format} | ${getMediaFileSizeInKBorMB(size)} (${techFormat.slice(-2)})`;\n\n return videos.map(({ id, url, name, format, size, techFormat }) => (\n \n \n {getVideoLinkTitle(name, format, size, techFormat)}\n \n
\n ));\n};\n","import gql from 'graphql-tag';\nimport { ContentContainer } from '../../ContentContainer/ContentContainer';\nimport { ContentHeadline } from '../../ContentContainer/ContentHeadline/ContentHeadline';\nimport { ContentBottomLine } from '../../ContentContainer/ContentBottomLine/ContentBottomLine';\nimport { ContentSection } from '../../ContentContainer/ContentSection/ContentSection';\nimport { ArticleLinks } from './Links/ArticleLinks';\nimport { AudioLinks } from './Links/AudioLinks';\nimport { DownloadLinks } from './Links/DownloadLinks';\nimport { VideoLinks, videoResourceLinksFragment } from './Links/VideoLinks';\nimport { I18nText } from '../../I18n/I18nText';\n\nexport const lessonExtrasFragment = gql`\n fragment LessonExtras on Lesson {\n id\n contentLinks(targetTypes: [ARTICLE, DOWNLOAD, AUDIO, VIDEO]) {\n id\n name\n targetId\n targetType\n target {\n ... on Download {\n filename\n }\n ... on Article {\n name\n }\n ... on Audio {\n id\n name\n audioResourceLinks {\n id\n url\n size\n format\n variant\n }\n }\n ...${videoResourceLinksFragment.name}\n }\n }\n }\n ${videoResourceLinksFragment.fragment()}\n`;\n\nconst filterContentByType = type => contentLink => contentLink.targetType === type;\n\nexport const LessonExtras = ({ content = {} }) => {\n const { contentLinks = [] } = content;\n const downloads = contentLinks.filter(filterContentByType('DOWNLOAD'));\n const articles = contentLinks.filter(filterContentByType('ARTICLE'));\n const audios = contentLinks.filter(filterContentByType('AUDIO'));\n const videos = contentLinks.filter(filterContentByType('VIDEO'));\n const [hasDownloads, hasVideos, hasAudios, hasArticles] = [\n !!downloads.length,\n !!videos.length,\n !!audios.length,\n !!articles.length,\n ];\n\n return (\n \n \n \n \n {hasDownloads && (\n \n \n \n )}\n {(hasVideos || hasAudios) && (\n \n {hasVideos && }\n {hasAudios && }\n \n )}\n {hasArticles && (\n \n \n \n )}\n \n \n );\n};\n","import gql from 'graphql-tag';\nimport { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { lessonExtrasFragment, LessonExtras } from '../components/Lesson/LessonExtras/LessonExtras';\nimport { metaDataFragment, PageMetaData } from '../components/Page/PageMetaData';\nimport { PAGE_TYPES } from '../constants/pageTypes';\nimport {\n gtmDataLayerFragment,\n GtmScriptWithDataLayer,\n} from '../components/GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const LessonExtrasQuery = gql`\n query LessonExtrasPage($id: Int!, $lang: Language!) {\n content(id: $id, lang: $lang) {\n ...LessonExtras\n ...${metaDataFragment.name}\n ${gtmDataLayerFragment.partial()}\n }\n }\n ${lessonExtrasFragment}\n ${metaDataFragment.fragment({ type: 'Lesson' })}\n`;\n\nexport const LessonExtrasPage = ({ contentId, language }) => {\n const LessonExtraPageQueryVariables = {\n id: +contentId,\n lang: language,\n };\n\n return (\n \n {({ content }) => (\n <>\n \n \n \n >\n )}\n \n );\n};\n","import { useSelector } from 'react-redux';\nimport { I18nText } from '../../../I18n/I18nText';\nimport { userSelector } from '../../../../state/user/userSelectors';\n\nexport const EXERCISE_ACTION_TYPES = Object.freeze({\n CONTINUE: 'CONTINUE',\n IMPROVE: 'IMPROVE',\n SAVE: 'SAVE',\n});\n\nconst generateActionKey = (actionType, isLoggedIn) => {\n const translationPrefix = 'lesson.exercises.result';\n\n switch (actionType) {\n case EXERCISE_ACTION_TYPES.CONTINUE:\n return `${translationPrefix}.notSave`;\n case EXERCISE_ACTION_TYPES.IMPROVE:\n return isLoggedIn ? `${translationPrefix}.correct` : `${translationPrefix}.loginFixErrors`;\n case EXERCISE_ACTION_TYPES.SAVE:\n return isLoggedIn ? `${translationPrefix}.save` : `${translationPrefix}.loginSave`;\n default:\n // eslint-disable-next-line fp/no-throw\n throw new Error('invalid action');\n }\n};\n\nexport const ExerciseAction = ({ name, actionType, onClickAction, href }) => {\n const { isLoggedIn } = useSelector(userSelector);\n const actionKey = generateActionKey(actionType, isLoggedIn);\n\n return (\n \n );\n};\n","export const MARKS = Object.freeze({\n GOOD: 80,\n MEDIUM: 60,\n BAD: 40,\n});\n","import { useSelector } from 'react-redux';\nimport { MARKS } from '../../../../constants/marks';\nimport { I18nText } from '../../../I18n/I18nText';\nimport { calculatePercentage, generateRandomNumber } from '../../../../utils/commons';\nimport { findLessonLearnProgressSelector } from '../../../../state/progress/learnProgressSelectors';\n\nexport const Summary = ({ lessonId, showFeedback = false, showTitle = true }) => {\n const lesson = useSelector(findLessonLearnProgressSelector(lessonId));\n\n const {\n allExerciseCount = 0,\n doneExerciseCount = 0,\n maxPointsForAllExercises = 0,\n resultPoints = 0,\n } = lesson || {};\n\n const percentile = calculatePercentage(resultPoints, maxPointsForAllExercises);\n\n const getFeedBackText = () => {\n const randomNumber = generateRandomNumber(1, 3);\n\n if (percentile >= MARKS.GOOD) return `good${randomNumber}`;\n if (percentile >= MARKS.MEDIUM) return `mid${randomNumber}`;\n\n return `bad${randomNumber}`;\n };\n\n return (\n <>\n {showTitle && (\n \n )}\n {showFeedback && (\n \n )}\n \n
\n
\n
\n \n {percentile}%\n
\n \n
\n \n : {`${doneExerciseCount}/${allExerciseCount}`}\n
\n
\n
\n
\n >\n );\n};\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useEffect } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { createGlobalStyle } from 'styled-components';\nimport { EXERCISE_ACTION_TYPES, ExerciseAction } from './ExerciseAction';\nimport { LessonExerciseHint } from '../LessonExerciseHint/LessonExerciseHint';\nimport { Summary } from './Summary';\nimport {\n filteredAssembledInfos,\n filterLessonExerciseOverviewItems,\n} from '../../../../utils/lessonUtils';\nimport { userSelector } from '../../../../state/user/userSelectors';\nimport { useI18nContext } from '../../../../context/I18nContext';\nimport { removeImproveMode, setImproveMode } from '../../../../state/mode/lessonExerciseModeDuck';\nimport { useExerciseManager } from '../../../../hooks/useExerciseManager';\nimport { getLessonUrl, getLoginPage, getSummaryUrl } from '../../../../utils/url/urlFactory';\nimport { useGlobalsContext } from '../../../../context/GlobalsContext';\nimport { normalizeUrlName } from '../../../../utils/url/url';\nimport { setLessonProgressSyncNeeded } from '../../../../state/progress/learnProgressDuck';\nimport { PageMetaData } from '../../../Page/PageMetaData';\nimport { PAGE_TYPES } from '../../../../constants/pageTypes';\nimport { GtmScriptWithDataLayer } from '../../../GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const LessonResultAndSummaryGlobalStyles = createGlobalStyle`\n @media (min-width: 1200px) {\n /* @noflip */\n .col-lg-push-1 {\n right: 8.33333333%;\n left: 0;\n }\n }\n @media (min-width: 1200px) {\n /* @noflip */\n .col-lg-pull-1 {\n left: 8.33333333%;\n right: auto;\n }\n }\n /* @noflip */\n .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 {\n position: relative;\n min-height: 1px;\n padding-left: 20px;\n padding-right: 20px;\n }\n`;\n\nexport const LessonExerciseResult = ({\n lessonOverviewParts,\n lessonId,\n lessonName,\n courseId,\n isFinalTest,\n lessonKeywordStrings,\n data,\n}) => {\n const { isLoggedIn } = useSelector(userSelector);\n const { i18n } = useI18nContext();\n const { langCode } = useParams();\n const { location } = useGlobalsContext().window;\n const dispatch = useDispatch();\n const history = useHistory();\n\n const lessonExerciseOverviewItems = filterLessonExerciseOverviewItems(lessonOverviewParts);\n const { firstExerciseLink, isFullScoreAchieved } = useExerciseManager({\n lessonName,\n lessonExerciseOverviewItems,\n courseId,\n isFinalTest,\n });\n\n useEffect(() => {\n dispatch(removeImproveMode(lessonId));\n }, []);\n\n const lessonPath = getLessonUrl(lessonId, langCode, normalizeUrlName(lessonName));\n const assembledInfos = filteredAssembledInfos({ lessonOverviewParts, lessonPath });\n const showImproveButton = !isLoggedIn || (isLoggedIn && !isFullScoreAchieved());\n const resultPrefix = 'lesson.exercises.result';\n\n const generateNextUrl = () => {\n return assembledInfos[0] ? assembledInfos[0].url : getSummaryUrl(lessonPath);\n };\n\n const generateExerciseInfos = t => {\n const exerciseInfos = assembledInfos.map(info => t(`${resultPrefix}.${info.name}`)).join(', ');\n\n return (\n exerciseInfos && (\n \n {t(`${resultPrefix}.whatsNext`)} {exerciseInfos}.\n
\n )\n );\n };\n\n const infos = generateExerciseInfos(i18n.t);\n const nextUrl = generateNextUrl();\n const hintKey = i18n.t(`${resultPrefix}.hint`);\n\n const handleImproveClicked = () => {\n if (isLoggedIn) {\n dispatch(setImproveMode(lessonId));\n const firstExerciseLinkInImproveMode = firstExerciseLink(true);\n history.push(firstExerciseLinkInImproveMode);\n } else {\n dispatch(setLessonProgressSyncNeeded(true));\n }\n };\n\n const handleSaveClicked = () => {\n if (isLoggedIn) {\n history.push(nextUrl);\n } else {\n dispatch(setLessonProgressSyncNeeded(true));\n }\n };\n\n const handleContinueClicked = () => {\n history.push(nextUrl);\n };\n\n const loginLink = isLoggedIn\n ? undefined\n : getLoginPage(location.origin, langCode, location.pathname);\n\n return (\n <>\n \n \n \n \n
\n
\n
\n
\n
{infos}
\n {!isLoggedIn && (\n
\n )}\n
\n
\n
\n
\n
\n
\n {showImproveButton && (\n
\n \n
\n )}\n
\n {!isLoggedIn && (\n \n )}\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n >\n );\n};\n","import { Link } from 'react-router-dom';\nimport { Summary } from '../LessonExercise/LessonExerciseResult/Summary';\nimport { getContentUrl, getDashboardUrl } from '../../../utils/url/urlFactory';\nimport { I18nText } from '../../I18n/I18nText';\nimport { toLangCode } from '../../../utils/mappers/langMapper';\nimport { isFinalTestPredicate } from '../../../utils/commons';\nimport { LessonResultAndSummaryGlobalStyles } from '../LessonExercise/LessonExerciseResult/LessonExerciseResult';\n\nexport const LessonSummary = ({ data, lessonId, language }) => {\n const { content } = data;\n const { contentLinks } = content;\n const currentLessonLink = contentLinks.find(link => link.targetId === lessonId);\n const currentLessonIndex = contentLinks.indexOf(currentLessonLink);\n\n const generateRedirectInfos = () => {\n const nextLessonContentLink = contentLinks[currentLessonIndex + 1] || {};\n const { lesson } = nextLessonContentLink;\n\n if (!lesson) {\n return {\n url: getDashboardUrl(toLangCode(language)),\n redirectMessage: 'lesson.exercises.result.toDashboard',\n };\n }\n\n const { shortTitle, id } = lesson;\n\n const url = getContentUrl({\n id,\n name: shortTitle,\n language,\n __typename: 'Lesson',\n });\n\n const isFinalTest = isFinalTestPredicate(nextLessonContentLink);\n\n const redirectMessage = isFinalTest\n ? 'lesson.exercises.result.toFinalTest'\n : 'lesson.exercises.result.nextLesson';\n\n return { url, redirectMessage };\n };\n\n const { url, redirectMessage } = generateRedirectInfos();\n\n return (\n <>\n \n \n >\n );\n};\n","import gql from 'graphql-tag';\nimport { LessonSummary } from '../components/Lesson/LessonSummary/LessonSummary';\nimport { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { PageMetaData } from '../components/Page/PageMetaData';\nimport { PAGE_TYPES } from '../constants/pageTypes';\nimport { gtmDataLayerFragment } from '../components/GoogleTagManager';\nimport { GtmScriptWithDataLayer } from '../components/GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const lessonSummaryPageQuery = gql`\n query LessonSummaryPage($id: Int!, $lang: Language!) {\n content(id: $id, lang: $lang) {\n ... on Course {\n id\n contentLinks(targetTypes: LESSON) {\n additionalInformation\n targetId\n lesson: target {\n ... on Lesson {\n id\n shortTitle\n }\n }\n }\n ${gtmDataLayerFragment.partial()}\n }\n }\n }\n`;\n\nexport const LessonSummaryPage = ({\n courseId,\n lessonId,\n language,\n lessonName,\n lessonKeywordStrings,\n}) => {\n const LessonSummaryQueryVariables = {\n id: +courseId,\n lang: language,\n };\n\n return (\n \n {data => (\n <>\n \n \n \n >\n )}\n \n );\n};\n","import { Route, useParams, useRouteMatch } from 'react-router';\nimport gql from 'graphql-tag';\nimport { createGlobalStyle } from 'styled-components';\nimport { isMonolingualCourse } from '../../constants/isLtrContentOnly';\nimport { LessonMenu } from './LessonMenu/LessonMenu';\nimport { LessonInformation } from './LessonInformation/LessonInformation';\nimport { pathPartials } from '../../utils/url/pathAnalyser';\nimport { ExerciseProgressProvider } from './LessonExercise/workflow/ExerciseProgress';\nimport { LessonExerciseNavigation } from './LessonExercise/LessonExerciseNavigation/LessonExerciseNavigation';\nimport { LessonKnowledgeNavigation } from './LessonKnowledgeNavigation/LessonKnowledgeNavigation';\nimport {\n LESSON_EXERCISE_RESULT_SUFFIX,\n LESSON_EXTRAS_SUFFIX,\n LESSON_MANUSCRIPT_SUFFIX,\n LESSON_SUMMARY_SUFFIX,\n} from '../../utils/url/urlFactory';\nimport { ManuscriptPage } from '../../pages/ManuscriptPage';\nimport { LessonExtrasPage } from '../../pages/LessonExtrasPage';\nimport { LessonExerciseResult } from './LessonExercise/LessonExerciseResult/LessonExerciseResult';\nimport { LessonSummaryPage } from '../../pages/LessonSummaryPage';\nimport { useExerciseManager } from '../../hooks/useExerciseManager';\nimport {\n filterLessonExerciseOverviewItems,\n filterLessonKnowledgeOverviewItems,\n isFinalTestLesson,\n} from '../../utils/lessonUtils';\nimport { isPlacementTestCourse } from '../../utils/mappers/placementTestCourseIds';\nimport { hasCorrectImageFormat } from '../ImageOGMetaData/ImageOGMetaData';\nimport { gtmDataLayerFragment } from '../GoogleTagManager';\nimport { CourseDataContext } from '../../hooks/useCourseData';\n\nexport const lessonOverviewPartsFragment = {\n fragment({ scope, handicap }) {\n const handicapArg = handicap ? `(handicap: ${handicap})` : '';\n return gql`\n fragment ${scope}OverviewParts${handicap || ''} on Lesson {\n overviewParts${handicapArg} {\n targetId\n lessonPart\n target {\n ... on Exercise {\n name\n ${gtmDataLayerFragment.partial()}\n }\n ... on Knowledge {\n name\n }\n }\n }\n }\n `;\n },\n};\n\nexport const LtrContentLessonStyle = createGlobalStyle`\n #lesson {\n .title,\n .main-info-content,\n .exercise-container,\n .input-header-container {\n /* @noflip */\n direction: ltr;\n /* @noflip */\n text-align: left;\n }\n }\n`;\n\nexport const Lesson = ({ data }) => {\n const { content } = data;\n const {\n name: lessonName,\n language,\n overviewParts: lessonOverviewParts,\n learningMetaInfo: { achievableScore },\n manuscript,\n knowledges,\n mainContentImage: lessonMainImage,\n keywordStrings: lessonKeywordStrings,\n } = content;\n const lessonKnowledgeOverviewItems = filterLessonKnowledgeOverviewItems(lessonOverviewParts);\n const lessonExerciseOverviewItems = filterLessonExerciseOverviewItems(lessonOverviewParts);\n\n const manuscriptContent = { manuscript, knowledges };\n const { path } = useRouteMatch();\n const { lessonId: lessonIdString } = useParams();\n const lessonId = +lessonIdString;\n\n const {\n id: courseId,\n name: courseName,\n contentLinks: lessonContentLinksFromCourse,\n mainContentImage: courseMainImage,\n } = data.contentsByType[0];\n\n const isFromPlacementCourse = isPlacementTestCourse(courseId);\n const isFinalTest = isFinalTestLesson({\n lessonContentLinksFromCourse,\n currentLessonId: lessonId,\n });\n\n const ogImage =\n lessonMainImage && hasCorrectImageFormat(lessonMainImage.imageFormats)\n ? lessonMainImage\n : courseMainImage;\n\n const { firstExerciseLink } = useExerciseManager({\n lessonName,\n lessonExerciseOverviewItems,\n courseId,\n isFinalTest,\n });\n\n const firstExercisePath = firstExerciseLink();\n\n return (\n \n \n {isMonolingualCourse(courseId.toString()) && }\n \n (\n \n )}\n />\n (\n \n \n \n )}\n />\n (\n \n )}\n />\n }\n />\n }\n />\n (\n \n )}\n />\n (\n \n )}\n />\n
\n \n );\n};\n","import gql from 'graphql-tag';\nimport { useParams } from 'react-router';\nimport { useSelector } from 'react-redux';\nimport { PageContainer } from '../components/Page/PageContainer';\nimport { LANG_CODES, toLang } from '../utils/mappers/langMapper';\nimport { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { scoreFragment } from '../state/progress/learnProgress';\nimport { Lesson, lessonOverviewPartsFragment } from '../components/Lesson/Lesson';\nimport { userDataSelector } from '../state/user/userSelectors';\nimport { manuscriptFragment } from '../components/Manuscript/Manuscript';\nimport { knowledgesFragment } from '../components/Lesson/LessonKnowledge/LessonKnowledge';\nimport { metaDataFragment } from '../components/Page/PageMetaData';\nimport { imageOGMetaDataFragment } from '../components/ImageOGMetaData/ImageOGMetaData';\nimport { gtmDataLayerFragment } from '../components/GoogleTagManager';\n\nexport const lessonPageQuery = ({ handicap }) => gql`\n query LessonPage($lessonId: Int!, $lessonIdString: String!, $lang: Language!) {\n content(id: $lessonId, lang: $lang) {\n ... on Lesson {\n id\n name\n language\n ...${`LessonOverviewParts${handicap || ''}`}\n ...${`LessonScore${handicap || ''}`}\n ...${metaDataFragment.name}\n }\n ...LessonManuscript\n ...LessonKnowledges\n ...LessonImageOGMetaData\n ${gtmDataLayerFragment.partial()}\n }\n contentsByType(\n lang: $lang\n type: COURSE\n amount: 1\n filters: { field: \"contentLinks.targetId\", value: [$lessonIdString] }\n ) {\n ... on Course {\n id\n name\n contentLinks(targetTypes: LESSON) {\n targetId\n additionalInformation\n }\n }\n ...CourseImageOGMetaData\n }\n }\n ${lessonOverviewPartsFragment.fragment({ scope: 'Lesson', handicap })}\n ${scoreFragment.fragment({ type: 'Lesson', handicap })}\n ${manuscriptFragment}\n ${knowledgesFragment.fragment({ type: 'Lesson' })}\n ${imageOGMetaDataFragment.fragment({ type: 'Lesson' })}\n ${imageOGMetaDataFragment.fragment({ type: 'Course' })}\n ${metaDataFragment.fragment({ type: 'Lesson' })}\n`;\n\nexport const LessonPage = () => {\n const { langCode, lessonId } = useParams();\n const { handicap } = useSelector(userDataSelector) || {};\n\n const queryVariables = {\n lessonId: +lessonId,\n lessonIdString: lessonId,\n lang: toLang(langCode),\n };\n\n return (\n \n \n {(data, refetch) => {\n if (!data.content) {\n refetch({\n ...queryVariables,\n lang: toLang(LANG_CODES.GERMAN),\n });\n return null;\n }\n return ;\n }}\n \n \n );\n};\n","import { useSelector } from 'react-redux';\nimport { Redirect, Route } from 'react-router-dom';\nimport { getFeedbackUrl } from '../../utils/url/urlFactory';\nimport { userSelector } from '../../state/user/userSelectors';\n\nexport const RestrictedRoute = ({ path, component, render, feedbackType }) => {\n const { isLoggedIn } = useSelector(userSelector);\n const TargetComponent = component;\n\n return (\n {\n // eslint-disable-next-line no-nested-ternary\n return isLoggedIn ? (\n TargetComponent ? (\n \n ) : (\n render()\n )\n ) : (\n \n );\n }}\n />\n );\n};\n","import { useEffect } from 'react';\nimport { useHistory, useParams } from 'react-router';\nimport { confirmUserRegistration } from '../../services/userService';\nimport { feedbackHelper } from '../../utils/url/feedbackHelpers';\nimport { StyledLoadingMessage as LoadingMessage } from '../commons/LoadingMessage';\n\nexport const ConfirmUserRegistrationContainer = ({ confirmationId }) => {\n const { langCode } = useParams();\n const history = useHistory();\n\n useEffect(() => {\n confirmUserRegistration(confirmationId)\n .then(async response => {\n if (response.ok) {\n history.push(feedbackHelper.forRegistrationConfirm(langCode));\n } else {\n const errorResponse = await response.json();\n history.push(feedbackHelper.getForErrorCode(errorResponse, langCode));\n }\n })\n .catch(e => {\n history.push(feedbackHelper.getForErrorCode(e, langCode));\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return ;\n};\n","export const hasErrorClassAssigner = (className, error) =>\n error ? `${className} has-error` : className;\n\nexport const hasNestedErrorsClassAssigner = (className, error) =>\n error ? `${className} has-nested-errors` : className;\n","export const CUSTOM_ERROR_TRANSLATION_KEYS = {\n SAFE_MONGO_CHARACTERS_ONLY: 'safeMongoCharactersOnly',\n TRANSCRIPTION: 'transcription',\n};\n\nconst buildKey = suffix => `client.validator.${suffix}`;\n\nexport const getTranslatedValidationMessage = ({\n name,\n validationErrorTranslationKey,\n validationType,\n customErrorTranslationKey,\n t,\n}) => {\n const title = t(validationErrorTranslationKey);\n switch (validationType) {\n case 'required':\n return t(buildKey('required'), { first: title });\n case 'pattern':\n return t(customErrorTranslationKey ? buildKey(customErrorTranslationKey) : buildKey(name), {\n first: title,\n });\n case 'differsFromEmail':\n return t(buildKey('differFromEmail'));\n case 'passwordRetype':\n return t(buildKey('equalTo'));\n default:\n return '';\n }\n};\n","import { hasErrorClassAssigner } from '../../utils/errorClassAssigner';\nimport { getTranslatedValidationMessage } from '../../utils/validation/validationMessages';\nimport { I18nText } from '../I18n/I18nText';\nimport { useI18nContext } from '../../context/I18nContext';\n\nexport const Input = ({\n titleTranslationKey,\n placeholderTranslationKey = titleTranslationKey,\n name,\n type,\n register,\n validationError,\n isLabelVisible = false,\n customErrorTranslationKey,\n ...restProps\n}) => {\n const { i18n } = useI18nContext();\n return (\n \n \n \n {validationError && (\n \n {getTranslatedValidationMessage({\n name,\n validationErrorTranslationKey: titleTranslationKey,\n validationType: validationError.type,\n customErrorTranslationKey,\n t: i18n.t,\n })}\n \n )}\n
\n );\n};\n","import { hasErrorClassAssigner } from '../../utils/errorClassAssigner';\nimport { getTranslatedValidationMessage } from '../../utils/validation/validationMessages';\nimport { useI18nContext } from '../../context/I18nContext';\n\nexport const Select = ({\n name,\n defaultOptionKey,\n options,\n validationError,\n register,\n ...restProps\n}) => {\n const { i18n } = useI18nContext();\n\n return (\n \n \n {i18n.t(defaultOptionKey)} \n {options &&\n options.map(option => {\n const { key, name: optionName, value, ariaKey } = option;\n return (\n \n {key ? i18n.t(key) : optionName}\n \n );\n })}\n \n {validationError && (\n \n {getTranslatedValidationMessage({\n name,\n validationErrorTranslationKey: defaultOptionKey,\n validationType: validationError.type,\n t: i18n.t,\n })}\n \n )}\n
\n );\n};\n","import { hasErrorClassAssigner } from '../../utils/errorClassAssigner';\nimport { getTranslatedValidationMessage } from '../../utils/validation/validationMessages';\nimport { useI18nContext } from '../../context/I18nContext';\n\nexport const Checkbox = ({\n name,\n labelText,\n validationErrorTranslationKey,\n register,\n validationError,\n ...restProps\n}) => {\n const { i18n } = useI18nContext();\n\n return (\n \n
\n
\n \n \n \n {labelText} \n
\n {validationError && (\n
\n {getTranslatedValidationMessage({\n name,\n validationErrorTranslationKey,\n validationType: validationError.type,\n t: i18n.t,\n })}\n \n )}\n
\n
\n );\n};\n","import {\n hasErrorClassAssigner,\n hasNestedErrorsClassAssigner,\n} from '../../../utils/errorClassAssigner';\nimport { I18nText } from '../../I18n/I18nText';\nimport { deconstructDateOfBirth } from '../../../utils/userUtils';\nimport { useTranslation } from '../../../hooks/useTranslation';\n\nexport const BirthDateInput = ({\n register,\n errors,\n initialDateOfBirth,\n translationPrefix = 'profile.register',\n}) => {\n const { year: initYear } = deconstructDateOfBirth(initialDateOfBirth);\n const hasErrors = errors.year;\n const placeholderLabel = useTranslation(`${translationPrefix}.placeholder.yearOfBirth`);\n\n return (\n \n
\n {hasErrors && (\n
\n \n \n )}\n
\n );\n};\n","export const emailPattern = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\nexport const transcriptionPattern = /^[\\sa-zA-ZäöüÄÖÜß-]*$/;\nexport const namePattern = /^[^\\u0027\\u0022;{}<>&:\\\\]+$/;\n\nexport const passwordValid = password => {\n if (!password) {\n return false;\n }\n\n const minLength = 8;\n // eslint-disable-next-line\n let numberOfFulfilledConditions = 0;\n const minNumberOfFulfilledConditions = 3;\n const regexPatterns = [/[0-9]/, /[^A-Za-z_0-9]/, /[A-Z]/, /[a-z]/];\n\n regexPatterns.forEach(pattern => {\n if (password.match(pattern) !== null) {\n // eslint-disable-next-line\n numberOfFulfilledConditions += 1;\n }\n });\n\n return !!(\n password.length >= minLength && numberOfFulfilledConditions >= minNumberOfFulfilledConditions\n );\n};\n\nexport const passwordRetypeValid = (passwordRetype, password) =>\n !!(password && password === passwordRetype);\n\nexport const passwordDiffersFromEmail = (password, email) => {\n const repeatedCharsLimit = 4;\n const template = email;\n const { length } = template;\n // eslint-disable-next-line\n let subString;\n\n // eslint-disable-next-line\n for (let i = 0; i < length - repeatedCharsLimit; i++) {\n // eslint-disable-next-line\n subString = template.substring(i, i + repeatedCharsLimit);\n if (password.indexOf(subString) !== -1) {\n return false;\n }\n }\n return true;\n};\n\nconst validateCaptcha = (state, setState) => {\n setState({ ...state, captchaError: !state.isCaptchaPassed });\n return state.isCaptchaPassed;\n};\n\nexport const captcha = {\n validateCaptcha,\n};\n","import ReCAPTCHA from 'react-google-recaptcha';\nimport config from '../../config';\n\nexport const ReCaptcha = ({ languageCode, onSuccess, onExpired }) => {\n const checkForReCaptchaToken = token => {\n if (token) {\n onSuccess(token);\n }\n };\n\n return (\n \n );\n};\n","export const countries = [\n { value: 'AF', name: 'Afghanistan' },\n { value: 'AL', name: 'Albania' },\n { value: 'DZ', name: 'Algeria' },\n { value: 'AS', name: 'American Samoa' },\n { value: 'AD', name: 'Andorra' },\n { value: 'AO', name: 'Angola' },\n { value: 'AI', name: 'Anguilla' },\n { value: 'AQ', name: 'Antarctica' },\n { value: 'AG', name: 'Antigua and Barbuda' },\n { value: 'AR', name: 'Argentina' },\n { value: 'AM', name: 'Armenia' },\n { value: 'AW', name: 'Aruba' },\n { value: 'AU', name: 'Australia' },\n { value: 'AT', name: 'Austria' },\n { value: 'AZ', name: 'Azerbaijan' },\n { value: 'BS', name: 'Bahamas' },\n { value: 'BH', name: 'Bahrain' },\n { value: 'BD', name: 'Bangladesh' },\n { value: 'BB', name: 'Barbados' },\n { value: 'BY', name: 'Belarus' },\n { value: 'BE', name: 'Belgium' },\n { value: 'BZ', name: 'Belize' },\n { value: 'BJ', name: 'Benin' },\n { value: 'BM', name: 'Bermuda' },\n { value: 'BT', name: 'Bhutan' },\n { value: 'BO', name: 'Bolivia' },\n { value: 'BA', name: 'Bosnia and Herzegovina' },\n { value: 'BW', name: 'Botswana' },\n { value: 'BV', name: 'Bouvet Island' },\n { value: 'BR', name: 'Brazil' },\n { value: 'IO', name: 'British Indian Ocean Territory' },\n { value: 'BN', name: 'Brunei Darussalam' },\n { value: 'BG', name: 'Bulgaria' },\n { value: 'BF', name: 'Burkina Faso' },\n { value: 'BI', name: 'Burundi' },\n { value: 'CI', name: \"Côte d'Ivoire\" },\n { value: 'CV', name: 'Cabo Verde' },\n { value: 'KH', name: 'Cambodia' },\n { value: 'CM', name: 'Cameroon' },\n { value: 'CA', name: 'Canada' },\n { value: 'KY', name: 'Cayman Islands' },\n { value: 'CF', name: 'Central African Republic' },\n { value: 'TD', name: 'Chad' },\n { value: 'CL', name: 'Chile' },\n { value: 'CN', name: 'China' },\n { value: 'CX', name: 'Christmas Island' },\n { value: 'CC', name: 'Cocos Islands' },\n { value: 'CO', name: 'Colombia' },\n { value: 'KM', name: 'Comoros' },\n { value: 'CG', name: 'Congo' },\n { value: 'CK', name: 'Cook Islands' },\n { value: 'CR', name: 'Costa Rica' },\n { value: 'HR', name: 'Croatia' },\n { value: 'CU', name: 'Cuba' },\n { value: 'CY', name: 'Cyprus' },\n { value: 'CZ', name: 'Czech Republic' },\n { value: 'CD', name: 'Dem. Rep. of Congo' },\n { value: 'DK', name: 'Denmark' },\n { value: 'DJ', name: 'Djibouti' },\n { value: 'DM', name: 'Dominica' },\n { value: 'DO', name: 'Dominican Republic' },\n { value: 'EC', name: 'Ecuador' },\n { value: 'EG', name: 'Egypt' },\n { value: 'SV', name: 'El Salvador' },\n { value: 'GQ', name: 'Equatorial Guinea' },\n { value: 'ER', name: 'Eritrea' },\n { value: 'EE', name: 'Estonia' },\n { value: 'ET', name: 'Ethiopia' },\n { value: 'FK', name: 'Falkland Islands' },\n { value: 'FO', name: 'Faroe Islands' },\n { value: 'FJ', name: 'Fiji' },\n { value: 'FI', name: 'Finland' },\n { value: 'FR', name: 'France' },\n { value: 'GF', name: 'French Guyana' },\n { value: 'PF', name: 'French Polynesia' },\n { value: 'TF', name: 'French Southern and Antarctic Territories' },\n { value: 'GA', name: 'Gabon' },\n { value: 'GM', name: 'Gambia' },\n { value: 'GE', name: 'Georgia' },\n { value: 'DE', name: 'Germany' },\n { value: 'GH', name: 'Ghana' },\n { value: 'GI', name: 'Gibraltar' },\n { value: 'GB', name: 'Great Britain' },\n { value: 'GR', name: 'Greece' },\n { value: 'GL', name: 'Greenland' },\n { value: 'GD', name: 'Grenada' },\n { value: 'GP', name: 'Guadeloupe' },\n { value: 'GU', name: 'Guam' },\n { value: 'GT', name: 'Guatemala' },\n { value: 'GN', name: 'Guinea' },\n { value: 'GW', name: 'Guinea-Bissau' },\n { value: 'GY', name: 'Guyana' },\n { value: 'HT', name: 'Haiti' },\n { value: 'HM', name: 'Heard and the McDonald Islands' },\n { value: 'HN', name: 'Honduras' },\n { value: 'HK', name: 'Hong Kong' },\n { value: 'HU', name: 'Hungary' },\n { value: 'IS', name: 'Iceland' },\n { value: 'IN', name: 'India' },\n { value: 'ID', name: 'Indonesia' },\n { value: 'IR', name: 'Iran' },\n { value: 'IQ', name: 'Iraq' },\n { value: 'IE', name: 'Ireland' },\n { value: 'IL', name: 'Israel' },\n { value: 'IT', name: 'Italy' },\n { value: 'JM', name: 'Jamaica' },\n { value: 'JP', name: 'Japan' },\n { value: 'JO', name: 'Jordan' },\n { value: 'KZ', name: 'Kazakhstan' },\n { value: 'KE', name: 'Kenya' },\n { value: 'KI', name: 'Kiribati' },\n { value: 'KP', name: \"Korea (Democratic People's Republic of)\" },\n { value: 'KR', name: 'Korea (Republic)' },\n { value: 'KO', name: 'Kosovo' },\n { value: 'KW', name: 'Kuwait' },\n { value: 'KG', name: 'Kyrgyzstan' },\n { value: 'LA', name: 'Lao' },\n { value: 'LV', name: 'Latvia' },\n { value: 'LB', name: 'Lebanon' },\n { value: 'LS', name: 'Lesotho' },\n { value: 'LR', name: 'Liberia' },\n { value: 'LY', name: 'Libya' },\n { value: 'LI', name: 'Liechtenstein' },\n { value: 'LT', name: 'Lithuania' },\n { value: 'LU', name: 'Luxembourg' },\n { value: 'MO', name: 'Macau' },\n { value: 'MK', name: 'Macedonia' },\n { value: 'MG', name: 'Madagascar' },\n { value: 'MW', name: 'Malawi' },\n { value: 'MY', name: 'Malaysia' },\n { value: 'MV', name: 'Maldivian' },\n { value: 'ML', name: 'Mali' },\n { value: 'MT', name: 'Malta' },\n { value: 'MH', name: 'Marshall Islands' },\n { value: 'MQ', name: 'Martinique' },\n { value: 'MR', name: 'Mauritania' },\n { value: 'MU', name: 'Mauritius' },\n { value: 'YT', name: 'Mayotte' },\n { value: 'MX', name: 'Mexico' },\n { value: 'FM', name: 'Micronesia' },\n { value: 'MD', name: 'Moldova' },\n { value: 'MC', name: 'Monaco' },\n { value: 'MN', name: 'Mongolia' },\n { value: 'ME', name: 'Montenegro' },\n { value: 'MS', name: 'Montserrat' },\n { value: 'MA', name: 'Morocco' },\n { value: 'MZ', name: 'Mozambique' },\n { value: 'MM', name: 'Myanmar' },\n { value: 'NA', name: 'Namibia' },\n { value: 'NR', name: 'Nauru' },\n { value: 'NP', name: 'Nepal' },\n { value: 'NL', name: 'Netherlands' },\n { value: 'AN', name: 'Netherlands Antilles' },\n { value: 'NC', name: 'New Caledonia' },\n { value: 'NZ', name: 'New Zealand' },\n { value: 'NI', name: 'Nicaragua' },\n { value: 'NE', name: 'Niger' },\n { value: 'NG', name: 'Nigeria' },\n { value: 'NU', name: 'Niue' },\n { value: 'NF', name: 'Norfolk Island' },\n { value: 'MP', name: 'Northern Mariana Islands' },\n { value: 'NO', name: 'Norway' },\n { value: 'OM', name: 'Oman' },\n { value: 'PK', name: 'Pakistan' },\n { value: 'PW', name: 'Palau' },\n { value: 'PS', name: 'Palestine' },\n { value: 'PA', name: 'Panama' },\n { value: 'PG', name: 'Papua New Guinea' },\n { value: 'PY', name: 'Paraguay' },\n { value: 'PE', name: 'Peru' },\n { value: 'PH', name: 'Philippines' },\n { value: 'PN', name: 'Pitcairn' },\n { value: 'PL', name: 'Poland' },\n { value: 'PT', name: 'Portugal' },\n { value: 'PR', name: 'Puerto Rico' },\n { value: 'QA', name: 'Qatar' },\n { value: 'RE', name: 'Réunion' },\n { value: 'SS', name: 'Republic of South Sudan' },\n { value: 'RO', name: 'Romania' },\n { value: 'RU', name: 'Russia' },\n { value: 'RW', name: 'Rwanda' },\n { value: 'SH', name: 'Saint Helena' },\n { value: 'KN', name: 'Saint Kitts and Nevis' },\n { value: 'LC', name: 'Saint Lucia' },\n { value: 'VC', name: 'Saint Vincent & the Grenadines' },\n { value: 'WS', name: 'Samoa' },\n { value: 'SM', name: 'San Marino' },\n { value: 'ST', name: 'Sao Tomé and Principe' },\n { value: 'SA', name: 'Saudi Arabia' },\n { value: 'SN', name: 'Senegal' },\n { value: 'RS', name: 'Serbia' },\n { value: 'SC', name: 'Seychelles' },\n { value: 'SL', name: 'Sierra Leone' },\n { value: 'SG', name: 'Singapore' },\n { value: 'SK', name: 'Slovakia' },\n { value: 'SI', name: 'Slovenia' },\n { value: 'SB', name: 'Solomon Islands' },\n { value: 'SO', name: 'Somalia' },\n { value: 'ZA', name: 'South Africa' },\n { value: 'GS', name: 'South Georgia and the South Sandwich Islands' },\n { value: 'ES', name: 'Spain' },\n { value: 'LK', name: 'Sri Lanka' },\n { value: 'PM', name: 'St. Pierre and Miquelon' },\n { value: 'SD', name: 'Sudan' },\n { value: 'SR', name: 'Suriname' },\n { value: 'SJ', name: 'Svalbard and Jan Mayen' },\n { value: 'SZ', name: 'Swaziland' },\n { value: 'SE', name: 'Sweden' },\n { value: 'CH', name: 'Switzerland' },\n { value: 'SY', name: 'Syrian Arab Republic' },\n { value: 'TW', name: 'Taiwan, R.O.C.' },\n { value: 'TJ', name: 'Tajikistan' },\n { value: 'TZ', name: 'Tanzania' },\n { value: 'TH', name: 'Thailand' },\n { value: 'TL', name: 'Timor-Leste' },\n { value: 'TG', name: 'Togo' },\n { value: 'TK', name: 'Tokelau' },\n { value: 'TO', name: 'Tonga' },\n { value: 'TT', name: 'Trinidad & Tobago' },\n { value: 'TN', name: 'Tunisia' },\n { value: 'TR', name: 'Turkey' },\n { value: 'TM', name: 'Turkmenistan' },\n { value: 'TC', name: 'Turks and Caicos Islands' },\n { value: 'TV', name: 'Tuvalu' },\n { value: 'UG', name: 'Uganda' },\n { value: 'UA', name: 'Ukraine' },\n { value: 'AE', name: 'United Arab Emirates' },\n { value: 'UM', name: 'United States Minor Outlying Islands' },\n { value: 'US', name: 'United States of America' },\n { value: 'UY', name: 'Uruguay' },\n { value: 'UZ', name: 'Uzbekistan' },\n { value: 'VU', name: 'Vanuatu' },\n { value: 'VA', name: 'Vatican City' },\n { value: 'VE', name: 'Venezuela' },\n { value: 'VN', name: 'Viet Nam' },\n { value: 'VI', name: 'Virgin Islands' },\n { value: 'VG', name: 'Virgin Islands (brit.)' },\n { value: 'WF', name: 'Wallis and Futuna' },\n { value: 'EH', name: 'Western Sahara' },\n { value: 'YE', name: 'Yemen' },\n { value: 'ZM', name: 'Zambia' },\n { value: 'ZW', name: 'Zimbabwe' },\n];\nObject.freeze(countries);\n","import { LANG_CODES } from '../utils/mappers/langMapper';\n\nexport const contactLanguageOptions = Object.freeze([\n { value: LANG_CODES.GERMAN, name: 'German' },\n { value: LANG_CODES.ENGLISH, name: 'English' },\n { value: LANG_CODES.ARABIC, name: 'Arabic' },\n { value: LANG_CODES.RUSSIAN, name: 'Russian' },\n { value: 'fa', name: 'Persian' },\n { value: LANG_CODES.SPANISH, name: 'Spanish' },\n]);\n\nconst profileEditKeyPath = 'profile.edit';\nconst professionKeyPath = `${profileEditKeyPath}.profession`;\nexport const sexOptions = Object.freeze([\n { value: 'FEMALE', key: `${profileEditKeyPath}.sex.female` },\n { value: 'MALE', key: `${profileEditKeyPath}.sex.male` },\n { value: 'OTHER', key: `${profileEditKeyPath}.sex.other` },\n]);\n\nexport const professionOptions = Object.freeze([\n { value: 'ZFA_TEACHER', key: `${professionKeyPath}.zfa_teacher` },\n { value: 'PRIVATE_TEACHER', key: `${professionKeyPath}.private_teacher` },\n { value: 'INSTITUTE_MANAGER', key: `${professionKeyPath}.institute_manager` },\n { value: 'INSTITUTE_EMPLOYEE', key: `${professionKeyPath}.institute_employee` },\n { value: 'OTHER', key: `${professionKeyPath}.other` },\n]);\n\nconst languageLevelKeyPath = `${profileEditKeyPath}.languageLevel`;\nexport const languageLevelOptions = Object.freeze([\n { value: 'ZERO', key: `${languageLevelKeyPath}.zero` },\n { value: 'BEGINNER', key: `${languageLevelKeyPath}.beginner` },\n { value: 'INTERMEDIATE', key: `${languageLevelKeyPath}.intermediate` },\n { value: 'EXPERT', key: `${languageLevelKeyPath}.expert` },\n]);\n\nconst writingReadingLevelKeyPath = `${profileEditKeyPath}.writingReadingLevel`;\nexport const writingReadingLevelOptions = Object.freeze([\n { value: 'ZERO', key: `${writingReadingLevelKeyPath}.zero` },\n { value: 'NOT_LATIN', key: `${writingReadingLevelKeyPath}.not_latin` },\n { value: 'UNCERTAIN', key: `${writingReadingLevelKeyPath}.uncertain` },\n { value: 'CAN', key: `${writingReadingLevelKeyPath}.can` },\n]);\n\nconst handicapKeyPath = `${profileEditKeyPath}.handicap`;\nexport const handicapOptions = Object.freeze([\n {\n value: 'BLIND',\n key: `${handicapKeyPath}.blind.title`,\n ariaKey: `${handicapKeyPath}.blind.aria`,\n },\n {\n value: 'POOR_EYESIGHT',\n key: `${handicapKeyPath}.poor_eyesight.title`,\n ariaKey: `${handicapKeyPath}.blind.aria`,\n },\n {\n value: 'WEAK_HEARING',\n key: `${handicapKeyPath}.weak_hearing.title`,\n ariaKey: `${handicapKeyPath}.blind.aria`,\n },\n {\n value: 'MOUSE_USAGE',\n key: `${handicapKeyPath}.mouse_usage.title`,\n ariaKey: `${handicapKeyPath}.blind.aria`,\n },\n]);\n\nconst learningTypeKeyPath = `${profileEditKeyPath}.learningType`;\nexport const learningTypeOptions = Object.freeze([\n { value: 'MUSIC', key: `${learningTypeKeyPath}.music` },\n { value: 'AUDIO', key: `${learningTypeKeyPath}.audio` },\n { value: 'AUTHENTIC_TEXT', key: `${learningTypeKeyPath}.authentic_text` },\n]);\n","import { useRef, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { Input } from '../Input/Input';\nimport { Select } from '../Select/Select';\nimport { Checkbox } from '../Checkbox/Checkbox';\nimport { I18nText } from '../I18n/I18nText';\nimport { StyledStandardButton as StandardButton } from '../StandardButton/StandardButton';\nimport { BirthDateInput } from '../Input/BirthDateInput/BirthDateInput';\nimport {\n emailPattern,\n namePattern,\n passwordDiffersFromEmail,\n passwordRetypeValid,\n passwordValid,\n captcha,\n} from '../../utils/validation/validators';\nimport { ReCaptcha } from '../ReCaptcha/ReCaptcha';\nimport { scrollIntoViewCenter } from '../../utils/htmlUtils';\nimport { hasErrorClassAssigner } from '../../utils/errorClassAssigner';\nimport { Text } from '../Text/Text';\nimport { getDashboardUrl } from '../../utils/url/urlFactory';\nimport { countries } from '../../constants/countries';\nimport { registerUser } from '../../services/userService';\nimport { sexOptions } from '../../constants/userInputOptions';\nimport { CUSTOM_ERROR_TRANSLATION_KEYS } from '../../utils/validation/validationMessages';\nimport { feedbackHelper } from '../../utils/url/feedbackHelpers';\nimport { useI18nContext } from '../../context/I18nContext';\nimport { useTranslation } from '../../hooks/useTranslation';\n\nexport const Registration = () => {\n const { i18n } = useI18nContext();\n\n const [state, setState] = useState({\n isCaptchaPassed: false,\n captchaError: false,\n captchaToken: null,\n });\n\n const captchaRef = useRef();\n const { langCode } = useParams();\n const history = useHistory();\n\n const {\n register,\n handleSubmit,\n getValues,\n formState: { errors },\n } = useForm({\n mode: 'onSubmit',\n reValidateMode: 'onSubmit',\n });\n\n const captchaMessage = useTranslation('client.recaptcha');\n const captchaValidationMessage = useTranslation({\n key: 'client.validator.required',\n parameters: { first: captchaMessage },\n });\n\n const createLink = (href, text) => `\n ${text}\n `;\n\n const createPrivacyPolicyLink = t =>\n createLink('https://p.dw.com/p/1Edck', t('profile.register.privacyPolicy'));\n\n const createAgbLink = t => createLink('https://p.dw.com/p/16hIr', t('profile.register.agb'));\n\n const fullGdpr = t => {\n const label = t('profile.register.agbAndPrivacyPolicyFormat', {\n dataPrivacyPolicy: createPrivacyPolicyLink(t),\n conditionsOfParticipation: createAgbLink(t),\n });\n return (\n <>\n \n \n \n \n \n >\n );\n };\n\n const checkboxes = [\n {\n name: 'gdpr',\n labelTextFunc: fullGdpr,\n validationErrorTranslationKey: 'client.acceptTermsConditions',\n register: register('gdpr', { required: true }),\n validationError: errors.gdpr,\n },\n {\n name: 'teacher',\n labelText: ,\n register: register('teacher'),\n },\n {\n name: 'newsletter',\n labelText: ,\n register: register('newsletter'),\n },\n ];\n\n const onSubmit = async userData => {\n if (captcha.validateCaptcha(state, setState)) {\n try {\n const response = await registerUser({\n userData,\n captchaToken: state.captchaToken,\n langCode,\n });\n if (response.ok) {\n history.push(feedbackHelper.forRegistered(langCode));\n } else {\n const responseJson = await response.json();\n history.push(feedbackHelper.getForErrorCode(responseJson, langCode));\n }\n } catch (err) {\n history.push(feedbackHelper.getForErrorCode(err, langCode));\n }\n } else {\n scrollIntoViewCenter(captchaRef.current);\n }\n };\n\n const onCaptchaSuccess = token => {\n setState({ ...state, isCaptchaPassed: true, captchaToken: token });\n };\n\n const onCaptchaExpired = () => {\n setState({ ...state, isCaptchaPassed: false, captchaToken: null });\n };\n\n const cancelRegistration = e => {\n e.preventDefault();\n history.push(getDashboardUrl(langCode));\n };\n\n return (\n \n );\n};\n","export const formatPasswordResetUserData = ({ userData, captchaToken }) => ({\n email: userData.email,\n recaptcha: captchaToken,\n});\n","import { USER } from '../constants/userUrl';\nimport { BASIC_JSON_CONTENT_TYPE_HEADER } from '../constants/services';\nimport { formatPasswordResetUserData } from '../utils/mappers/passwordReset';\n\nconst PS_PREFIX = USER.PS_URL;\nconst PASSWORD_RESOURCE_PUBLIC_RESET = `${PS_PREFIX}public/user/password/reset`;\nexport const PASSWORD_RESOURCE_PUBLIC_RESET_REQUEST = `${PS_PREFIX}public/user/password/reset-request`;\nconst PASSWORD_RESOURCE_PROTECTED = `${PS_PREFIX}protected/user/password`;\n\nexport const changePassword = (oldUserPassword, userPassword) =>\n fetch(`${PASSWORD_RESOURCE_PROTECTED}/change`, {\n method: 'POST',\n body: JSON.stringify({\n oldPassword: oldUserPassword,\n newPassword: userPassword,\n }),\n ...BASIC_JSON_CONTENT_TYPE_HEADER,\n });\n\nexport const requestResetPassword = ({ userData, captchaToken }) => {\n const formattedData = formatPasswordResetUserData({ userData, captchaToken });\n return fetch(PASSWORD_RESOURCE_PUBLIC_RESET_REQUEST, {\n method: 'POST',\n body: JSON.stringify(formattedData),\n ...BASIC_JSON_CONTENT_TYPE_HEADER,\n }).then(response => (response.ok ? Promise.resolve(response) : Promise.reject(response)));\n};\n\nexport const setPasswordByToken = (newPassword, token) =>\n fetch(PASSWORD_RESOURCE_PUBLIC_RESET, {\n method: 'POST',\n body: JSON.stringify({\n newPassword,\n passwordResetToken: token,\n }),\n ...BASIC_JSON_CONTENT_TYPE_HEADER,\n }).then(response => (response.ok ? Promise.resolve(response) : Promise.reject(response)));\n\nexport const getUserByConfirmationId = confirmationId =>\n fetch(`${PS_PREFIX}public/user/mail?token=${confirmationId}`)\n .then(res => res.text())\n .catch(e => console.log(e));\n","import { Input } from '../Input';\nimport {\n passwordDiffersFromEmail,\n passwordRetypeValid,\n passwordValid,\n} from '../../../utils/validation/validators';\n\nexport const NewPasswordInputs = ({\n passwordTitleKey,\n passwordPlaceholderKey,\n passwordRepeatTitleKey,\n passwordRepeatPlaceholderKey,\n email,\n register,\n errors,\n getValues,\n}) => {\n return (\n <>\n passwordValid(value),\n differsFromEmail: value => passwordDiffersFromEmail(value, email),\n },\n })}\n validationError={errors.password}\n />\n passwordRetypeValid(value, getValues().password),\n },\n })}\n validationError={errors.passwordRetype}\n />\n >\n );\n};\n","import { useForm } from 'react-hook-form';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { I18nText } from '../I18n/I18nText';\nimport { Input } from '../Input/Input';\nimport { StyledStandardButton as StandardButton } from '../StandardButton/StandardButton';\nimport { changePassword } from '../../services/passwordService';\nimport { feedbackHelper } from '../../utils/url/feedbackHelpers';\nimport { NewPasswordInputs } from '../Input/NewPassword/NewPasswordInputs';\nimport { userDataSelector } from '../../state/user/userSelectors';\n\nexport const PasswordChange = () => {\n const { langCode } = useParams();\n const history = useHistory();\n\n const {\n register,\n handleSubmit,\n getValues,\n formState: { errors },\n } = useForm({\n mode: 'onSubmit',\n reValidateMode: 'onSubmit',\n });\n\n const { email } = useSelector(userDataSelector);\n\n const onSubmit = async data => {\n const { oldPassword, password } = data;\n\n try {\n const changePasswordResponse = await changePassword(oldPassword, password);\n\n if (!changePasswordResponse.ok) {\n const jsonResponse = await changePasswordResponse.json();\n history.push(feedbackHelper.getForPasswordChangeErrorCode(jsonResponse, langCode));\n } else {\n history.push(feedbackHelper.forPasswordChanged(langCode));\n }\n } catch (err) {\n history.push(feedbackHelper.forGeneralError(langCode));\n }\n };\n\n return (\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n
\n
\n
\n );\n};\n","import { useRef, useState } from 'react';\nimport { useHistory, useParams } from 'react-router';\nimport { useForm } from 'react-hook-form';\nimport { I18nText } from '../I18n/I18nText';\nimport { Input } from '../Input/Input';\nimport { captcha, emailPattern } from '../../utils/validation/validators';\nimport { hasErrorClassAssigner } from '../../utils/errorClassAssigner';\nimport { ReCaptcha } from '../ReCaptcha/ReCaptcha';\nimport { StyledStandardButton as StandardButton } from '../StandardButton/StandardButton';\nimport { scrollIntoViewCenter } from '../../utils/htmlUtils';\nimport { requestResetPassword } from '../../services/passwordService';\nimport { feedbackHelper } from '../../utils/url/feedbackHelpers';\nimport { useTranslation } from '../../hooks/useTranslation';\n\nexport const PasswordReset = () => {\n const [state, setState] = useState({\n isCaptchaPassed: false,\n captchaError: false,\n captchaToken: null,\n });\n const { langCode } = useParams();\n const captchaRef = useRef();\n const history = useHistory();\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm({\n mode: 'onSubmit',\n reValidateMode: 'onSubmit',\n });\n\n const captchaMessage = useTranslation('client.recaptcha');\n const captchaValidationMessage = useTranslation({\n key: 'client.validator.required',\n parameters: { first: captchaMessage },\n });\n\n const onSubmit = async data => {\n if (!captcha.validateCaptcha(state, setState)) {\n scrollIntoViewCenter(captchaRef.current);\n return;\n }\n try {\n await requestResetPassword({ userData: data, captchaToken: state.captchaToken });\n history.push(feedbackHelper.forPasswordResetRequest(langCode));\n } catch (err) {\n history.push(feedbackHelper.getForErrorCode(err, langCode));\n }\n };\n\n const onCaptchaSuccess = token => {\n setState({ ...state, isCaptchaPassed: true, captchaToken: token });\n };\n\n const onCaptchaExpired = () => {\n setState({ ...state, isCaptchaPassed: false, captchaToken: null });\n };\n\n return (\n \n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n
\n
\n );\n};\n","import { Link } from 'react-router-dom';\nimport { useLocation, useParams } from 'react-router';\nimport { I18nText } from '../I18n/I18nText';\nimport { StyledStandardButton } from '../StandardButton/StandardButton';\nimport { feedbackHelper } from '../../utils/url/feedbackHelpers';\nimport { getTargetPageUrl, URL_SEARCH_PARAM_TARGET_PATH } from '../../utils/url/urlFactory';\nimport { COMMON_FEEDBACK_TRANSLATION_KEYS } from '../../constants/feedback';\n\nexport const StatusFeedback = () => {\n const { langCode, feedbackType } = useParams();\n const { search } = useLocation();\n\n const feedbackContentKey = feedbackHelper.getFeedbackContentKey(feedbackType);\n const urlParams = new URLSearchParams(search);\n const targetPath = urlParams.get(URL_SEARCH_PARAM_TARGET_PATH);\n const targetPageUrl = targetPath || getTargetPageUrl(feedbackType, langCode);\n\n return (\n \n );\n};\n","import { useDispatch } from 'react-redux';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useForm } from 'react-hook-form';\nimport { Checkbox } from '../../Checkbox/Checkbox';\nimport { I18nText } from '../../I18n/I18nText';\nimport { StyledStandardButton } from '../../StandardButton/StandardButton';\nimport { deleteUser } from '../../../services/userService';\nimport { deleteUserAccount } from '../../../state/user/userDuck';\nimport { feedbackHelper } from '../../../utils/url/feedbackHelpers';\nimport { useTranslation } from '../../../hooks/useTranslation';\n\nexport const DeleteAccountModal = ({ onClose }) => {\n const { langCode } = useParams();\n const history = useHistory();\n const dispatch = useDispatch();\n\n const { register, handleSubmit } = useForm({\n mode: 'onSubmit',\n });\n\n const confirmDeleteLabel = useTranslation('profile.edit.modal.confirmDelete');\n\n const onSubmit = async () => {\n try {\n const response = await deleteUser();\n if (response.ok) {\n dispatch(deleteUserAccount());\n history.push(feedbackHelper.forUserDelete(langCode));\n } else {\n const responseJson = await response.json();\n history.push(feedbackHelper.getForErrorCode(responseJson, langCode));\n }\n } catch (err) {\n history.push(feedbackHelper.getForErrorCode(err, langCode));\n }\n };\n\n return (\n <>\n \n
\n >\n );\n};\n","import { useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Link, useHistory } from 'react-router-dom';\nimport { useParams } from 'react-router';\nimport {\n contactLanguageOptions,\n handicapOptions,\n languageLevelOptions,\n learningTypeOptions,\n professionOptions,\n sexOptions,\n writingReadingLevelOptions,\n} from '../../constants/userInputOptions';\nimport { setUser } from '../../state/user/userDuck';\nimport { feedbackHelper } from '../../utils/url/feedbackHelpers';\nimport { updateUserProfile } from '../../services/userService';\nimport { I18nText } from '../I18n/I18nText';\nimport { DeleteAccountModal } from '../Modal/DeleteAccountModal/DeleteAccountModal';\nimport { ModalIntegration } from '../Modal/ModalIntegration';\nimport { StyledStandardButton } from '../StandardButton/StandardButton';\nimport { getPasswordChangeUrl } from '../../utils/url/urlFactory';\nimport { Checkbox } from '../Checkbox/Checkbox';\nimport { Select } from '../Select/Select';\nimport { BirthDateInput } from '../Input/BirthDateInput/BirthDateInput';\nimport { countries } from '../../constants/countries';\nimport { Input } from '../Input/Input';\nimport { emailPattern, namePattern, transcriptionPattern } from '../../utils/validation/validators';\nimport { CUSTOM_ERROR_TRANSLATION_KEYS } from '../../utils/validation/validationMessages';\nimport { userDataSelector } from '../../state/user/userSelectors';\nimport { useI18nContext } from '../../context/I18nContext';\n\nexport const UserProfile = () => {\n const history = useHistory();\n const { langCode } = useParams();\n const dispatch = useDispatch();\n const userData = useSelector(userDataSelector);\n const { i18n } = useI18nContext();\n\n const [isDeleteModalOpen, setDeleteModalOpen] = useState(false);\n\n const {\n register,\n handleSubmit,\n getValues,\n formState: { errors },\n } = useForm({\n mode: 'onSubmit',\n reValidateMode: 'onSubmit',\n });\n\n const additionalSelectInputs = [\n { name: 'contactLanguage', options: contactLanguageOptions, translationKeySuffix: '' },\n { name: 'profession', options: professionOptions },\n { name: 'languageLevel', options: languageLevelOptions },\n { name: 'writingReadingLevel', options: writingReadingLevelOptions },\n { name: 'handicap', options: handicapOptions },\n { name: 'learningType', options: learningTypeOptions },\n ];\n\n const checkboxInputs = [\n { name: 'teacher', translationKeySuffix: '.teacher' },\n { name: 'newsletter', translationKeySuffix: '.newsletter.subscribe' },\n { name: 'signalSoundDisabled', translationKeySuffix: '.signalSoundTurnOff' },\n ];\n\n const removeEmptySelectValues = data => {\n const cleanedData = { ...data };\n additionalSelectInputs.forEach(selectInputName => {\n const value = cleanedData[selectInputName.name];\n if (value === '') {\n // eslint-disable-next-line fp/no-delete\n delete cleanedData[selectInputName.name];\n }\n });\n return cleanedData;\n };\n\n const onSubmit = async data => {\n const cleanedData = removeEmptySelectValues(data);\n try {\n const updatedData = await updateUserProfile(cleanedData);\n dispatch(setUser(updatedData));\n updatedData.email !== getValues().email\n ? history.push(feedbackHelper.forMailChangeRequest(langCode))\n : history.push(feedbackHelper.forProfileUpdated(langCode));\n } catch (err) {\n history.push(feedbackHelper.getForErrorCode(err, langCode));\n }\n };\n\n const toggleDeleteAccountModal = () => {\n setDeleteModalOpen(!isDeleteModalOpen);\n };\n\n return (\n \n
\n
\n
\n
\n \n \n \n \n \n \n \n \n
\n
\n
\n
\n );\n};\n","import { useEffect, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { feedbackHelper } from '../../utils/url/feedbackHelpers';\nimport { getUserByConfirmationId, setPasswordByToken } from '../../services/passwordService';\nimport { I18nText } from '../I18n/I18nText';\nimport { NewPasswordInputs } from '../Input/NewPassword/NewPasswordInputs';\nimport { StyledStandardButton as StandardButton } from '../StandardButton/StandardButton';\nimport { StyledLoadingMessage as LoadingMessage } from '../commons/LoadingMessage';\n\nexport const SetNewPassword = ({ confirmationId }) => {\n const history = useHistory();\n const { langCode } = useParams();\n const [email, setEmail] = useState(null);\n\n useEffect(() => {\n getUserByConfirmationId(confirmationId)\n .then(userEmailResponse => {\n if (!userEmailResponse.includes('@')) {\n history.push(feedbackHelper.forInvalidToken(langCode));\n } else {\n setEmail(userEmailResponse);\n }\n })\n .catch(e => {\n history.push(feedbackHelper.getForErrorCode(e, langCode));\n });\n // eslint-disable-next-line\n }, []);\n\n const {\n register,\n handleSubmit,\n getValues,\n formState: { errors },\n } = useForm({\n mode: 'onSubmit',\n reValidateMode: 'onSubmit',\n });\n\n const onSubmit = async () => {\n try {\n await setPasswordByToken(getValues().password, confirmationId);\n history.push(feedbackHelper.forSetPassword(langCode));\n } catch (err) {\n history.push(feedbackHelper.getForErrorCode(err, langCode));\n }\n };\n\n return email ? (\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n
\n
\n
\n ) : (\n \n );\n};\n","/* eslint-disable jsx-a11y/anchor-is-valid,jsx-a11y/aria-role */\nimport { useSelector } from 'react-redux';\nimport { Link } from 'react-router-dom';\nimport { createGlobalStyle } from 'styled-components';\nimport { DwPicture } from '../DwPicture/DwPicture';\nimport { I18nText } from '../I18n/I18nText';\nimport { getContentUrl } from '../../utils/url/urlFactory';\nimport { learningLevelMapper } from '../../utils/learningLevelUtils';\nimport { findLessonLearnProgressSelector } from '../../state/progress/learnProgressSelectors';\nimport { LearnProgressIcon } from '../LearnProgressIcon/LearnProgressIcon';\nimport { progressIconColors } from '../ProgressIcon/progressIconColors';\n\nexport const PlacementTile = ({ lesson, index }) => {\n const { dkLearningLevel, id, name, subTitle } = lesson;\n const lessonProgress = useSelector(findLessonLearnProgressSelector(id));\n const level = learningLevelMapper[dkLearningLevel];\n\n return (\n \n \n \n \n \n
{level} \n \n \n \n \n );\n};\n\nconst PlacementTestGlobalStyles = createGlobalStyle`\n div.allcourses .main-course {\n float: left;\n text-align: left\n }\n\n div.allcourses .main-course h2 {\n float: left;\n margin: 0 6px 0 0\n }\n\n @media (max-width: 767px) {\n div.allcourses .main-course h2 {\n margin: 5px 6px 0 10px\n }\n }\n\n div.allcourses .main-course p.course-title {\n margin: 6px 0 0\n }\n\n div.allcourses .main-course span.progress-icon {\n float: right;\n margin-top: 20px\n }\n\n div.allcourses .main-course span.progress-icon.half {\n margin-left: 8px\n }\n\n @media (min-width: 768px) {\n div.allcourses .main-course p {\n clear: left\n }\n\n div.allcourses .main-course p.course-title {\n margin: 32px 7px 0 16px\n }\n }\n\n @media (min-width: 992px) {\n div.allcourses .main-course span.progress-icon.half {\n margin-left: 10px\n }\n }\n\n @media (max-width: 767px) {\n div.allcourses .main-course[class*=assess] {\n height: 180px\n }\n\n div.allcourses .main-course[class*=assess] span.progress-icon {\n margin-top: 5px\n }\n\n div.allcourses .main-course[class*=assess] h2 {\n font-size: 36px;\n line-height: 40px;\n display: inline;\n float: none;\n width: auto;\n margin: 0\n }\n\n div.allcourses .main-course[class*=assess] p {\n max-width: 100%;\n max-height: 100%;\n overflow: visible;\n opacity: 1;\n margin: 0\n }\n }\n`;\n\nexport const PlacementTest = ({ data }) => {\n const { name, subTitle, mainContentImageLink, lessons } = data.content;\n return (\n \n
\n
\n
\n
\n
\n {lessons.map((lesson, index) => (\n
\n ))}\n
\n
\n \n
\n
\n
\n
\n );\n};\n","import gql from 'graphql-tag';\nimport { useParams } from 'react-router';\nimport { toLang } from '../utils/mappers/langMapper';\nimport { PageContainer } from '../components/Page/PageContainer';\nimport { PlacementTest } from '../components/PlacementTest/PlacementTest';\nimport { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { getPlacementTestIdForLangCode } from '../utils/mappers/placementTestCourseIds';\nimport { metaDataFragment, PageMetaData } from '../components/Page/PageMetaData';\nimport { PAGE_TYPES } from '../constants/pageTypes';\nimport {\n gtmDataLayerFragment,\n GtmScriptWithDataLayer,\n} from '../components/GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const placementTestPageQuery = gql`\n query PlacementTestPage($id: Int!, $lang: Language!) {\n content(id: $id, lang: $lang) {\n ... on Course {\n id\n name\n subTitle\n mainContentImageLink {\n name\n targetId\n }\n lessons {\n subTitle: teaser\n id\n name\n language\n dkLearningLevel\n }\n ...${metaDataFragment.name}\n ${gtmDataLayerFragment.partial()}\n }\n }\n }\n ${metaDataFragment.fragment({ type: 'Course' })}\n`;\n\nexport const PlacementTestPage = () => {\n const { langCode } = useParams();\n const placementCourseId = getPlacementTestIdForLangCode(langCode);\n\n const placementTestPageQueryVariables = {\n id: placementCourseId,\n lang: toLang(langCode),\n };\n\n return (\n \n \n {data => (\n <>\n \n \n \n >\n )}\n \n \n );\n};\n","/* eslint-disable jsx-a11y/aria-role */\nimport { useEffect, useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { useParams } from 'react-router';\nimport { I18nText } from '../I18n/I18nText';\nimport { getHelpUrl } from '../../utils/url/urlFactory';\nimport { StyledStandardButton } from '../StandardButton/StandardButton';\nimport { useI18nContext } from '../../context/I18nContext';\nimport { getLastEditedLessonsIds } from '../../services/learnProgressService';\n\nconst SCOPE = Object.freeze({\n LAST_LESSON: 1,\n LAST_THREE_LESSONS: 3,\n LAST_TEN_LESSONS: 10,\n ALL_LESSONS: 0,\n});\n\nconst scopeToTranslationKeyMapping = Object.freeze({\n [SCOPE.LAST_LESSON]: 'vocabularyTrainer.last',\n [SCOPE.LAST_THREE_LESSONS]: 'vocabularyTrainer.last3',\n [SCOPE.LAST_TEN_LESSONS]: 'vocabularyTrainer.last10',\n [SCOPE.ALL_LESSONS]: 'vocabularyTrainer.all',\n});\n\nexport const VocabularyTrainerStart = ({\n setLastLessonsIds,\n setNumberOfVocabularies,\n handleExerciseStart,\n}) => {\n const [numberOfLessons, setNumberOfLessons] = useState(SCOPE.LAST_LESSON);\n const { langCode } = useParams();\n const { i18n } = useI18nContext();\n\n const handleChangeScope = async value => {\n const lastEditedLessonIds = await getLastEditedLessonsIds(value, langCode);\n setNumberOfLessons(value);\n setLastLessonsIds && setLastLessonsIds(lastEditedLessonIds);\n };\n\n const handleSubmit = e => {\n e.preventDefault();\n handleExerciseStart && handleExerciseStart();\n };\n\n useEffect(() => {\n handleChangeScope(SCOPE.LAST_LESSON);\n // eslint-disable-next-line\n }, []);\n\n return (\n \n );\n};\n","import classnames from 'classnames';\nimport styled from 'styled-components';\nimport { I18nText } from '../I18n/I18nText';\nimport { useRtlContext } from '../../hooks/useRtl';\n\nexport const VocabularyTrainerStatus = ({ number, total, top, bottom, className }) => {\n const { isRtl } = useRtlContext();\n\n const rtlText = (\n \n \n {` ${number} `}\n \n {` ${total}`} \n
\n );\n\n const ltrText = (\n \n {`${number} `}\n \n {` ${total} `} \n \n
\n );\n\n return (\n \n
\n
\n {isRtl ? rtlText : ltrText}\n
\n
\n
\n );\n};\n\nexport const StyledVocabularyTrainerStatus = styled(VocabularyTrainerStatus)`\n & div.exercise-nav div.exercise-nav-title.rtl {\n direction: rtl;\n }\n`;\n","import { RichText } from '../RichText/RichText';\nimport { DwPicture } from '../DwPicture/DwPicture';\n\nexport const BubbleContainer = ({ children, mainContentImage }) => {\n return (\n \n {mainContentImage && }\n \n
\n );\n};\n","import { useRef, useState, useEffect } from 'react';\nimport styled, { createGlobalStyle } from 'styled-components';\nimport classnames from 'classnames';\nimport { BubbleContainer } from './BubbleContainer';\nimport { StyledSolveButton } from '../SolveCheckButton/SolveButton';\nimport { I18nText } from '../I18n/I18nText';\n\nconst VocabularyTrainerItemGlobalStyles = createGlobalStyle` \n /* @noflip */\n .alwaysLtr {\n text-align: left;\n direction: ltr;\n }\n`;\n\nexport const VocabularyTrainerItem = ({\n vocabulary: { text, audios, subTitle, name },\n onSolved,\n isHidden,\n className,\n}) => {\n const audioRef = useRef();\n const { mp3Src, mainContentImage } = audios[0] || {};\n const [isSolved, setSolved] = useState(false);\n const [audioStatus, setAudioStatus] = useState('');\n const [isDisabled, setDisabled] = useState(false);\n\n const onSolveClicked = event => {\n event.preventDefault();\n setSolved(true);\n setDisabled(true);\n if (!mp3Src) {\n setAudioStatus('ending');\n onSolved();\n }\n };\n\n const onAnswerClicked = event => {\n event.preventDefault();\n audioRef.current.play();\n setAudioStatus('playing');\n };\n\n const onAudioEnded = () => {\n setAudioStatus('ending');\n onSolved();\n };\n\n useEffect(() => {\n if (!isHidden) {\n setSolved(false);\n setAudioStatus('');\n setDisabled(false);\n }\n }, [text, isHidden]);\n\n return (\n <>\n \n {!isHidden && (\n \n )}\n >\n );\n};\n\nexport const StyledVocabularyTrainerItem = styled(VocabularyTrainerItem)`\n & .answer-multiple-text:hover:after {\n -webkit-transition: all 0.3s linear;\n -moz-transition: all 0.3s linear;\n -o-transition: all 0.3s linear;\n transition: all 0.3s linear;\n border-left-color: #0098ff;\n }\n & .bubble .hint {\n display: block;\n font-size: 80%;\n font-style: italic;\n }\n`;\n","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgSmileyPositive(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"100%\",\n height: \"100%\",\n viewBox: \"0 0 55 54\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n xmlSpace: \"preserve\",\n style: {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n strokeLinejoin: \"round\",\n strokeMiterlimit: 1.41421\n },\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"circle\", {\n className: \"dot\",\n cx: 27.5,\n cy: 27,\n r: 27,\n style: {\n fill: \"#A9A094\"\n }\n }), /*#__PURE__*/React.createElement(\"g\", {\n id: \"face\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M26.439,37.092l-11.313,-11.314l-2.829,2.829l11.314,11.313l2.828,-2.828Z\",\n style: {\n fill: \"#fff\"\n }\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M39.874,18l-19.092,19.092l2.829,2.828l19.092,-19.092l-2.829,-2.828Z\",\n style: {\n fill: \"#fff\"\n }\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgSmileyPositive);\nexport default __webpack_public_path__ + \"static/media/smiley-positive.3d91069e.svg\";\nexport { ForwardRef as ReactComponent };","const __webpack_public_path__ = \"https://learngerman.dw.com/\";\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgSmileyNegative(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"100%\",\n height: \"100%\",\n viewBox: \"0 0 55 54\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n xmlSpace: \"preserve\",\n style: {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n strokeLinejoin: \"round\",\n strokeMiterlimit: 1.41421\n },\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"circle\", {\n className: \"dot\",\n cx: 27.5,\n cy: 27,\n r: 27,\n style: {\n fill: \"#A9A094\"\n }\n }), /*#__PURE__*/React.createElement(\"g\", {\n id: \"face\"\n }, /*#__PURE__*/React.createElement(\"circle\", {\n cx: 18.5,\n cy: 18.5,\n r: 3.5,\n style: {\n fill: \"#fff\"\n }\n }), /*#__PURE__*/React.createElement(\"circle\", {\n cx: 36.5,\n cy: 18.5,\n r: 3.5,\n style: {\n fill: \"#fff\"\n }\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M40.902,32.312l-26.41,5.613l0.624,2.935l26.41,-5.614l-0.624,-2.934Z\",\n style: {\n fill: \"#fff\"\n }\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgSmileyNegative);\nexport default __webpack_public_path__ + \"static/media/smiley-negative.6c289ab6.svg\";\nexport { ForwardRef as ReactComponent };","import styled from 'styled-components';\nimport { ReactComponent as SmileyPositive } from '../svg/smiley-positive.svg';\nimport { ReactComponent as SmileyNegative } from '../svg/smiley-negative.svg';\n\nexport const StyledSmileyPositive = styled(SmileyPositive)``;\nexport const StyledSmileyNegative = styled(SmileyNegative)``;\n","import { useState } from 'react';\nimport classnames from 'classnames';\nimport styled from 'styled-components';\nimport {\n StyledSmileyNegative as SmileyNegative,\n StyledSmileyPositive as SmileyPositive,\n} from '../../assets/icons/Smiley';\nimport { useRtlContext } from '../../hooks/useRtl';\n\nexport const VocabularyTrainerSmileys = ({ handleCorrectAnswer, handleWrongAnswer, className }) => {\n const ANSWER_STATE = Object.freeze({\n INITIAL: 'initial',\n WRONG: 'wrong',\n CORRECT: 'correct',\n });\n const { isRtl } = useRtlContext();\n const [answerState, setAnswerState] = useState(ANSWER_STATE.INITIAL);\n\n const onPositiveSmileyClicked = e => {\n e.preventDefault();\n setAnswerState(ANSWER_STATE.CORRECT);\n handleCorrectAnswer();\n };\n\n const onNegativeSmileyClicked = e => {\n e.preventDefault();\n setAnswerState(ANSWER_STATE.WRONG);\n handleWrongAnswer();\n };\n\n return (\n \n
\n {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}\n
\n \n \n
\n
\n {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}\n
\n \n \n
\n
\n );\n};\n\nexport const StyledVocabularyTrainerSmileys = styled(VocabularyTrainerSmileys)`\n @media (min-width: 768px) {\n &.isRtl .col-lg-offset-5 {\n margin-right: 0;\n margin-left: 33.3333%;\n }\n }\n`;\n","import { useState } from 'react';\nimport { useTimeout } from './useTimeout';\n\nexport const TRANSITION_STATUS = Object.freeze({\n INITIAL: 'initial',\n BUSY: 'busy',\n READY: 'ready',\n});\n\nexport const useTransition = ({ delay }) => {\n const [transition, setTransition] = useState({ status: TRANSITION_STATUS.INITIAL });\n\n useTimeout(\n {\n callback: () => {\n if (transition.status === TRANSITION_STATUS.BUSY) {\n transition.onTransitionEnd();\n }\n setTransition({ status: TRANSITION_STATUS.READY });\n },\n delay,\n },\n [transition],\n );\n\n const startTransition = newTransition => {\n setTransition({ ...newTransition, status: TRANSITION_STATUS.BUSY });\n };\n\n return { transitionStatus: transition.status, startTransition };\n};\n","import { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport classnames from 'classnames';\nimport { useHistory, useParams } from 'react-router';\nimport { StyledVocabularyTrainerStatus as VocabularyTrainerStatus } from './VocabularyTrainerStatus';\nimport { StyledVocabularyTrainerItem as VocabularyTrainerItem } from './VocabularyTrainerItem';\nimport { StyledVocabularyTrainerSmileys as VocabularyTrainerSmileys } from './VocabularyTrainerSmileys';\nimport { useTransition } from '../../hooks/useTransition';\nimport { getFeedbackUrl } from '../../utils/url/urlFactory';\nimport { FEEDBACK_TYPES } from '../../constants/feedback';\n\nexport const VocabularyTrainerExercise = ({ vocabularies, handleExerciseEnd, className }) => {\n const [isSolved, setSolved] = useState(false);\n const [correctAnswers, setCorrectAnswers] = useState(0);\n const [trainerVocabularies, setTrainerVocabularies] = useState(vocabularies);\n const history = useHistory();\n const { langCode } = useParams();\n\n const nextVocabulary = newTrainerVocabularies => {\n const slicedTrainerVocabularies = newTrainerVocabularies.slice(1);\n setTrainerVocabularies(slicedTrainerVocabularies);\n setSolved(false);\n if (!slicedTrainerVocabularies.length) {\n handleExerciseEnd();\n }\n };\n\n const { transitionStatus, startTransition } = useTransition({\n delay: 300,\n });\n\n useEffect(() => {\n if (vocabularies.length === 0) {\n history.push(getFeedbackUrl(FEEDBACK_TYPES.VOCABULARY_TRAINER_NO_VOCABULARIES, langCode));\n }\n }, [history, langCode, vocabularies.length]);\n\n const onSolved = () => {\n setSolved(true);\n };\n\n const handleCorrectAnswer = () => {\n startTransition({ onTransitionEnd: () => nextVocabulary(trainerVocabularies) });\n setCorrectAnswers(value => value + 1);\n };\n const handleWrongAnswer = () => {\n const newTrainerVocabularies = [...trainerVocabularies, trainerVocabularies[0]];\n startTransition({ onTransitionEnd: () => nextVocabulary(newTrainerVocabularies) });\n };\n\n if (!trainerVocabularies.length) {\n return null;\n }\n\n return (\n \n
\n
\n {isSolved && (\n
\n \n
\n )}\n
\n
\n );\n};\n\nexport const StyledVocabularyTrainerExercise = styled(VocabularyTrainerExercise)`\n &.busy {\n opacity: 0;\n }\n &.ready {\n opacity: 1;\n }\n & {\n opacity: 0;\n -webkit-transition: opacity 0.3s ease;\n -moz-transition: opacity 0.3s ease;\n -o-transition: opacity 0.3s ease;\n transition: opacity 0.3s ease;\n }\n`;\n","import gql from 'graphql-tag';\nimport { toLang } from '../../utils/mappers/langMapper';\n\nexport const knowledgeType = { field: 'knowledgeType', operator: 'match', value: 'VOCABULARY' };\n\nexport const getCondition = (searchQuery, field) => {\n if (!searchQuery) {\n return [knowledgeType];\n }\n return [knowledgeType, { field, operator: 'match', value: searchQuery }];\n};\n\nexport const getQueryVariables = ({\n langCode,\n offset = 0,\n amount = 12,\n searchQuery,\n sort = true,\n}) => ({\n lang: toLang(langCode),\n offset,\n amount,\n originalCondition: getCondition(searchQuery, 'name_partial'),\n translationCondition: getCondition(searchQuery, 'text_partial'),\n sort: !searchQuery && sort ? [{ field: 'name_not_analyzed', order: 'ASC' }] : [],\n});\n\nexport const vocabularyFragment = {\n name: 'vocabularyFragment',\n fragment() {\n return gql`\n fragment ${this.name} on Knowledge {\n id\n text\n name\n subTitle\n }\n `;\n },\n};\n\nexport const searchResultFragment = {\n name: 'searchResult',\n fragment() {\n return gql`\n fragment ${this.name} on SearchResult {\n totalHits\n amount\n offset\n hits {\n ...vocabularyFragment\n }\n }\n ${vocabularyFragment.fragment()}\n `;\n },\n};\n\nconst searchQueryPart = name => `${name}: findContents(\n lang: $lang\n types: [KNOWLEDGE]\n offset: $offset\n amount: $amount\n must: $${name}Condition\n should: []\n mustNot: []\n sort: $sort\n ) {\n ...searchResult\n }\n `;\n\nexport const vocabularySearchQuery = gql`\n query VocabularySearch(\n $lang: Language!, $offset: Int!\n $amount: Int!\n $originalCondition: [QueryConditionInput!]\n $translationCondition: [QueryConditionInput!] \n $sort: [QuerySortInput!]\n ) {\n ${searchQueryPart('original')}\n ${searchQueryPart('translation')}\n }\n ${searchResultFragment.fragment()}\n `;\n","import { useEffect, useState } from 'react';\nimport gql from 'graphql-tag';\nimport { useHistory, useLocation, useParams } from 'react-router';\nimport { VocabularyTrainerStart } from './VocabularyTrainerStart';\nimport { StyledVocabularyTrainerExercise as VocabularyTrainerExercise } from './VocabularyTrainerExercise';\nimport { WithGraphQLQueryHandling } from '../WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { toLang } from '../../utils/mappers/langMapper';\nimport { shuffle } from '../../utils/commons';\nimport {\n getFeedbackUrl,\n PAGE_VOCABULARY_TRAINER_START,\n getVocabularyTrainerPage,\n} from '../../utils/url/urlFactory';\nimport { FEEDBACK_TYPES } from '../../constants/feedback';\nimport { vocabularyFragment } from '../Vocabulary/VocabularyQuery';\n\nexport const vocabularyTrainerQuery = gql`\n query VocabularyTrainer($keys: [ContentKeyInput]!, $lang: Language!) {\n contents(keys: $keys, lang: $lang) {\n ... on Lesson {\n id\n vocabularies {\n ...vocabularyFragment\n audios {\n mp3Src\n mainContentImage {\n id\n name\n }\n }\n }\n }\n }\n }\n ${vocabularyFragment.fragment()}\n`;\n\nexport const makeQueryVariables = (ids, langCode) => ({\n keys: ids.map(lessonId => ({\n id: lessonId,\n type: 'LESSON',\n })),\n lang: toLang(langCode),\n});\n\nexport const VocabularyTrainer = () => {\n const [lastLessonsIds, setLastLessonsIds] = useState([]);\n const [numberOfVocabularies, setNumberOfVocabularies] = useState(0);\n const [isStarted, setStarted] = useState(false);\n const { langCode } = useParams();\n const location = useLocation();\n const history = useHistory();\n\n const handleExerciseStart = () => {\n setStarted(true);\n };\n\n const handleExerciseEnd = () => {\n setStarted(false);\n };\n\n useEffect(() => {\n if (location.pathname.includes(PAGE_VOCABULARY_TRAINER_START)) {\n setStarted(false);\n setLastLessonsIds([]);\n history.replace(getVocabularyTrainerPage(langCode));\n }\n if (isStarted && !lastLessonsIds.length) {\n history.push(getFeedbackUrl(FEEDBACK_TYPES.VOCABULARY_TRAINER_NO_VOCABULARIES, langCode));\n }\n }, [history, langCode, lastLessonsIds.length, isStarted, location.pathname]);\n\n const getRandomVocabularies = ({ contents }) => {\n const vocabularies = contents.map(content => (content ? content.vocabularies : [])).flat(1);\n const uniqueVocabularies = Array.from(new Set(vocabularies));\n return shuffle(uniqueVocabularies).slice(0, numberOfVocabularies);\n };\n\n if (!isStarted) {\n return (\n \n );\n }\n\n return (\n \n {data => (\n \n )}\n \n );\n};\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport gql from 'graphql-tag';\nimport { useParams } from 'react-router';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Link, useHistory } from 'react-router-dom';\nimport { useEffect } from 'react';\nimport { ContentHeadline } from '../ContentContainer/ContentHeadline/ContentHeadline';\nimport { ContentSection } from '../ContentContainer/ContentSection/ContentSection';\nimport { I18nText } from '../I18n/I18nText';\nimport { LessonMenu } from '../Lesson/LessonMenu/LessonMenu';\nimport { Summary } from '../Lesson/LessonExercise/LessonExerciseResult/Summary';\nimport { calculatePercentage } from '../../utils/commons';\nimport { findLessonLearnProgressSelector } from '../../state/progress/learnProgressSelectors';\nimport { getContentUrl, getLessonExerciseUrl } from '../../utils/url/urlFactory';\nimport { getDWStructureUrl, normalizeUrlName } from '../../utils/url/url';\nimport { isPlacementTestCourse } from '../../utils/mappers/placementTestCourseIds';\nimport { learningLevelMapper } from '../../utils/learningLevelUtils';\nimport { MARKS } from '../../constants/marks';\nimport { userSelector } from '../../state/user/userSelectors';\nimport { handleCertificateGeneration } from '../../utils/certificateUtils';\nimport { readLessonProgress } from '../../state/progress/learnProgressDuck';\nimport { filterLessonExerciseOverviewItems, isFinalTestLesson } from '../../utils/lessonUtils';\nimport { PAGE_TYPES } from '../../constants/pageTypes';\nimport { PageMetaData } from '../Page/PageMetaData';\nimport { GtmScriptWithDataLayer } from '../GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const placementResultFragment = gql`\n fragment PlacementResult on Course {\n id\n name\n language\n dkLearningLevel\n }\n`;\n\nconst getFirstCourseOfEachLevel = allDkCourses => {\n const result = [];\n Object.keys(learningLevelMapper).forEach(learningLevel => {\n const targetCourse = allDkCourses.find(course => course.dkLearningLevel === +learningLevel);\n if (targetCourse) {\n // eslint-disable-next-line fp/no-mutating-methods\n result.push(targetCourse);\n }\n });\n return result;\n};\n\nexport const PlacementAndFinalTestResult = ({ data }) => {\n const { lesson, course, dkCourses: allDkCourses } = data;\n const { dkLearningLevel: courseDkLearningLevel } = course;\n const dkCourses = getFirstCourseOfEachLevel(allDkCourses);\n const {\n dwLinks,\n id: lessonId,\n name,\n overviewParts,\n dkLearningLevel: lessonDkLearningLevel,\n } = lesson;\n const { id: courseId, name: courseName, contentLinks: lessonContentLinksFromCourse } = course;\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch(readLessonProgress(lessonId));\n }, []);\n\n const history = useHistory();\n const { isLoggedIn } = useSelector(userSelector);\n const { langCode } = useParams();\n\n const lessonProgress = useSelector(findLessonLearnProgressSelector(lessonId));\n const { maxPointsForAllExercises = 0, resultPoints = 0, finalTest } = lessonProgress || {};\n\n const isFromPlacementCourse = isPlacementTestCourse(courseId);\n const isFinalTest = isFinalTestLesson({\n lessonContentLinksFromCourse,\n currentLessonId: lessonId,\n });\n\n const dkLearningLevel = isFinalTest ? courseDkLearningLevel : lessonDkLearningLevel;\n\n const level = learningLevelMapper[dkLearningLevel] || 'A1';\n const percentile = calculatePercentage(resultPoints, maxPointsForAllExercises);\n\n const calculateCourseNote = () => {\n if (percentile >= MARKS.GOOD) return 'veryGood';\n if (percentile >= MARKS.MEDIUM) return 'good';\n if (percentile >= MARKS.BAD) return 'bad';\n return 'veryBad';\n };\n\n const nextLevelRecommendation = () => {\n if (percentile <= MARKS.MEDIUM) return level;\n\n const levelValues = Object.values(learningLevelMapper);\n const currentIndex = levelValues.indexOf(level);\n const nextLevel = levelValues[currentIndex + 1];\n\n return nextLevel || level;\n };\n\n const nextLevel = nextLevelRecommendation();\n\n const getRecommendedCourseURL = () => {\n const nextCourse = dkCourses.find(\n dkCourse => learningLevelMapper[dkCourse.dkLearningLevel] === nextLevel,\n );\n\n return nextCourse ? getContentUrl(nextCourse) : null;\n };\n\n const handleOnCertificateClick = async () => {\n await handleCertificateGeneration({ id: lessonId, langCode, history });\n };\n\n const nextCourseUrl = getRecommendedCourseURL();\n const showCertificateButton = isLoggedIn && finalTest && percentile >= MARKS.MEDIUM;\n\n const lessonExerciseOverviewItems = filterLessonExerciseOverviewItems(overviewParts);\n const firstExerciseLink = getLessonExerciseUrl(\n langCode,\n lessonId,\n normalizeUrlName(lessonExerciseOverviewItems[0].target.name),\n lessonExerciseOverviewItems[0].targetId,\n );\n\n const PageMetaDataComponent = () => {\n if (isFinalTest) {\n return (\n \n );\n }\n if (isFromPlacementCourse) {\n return ;\n }\n return ;\n };\n\n return (\n <>\n \n \n \n \n
\n
\n
\n
\n
\n \n \n {showCertificateButton && (\n
\n )}\n {nextCourseUrl && (\n <>\n
\n
\n
\n \n
{nextLevel} \n \n
\n
\n
\n >\n )}\n {dwLinks && dwLinks.length > 0 && (\n
\n {dwLinks.map(link => {\n if (!link.name.includes(nextLevel)) return '';\n return (\n \n );\n })}\n \n )}\n
\n
\n
\n
\n >\n );\n};\n","import gql from 'graphql-tag';\nimport { useParams } from 'react-router';\nimport { useSelector } from 'react-redux';\nimport {\n PlacementAndFinalTestResult,\n placementResultFragment,\n} from '../components/PlacementResult/PlacementAndFinalTestResult';\nimport { PageContainer } from '../components/Page/PageContainer';\nimport { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { sortByLearningLevel } from '../utils/learningLevelUtils';\nimport { toLang } from '../utils/mappers/langMapper';\nimport { lessonOverviewPartsFragment } from '../components/Lesson/Lesson';\nimport { userDataSelector } from '../state/user/userSelectors';\nimport { metaDataFragment } from '../components/Page/PageMetaData';\nimport { gtmDataLayerFragment } from '../components/GoogleTagManager';\n\nexport const placementResultPageQuery = ({ handicap }) => gql`\n query PlacementResultPage($id: Int!, $lessonIdString: String!, $amount: Int!, $lang: Language!, $type: ModelType!) {\n lesson: content(id: $id, lang: $lang) {\n ... on Lesson {\n id\n name\n dkLearningLevel\n dwLinks: contentLinks(targetTypes: [NAVIGATION]) {\n id: targetId\n description\n name\n }\n }\n ...${`PlacementOverviewParts${handicap || ''}`}\n ...${metaDataFragment.name}\n ${gtmDataLayerFragment.partial()}\n }\n\n dkCourses: contentsByType(\n type: $type\n lang: $lang\n amount: $amount\n filters: { field: \"dkLearningLevel\", value: [\"2\", \"4\"] }\n ) {\n ...PlacementResult\n }\n\n dkCoursesInGerman: contentsByType(\n type: $type\n lang: GERMAN\n amount: $amount\n filters: { field: \"dkLearningLevel\", value: [\"8\"] }\n ) {\n ...PlacementResult\n }\n \n currentCourse: contentsByType(\n lang: $lang\n type: COURSE\n amount: 1\n filters: { field: \"contentLinks.targetId\", value: [$lessonIdString] }\n ) {\n ... on Course {\n id\n name\n dkLearningLevel\n contentLinks(targetTypes: LESSON) {\n targetId\n additionalInformation\n }\n }\n }\n }\n ${lessonOverviewPartsFragment.fragment({ scope: 'Placement', handicap })}\n ${placementResultFragment}\n ${metaDataFragment.fragment({ type: 'Lesson' })}\n`;\n\nexport const PlacementAndFinalTestResultPage = ({ contentId }) => {\n const { langCode } = useParams();\n const { handicap } = useSelector(userDataSelector) || {};\n\n const placementResultPageQueryVariables = {\n amount: 10,\n id: +contentId,\n lessonIdString: contentId,\n lang: toLang(langCode),\n type: 'COURSE',\n };\n\n return (\n \n \n {data => (\n \n )}\n \n \n );\n};\n","import styled from 'styled-components';\nimport gql from 'graphql-tag';\nimport { RichText } from '../RichText/RichText';\nimport { useImagePlaceholderReplacementEffect } from '../../utils/replacers/useImagePlaceholderReplacementEffect';\n\nexport const helpFragment = {\n name: 'Help',\n fragment() {\n return gql`fragment ${this.name} on Article {\n id\n shortTitle\n text\n }\n `;\n },\n};\n\nexport const Help = ({ className, help }) => {\n useImagePlaceholderReplacementEffect({});\n const { shortTitle, text } = help;\n\n return (\n \n \n \n
\n );\n};\n\nexport const StyledHelp = styled(Help)`\n .content {\n margin: 10px;\n }\n`;\n","import gql from 'graphql-tag';\nimport { useParams } from 'react-router';\nimport { toLang } from '../utils/mappers/langMapper';\nimport { PageContainer } from '../components/Page/PageContainer';\nimport { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { helpFragment, StyledHelp as Help } from '../components/Help/Help';\nimport { PageMetaData } from '../components/Page/PageMetaData';\nimport { PAGE_TYPES } from '../constants/pageTypes';\nimport {\n gtmDataLayerFragment,\n GtmScriptWithDataLayer,\n} from '../components/GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const helpPageQuery = gql`\n query HelpPage($lang: Language!) {\n help(lang: $lang, appName: \"mdl\") {\n ...${helpFragment.name}\n ${gtmDataLayerFragment.partial()}\n }\n }\n ${helpFragment.fragment()}\n`;\n\nexport const HelpPage = () => {\n const { langCode } = useParams();\n\n const helpPageQueryVariables = {\n lang: toLang(langCode),\n };\n\n return (\n \n \n {({ help }) => (\n <>\n \n \n \n >\n )}\n \n \n );\n};\n","import gql from 'graphql-tag';\nimport { useParams } from 'react-router';\nimport { toLang } from '../utils/mappers/langMapper';\nimport { PageContainer } from '../components/Page/PageContainer';\nimport { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { PageMetaData } from '../components/Page/PageMetaData';\nimport { PAGE_TYPES } from '../constants/pageTypes';\nimport {\n legalFragment,\n StyledLegalNotice as LegalNotice,\n} from '../components/LegalNotice/LegalNotice';\nimport { gtmDataLayerFragment } from '../components/GoogleTagManager';\nimport { GtmScriptWithDataLayer } from '../components/GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const legalPageQuery = gql`\n query footer($lang: Language!) {\n footer(lang: $lang) {\n ${legalFragment.partial()}\n ${gtmDataLayerFragment.partial()}\n }\n }\n`;\n\nexport const LegalPage = () => {\n const { langCode } = useParams();\n\n const helpPageQueryVariables = {\n lang: toLang(langCode),\n };\n\n return (\n \n \n {({ footer }) => (\n <>\n \n \n \n >\n )}\n \n \n );\n};\n","import { useState, useEffect } from 'react';\n\nexport default function useDebounce(value, delay) {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n return () => {\n clearTimeout(handler);\n };\n }, [delay, value]);\n\n return debouncedValue;\n}\n","export const KEY_ARROW_UP = 38;\nexport const KEY_ARROW_DOWN = 40;\nexport const KEY_ENTER = 13;\nexport const KEY_ESCAPE = 27;\nexport const KEY_BACKSPACE = 8;\n\nexport const keyCodes = Object.freeze({\n TAB: 'Tab',\n ENTER: 'Enter',\n SPACEBAR: ' ',\n ARROW_LEFT: 'ArrowLeft',\n ARROW_RIGHT: 'ArrowRight',\n ESCAPE: 'Escape',\n});\n","export const TYPE_SET_INPUT = 'TYPE_SET_INPUT';\nexport const TYPE_GET_CACHED_RESULTS = 'TYPE_GET_CACHED_RESULTS';\nexport const TYPE_SET_HINTS_DATA = 'TYPE_RESET_CURSOR_AND_SET_HINTS_DATA';\nexport const TYPE_SET_HINTS_OPENED = 'TYPE_SET_HINTS_OPENED';\nexport const TYPE_SET_HINTS_CLOSED = 'TYPE_SET_HINTS_CLOSED';\nexport const TYPE_SET_CURSOR_ARROW_UP = 'TYPE_SET_CURSOR_ARROW_UP';\nexport const TYPE_SET_CURSOR_ARROW_DOWN = 'TYPE_SET_CURSOR_ARROW_DOWN';\nexport const TYPE_KEY_ESCAPE_CLICKED = 'TYPE_KEY_ESCAPE_CLICKED';\nexport const TYPE_KEY_BACKSPACE_CLICKED = 'TYPE_KEY_BACKSPACE_CLICKED';\nexport const TYPE_ANY_CHARACTER_TYPED = 'TYPE_KEY_ANY_CLICKED';\nexport const TYPE_ITEM_CLICKED = 'TYPE_ITEM_CLICKED';\nexport const TYPE_KEY_ENTER_CLICKED = 'TYPE_KEY_ENTER_CLICKED';\n\nexport const reducer = (state, action) => {\n switch (action.type) {\n case TYPE_GET_CACHED_RESULTS:\n return {\n ...state,\n vocabularyItems: state.recentlySearched.get(state.input),\n isOpened:\n !state.isEscapeClicked && !state.isEnterClicked && state.recentlySearched.get(state.input)\n ? state.recentlySearched.get(state.input).length > 0\n : false,\n isEscapeClicked: false,\n isEnterClicked: false,\n };\n case TYPE_SET_HINTS_DATA: {\n const { response, searchQuery } = action.payload;\n return {\n ...state,\n vocabularyItems: response ? response.slice(0, Math.min(8, response.length)) : [],\n recentlySearched: state.recentlySearched.set(searchQuery, response || []),\n cursor: -1,\n isOpened:\n !state.isEnterClicked && !state.isEscapeClicked && response ? response.length > 0 : false,\n };\n }\n case TYPE_SET_HINTS_OPENED:\n return {\n ...state,\n isOpened: true,\n };\n case TYPE_SET_HINTS_CLOSED:\n return {\n ...state,\n isOpened: false,\n };\n case TYPE_SET_INPUT:\n return {\n ...state,\n ...action.payload,\n };\n case TYPE_SET_CURSOR_ARROW_UP: {\n const cursorUp =\n state.cursor === -1\n ? state.vocabularyItems.length - 1\n : (state.cursor - 1) % state.vocabularyItems.length;\n return {\n ...state,\n isOpened: true,\n cursor: cursorUp,\n input: state.vocabularyItems[cursorUp !== -1 ? cursorUp : 0],\n };\n }\n case TYPE_SET_CURSOR_ARROW_DOWN: {\n const cursorDown = (state.cursor + 1) % state.vocabularyItems.length;\n return {\n ...state,\n isOpened: true,\n cursor: cursorDown,\n input: state.vocabularyItems[cursorDown],\n };\n }\n case TYPE_KEY_ESCAPE_CLICKED:\n return {\n ...state,\n cursor: -1,\n input: '',\n isOpened: false,\n isEscapeClicked: true,\n vocabularyItems: [],\n };\n case TYPE_KEY_BACKSPACE_CLICKED:\n return {\n ...state,\n ...action.payload,\n cursor: -1,\n vocabularyItems: action.payload.input === '' ? [] : state.vocabularyItems,\n isEnterClicked: false,\n isEscapeClicked: false,\n };\n case TYPE_ITEM_CLICKED:\n return {\n ...state,\n ...action.payload,\n cursor: -1,\n isOpened: false,\n };\n case TYPE_ANY_CHARACTER_TYPED:\n return {\n ...state,\n ...action.payload,\n cursor: -1,\n isOpened: true,\n };\n case TYPE_KEY_ENTER_CLICKED:\n return {\n ...state,\n ...action.payload,\n cursor: -1,\n isOpened: false,\n isEnterClicked: true,\n };\n default:\n return state;\n }\n};\n","import { useEffect } from 'react';\nimport { useParams } from 'react-router';\nimport {\n TYPE_GET_CACHED_RESULTS,\n TYPE_SET_HINTS_DATA,\n} from '../components/Vocabulary/VocabularySearch/duck/vocabularySearchDuck';\nimport { getQueryVariables } from '../components/Vocabulary/VocabularyQuery';\n\nexport const combineVocabularyData = data => {\n const mergedVocabularyData = [\n ...data.original.hits,\n ...data.translation.hits.map(obj => ({ ...obj, translation: true })),\n ];\n const idSet = new Set();\n return mergedVocabularyData.filter(vocabulary => {\n if (!idSet.has(vocabulary.id)) {\n idSet.add(vocabulary.id);\n return true;\n }\n return false;\n }, idSet);\n};\n\nexport const useGetCachedHintsResponse = (state, dispatch) => {\n useEffect(\n () => {\n if (state.recentlySearched.get(state.input) && state.cursor === -1) {\n dispatch({ type: TYPE_GET_CACHED_RESULTS });\n }\n }, // eslint-disable-next-line\n [state.searchQuery, state.cursor],\n );\n};\n\nexport const useGetHintsResponseAndCacheIt = (debouncedSearchQuery, state, dispatch, refetch) => {\n const { langCode } = useParams();\n useEffect(\n () => {\n if (debouncedSearchQuery) {\n const { searchQuery } = state;\n if (!state.recentlySearched.get(debouncedSearchQuery)) {\n refetch(\n getQueryVariables({\n langCode,\n searchQuery,\n sort: false,\n }),\n ).then(res => {\n return dispatch({\n type: TYPE_SET_HINTS_DATA,\n payload: {\n searchQuery: debouncedSearchQuery,\n response: combineVocabularyData(res.data),\n },\n });\n });\n }\n }\n }, // eslint-disable-next-line\n [debouncedSearchQuery],\n );\n};\n","import { useReducer, useRef } from 'react';\nimport styled from 'styled-components';\nimport classnames from 'classnames';\nimport { useQuery } from '@apollo/client';\nimport { useParams } from 'react-router-dom';\nimport useDebounce from '../../../hooks/useDebounce';\nimport {\n KEY_ARROW_DOWN,\n KEY_ARROW_UP,\n KEY_BACKSPACE,\n KEY_ENTER,\n KEY_ESCAPE,\n} from '../../../constants/keyCodes';\nimport {\n reducer,\n TYPE_ANY_CHARACTER_TYPED,\n TYPE_KEY_BACKSPACE_CLICKED,\n TYPE_KEY_ENTER_CLICKED,\n TYPE_KEY_ESCAPE_CLICKED,\n TYPE_SET_CURSOR_ARROW_DOWN,\n TYPE_SET_CURSOR_ARROW_UP,\n TYPE_SET_HINTS_CLOSED,\n TYPE_SET_HINTS_OPENED,\n TYPE_SET_INPUT,\n TYPE_ITEM_CLICKED,\n} from './duck/vocabularySearchDuck';\nimport {\n useGetCachedHintsResponse,\n useGetHintsResponseAndCacheIt,\n} from '../../../hooks/vocabularySearchHooks';\nimport { useTranslation } from '../../../hooks/useTranslation';\nimport { useRtlContext } from '../../../hooks/useRtl';\nimport { vocabularySearchQuery, getQueryVariables } from '../VocabularyQuery';\n\nconst specialCharactersRegex = new RegExp('[^\\\\p{L} @]', 'gui');\n\nconst VocabularySearch = ({ className, onItemSelected }) => {\n const { langCode } = useParams();\n const { refetch } = useQuery(vocabularySearchQuery, {\n variables: getQueryVariables({\n langCode,\n }),\n });\n const [state, dispatch] = useReducer(reducer, {\n input: '',\n searchQuery: '',\n vocabularyItems: [],\n cursor: -1,\n isOpened: false,\n recentlySearched: new Map(),\n isEscapeClicked: false,\n isEnterClicked: false,\n amount: 6,\n offset: 0,\n });\n\n const { isRtl } = useRtlContext();\n const vocabularyOverviewPlaceholder = useTranslation('vocabularyOverview.placeholder');\n const vocabularyOverviewAria = useTranslation('vocabularyOverview.aria');\n\n const { isOpened, input, cursor, vocabularyItems, searchQuery } = state;\n\n const debouncedSearchQuery = useDebounce(searchQuery, 350);\n\n useGetCachedHintsResponse(state, dispatch);\n useGetHintsResponseAndCacheIt(debouncedSearchQuery, state, dispatch, refetch);\n\n const searchInput = useRef(null);\n\n const handleFocus = () => {\n dispatch({ type: TYPE_SET_HINTS_OPENED });\n };\n\n const handleBlur = () => {\n dispatch({ type: TYPE_SET_HINTS_CLOSED });\n };\n\n const handleClick = e => {\n const target = e.target.tagName === 'STRONG' ? e.target.parentNode : e.target;\n const { textContent } = target;\n dispatch({\n type: TYPE_ITEM_CLICKED,\n payload: {\n input: textContent,\n },\n });\n onItemSelected(textContent);\n };\n\n const handleKeys = e => {\n switch (e.keyCode) {\n case KEY_ARROW_UP:\n dispatch({ type: TYPE_SET_CURSOR_ARROW_UP });\n break;\n\n case KEY_ARROW_DOWN:\n dispatch({ type: TYPE_SET_CURSOR_ARROW_DOWN });\n break;\n\n case KEY_ENTER:\n // eslint-disable-next-line no-case-declarations\n const conditionalSearchQuery = input;\n onItemSelected(conditionalSearchQuery);\n dispatch({\n type: TYPE_KEY_ENTER_CLICKED,\n payload: {\n searchQuery: conditionalSearchQuery,\n },\n });\n break;\n case KEY_ESCAPE:\n dispatch({ type: TYPE_KEY_ESCAPE_CLICKED });\n break;\n\n case KEY_BACKSPACE:\n dispatch({\n type: TYPE_KEY_BACKSPACE_CLICKED,\n payload: {\n input: e.target.value,\n searchQuery: e.target.value,\n },\n });\n break;\n\n default:\n dispatch({\n type: TYPE_ANY_CHARACTER_TYPED,\n payload: {\n input: e.target.value,\n searchQuery: e.target.value,\n },\n });\n }\n };\n const cleanSearchQuery = searchQuery.replace(specialCharactersRegex);\n const wordsRegex = new RegExp(\n `((?:(?:\\\\p{P}|\\\\p{Z} )*)((\\\\p{L}*)${cleanSearchQuery}(\\\\p{L}*))(?:(?:\\\\p{P}|\\\\p{Z} )*))`,\n 'imu',\n );\n const suggestions = vocabularyItems\n .map(item => {\n const vocabularyText = item.translation\n ? item.text.replace(/<[^>]*>?/gm, '').trim()\n : item.name;\n const matches = wordsRegex.exec(vocabularyText);\n return matches ? matches[2] : null;\n })\n .filter(item => !!item);\n const distinctSuggestions = [...new Set(suggestions)];\n\n const addBolding = text =>\n text.replace(\n new RegExp(searchQuery.replace(specialCharactersRegex, ''), 'gi'),\n m => `${m} `,\n );\n\n return (\n \n
\n
\n
\n \n dispatch({\n type: TYPE_SET_INPUT,\n payload: { input: e.target.value },\n })\n }\n onKeyUp={handleKeys}\n onBlur={handleBlur}\n onFocus={handleFocus}\n ref={searchInput}\n />\n \n
\n {distinctSuggestions &&\n distinctSuggestions.length > 0 &&\n distinctSuggestions.map((suggestion, index) => (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n
\n ))}\n
\n
\n \n
\n
\n
\n );\n};\n\nexport const StyledVocabularySearch = styled(VocabularySearch)`\n .tt-menu {\n visibility: hidden;\n }\n\n .tt-open {\n visibility: visible;\n }\n\n .twitter-typeahead {\n position: relative;\n display: inline-block;\n }\n`;\n","import { StyledStandardButton as StandardButton } from '../../StandardButton/StandardButton';\n\nexport const VocabularyMoreButton = ({ handleClick, style }) => (\n \n);\n","export const VocabularyItem = ({ item }) => {\n return (\n \n
\n
\n
\n \n {item.name} \n \n \n {item.subTitle}\n
\n
\n
\n
\n
\n
\n );\n};\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport { useEffect, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { ReactComponent as IconHintCircleOrange } from '../../assets/svg/icon-hint-circle-orange.svg';\nimport { StyledVocabularySearch } from './VocabularySearch/VocabularySearch';\nimport { VocabularyMoreButton } from './VocabularyMoreButton/VocabularyMoreButton';\nimport { I18nText } from '../I18n/I18nText';\nimport { ContentHeadline } from '../ContentContainer/ContentHeadline/ContentHeadline';\nimport { combineVocabularyData } from '../../hooks/vocabularySearchHooks';\nimport { VocabularyItem } from './VocabularyItem';\nimport { getQueryVariables } from './VocabularyQuery';\n\nexport const Vocabulary = ({ data, refetch }) => {\n const { langCode } = useParams();\n\n const [startValue, setStartValue] = useState(0);\n const [vocabularyData, setVocabularyData] = useState(combineVocabularyData(data));\n const [isNotEmptyResp, setIsNotEmptyResp] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n\n const findAdditionalData = shouldConcat => {\n refetch(\n getQueryVariables({\n langCode,\n offset: startValue,\n searchQuery,\n }),\n ).then(resp => {\n const combinedVocabularyData = combineVocabularyData(resp.data);\n shouldConcat\n ? setVocabularyData(prevState => [...prevState, ...combinedVocabularyData])\n : setVocabularyData(combinedVocabularyData);\n setIsNotEmptyResp(combinedVocabularyData.length > 0);\n if (combinedVocabularyData.length > 0) {\n setStartValue(prevState => prevState + 12);\n }\n });\n };\n\n useEffect(() => {\n findAdditionalData();\n }, [searchQuery]);\n\n return (\n \n
\n
\n
\n
\n
\n {\n setStartValue(0);\n setSearchQuery(newSearchQuery);\n }}\n />\n
\n
\n
\n
\n
\n
\n );\n};\n","import { useParams } from 'react-router-dom';\nimport { PageMetaData } from '../components/Page/PageMetaData';\nimport { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';\nimport { GTM_NO_CONTENT_PAGE_IDS, PAGE_TYPES } from '../constants/pageTypes';\nimport { Vocabulary } from '../components/Vocabulary/Vocabulary';\nimport { PageContainer } from '../components/Page/PageContainer';\nimport { getQueryVariables, vocabularySearchQuery } from '../components/Vocabulary/VocabularyQuery';\nimport { GtmScriptWithDataLayer } from '../components/GoogleTagManager/GtmScriptWithDataLayer';\n\nexport const VocabularyPage = () => {\n const { langCode } = useParams();\n\n const vocabularyPageQueryVariables = getQueryVariables({\n langCode,\n });\n\n return (\n \n \n {(data, refetch) => (\n <>\n \n \n \n >\n )}\n \n \n );\n};\n","import { Redirect, Route, Switch } from 'react-router-dom';\nimport { useParams } from 'react-router';\nimport { Default404Page } from '../pages/Default404Page';\nimport { urlPrefixToType } from '../utils/url/url';\nimport { CoursePage } from '../pages/CoursePage';\nimport { GrammarPage } from '../pages/GrammarPage';\nimport { DashboardPage } from '../pages/DashboardPage';\nimport { GrammarOverviewPage } from '../pages/GrammarOverviewPage';\nimport { pathPartials } from '../utils/url/pathAnalyser';\nimport { LessonPage } from '../pages/LessonPage';\nimport {\n PAGE_GRAMMAR,\n PAGE_LEGAL,\n PAGE_OVERVIEW,\n PAGE_PASSWORD_CHANGE,\n PAGE_PASSWORD_RESET,\n PAGE_PLACEMENT_TEST,\n PAGE_PROFILE,\n PAGE_REGISTRATION,\n PAGE_VOCABULARY,\n PAGE_VOCABULARY_TRAINER,\n PAGE_VOCABULARY_TRAINER_START,\n STATUS_FEEDBACK,\n} from '../utils/url/urlFactory';\nimport { FEEDBACK_TYPES } from '../constants/feedback';\nimport { RestrictedRoute } from './RestrictedRoute/RestrictedRoute';\nimport { ConfirmUserRegistrationContainer } from './user/ConfirmUserRegistrationContainer';\nimport { Registration } from './user/Registration';\nimport { PasswordChange } from './user/PasswordChange';\nimport { PasswordReset } from './user/PasswordReset';\nimport { StatusFeedback } from './StatusFeedback/StatusFeedback';\nimport { PageContainer, withPageContainerAndMetadata } from './Page/PageContainer';\nimport { UserProfile } from './user/UserProfile';\nimport { SetNewPassword } from './user/SetNewPassword';\nimport { PlacementTestPage } from '../pages/PlacementTestPage';\nimport { VocabularyTrainer } from './VocabularyTrainer/VocabularyTrainer';\nimport { PlacementAndFinalTestResultPage } from '../pages/PlacementAndFinalTestResultPage';\nimport { HelpPage } from '../pages/HelpPage';\nimport { GTM_NO_CONTENT_PAGE_IDS, PAGE_TYPES } from '../constants/pageTypes';\nimport { PageMetaData } from './Page/PageMetaData';\nimport { LegalPage } from '../pages/LegalPage';\nimport { VocabularyPage } from '../pages/VocabularyPage';\nimport { GtmScriptWithDataLayer } from './GoogleTagManager';\n\nconst typeToPage = {\n COURSE: {\n type: 'Course',\n component: CoursePage,\n },\n GRAMMAR: {\n type: 'Grammar',\n component: GrammarPage,\n },\n LESSON: {\n type: 'Lesson',\n component: LessonPage,\n },\n PLACEMENT: {\n type: 'Placement',\n component: PlacementAndFinalTestResultPage,\n },\n FINAL: {\n type: 'Final',\n component: PlacementAndFinalTestResultPage,\n },\n};\n\nexport const ContentPage = () => {\n const params = useParams();\n const pageDef = typeToPage[urlPrefixToType(params.typeId)];\n const Tag = pageDef.component;\n return ;\n};\n\nexport const App = () => (\n \n (\n \n )}\n />\n \n \n \n \n \n \n \n \n withPageContainerAndMetadata({\n component: Registration,\n pageType: PAGE_TYPES.REGISTER_USER,\n useDescriptionTranslation: true,\n })\n }\n />\n (\n \n \n \n \n \n )}\n />\n (\n \n )}\n />\n \n withPageContainerAndMetadata({\n component: UserProfile,\n pageType: PAGE_TYPES.USER_PROFILE,\n addDescriptionAndKeywordsMeta: false,\n })\n }\n feedbackType={FEEDBACK_TYPES.MISSING_USER_PROFILE}\n />\n \n withPageContainerAndMetadata({\n component: PasswordChange,\n pageType: PAGE_TYPES.PASSWORD_CHANGE,\n addDescriptionAndKeywordsMeta: false,\n })\n }\n />\n \n withPageContainerAndMetadata({\n component: VocabularyTrainer,\n pageType: PAGE_TYPES.VOCABULARY_TRAINER,\n addDescriptionAndKeywordsMeta: false,\n })\n }\n />\n \n withPageContainerAndMetadata({\n component: PasswordReset,\n pageType: PAGE_TYPES.PASSWORD_RESET,\n addDescriptionAndKeywordsMeta: false,\n })\n }\n />\n \n withPageContainerAndMetadata({\n component: StatusFeedback,\n pageType: PAGE_TYPES.FEEDBACK_STATUS,\n addDescriptionAndKeywordsMeta: false,\n })\n }\n />\n \n \n \n \n);\n","/* eslint-disable */\nexport const possibleTypes = {\n ModelAspect: ['Exercise', 'Knowledge', 'Article', 'Category', 'Course', 'Subject', 'GeographicLocation', 'Lesson', 'Navigation', 'Person', 'Image', 'Audio', 'Video', 'Widget', 'Livestream', 'Download', 'Keyword', 'ImageGallery', 'GalleryImage', 'GeographicRegion', 'ExternalLink', 'PhysicalImage', 'ContentComposition', 'InformationSpace', 'CompositionComponent', 'CompositionComponentConfiguration'],\n DeliveryAspect: ['Exercise', 'Knowledge', 'Article', 'Category', 'Course', 'Lesson', 'Navigation', 'Person', 'Image', 'Audio', 'Video', 'Widget', 'ImageGallery', 'GeographicRegion', 'ContentComposition'],\n NamedAspect: ['Exercise', 'Knowledge', 'Article', 'Category', 'Course', 'Subject', 'GeographicLocation', 'Lesson', 'Navigation', 'Person', 'Image', 'Audio', 'Video', 'Widget', 'Livestream', 'Download', 'Keyword', 'ImageGallery', 'GalleryImage', 'GeographicRegion', 'ExternalLink', 'ContentComposition', 'InformationSpace'],\n AssociationsAspect: ['Exercise', 'Knowledge', 'Article', 'Course', 'Lesson', 'Navigation', 'Person', 'Image', 'Audio', 'Video', 'Widget', 'ImageGallery', 'GalleryImage'],\n TextualAspect: ['Article', 'Person', 'Audio', 'Video', 'ImageGallery'],\n ContactAspect: ['Article', 'Person', 'Audio', 'Video', 'ImageGallery'],\n MetadataAspect: ['Article', 'Audio', 'Video', 'ImageGallery'],\n DkMetadataAspect: ['Article'],\n GeographicLocationAspect: ['GeographicLocation'],\n TreeAspect: ['Category', 'Navigation', 'GeographicRegion'],\n DeletionAspect: ['Image', 'Audio', 'Video'],\n PlaybackResourceAspect: ['Audio', 'Video'],\n BinaryDataAspect: ['Download', 'PhysicalImage'],\n SocialMediaAspect: ['Article', 'Audio', 'Video', 'ImageGallery'],\n FooterAspect: ['Article', 'Navigation', 'Person', 'Audio', 'Video', 'ImageGallery'],\n BetaLayerAspect: ['Article', 'Navigation', 'Person', 'Audio', 'Video', 'ImageGallery'],\n UrlAspect: ['Article', 'Navigation', 'Person', 'Audio', 'Video', 'ImageGallery'],\n PersonRelatedContent: ['Article', 'Audio', 'Video', 'Image', 'ImageGallery'],\n Content: ['Article', 'Category', 'Subject', 'GeographicLocation', 'Navigation', 'Person', 'Image', 'Audio', 'Video', 'Widget', 'Livestream', 'Download', 'Keyword', 'ImageGallery', 'GalleryImage', 'GeographicRegion', 'CocoContent'],\n};\n\n// fetch(`http://localhost:4000/graphql`, {\n// method: 'POST',\n// headers: { 'Content-Type': 'application/json' },\n// body: JSON.stringify({\n// variables: {},\n// query: `\n// {\n// __schema {\n// types {\n// kind\n// name\n// possibleTypes {\n// name\n// }\n// }\n// }\n// }\n// `,\n// }),\n// })\n// .then(result => result.json())\n// .then(result => {\n// const possibleTypes = {};\n\n// result.data.__schema.types.forEach(supertype => {\n// if (supertype.possibleTypes) {\n// possibleTypes[supertype.name] =\n// supertype.possibleTypes.map(subtype => subtype.name);\n// }\n// });\n// console.log(JSON.stringify(possibleTypes));\n// });\n","import { combineReducers } from 'redux';\nimport { userReducer } from './user/userDuck';\nimport { learnProgressReducer } from './progress/learnProgressDuck';\nimport { lessonExerciseModeReducer } from './mode/lessonExerciseModeDuck';\n\nconst rootReducer = combineReducers({\n user: userReducer,\n learnProgress: learnProgressReducer,\n lessonExerciseMode: lessonExerciseModeReducer,\n});\n\nexport default rootReducer;\n","import { API_CALL } from '../common/apiActions';\n\nexport const apiMiddleware = ({ dispatch }) => next => action => {\n next(action);\n\n if (action.type !== API_CALL) {\n return;\n }\n\n const { url, method, data, onSuccess, onFailure, headers } = action.payload;\n\n const dataOrParams = ['GET', 'DELETE'].includes(method) ? 'params' : 'data';\n\n fetch(url, {\n method,\n headers,\n [dataOrParams]: data,\n })\n .then(response => {\n const contentType = response.headers.get('content-type');\n return contentType && contentType.indexOf('application/json') !== -1 ? response.json() : {};\n })\n .then(userData => {\n dispatch(onSuccess(userData));\n })\n .catch(error => {\n dispatch(onFailure(error));\n });\n};\n","import * as storage from 'redux-storage';\nimport createEngine from 'redux-storage-engine-localstorage';\nimport { createStore, applyMiddleware, compose } from 'redux';\nimport thunk from 'redux-thunk';\nimport rootReducer from './rootReducers';\nimport { apiMiddleware } from './middlewares/apiMiddleware';\nimport globals from '../utils/globals';\nimport { isServer } from '../utils/ssr';\n\nconst reducer = storage.reducer(rootReducer);\nconst engine = createEngine('learngerman');\nconst storageMiddleware = storage.createMiddleware(engine);\n\n// eslint-disable-next-line no-underscore-dangle\nconst composeEnhancers = globals.window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;\n\nconst createStoreWithMiddleware = composeEnhancers(\n applyMiddleware(apiMiddleware, thunk, storageMiddleware),\n)(createStore);\n\nconst store = createStoreWithMiddleware(reducer);\n\nconst load = storage.createLoader(engine);\nif (!isServer()) {\n load(store);\n}\n\nexport default store;\n","import ReactDOM from 'react-dom';\nimport { BrowserRouter as Router } from 'react-router-dom';\nimport { HelmetProvider } from 'react-helmet-async';\n\nimport { ApolloProvider, ApolloClient, createHttpLink } from '@apollo/client';\nimport { createPersistedQueryLink } from '@apollo/client/link/persisted-queries';\nimport { sha256 } from 'crypto-hash';\nimport { InMemoryCache } from '@apollo/client/cache';\n\nimport { Provider } from 'react-redux';\nimport * as serviceWorker from './serviceWorker';\nimport { App } from './components/App';\nimport config from './config';\n\nimport { possibleTypes } from './utils/apolloClient';\nimport store from './state/store';\n\nconst cache = new InMemoryCache({\n possibleTypes,\n addTypename: true,\n});\n\nconst link = createPersistedQueryLink({ sha256, useGETForHashedQueries: true }).concat(\n createHttpLink({ uri: config.graphQL.baseUrl }),\n);\n\nconst client = new ApolloClient({\n link,\n ssrForceFetchDelay: 100,\n cache: cache.restore(window.__APOLLO_STATE__), // eslint-disable-line no-underscore-dangle\n});\n\n//ReactDOM.hydrate(\nReactDOM.render(\n \n \n \n \n \n \n \n \n ,\n document.getElementById('root'),\n);\n\nserviceWorker.unregister();\n"],"names":["Boolean","window","location","hostname","match","navigator","serviceWorker","ready","then","registration","unregister","resolutions","Object","freeze","min","zero","mobile","tablet","tabletLandscape","desktop","full","max","Number","MAX_SAFE_INTEGER","wrapInMedia","sizes","type","keys","reduce","acc","label","args","css","mediaMin","wrapInHoverPointerMedia","hover","pointer","mediaDevice","mouse","touch","colors","LG_WHITE","LG_BLACK","LG_ORANGE","LG_ORANGE_DARK","LG_PINK","LG_RED","LG_RED_SCORE","LG_RED_DARK","LG_GREEN_YELLOW","LG_GREEN_LIGHT","LG_GREEN","LG_GREEN_SCORE","DW_BLUE","DW_DARK_BLUE","DW_LIGHT_BLUE","LG_BLUE_1","LG_BLUE_2","LG_BLUE_3","LG_BLUE_4","LG_BLUE_5","LG_BLUE_6","LG_BLUE_7","LG_BAHAMA_BLUE","LG_GRAY_1","LG_GRAY_2","LG_GRAY_3","LG_GRAY_4","LG_GRAY_5","LG_GRAY_6","LG_GRAY_7","LG_GRAY_8","LG_GRAY_9","LG_GRAY_10","LG_GRAY_11","LG_GRAY_12","LG_GRAY_13","LG_GRAY_14","LG_GRAY_15","LG_ORANGE1","LIGHT_KHAKI","LG_GRAY_TRANSPARENT_1","LG_GRAY_TRANSPARENT_15","LG_TRANSPARENT_BLACK_075","LG_TRANSPARENT_BLACK_20","LG_TRANSPARENT_BLACK_25","LG_TRANSPARENT_BLACK_30","LG_TRANSPARENT_BLACK_40","LG_TRANSPARENT_BLACK_50","LG_TRANSPARENT_WHITE_10","LG_TRANSPARENT_WHITE_15","LG_TRANSPARENT_WHITE_25","LG_TRANSPARENT_WHITE_50","selector","composition","even","odd","_369","_258","_4710","notFirst","notLast","disabled","topElements","numberOfElements","justNElements","clearfix","_extends","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","excluded","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","indexOf","propertyIsEnumerable","sourceKeys","_ref2","React","className","fillRule","d","id","_ref","svgRef","title","titleId","props","_objectWithoutProperties","viewBox","xmlns","ref","ForwardRef","SvgDwLogo","StyledLogo","styled","Logo","style","SvgDwClaim","StyledClaimLogo","ClaimLogo","url","LogoIcon","ClaimIcon","DesktopBanner","StyledDesktopBanner","__webpack_public_path__","Text","isA","children","isRtl","restProps","StyledText","StyledTextGray12","keysArr","obj","objPartial","accessPathByArr","slice","pathStr","split","translations","replaceInPattern","pattern","options","nextVar","varNameRegex","RegExp","replace","retrieveLabel","translation","accessPath","inTranslations","i18n","t","clearTranslations","hasTranslations","I18nContext","createContext","useI18nContext","useContext","isPlainKey","normalizeTranslation","parameters","useTranslation","RtlContext","useRtlContext","I18nText","MobileBanner","StyledMobileBanner","dwLogoMobile","dwLogoTablet","useToggle","initialState","isEnabled","setEnabled","useState","toggleOnClick","useCallback","toggleOnKeyPress","e","_ref3","stroke","strokeWidth","fill","opacity","transform","width","height","xmlnsXlink","undefined","SvgIconUserNavi","xmlSpace","clipRule","strokeLinejoin","strokeMiterlimit","SvgIconLanguageWorldW","SvgTick","document","domainWithProtocol","isServer","origin","USER","AS_URL","AS_URL_WITH_DOMAIN","PS_URL","LOGGED_USER_RESOURCE","TICKET_PARAM_NAME","FEEDBACK_TYPES","OTHER","LOGIN","LOGIN_ERROR","LOGIN_FB","LOGOUT","SESSION_TIMEOUT","PROFILE_SERVICE_UNAVAILABLE","MISSING_USER_PROFILE","FORCED_LOGOUT","PASSWORD_CHANGED","MAIL_CHANGED","MAIL_CHANGE_REQUEST","EMAIL_ALREADY_EXISTS","REGISTERED","REGISTRATION_CONFIRMED","DELETED","INVALID_TOKEN","PASSWORD_RESET_REQUESTED","PASSWORD_RESET_SET","PASSWORD_CHANGE_WRONG_PASSWORD","PROFILE_UPDATED","PASSWORD_CHANGE","INVALID_CERTIFICATE","VOCABULARY_TRAINER_UNAVAILABLE","VOCABULARY_TRAINER_NO_VOCABULARIES","CERTIFICATE_NO_TRANSCRIPTION","MISSING_TRANSCRIPTION","USER_ALREADY_EXISTS","USER_ALREADY_CONFIRMED","TYPES_WITH_PROFILE_PAGE_AS_TARGET","COMMON_FEEDBACK_TRANSLATION_KEYS","TITLE","OK_BUTTON","noop","invert","inMap","entries","next","groupBy","array","concat","removeContentLinksWithEmptyTarget","contentLinks","filter","contentLink","isFinalTestPredicate","additionalInformation","includes","capitalize","text","charAt","toUpperCase","toLowerCase","getMediaFileSizeInKBorMB","fileSizeInBytes","Math","floor","shuffle","j","random","calculatePercentage","fraction","total","round","generateRandomNumber","sortObjectsByProp","prop","order","sort","a","b","LANG_CODES","NEUTRAL","GERMAN","ENGLISH","RUSSIAN","CHINESE","PORTUGUESE_BRAZIL","ALBANIAN","AMHARIC","ARABIC","BENGALI","BOSNIAN","BULGARIAN","DARI","FRENCH","GREEK","HAUSA","HINDI","INDONESIAN","KISWAHILI","CROATIAN","MACEDONIAN","PASHTO","PERSIAN","POLISH","PORTUGUESE_AFRICA","ROMANIAN","SERBIAN","SPANISH","TURKISH","UKRANIAN","URDU","codeToLang","toLangCode","lang","toLang","code","globals","global","localStorage","config","graphQL","baseUrl","dw","mobileUrl","reCaptcha","siteKey","download","videoBaseUrl","audioBaseUrl","typeToUrlPrefixMap","COURSE","GRAMMAR","LESSON","PLACEMENT","FINAL","urlPrefixToTypeMap","typeToUrlPrefix","typeName","urlPrefixToType","typeId","allowedUrlCharactersRegexParts","general","numbers","whiteSpaces","allowedSpecial","arabic","cyrillic","greek_and_coptic","chinese","devanagari","bengali","ethiopian","onlySpecialCharactersRegex","values","join","normalizeUrlName","name","encodeUrlNamePart","encodeURIComponent","mainContentFullUrl","href","getVideoDownloadUrl","videoUrl","getAudioDownloadUrl","audioUrl","getDownloadUrl","staticBaseHost","downloadId","filename","getArticleUrl","articleId","getDWStructureUrl","langCode","getQueryParamValueFrom","from","search","value","URLSearchParams","get","objectToQueryParams","toString","PLACEMENT_TEST_COURSE_IDS","getPlacementTestIdForLangCode","isPlacementTestCourse","courseId","allIds","PAGE_OVERVIEW","PAGE_REGISTRATION","PAGE_PROFILE","PAGE_PASSWORD_CHANGE","PAGE_PASSWORD_RESET","PAGE_VOCABULARY_TRAINER","PAGE_VOCABULARY_TRAINER_START","STATUS_FEEDBACK","PAGE_GRAMMAR","PAGE_HELP","PAGE_VOCABULARY","PAGE_LEGAL","PAGE_PLACEMENT_TEST","EXERCISES_RESULT_URL_SUFFIX","COURSE_PREFIX","LESSON_PREFIX","EXERCISE_PREFIX","LESSON_GRAMMAR_URL_SUFFIX","LESSON_VOCABULARY_URL_SUFFIX","LESSON_REGIONAL_STUDIES_SUFFIX","ALPHABETICAL_ORDER_URL_SUFFIX","LESSON_MANUSCRIPT_SUFFIX","LESSON_EXTRAS_SUFFIX","LESSON_EXERCISE_RESULT_SUFFIX","LESSON_SUMMARY_SUFFIX","SUMMARY_URL_SUFFIX","URL_SEARCH_PARAM_TARGET_PATH","getErrorCode","errorResponse","errorCode","getPrefixedLanguageUrl","getCasLanguageParam","substring","getDashboardUrl","getGrammarUrl","getVocabularyPageUrl","getPlacementDashboardUrl","getLessonExerciseUrl","languageCode","lessonId","normalizedUrlName","lessonPartId","getLessonUrl","getLessonGrammarUrl","getLessonPhonemicChartUrl","getLessonVocabularyUrl","getLessonRegionalStudiesUrl","getUserProfileUrl","getPasswordChangeUrl","getCourseUrl","normalizedUrlCourseName","normalizedUrlLessonName","getLessonExercisesResultUrl","lessonUrl","getFirstGrammarUrl","firstGrammarId","getVocabularyUrl","getAlphabeticalOrderUrl","getFirstRegionalStudiesUrl","firstRegionalStudiesId","getManuscriptUrl","getExtrasUrl","getSummaryUrl","transformUrlContentPrefix","lessonPath","createLinkToResultPage","isFinalTest","getHelpUrl","getLegalUrl","getVocabularyTrainerStartPage","getVocabularyTrainerPage","getTargetPageUrl","getFeedbackUrl","getLoginPage","targetPath","callbackUrl","getLoginRedirectUrl","getLoginUrlSearchParamsString","withDomain","urlSearchParams","getContentUrl","language","__typename","langUrlPart","nameUrlPart","getFooterLinkForNamedUrl","namedUrl","getDwUrlWithLang","getDwContactUrl","CUSTOM_LS_EVENT_NAME","readValue","JSON","parse","getItem","useLocalStorage","storedValue","setStoredValue","setValue","setItem","stringify","dispatchEvent","Event","handleStorageChange","addEventListener","removeEventListener","CHINESE_SIMP_POSTFIX","CHINESE_TRAD_POSTFIX","CHINESE_SIMP_TRANSLATION_KEY","CHINESE_TRAD_TRANSLATION_KEY","MENU_LANGUAGES","translationKey","useTimeout","callback","delay","conditional","triggers","savedCallback","useRef","current","tick","handleId","setTimeout","clearTimeout","loadScript","Promise","resolve","reject","tag","createElement","async","src","appendChild","once","useScripts","scriptUrls","cb","querySelectorForAllScriptTags","map","scriptUrl","existingScriptTags","querySelectorAll","all","body","tongwenScripts","TRADITIONAL_CHIN_LOCAL_STORAGE_KEY","URL_GET_PARAM_NAME","URL_GET_PARAM_SIMPLIFIED","URL_GET_PARAM_TRADITIONAL","TOGGLE_BUTTON_SIMPLE_TEXT_CONTENT","TOGGLE_BUTTON_TRADITIONAL_TEXT_CONTENT","useChineseSimpleTraditionalSwitch","toggleButtonId","isChineseLangCode","scripts","isScriptsLoaded","setScriptsLoaded","isTranslatedFirstTime","setTranslatedFirstTime","isTraditionalChin","setIsTraditionalChin","useLocation","setToggleButtonTextContent","content","getElementById","textContent","cleanedSearch","chineseVersionRequestParam","urlParams","TongWen","trans2Trad","trans2Simp","trans2Simple","trans2Traditional","isLanguageSelected","languageTranslationKey","currentLanguage","getDashBoardUrlForLanguage","dashboardBaseUrl","LanguageSelectionButton","classnames","hidden","TickImg","StyledLanguageSelectionButton","API_CALL","apiAction","method","data","onSuccess","onFailure","headersOverride","payload","JSON_CONTENT_TYPE","BASIC_JSON_CONTENT_TYPE_HEADER","headers","buildParamRegex","paramName","getFromUrl","regexBuilder","matchArray","paramRegex","exec","decodeURIComponent","getSearchParam","removeSearchParam","rawWiththoutParam","isPathInExerciseNavigationWhiteList","pathname","permittedNavigationPathsRegexp","test","getTicketFromUrlParam","getTicketDomain","formatRegistrationUserData","userData","captchaToken","sex","firstName","lastName","email","password","country","teacher","newsletter","year","recaptcha","contactLanguage","createDateOfBirth","formatUserProfileData","dateOfBirth","deconstructDateOfBirth","datePartials","month","day","LOGOUT_SUFFIX","NOT_LOGGED_USER_SUFFIX","LOGGED_USER_SUFFIX","PROFILE_SUFFIX","REGISTRATION_SUFFIX","PS_PREFIX","NOT_LOGGED_USER_RESOURCE","CONFIRMATION_RESOURCE","registerUser","formattedData","fetch","dataType","deleteUser","catch","msg","error","checkUserProfile","response","updateUserProfile","ok","json","validateUserTicket","ticket","ticketDomain","VALIDATE_TICKET_URL","confirmUserRegistration","confirmationId","sumScore","contentsWithScore","scoreFieldName","nextContentWithScore","filterLessonFields","filterExerciseFields","filterInquiryFields","filterDataFromService","filteredLessonData","removeObjectAttributes","exerciseProgresses","filteredExerciseProgresses","filterExerciseData","exerciseProgress","filteredExerciseProgress","inquiryProgresses","filteredInquiryProgresses","filterInquiryData","inquiryProgress","sourceObject","attributesToRemoveArray","targetObject","forEach","field","getLearningMetaInfoFragment","handicap","targetHandicap","gql","scoreFragment","fragment","addLearningMetaInfo","createInquiryProgressMetaData","inquiryId","score","achievableScore","maxScore","createLearnProgressData","lessonAchievableScore","exerciseId","allExerciseCount","exerciseAchievableScore","cosLessonId","cosCourseId","maxPointsForAllExercises","cosExerciseId","initializeLessonLearnProgressWithDataFromServer","lessonProgresses","lessons","lessonProgress","initializeCourseLearnProgressWithDataFromServer","courseProgresses","courses","updateLessonProgressFromService","filteredLessonProgress","findExistingLesson","lesson","deleteLessonProgressById","findExistingLessonById","deleteLessonProgressesByCourseId","deleteCourseProgressById","findExistingCourseById","course","addCourseProgressData","courseProgress","find","findInquiryProgress","currentExerciseProgress","generateLessonProgress","existingLesson","updateExistingLessonMetaData","createNewLessonMetaData","updateExerciseMetaDataForExistingLesson","existingExercise","exercise","updateExerciseMetaData","createNewExerciseMetaData","newExerciseProgresses","newDoneExerciseCount","updatedLesson","doneExerciseCount","resultPoints","newLesson","maxPoints","some","newInquiryProgress","COURSE_PROGRESS","LESSON_PROGRESS","LESSON_PROGRESSES","PROTECTED_URL","LESSON_TYPE","COURSE_TYPE","handleError","console","status","getProgress","contentType","getProgresses","ids","deleteLearnProgress","saveLessonProgress","lessonProgressData","saveLessonProgresses","lessonProgressesData","getLastEditedLessonsIds","numberOfLessons","initCourseProgress","initialCourseProgressData","ADD_LESSON_PROGRESS","READ_LESSON_PROGRESS","READ_LESSON_PROGRESSES","DELETE_LESSON_PROGRESS","READ_COURSE_PROGRESS","READ_COURSE_PROGRESSES","DELETE_COURSE_PROGRESS","DELETE_LESSON_PROGRESSES","REMOVE_LEARN_PROGRESS","LESSON_PROGRESS_SYNC_NEEDED","addLessonProgress","dispatch","addProgress","saveProgressOnServer","deleteLessonProgress","deleteLProgress","deleteProgressOnServer","readLessonProgress","getState","user","isLoggedIn","progress","readProgress","readLessonProgresses","lessonIds","progresses","readProgresses","readCourseProgress","addCourseProgress","readCourseProgresses","courseIds","readCProgresses","initCourse","initialCourseData","deleteCourseProgress","deleteCProgress","deleteLessonProgresses","removeProgress","setLessonProgressSyncNeeded","isSyncNeeded","syncLessonProgress","learnProgress","contentId","isSyncRequired","learnProgressReducer","state","action","SET_USER","REMOVE_USER","API_ERROR","LOGOUT_REQUEST_CALLED_FLAG","logInUser","setUser","setApiError","logOutUser","removeUserData","deleteUserAccount","removeUser","setHasLogOutRequestBeenCalled","hasBeenCalled","loginTimeout","hasLogOutRequestBeenCalled","apiErrorHasOccurred","userReducer","userSelector","userDataSelector","GlobalsContext","useGlobalsContext","NavMenu","isNavMenuOpen","toggleIsNavMenuOpen","isLanguageSubMenuOpen","setIsLanguageSubMenuOpen","useParams","useSelector","isLoggedInClass","useDispatch","handleLogoutClicked","preventDefault","maxHeight","IconUserNavi","event","IconLanguageWorldW","transition","visibility","borderBottom","StyledNavMenu","StyledNavigationList","StyledNavMenuIcon","StyledIconBar","BurgerButton","IconBar","defaultHoverStyles","navCrossXs","mediaHoverDeviceDetection","closeMenuMobile","closeMenuTablet","StyledBurgerButton","navCrossBlackLg","navCrossLg","navCrossBlackMd","OnlyDesktopBrand","makeRoomForRtl","StyledOnlyDesktopBrand","StyledLink","Link","ChineseVariantSwitch","StyledChineseVariantSwitch","NavigationContainer","StyledNavigationContainer","Header","headerTitleKey","StyledHeader","RichtextGlobalStyles","createGlobalStyle","RichText","isContainer","__html","ratioToPercentage","widthProportion","heightProportion","ASPECT_RATIO","landscape","landscape_legacy","portrait","square","imgWithFormatFn","imageId","imageBasePath","format","legacy","aspectRatio","free","sm","sm_richtext","md","md_richtext","lg","lg_richtext","frontendConfig","inFrontendConfig","FrontendConfigContext","getFrontendConfig","useFrontendConfig","Picture","sources","fallbackUrl","alt","sourceAttributes","index","DwPicture","inProps","imgWithFormat","defaultProps","media","srcSet","replaceWithComponent","componentFn","node","param","elementType","matchedElem","renderContainer","placeholderClassNames","setAttribute","trim","parentNode","replaceChild","componentToRender","render","mapImgPlaceholderToPicComponent","rawImageFormat","getAttribute","isLegacy","isFree","imageAspectRatio","imagePropsText","imagePropsLegacy","imagePropsFree","paddingBottom","getImageDisplayProps","imageProps","replacePlaceholderImagesWithResponsivePictures","useImagePlaceholderReplacementEffect","trigger","ContentHeadline","isStandalone","standalone","legalFragment","partial","LegalNotice","legal","shortTitle","StyledLegalNotice","footerFragment","Footer","rtlClass","footerData","footerObject","role","aria","first","Date","getFullYear","footer","policy","accessibility","StyledFooter","LoadingMessage","StyledLoadingMessage","ErrorMessage","StyledErrorMessage","hasData","item","WithGraphQLQueryHandling","query","queryVariables","loading","refetch","useQuery","variables","message","metadata","inMetadata","FrontendMetadataContext","getMetadata","useMetadata","i18nConfigQuery","I18nConfigLoader","i18nQueryVariables","iso639ByLang","BrowserOnly","GdprLayer","hasAcceptedGdpr","setHasAcceptedGdpr","left","PAGE_TYPES","HELP","VOCABULARY","ALPHABETICAL_ORDER","LEGAL","OVERVIEW","EXERCISE","LESSON_EXERCISE_RESULT","LESSON_SUMMARY","GRAMMAR_DETAIL","GRAMMAR_OVERVIEW","VOCABULARY_OVERVIEW","REGIONAL_STUDIES","PLACEMENT_TEST","FINAL_TEST","MANUSCRIPT","USER_PROFILE","PASSWORD_RESET","PASSWORD_SET","REGISTER_USER","FEEDBACK_STATUS","EXTRAS","PLACEMENT_DASHBOARD","VOCABULARY_TRAINER","NOT_FOUND_PAGE","GTM_NO_CONTENT_PAGE_IDS","LESSON_MENU_VOCABULARY_KEY","LESSON_EXERCISE_RESULT_TITLE_KEY","LESSON_MENU_GRAMMAR_KEY","LESSON_MENU_REGIONAL_STUDIES_KEY","LESSON_MANUSCRIPT_KEY","LESSON_MENU_EXTRAS_KEY","LESSON_EXERCISES_RESULT_GENERAL_KEY","PAGE_TYPE_TO_TITLE_TRANSLATION_KEYS","PAGE_TYPE_TO_DESCRIPTION_TRANSLATION_KEYS","PAGE_TYPE_TO_KEYWORDS_TRANSLATION_KEYS","createTitle","titleParts","createKeywords","keywords","html2text","html","useMetaTitle","pageType","translationFirst","contentName","parentContentName","pageTitleTranslationKeys","pageTitleTranslations","siteName","useMetaDescription","teaser","description","useTeaserAsDescription","useDescriptionTranslation","descriptionTranslation","useMetaKeywords","useOnlyCmsKeywords","keywordStrings","defaultKeywords","additionalKeyword","pageKeywords","metaDataFragment","PageMetaData","addKeywordsAndDescription","iso639Lang","descriptionMeta","keywordsString","contentFullUrl","showDescription","Helmet","feedbackHelper","getForErrorCode","getForPasswordChangeErrorCode","errorPasswordChange","forLogin","redirectUrl","forLogout","forUserDelete","forInvalidToken","forProfileServiceUnavailable","forSessionTimeout","forMissingUserProfile","forForcedLogout","forPasswordChanged","forMailChanged","forMailChangeRequest","forRegistered","forRegistrationConfirm","forPasswordResetRequest","forSetPassword","forProfileUpdated","forVocabularyTrainerUnavailable","forVocabularyTrainerNoVocabularies","forCertificateMissingTranscription","forInvalidCertificate","forGeneralError","getFeedbackContentKey","feedbackType","s","useValidateTicketAndLoginUser","history","useHistory","Error","push","useRedirectAfterLogOut","userState","PageLayout","StyledPageLayout","useLocationGetter","setLocation","setLangCode","locationFromWindow","pathnameFragments","langCodeFromLocation","useCheckSessionTimeout","rtlLanguages","isRtlByLangCode","findLessonLearnProgressSelector","findInquiryLearnProgressSelector","findCourseLearnProgressSelector","isLessonProgressSyncRequiredSelector","useSyncLearnProgress","isLessonProgressSyncRequired","GlobalStyles","bgDWDesktop","DWTheAntiquaBBoldWoff","DWTheAntiquaBBoldWoff2","DWTheAntiquaBSPlainWoff","DWTheAntiquaBSPlainWoff2","DWTheAntiquaBSPlainItalicWoff","DWTheAntiquaBSPlainItalicWoff2","MainPage","StyleSheetManager","stylisRTLPlugin","GtmLoadScript","gtmId","GtmNoScriptFallback","dataLayer","hideIframeStyles","display","useLocationQueryParam","useStaticInfoForGtm","pageUrl","macaParam","gtmLevel1Id","isValidList","list","addCurrentNavToRootList","nav","navsToRoot","contentTitle","fullName","pickCategoryName","navs","gtmDataLayerPartial","generateContentGtmInfo","level1Id","noContentPageId","navigations","alignedNavs","categoryLevel1","categoryLevel2","categoryLevel3","contentLanguage","gtmLanguageCode","pageOID","gtmContentType","date","gtmContentDate","subject","subjects","topicIds","topics","topic","originId","pageSID","departmentName","departments","categoryType","displayForm","level1ID","TrackingUtils","initDataLayerScript","datalayer","initialDataLayer","generateDataLayer","pageData","embeddings","pushToGoogleTagManager","datalayerObj","withReset","resetDataLayer","reset","CourseDataContext","useCourseData","gtmDataLayerFragment","GtmDataLayer","GtmScriptWithDataLayer","isGtmAlreadyInitialized","memo","NotMemoGtmScriptWithDataLayer","PageContainer","withPageContainerAndMetadata","component","TargetComponent","addDescriptionAndKeywordsMeta","Default404Page","NOT_FOUND","MONOLINGUAL_COURSES_IDS","isMonolingualCourse","HeroTemplate","StyledHeroTemplate","determineImage","StyledCourseHeroImage","points","SvgToggleableArrow","StyledToggleableArrowIcon","ToggleableArrowIcon","ToggleableArrow","isUp","classNames","up","StyledToggleableArrow","CourseHeader","groupNameTranslationKey","isOpen","onClick","onKeyPress","StyledCourseHeader","LessonScore","resultPointsClassName","resultInPercentage","StyledLessonScore","ProgressResetButton","onClickReset","StyledProgressResetButton","StyledSmallProgressResetButton","progressIconColors","GRAY","WHITE","progressState","EMPTY","HALF","FULL","translationKeyPrefix","getTitleTranslationKey","ProgressIcon","color","StyledProgressIcon","CERTIFICATE_URL","getCertificate","err","handleCertificateGeneration","blob","headerFilename","URL","createObjectURL","downloadLink","click","CertificateIcon","CertificateGray","StyledCertificateIcon","starsMapping","StarGrey","StarWhite","ProgressIconStar","StyledProgressIconStar","LearnProgressIcon","finalLessonId","getProgressIcon","finalTestPassed","LessonItem","onHandleResetClick","learningTargetHeadline","grammarDescription","alignProgressData","StyledLessonItem","LessonList","groupedLessons","collapsed","StyledLessonList","CourseAccordion","isOnDesktop","innerWidth","CourseList","onClickResetLesson","groupName","StyledCourseList","DisableScrollingStyles","ModalIntegration","componentToCreate","ReactDOM","createPortal","StandardButton","titleKey","handleClick","rtl","StyledStandardButton","Modal","fadeIn","descriptionKey","leftButtonKey","rightButtonKey","onConfirmClicked","onCancelClicked","classNameString","StyledModal","RightButton","LeftButton","ResetModal","CourseProgress","onClickResetCourse","StyledCourseProgress","learningLevelMapper","sortByLearningLevel","coursesToSort","dkLearningLevel","LTRContentCourseOverviewStyle","CourseOverview","isMonoLingualCourse","lessonContentLinks","mainContentImageLink","learningMetaInfo","exerciseCount","filteredContentLinks","allLessonIds","isResetModalOpen","setResetModalOpen","lessonIdToDelete","setLessonIdToDelete","onConfirmResetProgress","onCancelResetModal","CoursePageHeroImage","targetId","imageOGMetaDataFragment","hasCorrectImageFormat","imageFormats","createImageSharingData","ImageOGMetaData","image","coursePageQuery","addMetaInfo","CoursePage","coursePageQueryVariables","mainContentImage","TABLE_WITH_ATTRIBUTES","OPEN_TABLE_TAG","CLOSE_TABLE_TAG","TABLE_WRAPPER_DIV","DIV_CLOSING","wrapTablesWithDiv","htmlString","textReplacedOpenings","removeAttributesFromTables","Component","componentDidMount","delayTime","timeoutHandle","actionToBeDelayed","setState","prevState","componentWillUnmount","KnowledgeModalContainer","knowledgeType","imageName","audioFile","subTitle","onClose","audioRef","closeModalRef","closeBackdropRef","faded","initialSound","playAudio","play","closeModal","classList","remove","closeButton","audioLink","linkTitle","in","KnowledgeModal","Knowledge","knowledge","wrapper","vocals","classMap","consonants","glossary","getClassName","handleKeyPress","audios","mp3Src","placeholderToKnowledgeComponent","matchedElement","knowledges","element","parseInt","dataset","replacePlaceholderMarkupWithKnowledges","knowledgesFragment","lessonKnowledgeQuery","LessonKnowledge","lessonName","lessonKeywordStrings","lessonKnowledgeQueryVariables","knowledgeId","lessonLang","knowledgeContent","useKnowledgePlaceholderReplacementEffect","ignore","GrammarItem","markup","grammarPageQuery","GrammarPage","grammarPageQueryVariables","StyledMainHeroImage","landingImgFull","landingImgMobile","landingImgTablet","landingImgTabletLandscape","tileFragment","Tile","linkData","LinkWrapper","StyledTile","backgroundColor","BlankTile","StyledBlankTile","MoreCoursesTile","StyledMoreCoursesTile","tileColors","scrollIntoViewCenter","htmlElement","scrollIntoView","behavior","block","inline","uniqueId","substr","Tiles","tileData","tileElement","Fragment","StyledTiles","Dashboard","dashboardPageQuery","DashboardPage","dashboardPageQueryVariables","courseLang","amount","contentsByLang","contentsInGerman","GrammarOverviewHeader","StyledGrammarOverviewHeader","AccordionItem","contents","scrollHeight","StyledAccordionItem","AccordionItemContent","div","grammarOverviewColors","Accordion","accordionData","headline","grammars","StyledAccordion","removeEmptyGrammars","grammarOverview","Array","isArray","GrammarOverview","grammarOverviewPageFragment","grammarOverviewPageQuery","GrammarOverviewPage","pathPartials","langCodeRegex","titlePathRegex","contentIdRegex","contentTypeRegex","knowledgeTypeRegex","knowledgeWithContentIdTypeRegex","feedbackTypes","LessonMenuItem","to","ariaLabel","rel","StyledLessonMenuItem","LessonTitle","StyledLessonTitle","LessonBurgerButton","isMenuCollapsed","setIsMenuCollapsed","buttonStyle","StyledLessonBurgerButton","LESSON_PARTS","VOCABULARY_GLOSSARY","PHONEMIC_CHART","DOWNLOAD","hasLessonPart","lessonOverviewParts","lessonPart","part","getFirstIdOfLessonPart","targetOverviewPart","filterLessonKnowledgeOverviewItems","filterLessonExerciseOverviewItems","isFinalTestLesson","lessonContentLinksFromCourse","currentLessonId","finalTestLessonContentLink","filteredAssembledInfos","assembleOverviewInfos","info","hasInfo","LessonMenu","courseName","isFromPlacementCourse","firstExercisePath","grammarAria","vocabularyAria","onConfirmResetLessonProgress","onCancelResetLessonProgress","getFirstOfTypeId","hasExercisesReset","boxShadow","StyledLessonMenu","SvgIconHintCircleOrange","lessonContentDescriptionFragment","LessonContentDescription","isHintHidden","lessonid","learningTargetDescription","deleteProgressIfFinalTest","IconHintCircleOrange","subtitlesLabels","hasVideoPlaceholdersInRichText","hasAudioPlaceholdersInRichText","hasVideoPlayer","hasAudioPlayer","hasVideosOnly","hasAudiosOnly","importVideoPlugins","importAudioPlugins","importVideoJs","videojsModule","videojs","default","commonOptions","bigPlayButton","videoOptions","audioOptions","controlBar","pictureInPictureToggle","fullscreenToggle","playbackRates","getOptions","videoNode","tagName","importAllPlugins","importPlayerPlugins","getPlayerWithPlugins","initAudio","player","seekButtons","forward","back","initVideo","hlsQualitySelector","initPluginsForPlayer","isAudio","loadVideoJsApi","playerLib","init","renderVideoJsPlayers","durationBarComponentName","videoPlayButtonComponentName","playerNode","add","addChild","useVideoPlayerEffect","didCancel","loadedApi","eventName","useAddEmbeddingsToGtm","dictionary","useMediaTracking","contentDictionary","mediaInputVideoFragment","MediaInputVideo","videos","subtitles","posterImageUrl","hlsVideoSrc","formattedDuration","subtitle","subtitleUrl","srcLanguage","trackId","mediaInputImageFragment","MediaInputImage","mediaInputAudioFragment","MediaInputAudio","contentDate","duration","size","audioResourceLinks","cursor","mediaInputChooserFragment","MediaInputChooser","lessonInput","lessonInformationQuery","LessonInformation","isContentDescriptionHintVisible","ogImage","lessonInformationQueryVariables","EXERCISE_PROGRESS_ACTION_TYPES","ADD_DONE_INQUIRY","RESET","exerciseProgressReducer","numberOfDoneInquiries","currentExerciseScore","ExerciseProgressContext","ExerciseProgressProvider","exerciseStats","useReducer","useExerciseProgress","addDoneInquiry","resetProgress","outOfText","numberOfPointsEarnedText","numberOfExercisesSolvedText","LessonExerciseStats","amountOfInquiries","isRtlLang","numberOfDoneInquiriesSpan","amountOfInquiriesSpan","scoreSpan","useScrollToTop","scrollTo","ContentNavTitle","top","bottom","direction","lessonExerciseHeadlineFragment","LessonExerciseHeadline","LessonExerciseHiddenAudio","forwardRef","LessonExerciseSoundFailureHiddenAudio","_","LessonExerciseSoundSuccessHiddenAudio","AudioContext","AudioProvider","questionAudiosRefArray","setQuestionAudiosRefArray","wrongAnswerAudioRef","correctAnswerAudioRef","LessonExerciseTextInput","inputText","useAudio","audiosRefArray","setAudiosRefArray","stopOtherAudios","currentAudio","audio","pause","currentTime","addRef","playWrongDefaultAudioFeedBack","playCorrectDefaultAudioFeedBack","LessonExerciseQuestionAudioGlobalStyles","LessonExerciseQuestionAudio","inquiryText","isPlaying","setIsPlaying","hasEnded","setHasEnded","playAudioLabel","answerAudio","handleOnPlaying","handleOnEnded","handleOnPaused","getBubbleAudioLabel","audioLabel","LessonExerciseQuestionTextGlobalStyles","LessonExerciseQuestionText","LessonExerciseQuestionImage","LessonExerciseQuestionVideo","findQuestionAudio","mainContent","findFeedbackAudio","isSolutionAudioFallbackMode","feedbackAudio","QUESTION_TYPES","TEXT","IMAGE","AUDIO","VIDEO","lessonExerciseQuestionFragment","exerciseQuestionTypeSelector","inquiry","LessonExerciseQuestion","useSubInquiryTextAsLabel","subInquiries","questionType","labelText","getLabelText","subInquiryText","questionAudio","ButtonTemplate","btnClass","fullWidth","StyledButtonTemplate","SolveButton","isDisabled","grayActiveFocus","StyledSolveButton","CheckButton","StyledCheckButton","SolveCheckButton","isSolveButtonDisabled","isCheckButtonDisabled","handleSolveClicked","handleCheckClicked","StyledSolveCheckButton","placeholderConfig","placeholder","maxLength","createSingleSentenceAnswerContent","arrayJoinString","sentences","subInquiry","cleanupAndAddPlaceholderComponents","answertext","answerWithReplacePlaceholders","replaceInString","INQUIRY_STATE","INITIAL","WRONG","CORRECT","SOLVED","ClozePulldown","pulldownData","inquiryState","checkEntry","onHandleItemSelected","isToggled","setIsToggled","getInputClassName","onPulldownClicked","selectedValue","alternatives","alternative","altIndex","alternativeText","replacePlaceholderWithAnswerComponent","createComponent","scopeClassName","usePlaceholderReplacementEffect","ExerciseRichText","update","PulldownAnswer","onChange","clozeLayoutType","initialClozePulldownData","entry","isCorrect","checkAnswer","clozePulldownData","setClozePulldownData","answer","newClozeData","createPulldown","partialComponent","answerContent","selectedClozeLayoutConfig","clozeLayoutTypeConfig","CONTINUOUS_TEXT","cmp","SINGLE_SENTENCE","StyledPulldownAnswer","SvgIconHint","LessonExerciseHintGlobalStyles","LessonExerciseHint","isSimpleIconHint","IconHintSimple","StyledContainerTextContent","MULTIPLE_WHITESPACES_REGEX","MINUS_CHARACTERS_REGEX","SPECIAL_CHARACTERS","WHITESPACE_BEFORE_SPECIAL_REGEX","WHITESPACE_AFTER_SPECIAL_REGEX","normalizeText","str","isNormalizedTextEqual","str1","str2","ChooseAnswerGlobalStyles","ChooseAnswer","initialClozeChooseData","selectedAnswer","initialSelectableAnswers","clozeChooseData","setClozeChooseData","selectableAnswers","setSelectableAnswers","setSelectedAnswer","updated","clozeData","removeSelectedAnswer","removeSelectableAnswer","newSelectableAnswers","selectableAnswer","addSelectableAnswer","handleAnswerClicked","answerText","answerId","isSelectedAnswer","answers","EmptyPlaceholder","FilledPlaceholder","answerLink","PlaceHolder","createPlaceholder","continuousTextPartialComponent","singleLinePartialComponent","getAnswerClasses","defaultClasses","x","y","_ref4","_ref5","_ref6","_ref7","_ref8","_ref9","_ref10","_ref11","SvgKeyboard","StyledKeyboardIcon","KeyboardIcon","TextAreaInput","input","isPlaceholderDisabled","translatedPlaceholder","getBorderColor","onTextAreaKeyPress","StyledVerticalTextArea","textarea","borderColor","layout","shift","KeyboardWrapper","inputMaxLength","inputValue","inputClassName","isTextArea","isKeyboardVisible","setKeyboardVisible","layoutName","setLayoutName","keyboardRef","inputRef","textAreaRef","setInput","focus","toggleKeyboard","pressedKey","onInputKeyPress","charCode","handleShift","onChangeInput","onChangeLocalInput","r","StyledKeyboardBackdrop","ClozeInput","handleOnInputChange","fieldNameId","userAnswer","setIsCorrect","handleOnChange","handleKeyboardChange","handleChange","baseInputClassName","WritingAnswerGlobalStyles","WritingAnswer","initialClozeWritingData","clozeWritingData","setClozeWritingData","newData","innerText","useInquiryHandling","setSolveButtonDisabled","setCheckButtonDisabled","isMarkedAsDone","setMarkedAsDone","wrongAnswerCount","setWrongAnswerCount","setInquiryState","disableAllButtons","checkAndMarkAsDone","handleCorrectAnswer","handleWrongAnswer","correctSubInquiries","handleSolved","ClozeExerciseRow","initiallyCorrectInquiries","inquiryDescription","clozeType","setCorrectSubInquiries","feedbackAudioUrl","feedbackAudioRef","changeResult","onHandleSolveButtonClicked","onHandleCheckButtonClicked","playCorrectAudioFeedBack","getAnswerComponent","answerComponent","lessonExerciseHintPartial","clozeExerciseFragment","ClozeExercise","inquiries","DictationExerciseRow","solutionText","onSolveClicked","onCheckClicked","newInput","DictationExercise","INQUIRY_MEDIA_TYPE","ManyToManyAnswerGlobalStyles","ManyToManyAnswer","answersBlocked","mediaType","isLeftAnswer","isMatched","onAnswerClicked","isImage","basicClass","assignMatchedAnswerClass","isCorrectlyMatched","isSolved","assignAnswerClass","isSelected","currentSideAnswersBlocked","images","SHUFFLE_RIGHT_ANSWERS","MATCH_ANSWERS_PAIR","BLOCK_ANSWERS","RESET_MATCHED_ANSWERS_PAIR","CHECK_ANSWERS","SOLVE_ANSWERS","reducer","selectedId","isLeft","selectedIndex","initialLeftAnswers","shuffledRightAnswers","rightAnswers","leftMatchedAnswer","leftAnswers","rightMatchedAnswer","leftMatchedAnswers","rightMatchedAnswers","isLeftAnswerBlocked","isRightAnswerBlocked","updatedAnswers","isIdEqual","matchedAnswer","updatedLeftMatchedAnswers","updatedRightMatchedAnswers","isAllMatchedCorrectly","every","solvedWrongCounter","solvedMatchedAnswers","isSolvedCorrect","ManyToManyQuetsionRowGlobalStyles","ManyToManyQuestionRow","isAnswerBlocked","onMatchedAnswerClicked","ManyToManyExercise","ANSWER_STATE","SELECTED","LessonExerciseTextAnswerGlobalStyles","LessonExerciseTextAnswer","assignAnswerAriaLabel","answerState","getAnswerClass","LessonExerciseImageAnswer","lessonExerciseAnswerFragment","ExerciseAnswer","answerMediaType","useIsMountedRef","isMountedRef","setMounted","isMounted","MultiSelectionQuestionRow","correctAnswerAudio","correctAnswerAudioUrl","answersRefArray","answersFrozen","setAnswersFrozen","setAnswers","answersRef","selectOrUnselectAnswer","chosenAnswerIndex","newAnswerState","isSolvedCorrectly","checkedAnswers","unsolvedOrWrongAnswers","updateAnswers","answersToUpdate","answerStateEvalFn","skipAnswerConditionalFn","playSuccessAudio","blur","MultiSelectionExercise","SelfAssessmentAnswer","answerLabel","SelfAssessmentQuestion","howWasItWithOnlyFeedbackAudio","howWasItLabel","lessonExerciseQuestionAudio","hasOnlyFeedbackAudio","SelfAssessment","fixedAnswers","setSelected","updateSelected","evaluateAnswer","RepeatExerciseRowGlobalStyles","RepeatExerciseRow","subInquiryDescription","RepeatExercise","SingleSelectionQuestionRow","getAnswerState","selectCurrentAnswer","answersCopy","SingleSelectionExercise","sortingExerciseFragment","SortingExerciseRowAnswerGlobalStyles","SortingExerciseRow","answerType","choosenAnswers","setChoosenAnswers","isCorrectOrder","isDuplicatedValue","playCorrectAudio","updateSelection","currentSelectableAnswers","currentChoosenAnswers","getAnswerLink","answerID","isInquiryMediaTypeText","classType","getFeedbackClass","SortingExercise","ExerciseLeavingPrompt","leaveMessage","ContentContainer","ContentBottomLine","AccordionContainer","titleTranslation","AccordionContainerContent","StyledAccordionContainer","manuscriptFragment","ManuscriptGlobalStyles","Manuscript","manuscript","ContainerComponent","lessonExerciseItemFragment","getExerciseComponentBySelectionType","selectionType","getExerciseComponentByType","inquiryType","getExerciseMediaInputComponentByType","inputType","LessonExerciseItem","exerciseCounter","manuscriptContent","contentComponent","mediaInputComponent","SET_IMPROVE_MODE_FOR_LESSON","REMOVE_IMPROVE_MODE_FOR_LESSON","LESSON_EXERCISE_MODE","IMPROVE","setImproveMode","removeImproveMode","addLessonMode","mode","removeLessonMode","lessonExerciseModeReducer","isLessonInImproveModeSelector","lessonExerciseMode","useExerciseManager","lessonExerciseOverviewItems","isLessonInImproveMode","generateNextExercisePath","nextItem","exerciseName","mapToFlatLessonExercises","lessonExerciseItems","filterExercisesWithNoFullScore","lessonExercises","lessonExercise","existingProgress","getFirstExercisePath","isImproveMode","firstExerciseItem","exercisesWithNoFullScore","exerciseIdsWithProgress","getCurrentIndex","currentExerciseItem","getNextExercisePath","remainingLessonExercises","splice","remainingExercisesWithNoFullScore","getFullScoreAchieved","filterExercises","remainingInquiries","firstExerciseLink","nextExerciseLink","isFullScoreAchieved","currentExerciseCount","filterExerciseDataIfInImproveMode","lessonExerciseQuery","LessonExerciseNavigation","lessonIdNumber","exerciseIdNumber","unlisten","listen","lessonExerciseNavQueryVariables","handleNextButtonClick","progressMetaData","nextPath","filteredData","VocabularyRow","audioSource","isValidImage","lessonVocabularyQuery","LessonVocabularyGlobalStyles","LessonVocabulary","lessonVocabularyQueryVariables","vocabularies","vocabularyItem","LESSON_PART_TRANSLATION_CODES","getTranslationCodeForLessonPart","getArrowAriaLabel","NavigationRow","position","currentItem","previousItem","moveTo","LESSON_PARTS_SUFFIX","LessonKnowledgeNavigation","lessonKnowledgeOverviewItems","getCurrentItem","currentItemIndex","normalizedName","getCurrentComponent","goNextWithButton","ManuscriptQuery","ManuscriptPage","ManuscriptPageQueryVariables","ContentSection","ArticleLinks","targetName","AudioLinks","getAudioLinkTitle","variant","DownloadLinks","videoResourceLinksFragment","VideoLinks","getVideoLinksByFormat","video","videoResourceLinks","videoLink","techFormat","link","getVideoLinkTitle","lessonExtrasFragment","filterContentByType","targetType","LessonExtras","downloads","articles","hasDownloads","hasVideos","hasAudios","hasArticles","LessonExtrasQuery","LessonExtrasPage","LessonExtraPageQueryVariables","EXERCISE_ACTION_TYPES","CONTINUE","SAVE","generateActionKey","actionType","translationPrefix","ExerciseAction","onClickAction","actionKey","MARKS","GOOD","MEDIUM","BAD","Summary","showFeedback","showTitle","percentile","getFeedBackText","randomNumber","LessonResultAndSummaryGlobalStyles","LessonExerciseResult","assembledInfos","showImproveButton","resultPrefix","generateNextUrl","infos","generateExerciseInfos","exerciseInfos","nextUrl","hintKey","handleImproveClicked","firstExerciseLinkInImproveMode","handleSaveClicked","handleContinueClicked","loginLink","LessonSummary","currentLessonLink","currentLessonIndex","generateRedirectInfos","nextLessonContentLink","redirectMessage","lessonSummaryPageQuery","LessonSummaryPage","LessonSummaryQueryVariables","lessonOverviewPartsFragment","scope","handicapArg","LtrContentLessonStyle","Lesson","overviewParts","lessonMainImage","path","useRouteMatch","lessonIdString","courseMainImage","contentsByType","lessonPageQuery","LessonPage","RestrictedRoute","params","ConfirmUserRegistrationContainer","hasErrorClassAssigner","hasNestedErrorsClassAssigner","CUSTOM_ERROR_TRANSLATION_KEYS","SAFE_MONGO_CHARACTERS_ONLY","TRANSCRIPTION","buildKey","suffix","getTranslatedValidationMessage","validationErrorTranslationKey","validationType","customErrorTranslationKey","Input","titleTranslationKey","placeholderTranslationKey","register","validationError","isLabelVisible","Select","defaultOptionKey","option","optionName","ariaKey","Checkbox","BirthDateInput","errors","initialDateOfBirth","initYear","hasErrors","placeholderLabel","emailPattern","transcriptionPattern","namePattern","passwordValid","minLength","numberOfFulfilledConditions","minNumberOfFulfilledConditions","passwordRetypeValid","passwordRetype","passwordDiffersFromEmail","repeatedCharsLimit","template","subString","validateCaptcha","captchaError","isCaptchaPassed","captcha","ReCaptcha","onExpired","checkForReCaptchaToken","token","ReCAPTCHA","countries","contactLanguageOptions","profileEditKeyPath","professionKeyPath","sexOptions","professionOptions","languageLevelKeyPath","languageLevelOptions","writingReadingLevelKeyPath","writingReadingLevelOptions","handicapKeyPath","handicapOptions","learningTypeKeyPath","learningTypeOptions","Registration","captchaRef","handleSubmit","getValues","formState","useForm","reValidateMode","captchaMessage","captchaValidationMessage","createLink","createPrivacyPolicyLink","createAgbLink","checkboxes","labelTextFunc","dataPrivacyPolicy","conditionsOfParticipation","required","gdpr","onSubmit","responseJson","onCaptchaSuccess","onCaptchaExpired","cancelRegistration","validate","differsFromEmail","checkbox","formatPasswordResetUserData","PASSWORD_RESOURCE_PUBLIC_RESET","PASSWORD_RESOURCE_PUBLIC_RESET_REQUEST","PASSWORD_RESOURCE_PROTECTED","changePassword","oldUserPassword","userPassword","oldPassword","newPassword","requestResetPassword","setPasswordByToken","passwordResetToken","getUserByConfirmationId","res","log","NewPasswordInputs","passwordTitleKey","passwordPlaceholderKey","passwordRepeatTitleKey","passwordRepeatPlaceholderKey","PasswordChange","changePasswordResponse","jsonResponse","PasswordReset","textAlign","StatusFeedback","feedbackContentKey","targetPageUrl","DeleteAccountModal","confirmDeleteLabel","UserProfile","isDeleteModalOpen","setDeleteModalOpen","additionalSelectInputs","translationKeySuffix","checkboxInputs","removeEmptySelectValues","cleanedData","selectInputName","updatedData","toggleDeleteAccountModal","firstNameTranscription","lastNameTranscription","streetName","postalCode","city","SetNewPassword","setEmail","userEmailResponse","PlacementTile","level","PlacementTestGlobalStyles","PlacementTest","placementTestPageQuery","PlacementTestPage","placementTestPageQueryVariables","SCOPE","LAST_LESSON","LAST_THREE_LESSONS","LAST_TEN_LESSONS","ALL_LESSONS","scopeToTranslationKeyMapping","VocabularyTrainerStart","setLastLessonsIds","setNumberOfVocabularies","handleExerciseStart","setNumberOfLessons","handleChangeScope","lastEditedLessonIds","VocabularyTrainerStatus","number","rtlText","ltrText","StyledVocabularyTrainerStatus","BubbleContainer","VocabularyTrainerItemGlobalStyles","VocabularyTrainerItem","vocabulary","onSolved","isHidden","setSolved","audioStatus","setAudioStatus","setDisabled","onAudioEnded","StyledVocabularyTrainerItem","cx","cy","SvgSmileyPositive","SvgSmileyNegative","StyledSmileyPositive","SmileyPositive","StyledSmileyNegative","SmileyNegative","VocabularyTrainerSmileys","setAnswerState","onPositiveSmileyClicked","onNegativeSmileyClicked","StyledVocabularyTrainerSmileys","TRANSITION_STATUS","BUSY","READY","useTransition","setTransition","onTransitionEnd","startTransition","newTransition","transitionStatus","VocabularyTrainerExercise","handleExerciseEnd","correctAnswers","setCorrectAnswers","trainerVocabularies","setTrainerVocabularies","nextVocabulary","newTrainerVocabularies","slicedTrainerVocabularies","StyledVocabularyTrainerExercise","operator","getCondition","searchQuery","getQueryVariables","offset","originalCondition","translationCondition","vocabularyFragment","searchResultFragment","searchQueryPart","vocabularySearchQuery","vocabularyTrainerQuery","makeQueryVariables","VocabularyTrainer","lastLessonsIds","numberOfVocabularies","isStarted","setStarted","getRandomVocabularies","flat","uniqueVocabularies","Set","placementResultFragment","getFirstCourseOfEachLevel","allDkCourses","result","learningLevel","targetCourse","PlacementAndFinalTestResult","dkCourses","courseDkLearningLevel","dwLinks","lessonDkLearningLevel","finalTest","calculateCourseNote","nextLevel","nextLevelRecommendation","levelValues","currentIndex","getRecommendedCourseURL","nextCourse","dkCourse","handleOnCertificateClick","nextCourseUrl","showCertificateButton","placementResultPageQuery","PlacementAndFinalTestResultPage","placementResultPageQueryVariables","dkCoursesInGerman","currentCourse","helpFragment","Help","help","StyledHelp","helpPageQuery","HelpPage","helpPageQueryVariables","legalPageQuery","LegalPage","debouncedValue","setDebouncedValue","handler","KEY_ARROW_UP","KEY_ARROW_DOWN","KEY_ENTER","KEY_ESCAPE","KEY_BACKSPACE","keyCodes","TAB","ENTER","SPACEBAR","ARROW_LEFT","ARROW_RIGHT","ESCAPE","TYPE_SET_INPUT","TYPE_GET_CACHED_RESULTS","TYPE_SET_HINTS_DATA","TYPE_SET_HINTS_OPENED","TYPE_SET_HINTS_CLOSED","TYPE_SET_CURSOR_ARROW_UP","TYPE_SET_CURSOR_ARROW_DOWN","TYPE_KEY_ESCAPE_CLICKED","TYPE_KEY_BACKSPACE_CLICKED","TYPE_ANY_CHARACTER_TYPED","TYPE_ITEM_CLICKED","TYPE_KEY_ENTER_CLICKED","vocabularyItems","recentlySearched","isOpened","isEscapeClicked","isEnterClicked","set","cursorUp","cursorDown","combineVocabularyData","mergedVocabularyData","original","hits","idSet","has","useGetCachedHintsResponse","useGetHintsResponseAndCacheIt","debouncedSearchQuery","specialCharactersRegex","VocabularySearch","onItemSelected","Map","vocabularyOverviewPlaceholder","vocabularyOverviewAria","useDebounce","searchInput","handleFocus","handleBlur","handleKeys","keyCode","conditionalSearchQuery","cleanSearchQuery","wordsRegex","suggestions","vocabularyText","matches","distinctSuggestions","addBolding","m","suggestion","StyledVocabularySearch","VocabularyMoreButton","VocabularyItem","Vocabulary","startValue","setStartValue","vocabularyData","setVocabularyData","isNotEmptyResp","setIsNotEmptyResp","setSearchQuery","findAdditionalData","shouldConcat","resp","combinedVocabularyData","newSearchQuery","VocabularyPage","vocabularyPageQueryVariables","typeToPage","ContentPage","pageDef","Tag","App","possibleTypes","ModelAspect","DeliveryAspect","NamedAspect","AssociationsAspect","TextualAspect","ContactAspect","MetadataAspect","DkMetadataAspect","GeographicLocationAspect","TreeAspect","DeletionAspect","PlaybackResourceAspect","BinaryDataAspect","SocialMediaAspect","FooterAspect","BetaLayerAspect","UrlAspect","PersonRelatedContent","Content","rootReducer","combineReducers","apiMiddleware","dataOrParams","storage","engine","createEngine","storageMiddleware","composeEnhancers","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","createStoreWithMiddleware","applyMiddleware","thunk","createStore","store","load","cache","InMemoryCache","addTypename","createPersistedQueryLink","sha256","useGETForHashedQueries","createHttpLink","uri","client","ApolloClient","ssrForceFetchDelay","restore","__APOLLO_STATE__","Router","HelmetProvider"],"mappings":"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"}
\ No newline at end of file
diff --git a/sources-gen/dist/assets/plugin.b7c20a4b.js b/sources-gen/dist/assets/plugin.b7c20a4b.js
deleted file mode 100644
index 8a26a11..0000000
--- a/sources-gen/dist/assets/plugin.b7c20a4b.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import{Y as d}from"./vendor.5e871953.js";import{v as r}from"./video.es.046d6735.js";const c="2.2.0";var l=r.getComponent("Button"),u={forwardIndex:1,backIndex:1},k=r.registerPlugin||r.plugin,f=function(o,e){o.addClass("vjs-seek-buttons"),e.forward&&e.forward>0&&(o.controlBar.seekForward=o.controlBar.addChild("seekButton",{direction:"forward",seconds:e.forward},e.forwardIndex)),e.back&&e.back>0&&(o.controlBar.seekBack=o.controlBar.addChild("seekButton",{direction:"back",seconds:e.back},e.backIndex))},a=function(o){var e=this;this.ready(function(){f(e,r.mergeOptions(u,o))})};a.VERSION=c;var h=function(t){d(o,t);function o(i,n){var s;return s=t.call(this,i,n)||this,s.options_.direction==="forward"?s.controlText(s.localize("Seek forward {{seconds}} seconds").replace("{{seconds}}",s.options_.seconds)):s.options_.direction==="back"&&s.controlText(s.localize("Seek back {{seconds}} seconds").replace("{{seconds}}",s.options_.seconds)),s}var e=o.prototype;return e.buildCSSClass=function(){return"vjs-seek-button skip-"+this.options_.direction+" "+("skip-"+this.options_.seconds+" "+t.prototype.buildCSSClass.call(this))},e.handleClick=function(){var n=this.player_.currentTime();this.options_.direction==="forward"?this.player_.currentTime(n+this.options_.seconds):this.options_.direction==="back"&&this.player_.currentTime(n-this.options_.seconds)},o}(l);r.registerComponent("SeekButton",h);k("seekButtons",a);export{a as default};
-//# sourceMappingURL=plugin.b7c20a4b.js.map
diff --git a/sources-gen/dist/assets/plugin.b7c20a4b.js.map b/sources-gen/dist/assets/plugin.b7c20a4b.js.map
deleted file mode 100644
index d70719c..0000000
--- a/sources-gen/dist/assets/plugin.b7c20a4b.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"plugin.b7c20a4b.js","sources":["../../../node_modules/.pnpm/videojs-seek-buttons@2.2.0/node_modules/videojs-seek-buttons/es/plugin.js"],"sourcesContent":["import _inheritsLoose from \"@babel/runtime/helpers/inheritsLoose\";\nimport videojs from 'video.js';\nimport { version as VERSION } from '../package.json';\nvar Button = videojs.getComponent('Button'); // Default options for the plugin.\n\nvar defaults = {\n forwardIndex: 1,\n backIndex: 1\n}; // Cross-compatibility for Video.js 5 and 6.\n\nvar registerPlugin = videojs.registerPlugin || videojs.plugin; // const dom = videojs.dom || videojs;\n// document.sbInit = 0;\n// videojs.log('seek');\n// videojs.log(videojs === global.videojs);\n// videojs.log(videojs);\n// videojs.log(global.videojs);\n// videojs.log(document.body.querySelector('video'));\n\n/**\n * Function to invoke when the player is ready.\n *\n * This is a great place for your plugin to initialize itself. When this\n * function is called, the player will have its DOM and child components\n * in place.\n *\n * @function onPlayerReady\n * @param {Player} player\n * A Video.js player object.\n *\n * @param {Object} [options={}]\n * A plain object containing options for the plugin.\n */\n\nvar onPlayerReady = function onPlayerReady(player, options) {\n player.addClass('vjs-seek-buttons');\n\n if (options.forward && options.forward > 0) {\n player.controlBar.seekForward = player.controlBar.addChild('seekButton', {\n direction: 'forward',\n seconds: options.forward\n }, options.forwardIndex);\n }\n\n if (options.back && options.back > 0) {\n player.controlBar.seekBack = player.controlBar.addChild('seekButton', {\n direction: 'back',\n seconds: options.back\n }, options.backIndex);\n }\n};\n/**\n * A video.js plugin.\n *\n * In the plugin function, the value of `this` is a video.js `Player`\n * instance. You cannot rely on the player being in a \"ready\" state here,\n * depending on how the plugin is invoked. This may or may not be important\n * to you; if not, remove the wait for \"ready\"!\n *\n * @function seekButtons\n * @param {Object} [options={}]\n * An object of options left to the plugin author to define.\n */\n\n\nvar seekButtons = function seekButtons(options) {\n var _this = this;\n\n // document.sbInit++;\n this.ready(function () {\n onPlayerReady(_this, videojs.mergeOptions(defaults, options));\n });\n}; // Include the version number.\n\n\nseekButtons.VERSION = VERSION;\n/**\n * Button to seek forward/back\n *\n * @extends Button\n * @class SeekButton\n */\n\nvar SeekButton = /*#__PURE__*/function (_Button) {\n _inheritsLoose(SeekButton, _Button);\n\n /**\n * Constructor for class\n *\n * @param {Player|Object} player The player\n * @param {Object=} options Button options\n * @param {string} options.direction back or forward\n * @param {Int} options.seconds number of seconds to seek\n */\n function SeekButton(player, options) {\n var _this2;\n\n _this2 = _Button.call(this, player, options) || this;\n\n if (_this2.options_.direction === 'forward') {\n _this2.controlText(_this2.localize('Seek forward {{seconds}} seconds').replace('{{seconds}}', _this2.options_.seconds));\n } else if (_this2.options_.direction === 'back') {\n _this2.controlText(_this2.localize('Seek back {{seconds}} seconds').replace('{{seconds}}', _this2.options_.seconds));\n }\n\n return _this2;\n }\n /**\n * Return button class names which include the seek amount.\n *\n * @return {string} css cass string\n */\n\n\n var _proto = SeekButton.prototype;\n\n _proto.buildCSSClass = function buildCSSClass() {\n /* Each button will have the classes:\n `vjs-seek-button`\n `skip-forward` or `skip-back`\n `skip-n` where `n` is the number of seconds\n So you could have a generic icon for \"skip back\" and a more\n specific one for \"skip back 30 seconds\"\n */\n return \"vjs-seek-button skip-\" + this.options_.direction + \" \" + (\"skip-\" + this.options_.seconds + \" \" + _Button.prototype.buildCSSClass.call(this));\n }\n /**\n * Seek with the button's configured offset\n */\n ;\n\n _proto.handleClick = function handleClick() {\n var now = this.player_.currentTime();\n\n if (this.options_.direction === 'forward') {\n this.player_.currentTime(now + this.options_.seconds);\n } else if (this.options_.direction === 'back') {\n this.player_.currentTime(now - this.options_.seconds);\n }\n };\n\n return SeekButton;\n}(Button); // console.log('register component with', videojs.VERSION, videojs);\n\n\nvideojs.registerComponent('SeekButton', SeekButton); // Register the plugin with video.js.\n\nregisterPlugin('seekButtons', seekButtons);\nexport default seekButtons;"],"names":["Button","videojs","getComponent","defaults","forwardIndex","backIndex","registerPlugin","plugin","onPlayerReady","player","options","addClass","forward","controlBar","seekForward","addChild","direction","seconds","back","seekBack","seekButtons","_this","ready","mergeOptions","VERSION","SeekButton","_Button","_inheritsLoose","_this2","call","options_","controlText","localize","replace","_proto","prototype","buildCSSClass","handleClick","now","player_","currentTime","registerComponent"],"mappings":"oGAGA,GAAIA,GAASC,EAAQC,aAAa,UAE9BC,EAAW,CACbC,aAAc,EACdC,UAAW,GAGTC,EAAiBL,EAAQK,gBAAkBL,EAAQM,OAuBnDC,EAAgB,SAAuBC,EAAQC,EAAS,CAC1DD,EAAOE,SAAS,oBAEZD,EAAQE,SAAWF,EAAQE,QAAU,GACvCH,GAAOI,WAAWC,YAAcL,EAAOI,WAAWE,SAAS,aAAc,CACvEC,UAAW,UACXC,QAASP,EAAQE,SAChBF,EAAQN,eAGTM,EAAQQ,MAAQR,EAAQQ,KAAO,GACjCT,GAAOI,WAAWM,SAAWV,EAAOI,WAAWE,SAAS,aAAc,CACpEC,UAAW,OACXC,QAASP,EAAQQ,MAChBR,EAAQL,aAiBXe,EAAc,SAAqBV,EAAS,IAC1CW,GAAQ,UAGPC,MAAM,UAAY,CACrBd,EAAca,EAAOpB,EAAQsB,aAAapB,EAAUO,OAKxDU,EAAYI,QAAUA,EAQtB,GAAIC,GAA0B,SAAUC,EAAS,CAC/CC,EAAeF,EAAYC,cAUPjB,EAAQC,EAAS,IAC/BkB,GAEJA,SAASF,EAAQG,KAAK,KAAMpB,EAAQC,IAAY,KAE5CkB,EAAOE,SAASd,YAAc,UAChCY,EAAOG,YAAYH,EAAOI,SAAS,oCAAoCC,QAAQ,cAAeL,EAAOE,SAASb,UACrGW,EAAOE,SAASd,YAAc,QACvCY,EAAOG,YAAYH,EAAOI,SAAS,iCAAiCC,QAAQ,cAAeL,EAAOE,SAASb,UAGtGW,KASLM,GAAST,EAAWU,UAExBD,SAAOE,cAAgB,UAAyB,OAQvC,wBAA0B,KAAKN,SAASd,UAAY,IAAO,SAAU,KAAKc,SAASb,QAAU,IAAMS,EAAQS,UAAUC,cAAcP,KAAK,QAOjJK,EAAOG,YAAc,UAAuB,IACtCC,GAAM,KAAKC,QAAQC,cAEnB,KAAKV,SAASd,YAAc,eACzBuB,QAAQC,YAAYF,EAAM,KAAKR,SAASb,SACpC,KAAKa,SAASd,YAAc,aAChCuB,QAAQC,YAAYF,EAAM,KAAKR,SAASb,UAI1CQ,GACPzB,GAGFC,EAAQwC,kBAAkB,aAAchB,GAExCnB,EAAe,cAAec"}
\ No newline at end of file
diff --git a/sources-gen/dist/assets/vendor.5e871953.js b/sources-gen/dist/assets/vendor.5e871953.js
deleted file mode 100644
index 2d21c36..0000000
--- a/sources-gen/dist/assets/vendor.5e871953.js
+++ /dev/null
@@ -1,184 +0,0 @@
-var Jb=Object.defineProperty;var $d=Object.getOwnPropertySymbols;var Zb=Object.prototype.hasOwnProperty,ew=Object.prototype.propertyIsEnumerable;var zd=(e,t,r)=>t in e?Jb(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,Qd=(e,t)=>{for(var r in t||(t={}))Zb.call(t,r)&&zd(e,r,t[r]);if($d)for(var r of $d(t))ew.call(t,r)&&zd(e,r,t[r]);return e};var nr=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{};function rl(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Sa(e){if(e.__esModule)return e;var t=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(e).forEach(function(r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}),t}var nl={exports:{}},qt={},fe={exports:{}},Ie={};/*
-object-assign
-(c) Sindre Sorhus
-@license MIT
-*/var qd=Object.getOwnPropertySymbols,tw=Object.prototype.hasOwnProperty,rw=Object.prototype.propertyIsEnumerable;function nw(e){if(e==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function iw(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de",Object.getOwnPropertyNames(e)[0]==="5")return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;var n=Object.getOwnPropertyNames(t).map(function(o){return t[o]});if(n.join("")!=="0123456789")return!1;var i={};return"abcdefghijklmnopqrst".split("").forEach(function(o){i[o]=o}),Object.keys(Object.assign({},i)).join("")==="abcdefghijklmnopqrst"}catch(o){return!1}}var Hd=iw()?Object.assign:function(e,t){for(var r,n=nw(e),i,o=1;o=v},i=function(){},e.unstable_forceFrameRate=function(O){0>O||125>>1,z=O[N];if(z!==void 0&&0P(q,S))X!==void 0&&0>P(X,q)?(O[N]=X,O[U]=S,N=U):(O[N]=q,O[A]=S,N=A);else if(X!==void 0&&0>P(X,S))O[N]=X,O[U]=S,N=U;else break e}}return k}return null}function P(O,k){var S=O.sortIndex-k.sortIndex;return S!==0?S:O.id-k.id}var I=[],M=[],B=1,$=null,W=3,K=!1,G=!1,Y=!1;function L(O){for(var k=x(M);k!==null;){if(k.callback===null)T(M);else if(k.startTime<=O)T(M),k.sortIndex=k.expirationTime,_(I,k);else break;k=x(M)}}function F(O){if(Y=!1,L(O),!G)if(x(I)!==null)G=!0,t(j);else{var k=x(M);k!==null&&r(F,k.startTime-O)}}function j(O,k){G=!1,Y&&(Y=!1,n()),K=!0;var S=W;try{for(L(k),$=x(I);$!==null&&(!($.expirationTime>k)||O&&!e.unstable_shouldYield());){var N=$.callback;if(typeof N=="function"){$.callback=null,W=$.priorityLevel;var z=N($.expirationTime<=k);k=e.unstable_now(),typeof z=="function"?$.callback=z:$===x(I)&&T(I),L(k)}else T(I);$=x(I)}if($!==null)var A=!0;else{var q=x(M);q!==null&&r(F,q.startTime-k),A=!1}return A}finally{$=null,W=S,K=!1}}var E=i;e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(O){O.callback=null},e.unstable_continueExecution=function(){G||K||(G=!0,t(j))},e.unstable_getCurrentPriorityLevel=function(){return W},e.unstable_getFirstCallbackNode=function(){return x(I)},e.unstable_next=function(O){switch(W){case 1:case 2:case 3:var k=3;break;default:k=W}var S=W;W=k;try{return O()}finally{W=S}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=E,e.unstable_runWithPriority=function(O,k){switch(O){case 1:case 2:case 3:case 4:case 5:break;default:O=3}var S=W;W=O;try{return k()}finally{W=S}},e.unstable_scheduleCallback=function(O,k,S){var N=e.unstable_now();switch(typeof S=="object"&&S!==null?(S=S.delay,S=typeof S=="number"&&0N?(O.sortIndex=S,_(M,O),x(I)===null&&O===x(M)&&(Y?n():Y=!0,r(F,S-N))):(O.sortIndex=z,_(I,O),G||K||(G=!0,t(j))),O},e.unstable_wrapCallback=function(O){var k=W;return function(){var S=W;W=k;try{return O.apply(this,arguments)}finally{W=S}}}})(lh);uh.exports=lh;/** @license React v17.0.2
- * react-dom.production.min.js
- *
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */var _a=fe.exports,He=Hd,ut=uh.exports;function se(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;rt}return!1}function xt(e,t,r,n,i,o,a){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=n,this.attributeNamespace=i,this.mustUseProperty=r,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=a}var dt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){dt[e]=new xt(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];dt[t]=new xt(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){dt[e]=new xt(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){dt[e]=new xt(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){dt[e]=new xt(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){dt[e]=new xt(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){dt[e]=new xt(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){dt[e]=new xt(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){dt[e]=new xt(e,5,!1,e.toLowerCase(),null,!1,!1)});var cl=/[\-:]([a-z])/g;function fl(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(cl,fl);dt[t]=new xt(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(cl,fl);dt[t]=new xt(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(cl,fl);dt[t]=new xt(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){dt[e]=new xt(e,1,!1,e.toLowerCase(),null,!1,!1)});dt.xlinkHref=new xt("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){dt[e]=new xt(e,1,!1,e.toLowerCase(),null,!0,!0)});function pl(e,t,r,n){var i=dt.hasOwnProperty(t)?dt[t]:null,o=i!==null?i.type===0:n?!1:!(!(2s||i[a]!==o[s])return`
-`+i[a].replace(" at new "," at ");while(1<=a&&0<=s);break}}}finally{Sl=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?Gi(e):""}function hw(e){switch(e.tag){case 5:return Gi(e.type);case 16:return Gi("Lazy");case 13:return Gi("Suspense");case 19:return Gi("SuspenseList");case 0:case 2:case 15:return e=Aa(e.type,!1),e;case 11:return e=Aa(e.type.render,!1),e;case 22:return e=Aa(e.type._render,!1),e;case 1:return e=Aa(e.type,!0),e;default:return""}}function qn(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Lr:return"Fragment";case hn:return"Portal";case Hi:return"Profiler";case dl:return"StrictMode";case Wi:return"Suspense";case Ta:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case vl:return(e.displayName||"Context")+".Consumer";case hl:return(e._context.displayName||"Context")+".Provider";case ka:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(t!==""?"ForwardRef("+t+")":"ForwardRef");case Ca:return qn(e.type);case ml:return qn(e._render);case yl:t=e._payload,e=e._init;try{return qn(e(t))}catch(r){}}return null}function Mr(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function yh(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function vw(e){var t=yh(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),n=""+e[t];if(!e.hasOwnProperty(t)&&typeof r!="undefined"&&typeof r.get=="function"&&typeof r.set=="function"){var i=r.get,o=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(a){n=""+a,o.call(this,a)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return n},setValue:function(a){n=""+a},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Pa(e){e._valueTracker||(e._valueTracker=vw(e))}function mh(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),n="";return e&&(n=yh(e)?e.checked?"true":"false":e.value),e=n,e!==r?(t.setValue(e),!0):!1}function Da(e){if(e=e||(typeof document!="undefined"?document:void 0),typeof e=="undefined")return null;try{return e.activeElement||e.body}catch(t){return e.body}}function Ol(e,t){var r=t.checked;return He({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r!=null?r:e._wrapperState.initialChecked})}function gh(e,t){var r=t.defaultValue==null?"":t.defaultValue,n=t.checked!=null?t.checked:t.defaultChecked;r=Mr(t.value!=null?t.value:r),e._wrapperState={initialChecked:n,initialValue:r,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function bh(e,t){t=t.checked,t!=null&&pl(e,"checked",t,!1)}function xl(e,t){bh(e,t);var r=Mr(t.value),n=t.type;if(r!=null)n==="number"?(r===0&&e.value===""||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if(n==="submit"||n==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?_l(e,t.type,r):t.hasOwnProperty("defaultValue")&&_l(e,t.type,Mr(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function wh(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var n=t.type;if(!(n!=="submit"&&n!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,r!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,r!==""&&(e.name=r)}function _l(e,t,r){(t!=="number"||Da(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}function yw(e){var t="";return _a.Children.forEach(e,function(r){r!=null&&(t+=r)}),t}function kl(e,t){return e=He({children:void 0},t),(t=yw(t.children))&&(e.children=t),e}function Hn(e,t,r,n){if(e=e.options,t){t={};for(var i=0;i=r.length))throw Error(se(93));r=r[0]}t=r}t==null&&(t=""),r=t}e._wrapperState={initialValue:Mr(r)}}function Sh(e,t){var r=Mr(t.value),n=Mr(t.defaultValue);r!=null&&(r=""+r,r!==e.value&&(e.value=r),t.defaultValue==null&&e.defaultValue!==r&&(e.defaultValue=r)),n!=null&&(e.defaultValue=""+n)}function Oh(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}var Cl={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};function xh(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Al(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?xh(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var Ra,_h=function(e){return typeof MSApp!="undefined"&&MSApp.execUnsafeLocalFunction?function(t,r,n,i){MSApp.execUnsafeLocalFunction(function(){return e(t,r,n,i)})}:e}(function(e,t){if(e.namespaceURI!==Cl.svg||"innerHTML"in e)e.innerHTML=t;else{for(Ra=Ra||document.createElement("div"),Ra.innerHTML=""+t.valueOf().toString()+" ",t=Ra.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Yi(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeType===3){r.nodeValue=t;return}}e.textContent=t}var Xi={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},mw=["Webkit","ms","Moz","O"];Object.keys(Xi).forEach(function(e){mw.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Xi[t]=Xi[e]})});function kh(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typeof t!="number"||t===0||Xi.hasOwnProperty(e)&&Xi[e]?(""+t).trim():t+"px"}function Th(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var n=r.indexOf("--")===0,i=kh(r,t[r],n);r==="float"&&(r="cssFloat"),n?e.setProperty(r,i):e[r]=i}}var gw=He({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Pl(e,t){if(t){if(gw[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(se(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(se(60));if(!(typeof t.dangerouslySetInnerHTML=="object"&&"__html"in t.dangerouslySetInnerHTML))throw Error(se(61))}if(t.style!=null&&typeof t.style!="object")throw Error(se(62))}}function Dl(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function Rl(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Il=null,Wn=null,Kn=null;function Ch(e){if(e=mo(e)){if(typeof Il!="function")throw Error(se(280));var t=e.stateNode;t&&(t=Ya(t),Il(e.stateNode,e.type,t))}}function Ah(e){Wn?Kn?Kn.push(e):Kn=[e]:Wn=e}function Ph(){if(Wn){var e=Wn,t=Kn;if(Kn=Wn=null,Ch(e),t)for(e=0;en?0:1<r;r++)t.push(e);return t}function Va(e,t,r){e.pendingLanes|=t;var n=t-1;e.suspendedLanes&=n,e.pingedLanes&=n,e=e.eventTimes,t=31-Ur(t),e[t]=r}var Ur=Math.clz32?Math.clz32:Nw,Rw=Math.log,Iw=Math.LN2;function Nw(e){return e===0?32:31-(Rw(e)/Iw|0)|0}var Lw=ut.unstable_UserBlockingPriority,Mw=ut.unstable_runWithPriority,Ua=!0;function jw(e,t,r,n){vn||Ll();var i=Wl,o=vn;vn=!0;try{Dh(i,e,t,r,n)}finally{(vn=o)||jl()}}function Fw(e,t,r,n){Mw(Lw,Wl.bind(null,e,t,r,n))}function Wl(e,t,r,n){if(Ua){var i;if((i=(t&4)==0)&&0=lo),nv=String.fromCharCode(32),iv=!1;function ov(e,t){switch(e){case"keyup":return sE.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function av(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Zn=!1;function lE(e,t){switch(e){case"compositionend":return av(t);case"keypress":return t.which!==32?null:(iv=!0,nv);case"textInput":return e=t.data,e===nv&&iv?null:e;default:return null}}function cE(e,t){if(Zn)return e==="compositionend"||!tc&&ov(e,t)?(e=Xh(),Ba=Gl=Br=null,Zn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=dv(r)}}function vv(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?vv(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function yv(){for(var e=window,t=Da();t instanceof e.HTMLIFrameElement;){try{var r=typeof t.contentWindow.location.href=="string"}catch(n){r=!1}if(r)e=t.contentWindow;else break;t=Da(e.document)}return t}function ic(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var wE=kr&&"documentMode"in document&&11>=document.documentMode,ei=null,oc=null,ho=null,ac=!1;function mv(e,t,r){var n=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;ac||ei==null||ei!==Da(n)||(n=ei,"selectionStart"in n&&ic(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}),ho&&po(ho,n)||(ho=n,n=Ha(oc,"onSelect"),0oi||(e.current=dc[oi],dc[oi]=null,oi--)}function Ye(e,t){oi++,dc[oi]=e.current,e.current=t}var Qr={},bt=zr(Qr),At=zr(!1),gn=Qr;function ai(e,t){var r=e.type.contextTypes;if(!r)return Qr;var n=e.stateNode;if(n&&n.__reactInternalMemoizedUnmaskedChildContext===t)return n.__reactInternalMemoizedMaskedChildContext;var i={},o;for(o in r)i[o]=t[o];return n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function Pt(e){return e=e.childContextTypes,e!=null}function Xa(){$e(At),$e(bt)}function Iv(e,t,r){if(bt.current!==Qr)throw Error(se(168));Ye(bt,t),Ye(At,r)}function Nv(e,t,r){var n=e.stateNode;if(e=t.childContextTypes,typeof n.getChildContext!="function")return r;n=n.getChildContext();for(var i in n)if(!(i in e))throw Error(se(108,qn(t)||"Unknown",i));return He({},r,n)}function Ja(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Qr,gn=bt.current,Ye(bt,e),Ye(At,At.current),!0}function Lv(e,t,r){var n=e.stateNode;if(!n)throw Error(se(169));r?(e=Nv(e,t,gn),n.__reactInternalMemoizedMergedChildContext=e,$e(At),$e(bt),Ye(bt,e)):$e(At),Ye(At,r)}var hc=null,bn=null,OE=ut.unstable_runWithPriority,vc=ut.unstable_scheduleCallback,yc=ut.unstable_cancelCallback,xE=ut.unstable_shouldYield,Mv=ut.unstable_requestPaint,mc=ut.unstable_now,_E=ut.unstable_getCurrentPriorityLevel,Za=ut.unstable_ImmediatePriority,jv=ut.unstable_UserBlockingPriority,Fv=ut.unstable_NormalPriority,Vv=ut.unstable_LowPriority,Uv=ut.unstable_IdlePriority,gc={},kE=Mv!==void 0?Mv:function(){},Tr=null,es=null,bc=!1,Bv=mc(),wt=1e4>Bv?mc:function(){return mc()-Bv};function si(){switch(_E()){case Za:return 99;case jv:return 98;case Fv:return 97;case Vv:return 96;case Uv:return 95;default:throw Error(se(332))}}function $v(e){switch(e){case 99:return Za;case 98:return jv;case 97:return Fv;case 96:return Vv;case 95:return Uv;default:throw Error(se(332))}}function wn(e,t){return e=$v(e),OE(e,t)}function go(e,t,r){return e=$v(e),vc(e,t,r)}function vr(){if(es!==null){var e=es;es=null,yc(e)}zv()}function zv(){if(!bc&&Tr!==null){bc=!0;var e=0;try{var t=Tr;wn(99,function(){for(;eT?(P=x,x=null):P=x.sibling;var I=c(p,x,v[T],g);if(I===null){x===null&&(x=P);break}e&&x&&I.alternate===null&&t(p,x),d=o(I,d,T),_===null?w=I:_.sibling=I,_=I,x=P}if(T===v.length)return r(p,x),w;if(x===null){for(;TT?(P=x,x=null):P=x.sibling;var M=c(p,x,I.value,g);if(M===null){x===null&&(x=P);break}e&&x&&M.alternate===null&&t(p,x),d=o(M,d,T),_===null?w=M:_.sibling=M,_=M,x=P}if(I.done)return r(p,x),w;if(x===null){for(;!I.done;T++,I=v.next())I=b(p,I.value,g),I!==null&&(d=o(I,d,T),_===null?w=I:_.sibling=I,_=I);return w}for(x=n(p,x);!I.done;T++,I=v.next())I=m(x,p,T,I.value,g),I!==null&&(e&&I.alternate!==null&&x.delete(I.key===null?T:I.key),d=o(I,d,T),_===null?w=I:_.sibling=I,_=I);return e&&x.forEach(function(B){return t(p,B)}),w}return function(p,d,v,g){var w=typeof v=="object"&&v!==null&&v.type===Lr&&v.key===null;w&&(v=v.props.children);var _=typeof v=="object"&&v!==null;if(_)switch(v.$$typeof){case qi:e:{for(_=v.key,w=d;w!==null;){if(w.key===_){switch(w.tag){case 7:if(v.type===Lr){r(p,w.sibling),d=i(w,v.props.children),d.return=p,p=d;break e}break;default:if(w.elementType===v.type){r(p,w.sibling),d=i(w,v.props),d.ref=wo(p,w,v),d.return=p,p=d;break e}}r(p,w);break}else t(p,w);w=w.sibling}v.type===Lr?(d=mi(v.props.children,p.mode,g,v.key),d.return=p,p=d):(g=_s(v.type,v.key,v.props,null,p.mode,g),g.ref=wo(p,d,v),g.return=p,p=g)}return a(p);case hn:e:{for(w=v.key;d!==null;){if(d.key===w)if(d.tag===4&&d.stateNode.containerInfo===v.containerInfo&&d.stateNode.implementation===v.implementation){r(p,d.sibling),d=i(d,v.children||[]),d.return=p,p=d;break e}else{r(p,d);break}else t(p,d);d=d.sibling}d=sf(v,p.mode,g),d.return=p,p=d}return a(p)}if(typeof v=="string"||typeof v=="number")return v=""+v,d!==null&&d.tag===6?(r(p,d.sibling),d=i(d,v),d.return=p,p=d):(r(p,d),d=af(v,p.mode,g),d.return=p,p=d),a(p);if(as(v))return u(p,d,v,g);if(Ki(v))return h(p,d,v,g);if(_&&ss(p,v),typeof v=="undefined"&&!w)switch(p.tag){case 1:case 22:case 0:case 11:case 15:throw Error(se(152,qn(p.type)||"Component"))}return r(p,d)}}var us=Jv(!0),Zv=Jv(!1),Eo={},yr=zr(Eo),So=zr(Eo),Oo=zr(Eo);function En(e){if(e===Eo)throw Error(se(174));return e}function xc(e,t){switch(Ye(Oo,t),Ye(So,e),Ye(yr,Eo),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Al(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Al(t,e)}$e(yr),Ye(yr,t)}function ci(){$e(yr),$e(So),$e(Oo)}function ey(e){En(Oo.current);var t=En(yr.current),r=Al(t,e.type);t!==r&&(Ye(So,e),Ye(yr,r))}function _c(e){So.current===e&&($e(yr),$e(So))}var Xe=zr(0);function ls(e){for(var t=e;t!==null;){if(t.tag===13){var r=t.memoizedState;if(r!==null&&(r=r.dehydrated,r===null||r.data==="$?"||r.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&64)!=0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Cr=null,Kr=null,mr=!1;function ty(e,t){var r=Yt(5,null,null,0);r.elementType="DELETED",r.type="DELETED",r.stateNode=t,r.return=e,r.flags=8,e.lastEffect!==null?(e.lastEffect.nextEffect=r,e.lastEffect=r):e.firstEffect=e.lastEffect=r}function ry(e,t){switch(e.tag){case 5:var r=e.type;return t=t.nodeType!==1||r.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,!0):!1;case 13:return!1;default:return!1}}function kc(e){if(mr){var t=Kr;if(t){var r=t;if(!ry(e,t)){if(t=ri(r.nextSibling),!t||!ry(e,t)){e.flags=e.flags&-1025|2,mr=!1,Cr=e;return}ty(Cr,r)}Cr=e,Kr=ri(t.firstChild)}else e.flags=e.flags&-1025|2,mr=!1,Cr=e}}function ny(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;Cr=e}function cs(e){if(e!==Cr)return!1;if(!mr)return ny(e),mr=!0,!1;var t=e.type;if(e.tag!==5||t!=="head"&&t!=="body"&&!cc(t,e.memoizedProps))for(t=Kr;t;)ty(e,t),t=ri(t.nextSibling);if(ny(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(se(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var r=e.data;if(r==="/$"){if(t===0){Kr=ri(e.nextSibling);break e}t--}else r!=="$"&&r!=="$!"&&r!=="$?"||t++}e=e.nextSibling}Kr=null}}else Kr=Cr?ri(e.stateNode.nextSibling):null;return!0}function Tc(){Kr=Cr=null,mr=!1}var fi=[];function Cc(){for(var e=0;eo))throw Error(se(301));o+=1,ht=Et=null,t.updateQueue=null,xo.current=DE,e=r(n,i)}while(ko)}if(xo.current=vs,t=Et!==null&&Et.next!==null,_o=0,ht=Et=tt=null,fs=!1,t)throw Error(se(300));return e}function Sn(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return ht===null?tt.memoizedState=ht=e:ht=ht.next=e,ht}function On(){if(Et===null){var e=tt.alternate;e=e!==null?e.memoizedState:null}else e=Et.next;var t=ht===null?tt.memoizedState:ht.next;if(t!==null)ht=t,Et=e;else{if(e===null)throw Error(se(310));Et=e,e={memoizedState:Et.memoizedState,baseState:Et.baseState,baseQueue:Et.baseQueue,queue:Et.queue,next:null},ht===null?tt.memoizedState=ht=e:ht=ht.next=e}return ht}function gr(e,t){return typeof t=="function"?t(e):t}function To(e){var t=On(),r=t.queue;if(r===null)throw Error(se(311));r.lastRenderedReducer=e;var n=Et,i=n.baseQueue,o=r.pending;if(o!==null){if(i!==null){var a=i.next;i.next=o.next,o.next=a}n.baseQueue=i=o,r.pending=null}if(i!==null){i=i.next,n=n.baseState;var s=a=o=null,l=i;do{var f=l.lane;if((_o&f)===f)s!==null&&(s=s.next={lane:0,action:l.action,eagerReducer:l.eagerReducer,eagerState:l.eagerState,next:null}),n=l.eagerReducer===e?l.eagerState:e(n,l.action);else{var y={lane:f,action:l.action,eagerReducer:l.eagerReducer,eagerState:l.eagerState,next:null};s===null?(a=s=y,o=n):s=s.next=y,tt.lanes|=f,Do|=f}l=l.next}while(l!==null&&l!==i);s===null?o=n:s.next=a,Ht(n,t.memoizedState)||(ar=!0),t.memoizedState=n,t.baseState=o,t.baseQueue=s,r.lastRenderedState=n}return[t.memoizedState,r.dispatch]}function Co(e){var t=On(),r=t.queue;if(r===null)throw Error(se(311));r.lastRenderedReducer=e;var n=r.dispatch,i=r.pending,o=t.memoizedState;if(i!==null){r.pending=null;var a=i=i.next;do o=e(o,a.action),a=a.next;while(a!==i);Ht(o,t.memoizedState)||(ar=!0),t.memoizedState=o,t.baseQueue===null&&(t.baseState=o),r.lastRenderedState=o}return[o,n]}function iy(e,t,r){var n=t._getVersion;n=n(t._source);var i=t._workInProgressVersionPrimary;if(i!==null?e=i===n:(e=e.mutableReadLanes,(e=(_o&e)===e)&&(t._workInProgressVersionPrimary=n,fi.push(t))),e)return r(t._source);throw fi.push(t),Error(se(350))}function oy(e,t,r,n){var i=_t;if(i===null)throw Error(se(349));var o=t._getVersion,a=o(t._source),s=xo.current,l=s.useState(function(){return iy(i,t,r)}),f=l[1],y=l[0];l=ht;var b=e.memoizedState,c=b.refs,m=c.getSnapshot,u=b.source;b=b.subscribe;var h=tt;return e.memoizedState={refs:c,source:t,subscribe:n},s.useEffect(function(){c.getSnapshot=r,c.setSnapshot=f;var p=o(t._source);if(!Ht(a,p)){p=r(t._source),Ht(y,p)||(f(p),p=Yr(h),i.mutableReadLanes|=p&i.pendingLanes),p=i.mutableReadLanes,i.entangledLanes|=p;for(var d=i.entanglements,v=p;0r?98:r,function(){e(!0)}),wn(97<\/script>",e=e.removeChild(e.firstChild)):typeof n.is=="string"?e=a.createElement(r,{is:n.is}):(e=a.createElement(r),r==="select"&&(a=e,n.multiple?a.multiple=!0:n.size&&(a.size=n.size))):e=a.createElementNS(e,r),e[$r]=t,e[Ga]=n,ky(e,t,!1,!1),t.stateNode=e,a=Dl(r,n),r){case"dialog":Be("cancel",e),Be("close",e),i=n;break;case"iframe":case"object":case"embed":Be("load",e),i=n;break;case"video":case"audio":for(i=0;iYc&&(t.flags|=64,o=!0,Po(n,!1),t.lanes=33554432)}else{if(!o)if(e=ls(a),e!==null){if(t.flags|=64,o=!0,r=e.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),Po(n,!0),n.tail===null&&n.tailMode==="hidden"&&!a.alternate&&!mr)return t=t.lastEffect=n.lastEffect,t!==null&&(t.nextEffect=null),null}else 2*wt()-n.renderingStartTime>Yc&&r!==1073741824&&(t.flags|=64,o=!0,Po(n,!1),t.lanes=33554432);n.isBackwards?(a.sibling=t.child,t.child=a):(r=n.last,r!==null?r.sibling=a:t.child=a,n.last=a)}return n.tail!==null?(r=n.tail,n.rendering=r,n.tail=r.sibling,n.lastEffect=t.lastEffect,n.renderingStartTime=wt(),r.sibling=null,t=Xe.current,Ye(Xe,o?t&1|2:t&1),r):null;case 23:case 24:return rf(),e!==null&&e.memoizedState!==null!=(t.memoizedState!==null)&&n.mode!=="unstable-defer-without-hiding"&&(t.flags|=4),null}throw Error(se(156,t.tag))}function NE(e){switch(e.tag){case 1:Pt(e.type)&&Xa();var t=e.flags;return t&4096?(e.flags=t&-4097|64,e):null;case 3:if(ci(),$e(At),$e(bt),Cc(),t=e.flags,(t&64)!=0)throw Error(se(285));return e.flags=t&-4097|64,e;case 5:return _c(e),null;case 13:return $e(Xe),t=e.flags,t&4096?(e.flags=t&-4097|64,e):null;case 19:return $e(Xe),null;case 4:return ci(),null;case 10:return Ec(e),null;case 23:case 24:return rf(),null;default:return null}}function Uc(e,t){try{var r="",n=t;do r+=hw(n),n=n.return;while(n);var i=r}catch(o){i=`
-Error generating stack: `+o.message+`
-`+o.stack}return{value:e,source:t,stack:i}}function Bc(e,t){try{console.error(t.value)}catch(r){setTimeout(function(){throw r})}}var LE=typeof WeakMap=="function"?WeakMap:Map;function Ay(e,t,r){r=Hr(-1,r),r.tag=3,r.payload={element:null};var n=t.value;return r.callback=function(){bs||(bs=!0,Xc=n),Bc(e,t)},r}function Py(e,t,r){r=Hr(-1,r),r.tag=3;var n=e.type.getDerivedStateFromError;if(typeof n=="function"){var i=t.value;r.payload=function(){return Bc(e,t),n(i)}}var o=e.stateNode;return o!==null&&typeof o.componentDidCatch=="function"&&(r.callback=function(){typeof n!="function"&&(br===null?br=new Set([this]):br.add(this),Bc(e,t));var a=t.stack;this.componentDidCatch(t.value,{componentStack:a!==null?a:""})}),r}var ME=typeof WeakSet=="function"?WeakSet:Set;function Dy(e){var t=e.ref;if(t!==null)if(typeof t=="function")try{t(null)}catch(r){Zr(e,r)}else t.current=null}function jE(e,t){switch(t.tag){case 0:case 11:case 15:case 22:return;case 1:if(t.flags&256&&e!==null){var r=e.memoizedProps,n=e.memoizedState;e=t.stateNode,t=e.getSnapshotBeforeUpdate(t.elementType===t.type?r:or(t.type,r),n),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:t.flags&256&&fc(t.stateNode.containerInfo);return;case 5:case 6:case 4:case 17:return}throw Error(se(163))}function FE(e,t,r){switch(r.tag){case 0:case 11:case 15:case 22:if(t=r.updateQueue,t=t!==null?t.lastEffect:null,t!==null){e=t=t.next;do{if((e.tag&3)==3){var n=e.create;e.destroy=n()}e=e.next}while(e!==t)}if(t=r.updateQueue,t=t!==null?t.lastEffect:null,t!==null){e=t=t.next;do{var i=e;n=i.next,i=i.tag,(i&4)!=0&&(i&1)!=0&&(Hy(r,e),HE(r,e)),e=n}while(e!==t)}return;case 1:e=r.stateNode,r.flags&4&&(t===null?e.componentDidMount():(n=r.elementType===r.type?t.memoizedProps:or(r.type,t.memoizedProps),e.componentDidUpdate(n,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),t=r.updateQueue,t!==null&&Wv(r,t,e);return;case 3:if(t=r.updateQueue,t!==null){if(e=null,r.child!==null)switch(r.child.tag){case 5:e=r.child.stateNode;break;case 1:e=r.child.stateNode}Wv(r,t,e)}return;case 5:e=r.stateNode,t===null&&r.flags&4&&Cv(r.type,r.memoizedProps)&&e.focus();return;case 6:return;case 4:return;case 12:return;case 13:r.memoizedState===null&&(r=r.alternate,r!==null&&(r=r.memoizedState,r!==null&&(r=r.dehydrated,r!==null&&zh(r))));return;case 19:case 17:case 20:case 21:case 23:case 24:return}throw Error(se(163))}function Ry(e,t){for(var r=e;;){if(r.tag===5){var n=r.stateNode;if(t)n=n.style,typeof n.setProperty=="function"?n.setProperty("display","none","important"):n.display="none";else{n=r.stateNode;var i=r.memoizedProps.style;i=i!=null&&i.hasOwnProperty("display")?i.display:null,n.style.display=kh("display",i)}}else if(r.tag===6)r.stateNode.nodeValue=t?"":r.memoizedProps;else if((r.tag!==23&&r.tag!==24||r.memoizedState===null||r===e)&&r.child!==null){r.child.return=r,r=r.child;continue}if(r===e)break;for(;r.sibling===null;){if(r.return===null||r.return===e)return;r=r.return}r.sibling.return=r.return,r=r.sibling}}function Iy(e,t){if(bn&&typeof bn.onCommitFiberUnmount=="function")try{bn.onCommitFiberUnmount(hc,t)}catch(o){}switch(t.tag){case 0:case 11:case 14:case 15:case 22:if(e=t.updateQueue,e!==null&&(e=e.lastEffect,e!==null)){var r=e=e.next;do{var n=r,i=n.destroy;if(n=n.tag,i!==void 0)if((n&4)!=0)Hy(t,r);else{n=t;try{i()}catch(o){Zr(n,o)}}r=r.next}while(r!==e)}break;case 1:if(Dy(t),e=t.stateNode,typeof e.componentWillUnmount=="function")try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(o){Zr(t,o)}break;case 5:Dy(t);break;case 4:jy(e,t)}}function Ny(e){e.alternate=null,e.child=null,e.dependencies=null,e.firstEffect=null,e.lastEffect=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.return=null,e.updateQueue=null}function Ly(e){return e.tag===5||e.tag===3||e.tag===4}function My(e){e:{for(var t=e.return;t!==null;){if(Ly(t))break e;t=t.return}throw Error(se(160))}var r=t;switch(t=r.stateNode,r.tag){case 5:var n=!1;break;case 3:t=t.containerInfo,n=!0;break;case 4:t=t.containerInfo,n=!0;break;default:throw Error(se(161))}r.flags&16&&(Yi(t,""),r.flags&=-17);e:t:for(r=e;;){for(;r.sibling===null;){if(r.return===null||Ly(r.return)){r=null;break e}r=r.return}for(r.sibling.return=r.return,r=r.sibling;r.tag!==5&&r.tag!==6&&r.tag!==18;){if(r.flags&2||r.child===null||r.tag===4)continue t;r.child.return=r,r=r.child}if(!(r.flags&2)){r=r.stateNode;break e}}n?$c(e,r,t):zc(e,r,t)}function $c(e,t,r){var n=e.tag,i=n===5||n===6;if(i)e=i?e.stateNode:e.stateNode.instance,t?r.nodeType===8?r.parentNode.insertBefore(e,t):r.insertBefore(e,t):(r.nodeType===8?(t=r.parentNode,t.insertBefore(e,r)):(t=r,t.appendChild(e)),r=r._reactRootContainer,r!=null||t.onclick!==null||(t.onclick=Wa));else if(n!==4&&(e=e.child,e!==null))for($c(e,t,r),e=e.sibling;e!==null;)$c(e,t,r),e=e.sibling}function zc(e,t,r){var n=e.tag,i=n===5||n===6;if(i)e=i?e.stateNode:e.stateNode.instance,t?r.insertBefore(e,t):r.appendChild(e);else if(n!==4&&(e=e.child,e!==null))for(zc(e,t,r),e=e.sibling;e!==null;)zc(e,t,r),e=e.sibling}function jy(e,t){for(var r=t,n=!1,i,o;;){if(!n){n=r.return;e:for(;;){if(n===null)throw Error(se(160));switch(i=n.stateNode,n.tag){case 5:o=!1;break e;case 3:i=i.containerInfo,o=!0;break e;case 4:i=i.containerInfo,o=!0;break e}n=n.return}n=!0}if(r.tag===5||r.tag===6){e:for(var a=e,s=r,l=s;;)if(Iy(a,l),l.child!==null&&l.tag!==4)l.child.return=l,l=l.child;else{if(l===s)break e;for(;l.sibling===null;){if(l.return===null||l.return===s)break e;l=l.return}l.sibling.return=l.return,l=l.sibling}o?(a=i,s=r.stateNode,a.nodeType===8?a.parentNode.removeChild(s):a.removeChild(s)):i.removeChild(r.stateNode)}else if(r.tag===4){if(r.child!==null){i=r.stateNode.containerInfo,o=!0,r.child.return=r,r=r.child;continue}}else if(Iy(e,r),r.child!==null){r.child.return=r,r=r.child;continue}if(r===t)break;for(;r.sibling===null;){if(r.return===null||r.return===t)return;r=r.return,r.tag===4&&(n=!1)}r.sibling.return=r.return,r=r.sibling}}function Qc(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var n=r=r.next;do(n.tag&3)==3&&(e=n.destroy,n.destroy=void 0,e!==void 0&&e()),n=n.next;while(n!==r)}return;case 1:return;case 5:if(r=t.stateNode,r!=null){n=t.memoizedProps;var i=e!==null?e.memoizedProps:n;e=t.type;var o=t.updateQueue;if(t.updateQueue=null,o!==null){for(r[Ga]=n,e==="input"&&n.type==="radio"&&n.name!=null&&bh(r,n),Dl(e,i),t=Dl(e,n),i=0;ii&&(i=a),r&=~o}if(r=i,r=wt()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*UE(r/1960))-r,10 component higher in the tree to provide a loading indicator or placeholder to display.`)}vt!==5&&(vt=2),l=Uc(l,s),c=a;do{switch(c.tag){case 3:o=l,c.flags|=4096,t&=-t,c.lanes|=t;var _=Ay(c,o,t);Hv(c,_);break e;case 1:o=l;var x=c.type,T=c.stateNode;if((c.flags&64)==0&&(typeof x.getDerivedStateFromError=="function"||T!==null&&typeof T.componentDidCatch=="function"&&(br===null||!br.has(T)))){c.flags|=4096,t&=-t,c.lanes|=t;var P=Py(c,o,t);Hv(c,P);break e}}c=c.return}while(c!==null)}qy(r)}catch(I){t=I,at===r&&r!==null&&(at=r=r.return);continue}break}while(1)}function zy(){var e=ms.current;return ms.current=vs,e===null?vs:e}function Mo(e,t){var r=Oe;Oe|=16;var n=zy();_t===e&&St===t||yi(e,t);do try{$E();break}catch(i){$y(e,i)}while(1);if(wc(),Oe=r,ms.current=n,at!==null)throw Error(se(261));return _t=null,St=0,vt}function $E(){for(;at!==null;)Qy(at)}function zE(){for(;at!==null&&!xE();)Qy(at)}function Qy(e){var t=Ky(e.alternate,e,xn);e.memoizedProps=e.pendingProps,t===null?qy(e):at=t,qc.current=null}function qy(e){var t=e;do{var r=t.alternate;if(e=t.return,(t.flags&2048)==0){if(r=IE(r,t,xn),r!==null){at=r;return}if(r=t,r.tag!==24&&r.tag!==23||r.memoizedState===null||(xn&1073741824)!=0||(r.mode&4)==0){for(var n=0,i=r.child;i!==null;)n|=i.lanes|i.childLanes,i=i.sibling;r.childLanes=n}e!==null&&(e.flags&2048)==0&&(e.firstEffect===null&&(e.firstEffect=t.firstEffect),t.lastEffect!==null&&(e.lastEffect!==null&&(e.lastEffect.nextEffect=t.firstEffect),e.lastEffect=t.lastEffect),1a&&(s=a,a=_,_=s),s=hv(v,_),o=hv(v,a),s&&o&&(w.rangeCount!==1||w.anchorNode!==s.node||w.anchorOffset!==s.offset||w.focusNode!==o.node||w.focusOffset!==o.offset)&&(g=g.createRange(),g.setStart(s.node,s.offset),w.removeAllRanges(),_>a?(w.addRange(g),w.extend(o.node,o.offset)):(g.setEnd(o.node,o.offset),w.addRange(g)))))),g=[],w=v;w=w.parentNode;)w.nodeType===1&&g.push({element:w,left:w.scrollLeft,top:w.scrollTop});for(typeof v.focus=="function"&&v.focus(),v=0;vwt()-Gc?yi(e,0):Wc|=r),Gt(e,t)}function GE(e,t){var r=e.stateNode;r!==null&&r.delete(t),t=0,t===0&&(t=e.mode,(t&2)==0?t=1:(t&4)==0?t=si()===99?1:2:(Dr===0&&(Dr=pi),t=Xn(62914560&~Dr),t===0&&(t=4194304))),r=Ft(),e=Os(e,t),e!==null&&(Va(e,t,r),Gt(e,r))}var Ky;Ky=function(e,t,r){var n=t.lanes;if(e!==null)if(e.memoizedProps!==t.pendingProps||At.current)ar=!0;else if((r&n)!=0)ar=(e.flags&16384)!=0;else{switch(ar=!1,t.tag){case 3:by(t),Tc();break;case 5:ey(t);break;case 1:Pt(t.type)&&Ja(t);break;case 4:xc(t,t.stateNode.containerInfo);break;case 10:n=t.memoizedProps.value;var i=t.type._context;Ye(ts,i._currentValue),i._currentValue=n;break;case 13:if(t.memoizedState!==null)return(r&t.child.childLanes)!=0?wy(e,t,r):(Ye(Xe,Xe.current&1),t=Ar(e,t,r),t!==null?t.sibling:null);Ye(Xe,Xe.current&1);break;case 19:if(n=(r&t.childLanes)!=0,(e.flags&64)!=0){if(n)return _y(e,t,r);t.flags|=64}if(i=t.memoizedState,i!==null&&(i.rendering=null,i.tail=null,i.lastEffect=null),Ye(Xe,Xe.current),n)break;return null;case 23:case 24:return t.lanes=0,Lc(e,t,r)}return Ar(e,t,r)}else ar=!1;switch(t.lanes=0,t.tag){case 2:if(n=t.type,e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,i=ai(t,bt.current),li(t,r),i=Pc(null,t,n,e,i,r),t.flags|=1,typeof i=="object"&&i!==null&&typeof i.render=="function"&&i.$$typeof===void 0){if(t.tag=1,t.memoizedState=null,t.updateQueue=null,Pt(n)){var o=!0;Ja(t)}else o=!1;t.memoizedState=i.state!==null&&i.state!==void 0?i.state:null,Sc(t);var a=n.getDerivedStateFromProps;typeof a=="function"&&is(t,n,a,e),i.updater=os,t.stateNode=i,i._reactInternals=t,Oc(t,n,e,r),t=jc(null,t,n,!0,o,r)}else t.tag=0,Rt(null,t,i,r),t=t.child;return t;case 16:i=t.elementType;e:{switch(e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,o=i._init,i=o(i._payload),t.type=i,o=t.tag=XE(i),e=or(i,e),o){case 0:t=Mc(null,t,i,e,r);break e;case 1:t=gy(null,t,i,e,r);break e;case 11:t=hy(null,t,i,e,r);break e;case 14:t=vy(null,t,i,or(i.type,e),n,r);break e}throw Error(se(306,i,""))}return t;case 0:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:or(n,i),Mc(e,t,n,i,r);case 1:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:or(n,i),gy(e,t,n,i,r);case 3:if(by(t),n=t.updateQueue,e===null||n===null)throw Error(se(282));if(n=t.pendingProps,i=t.memoizedState,i=i!==null?i.element:null,qv(e,t),bo(t,n,null,r),n=t.memoizedState.element,n===i)Tc(),t=Ar(e,t,r);else{if(i=t.stateNode,(o=i.hydrate)&&(Kr=ri(t.stateNode.containerInfo.firstChild),Cr=t,o=mr=!0),o){if(e=i.mutableSourceEagerHydrationData,e!=null)for(i=0;i=0;y--){var b=n[y];b==="."?pf(n,y):b===".."?(pf(n,y),f++):f&&(pf(n,y),f--)}if(!a)for(;f--;f)n.unshift("..");a&&n[0]!==""&&(!n[0]||!As(n[0]))&&n.unshift("");var c=n.join("/");return s&&c.substr(-1)!=="/"&&(c+="/"),c}function tm(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}function Ps(e,t){if(e===t)return!0;if(e==null||t==null)return!1;if(Array.isArray(e))return Array.isArray(t)&&e.length===t.length&&e.every(function(i,o){return Ps(i,t[o])});if(typeof e=="object"||typeof t=="object"){var r=tm(e),n=tm(t);return r!==e||n!==t?Ps(r,n):Object.keys(Object.assign({},e,t)).every(function(i){return Ps(e[i],t[i])})}return!1}var lS=!0,rm="Invariant failed";function Er(e,t){if(!e)throw lS?new Error(rm):new Error(rm+": "+(t||""))}function Vo(e){return e.charAt(0)==="/"?e:"/"+e}function nm(e){return e.charAt(0)==="/"?e.substr(1):e}function cS(e,t){return e.toLowerCase().indexOf(t.toLowerCase())===0&&"/?#".indexOf(e.charAt(t.length))!==-1}function im(e,t){return cS(e,t)?e.substr(t.length):e}function om(e){return e.charAt(e.length-1)==="/"?e.slice(0,-1):e}function fS(e){var t=e||"/",r="",n="",i=t.indexOf("#");i!==-1&&(n=t.substr(i),t=t.substr(0,i));var o=t.indexOf("?");return o!==-1&&(r=t.substr(o),t=t.substr(0,o)),{pathname:t,search:r==="?"?"":r,hash:n==="#"?"":n}}function It(e){var t=e.pathname,r=e.search,n=e.hash,i=t||"/";return r&&r!=="?"&&(i+=r.charAt(0)==="?"?r:"?"+r),n&&n!=="#"&&(i+=n.charAt(0)==="#"?n:"#"+n),i}function kt(e,t,r,n){var i;typeof e=="string"?(i=fS(e),i.state=t):(i=yt({},e),i.pathname===void 0&&(i.pathname=""),i.search?i.search.charAt(0)!=="?"&&(i.search="?"+i.search):i.search="",i.hash?i.hash.charAt(0)!=="#"&&(i.hash="#"+i.hash):i.hash="",t!==void 0&&i.state===void 0&&(i.state=t));try{i.pathname=decodeURI(i.pathname)}catch(o){throw o instanceof URIError?new URIError('Pathname "'+i.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):o}return r&&(i.key=r),n?i.pathname?i.pathname.charAt(0)!=="/"&&(i.pathname=uS(i.pathname,n.pathname)):i.pathname=n.pathname:i.pathname||(i.pathname="/"),i}function pS(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&Ps(e.state,t.state)}function df(){var e=null;function t(a){return e=a,function(){e===a&&(e=null)}}function r(a,s,l,f){if(e!=null){var y=typeof e=="function"?e(a,s):e;typeof y=="string"?typeof l=="function"?l(y,f):f(!0):f(y!==!1)}else f(!0)}var n=[];function i(a){var s=!0;function l(){s&&a.apply(void 0,arguments)}return n.push(l),function(){s=!1,n=n.filter(function(f){return f!==l})}}function o(){for(var a=arguments.length,s=new Array(a),l=0;lK?G.splice(K,G.length-K,B):G.push(B),y({action:M,location:B,index:K,entries:G})}})}function p(P,I){var M="REPLACE",B=kt(P,I,b(),T.location);f.confirmTransitionTo(B,M,r,function($){!$||(T.entries[T.index]=B,y({action:M,location:B}))})}function d(P){var I=dm(T.index+P,0,T.entries.length-1),M="POP",B=T.entries[I];f.confirmTransitionTo(B,M,r,function($){$?y({action:M,location:B,index:I}):y()})}function v(){d(-1)}function g(){d(1)}function w(P){var I=T.index+P;return I>=0&&I=0)&&(r[i]=e[i]);return r}var Sf=Is.exports,$S={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},zS={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},QS={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},wm={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},Of={};Of[Sf.ForwardRef]=QS;Of[Sf.Memo]=wm;function Em(e){return Sf.isMemo(e)?wm:Of[e.$$typeof]||$S}var qS=Object.defineProperty,HS=Object.getOwnPropertyNames,Sm=Object.getOwnPropertySymbols,WS=Object.getOwnPropertyDescriptor,KS=Object.getPrototypeOf,Om=Object.prototype;function xm(e,t,r){if(typeof t!="string"){if(Om){var n=KS(t);n&&n!==Om&&xm(e,n,r)}var i=HS(t);Sm&&(i=i.concat(Sm(t)));for(var o=Em(e),a=Em(t),s=0;s=0||(i[r]=e[r]);return i}var ye={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},dO={rel:["amphtml","canonical","alternate"]},hO={type:["application/ld+json"]},vO={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},Um=Object.keys(ye).map(function(e){return ye[e]}),Ys={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},yO=Object.keys(Ys).reduce(function(e,t){return e[Ys[t]]=t,e},{}),wi=function(e,t){for(var r=e.length-1;r>=0;r-=1){var n=e[r];if(Object.prototype.hasOwnProperty.call(n,t))return n[t]}return null},mO=function(e){var t=wi(e,ye.TITLE),r=wi(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),r&&t)return r.replace(/%s/g,function(){return t});var n=wi(e,"defaultTitle");return t||n||void 0},gO=function(e){return wi(e,"onChangeClientState")||function(){}},Df=function(e,t){return t.filter(function(r){return r[e]!==void 0}).map(function(r){return r[e]}).reduce(function(r,n){return ft({},r,n)},{})},bO=function(e,t){return t.filter(function(r){return r[ye.BASE]!==void 0}).map(function(r){return r[ye.BASE]}).reverse().reduce(function(r,n){if(!r.length)for(var i=Object.keys(n),o=0;o /g,">").replace(/"/g,""").replace(/'/g,"'")},$m=function(e){return Object.keys(e).reduce(function(t,r){var n=e[r]!==void 0?r+'="'+e[r]+'"':""+r;return t?t+" "+n:n},"")},zm=function(e,t){return t===void 0&&(t={}),Object.keys(e).reduce(function(r,n){return r[Ys[n]||n]=e[n],r},t)},Xs=function(e,t){return t.map(function(r,n){var i,o=((i={key:n})["data-rh"]=!0,i);return Object.keys(r).forEach(function(a){var s=Ys[a]||a;s==="innerHTML"||s==="cssText"?o.dangerouslySetInnerHTML={__html:r.innerHTML||r.cssText}:o[s]=r[a]}),he.createElement(e,o)})},Xt=function(e,t,r){switch(e){case ye.TITLE:return{toComponent:function(){return i=t.titleAttributes,(o={key:n=t.title})["data-rh"]=!0,a=zm(i,o),[he.createElement(ye.TITLE,a,n)];var n,i,o,a},toString:function(){return function(n,i,o,a){var s=$m(o),l=Bm(i);return s?"<"+n+' data-rh="true" '+s+">"+If(l,a)+""+n+">":"<"+n+' data-rh="true">'+If(l,a)+""+n+">"}(e,t.title,t.titleAttributes,r)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return zm(t)},toString:function(){return $m(t)}};default:return{toComponent:function(){return Xs(e,t)},toString:function(){return function(n,i,o){return i.reduce(function(a,s){var l=Object.keys(s).filter(function(b){return!(b==="innerHTML"||b==="cssText")}).reduce(function(b,c){var m=s[c]===void 0?c:c+'="'+If(s[c],o)+'"';return b?b+" "+m:m},""),f=s.innerHTML||s.cssText||"",y=EO.indexOf(n)===-1;return a+"<"+n+' data-rh="true" '+l+(y?"/>":">"+f+""+n+">")},"")}(e,t,r)}}}},Nf=function(e){var t=e.baseTag,r=e.bodyAttributes,n=e.encode,i=e.htmlAttributes,o=e.noscriptTags,a=e.styleTags,s=e.title,l=s===void 0?"":s,f=e.titleAttributes,y=e.linkTags,b=e.metaTags,c=e.scriptTags,m={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var u=function(h){var p=h.linkTags,d=h.scriptTags,v=h.encode,g=Rf(h.metaTags,vO),w=Rf(p,dO),_=Rf(d,hO);return{priorityMethods:{toComponent:function(){return[].concat(Xs(ye.META,g.priority),Xs(ye.LINK,w.priority),Xs(ye.SCRIPT,_.priority))},toString:function(){return Xt(ye.META,g.priority,v)+" "+Xt(ye.LINK,w.priority,v)+" "+Xt(ye.SCRIPT,_.priority,v)}},metaTags:g.default,linkTags:w.default,scriptTags:_.default}}(e);m=u.priorityMethods,y=u.linkTags,b=u.metaTags,c=u.scriptTags}return{priority:m,base:Xt(ye.BASE,t,n),bodyAttributes:Xt("bodyAttributes",r,n),htmlAttributes:Xt("htmlAttributes",i,n),link:Xt(ye.LINK,y,n),meta:Xt(ye.META,b,n),noscript:Xt(ye.NOSCRIPT,o,n),script:Xt(ye.SCRIPT,c,n),style:Xt(ye.STYLE,a,n),title:Xt(ye.TITLE,{title:l,titleAttributes:f},n)}},Qm=he.createContext({}),SO=be.shape({setHelmet:be.func,helmetInstances:be.shape({get:be.func,add:be.func,remove:be.func})}),OO=typeof document!="undefined",$o=function(e){function t(r){var n;return(n=e.call(this,r)||this).instances=[],n.value={setHelmet:function(i){n.props.context.helmet=i},helmetInstances:{get:function(){return n.instances},add:function(i){n.instances.push(i)},remove:function(i){var o=n.instances.indexOf(i);n.instances.splice(o,1)}}},t.canUseDOM||(r.context.helmet=Nf({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),n}return Pf(t,e),t.prototype.render=function(){return he.createElement(Qm.Provider,{value:this.value},this.props.children)},t}(fe.exports.Component);$o.canUseDOM=OO,$o.propTypes={context:be.shape({helmet:be.shape()}),children:be.node.isRequired},$o.defaultProps={context:{}},$o.displayName="HelmetProvider";var Ei=function(e,t){var r,n=document.head||document.querySelector(ye.HEAD),i=n.querySelectorAll(e+"[data-rh]"),o=[].slice.call(i),a=[];return t&&t.length&&t.forEach(function(s){var l=document.createElement(e);for(var f in s)Object.prototype.hasOwnProperty.call(s,f)&&(f==="innerHTML"?l.innerHTML=s.innerHTML:f==="cssText"?l.styleSheet?l.styleSheet.cssText=s.cssText:l.appendChild(document.createTextNode(s.cssText)):l.setAttribute(f,s[f]===void 0?"":s[f]));l.setAttribute("data-rh","true"),o.some(function(y,b){return r=b,l.isEqualNode(y)})?o.splice(r,1):a.push(l)}),o.forEach(function(s){return s.parentNode.removeChild(s)}),a.forEach(function(s){return n.appendChild(s)}),{oldTags:o,newTags:a}},Lf=function(e,t){var r=document.getElementsByTagName(e)[0];if(r){for(var n=r.getAttribute("data-rh"),i=n?n.split(","):[],o=[].concat(i),a=Object.keys(t),s=0;s=0;b-=1)r.removeAttribute(o[b]);i.length===o.length?r.removeAttribute("data-rh"):r.getAttribute("data-rh")!==a.join(",")&&r.setAttribute("data-rh",a.join(","))}},qm=function(e,t){var r=e.baseTag,n=e.htmlAttributes,i=e.linkTags,o=e.metaTags,a=e.noscriptTags,s=e.onChangeClientState,l=e.scriptTags,f=e.styleTags,y=e.title,b=e.titleAttributes;Lf(ye.BODY,e.bodyAttributes),Lf(ye.HTML,n),function(h,p){h!==void 0&&document.title!==h&&(document.title=Bm(h)),Lf(ye.TITLE,p)}(y,b);var c={baseTag:Ei(ye.BASE,r),linkTags:Ei(ye.LINK,i),metaTags:Ei(ye.META,o),noscriptTags:Ei(ye.NOSCRIPT,a),scriptTags:Ei(ye.SCRIPT,l),styleTags:Ei(ye.STYLE,f)},m={},u={};Object.keys(c).forEach(function(h){var p=c[h],d=p.newTags,v=p.oldTags;d.length&&(m[h]=d),v.length&&(u[h]=c[h].oldTags)}),t&&t(),s(e,m,u)},zo=null,Mf=function(e){function t(){for(var n,i=arguments.length,o=new Array(i),a=0;a elements are self-closing and can not contain children. Refer to our API for more information.")}},r.flattenArrayTypeChildren=function(n){var i,o=n.child,a=n.arrayTypeChildren;return ft({},a,((i={})[o.type]=[].concat(a[o.type]||[],[ft({},n.newChildProps,this.mapNestedChildrenToProps(o,n.nestedChildren))]),i))},r.mapObjectTypeChildren=function(n){var i,o,a=n.child,s=n.newProps,l=n.newChildProps,f=n.nestedChildren;switch(a.type){case ye.TITLE:return ft({},s,((i={})[a.type]=f,i.titleAttributes=ft({},l),i));case ye.BODY:return ft({},s,{bodyAttributes:ft({},l)});case ye.HTML:return ft({},s,{htmlAttributes:ft({},l)});default:return ft({},s,((o={})[a.type]=ft({},l),o))}},r.mapArrayTypeChildrenToProps=function(n,i){var o=ft({},i);return Object.keys(n).forEach(function(a){var s;o=ft({},o,((s={})[a]=n[a],s))}),o},r.warnOnInvalidChildren=function(n,i){return Mm(Um.some(function(o){return n.type===o}),typeof n.type=="function"?"You may be attempting to nest components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+Um.join(", ")+" are allowed. Helmet does not support rendering <"+n.type+"> elements. Refer to our API for more information."),Mm(!i||typeof i=="string"||Array.isArray(i)&&!i.some(function(o){return typeof o!="string"}),"Helmet expects a string as a child of <"+n.type+">. Did you forget to wrap your children in braces? ( <"+n.type+">{``}"+n.type+"> ) Refer to our API for more information."),!0},r.mapChildrenToProps=function(n,i){var o=this,a={};return he.Children.forEach(n,function(s){if(s&&s.props){var l=s.props,f=l.children,y=Vm(l,xO),b=Object.keys(y).reduce(function(m,u){return m[yO[u]||u]=y[u],m},{}),c=s.type;switch(typeof c=="symbol"?c=c.toString():o.warnOnInvalidChildren(s,f),c){case ye.FRAGMENT:i=o.mapChildrenToProps(f,i);break;case ye.LINK:case ye.META:case ye.NOSCRIPT:case ye.SCRIPT:case ye.STYLE:a=o.flattenArrayTypeChildren({child:s,arrayTypeChildren:a,newChildProps:b,nestedChildren:f});break;default:i=o.mapObjectTypeChildren({child:s,newProps:i,newChildProps:b,nestedChildren:f})}}}),this.mapArrayTypeChildrenToProps(a,i)},r.render=function(){var n=this.props,i=n.children,o=ft({},Vm(n,_O));return i&&(o=this.mapChildrenToProps(i,o)),he.createElement(Qm.Consumer,null,function(a){return he.createElement(Mf,ft({},o,{context:a}))})},t}(fe.exports.Component);jf.propTypes={base:be.object,bodyAttributes:be.object,children:be.oneOfType([be.arrayOf(be.node),be.node]),defaultTitle:be.string,defer:be.bool,encodeSpecialCharacters:be.bool,htmlAttributes:be.object,link:be.arrayOf(be.object),meta:be.arrayOf(be.object),noscript:be.arrayOf(be.object),onChangeClientState:be.func,script:be.arrayOf(be.object),style:be.arrayOf(be.object),title:be.string,titleAttributes:be.object,titleTemplate:be.string,prioritizeSeoTags:be.bool},jf.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},jf.displayName="Helmet";/*! *****************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */var Ff=function(e,t){return Ff=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,n){r.__proto__=n}||function(r,n){for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(r[i]=n[i])},Ff(e,t)};function Jt(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");Ff(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}var ee=function(){return ee=Object.assign||function(t){for(var r,n=1,i=arguments.length;n0&&o[o.length-1])&&(f[0]===6||f[0]===2)){r=0;continue}if(f[0]===3&&(!o||f[1]>o[0]&&f[1]=TO){var t=console[e]||console.log;return t.apply(console,arguments)}}}(function(e){e.debug=Zs("debug"),e.log=Zs("log"),e.warn=Zs("warn"),e.error=Zs("error")})(oe||(oe={}));function tn(e){try{return e()}catch(t){}}var Km=tn(function(){return globalThis})||tn(function(){return window})||tn(function(){return self})||tn(function(){return global})||tn(function(){return Function("return this")()}),Gm="__",Ym=[Gm,Gm].join("DEV");function CO(){try{return Boolean(__DEV__)}catch(e){return Object.defineProperty(Km,Ym,{value:tn(function(){return"production"})!=="production",enumerable:!1,configurable:!0,writable:!0}),Km[Ym]}}var Uf=CO();function Cn(e){try{return e()}catch(t){}}var Bf=Cn(function(){return globalThis})||Cn(function(){return window})||Cn(function(){return self})||Cn(function(){return global})||Cn(function(){return Function("return this")()}),$f=!1;function AO(){Bf&&!Cn(function(){return"production"})&&!Cn(function(){return process})&&(Object.defineProperty(Bf,"process",{value:{env:{NODE_ENV:"production"}},configurable:!0,enumerable:!1,writable:!0}),$f=!0)}AO();function Xm(){$f&&(delete Bf.process,$f=!1)}function eu(e){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?eu=function(r){return typeof r}:eu=function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},eu(e)}function PO(e){return eu(e)=="object"&&e!==null}var Jm=typeof Symbol=="function"&&Symbol.toStringTag!=null?Symbol.toStringTag:"@@toStringTag";function zf(e,t){for(var r=/\r\n|[\n\r]/g,n=1,i=t+1,o;(o=r.exec(e.body))&&o.index120){for(var c=Math.floor(l/80),m=l%80,u=[],h=0;h",EOF:"",BANG:"!",DOLLAR:"$",AMP:"&",PAREN_L:"(",PAREN_R:")",SPREAD:"...",COLON:":",EQUALS:"=",AT:"@",BRACKET_L:"[",BRACKET_R:"]",BRACE_L:"{",PIPE:"|",BRACE_R:"}",NAME:"Name",INT:"Int",FLOAT:"Float",STRING:"String",BLOCK_STRING:"BlockString",COMMENT:"Comment"});function iu(e){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?iu=function(r){return typeof r}:iu=function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},iu(e)}var $O=10,sg=2;function ug(e){return ou(e,[])}function ou(e,t){switch(iu(e)){case"string":return JSON.stringify(e);case"function":return e.name?"[function ".concat(e.name,"]"):"[function]";case"object":return e===null?"null":zO(e,t);default:return String(e)}}function zO(e,t){if(t.indexOf(e)!==-1)return"[Circular]";var r=[].concat(t,[e]),n=HO(e);if(n!==void 0){var i=n.call(e);if(i!==e)return typeof i=="string"?i:ou(i,r)}else if(Array.isArray(e))return qO(e,r);return QO(e,r)}function QO(e,t){var r=Object.keys(e);if(r.length===0)return"{}";if(t.length>sg)return"["+WO(e)+"]";var n=r.map(function(i){var o=ou(e[i],t);return i+": "+o});return"{ "+n.join(", ")+" }"}function qO(e,t){if(e.length===0)return"[]";if(t.length>sg)return"[Array]";for(var r=Math.min($O,e.length),n=e.length-r,i=[],o=0;o1&&i.push("... ".concat(n," more items")),"["+i.join(", ")+"]"}function HO(e){var t=e[String(qf)];if(typeof t=="function")return t;if(typeof e.inspect=="function")return e.inspect}function WO(e){var t=Object.prototype.toString.call(e).replace(/^\[object /,"").replace(/]$/,"");if(t==="Object"&&typeof e.constructor=="function"){var r=e.constructor.name;if(typeof r=="string"&&r!=="")return r}return t}function Hf(e,t){var r=Boolean(e);if(!r)throw new Error(t)}var KO=function(t,r){return t instanceof r};function lg(e,t){for(var r=0;r1&&arguments[1]!==void 0?arguments[1]:"GraphQL request",n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{line:1,column:1};typeof t=="string"||Hf(0,"Body must be a string. Received: ".concat(ug(t),".")),this.body=t,this.name=r,this.locationOffset=n,this.locationOffset.line>0||Hf(0,"line in locationOffset is 1-indexed and must be positive."),this.locationOffset.column>0||Hf(0,"column in locationOffset is 1-indexed and must be positive.")}return GO(e,[{key:Jm,get:function(){return"Source"}}]),e}();function YO(e){return KO(e,Wf)}var XO=Object.freeze({QUERY:"QUERY",MUTATION:"MUTATION",SUBSCRIPTION:"SUBSCRIPTION",FIELD:"FIELD",FRAGMENT_DEFINITION:"FRAGMENT_DEFINITION",FRAGMENT_SPREAD:"FRAGMENT_SPREAD",INLINE_FRAGMENT:"INLINE_FRAGMENT",VARIABLE_DEFINITION:"VARIABLE_DEFINITION",SCHEMA:"SCHEMA",SCALAR:"SCALAR",OBJECT:"OBJECT",FIELD_DEFINITION:"FIELD_DEFINITION",ARGUMENT_DEFINITION:"ARGUMENT_DEFINITION",INTERFACE:"INTERFACE",UNION:"UNION",ENUM:"ENUM",ENUM_VALUE:"ENUM_VALUE",INPUT_OBJECT:"INPUT_OBJECT",INPUT_FIELD_DEFINITION:"INPUT_FIELD_DEFINITION"});function JO(e){var t=e.split(/\r\n|[\n\r]/g),r=ZO(e);if(r!==0)for(var n=1;ni&&cg(t[o-1]);)--o;return t.slice(i,o).join(`
-`)}function cg(e){for(var t=0;t1&&arguments[1]!==void 0?arguments[1]:"",r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,n=e.indexOf(`
-`)===-1,i=e[0]===" "||e[0]===" ",o=e[e.length-1]==='"',a=e[e.length-1]==="\\",s=!n||o||a||r,l="";return s&&!(n&&i)&&(l+=`
-`+t),l+=t?e.replace(/\n/g,`
-`+t):e,s&&(l+=`
-`),'"""'+l.replace(/"""/g,'\\"""')+'"""'}var tx=function(){function e(r){var n=new Je(re.SOF,0,0,0,0,null);this.source=r,this.lastToken=n,this.token=n,this.line=1,this.lineStart=0}var t=e.prototype;return t.advance=function(){this.lastToken=this.token;var n=this.token=this.lookahead();return n},t.lookahead=function(){var n=this.token;if(n.kind!==re.EOF)do{var i;n=(i=n.next)!==null&&i!==void 0?i:n.next=nx(this,n)}while(n.kind===re.COMMENT);return n},e}();function rx(e){return e===re.BANG||e===re.DOLLAR||e===re.AMP||e===re.PAREN_L||e===re.PAREN_R||e===re.SPREAD||e===re.COLON||e===re.EQUALS||e===re.AT||e===re.BRACKET_L||e===re.BRACKET_R||e===re.BRACE_L||e===re.PIPE||e===re.BRACE_R}function An(e){return isNaN(e)?re.EOF:e<127?JSON.stringify(String.fromCharCode(e)):'"\\u'.concat(("00"+e.toString(16).toUpperCase()).slice(-4),'"')}function nx(e,t){for(var r=e.source,n=r.body,i=n.length,o=t.end;o31||a===9));return new Je(re.COMMENT,t,s,r,n,i,o.slice(t+1,s))}function ax(e,t,r,n,i,o){var a=e.body,s=r,l=t,f=!1;if(s===45&&(s=a.charCodeAt(++l)),s===48){if(s=a.charCodeAt(++l),s>=48&&s<=57)throw Ut(e,l,"Invalid number, unexpected digit after 0: ".concat(An(s),"."))}else l=Kf(e,l,s),s=a.charCodeAt(l);if(s===46&&(f=!0,s=a.charCodeAt(++l),l=Kf(e,l,s),s=a.charCodeAt(l)),(s===69||s===101)&&(f=!0,s=a.charCodeAt(++l),(s===43||s===45)&&(s=a.charCodeAt(++l)),l=Kf(e,l,s),s=a.charCodeAt(l)),s===46||fx(s))throw Ut(e,l,"Invalid number, expected digit but got: ".concat(An(s),"."));return new Je(f?re.FLOAT:re.INT,t,l,n,i,o,a.slice(t,l))}function Kf(e,t,r){var n=e.body,i=t,o=r;if(o>=48&&o<=57){do o=n.charCodeAt(++i);while(o>=48&&o<=57);return i}throw Ut(e,i,"Invalid number, expected digit but got: ".concat(An(o),"."))}function sx(e,t,r,n,i){for(var o=e.body,a=t+1,s=a,l=0,f="";a=48&&e<=57?e-48:e>=65&&e<=70?e-55:e>=97&&e<=102?e-87:-1}function cx(e,t,r,n,i){for(var o=e.body,a=o.length,s=t+1,l=0;s!==a&&!isNaN(l=o.charCodeAt(s))&&(l===95||l>=48&&l<=57||l>=65&&l<=90||l>=97&&l<=122);)++s;return new Je(re.NAME,t,s,r,n,i,o.slice(t,s))}function fx(e){return e===95||e>=65&&e<=90||e>=97&&e<=122}function px(e,t){var r=new dx(e,t);return r.parseDocument()}var dx=function(){function e(r,n){var i=YO(r)?r:new Wf(r);this._lexer=new tx(i),this._options=n}var t=e.prototype;return t.parseName=function(){var n=this.expectToken(re.NAME);return{kind:Ee.NAME,value:n.value,loc:this.loc(n)}},t.parseDocument=function(){var n=this._lexer.token;return{kind:Ee.DOCUMENT,definitions:this.many(re.SOF,this.parseDefinition,re.EOF),loc:this.loc(n)}},t.parseDefinition=function(){if(this.peek(re.NAME))switch(this._lexer.token.value){case"query":case"mutation":case"subscription":return this.parseOperationDefinition();case"fragment":return this.parseFragmentDefinition();case"schema":case"scalar":case"type":case"interface":case"union":case"enum":case"input":case"directive":return this.parseTypeSystemDefinition();case"extend":return this.parseTypeSystemExtension()}else{if(this.peek(re.BRACE_L))return this.parseOperationDefinition();if(this.peekDescription())return this.parseTypeSystemDefinition()}throw this.unexpected()},t.parseOperationDefinition=function(){var n=this._lexer.token;if(this.peek(re.BRACE_L))return{kind:Ee.OPERATION_DEFINITION,operation:"query",name:void 0,variableDefinitions:[],directives:[],selectionSet:this.parseSelectionSet(),loc:this.loc(n)};var i=this.parseOperationType(),o;return this.peek(re.NAME)&&(o=this.parseName()),{kind:Ee.OPERATION_DEFINITION,operation:i,name:o,variableDefinitions:this.parseVariableDefinitions(),directives:this.parseDirectives(!1),selectionSet:this.parseSelectionSet(),loc:this.loc(n)}},t.parseOperationType=function(){var n=this.expectToken(re.NAME);switch(n.value){case"query":return"query";case"mutation":return"mutation";case"subscription":return"subscription"}throw this.unexpected(n)},t.parseVariableDefinitions=function(){return this.optionalMany(re.PAREN_L,this.parseVariableDefinition,re.PAREN_R)},t.parseVariableDefinition=function(){var n=this._lexer.token;return{kind:Ee.VARIABLE_DEFINITION,variable:this.parseVariable(),type:(this.expectToken(re.COLON),this.parseTypeReference()),defaultValue:this.expectOptionalToken(re.EQUALS)?this.parseValueLiteral(!0):void 0,directives:this.parseDirectives(!0),loc:this.loc(n)}},t.parseVariable=function(){var n=this._lexer.token;return this.expectToken(re.DOLLAR),{kind:Ee.VARIABLE,name:this.parseName(),loc:this.loc(n)}},t.parseSelectionSet=function(){var n=this._lexer.token;return{kind:Ee.SELECTION_SET,selections:this.many(re.BRACE_L,this.parseSelection,re.BRACE_R),loc:this.loc(n)}},t.parseSelection=function(){return this.peek(re.SPREAD)?this.parseFragment():this.parseField()},t.parseField=function(){var n=this._lexer.token,i=this.parseName(),o,a;return this.expectOptionalToken(re.COLON)?(o=i,a=this.parseName()):a=i,{kind:Ee.FIELD,alias:o,name:a,arguments:this.parseArguments(!1),directives:this.parseDirectives(!1),selectionSet:this.peek(re.BRACE_L)?this.parseSelectionSet():void 0,loc:this.loc(n)}},t.parseArguments=function(n){var i=n?this.parseConstArgument:this.parseArgument;return this.optionalMany(re.PAREN_L,i,re.PAREN_R)},t.parseArgument=function(){var n=this._lexer.token,i=this.parseName();return this.expectToken(re.COLON),{kind:Ee.ARGUMENT,name:i,value:this.parseValueLiteral(!1),loc:this.loc(n)}},t.parseConstArgument=function(){var n=this._lexer.token;return{kind:Ee.ARGUMENT,name:this.parseName(),value:(this.expectToken(re.COLON),this.parseValueLiteral(!0)),loc:this.loc(n)}},t.parseFragment=function(){var n=this._lexer.token;this.expectToken(re.SPREAD);var i=this.expectOptionalKeyword("on");return!i&&this.peek(re.NAME)?{kind:Ee.FRAGMENT_SPREAD,name:this.parseFragmentName(),directives:this.parseDirectives(!1),loc:this.loc(n)}:{kind:Ee.INLINE_FRAGMENT,typeCondition:i?this.parseNamedType():void 0,directives:this.parseDirectives(!1),selectionSet:this.parseSelectionSet(),loc:this.loc(n)}},t.parseFragmentDefinition=function(){var n,i=this._lexer.token;return this.expectKeyword("fragment"),((n=this._options)===null||n===void 0?void 0:n.experimentalFragmentVariables)===!0?{kind:Ee.FRAGMENT_DEFINITION,name:this.parseFragmentName(),variableDefinitions:this.parseVariableDefinitions(),typeCondition:(this.expectKeyword("on"),this.parseNamedType()),directives:this.parseDirectives(!1),selectionSet:this.parseSelectionSet(),loc:this.loc(i)}:{kind:Ee.FRAGMENT_DEFINITION,name:this.parseFragmentName(),typeCondition:(this.expectKeyword("on"),this.parseNamedType()),directives:this.parseDirectives(!1),selectionSet:this.parseSelectionSet(),loc:this.loc(i)}},t.parseFragmentName=function(){if(this._lexer.token.value==="on")throw this.unexpected();return this.parseName()},t.parseValueLiteral=function(n){var i=this._lexer.token;switch(i.kind){case re.BRACKET_L:return this.parseList(n);case re.BRACE_L:return this.parseObject(n);case re.INT:return this._lexer.advance(),{kind:Ee.INT,value:i.value,loc:this.loc(i)};case re.FLOAT:return this._lexer.advance(),{kind:Ee.FLOAT,value:i.value,loc:this.loc(i)};case re.STRING:case re.BLOCK_STRING:return this.parseStringLiteral();case re.NAME:switch(this._lexer.advance(),i.value){case"true":return{kind:Ee.BOOLEAN,value:!0,loc:this.loc(i)};case"false":return{kind:Ee.BOOLEAN,value:!1,loc:this.loc(i)};case"null":return{kind:Ee.NULL,loc:this.loc(i)};default:return{kind:Ee.ENUM,value:i.value,loc:this.loc(i)}}case re.DOLLAR:if(!n)return this.parseVariable();break}throw this.unexpected()},t.parseStringLiteral=function(){var n=this._lexer.token;return this._lexer.advance(),{kind:Ee.STRING,value:n.value,block:n.kind===re.BLOCK_STRING,loc:this.loc(n)}},t.parseList=function(n){var i=this,o=this._lexer.token,a=function(){return i.parseValueLiteral(n)};return{kind:Ee.LIST,values:this.any(re.BRACKET_L,a,re.BRACKET_R),loc:this.loc(o)}},t.parseObject=function(n){var i=this,o=this._lexer.token,a=function(){return i.parseObjectField(n)};return{kind:Ee.OBJECT,fields:this.any(re.BRACE_L,a,re.BRACE_R),loc:this.loc(o)}},t.parseObjectField=function(n){var i=this._lexer.token,o=this.parseName();return this.expectToken(re.COLON),{kind:Ee.OBJECT_FIELD,name:o,value:this.parseValueLiteral(n),loc:this.loc(i)}},t.parseDirectives=function(n){for(var i=[];this.peek(re.AT);)i.push(this.parseDirective(n));return i},t.parseDirective=function(n){var i=this._lexer.token;return this.expectToken(re.AT),{kind:Ee.DIRECTIVE,name:this.parseName(),arguments:this.parseArguments(n),loc:this.loc(i)}},t.parseTypeReference=function(){var n=this._lexer.token,i;return this.expectOptionalToken(re.BRACKET_L)?(i=this.parseTypeReference(),this.expectToken(re.BRACKET_R),i={kind:Ee.LIST_TYPE,type:i,loc:this.loc(n)}):i=this.parseNamedType(),this.expectOptionalToken(re.BANG)?{kind:Ee.NON_NULL_TYPE,type:i,loc:this.loc(n)}:i},t.parseNamedType=function(){var n=this._lexer.token;return{kind:Ee.NAMED_TYPE,name:this.parseName(),loc:this.loc(n)}},t.parseTypeSystemDefinition=function(){var n=this.peekDescription()?this._lexer.lookahead():this._lexer.token;if(n.kind===re.NAME)switch(n.value){case"schema":return this.parseSchemaDefinition();case"scalar":return this.parseScalarTypeDefinition();case"type":return this.parseObjectTypeDefinition();case"interface":return this.parseInterfaceTypeDefinition();case"union":return this.parseUnionTypeDefinition();case"enum":return this.parseEnumTypeDefinition();case"input":return this.parseInputObjectTypeDefinition();case"directive":return this.parseDirectiveDefinition()}throw this.unexpected(n)},t.peekDescription=function(){return this.peek(re.STRING)||this.peek(re.BLOCK_STRING)},t.parseDescription=function(){if(this.peekDescription())return this.parseStringLiteral()},t.parseSchemaDefinition=function(){var n=this._lexer.token,i=this.parseDescription();this.expectKeyword("schema");var o=this.parseDirectives(!0),a=this.many(re.BRACE_L,this.parseOperationTypeDefinition,re.BRACE_R);return{kind:Ee.SCHEMA_DEFINITION,description:i,directives:o,operationTypes:a,loc:this.loc(n)}},t.parseOperationTypeDefinition=function(){var n=this._lexer.token,i=this.parseOperationType();this.expectToken(re.COLON);var o=this.parseNamedType();return{kind:Ee.OPERATION_TYPE_DEFINITION,operation:i,type:o,loc:this.loc(n)}},t.parseScalarTypeDefinition=function(){var n=this._lexer.token,i=this.parseDescription();this.expectKeyword("scalar");var o=this.parseName(),a=this.parseDirectives(!0);return{kind:Ee.SCALAR_TYPE_DEFINITION,description:i,name:o,directives:a,loc:this.loc(n)}},t.parseObjectTypeDefinition=function(){var n=this._lexer.token,i=this.parseDescription();this.expectKeyword("type");var o=this.parseName(),a=this.parseImplementsInterfaces(),s=this.parseDirectives(!0),l=this.parseFieldsDefinition();return{kind:Ee.OBJECT_TYPE_DEFINITION,description:i,name:o,interfaces:a,directives:s,fields:l,loc:this.loc(n)}},t.parseImplementsInterfaces=function(){var n;if(!this.expectOptionalKeyword("implements"))return[];if(((n=this._options)===null||n===void 0?void 0:n.allowLegacySDLImplementsInterfaces)===!0){var i=[];this.expectOptionalToken(re.AMP);do i.push(this.parseNamedType());while(this.expectOptionalToken(re.AMP)||this.peek(re.NAME));return i}return this.delimitedMany(re.AMP,this.parseNamedType)},t.parseFieldsDefinition=function(){var n;return((n=this._options)===null||n===void 0?void 0:n.allowLegacySDLEmptyFields)===!0&&this.peek(re.BRACE_L)&&this._lexer.lookahead().kind===re.BRACE_R?(this._lexer.advance(),this._lexer.advance(),[]):this.optionalMany(re.BRACE_L,this.parseFieldDefinition,re.BRACE_R)},t.parseFieldDefinition=function(){var n=this._lexer.token,i=this.parseDescription(),o=this.parseName(),a=this.parseArgumentDefs();this.expectToken(re.COLON);var s=this.parseTypeReference(),l=this.parseDirectives(!0);return{kind:Ee.FIELD_DEFINITION,description:i,name:o,arguments:a,type:s,directives:l,loc:this.loc(n)}},t.parseArgumentDefs=function(){return this.optionalMany(re.PAREN_L,this.parseInputValueDef,re.PAREN_R)},t.parseInputValueDef=function(){var n=this._lexer.token,i=this.parseDescription(),o=this.parseName();this.expectToken(re.COLON);var a=this.parseTypeReference(),s;this.expectOptionalToken(re.EQUALS)&&(s=this.parseValueLiteral(!0));var l=this.parseDirectives(!0);return{kind:Ee.INPUT_VALUE_DEFINITION,description:i,name:o,type:a,defaultValue:s,directives:l,loc:this.loc(n)}},t.parseInterfaceTypeDefinition=function(){var n=this._lexer.token,i=this.parseDescription();this.expectKeyword("interface");var o=this.parseName(),a=this.parseImplementsInterfaces(),s=this.parseDirectives(!0),l=this.parseFieldsDefinition();return{kind:Ee.INTERFACE_TYPE_DEFINITION,description:i,name:o,interfaces:a,directives:s,fields:l,loc:this.loc(n)}},t.parseUnionTypeDefinition=function(){var n=this._lexer.token,i=this.parseDescription();this.expectKeyword("union");var o=this.parseName(),a=this.parseDirectives(!0),s=this.parseUnionMemberTypes();return{kind:Ee.UNION_TYPE_DEFINITION,description:i,name:o,directives:a,types:s,loc:this.loc(n)}},t.parseUnionMemberTypes=function(){return this.expectOptionalToken(re.EQUALS)?this.delimitedMany(re.PIPE,this.parseNamedType):[]},t.parseEnumTypeDefinition=function(){var n=this._lexer.token,i=this.parseDescription();this.expectKeyword("enum");var o=this.parseName(),a=this.parseDirectives(!0),s=this.parseEnumValuesDefinition();return{kind:Ee.ENUM_TYPE_DEFINITION,description:i,name:o,directives:a,values:s,loc:this.loc(n)}},t.parseEnumValuesDefinition=function(){return this.optionalMany(re.BRACE_L,this.parseEnumValueDefinition,re.BRACE_R)},t.parseEnumValueDefinition=function(){var n=this._lexer.token,i=this.parseDescription(),o=this.parseName(),a=this.parseDirectives(!0);return{kind:Ee.ENUM_VALUE_DEFINITION,description:i,name:o,directives:a,loc:this.loc(n)}},t.parseInputObjectTypeDefinition=function(){var n=this._lexer.token,i=this.parseDescription();this.expectKeyword("input");var o=this.parseName(),a=this.parseDirectives(!0),s=this.parseInputFieldsDefinition();return{kind:Ee.INPUT_OBJECT_TYPE_DEFINITION,description:i,name:o,directives:a,fields:s,loc:this.loc(n)}},t.parseInputFieldsDefinition=function(){return this.optionalMany(re.BRACE_L,this.parseInputValueDef,re.BRACE_R)},t.parseTypeSystemExtension=function(){var n=this._lexer.lookahead();if(n.kind===re.NAME)switch(n.value){case"schema":return this.parseSchemaExtension();case"scalar":return this.parseScalarTypeExtension();case"type":return this.parseObjectTypeExtension();case"interface":return this.parseInterfaceTypeExtension();case"union":return this.parseUnionTypeExtension();case"enum":return this.parseEnumTypeExtension();case"input":return this.parseInputObjectTypeExtension()}throw this.unexpected(n)},t.parseSchemaExtension=function(){var n=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("schema");var i=this.parseDirectives(!0),o=this.optionalMany(re.BRACE_L,this.parseOperationTypeDefinition,re.BRACE_R);if(i.length===0&&o.length===0)throw this.unexpected();return{kind:Ee.SCHEMA_EXTENSION,directives:i,operationTypes:o,loc:this.loc(n)}},t.parseScalarTypeExtension=function(){var n=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("scalar");var i=this.parseName(),o=this.parseDirectives(!0);if(o.length===0)throw this.unexpected();return{kind:Ee.SCALAR_TYPE_EXTENSION,name:i,directives:o,loc:this.loc(n)}},t.parseObjectTypeExtension=function(){var n=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("type");var i=this.parseName(),o=this.parseImplementsInterfaces(),a=this.parseDirectives(!0),s=this.parseFieldsDefinition();if(o.length===0&&a.length===0&&s.length===0)throw this.unexpected();return{kind:Ee.OBJECT_TYPE_EXTENSION,name:i,interfaces:o,directives:a,fields:s,loc:this.loc(n)}},t.parseInterfaceTypeExtension=function(){var n=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("interface");var i=this.parseName(),o=this.parseImplementsInterfaces(),a=this.parseDirectives(!0),s=this.parseFieldsDefinition();if(o.length===0&&a.length===0&&s.length===0)throw this.unexpected();return{kind:Ee.INTERFACE_TYPE_EXTENSION,name:i,interfaces:o,directives:a,fields:s,loc:this.loc(n)}},t.parseUnionTypeExtension=function(){var n=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("union");var i=this.parseName(),o=this.parseDirectives(!0),a=this.parseUnionMemberTypes();if(o.length===0&&a.length===0)throw this.unexpected();return{kind:Ee.UNION_TYPE_EXTENSION,name:i,directives:o,types:a,loc:this.loc(n)}},t.parseEnumTypeExtension=function(){var n=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("enum");var i=this.parseName(),o=this.parseDirectives(!0),a=this.parseEnumValuesDefinition();if(o.length===0&&a.length===0)throw this.unexpected();return{kind:Ee.ENUM_TYPE_EXTENSION,name:i,directives:o,values:a,loc:this.loc(n)}},t.parseInputObjectTypeExtension=function(){var n=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("input");var i=this.parseName(),o=this.parseDirectives(!0),a=this.parseInputFieldsDefinition();if(o.length===0&&a.length===0)throw this.unexpected();return{kind:Ee.INPUT_OBJECT_TYPE_EXTENSION,name:i,directives:o,fields:a,loc:this.loc(n)}},t.parseDirectiveDefinition=function(){var n=this._lexer.token,i=this.parseDescription();this.expectKeyword("directive"),this.expectToken(re.AT);var o=this.parseName(),a=this.parseArgumentDefs(),s=this.expectOptionalKeyword("repeatable");this.expectKeyword("on");var l=this.parseDirectiveLocations();return{kind:Ee.DIRECTIVE_DEFINITION,description:i,name:o,arguments:a,repeatable:s,locations:l,loc:this.loc(n)}},t.parseDirectiveLocations=function(){return this.delimitedMany(re.PIPE,this.parseDirectiveLocation)},t.parseDirectiveLocation=function(){var n=this._lexer.token,i=this.parseName();if(XO[i.value]!==void 0)return i;throw this.unexpected(n)},t.loc=function(n){var i;if(((i=this._options)===null||i===void 0?void 0:i.noLocation)!==!0)return new og(n,this._lexer.lastToken,this._lexer.source)},t.peek=function(n){return this._lexer.token.kind===n},t.expectToken=function(n){var i=this._lexer.token;if(i.kind===n)return this._lexer.advance(),i;throw Ut(this._lexer.source,i.start,"Expected ".concat(fg(n),", found ").concat(Gf(i),"."))},t.expectOptionalToken=function(n){var i=this._lexer.token;if(i.kind===n)return this._lexer.advance(),i},t.expectKeyword=function(n){var i=this._lexer.token;if(i.kind===re.NAME&&i.value===n)this._lexer.advance();else throw Ut(this._lexer.source,i.start,'Expected "'.concat(n,'", found ').concat(Gf(i),"."))},t.expectOptionalKeyword=function(n){var i=this._lexer.token;return i.kind===re.NAME&&i.value===n?(this._lexer.advance(),!0):!1},t.unexpected=function(n){var i=n!=null?n:this._lexer.token;return Ut(this._lexer.source,i.start,"Unexpected ".concat(Gf(i),"."))},t.any=function(n,i,o){this.expectToken(n);for(var a=[];!this.expectOptionalToken(o);)a.push(i.call(this));return a},t.optionalMany=function(n,i,o){if(this.expectOptionalToken(n)){var a=[];do a.push(i.call(this));while(!this.expectOptionalToken(o));return a}return[]},t.many=function(n,i,o){this.expectToken(n);var a=[];do a.push(i.call(this));while(!this.expectOptionalToken(o));return a},t.delimitedMany=function(n,i){this.expectOptionalToken(n);var o=[];do o.push(i.call(this));while(this.expectOptionalToken(n));return o},e}();function Gf(e){var t=e.value;return fg(e.kind)+(t!=null?' "'.concat(t,'"'):"")}function fg(e){return rx(e)?'"'.concat(e,'"'):e}var hx={Name:[],Document:["definitions"],OperationDefinition:["name","variableDefinitions","directives","selectionSet"],VariableDefinition:["variable","type","defaultValue","directives"],Variable:["name"],SelectionSet:["selections"],Field:["alias","name","arguments","directives","selectionSet"],Argument:["name","value"],FragmentSpread:["name","directives"],InlineFragment:["typeCondition","directives","selectionSet"],FragmentDefinition:["name","variableDefinitions","typeCondition","directives","selectionSet"],IntValue:[],FloatValue:[],StringValue:[],BooleanValue:[],NullValue:[],EnumValue:[],ListValue:["values"],ObjectValue:["fields"],ObjectField:["name","value"],Directive:["name","arguments"],NamedType:["name"],ListType:["type"],NonNullType:["type"],SchemaDefinition:["description","directives","operationTypes"],OperationTypeDefinition:["type"],ScalarTypeDefinition:["description","name","directives"],ObjectTypeDefinition:["description","name","interfaces","directives","fields"],FieldDefinition:["description","name","arguments","type","directives"],InputValueDefinition:["description","name","type","defaultValue","directives"],InterfaceTypeDefinition:["description","name","interfaces","directives","fields"],UnionTypeDefinition:["description","name","directives","types"],EnumTypeDefinition:["description","name","directives","values"],EnumValueDefinition:["description","name","directives"],InputObjectTypeDefinition:["description","name","directives","fields"],DirectiveDefinition:["description","name","arguments","locations"],SchemaExtension:["directives","operationTypes"],ScalarTypeExtension:["name","directives"],ObjectTypeExtension:["name","interfaces","directives","fields"],InterfaceTypeExtension:["name","interfaces","directives","fields"],UnionTypeExtension:["name","directives","types"],EnumTypeExtension:["name","directives","values"],InputObjectTypeExtension:["name","directives","fields"]},pg=Object.freeze({});function Sr(e,t){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:hx,n=void 0,i=Array.isArray(e),o=[e],a=-1,s=[],l=void 0,f=void 0,y=void 0,b=[],c=[],m=e;do{a++;var u=a===o.length,h=u&&s.length!==0;if(u){if(f=c.length===0?void 0:b[b.length-1],l=y,y=c.pop(),h){if(i)l=l.slice();else{for(var p={},d=0,v=Object.keys(l);dyx&&(l=s+Ke(`(
-`,su(pe(i,`
-`)),`
-)`)),pe([l,pe(o," "),a]," ")},Argument:function(t){var r=t.name,n=t.value;return r+": "+n},FragmentSpread:function(t){var r=t.name,n=t.directives;return"..."+r+Ke(" ",pe(n," "))},InlineFragment:function(t){var r=t.typeCondition,n=t.directives,i=t.selectionSet;return pe(["...",Ke("on ",r),pe(n," "),i]," ")},FragmentDefinition:function(t){var r=t.name,n=t.typeCondition,i=t.variableDefinitions,o=t.directives,a=t.selectionSet;return"fragment ".concat(r).concat(Ke("(",pe(i,", "),")")," ")+"on ".concat(n," ").concat(Ke("",pe(o," ")," "))+a},IntValue:function(t){var r=t.value;return r},FloatValue:function(t){var r=t.value;return r},StringValue:function(t,r){var n=t.value,i=t.block;return i?ex(n,r==="description"?"":" "):JSON.stringify(n)},BooleanValue:function(t){var r=t.value;return r?"true":"false"},NullValue:function(){return"null"},EnumValue:function(t){var r=t.value;return r},ListValue:function(t){var r=t.values;return"["+pe(r,", ")+"]"},ObjectValue:function(t){var r=t.fields;return"{"+pe(r,", ")+"}"},ObjectField:function(t){var r=t.name,n=t.value;return r+": "+n},Directive:function(t){var r=t.name,n=t.arguments;return"@"+r+Ke("(",pe(n,", "),")")},NamedType:function(t){var r=t.name;return r},ListType:function(t){var r=t.type;return"["+r+"]"},NonNullType:function(t){var r=t.type;return r+"!"},SchemaDefinition:ur(function(e){var t=e.directives,r=e.operationTypes;return pe(["schema",pe(t," "),lr(r)]," ")}),OperationTypeDefinition:function(t){var r=t.operation,n=t.type;return r+": "+n},ScalarTypeDefinition:ur(function(e){var t=e.name,r=e.directives;return pe(["scalar",t,pe(r," ")]," ")}),ObjectTypeDefinition:ur(function(e){var t=e.name,r=e.interfaces,n=e.directives,i=e.fields;return pe(["type",t,Ke("implements ",pe(r," & ")),pe(n," "),lr(i)]," ")}),FieldDefinition:ur(function(e){var t=e.name,r=e.arguments,n=e.type,i=e.directives;return t+(hg(r)?Ke(`(
-`,su(pe(r,`
-`)),`
-)`):Ke("(",pe(r,", "),")"))+": "+n+Ke(" ",pe(i," "))}),InputValueDefinition:ur(function(e){var t=e.name,r=e.type,n=e.defaultValue,i=e.directives;return pe([t+": "+r,Ke("= ",n),pe(i," ")]," ")}),InterfaceTypeDefinition:ur(function(e){var t=e.name,r=e.interfaces,n=e.directives,i=e.fields;return pe(["interface",t,Ke("implements ",pe(r," & ")),pe(n," "),lr(i)]," ")}),UnionTypeDefinition:ur(function(e){var t=e.name,r=e.directives,n=e.types;return pe(["union",t,pe(r," "),n&&n.length!==0?"= "+pe(n," | "):""]," ")}),EnumTypeDefinition:ur(function(e){var t=e.name,r=e.directives,n=e.values;return pe(["enum",t,pe(r," "),lr(n)]," ")}),EnumValueDefinition:ur(function(e){var t=e.name,r=e.directives;return pe([t,pe(r," ")]," ")}),InputObjectTypeDefinition:ur(function(e){var t=e.name,r=e.directives,n=e.fields;return pe(["input",t,pe(r," "),lr(n)]," ")}),DirectiveDefinition:ur(function(e){var t=e.name,r=e.arguments,n=e.repeatable,i=e.locations;return"directive @"+t+(hg(r)?Ke(`(
-`,su(pe(r,`
-`)),`
-)`):Ke("(",pe(r,", "),")"))+(n?" repeatable":"")+" on "+pe(i," | ")}),SchemaExtension:function(t){var r=t.directives,n=t.operationTypes;return pe(["extend schema",pe(r," "),lr(n)]," ")},ScalarTypeExtension:function(t){var r=t.name,n=t.directives;return pe(["extend scalar",r,pe(n," ")]," ")},ObjectTypeExtension:function(t){var r=t.name,n=t.interfaces,i=t.directives,o=t.fields;return pe(["extend type",r,Ke("implements ",pe(n," & ")),pe(i," "),lr(o)]," ")},InterfaceTypeExtension:function(t){var r=t.name,n=t.interfaces,i=t.directives,o=t.fields;return pe(["extend interface",r,Ke("implements ",pe(n," & ")),pe(i," "),lr(o)]," ")},UnionTypeExtension:function(t){var r=t.name,n=t.directives,i=t.types;return pe(["extend union",r,pe(n," "),i&&i.length!==0?"= "+pe(i," | "):""]," ")},EnumTypeExtension:function(t){var r=t.name,n=t.directives,i=t.values;return pe(["extend enum",r,pe(n," "),lr(i)]," ")},InputObjectTypeExtension:function(t){var r=t.name,n=t.directives,i=t.fields;return pe(["extend input",r,pe(n," "),lr(i)]," ")}};function ur(e){return function(t){return pe([t.description,e(t)],`
-`)}}function pe(e){var t,r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"";return(t=e==null?void 0:e.filter(function(n){return n}).join(r))!==null&&t!==void 0?t:""}function lr(e){return Ke(`{
-`,su(pe(e,`
-`)),`
-}`)}function Ke(e,t){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"";return t!=null&&t!==""?e+t+r:""}function su(e){return Ke(" ",e.replace(/\n/g,`
- `))}function gx(e){return e.indexOf(`
-`)!==-1}function hg(e){return e!=null&&e.some(gx)}function bx(){return Xm()}function wx(){__DEV__?oe(typeof Uf=="boolean",Uf):oe(typeof Uf=="boolean",38)}bx();wx();function uu(e,t){var r=e.directives;return!r||!r.length?!0:xx(r).every(function(n){var i=n.directive,o=n.ifArgument,a=!1;return o.value.kind==="Variable"?(a=t&&t[o.value.name.value],__DEV__?oe(a!==void 0,"Invalid variable referenced in @"+i.name.value+" directive."):oe(a!==void 0,39)):a=o.value.value,i.name.value==="skip"?!a:a})}function Ex(e){var t=[];return Sr(e,{Directive:function(r){t.push(r.name.value)}}),t}function Yf(e,t){return Ex(t).some(function(r){return e.indexOf(r)>-1})}function Sx(e){return e&&Yf(["client"],e)&&Yf(["export"],e)}function Ox(e){var t=e.name.value;return t==="skip"||t==="include"}function xx(e){var t=[];return e&&e.length&&e.forEach(function(r){if(!!Ox(r)){var n=r.arguments,i=r.name.value;__DEV__?oe(n&&n.length===1,"Incorrect number of arguments for the @"+i+" directive."):oe(n&&n.length===1,40);var o=n[0];__DEV__?oe(o.name&&o.name.value==="if","Invalid argument for the @"+i+" directive."):oe(o.name&&o.name.value==="if",41);var a=o.value;__DEV__?oe(a&&(a.kind==="Variable"||a.kind==="BooleanValue"),"Argument for the @"+i+" directive must be a variable or a boolean value."):oe(a&&(a.kind==="Variable"||a.kind==="BooleanValue"),42),t.push({directive:r,ifArgument:o})}}),t}function _x(e,t){var r=t,n=[];e.definitions.forEach(function(o){if(o.kind==="OperationDefinition")throw __DEV__?new Ne("Found a "+o.operation+" operation"+(o.name?" named '"+o.name.value+"'":"")+". No operations are allowed when using a fragment as a query. Only fragments are allowed."):new Ne(43);o.kind==="FragmentDefinition"&&n.push(o)}),typeof r=="undefined"&&(__DEV__?oe(n.length===1,"Found "+n.length+" fragments. `fragmentName` must be provided when there is not exactly 1 fragment."):oe(n.length===1,44),r=n[0].name.value);var i=ee(ee({},e),{definitions:Js([{kind:"OperationDefinition",operation:"query",selectionSet:{kind:"SelectionSet",selections:[{kind:"FragmentSpread",name:{kind:"Name",value:r}}]}}],e.definitions,!0)});return i}function lu(e){e===void 0&&(e=[]);var t={};return e.forEach(function(r){t[r.name.value]=r}),t}function cu(e,t){switch(e.kind){case"InlineFragment":return e;case"FragmentSpread":{var r=t&&t[e.name.value];return __DEV__?oe(r,"No fragment named "+e.name.value+"."):oe(r,45),r}default:return null}}function Ze(e){return e!==null&&typeof e=="object"}function Pn(e){return{__ref:String(e)}}function je(e){return Boolean(e&&typeof e=="object"&&typeof e.__ref=="string")}function kx(e){return Ze(e)&&e.kind==="Document"&&Array.isArray(e.definitions)}function Tx(e){return e.kind==="StringValue"}function Cx(e){return e.kind==="BooleanValue"}function Ax(e){return e.kind==="IntValue"}function Px(e){return e.kind==="FloatValue"}function Dx(e){return e.kind==="Variable"}function Rx(e){return e.kind==="ObjectValue"}function Ix(e){return e.kind==="ListValue"}function Nx(e){return e.kind==="EnumValue"}function Lx(e){return e.kind==="NullValue"}function Oi(e,t,r,n){if(Ax(r)||Px(r))e[t.value]=Number(r.value);else if(Cx(r)||Tx(r))e[t.value]=r.value;else if(Rx(r)){var i={};r.fields.map(function(a){return Oi(i,a.name,a.value,n)}),e[t.value]=i}else if(Dx(r)){var o=(n||{})[r.name.value];e[t.value]=o}else if(Ix(r))e[t.value]=r.values.map(function(a){var s={};return Oi(s,t,a,n),s[t.value]});else if(Nx(r))e[t.value]=r.value;else if(Lx(r))e[t.value]=null;else throw __DEV__?new Ne('The inline argument "'+t.value+'" of kind "'+r.kind+'"is not supported. Use variables instead of inline arguments to overcome this limitation.'):new Ne(54)}function Mx(e,t){var r=null;e.directives&&(r={},e.directives.forEach(function(i){r[i.name.value]={},i.arguments&&i.arguments.forEach(function(o){var a=o.name,s=o.value;return Oi(r[i.name.value],a,s,t)})}));var n=null;return e.arguments&&e.arguments.length&&(n={},e.arguments.forEach(function(i){var o=i.name,a=i.value;return Oi(n,o,a,t)})),Xf(e.name.value,n,r)}var jx=["connection","include","skip","client","rest","export"],Xf=Object.assign(function(e,t,r){if(t&&r&&r.connection&&r.connection.key)if(r.connection.filter&&r.connection.filter.length>0){var n=r.connection.filter?r.connection.filter:[];n.sort();var i={};return n.forEach(function(s){i[s]=t[s]}),r.connection.key+"("+Wo(i)+")"}else return r.connection.key;var o=e;if(t){var a=Wo(t);o+="("+a+")"}return r&&Object.keys(r).forEach(function(s){jx.indexOf(s)===-1&&(r[s]&&Object.keys(r[s]).length?o+="@"+s+"("+Wo(r[s])+")":o+="@"+s)}),o},{setStringify:function(e){var t=Wo;return Wo=e,t}}),Wo=function(t){return JSON.stringify(t,Fx)};function Fx(e,t){return Ze(t)&&!Array.isArray(t)&&(t=Object.keys(t).sort().reduce(function(r,n){return r[n]=t[n],r},{})),t}function vg(e,t){if(e.arguments&&e.arguments.length){var r={};return e.arguments.forEach(function(n){var i=n.name,o=n.value;return Oi(r,i,o,t)}),r}return null}function Dn(e){return e.alias?e.alias.value:e.name.value}function Jf(e,t,r){if(typeof e.__typename=="string")return e.__typename;for(var n=0,i=t.selections;n1)for(var n=new op,i=1;i=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
-In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Yx(e,t){if(!!e){if(typeof e=="string")return _g(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if(r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set")return Array.from(e);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return _g(e,t)}}function _g(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r1,s=!1,l=arguments[1],f=l;return new o(function(y){return i.subscribe({next:function(b){var c=!s;if(s=!0,!c||a)try{f=n(f,b)}catch(m){return y.error(m)}else f=b},error:function(b){y.error(b)},complete:function(){if(!s&&!a)return y.error(new TypeError("Cannot reduce an empty sequence"));y.next(f),y.complete()}})})},t.concat=function(){for(var n=this,i=arguments.length,o=new Array(i),a=0;a=0&&s.splice(c,1),f()}});s.push(b)},error:function(y){a.error(y)},complete:function(){f()}});function f(){l.closed&&s.length===0&&a.complete()}return function(){s.forEach(function(y){return y.unsubscribe()}),l.unsubscribe()}})},t[cp]=function(){return this},e.from=function(n){var i=typeof this=="function"?this:e;if(n==null)throw new TypeError(n+" is not an object");var o=pu(n,cp);if(o){var a=o.call(n);if(Object(a)!==a)throw new TypeError(a+" is not an object");return Jx(a)&&a.constructor===i?a:new i(function(s){return a.subscribe(s)})}if(up("iterator")&&(o=pu(n,Xx),o))return new i(function(s){du(function(){if(!s.closed){for(var l=Gx(o.call(n)),f;!(f=l()).done;){var y=f.value;if(s.next(y),s.closed)return}s.complete()}})});if(Array.isArray(n))return new i(function(s){du(function(){if(!s.closed){for(var l=0;l0}function hu(e){return e.errors&&e.errors.length>0||!1}function ki(){for(var e=[],t=0;t")}function Fg(e){return new Ue(function(t){t.error(e)})}var Vg=function(e,t,r){var n=new Error(r);throw n.name="ServerError",n.response=e,n.statusCode=e.status,n.result=t,n};function s_(e){for(var t=["query","operationName","variables","extensions","context"],r=0,n=Object.keys(e);r=300&&Vg(t,r,"Response not successful: Received status code "+t.status),!Array.isArray(r)&&!Bg.call(r,"data")&&!Bg.call(r,"errors")&&Vg(t,r,"Server response was missing for query '"+(Array.isArray(e)?e.map(function(n){return n.operationName}):e.operationName)+"'."),r})}}var gp=function(e,t){var r;try{r=JSON.stringify(e)}catch(i){var n=__DEV__?new Ne("Network request failed. "+t+" is not serializable: "+i.message):new Ne(23);throw n.parseError=i,n}return r},d_={includeQuery:!0,includeExtensions:!1},h_={accept:"*/*","content-type":"application/json"},v_={method:"POST"},y_={http:d_,headers:h_,options:v_},m_=function(e,t){for(var r=[],n=2;n=0&&e.indexOf(t,r)===r}function Wg(e,t){var r=bp.get(e);if(r){if(r.has(t))return!0}else bp.set(e,r=new Set);return r.add(t),!1}var A_=function(){return Object.create(null)},Kg=Array.prototype,P_=Kg.forEach,D_=Kg.slice,ta=function(){function e(t,r){t===void 0&&(t=!0),r===void 0&&(r=A_),this.weakness=t,this.makeData=r}return e.prototype.lookup=function(){for(var t=[],r=0;rthis.max;)this.delete(this.oldest.key)},e.prototype.delete=function(t){var r=this.map.get(t);return r?(r===this.newest&&(this.newest=r.older),r===this.oldest&&(this.oldest=r.newer),r.newer&&(r.newer.older=r.older),r.older&&(r.older.newer=r.newer),this.map.delete(t),this.dispose(r.value,t),!0):!1},e}(),mu=new yu,Op,j_=Object.prototype.hasOwnProperty,xp=(Op=Array.from,Op===void 0?function(e){var t=[];return e.forEach(function(r){return t.push(r)}),t}:Op);function gu(e){var t=e.unsubscribe;typeof t=="function"&&(e.unsubscribe=void 0,t())}var ra=[],F_=100;function Ci(e,t){if(!e)throw new Error(t||"assertion failure")}function V_(e,t){var r=e.length;return r>0&&r===t.length&&e[r-1]===t[r-1]}function Yg(e){switch(e.length){case 0:throw new Error("unknown value");case 1:return e[0];case 2:throw e[1]}}function U_(e){return e.slice(0)}var B_=function(){function e(t){this.fn=t,this.parents=new Set,this.childValues=new Map,this.dirtyChildren=null,this.dirty=!0,this.recomputing=!1,this.value=[],this.deps=null,++e.count}return e.prototype.peek=function(){if(this.value.length===1&&!nn(this))return Xg(this),this.value[0]},e.prototype.recompute=function(t){return Ci(!this.recomputing,"already recomputing"),Xg(this),nn(this)?$_(this,t):Yg(this.value)},e.prototype.setDirty=function(){this.dirty||(this.dirty=!0,this.value.length=0,Jg(this),gu(this))},e.prototype.dispose=function(){var t=this;this.setDirty(),n0(this),_p(this,function(r,n){r.setDirty(),i0(r,t)})},e.prototype.forget=function(){this.dispose()},e.prototype.dependOn=function(t){t.add(this),this.deps||(this.deps=ra.pop()||new Set),this.deps.add(t)},e.prototype.forgetDeps=function(){var t=this;this.deps&&(xp(this.deps).forEach(function(r){return r.delete(t)}),this.deps.clear(),ra.push(this.deps),this.deps=null)},e.count=0,e}();function Xg(e){var t=mu.getValue();if(t)return e.parents.add(t),t.childValues.has(e)||t.childValues.set(e,[]),nn(e)?e0(t,e):t0(t,e),t}function $_(e,t){return n0(e),mu.withValue(e,z_,[e,t]),q_(e,t)&&Q_(e),Yg(e.value)}function z_(e,t){e.recomputing=!0,e.value.length=0;try{e.value[0]=e.fn.apply(null,t)}catch(r){e.value[1]=r}e.recomputing=!1}function nn(e){return e.dirty||!!(e.dirtyChildren&&e.dirtyChildren.size)}function Q_(e){e.dirty=!1,!nn(e)&&Zg(e)}function Jg(e){_p(e,e0)}function Zg(e){_p(e,t0)}function _p(e,t){var r=e.parents.size;if(r)for(var n=xp(e.parents),i=0;i0&&e.childValues.forEach(function(t,r){i0(e,r)}),e.forgetDeps(),Ci(e.dirtyChildren===null)}function i0(e,t){t.parents.delete(e),e.childValues.delete(t),r0(e,t)}function q_(e,t){if(typeof e.subscribe=="function")try{gu(e),e.unsubscribe=e.subscribe.apply(null,t)}catch(r){return e.setDirty(),!1}return!0}var H_={setDirty:!0,dispose:!0,forget:!0};function o0(e){var t=new Map,r=e&&e.subscribe;function n(i){var o=mu.getValue();if(o){var a=t.get(i);a||t.set(i,a=new Set),o.dependOn(a),typeof r=="function"&&(gu(a),a.unsubscribe=r(i))}}return n.dirty=function(o,a){var s=t.get(o);if(s){var l=a&&j_.call(H_,a)?a:"setDirty";xp(s).forEach(function(f){return f[l]()}),t.delete(o),gu(s)}},n}function a0(){var e=new ta(typeof WeakMap=="function");return function(){return e.lookupArray(arguments)}}a0();var kp=new Set;function bu(e,t){t===void 0&&(t=Object.create(null));var r=new M_(t.max||Math.pow(2,16),function(f){return f.dispose()}),n=t.keyArgs,i=t.makeCacheKey||a0(),o=function(){var f=i.apply(null,n?n.apply(null,arguments):arguments);if(f===void 0)return e.apply(null,arguments);var y=r.get(f);y||(r.set(f,y=new B_(e)),y.subscribe=t.subscribe,y.forget=function(){return r.delete(f)});var b=y.recompute(Array.prototype.slice.call(arguments));return r.set(f,y),kp.add(r),mu.hasValue()||(kp.forEach(function(c){return c.clean()}),kp.clear()),b};Object.defineProperty(o,"size",{get:function(){return r.map.size},configurable:!1,enumerable:!1});function a(f){var y=r.get(f);y&&y.setDirty()}o.dirtyKey=a,o.dirty=function(){a(i.apply(null,arguments))};function s(f){var y=r.get(f);if(y)return y.peek()}o.peekKey=s,o.peek=function(){return s(i.apply(null,arguments))};function l(f){return r.delete(f)}return o.forgetKey=l,o.forget=function(){return l(i.apply(null,arguments))},o.makeCacheKey=i,o.getKey=n?function(){return i.apply(null,n.apply(null,arguments))}:i,Object.freeze(o)}var W_=function(){function e(){this.getFragmentDoc=bu(_x)}return e.prototype.batch=function(t){var r=typeof t.optimistic=="string"?t.optimistic:t.optimistic===!1?null:void 0;this.performTransaction(t.update,r)},e.prototype.recordOptimisticTransaction=function(t,r){this.performTransaction(t,r)},e.prototype.transformDocument=function(t){return t},e.prototype.identify=function(t){},e.prototype.gc=function(){return[]},e.prototype.modify=function(t){return!1},e.prototype.transformForLink=function(t){return t},e.prototype.readQuery=function(t,r){return r===void 0&&(r=!!t.optimistic),this.read(ee(ee({},t),{rootId:t.id||"ROOT_QUERY",optimistic:r}))},e.prototype.readFragment=function(t,r){return r===void 0&&(r=!!t.optimistic),this.read(ee(ee({},t),{query:this.getFragmentDoc(t.fragment,t.fragmentName),rootId:t.id,optimistic:r}))},e.prototype.writeQuery=function(t){var r=t.id,n=t.data,i=Si(t,["id","data"]);return this.write(Object.assign(i,{dataId:r||"ROOT_QUERY",result:n}))},e.prototype.writeFragment=function(t){var r=t.id,n=t.data,i=t.fragment,o=t.fragmentName,a=Si(t,["id","data","fragment","fragmentName"]);return this.write(Object.assign(a,{query:this.getFragmentDoc(i,o),dataId:r,result:n}))},e}(),s0=function(e){Jt(t,e);function t(r,n,i,o){var a=e.call(this,r)||this;return a.message=r,a.path=n,a.query=i,a.variables=o,a.__proto__=t.prototype,a}return t}(Error),gt=Object.prototype.hasOwnProperty;function u0(e,t){var r=e.__typename,n=e.id,i=e._id;if(typeof r=="string"&&(t&&(t.keyObject=n!==void 0?{id:n}:i!==void 0?{_id:i}:void 0),n===void 0&&(n=i),n!==void 0))return r+":"+(typeof n=="number"||typeof n=="string"?n:JSON.stringify(n))}var l0={dataIdFromObject:u0,addTypename:!0,resultCaching:!0,canonizeResults:!1};function K_(e){return ki(l0,e)}function c0(e){var t=e.canonizeResults;return t===void 0?l0.canonizeResults:t}function G_(e,t){return je(t)?e.get(t.__ref,"__typename"):t&&t.__typename}var f0=/^[_a-z][_0-9a-z]*/i;function on(e){var t=e.match(f0);return t?t[0]:e}function Tp(e,t,r){return Ze(t)?Array.isArray(t)?t.every(function(n){return Tp(e,n,r)}):e.selections.every(function(n){if(cr(n)&&uu(n,r)){var i=Dn(n);return gt.call(t,i)&&(!n.selectionSet||Tp(n.selectionSet,t[i],r))}return!0}):!1}function na(e){return Ze(e)&&!je(e)&&!Array.isArray(e)}function Y_(){return new op}var wu=Object.create(null),Cp=function(){return wu},p0=Object.create(null),ia=function(){function e(t,r){var n=this;this.policies=t,this.group=r,this.data=Object.create(null),this.rootIds=Object.create(null),this.refs=Object.create(null),this.getFieldValue=function(i,o){return hp(je(i)?n.get(i.__ref,o):i&&i[o])},this.canRead=function(i){return je(i)?n.has(i.__ref):typeof i=="object"},this.toReference=function(i,o){if(typeof i=="string")return Pn(i);if(je(i))return i;var a=n.policies.identify(i)[0];if(a){var s=Pn(a);return o&&n.merge(a,i),s}}}return e.prototype.toObject=function(){return ee({},this.data)},e.prototype.has=function(t){return this.lookup(t,!0)!==void 0},e.prototype.get=function(t,r){if(this.group.depend(t,r),gt.call(this.data,t)){var n=this.data[t];if(n&>.call(n,r))return n[r]}if(r==="__typename"&>.call(this.policies.rootTypenamesById,t))return this.policies.rootTypenamesById[t];if(this instanceof an)return this.parent.get(t,r)},e.prototype.lookup=function(t,r){if(r&&this.group.depend(t,"__exists"),gt.call(this.data,t))return this.data[t];if(this instanceof an)return this.parent.lookup(t,r);if(this.policies.rootTypenamesById[t])return Object.create(null)},e.prototype.merge=function(t,r){var n=this,i;je(t)&&(t=t.__ref),je(r)&&(r=r.__ref);var o=typeof t=="string"?this.lookup(i=t):t,a=typeof r=="string"?this.lookup(i=r):r;if(!!a){__DEV__?oe(typeof i=="string","store.merge expects a string ID"):oe(typeof i=="string",1);var s=new op(J_).merge(o,a);if(this.data[i]=s,s!==o&&(delete this.refs[i],this.group.caching)){var l=Object.create(null);o||(l.__exists=1),Object.keys(a).forEach(function(f){if(!o||o[f]!==s[f]){l[f]=1;var y=on(f);y!==f&&!n.policies.hasKeyArgs(s.__typename,y)&&(l[y]=1),s[f]===void 0&&!(n instanceof an)&&delete s[f]}}),l.__typename&&!(o&&o.__typename)&&this.policies.rootTypenamesById[i]===s.__typename&&delete l.__typename,Object.keys(l).forEach(function(f){return n.group.dirty(i,f)})}}},e.prototype.modify=function(t,r){var n=this,i=this.lookup(t);if(i){var o=Object.create(null),a=!1,s=!0,l={DELETE:wu,INVALIDATE:p0,isReference:je,toReference:this.toReference,canRead:this.canRead,readField:function(f,y){return n.policies.readField(typeof f=="string"?{fieldName:f,from:y||Pn(t)}:f,{store:n})}};if(Object.keys(i).forEach(function(f){var y=on(f),b=i[f];if(b!==void 0){var c=typeof r=="function"?r:r[f]||r[y];if(c){var m=c===Cp?wu:c(hp(b),ee(ee({},l),{fieldName:y,storeFieldName:f,storage:n.getStorage(t,f)}));m===p0?n.group.dirty(t,f):(m===wu&&(m=void 0),m!==b&&(o[f]=m,a=!0,b=m))}b!==void 0&&(s=!1)}}),a)return this.merge(t,o),s&&(this instanceof an?this.data[t]=void 0:delete this.data[t],this.group.dirty(t,"__exists")),!0}return!1},e.prototype.delete=function(t,r,n){var i,o=this.lookup(t);if(o){var a=this.getFieldValue(o,"__typename"),s=r&&n?this.policies.getStoreFieldName({typename:a,fieldName:r,args:n}):r;return this.modify(t,s?(i={},i[s]=Cp,i):Cp)}return!1},e.prototype.evict=function(t,r){var n=!1;return t.id&&(gt.call(this.data,t.id)&&(n=this.delete(t.id,t.fieldName,t.args)),this instanceof an&&this!==r&&(n=this.parent.evict(t,r)||n),(t.fieldName||n)&&this.group.dirty(t.id,t.fieldName||"__exists")),n},e.prototype.clear=function(){this.replace(null)},e.prototype.extract=function(){var t=this,r=this.toObject(),n=[];return this.getRootIdSet().forEach(function(i){gt.call(t.policies.rootTypenamesById,i)||n.push(i)}),n.length&&(r.__META={extraRootIds:n.sort()}),r},e.prototype.replace=function(t){var r=this;if(Object.keys(this.data).forEach(function(o){t&>.call(t,o)||r.delete(o)}),t){var n=t.__META,i=Si(t,["__META"]);Object.keys(i).forEach(function(o){r.merge(o,i[o])}),n&&n.extraRootIds.forEach(this.retain,this)}},e.prototype.retain=function(t){return this.rootIds[t]=(this.rootIds[t]||0)+1},e.prototype.release=function(t){if(this.rootIds[t]>0){var r=--this.rootIds[t];return r||delete this.rootIds[t],r}return 0},e.prototype.getRootIdSet=function(t){return t===void 0&&(t=new Set),Object.keys(this.rootIds).forEach(t.add,t),this instanceof an?this.parent.getRootIdSet(t):Object.keys(this.policies.rootTypenamesById).forEach(t.add,t),t},e.prototype.gc=function(){var t=this,r=this.getRootIdSet(),n=this.toObject();r.forEach(function(a){gt.call(n,a)&&(Object.keys(t.findChildRefIds(a)).forEach(r.add,r),delete n[a])});var i=Object.keys(n);if(i.length){for(var o=this;o instanceof an;)o=o.parent;i.forEach(function(a){return o.delete(a)})}return i},e.prototype.findChildRefIds=function(t){if(!gt.call(this.refs,t)){var r=this.refs[t]=Object.create(null),n=this.data[t];if(!n)return r;var i=new Set([n]);i.forEach(function(o){je(o)&&(r[o.__ref]=!0),Ze(o)&&Object.keys(o).forEach(function(a){var s=o[a];Ze(s)&&i.add(s)})})}return this.refs[t]},e.prototype.makeCacheKey=function(){return this.group.keyMaker.lookupArray(arguments)},e}(),d0=function(){function e(t,r){r===void 0&&(r=null),this.caching=t,this.parent=r,this.d=null,this.resetCaching()}return e.prototype.resetCaching=function(){this.d=this.caching?o0():null,this.keyMaker=new ta(rn)},e.prototype.depend=function(t,r){if(this.d){this.d(Ap(t,r));var n=on(r);n!==r&&this.d(Ap(t,n)),this.parent&&this.parent.depend(t,r)}},e.prototype.dirty=function(t,r){this.d&&this.d.dirty(Ap(t,r),r==="__exists"?"forget":"setDirty")},e}();function Ap(e,t){return t+"#"+e}function h0(e,t){oa(e)&&e.group.depend(t,"__exists")}(function(e){var t=function(r){Jt(n,r);function n(i){var o=i.policies,a=i.resultCaching,s=a===void 0?!0:a,l=i.seed,f=r.call(this,o,new d0(s))||this;return f.stump=new X_(f),f.storageTrie=new ta(rn),l&&f.replace(l),f}return n.prototype.addLayer=function(i,o){return this.stump.addLayer(i,o)},n.prototype.removeLayer=function(){return this},n.prototype.getStorage=function(){return this.storageTrie.lookupArray(arguments)},n}(e);e.Root=t})(ia||(ia={}));var an=function(e){Jt(t,e);function t(r,n,i,o){var a=e.call(this,n.policies,o)||this;return a.id=r,a.parent=n,a.replay=i,a.group=o,i(a),a}return t.prototype.addLayer=function(r,n){return new t(r,this,n,this.group)},t.prototype.removeLayer=function(r){var n=this,i=this.parent.removeLayer(r);return r===this.id?(this.group.caching&&Object.keys(this.data).forEach(function(o){var a=n.data[o],s=i.lookup(o);s?a?a!==s&&Object.keys(a).forEach(function(l){ze(a[l],s[l])||n.group.dirty(o,l)}):(n.group.dirty(o,"__exists"),Object.keys(s).forEach(function(l){n.group.dirty(o,l)})):n.delete(o)}),i):i===this.parent?this:i.addLayer(this.id,this.replay)},t.prototype.toObject=function(){return ee(ee({},this.parent.toObject()),this.data)},t.prototype.findChildRefIds=function(r){var n=this.parent.findChildRefIds(r);return gt.call(this.data,r)?ee(ee({},n),e.prototype.findChildRefIds.call(this,r)):n},t.prototype.getStorage=function(){for(var r=this.parent;r.parent;)r=r.parent;return r.getStorage.apply(r,arguments)},t}(ia),X_=function(e){Jt(t,e);function t(r){return e.call(this,"EntityStore.Stump",r,function(){},new d0(r.group.caching,r.group))||this}return t.prototype.removeLayer=function(){return this},t.prototype.merge=function(){return this.parent.merge.apply(this.parent,arguments)},t}(an);function J_(e,t,r){var n=e[r],i=t[r];return ze(n,i)?n:i}function oa(e){return!!(e instanceof ia&&e.group.caching)}function Z_(e){return Ze(e)?Array.isArray(e)?e.slice(0):ee({__proto__:Object.getPrototypeOf(e)},e):e}var Pp=function(){function e(){this.known=new(a_?WeakSet:Set),this.pool=new ta(rn),this.passes=new WeakMap,this.keysByJSON=new Map,this.empty=this.admit({})}return e.prototype.isKnown=function(t){return Ze(t)&&this.known.has(t)},e.prototype.pass=function(t){if(Ze(t)){var r=Z_(t);return this.passes.set(r,t),r}return t},e.prototype.admit=function(t){var r=this;if(Ze(t)){var n=this.passes.get(t);if(n)return n;var i=Object.getPrototypeOf(t);switch(i){case Array.prototype:{if(this.known.has(t))return t;var o=t.map(this.admit,this),a=this.pool.lookupArray(o);return a.array||(this.known.add(a.array=o),__DEV__&&Object.freeze(o)),a.array}case null:case Object.prototype:{if(this.known.has(t))return t;var s=Object.getPrototypeOf(t),l=[s],f=this.sortedKeys(t);l.push(f.json);var y=l.length;f.sorted.forEach(function(m){l.push(r.admit(t[m]))});var a=this.pool.lookupArray(l);if(!a.object){var b=a.object=Object.create(s);this.known.add(b),f.sorted.forEach(function(m,u){b[m]=l[y+u]}),__DEV__&&Object.freeze(b)}return a.object}}}return t},e.prototype.sortedKeys=function(t){var r=Object.keys(t),n=this.pool.lookupArray(r);if(!n.keys){r.sort();var i=JSON.stringify(r);(n.keys=this.keysByJSON.get(i))||this.keysByJSON.set(i,n.keys={sorted:r,json:i})}return n.keys},e}(),Rn=Object.assign(function(e){if(Ze(e)){Dp===void 0&&v0();var t=Dp.admit(e),r=Rp.get(t);return r===void 0&&Rp.set(t,r=JSON.stringify(t)),r}return JSON.stringify(e)},{reset:v0}),Dp,Rp;function v0(){Dp=new Pp,Rp=new(rn?WeakMap:Map)}function y0(e,t){return new s0(e.message,t.path.slice(),t.query,t.variables)}function m0(e){return[e.selectionSet,e.objectOrReference,e.context,e.context.canonizeResults]}var ek=function(){function e(t){var r=this;this.knownResults=new(rn?WeakMap:Map),this.config=ki(t,{addTypename:t.addTypename!==!1,canonizeResults:c0(t)}),this.canon=t.canon||new Pp,this.executeSelectionSet=bu(function(n){var i,o=n.context.canonizeResults,a=m0(n);a[3]=!o;var s=(i=r.executeSelectionSet).peek.apply(i,a);return s?o?ee(ee({},s),{result:r.canon.admit(s.result)}):s:(h0(n.context.store,n.enclosingRef.__ref),r.execSelectionSetImpl(n))},{max:this.config.resultCacheMaxSize,keyArgs:m0,makeCacheKey:function(n,i,o,a){if(oa(o.store))return o.store.makeCacheKey(n,je(i)?i.__ref:i,o.varString,a)}}),this.executeSubSelectedArray=bu(function(n){return h0(n.context.store,n.enclosingRef.__ref),r.execSubSelectedArrayImpl(n)},{max:this.config.resultCacheMaxSize,makeCacheKey:function(n){var i=n.field,o=n.array,a=n.context;if(oa(a.store))return a.store.makeCacheKey(i,o,a.varString)}})}return e.prototype.resetCanon=function(){this.canon=new Pp},e.prototype.diffQueryAgainstStore=function(t){var r=t.store,n=t.query,i=t.rootId,o=i===void 0?"ROOT_QUERY":i,a=t.variables,s=t.returnPartialData,l=s===void 0?!0:s,f=t.canonizeResults,y=f===void 0?this.config.canonizeResults:f,b=this.config.cache.policies;a=ee(ee({},tp(mg(n))),a);var c=Pn(o),m=this.executeSelectionSet({selectionSet:ep(n).selectionSet,objectOrReference:c,enclosingRef:c,context:{store:r,query:n,policies:b,variables:a,varString:Rn(a),canonizeResults:y,fragmentMap:lu(fu(n)),path:[]}}),u=m.missing&&m.missing.length>0;if(u&&!l)throw m.missing[0];return{result:m.result,missing:m.missing,complete:!u}},e.prototype.isFresh=function(t,r,n,i){if(oa(i.store)&&this.knownResults.get(t)===n){var o=this.executeSelectionSet.peek(n,r,i,this.canon.isKnown(t));if(o&&t===o.result)return!0}return!1},e.prototype.execSelectionSetImpl=function(t){var r=this,n=t.selectionSet,i=t.objectOrReference,o=t.enclosingRef,a=t.context;if(je(i)&&!a.policies.rootTypenamesById[i.__ref]&&!a.store.has(i.__ref))return{result:this.canon.empty,missing:[y0(__DEV__?new Ne("Dangling reference to missing "+i.__ref+" object"):new Ne(5),a)]};var s=a.variables,l=a.policies,f=a.store,y=[],b={result:null},c=f.getFieldValue(i,"__typename");this.config.addTypename&&typeof c=="string"&&!l.rootIdsByTypename[c]&&y.push({__typename:c});function m(){return b.missing||(b.missing=[])}function u(d){var v;return d.missing&&(v=m()).push.apply(v,d.missing),d.result}var h=new Set(n.selections);h.forEach(function(d){var v;if(!!uu(d,s))if(cr(d)){var g=l.readField({fieldName:d.name.value,field:d,variables:a.variables,from:i},a),w=Dn(d);a.path.push(w),g===void 0?np.added(d)||m().push(y0(__DEV__?new Ne("Can't find field '"+d.name.value+"' on "+(je(i)?i.__ref+" object":"object "+JSON.stringify(i,null,2))):new Ne(6),a)):Array.isArray(g)?g=u(r.executeSubSelectedArray({field:d,array:g,enclosingRef:o,context:a})):d.selectionSet?g!=null&&(g=u(r.executeSelectionSet({selectionSet:d.selectionSet,objectOrReference:g,enclosingRef:je(g)?g:o,context:a}))):a.canonizeResults&&(g=r.canon.pass(g)),g!==void 0&&y.push((v={},v[w]=g,v)),oe(a.path.pop()===w)}else{var _=cu(d,a.fragmentMap);_&&l.fragmentMatches(_,c)&&_.selectionSet.selections.forEach(h.add,h)}});var p=ip(y);return b.result=a.canonizeResults?this.canon.admit(p):hp(p),this.knownResults.set(b.result,n),b},e.prototype.execSubSelectedArrayImpl=function(t){var r=this,n=t.field,i=t.array,o=t.enclosingRef,a=t.context,s;function l(f,y){return f.missing&&(s=s||[],s.push.apply(s,f.missing)),oe(a.path.pop()===y),f.result}return n.selectionSet&&(i=i.filter(a.store.canRead)),i=i.map(function(f,y){return f===null?null:(a.path.push(y),Array.isArray(f)?l(r.executeSubSelectedArray({field:n,array:f,enclosingRef:o,context:a}),y):n.selectionSet?l(r.executeSelectionSet({selectionSet:n.selectionSet,objectOrReference:f,enclosingRef:je(f)?f:o,context:a}),y):(__DEV__&&tk(a.store,n,f),oe(a.path.pop()===y),f))}),{result:a.canonizeResults?this.canon.admit(i):i,missing:s}},e}();function tk(e,t,r){if(!t.selectionSet){var n=new Set([r]);n.forEach(function(i){Ze(i)&&(__DEV__?oe(!je(i),"Missing selection set for object of type "+G_(e,i)+" returned for query field "+t.name.value):oe(!je(i),7),Object.values(i).forEach(n.add,n))})}}var rk=function(){function e(t,r){this.cache=t,this.reader=r}return e.prototype.writeToStore=function(t,r){var n=this,i=r.query,o=r.result,a=r.dataId,s=r.variables,l=r.overwrite,f=Go(i),y=Y_();s=ee(ee({},tp(f)),s);var b={store:t,written:Object.create(null),merge:function(m,u){return y.merge(m,u)},variables:s,varString:Rn(s),fragmentMap:lu(fu(i)),overwrite:!!l,incomingById:new Map,clientOnly:!1},c=this.processSelectionSet({result:o||Object.create(null),dataId:a,selectionSet:f.selectionSet,mergeTree:{map:new Map},context:b});if(!je(c))throw __DEV__?new Ne("Could not identify object "+JSON.stringify(o)):new Ne(8);return b.incomingById.forEach(function(m,u){var h=m.fields,p=m.mergeTree,d=m.selections,v=Pn(u);if(p&&p.map.size){var g=n.applyMerges(p,v,h,b);if(je(g))return;h=g}if(__DEV__&&!b.overwrite){var w=function(T){return _.has(on(T))},_=new Set;d.forEach(function(T){cr(T)&&T.selectionSet&&_.add(T.name.value)});var x=function(T){var P=p&&p.map.get(T);return Boolean(P&&P.info&&P.info.merge)};Object.keys(h).forEach(function(T){w(T)&&!x(T)&&nk(v,h,T,b.store)})}t.merge(u,h)}),t.retain(c.__ref),c},e.prototype.processSelectionSet=function(t){var r=this,n=t.dataId,i=t.result,o=t.selectionSet,a=t.context,s=t.mergeTree,l=this.cache.policies,f=l.identify(i,o,a.fragmentMap),y=f[0],b=f[1];if(n=n||y,typeof n=="string"){var c=a.written[n]||(a.written[n]=[]),m=Pn(n);if(c.indexOf(o)>=0||(c.push(o),this.reader&&this.reader.isFresh(i,m,o,a)))return m}var u=Object.create(null);b&&(u=a.merge(u,b));var h=n&&l.rootTypenamesById[n]||Jf(i,o,a.fragmentMap)||n&&a.store.get(n,"__typename");typeof h=="string"&&(u.__typename=h);var p=new Set(o.selections);if(p.forEach(function(v){var g;if(!!uu(v,a.variables))if(cr(v)){var w=Dn(v),_=i[w],x=a.clientOnly;if(a.clientOnly=x||!!(v.directives&&v.directives.some(function(K){return K.name.value==="client"})),_!==void 0){var T=l.getStoreFieldName({typename:h,fieldName:v.name.value,field:v,variables:a.variables}),P=b0(s,T),I=r.processFieldValue(_,v,a,P),M=void 0;if(v.selectionSet&&(M=a.store.getFieldValue(I,"__typename"),!M&&je(I))){var B=a.incomingById.get(I.__ref);M=B&&B.fields.__typename}var $=l.getMergeFunction(h,v.name.value,M);$?P.info={field:v,typename:h,merge:$}:w0(s,T),u=a.merge(u,(g={},g[T]=I,g))}else!a.clientOnly&&!np.added(v)&&__DEV__&&oe.error(("Missing field '"+Dn(v)+"' while writing result "+JSON.stringify(i,null,2)).substring(0,1e3));a.clientOnly=x}else{var W=cu(v,a.fragmentMap);W&&l.fragmentMatches(W,h,i,a.variables)&&W.selectionSet.selections.forEach(p.add,p)}}),typeof n=="string"){var d=a.incomingById.get(n);return d?(d.fields=a.merge(d.fields,u),d.mergeTree=Ip(d.mergeTree,s),d.selections.forEach(p.add,p),d.selections=p):a.incomingById.set(n,{fields:u,mergeTree:Eu(s)?void 0:s,selections:p}),Pn(n)}return u},e.prototype.processFieldValue=function(t,r,n,i){var o=this;return!r.selectionSet||t===null?__DEV__?Rg(t):t:Array.isArray(t)?t.map(function(a,s){var l=o.processFieldValue(a,r,n,b0(i,s));return w0(i,s),l}):this.processSelectionSet({result:t,selectionSet:r.selectionSet,context:n,mergeTree:i})},e.prototype.applyMerges=function(t,r,n,i,o){var a,s=this;if(t.map.size&&!je(n)){var l=!Array.isArray(n)&&(je(r)||na(r))?r:void 0,f=n;l&&!o&&(o=[je(l)?l.__ref:l]);var y,b=function(c,m){return Array.isArray(c)?typeof m=="number"?c[m]:void 0:i.store.getFieldValue(c,String(m))};t.map.forEach(function(c,m){var u=b(l,m),h=b(f,m);if(h!==void 0){o&&o.push(m);var p=s.applyMerges(c,u,h,i,o);p!==h&&(y=y||new Map,y.set(m,p)),o&&oe(o.pop()===m)}}),y&&(n=Array.isArray(f)?f.slice(0):ee({},f),y.forEach(function(c,m){n[m]=c}))}return t.info?this.cache.policies.runMergeFunction(r,n,t.info,i,o&&(a=i.store).getStorage.apply(a,o)):n},e}(),g0=[];function b0(e,t){var r=e.map;return r.has(t)||r.set(t,g0.pop()||{map:new Map}),r.get(t)}function Ip(e,t){if(e===t||!t||Eu(t))return e;if(!e||Eu(e))return t;var r=e.info&&t.info?ee(ee({},e.info),t.info):e.info||t.info,n=e.map.size&&t.map.size,i=n?new Map:e.map.size?e.map:t.map,o={info:r,map:i};if(n){var a=new Set(t.map.keys());e.map.forEach(function(s,l){o.map.set(l,Ip(s,t.map.get(l))),a.delete(l)}),a.forEach(function(s){o.map.set(s,Ip(t.map.get(s),e.map.get(s)))})}return o}function Eu(e){return!e||!(e.info||e.map.size)}function w0(e,t){var r=e.map,n=r.get(t);n&&Eu(n)&&(g0.push(n),r.delete(t))}var E0=new Set;function nk(e,t,r,n){var i=function(b){var c=n.getFieldValue(b,r);return typeof c=="object"&&c},o=i(e);if(!!o){var a=i(t);if(!!a&&!je(o)&&!ze(o,a)&&!Object.keys(o).every(function(b){return n.getFieldValue(a,b)!==void 0})){var s=n.getFieldValue(e,"__typename")||n.getFieldValue(t,"__typename"),l=on(r),f=s+"."+l;if(!E0.has(f)){E0.add(f);var y=[];!Array.isArray(o)&&!Array.isArray(a)&&[o,a].forEach(function(b){var c=n.getFieldValue(b,"__typename");typeof c=="string"&&!y.includes(c)&&y.push(c)}),__DEV__&&oe.warn("Cache data may be lost when replacing the "+l+" field of a "+s+` object.
-
-To address this problem (which is not a bug in Apollo Client), `+(y.length?"either ensure all objects of type "+y.join(" and ")+" have an ID or a custom merge function, or ":"")+"define a custom merge function for the "+f+` field, so InMemoryCache can safely merge these objects:
-
- existing: `+JSON.stringify(o).slice(0,1e3)+`
- incoming: `+JSON.stringify(a).slice(0,1e3)+`
-
-For more information about these options, please refer to the documentation:
-
- * Ensuring entity objects have IDs: https://go.apollo.dev/c/generating-unique-identifiers
- * Defining custom merge functions: https://go.apollo.dev/c/merging-non-normalized-objects
-`)}}}}var Np=new yu,S0=new WeakMap;function aa(e){var t=S0.get(e);return t||S0.set(e,t={vars:new Set,dep:o0()}),t}function O0(e){aa(e).vars.forEach(function(t){return t.forgetCache(e)})}function ik(e){aa(e).vars.forEach(function(t){return t.attachCache(e)})}function ok(e){var t=new Set,r=new Set,n=function(o){if(arguments.length>0){if(e!==o){e=o,t.forEach(function(l){aa(l).dep.dirty(n),ak(l)});var a=Array.from(r);r.clear(),a.forEach(function(l){return l(e)})}}else{var s=Np.getValue();s&&(i(s),aa(s).dep(n))}return e};n.onNextChange=function(o){return r.add(o),function(){r.delete(o)}};var i=n.attachCache=function(o){return t.add(o),aa(o).vars.add(n),n};return n.forgetCache=function(o){return t.delete(o)},n}function ak(e){e.broadcastWatches&&e.broadcastWatches()}Xf.setStringify(Rn);function Lp(e){return e.args!==void 0?e.args:e.field?vg(e.field,e.variables):null}var sk=function(){},x0=function(e,t){return t.fieldName},_0=function(e,t,r){var n=r.mergeObjects;return n(e,t)},k0=function(e,t){return t},uk=function(){function e(t){this.config=t,this.typePolicies=Object.create(null),this.toBeAdded=Object.create(null),this.supertypeMap=new Map,this.fuzzySubtypes=new Map,this.rootIdsByTypename=Object.create(null),this.rootTypenamesById=Object.create(null),this.usingPossibleTypes=!1,this.config=ee({dataIdFromObject:u0},t),this.cache=this.config.cache,this.setRootTypename("Query"),this.setRootTypename("Mutation"),this.setRootTypename("Subscription"),t.possibleTypes&&this.addPossibleTypes(t.possibleTypes),t.typePolicies&&this.addTypePolicies(t.typePolicies)}return e.prototype.identify=function(t,r,n){var i=r&&n?Jf(t,r,n):t.__typename;if(i===this.rootTypenamesById.ROOT_QUERY)return["ROOT_QUERY"];for(var o={typename:i,selectionSet:r,fragmentMap:n},a,s=i&&this.getTypePolicy(i),l=s&&s.keyFn||this.config.dataIdFromObject;l;){var f=l(t,o);if(Array.isArray(f))l=P0(f);else{a=f;break}}return a=a?String(a):void 0,o.keyObject?[a,o.keyObject]:[a]},e.prototype.addTypePolicies=function(t){var r=this;Object.keys(t).forEach(function(n){var i=t[n],o=i.queryType,a=i.mutationType,s=i.subscriptionType,l=Si(i,["queryType","mutationType","subscriptionType"]);o&&r.setRootTypename("Query",n),a&&r.setRootTypename("Mutation",n),s&&r.setRootTypename("Subscription",n),gt.call(r.toBeAdded,n)?r.toBeAdded[n].push(l):r.toBeAdded[n]=[l]})},e.prototype.updateTypePolicy=function(t,r){var n=this,i=this.getTypePolicy(t),o=r.keyFields,a=r.fields;function s(l,f){l.merge=typeof f=="function"?f:f===!0?_0:f===!1?k0:l.merge}s(i,r.merge),i.keyFn=o===!1?sk:Array.isArray(o)?P0(o):typeof o=="function"?o:i.keyFn,a&&Object.keys(a).forEach(function(l){var f=n.getFieldPolicy(t,l,!0),y=a[l];if(typeof y=="function")f.read=y;else{var b=y.keyArgs,c=y.read,m=y.merge;f.keyFn=b===!1?x0:Array.isArray(b)?A0(b):typeof b=="function"?b:f.keyFn,typeof c=="function"&&(f.read=c),s(f,m)}f.read&&f.merge&&(f.keyFn=f.keyFn||x0)})},e.prototype.setRootTypename=function(t,r){r===void 0&&(r=t);var n="ROOT_"+t.toUpperCase(),i=this.rootTypenamesById[n];r!==i&&(__DEV__?oe(!i||i===t,"Cannot change root "+t+" __typename more than once"):oe(!i||i===t,2),i&&delete this.rootIdsByTypename[i],this.rootIdsByTypename[r]=n,this.rootTypenamesById[n]=r)},e.prototype.addPossibleTypes=function(t){var r=this;this.usingPossibleTypes=!0,Object.keys(t).forEach(function(n){r.getSupertypeSet(n,!0),t[n].forEach(function(i){r.getSupertypeSet(i,!0).add(n);var o=i.match(f0);(!o||o[0]!==i)&&r.fuzzySubtypes.set(i,new RegExp(i))})})},e.prototype.getTypePolicy=function(t){var r=this;if(!gt.call(this.typePolicies,t)){var n=this.typePolicies[t]=Object.create(null);n.fields=Object.create(null);var i=this.supertypeMap.get(t);i&&i.size&&i.forEach(function(a){var s=r.getTypePolicy(a),l=s.fields,f=Si(s,["fields"]);Object.assign(n,f),Object.assign(n.fields,l)})}var o=this.toBeAdded[t];return o&&o.length&&o.splice(0).forEach(function(a){r.updateTypePolicy(t,a)}),this.typePolicies[t]},e.prototype.getFieldPolicy=function(t,r,n){if(t){var i=this.getTypePolicy(t).fields;return i[r]||n&&(i[r]=Object.create(null))}},e.prototype.getSupertypeSet=function(t,r){var n=this.supertypeMap.get(t);return!n&&r&&this.supertypeMap.set(t,n=new Set),n},e.prototype.fragmentMatches=function(t,r,n,i){var o=this;if(!t.typeCondition)return!0;if(!r)return!1;var a=t.typeCondition.name.value;if(r===a)return!0;if(this.usingPossibleTypes&&this.supertypeMap.has(a))for(var s=this.getSupertypeSet(r,!0),l=[s],f=function(u){var h=o.getSupertypeSet(u,!1);h&&h.size&&l.indexOf(h)<0&&l.push(h)},y=!!(n&&this.fuzzySubtypes.size),b=!1,c=0;c1?c:t};else if(Ze(b))m=ee({},b),gt.call(b,"from")||(m.from=t);else{__DEV__&&oe.warn("Unexpected readField arguments: "+jg(Array.from(arguments)));return}return __DEV__&&m.from===void 0&&__DEV__&&oe.warn("Undefined 'from' passed to readField with arguments "+jg(Array.from(arguments))),m.variables===void 0&&(m.variables=s),e.readField(m,n)},mergeObjects:C0(n.store)}}function C0(e){return function(r,n){if(Array.isArray(r)||Array.isArray(n))throw __DEV__?new Ne("Cannot automatically merge arrays"):new Ne(3);if(Ze(r)&&Ze(n)){var i=e.getFieldValue(r,"__typename"),o=e.getFieldValue(n,"__typename"),a=i&&o&&i!==o;if(a)return n;if(je(r)&&na(n))return e.merge(r.__ref,n),r;if(na(r)&&je(n))return e.merge(r,n.__ref),n;if(na(r)&&na(n))return ee(ee({},r),n)}return n}}function A0(e){return function(t,r){return t?r.fieldName+":"+JSON.stringify(Mp(t,e,!1)):r.fieldName}}function P0(e){var t=new ta(rn);return function(r,n){var i;if(n.selectionSet&&n.fragmentMap){var o=t.lookupArray([n.selectionSet,n.fragmentMap]);i=o.aliasMap||(o.aliasMap=D0(n.selectionSet,n.fragmentMap))}var a=n.keyObject=Mp(r,e,!0,i);return n.typename+":"+JSON.stringify(a)}}function D0(e,t){var r=Object.create(null),n=new Set([e]);return n.forEach(function(i){i.selections.forEach(function(o){if(cr(o)){if(o.alias){var a=o.alias.value,s=o.name.value;if(s!==a){var l=r.aliases||(r.aliases=Object.create(null));l[s]=a}}if(o.selectionSet){var f=r.subsets||(r.subsets=Object.create(null));f[o.name.value]=D0(o.selectionSet,t)}}else{var y=cu(o,t);y&&n.add(y.selectionSet)}})}),r}function Mp(e,t,r,n){var i=Object.create(null),o,a;return t.forEach(function(s){if(Array.isArray(s)){if(typeof a=="string"&&typeof o=="string"){var l=n&&n.subsets,f=l&&l[a];i[a]=Mp(e[o],s,r,f)}}else{var y=n&&n.aliases,b=y&&y[s]||s;gt.call(e,b)?i[a=s]=e[o=b]:(__DEV__?oe(!r,"Missing field '"+b+"' while computing key fields"):oe(!r,4),o=a=void 0)}}),i}var VA=function(e){Jt(t,e);function t(r){r===void 0&&(r={});var n=e.call(this)||this;return n.watches=new Set,n.typenameDocumentCache=new Map,n.makeVar=ok,n.txCount=0,n.config=K_(r),n.addTypename=!!n.config.addTypename,n.policies=new uk({cache:n,dataIdFromObject:n.config.dataIdFromObject,possibleTypes:n.config.possibleTypes,typePolicies:n.config.typePolicies}),n.init(),n}return t.prototype.init=function(){var r=this.data=new ia.Root({policies:this.policies,resultCaching:this.config.resultCaching});this.optimisticData=r.stump,this.resetResultCache()},t.prototype.resetResultCache=function(r){var n=this,i=this.storeReader;this.storeWriter=new rk(this,this.storeReader=new ek({cache:this,addTypename:this.addTypename,resultCacheMaxSize:this.config.resultCacheMaxSize,canonizeResults:c0(this.config),canon:r?void 0:i&&i.canon})),this.maybeBroadcastWatch=bu(function(o,a){return n.broadcastWatch(o,a)},{max:this.config.resultCacheMaxSize,makeCacheKey:function(o){var a=o.optimistic?n.optimisticData:n.data;if(oa(a)){var s=o.optimistic,l=o.rootId,f=o.variables;return a.makeCacheKey(o.query,o.callback,Rn({optimistic:s,rootId:l,variables:f}))}}}),new Set([this.data.group,this.optimisticData.group]).forEach(function(o){return o.resetCaching()})},t.prototype.restore=function(r){return this.init(),r&&this.data.replace(r),this},t.prototype.extract=function(r){return r===void 0&&(r=!1),(r?this.optimisticData:this.data).extract()},t.prototype.read=function(r){var n=r.returnPartialData,i=n===void 0?!1:n;try{return this.storeReader.diffQueryAgainstStore(ee(ee({},r),{store:r.optimistic?this.optimisticData:this.data,config:this.config,returnPartialData:i})).result||null}catch(o){if(o instanceof s0)return null;throw o}},t.prototype.write=function(r){try{return++this.txCount,this.storeWriter.writeToStore(this.data,r)}finally{!--this.txCount&&r.broadcast!==!1&&this.broadcastWatches()}},t.prototype.modify=function(r){if(gt.call(r,"id")&&!r.id)return!1;var n=r.optimistic?this.optimisticData:this.data;try{return++this.txCount,n.modify(r.id||"ROOT_QUERY",r.fields)}finally{!--this.txCount&&r.broadcast!==!1&&this.broadcastWatches()}},t.prototype.diff=function(r){return this.storeReader.diffQueryAgainstStore(ee(ee({},r),{store:r.optimistic?this.optimisticData:this.data,rootId:r.id||"ROOT_QUERY",config:this.config}))},t.prototype.watch=function(r){var n=this;return this.watches.size||ik(this),this.watches.add(r),r.immediate&&this.maybeBroadcastWatch(r),function(){n.watches.delete(r)&&!n.watches.size&&O0(n),n.maybeBroadcastWatch.forget(r)}},t.prototype.gc=function(r){Rn.reset();var n=this.optimisticData.gc();return r&&!this.txCount&&(r.resetResultCache?this.resetResultCache(r.resetResultIdentities):r.resetResultIdentities&&this.storeReader.resetCanon()),n},t.prototype.retain=function(r,n){return(n?this.optimisticData:this.data).retain(r)},t.prototype.release=function(r,n){return(n?this.optimisticData:this.data).release(r)},t.prototype.identify=function(r){return je(r)?r.__ref:this.policies.identify(r)[0]},t.prototype.evict=function(r){if(!r.id){if(gt.call(r,"id"))return!1;r=ee(ee({},r),{id:"ROOT_QUERY"})}try{return++this.txCount,this.optimisticData.evict(r,this.data)}finally{!--this.txCount&&r.broadcast!==!1&&this.broadcastWatches()}},t.prototype.reset=function(r){var n=this;return this.init(),Rn.reset(),r&&r.discardWatches?(this.watches.forEach(function(i){return n.maybeBroadcastWatch.forget(i)}),this.watches.clear(),O0(this)):this.broadcastWatches(),Promise.resolve()},t.prototype.removeOptimistic=function(r){var n=this.optimisticData.removeLayer(r);n!==this.optimisticData&&(this.optimisticData=n,this.broadcastWatches())},t.prototype.batch=function(r){var n=this,i=r.update,o=r.optimistic,a=o===void 0?!0:o,s=r.removeOptimistic,l=r.onWatchUpdated,f=function(b){var c=n,m=c.data,u=c.optimisticData;++n.txCount,b&&(n.data=n.optimisticData=b);try{i(n)}finally{--n.txCount,n.data=m,n.optimisticData=u}},y=new Set;l&&!this.txCount&&this.broadcastWatches(ee(ee({},r),{onWatchUpdated:function(b){return y.add(b),!1}})),typeof a=="string"?this.optimisticData=this.optimisticData.addLayer(a,f):a===!1?f(this.data):f(),typeof s=="string"&&(this.optimisticData=this.optimisticData.removeLayer(s)),l&&y.size?(this.broadcastWatches(ee(ee({},r),{onWatchUpdated:function(b,c){var m=l.call(this,b,c);return m!==!1&&y.delete(b),m}})),y.size&&y.forEach(function(b){return n.maybeBroadcastWatch.dirty(b)})):this.broadcastWatches(r)},t.prototype.performTransaction=function(r,n){return this.batch({update:r,optimistic:n||n!==null})},t.prototype.transformDocument=function(r){if(this.addTypename){var n=this.typenameDocumentCache.get(r);return n||(n=np(r),this.typenameDocumentCache.set(r,n),this.typenameDocumentCache.set(n,n)),n}return r},t.prototype.broadcastWatches=function(r){var n=this;this.txCount||this.watches.forEach(function(i){return n.maybeBroadcastWatch(i,r)})},t.prototype.broadcastWatch=function(r,n){var i=r.lastDiff,o=this.diff(r);n&&(r.optimistic&&typeof n.optimistic=="string"&&(o.fromOptimisticTransaction=!0),n.onWatchUpdated&&n.onWatchUpdated.call(this,r,o,i)===!1)||(!i||!ze(i.result,o.result))&&r.callback(r.lastDiff=o,i)},t}(W_);function lk(e){return e.hasOwnProperty("graphQLErrors")}var ck=function(e){var t="";if(_i(e.graphQLErrors)||_i(e.clientErrors)){var r=(e.graphQLErrors||[]).concat(e.clientErrors||[]);r.forEach(function(n){var i=n?n.message:"Error message not found.";t+=i+`
-`})}return e.networkError&&(t+=e.networkError.message+`
-`),t=t.replace(/\n$/,""),t},In=function(e){Jt(t,e);function t(r){var n=r.graphQLErrors,i=r.clientErrors,o=r.networkError,a=r.errorMessage,s=r.extraInfo,l=e.call(this,a)||this;return l.graphQLErrors=n||[],l.clientErrors=i||[],l.networkError=o||null,l.message=a||ck(l),l.extraInfo=s,l.__proto__=t.prototype,l}return t}(Error),Me;(function(e){e[e.loading=1]="loading",e[e.setVariables=2]="setVariables",e[e.fetchMore=3]="fetchMore",e[e.refetch=4]="refetch",e[e.poll=6]="poll",e[e.ready=7]="ready",e[e.error=8]="error"})(Me||(Me={}));function sa(e){return e?e<7:!1}var fk=Object.assign,pk=Object.hasOwnProperty,R0=!1,jp=function(e){Jt(t,e);function t(r){var n=r.queryManager,i=r.queryInfo,o=r.options,a=e.call(this,function(l){try{var f=l._subscription._observer;f&&!f.error&&(f.error=dk)}catch(c){}var y=!a.observers.size;a.observers.add(l);var b=a.last;return b&&b.error?l.error&&l.error(b.error):b&&b.result&&l.next&&l.next(b.result),y&&a.reobserve().catch(function(){}),function(){a.observers.delete(l)&&!a.observers.size&&a.tearDownQuery()}})||this;a.observers=new Set,a.subscriptions=new Set,a.isTornDown=!1,a.options=o,a.queryId=i.queryId||n.generateQueryId();var s=Go(o.query);return a.queryName=s&&s.name&&s.name.value,a.initialFetchPolicy=o.fetchPolicy||"cache-first",a.queryManager=n,a.queryInfo=i,a}return Object.defineProperty(t.prototype,"variables",{get:function(){return this.options.variables},enumerable:!1,configurable:!0}),t.prototype.result=function(){var r=this;return new Promise(function(n,i){var o={next:function(s){n(s),r.observers.delete(o),r.observers.size||r.queryManager.removeQuery(r.queryId),setTimeout(function(){a.unsubscribe()},0)},error:i},a=r.subscribe(o)})},t.prototype.getCurrentResult=function(r){r===void 0&&(r=!0);var n=this.getLastResult(!0),i=this.queryInfo.networkStatus||n&&n.networkStatus||Me.ready,o=ee(ee({},n),{loading:sa(i),networkStatus:i}),a=this.options.fetchPolicy,s=a===void 0?"cache-first":a,l=n||s!=="network-only"&&s!=="no-cache"&&s!=="standby";if(l&&!this.queryManager.transform(this.options.query).hasForcedResolvers){var f=this.queryInfo.getDiff();(f.complete||this.options.returnPartialData)&&(o.data=f.result),ze(o.data,{})&&(o.data=void 0),f.complete?(o.networkStatus===Me.loading&&(s==="cache-first"||s==="cache-only")&&(o.networkStatus=Me.ready,o.loading=!1),delete o.partial):s!=="no-cache"&&(o.partial=!0),__DEV__&&!f.complete&&!this.options.partialRefetch&&!o.loading&&!o.data&&!o.error&&I0(f.missing)}return r&&this.updateLastResult(o),o},t.prototype.isDifferentFromLastResult=function(r){return!this.last||!ze(this.last.result,r)},t.prototype.getLast=function(r,n){var i=this.last;if(i&&i[r]&&(!n||ze(i.variables,this.variables)))return i[r]},t.prototype.getLastResult=function(r){return this.getLast("result",r)},t.prototype.getLastError=function(r){return this.getLast("error",r)},t.prototype.resetLastResults=function(){delete this.last,this.isTornDown=!1},t.prototype.resetQueryStoreErrors=function(){this.queryManager.resetErrors(this.queryId)},t.prototype.refetch=function(r){var n,i={pollInterval:0},o=this.options.fetchPolicy;if(o==="no-cache"?i.fetchPolicy="no-cache":o!=="cache-and-network"&&(i.fetchPolicy="network-only"),__DEV__&&r&&pk.call(r,"variables")){var a=mg(this.options.query),s=a.variableDefinitions;(!s||!s.some(function(l){return l.variable.name.value==="variables"}))&&__DEV__&&oe.warn("Called refetch("+JSON.stringify(r)+") for query "+(((n=a.name)===null||n===void 0?void 0:n.value)||JSON.stringify(a))+`, which does not declare a $variables variable.
-Did you mean to call refetch(variables) instead of refetch({ variables })?`)}return r&&!ze(this.options.variables,r)&&(i.variables=this.options.variables=ee(ee({},this.options.variables),r)),this.queryInfo.resetLastWrite(),this.reobserve(i,Me.refetch)},t.prototype.fetchMore=function(r){var n=this,i=ee(ee({},r.query?r:ee(ee(ee({},this.options),r),{variables:ee(ee({},this.options.variables),r.variables)})),{fetchPolicy:"no-cache"}),o=this.queryManager.generateQueryId();return i.notifyOnNetworkStatusChange&&(this.queryInfo.networkStatus=Me.fetchMore,this.observe()),this.queryManager.fetchQuery(o,i,Me.fetchMore).then(function(a){var s=a.data,l=r.updateQuery;return l?(__DEV__&&!R0&&(__DEV__&&oe.warn(`The updateQuery callback for fetchMore is deprecated, and will be removed
-in the next major version of Apollo Client.
-
-Please convert updateQuery functions to field policies with appropriate
-read and merge functions, or use/adapt a helper function (such as
-concatPagination, offsetLimitPagination, or relayStylePagination) from
-@apollo/client/utilities.
-
-The field policy system handles pagination more effectively than a
-hand-written updateQuery function, and you only need to define the policy
-once, rather than every time you call fetchMore.`),R0=!0),n.updateQuery(function(f){return l(f,{fetchMoreResult:s,variables:i.variables})})):n.queryManager.cache.writeQuery({query:i.query,variables:i.variables,data:s}),a}).finally(function(){n.queryManager.stopQuery(o),n.reobserve()})},t.prototype.subscribeToMore=function(r){var n=this,i=this.queryManager.startGraphQLSubscription({query:r.document,variables:r.variables,context:r.context}).subscribe({next:function(o){var a=r.updateQuery;a&&n.updateQuery(function(s,l){var f=l.variables;return a(s,{subscriptionData:o,variables:f})})},error:function(o){if(r.onError){r.onError(o);return}__DEV__&&oe.error("Unhandled GraphQL subscription error",o)}});return this.subscriptions.add(i),function(){n.subscriptions.delete(i)&&i.unsubscribe()}},t.prototype.setOptions=function(r){return this.reobserve(r)},t.prototype.setVariables=function(r){return ze(this.variables,r)?this.observers.size?this.result():Promise.resolve():(this.options.variables=r,this.observers.size?this.reobserve({fetchPolicy:this.initialFetchPolicy,variables:r},Me.setVariables):Promise.resolve())},t.prototype.updateQuery=function(r){var n=this.queryManager,i=n.cache.diff({query:this.options.query,variables:this.variables,returnPartialData:!0,optimistic:!1}).result,o=r(i,{variables:this.variables});o&&(n.cache.writeQuery({query:this.options.query,data:o,variables:this.variables}),n.broadcastQueries())},t.prototype.startPolling=function(r){this.options.pollInterval=r,this.updatePolling()},t.prototype.stopPolling=function(){this.options.pollInterval=0,this.updatePolling()},t.prototype.fetch=function(r,n){return this.queryManager.setObservableQuery(this),this.queryManager.fetchQueryObservable(this.queryId,r,n)},t.prototype.updatePolling=function(){var r=this;if(!this.queryManager.ssrMode){var n=this,i=n.pollingInfo,o=n.options.pollInterval;if(!o){i&&(clearTimeout(i.timeout),delete this.pollingInfo);return}if(!(i&&i.interval===o)){__DEV__?oe(o,"Attempted to start a polling query without a polling interval."):oe(o,12);var a=i||(this.pollingInfo={});a.interval=o;var s=function(){r.pollingInfo&&(sa(r.queryInfo.networkStatus)?l():r.reobserve({fetchPolicy:"network-only"},Me.poll).then(l,l))},l=function(){var f=r.pollingInfo;f&&(clearTimeout(f.timeout),f.timeout=setTimeout(s,f.interval))};l()}}},t.prototype.updateLastResult=function(r,n){return n===void 0&&(n=this.variables),this.last=ee(ee({},this.last),{result:this.queryManager.assumeImmutableResults?r:Rg(r),variables:n}),_i(r.errors)||delete this.last.error,this.last},t.prototype.reobserve=function(r,n){var i=this;this.isTornDown=!1;var o=n===Me.refetch||n===Me.fetchMore||n===Me.poll,a=this.options.variables,s=o?ki(this.options,r):fk(this.options,ki(r));o||(this.updatePolling(),r&&r.variables&&!r.fetchPolicy&&!ze(r.variables,a)&&(s.fetchPolicy=this.initialFetchPolicy,n===void 0&&(n=Me.setVariables)));var l=s.variables&&ee({},s.variables),f=this.fetch(s,n),y={next:function(b){i.reportResult(b,l)},error:function(b){i.reportError(b,l)}};return o||(this.concast&&this.observer&&this.concast.removeObserver(this.observer,!0),this.concast=f,this.observer=y),f.addObserver(y),f.promise},t.prototype.observe=function(){this.reportResult(this.getCurrentResult(!1),this.variables)},t.prototype.reportResult=function(r,n){(this.getLastError()||this.isDifferentFromLastResult(r))&&(this.updateLastResult(r,n),Jo(this.observers,"next",r))},t.prototype.reportError=function(r,n){var i=ee(ee({},this.getLastResult()),{error:r,errors:r.graphQLErrors,networkStatus:Me.error,loading:!1});this.updateLastResult(i,n),Jo(this.observers,"error",this.last.error=r)},t.prototype.hasObservers=function(){return this.observers.size>0},t.prototype.tearDownQuery=function(){this.isTornDown||(this.concast&&this.observer&&(this.concast.removeObserver(this.observer),delete this.concast,delete this.observer),this.stopPolling(),this.subscriptions.forEach(function(r){return r.unsubscribe()}),this.subscriptions.clear(),this.queryManager.stopQuery(this.queryId),this.observers.clear(),this.isTornDown=!0)},t}(Ue);Ng(jp);function dk(e){__DEV__&&oe.error("Unhandled error",e.message,e.stack)}function I0(e){__DEV__&&_i(e)&&__DEV__&&oe.debug("Missing cache result fields: "+e.map(function(t){return t.path.join(".")}).join(", "),e)}function hk(e){var t=e.fetchPolicy,r=t===void 0?"cache-first":t,n=e.nextFetchPolicy;n&&(e.fetchPolicy=typeof n=="function"?n.call(e,r):n)}var N0=function(){function e(t){var r=t.cache,n=t.client,i=t.resolvers,o=t.fragmentMatcher;this.cache=r,n&&(this.client=n),i&&this.addResolvers(i),o&&this.setFragmentMatcher(o)}return e.prototype.addResolvers=function(t){var r=this;this.resolvers=this.resolvers||{},Array.isArray(t)?t.forEach(function(n){r.resolvers=xg(r.resolvers,n)}):this.resolvers=xg(this.resolvers,t)},e.prototype.setResolvers=function(t){this.resolvers={},this.addResolvers(t)},e.prototype.getResolvers=function(){return this.resolvers||{}},e.prototype.runResolvers=function(t){var r=t.document,n=t.remoteResult,i=t.context,o=t.variables,a=t.onlyRunForcedResolvers,s=a===void 0?!1:a;return kn(this,void 0,void 0,function(){return Tn(this,function(l){return r?[2,this.resolveDocument(r,n.data,i,o,this.fragmentMatcher,s).then(function(f){return ee(ee({},n),{data:f.result})})]:[2,n]})})},e.prototype.setFragmentMatcher=function(t){this.fragmentMatcher=t},e.prototype.getFragmentMatcher=function(){return this.fragmentMatcher},e.prototype.clientQuery=function(t){return Yf(["client"],t)&&this.resolvers?t:null},e.prototype.serverQuery=function(t){return Hx(t)},e.prototype.prepareContext=function(t){var r=this.cache;return ee(ee({},t),{cache:r,getCacheKey:function(n){return r.identify(n)}})},e.prototype.addExportedVariables=function(t,r,n){return r===void 0&&(r={}),n===void 0&&(n={}),kn(this,void 0,void 0,function(){return Tn(this,function(i){return t?[2,this.resolveDocument(t,this.buildRootValueFromCache(t,r)||{},this.prepareContext(n),r).then(function(o){return ee(ee({},r),o.exportedVariables)})]:[2,ee({},r)]})})},e.prototype.shouldForceResolvers=function(t){var r=!1;return Sr(t,{Directive:{enter:function(n){if(n.name.value==="client"&&n.arguments&&(r=n.arguments.some(function(i){return i.name.value==="always"&&i.value.kind==="BooleanValue"&&i.value.value===!0}),r))return pg}}}),r},e.prototype.buildRootValueFromCache=function(t,r){return this.cache.diff({query:qx(t),variables:r,returnPartialData:!0,optimistic:!1}).result},e.prototype.resolveDocument=function(t,r,n,i,o,a){return n===void 0&&(n={}),i===void 0&&(i={}),o===void 0&&(o=function(){return!0}),a===void 0&&(a=!1),kn(this,void 0,void 0,function(){var s,l,f,y,b,c,m,u,h;return Tn(this,function(p){return s=ep(t),l=fu(t),f=lu(l),y=s.operation,b=y?y.charAt(0).toUpperCase()+y.slice(1):"Query",c=this,m=c.cache,u=c.client,h={fragmentMap:f,context:ee(ee({},n),{cache:m,client:u}),variables:i,fragmentMatcher:o,defaultOperationType:b,exportedVariables:{},onlyRunForcedResolvers:a},[2,this.resolveSelectionSet(s.selectionSet,r,h).then(function(d){return{result:d,exportedVariables:h.exportedVariables}})]})})},e.prototype.resolveSelectionSet=function(t,r,n){return kn(this,void 0,void 0,function(){var i,o,a,s,l,f=this;return Tn(this,function(y){return i=n.fragmentMap,o=n.context,a=n.variables,s=[r],l=function(b){return kn(f,void 0,void 0,function(){var c,m;return Tn(this,function(u){return uu(b,a)?cr(b)?[2,this.resolveField(b,r,n).then(function(h){var p;typeof h!="undefined"&&s.push((p={},p[Dn(b)]=h,p))})]:(yg(b)?c=b:(c=i[b.name.value],__DEV__?oe(c,"No fragment named "+b.name.value):oe(c,11)),c&&c.typeCondition&&(m=c.typeCondition.name.value,n.fragmentMatcher(r,m,o))?[2,this.resolveSelectionSet(c.selectionSet,r,n).then(function(h){s.push(h)})]:[2]):[2]})})},[2,Promise.all(t.selections.map(l)).then(function(){return ip(s)})]})})},e.prototype.resolveField=function(t,r,n){return kn(this,void 0,void 0,function(){var i,o,a,s,l,f,y,b,c,m=this;return Tn(this,function(u){return i=n.variables,o=t.name.value,a=Dn(t),s=o!==a,l=r[a]||r[o],f=Promise.resolve(l),(!n.onlyRunForcedResolvers||this.shouldForceResolvers(t))&&(y=r.__typename||n.defaultOperationType,b=this.resolvers&&this.resolvers[y],b&&(c=b[s?o:a],c&&(f=Promise.resolve(Np.withValue(this.cache,c,[r,vg(t,i),n.context,{field:t,fragmentMap:n.fragmentMap}]))))),[2,f.then(function(h){if(h===void 0&&(h=l),t.directives&&t.directives.forEach(function(p){p.name.value==="export"&&p.arguments&&p.arguments.forEach(function(d){d.name.value==="as"&&d.value.kind==="StringValue"&&(n.exportedVariables[d.value.value]=h)})}),!t.selectionSet||h==null)return h;if(Array.isArray(h))return m.resolveSubSelectedArray(t,h,n);if(t.selectionSet)return m.resolveSelectionSet(t.selectionSet,h,n)})]})})},e.prototype.resolveSubSelectedArray=function(t,r,n){var i=this;return Promise.all(r.map(function(o){if(o===null)return null;if(Array.isArray(o))return i.resolveSubSelectedArray(t,o,n);if(t.selectionSet)return i.resolveSelectionSet(t.selectionSet,o,n)}))},e}(),Ai=new(rn?WeakMap:Map);function Fp(e,t){var r=e[t];typeof r=="function"&&(e[t]=function(){return Ai.set(e,(Ai.get(e)+1)%1e15),r.apply(this,arguments)})}function L0(e){e.notifyTimeout&&(clearTimeout(e.notifyTimeout),e.notifyTimeout=void 0)}var Vp=function(){function e(t,r){r===void 0&&(r=t.generateQueryId()),this.queryId=r,this.listeners=new Set,this.document=null,this.lastRequestId=1,this.subscriptions=new Set,this.stopped=!1,this.dirty=!1,this.observableQuery=null;var n=this.cache=t.cache;Ai.has(n)||(Ai.set(n,0),Fp(n,"evict"),Fp(n,"modify"),Fp(n,"reset"))}return e.prototype.init=function(t){var r=t.networkStatus||Me.loading;return this.variables&&this.networkStatus!==Me.loading&&!ze(this.variables,t.variables)&&(r=Me.setVariables),ze(t.variables,this.variables)||(this.lastDiff=void 0),Object.assign(this,{document:t.document,variables:t.variables,networkError:null,graphQLErrors:this.graphQLErrors||[],networkStatus:r}),t.observableQuery&&this.setObservableQuery(t.observableQuery),t.lastRequestId&&(this.lastRequestId=t.lastRequestId),this},e.prototype.reset=function(){L0(this),this.lastDiff=void 0,this.dirty=!1},e.prototype.getDiff=function(t){t===void 0&&(t=this.variables);var r=this.getDiffOptions(t);if(this.lastDiff&&ze(r,this.lastDiff.options))return this.lastDiff.diff;this.updateWatch(this.variables=t);var n=this.observableQuery;if(n&&n.options.fetchPolicy==="no-cache")return{complete:!1};var i=this.cache.diff(r);return this.updateLastDiff(i,r),i},e.prototype.updateLastDiff=function(t,r){this.lastDiff=t?{diff:t,options:r||this.getDiffOptions()}:void 0},e.prototype.getDiffOptions=function(t){var r;return t===void 0&&(t=this.variables),{query:this.document,variables:t,returnPartialData:!0,optimistic:!0,canonizeResults:(r=this.observableQuery)===null||r===void 0?void 0:r.options.canonizeResults}},e.prototype.setDiff=function(t){var r=this,n=this.lastDiff&&this.lastDiff.diff;this.updateLastDiff(t),!this.dirty&&!ze(n&&n.result,t&&t.result)&&(this.dirty=!0,this.notifyTimeout||(this.notifyTimeout=setTimeout(function(){return r.notify()},0)))},e.prototype.setObservableQuery=function(t){var r=this;t!==this.observableQuery&&(this.oqListener&&this.listeners.delete(this.oqListener),this.observableQuery=t,t?(t.queryInfo=this,this.listeners.add(this.oqListener=function(){r.getDiff().fromOptimisticTransaction?t.observe():t.reobserve()})):delete this.oqListener)},e.prototype.notify=function(){var t=this;L0(this),this.shouldNotify()&&this.listeners.forEach(function(r){return r(t)}),this.dirty=!1},e.prototype.shouldNotify=function(){if(!this.dirty||!this.listeners.size)return!1;if(sa(this.networkStatus)&&this.observableQuery){var t=this.observableQuery.options.fetchPolicy;if(t!=="cache-only"&&t!=="cache-and-network")return!1}return!0},e.prototype.stop=function(){if(!this.stopped){this.stopped=!0,this.reset(),this.cancel(),this.cancel=e.prototype.cancel,this.subscriptions.forEach(function(r){return r.unsubscribe()});var t=this.observableQuery;t&&t.stopPolling()}},e.prototype.cancel=function(){},e.prototype.updateWatch=function(t){var r=this;t===void 0&&(t=this.variables);var n=this.observableQuery;if(!(n&&n.options.fetchPolicy==="no-cache")){var i=ee(ee({},this.getDiffOptions(t)),{watcher:this,callback:function(o){return r.setDiff(o)}});(!this.lastWatch||!ze(i,this.lastWatch))&&(this.cancel(),this.cancel=this.cache.watch(this.lastWatch=i))}},e.prototype.resetLastWrite=function(){this.lastWrite=void 0},e.prototype.shouldWrite=function(t,r){var n=this.lastWrite;return!(n&&n.dmCount===Ai.get(this.cache)&&ze(r,n.variables)&&ze(t.data,n.result.data))},e.prototype.markResult=function(t,r,n){var i=this;this.graphQLErrors=_i(t.errors)?t.errors:[],this.reset(),r.fetchPolicy==="no-cache"?this.updateLastDiff({result:t.data,complete:!0},this.getDiffOptions(r.variables)):n!==0&&(Up(t,r.errorPolicy)?this.cache.performTransaction(function(o){if(i.shouldWrite(t,r.variables))o.writeQuery({query:i.document,data:t.data,variables:r.variables,overwrite:n===1}),i.lastWrite={result:t,variables:r.variables,dmCount:Ai.get(i.cache)};else if(i.lastDiff&&i.lastDiff.diff.complete){t.data=i.lastDiff.diff.result;return}var a=i.getDiffOptions(r.variables),s=o.diff(a);i.stopped||i.updateWatch(r.variables),i.updateLastDiff(s,a),s.complete&&(t.data=s.result)}):this.lastWrite=void 0)},e.prototype.markReady=function(){return this.networkError=null,this.networkStatus=Me.ready},e.prototype.markError=function(t){return this.networkStatus=Me.error,this.lastWrite=void 0,this.reset(),t.graphQLErrors&&(this.graphQLErrors=t.graphQLErrors),t.networkError&&(this.networkError=t.networkError),t},e}();function Up(e,t){t===void 0&&(t="none");var r=t==="ignore"||t==="all",n=!hu(e);return!n&&r&&e.data&&(n=!0),n}var vk=Object.prototype.hasOwnProperty,yk=function(){function e(t){var r=t.cache,n=t.link,i=t.queryDeduplication,o=i===void 0?!1:i,a=t.onBroadcast,s=t.ssrMode,l=s===void 0?!1:s,f=t.clientAwareness,y=f===void 0?{}:f,b=t.localState,c=t.assumeImmutableResults;this.clientAwareness={},this.queries=new Map,this.fetchCancelFns=new Map,this.transformCache=new(rn?WeakMap:Map),this.queryIdCounter=1,this.requestIdCounter=1,this.mutationIdCounter=1,this.inFlightLinkObservables=new Map,this.cache=r,this.link=n,this.queryDeduplication=o,this.clientAwareness=y,this.localState=b||new N0({cache:r}),this.ssrMode=l,this.assumeImmutableResults=!!c,(this.onBroadcast=a)&&(this.mutationStore=Object.create(null))}return e.prototype.stop=function(){var t=this;this.queries.forEach(function(r,n){t.stopQueryNoBroadcast(n)}),this.cancelPendingFetches(__DEV__?new Ne("QueryManager stopped while query was in flight"):new Ne(13))},e.prototype.cancelPendingFetches=function(t){this.fetchCancelFns.forEach(function(r){return r(t)}),this.fetchCancelFns.clear()},e.prototype.mutate=function(t){var r=t.mutation,n=t.variables,i=t.optimisticResponse,o=t.updateQueries,a=t.refetchQueries,s=a===void 0?[]:a,l=t.awaitRefetchQueries,f=l===void 0?!1:l,y=t.update,b=t.onQueryUpdated,c=t.errorPolicy,m=c===void 0?"none":c,u=t.fetchPolicy,h=u===void 0?"network-only":u,p=t.keepRootFields,d=t.context;return kn(this,void 0,void 0,function(){var v,g,w;return Tn(this,function(_){switch(_.label){case 0:return __DEV__?oe(r,"mutation option is required. You must specify your GraphQL document in the mutation option."):oe(r,14),__DEV__?oe(h==="network-only"||h==="no-cache","Mutations support only 'network-only' or 'no-cache' fetchPolicy strings. The default `network-only` behavior automatically writes mutation results to the cache. Passing `no-cache` skips the cache write."):oe(h==="network-only"||h==="no-cache",15),v=this.generateMutationId(),r=this.transform(r).document,n=this.getVariables(r,n),this.transform(r).hasClientExports?[4,this.localState.addExportedVariables(r,n,d)]:[3,2];case 1:n=_.sent(),_.label=2;case 2:return g=this.mutationStore&&(this.mutationStore[v]={mutation:r,variables:n,loading:!0,error:null}),i&&this.markMutationOptimistic(i,{mutationId:v,document:r,variables:n,fetchPolicy:h,errorPolicy:m,context:d,updateQueries:o,update:y,keepRootFields:p}),this.broadcastQueries(),w=this,[2,new Promise(function(x,T){return vp(w.getObservableFromLink(r,ee(ee({},d),{optimisticResponse:i}),n,!1),function(P){if(hu(P)&&m==="none")throw new In({graphQLErrors:P.errors});g&&(g.loading=!1,g.error=null);var I=ee({},P);return typeof s=="function"&&(s=s(I)),m==="ignore"&&hu(I)&&delete I.errors,w.markMutationResult({mutationId:v,result:I,document:r,variables:n,fetchPolicy:h,errorPolicy:m,context:d,update:y,updateQueries:o,awaitRefetchQueries:f,refetchQueries:s,removeOptimistic:i?v:void 0,onQueryUpdated:b,keepRootFields:p})}).subscribe({next:function(P){w.broadcastQueries(),x(P)},error:function(P){g&&(g.loading=!1,g.error=P),i&&w.cache.removeOptimistic(v),w.broadcastQueries(),T(P instanceof In?P:new In({networkError:P}))}})})]}})})},e.prototype.markMutationResult=function(t,r){var n=this;r===void 0&&(r=this.cache);var i=t.result,o=[],a=t.fetchPolicy==="no-cache";if(!a&&Up(i,t.errorPolicy)){o.push({result:i.data,dataId:"ROOT_MUTATION",query:t.document,variables:t.variables});var s=t.updateQueries;s&&this.queries.forEach(function(f,y){var b=f.observableQuery,c=b&&b.queryName;if(!(!c||!vk.call(s,c))){var m=s[c],u=n.queries.get(y),h=u.document,p=u.variables,d=r.diff({query:h,variables:p,returnPartialData:!0,optimistic:!1}),v=d.result,g=d.complete;if(g&&v){var w=m(v,{mutationResult:i,queryName:h&&Zf(h)||void 0,queryVariables:p});w&&o.push({result:w,dataId:"ROOT_QUERY",query:h,variables:p})}}})}if(o.length>0||t.refetchQueries||t.update||t.onQueryUpdated||t.removeOptimistic){var l=[];if(this.refetchQueries({updateCache:function(f){a||o.forEach(function(c){return f.write(c)});var y=t.update;if(y){if(!a){var b=f.diff({id:"ROOT_MUTATION",query:n.transform(t.document).asQuery,variables:t.variables,optimistic:!1,returnPartialData:!0});b.complete&&(i=ee(ee({},i),{data:b.result}))}y(f,i,{context:t.context,variables:t.variables})}!a&&!t.keepRootFields&&f.modify({id:"ROOT_MUTATION",fields:function(c,m){var u=m.fieldName,h=m.DELETE;return u==="__typename"?c:h}})},include:t.refetchQueries,optimistic:!1,removeOptimistic:t.removeOptimistic,onQueryUpdated:t.onQueryUpdated||null}).forEach(function(f){return l.push(f)}),t.awaitRefetchQueries||t.onQueryUpdated)return Promise.all(l).then(function(){return i})}return Promise.resolve(i)},e.prototype.markMutationOptimistic=function(t,r){var n=this,i=typeof t=="function"?t(r.variables):t;return this.cache.recordOptimisticTransaction(function(o){try{n.markMutationResult(ee(ee({},r),{result:{data:i}}),o)}catch(a){__DEV__&&oe.error(a)}},r.mutationId)},e.prototype.fetchQuery=function(t,r,n){return this.fetchQueryObservable(t,r,n).promise},e.prototype.getQueryStore=function(){var t=Object.create(null);return this.queries.forEach(function(r,n){t[n]={variables:r.variables,networkStatus:r.networkStatus,networkError:r.networkError,graphQLErrors:r.graphQLErrors}}),t},e.prototype.resetErrors=function(t){var r=this.queries.get(t);r&&(r.networkError=void 0,r.graphQLErrors=[])},e.prototype.transform=function(t){var r=this.transformCache;if(!r.has(t)){var n=this.cache.transformDocument(t),i=Bx(this.cache.transformForLink(n)),o=this.localState.clientQuery(n),a=i&&this.localState.serverQuery(i),s={document:n,hasClientExports:Sx(n),hasForcedResolvers:this.localState.shouldForceResolvers(n),clientQuery:o,serverQuery:a,defaultVars:tp(Go(n)),asQuery:ee(ee({},n),{definitions:n.definitions.map(function(f){return f.kind==="OperationDefinition"&&f.operation!=="query"?ee(ee({},f),{operation:"query"}):f})})},l=function(f){f&&!r.has(f)&&r.set(f,s)};l(t),l(n),l(o),l(a)}return r.get(t)},e.prototype.getVariables=function(t,r){return ee(ee({},this.transform(t).defaultVars),r)},e.prototype.watchQuery=function(t){t=ee(ee({},t),{variables:this.getVariables(t.query,t.variables)}),typeof t.notifyOnNetworkStatusChange=="undefined"&&(t.notifyOnNetworkStatusChange=!1);var r=new Vp(this),n=new jp({queryManager:this,queryInfo:r,options:t});return this.queries.set(n.queryId,r),r.init({document:t.query,observableQuery:n,variables:t.variables}),n},e.prototype.query=function(t,r){var n=this;return r===void 0&&(r=this.generateQueryId()),__DEV__?oe(t.query,"query option is required. You must specify your GraphQL document in the query option."):oe(t.query,16),__DEV__?oe(t.query.kind==="Document",'You must wrap the query string in a "gql" tag.'):oe(t.query.kind==="Document",17),__DEV__?oe(!t.returnPartialData,"returnPartialData option only supported on watchQuery."):oe(!t.returnPartialData,18),__DEV__?oe(!t.pollInterval,"pollInterval option only supported on watchQuery."):oe(!t.pollInterval,19),this.fetchQuery(r,t).finally(function(){return n.stopQuery(r)})},e.prototype.generateQueryId=function(){return String(this.queryIdCounter++)},e.prototype.generateRequestId=function(){return this.requestIdCounter++},e.prototype.generateMutationId=function(){return String(this.mutationIdCounter++)},e.prototype.stopQueryInStore=function(t){this.stopQueryInStoreNoBroadcast(t),this.broadcastQueries()},e.prototype.stopQueryInStoreNoBroadcast=function(t){var r=this.queries.get(t);r&&r.stop()},e.prototype.clearStore=function(t){return t===void 0&&(t={discardWatches:!0}),this.cancelPendingFetches(__DEV__?new Ne("Store reset while query was in flight (not completed in link chain)"):new Ne(20)),this.queries.forEach(function(r){r.observableQuery?r.networkStatus=Me.loading:r.stop()}),this.mutationStore&&(this.mutationStore=Object.create(null)),this.cache.reset(t)},e.prototype.getObservableQueries=function(t){var r=this;t===void 0&&(t="active");var n=new Map,i=new Map,o=new Set;return Array.isArray(t)&&t.forEach(function(a){typeof a=="string"?i.set(a,!1):kx(a)?i.set(r.transform(a).document,!1):Ze(a)&&a.query&&o.add(a)}),this.queries.forEach(function(a,s){var l=a.observableQuery,f=a.document;if(l){if(t==="all"){n.set(s,l);return}var y=l.queryName,b=l.options.fetchPolicy;if(b==="standby"||t==="active"&&!l.hasObservers())return;(t==="active"||y&&i.has(y)||f&&i.has(f))&&(n.set(s,l),y&&i.set(y,!0),f&&i.set(f,!0))}}),o.size&&o.forEach(function(a){var s=yp("legacyOneTimeQuery"),l=r.getQuery(s).init({document:a.query,variables:a.variables}),f=new jp({queryManager:r,queryInfo:l,options:ee(ee({},a),{fetchPolicy:"network-only"})});oe(f.queryId===s),l.setObservableQuery(f),n.set(s,f)}),__DEV__&&i.size&&i.forEach(function(a,s){a||__DEV__&&oe.warn("Unknown query "+(typeof s=="string"?"named ":"")+JSON.stringify(s,null,2)+" requested in refetchQueries options.include array")}),n},e.prototype.reFetchObservableQueries=function(t){var r=this;t===void 0&&(t=!1);var n=[];return this.getObservableQueries(t?"all":"active").forEach(function(i,o){var a=i.options.fetchPolicy;i.resetLastResults(),(t||a!=="standby"&&a!=="cache-only")&&n.push(i.refetch()),r.getQuery(o).setDiff(null)}),this.broadcastQueries(),Promise.all(n)},e.prototype.setObservableQuery=function(t){this.getQuery(t.queryId).setObservableQuery(t)},e.prototype.startGraphQLSubscription=function(t){var r=this,n=t.query,i=t.fetchPolicy,o=t.errorPolicy,a=t.variables,s=t.context,l=s===void 0?{}:s;n=this.transform(n).document,a=this.getVariables(n,a);var f=function(b){return r.getObservableFromLink(n,l,b).map(function(c){if(i!=="no-cache"&&(Up(c,o)&&r.cache.write({query:n,result:c.data,dataId:"ROOT_SUBSCRIPTION",variables:b}),r.broadcastQueries()),hu(c))throw new In({graphQLErrors:c.errors});return c})};if(this.transform(n).hasClientExports){var y=this.localState.addExportedVariables(n,a,l).then(f);return new Ue(function(b){var c=null;return y.then(function(m){return c=m.subscribe(b)},b.error),function(){return c&&c.unsubscribe()}})}return f(a)},e.prototype.stopQuery=function(t){this.stopQueryNoBroadcast(t),this.broadcastQueries()},e.prototype.stopQueryNoBroadcast=function(t){this.stopQueryInStoreNoBroadcast(t),this.removeQuery(t)},e.prototype.removeQuery=function(t){this.fetchCancelFns.delete(t),this.getQuery(t).stop(),this.queries.delete(t)},e.prototype.broadcastQueries=function(){this.onBroadcast&&this.onBroadcast(),this.queries.forEach(function(t){return t.notify()})},e.prototype.getLocalState=function(){return this.localState},e.prototype.getObservableFromLink=function(t,r,n,i){var o=this,a;i===void 0&&(i=(a=r==null?void 0:r.queryDeduplication)!==null&&a!==void 0?a:this.queryDeduplication);var s,l=this.transform(t).serverQuery;if(l){var f=this,y=f.inFlightLinkObservables,b=f.link,c={query:l,variables:n,operationName:Zf(l)||void 0,context:this.prepareContext(ee(ee({},r),{forceFetch:!i}))};if(r=c.context,i){var m=y.get(l)||new Map;y.set(l,m);var u=Rn(n);if(s=m.get(u),!s){var h=new Zo([mp(b,c)]);m.set(u,s=h),h.cleanup(function(){m.delete(u)&&m.size<1&&y.delete(l)})}}else s=new Zo([mp(b,c)])}else s=new Zo([Ue.of({data:{}})]),r=this.prepareContext(r);var p=this.transform(t).clientQuery;return p&&(s=vp(s,function(d){return o.localState.runResolvers({document:p,remoteResult:d,context:r,variables:n})})),s},e.prototype.getResultsFromLink=function(t,r,n){var i=t.lastRequestId=this.generateRequestId();return vp(this.getObservableFromLink(t.document,n.context,n.variables),function(o){var a=_i(o.errors);if(i>=t.lastRequestId){if(a&&n.errorPolicy==="none")throw t.markError(new In({graphQLErrors:o.errors}));t.markResult(o,n,r),t.markReady()}var s={data:o.data,loading:!1,networkStatus:t.networkStatus||Me.ready};return a&&n.errorPolicy!=="ignore"&&(s.errors=o.errors),s},function(o){var a=lk(o)?o:new In({networkError:o});throw i>=t.lastRequestId&&t.markError(a),a})},e.prototype.fetchQueryObservable=function(t,r,n){var i=this;n===void 0&&(n=Me.loading);var o=this.transform(r.query).document,a=this.getVariables(o,r.variables),s=this.getQuery(t),l=r.fetchPolicy,f=l===void 0?"cache-first":l,y=r.errorPolicy,b=y===void 0?"none":y,c=r.returnPartialData,m=c===void 0?!1:c,u=r.notifyOnNetworkStatusChange,h=u===void 0?!1:u,p=r.context,d=p===void 0?{}:p,v=Object.assign({},r,{query:o,variables:a,fetchPolicy:f,errorPolicy:b,returnPartialData:m,notifyOnNetworkStatusChange:h,context:d}),g=function(_){return v.variables=_,i.fetchQueryByPolicy(s,v,n)};this.fetchCancelFns.set(t,function(_){setTimeout(function(){return w.cancel(_)})});var w=new Zo(this.transform(v.query).hasClientExports?this.localState.addExportedVariables(v.query,v.variables,v.context).then(g):g(v.variables));return w.cleanup(function(){i.fetchCancelFns.delete(t),hk(r)}),w},e.prototype.refetchQueries=function(t){var r=this,n=t.updateCache,i=t.include,o=t.optimistic,a=o===void 0?!1:o,s=t.removeOptimistic,l=s===void 0?a?yp("refetchQueries"):void 0:s,f=t.onQueryUpdated,y=new Map;i&&this.getObservableQueries(i).forEach(function(c,m){y.set(m,{oq:c,lastDiff:r.getQuery(m).getDiff()})});var b=new Map;return n&&this.cache.batch({update:n,optimistic:a&&l||!1,removeOptimistic:l,onWatchUpdated:function(c,m,u){var h=c.watcher instanceof Vp&&c.watcher.observableQuery;if(h){if(f){y.delete(h.queryId);var p=f(h,m,u);return p===!0&&(p=h.refetch()),p!==!1&&b.set(h,p),!1}f!==null&&y.set(h.queryId,{oq:h,lastDiff:u,diff:m})}}}),y.size&&y.forEach(function(c,m){var u=c.oq,h=c.lastDiff,p=c.diff,d;if(f){if(!p){var v=u.queryInfo;v.reset(),p=v.getDiff()}d=f(u,p,h)}(!f||d===!0)&&(d=u.refetch()),d!==!1&&b.set(u,d),m.indexOf("legacyOneTimeQuery")>=0&&r.stopQueryNoBroadcast(m)}),l&&this.cache.removeOptimistic(l),b},e.prototype.fetchQueryByPolicy=function(t,r,n){var i=this,o=r.query,a=r.variables,s=r.fetchPolicy,l=r.refetchWritePolicy,f=r.errorPolicy,y=r.returnPartialData,b=r.context,c=r.notifyOnNetworkStatusChange,m=t.networkStatus;t.init({document:o,variables:a,networkStatus:n});var u=function(){return t.getDiff(a)},h=function(w,_){_===void 0&&(_=t.networkStatus||Me.loading);var x=w.result;__DEV__&&!y&&!ze(x,{})&&I0(w.missing);var T=function(P){return Ue.of(ee({data:P,loading:sa(_),networkStatus:_},w.complete?null:{partial:!0}))};return x&&i.transform(o).hasForcedResolvers?i.localState.runResolvers({document:o,remoteResult:{data:x},context:b,variables:a,onlyRunForcedResolvers:!0}).then(function(P){return T(P.data||void 0)}):T(x)},p=s==="no-cache"?0:n===Me.refetch&&l!=="merge"?1:2,d=function(){return i.getResultsFromLink(t,p,{variables:a,context:b,fetchPolicy:s,errorPolicy:f})},v=c&&typeof m=="number"&&m!==n&&sa(n);switch(s){default:case"cache-first":{var g=u();return g.complete?[h(g,t.markReady())]:y||v?[h(g),d()]:[d()]}case"cache-and-network":{var g=u();return g.complete||y||v?[h(g),d()]:[d()]}case"cache-only":return[h(u(),t.markReady())];case"network-only":return v?[h(u()),d()]:[d()];case"no-cache":return v?[h(t.getDiff()),d()]:[d()];case"standby":return[]}},e.prototype.getQuery=function(t){return t&&!this.queries.has(t)&&this.queries.set(t,new Vp(this,t)),this.queries.get(t)},e.prototype.prepareContext=function(t){t===void 0&&(t={});var r=this.localState.prepareContext(t);return ee(ee({},r),{clientAwareness:this.clientAwareness})},e}(),M0=!1;function Bp(e,t){return ki(e,t,t.variables&&{variables:ee(ee({},e.variables),t.variables)})}var UA=function(){function e(t){var r=this;this.defaultOptions={},this.resetStoreCallbacks=[],this.clearStoreCallbacks=[];var n=t.uri,i=t.credentials,o=t.headers,a=t.cache,s=t.ssrMode,l=s===void 0?!1:s,f=t.ssrForceFetchDelay,y=f===void 0?0:f,b=t.connectToDevTools,c=b===void 0?typeof window=="object"&&!window.__APOLLO_CLIENT__&&__DEV__:b,m=t.queryDeduplication,u=m===void 0?!0:m,h=t.defaultOptions,p=t.assumeImmutableResults,d=p===void 0?!1:p,v=t.resolvers,g=t.typeDefs,w=t.fragmentMatcher,_=t.name,x=t.version,T=t.link;if(T||(T=n?new x_({uri:n,credentials:i,headers:o}):Ti.empty()),!a)throw __DEV__?new Ne(`To initialize Apollo Client, you must specify a 'cache' property in the options object.
-For more information, please visit: https://go.apollo.dev/c/docs`):new Ne(9);if(this.link=T,this.cache=a,this.disableNetworkFetches=l||y>0,this.queryDeduplication=u,this.defaultOptions=h||{},this.typeDefs=g,y&&setTimeout(function(){return r.disableNetworkFetches=!1},y),this.watchQuery=this.watchQuery.bind(this),this.query=this.query.bind(this),this.mutate=this.mutate.bind(this),this.resetStore=this.resetStore.bind(this),this.reFetchObservableQueries=this.reFetchObservableQueries.bind(this),c&&typeof window=="object"&&(window.__APOLLO_CLIENT__=this),!M0&&__DEV__&&(M0=!0,typeof window!="undefined"&&window.document&&window.top===window.self&&!window.__APOLLO_DEVTOOLS_GLOBAL_HOOK__)){var P=window.navigator,I=P&&P.userAgent,M=void 0;typeof I=="string"&&(I.indexOf("Chrome/")>-1?M="https://chrome.google.com/webstore/detail/apollo-client-developer-t/jdkknkkbebbapilgoeccciglkfbmbnfm":I.indexOf("Firefox/")>-1&&(M="https://addons.mozilla.org/en-US/firefox/addon/apollo-developer-tools/")),M&&__DEV__&&oe.log("Download the Apollo DevTools for a better development experience: "+M)}this.version=f_,this.localState=new N0({cache:a,client:this,resolvers:v,fragmentMatcher:w}),this.queryManager=new yk({cache:this.cache,link:this.link,queryDeduplication:u,ssrMode:l,clientAwareness:{name:_,version:x},localState:this.localState,assumeImmutableResults:d,onBroadcast:c?function(){r.devToolsHookCb&&r.devToolsHookCb({action:{},state:{queries:r.queryManager.getQueryStore(),mutations:r.queryManager.mutationStore||{}},dataWithOptimisticResults:r.cache.extract(!0)})}:void 0})}return e.prototype.stop=function(){this.queryManager.stop()},e.prototype.watchQuery=function(t){return this.defaultOptions.watchQuery&&(t=Bp(this.defaultOptions.watchQuery,t)),this.disableNetworkFetches&&(t.fetchPolicy==="network-only"||t.fetchPolicy==="cache-and-network")&&(t=ee(ee({},t),{fetchPolicy:"cache-first"})),this.queryManager.watchQuery(t)},e.prototype.query=function(t){return this.defaultOptions.query&&(t=Bp(this.defaultOptions.query,t)),__DEV__?oe(t.fetchPolicy!=="cache-and-network","The cache-and-network fetchPolicy does not work with client.query, because client.query can only return a single result. Please use client.watchQuery to receive multiple results from the cache and the network, or consider using a different fetchPolicy, such as cache-first or network-only."):oe(t.fetchPolicy!=="cache-and-network",10),this.disableNetworkFetches&&t.fetchPolicy==="network-only"&&(t=ee(ee({},t),{fetchPolicy:"cache-first"})),this.queryManager.query(t)},e.prototype.mutate=function(t){return this.defaultOptions.mutate&&(t=Bp(this.defaultOptions.mutate,t)),this.queryManager.mutate(t)},e.prototype.subscribe=function(t){return this.queryManager.startGraphQLSubscription(t)},e.prototype.readQuery=function(t,r){return r===void 0&&(r=!1),this.cache.readQuery(t,r)},e.prototype.readFragment=function(t,r){return r===void 0&&(r=!1),this.cache.readFragment(t,r)},e.prototype.writeQuery=function(t){this.cache.writeQuery(t),this.queryManager.broadcastQueries()},e.prototype.writeFragment=function(t){this.cache.writeFragment(t),this.queryManager.broadcastQueries()},e.prototype.__actionHookForDevTools=function(t){this.devToolsHookCb=t},e.prototype.__requestRaw=function(t){return mp(this.link,t)},e.prototype.resetStore=function(){var t=this;return Promise.resolve().then(function(){return t.queryManager.clearStore({discardWatches:!1})}).then(function(){return Promise.all(t.resetStoreCallbacks.map(function(r){return r()}))}).then(function(){return t.reFetchObservableQueries()})},e.prototype.clearStore=function(){var t=this;return Promise.resolve().then(function(){return t.queryManager.clearStore({discardWatches:!0})}).then(function(){return Promise.all(t.clearStoreCallbacks.map(function(r){return r()}))})},e.prototype.onResetStore=function(t){var r=this;return this.resetStoreCallbacks.push(t),function(){r.resetStoreCallbacks=r.resetStoreCallbacks.filter(function(n){return n!==t})}},e.prototype.onClearStore=function(t){var r=this;return this.clearStoreCallbacks.push(t),function(){r.clearStoreCallbacks=r.clearStoreCallbacks.filter(function(n){return n!==t})}},e.prototype.reFetchObservableQueries=function(t){return this.queryManager.reFetchObservableQueries(t)},e.prototype.refetchQueries=function(t){var r=this.queryManager.refetchQueries(t),n=[],i=[];r.forEach(function(a,s){n.push(s),i.push(a)});var o=Promise.all(i);return o.queries=n,o.results=i,o.catch(function(a){__DEV__&&oe.debug("In client.refetchQueries, Promise.all promise rejected with error "+a)}),o},e.prototype.getObservableQueries=function(t){return t===void 0&&(t="active"),this.queryManager.getObservableQueries(t)},e.prototype.extract=function(t){return this.cache.extract(t)},e.prototype.restore=function(t){return this.cache.restore(t)},e.prototype.addResolvers=function(t){this.localState.addResolvers(t)},e.prototype.setResolvers=function(t){this.localState.setResolvers(t)},e.prototype.getResolvers=function(){return this.localState.getResolvers()},e.prototype.setLocalStateFragmentMatcher=function(t){this.localState.setFragmentMatcher(t)},e.prototype.setLink=function(t){this.link=this.queryManager.link=t},e}(),Su=new Map,$p=new Map,j0=!0,zp=!1;function F0(e){return e.replace(/[\s,]+/g," ").trim()}function mk(e){return F0(e.source.body.substring(e.start,e.end))}function gk(e){var t=new Set,r=[];return e.definitions.forEach(function(n){if(n.kind==="FragmentDefinition"){var i=n.name.value,o=mk(n.loc),a=$p.get(i);a&&!a.has(o)?j0&&console.warn("Warning: fragment with name "+i+` already exists.
-graphql-tag enforces all fragment names across your application to be unique; read more about
-this in the docs: http://dev.apollodata.com/core/fragments.html#unique-names`):a||$p.set(i,a=new Set),a.add(o),t.has(o)||(t.add(o),r.push(n))}else r.push(n)}),ee(ee({},e),{definitions:r})}function bk(e){var t=new Set(e.definitions);t.forEach(function(n){n.loc&&delete n.loc,Object.keys(n).forEach(function(i){var o=n[i];o&&typeof o=="object"&&t.add(o)})});var r=e.loc;return r&&(delete r.startToken,delete r.endToken),e}function wk(e){var t=F0(e);if(!Su.has(t)){var r=px(e,{experimentalFragmentVariables:zp});if(!r||r.kind!=="Document")throw new Error("Not a valid GraphQL document.");Su.set(t,bk(gk(r)))}return Su.get(t)}function Pi(e){for(var t=[],r=1;r, or pass an ApolloClient instance in via options.'):oe(!!t,29);var r=!1;return t!==this.client&&(r=!0,this.client=t,this.cleanup()),{client:this.client,isNew:r}},e.prototype.verifyDocumentType=function(t,r){var n=_k(t),i=$0(r),o=$0(n.type);__DEV__?oe(n.type===r,"Running a "+i+" requires a graphql "+(i+", but a "+o+" was used instead.")):oe(n.type===r,30)},e}(),Tk=function(e){Jt(t,e);function t(r){var n=r.options,i=r.context,o=r.onNewData,a=e.call(this,n,i)||this;return a.runLazy=!1,a.previous=Object.create(null),a.runLazyQuery=function(s){a.cleanup(),a.runLazy=!0,a.lazyOptions=s,a.onNewData()},a.obsRefetch=function(s){var l;return(l=a.currentObservable)===null||l===void 0?void 0:l.refetch(s)},a.obsFetchMore=function(s){var l;return(l=a.currentObservable)===null||l===void 0?void 0:l.fetchMore(s)},a.obsUpdateQuery=function(s){var l;return(l=a.currentObservable)===null||l===void 0?void 0:l.updateQuery(s)},a.obsStartPolling=function(s){var l;(l=a.currentObservable)===null||l===void 0||l.startPolling(s)},a.obsStopPolling=function(){var s;(s=a.currentObservable)===null||s===void 0||s.stopPolling()},a.obsSubscribeToMore=function(s){var l;return(l=a.currentObservable)===null||l===void 0?void 0:l.subscribeToMore(s)},a.onNewData=o,a}return t.prototype.execute=function(){this.refreshClient();var r=this.getOptions(),n=r.skip,i=r.query;return(n||i!==this.previous.query)&&(this.removeQuerySubscription(),this.removeObservable(!n),this.previous.query=i),this.updateObservableQuery(),this.getExecuteSsrResult()||this.getExecuteResult()},t.prototype.executeLazy=function(){return this.runLazy?[this.runLazyQuery,this.execute()]:[this.runLazyQuery,{loading:!1,networkStatus:Me.ready,called:!1,data:void 0}]},t.prototype.fetchData=function(){var r=this,n=this.getOptions();return n.skip||n.ssr===!1?!1:new Promise(function(i){return r.startQuerySubscription(i)})},t.prototype.afterExecute=function(r){var n=r===void 0?{}:r,i=n.lazy,o=i===void 0?!1:i;this.isMounted=!0;var a=this.getOptions();return this.currentObservable&&!this.ssrInitiated()&&this.startQuerySubscription(),(!o||this.runLazy)&&this.handleErrorOrCompleted(),this.previousOptions=a,this.unmount.bind(this)},t.prototype.cleanup=function(){this.removeQuerySubscription(),this.removeObservable(!0),delete this.previous.result},t.prototype.getOptions=function(){var r=e.prototype.getOptions.call(this);return this.lazyOptions&&(r.variables=ee(ee({},r.variables),this.lazyOptions.variables),r.context=ee(ee({},r.context),this.lazyOptions.context)),this.runLazy&&delete r.skip,r},t.prototype.ssrInitiated=function(){return this.context&&this.context.renderPromises},t.prototype.getExecuteSsrResult=function(){var r=this.getOptions(),n=r.ssr,i=r.skip,o=n===!1,a=this.refreshClient().client.disableNetworkFetches,s=ee({loading:!0,networkStatus:Me.loading,called:!0,data:void 0,stale:!1,client:this.client},this.observableQueryFields());if(o&&(this.ssrInitiated()||a))return this.previous.result=s,s;if(this.ssrInitiated()){var l=this.getExecuteResult()||s;return l.loading&&!i&&this.context.renderPromises.addQueryPromise(this,function(){return null}),l}},t.prototype.prepareObservableQueryOptions=function(){var r=this.getOptions();this.verifyDocumentType(r.query,Rr.Query);var n=r.displayName||"Query";return this.ssrInitiated()&&(r.fetchPolicy==="network-only"||r.fetchPolicy==="cache-and-network")&&(r.fetchPolicy="cache-first"),ee(ee({},r),{displayName:n,context:r.context})},t.prototype.initializeObservableQuery=function(){if(this.ssrInitiated()&&(this.currentObservable=this.context.renderPromises.getSSRObservable(this.getOptions())),!this.currentObservable){var r=this.prepareObservableQueryOptions();this.previous.observableQueryOptions=ee(ee({},r),{children:void 0}),this.currentObservable=this.refreshClient().client.watchQuery(ee({},r)),this.ssrInitiated()&&this.context.renderPromises.registerSSRObservable(this.currentObservable,r)}},t.prototype.updateObservableQuery=function(){if(!this.currentObservable){this.initializeObservableQuery();return}var r=ee(ee({},this.prepareObservableQueryOptions()),{children:void 0});if(this.getOptions().skip){this.previous.observableQueryOptions=r;return}ze(r,this.previous.observableQueryOptions)||(this.previous.observableQueryOptions=r,this.currentObservable.setOptions(r).catch(function(){}))},t.prototype.startQuerySubscription=function(r){var n=this;r===void 0&&(r=this.onNewData),!(this.currentSubscription||this.getOptions().skip)&&(this.currentSubscription=this.currentObservable.subscribe({next:function(i){var o=i.loading,a=i.networkStatus,s=i.data,l=n.previous.result;l&&l.loading===o&&l.networkStatus===a&&ze(l.data,s)||r()},error:function(i){if(n.resubscribeToQuery(),!i.hasOwnProperty("graphQLErrors"))throw i;var o=n.previous.result;(o&&o.loading||!ze(i,n.previous.error))&&(n.previous.error=i,r())}}))},t.prototype.resubscribeToQuery=function(){this.removeQuerySubscription();var r=this.currentObservable;if(r){var n=r.last;try{r.resetLastResults(),this.startQuerySubscription()}finally{r.last=n}}},t.prototype.getExecuteResult=function(){var r=this.observableQueryFields(),n=this.getOptions();if(n.skip)r=ee(ee({},r),{data:void 0,error:void 0,loading:!1,networkStatus:Me.ready,called:!0});else if(this.currentObservable){var i=this.currentObservable.getCurrentResult(),o=i.data,a=i.loading,s=i.partial,l=i.networkStatus,f=i.errors,y=i.error;if(f&&f.length>0&&(y=new In({graphQLErrors:f})),r=ee(ee({},r),{data:o,loading:a,networkStatus:l,error:y,called:!0}),!a)if(y)Object.assign(r,{data:(this.currentObservable.getLastResult()||{}).data});else{var b=this.currentObservable.options.fetchPolicy,c=n.partialRefetch;if(c&&s&&(!o||Object.keys(o).length===0)&&b!=="cache-only")return Object.assign(r,{loading:!0,networkStatus:Me.loading}),r.refetch(),r}}r.client=this.client,this.setOptions(n,!0);var m=this.previous.result;return this.previous.loading=m&&m.loading||!1,r.previousData=m&&(m.data||m.previousData),this.previous.result=r,this.currentObservable&&this.currentObservable.resetQueryStoreErrors(),r},t.prototype.handleErrorOrCompleted=function(){if(!(!this.currentObservable||!this.previous.result)){var r=this.previous.result,n=r.data,i=r.loading,o=r.error;if(!i){var a=this.getOptions(),s=a.query,l=a.variables,f=a.onCompleted,y=a.onError,b=a.skip;if(this.previousOptions&&!this.previous.loading&&ze(this.previousOptions.query,s)&&ze(this.previousOptions.variables,l))return;f&&!o&&!b?f(n):y&&o&&y(o)}}},t.prototype.removeQuerySubscription=function(){this.currentSubscription&&(this.currentSubscription.unsubscribe(),delete this.currentSubscription)},t.prototype.removeObservable=function(r){this.currentObservable&&(this.currentObservable.tearDownQuery(),r&&delete this.currentObservable)},t.prototype.observableQueryFields=function(){var r;return{variables:(r=this.currentObservable)===null||r===void 0?void 0:r.variables,refetch:this.obsRefetch,fetchMore:this.obsFetchMore,updateQuery:this.obsUpdateQuery,startPolling:this.obsStartPolling,stopPolling:this.obsStopPolling,subscribeToMore:this.obsSubscribeToMore}},t}(kk);function Ck(e,t){var r=fe.exports.useRef();return(!r.current||!ze(t,r.current.key))&&(r.current={key:t,value:e()}),r.current.value}function Ak(e){if(__DEV__){var t=fe.exports.useRef(!1);fe.exports.useEffect(function(){return function(){t.current=!0}},[]),fe.exports.useEffect(function(){t.current===!0&&(t.current=!1,e())},[])}}function Pk(e,t,r){r===void 0&&(r=!1);var n=fe.exports.useContext(U0()),i=fe.exports.useReducer(function(m){return m+1},0),o=i[0],a=i[1],s=t?ee(ee({},t),{query:e}):{query:e},l=fe.exports.useRef(),f=l.current||(l.current=new Tk({options:s,context:n,onNewData:function(){f.ssrInitiated()?a():Promise.resolve().then(function(){return l.current&&l.current.isMounted&&a()})}}));f.setOptions(s),f.context=n;var y={options:ee(ee({},s),{onError:void 0,onCompleted:void 0}),context:n,tick:o},b=Ck(function(){return r?f.executeLazy():f.execute()},y),c=r?b[1]:b;return __DEV__&&Ak(a),fe.exports.useEffect(function(){return function(){f.cleanup(),l.current=void 0}},[]),fe.exports.useEffect(function(){return f.afterExecute({lazy:r})},[c.loading,c.networkStatus,c.error,c.data,f.currentObservable]),b}function zA(e,t){return Pk(e,t,!1)}var Dk=1,Rk={disable:function(e){var t=e.graphQLErrors,r=e.operation;if(t&&t.some(function(i){var o=i.message;return o==="PersistedQueryNotSupported"}))return!0;var n=r.getContext().response;return!!(n&&n.status&&(n.status===400||n.status===500))},useGETForHashedQueries:!1};function Ik(e){return e.query.definitions.some(function(t){return t.kind==="OperationDefinition"&&t.operation==="mutation"})}var Nk=Object.prototype.hasOwnProperty,z0=new WeakMap,Lk=0,QA=function(e){__DEV__?oe(e&&(typeof e.sha256=="function"||typeof e.generateHash=="function"),'Missing/invalid "sha256" or "generateHash" function. Please configure one using the "createPersistedQueryLink(options)" options parameter.'):oe(e&&(typeof e.sha256=="function"||typeof e.generateHash=="function"),24);var t=ki(Rk,e),r=t.sha256,n=t.generateHash,i=n===void 0?function(b){return Promise.resolve(r(dg(b)))}:n,o=t.disable,a=t.useGETForHashedQueries,s=!0,l="forLink"+Lk++,f=function(b){return new Promise(function(c){return c(i(b))})};function y(b){if(!b||typeof b!="object")return f(b);var c=z0.get(b);return c||z0.set(b,c=Object.create(null)),Nk.call(c,l)?c[l]:c[l]=f(b)}return new Ti(function(b,c){__DEV__?oe(c,"PersistedQueryLink cannot be the last link in the chain."):oe(c,25);var m=b.query;return new Ue(function(u){var h,p=!1,d,v=!1,g=function(_,x){var T=_.response,P=_.networkError;if(!p&&(T&&T.errors||P)){p=!0;var I={response:T,networkError:P,operation:b,graphQLErrors:T?T.errors:void 0};if(s=!o(I),T&&T.errors&&T.errors.some(function(M){var B=M.message;return B==="PersistedQueryNotFound"})||!s){h&&h.unsubscribe(),b.setContext({http:{includeQuery:!0,includeExtensions:s},fetchOptions:{method:"POST"}}),v&&b.setContext({fetchOptions:d}),h=c(b).subscribe(w);return}}x()},w={next:function(_){g({response:_},function(){return u.next(_)})},error:function(_){g({networkError:_},function(){return u.error(_)})},complete:u.complete.bind(u)};return b.setContext({http:{includeQuery:!s,includeExtensions:s}}),a&&s&&!Ik(b)&&(b.setContext(function(_){var x=_.fetchOptions,T=x===void 0?{}:x;return d=T,{fetchOptions:ee(ee({},T),{method:"GET"})}}),v=!0),s?y(m).then(function(_){b.extensions.persistedQuery={version:Dk,sha256Hash:_},h=c(b).subscribe(w)}).catch(u.error.bind(u)):h=c(b).subscribe(w),function(){h&&h.unsubscribe()}})})};const Q0=(()=>{if(typeof globalThis!="undefined")return globalThis;if(typeof self!="undefined")return self;if(typeof window!="undefined")return window;if(typeof nr!="undefined")return nr})(),Mk=e=>{const t=new DataView(e);let r="";for(let n=0;nasync(t,r)=>{typeof t=="string"&&(t=new Q0.TextEncoder().encode(t)),r=Qd({outputFormat:"hex"},r);const n=await Q0.crypto.subtle.digest(e,t);return r.outputFormat==="hex"?Mk(n):n};var qA=jk("SHA-256"),sn=he.createContext(null);function Fk(e){e()}var q0=Fk,Vk=function(t){return q0=t},Uk=function(){return q0};function Bk(){var e=Uk(),t=null,r=null;return{clear:function(){t=null,r=null},notify:function(){e(function(){for(var i=t;i;)i.callback(),i=i.next})},get:function(){for(var i=[],o=t;o;)i.push(o),o=o.next;return i},subscribe:function(i){var o=!0,a=r={callback:i,next:null,prev:r};return a.prev?a.prev.next=a:t=a,function(){!o||t===null||(o=!1,a.next?a.next.prev=a.prev:r=a.prev,a.prev?a.prev.next=a.next:t=a.next)}}}}var H0={notify:function(){},get:function(){return[]}};function W0(e,t){var r,n=H0;function i(b){return l(),n.subscribe(b)}function o(){n.notify()}function a(){y.onStateChange&&y.onStateChange()}function s(){return Boolean(r)}function l(){r||(r=t?t.addNestedSub(a):e.subscribe(a),n=Bk())}function f(){r&&(r(),r=void 0,n.clear(),n=H0)}var y={addNestedSub:i,notifyNestedSubs:o,handleChangeWrapper:a,isSubscribed:s,trySubscribe:l,tryUnsubscribe:f,getListeners:function(){return n}};return y}var Qp=typeof window!="undefined"&&typeof window.document!="undefined"&&typeof window.document.createElement!="undefined"?fe.exports.useLayoutEffect:fe.exports.useEffect,Ou={exports:{}},la={};/** @license React v17.0.2
- * react-jsx-runtime.production.min.js
- *
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */var $k=fe.exports,K0=60103;la.Fragment=60107;if(typeof Symbol=="function"&&Symbol.for){var G0=Symbol.for;K0=G0("react.element"),la.Fragment=G0("react.fragment")}var zk=$k.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,Qk=Object.prototype.hasOwnProperty,qk={key:!0,ref:!0,__self:!0,__source:!0};function Y0(e,t,r){var n,i={},o=null,a=null;r!==void 0&&(o=""+r),t.key!==void 0&&(o=""+t.key),t.ref!==void 0&&(a=t.ref);for(n in t)Qk.call(t,n)&&!qk.hasOwnProperty(n)&&(i[n]=t[n]);if(e&&e.defaultProps)for(n in t=e.defaultProps,t)i[n]===void 0&&(i[n]=t[n]);return{$$typeof:K0,type:e,key:o,ref:a,props:i,_owner:zk.current}}la.jsx=Y0;la.jsxs=Y0;Ou.exports=la;const Hk=Ou.exports.jsx,HA=Ou.exports.jsxs,WA=Ou.exports.Fragment;function KA(e){var t=e.store,r=e.context,n=e.children,i=fe.exports.useMemo(function(){var s=W0(t);return s.onStateChange=s.notifyNestedSubs,{store:t,subscription:s}},[t]),o=fe.exports.useMemo(function(){return t.getState()},[t]);Qp(function(){var s=i.subscription;return s.trySubscribe(),o!==t.getState()&&s.notifyNestedSubs(),function(){s.tryUnsubscribe(),s.onStateChange=null}},[i,o]);var a=r||sn;return Hk(a.Provider,{value:i,children:n})}function X0(){var e=fe.exports.useContext(sn);return e}function J0(e){e===void 0&&(e=sn);var t=e===sn?X0:function(){return fe.exports.useContext(e)};return function(){var n=t(),i=n.store;return i}}var Wk=J0();function Kk(e){e===void 0&&(e=sn);var t=e===sn?Wk:J0(e);return function(){var n=t();return n.dispatch}}var GA=Kk(),Gk=function(t,r){return t===r};function Yk(e,t,r,n){var i=fe.exports.useReducer(function(u){return u+1},0),o=i[1],a=fe.exports.useMemo(function(){return W0(r,n)},[r,n]),s=fe.exports.useRef(),l=fe.exports.useRef(),f=fe.exports.useRef(),y=fe.exports.useRef(),b=r.getState(),c;try{if(e!==l.current||b!==f.current||s.current){var m=e(b);y.current===void 0||!t(m,y.current)?c=m:c=y.current}else c=y.current}catch(u){throw s.current&&(u.message+=`
-The error may be correlated with this previous error:
-`+s.current.stack+`
-
-`),u}return Qp(function(){l.current=e,f.current=b,y.current=c,s.current=void 0}),Qp(function(){function u(){try{var h=r.getState();if(h===f.current)return;var p=l.current(h);if(t(p,y.current))return;y.current=p,f.current=h}catch(d){s.current=d}o()}return a.onStateChange=u,a.trySubscribe(),u(),function(){return a.tryUnsubscribe()}},[r,a]),c}function Xk(e){e===void 0&&(e=sn);var t=e===sn?X0:function(){return fe.exports.useContext(e)};return function(n,i){i===void 0&&(i=Gk);var o=t(),a=o.store,s=o.subscription,l=Yk(n,i,a,s);return fe.exports.useDebugValue(l),l}}var YA=Xk();Vk(nl.exports.unstable_batchedUpdates);function Jk(e){function t(k,S,N,z,A){for(var q=0,U=0,X=0,C=0,R,V,H=0,J=0,te,ne=te=R=0,ae=0,xe=0,We=0,ke=0,we=N.length,Te=we-1,Se,ie="",me="",Ge="",rt="",Re;aeR)&&(ke=(ie=ie.replace(" ",":")).length),0z&&(z=(S=S.trim()).charCodeAt(0)),z){case 38:return S.replace(d,"$1"+k.trim());case 58:return k.trim()+S.replace(d,"$1"+k.trim());default:if(0<1*N&&0U.charCodeAt(8))break;case 115:A=A.replace(U,"-webkit-"+U)+";"+A;break;case 207:case 102:A=A.replace(U,"-webkit-"+(102N.charCodeAt(0)&&(N=N.trim()),O=N,N=[O],01?t-1:0),n=1;n0?" Args: "+r.join(", "):""))}var iT=function(){function e(r){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=r}var t=e.prototype;return t.indexOfGroup=function(r){for(var n=0,i=0;i=this.groupSizes.length){for(var i=this.groupSizes,o=i.length,a=o;r>=a;)(a<<=1)<0&&fa(16,""+r);this.groupSizes=new Uint32Array(a),this.groupSizes.set(i),this.length=a;for(var s=o;s=this.length||this.groupSizes[r]===0)return n;for(var i=this.groupSizes[r],o=this.indexOfGroup(r),a=o+i,s=o;s =pa&&(pa=t+1),_u.set(e,t),ku.set(t,e)},sT="style["+Di+'][data-styled-version="5.3.1"]',uT=new RegExp("^"+Di+'\\.g(\\d+)\\[id="([\\w\\d-]+)"\\].*?"([^"]*)'),lT=function(e,t,r){for(var n,i=r.split(","),o=0,a=i.length;o =0;f--){var y=l[f];if(y&&y.nodeType===1&&y.hasAttribute(Di))return y}}(r),o=i!==void 0?i.nextSibling:null;n.setAttribute(Di,"active"),n.setAttribute("data-styled-version","5.3.1");var a=fT();return a&&n.setAttribute("nonce",a),r.insertBefore(n,o),n},pT=function(){function e(r){var n=this.element=r1(r);n.appendChild(document.createTextNode("")),this.sheet=function(i){if(i.sheet)return i.sheet;for(var o=document.styleSheets,a=0,s=o.length;a=0){var i=document.createTextNode(n),o=this.nodes[r];return this.element.insertBefore(i,o||null),this.length++,!0}return!1},t.deleteRule=function(r){this.element.removeChild(this.nodes[r]),this.length--},t.getRule=function(r){return r0&&(b+=c+",")}),o+=""+f+y+'{content:"'+b+`"}/*!sc*/
-`}}}return o}(this)},e}(),yT=/(a)(d)/gi,i1=function(e){return String.fromCharCode(e+(e>25?39:97))};function Kp(e){var t,r="";for(t=Math.abs(e);t>52;t=t/52|0)r=i1(t%52)+r;return(i1(t%52)+r).replace(yT,"$1-$2")}var Ri=function(e,t){for(var r=t.length;r;)e=33*e^t.charCodeAt(--r);return e},o1=function(e){return Ri(5381,e)};function a1(e){for(var t=0;t>>0);if(!r.hasNameForId(i,s)){var l=n(a,"."+s,void 0,i);r.insertRules(i,s,l)}o.push(s),this.staticRulesId=s}else{for(var f=this.rules.length,y=Ri(this.baseHash,n.hash),b="",c=0;c>>0);if(!r.hasNameForId(i,p)){var d=n(b,"."+p,void 0,i);r.insertRules(i,p,d)}o.push(p)}}return o.join(" ")},e}(),bT=/^\s*\/\/.*$/gm,wT=[":","[",".","#"];function s1(e){var t,r,n,i,o=e===void 0?un:e,a=o.options,s=a===void 0?un:a,l=o.plugins,f=l===void 0?xu:l,y=new Jk(s),b=[],c=function(h){function p(d){if(d)try{h(d+"}")}catch(v){}}return function(d,v,g,w,_,x,T,P,I,M){switch(d){case 1:if(I===0&&v.charCodeAt(0)===64)return h(v+";"),"";break;case 2:if(P===0)return v+"/*|*/";break;case 3:switch(P){case 102:case 112:return h(g[0]+v),"";default:return v+(M===0?"/*|*/":"")}case-2:v.split("/*|*/}").forEach(p)}}}(function(h){b.push(h)}),m=function(h,p,d){return p===0&&wT.indexOf(d[r.length])!==-1||d.match(i)?h:"."+t};function u(h,p,d,v){v===void 0&&(v="&");var g=h.replace(bT,""),w=p&&d?d+" "+p+" { "+g+" }":g;return t=v,r=p,n=new RegExp("\\"+r+"\\b","g"),i=new RegExp("(\\"+r+"\\b){2,}"),y(d||!p?"":p,w)}return y.use([].concat(f,[function(h,p,d){h===2&&d.length&&d[0].lastIndexOf(r)>0&&(d[0]=d[0].replace(n,m))},c,function(h){if(h===-2){var p=b;return b=[],p}}])),u.hash=f.length?f.reduce(function(h,p){return p.name||fa(15),Ri(h,p.name)},5381).toString():"",u}var Gp=he.createContext();Gp.Consumer;var Yp=he.createContext(),ET=(Yp.Consumer,new Cu),Xp=s1();function Jp(){return fe.exports.useContext(Gp)||ET}function u1(){return fe.exports.useContext(Yp)||Xp}function XA(e){var t=fe.exports.useState(e.stylisPlugins),r=t[0],n=t[1],i=Jp(),o=fe.exports.useMemo(function(){var s=i;return e.sheet?s=e.sheet:e.target&&(s=s.reconstructWithOptions({target:e.target},!1)),e.disableCSSOMInjection&&(s=s.reconstructWithOptions({useCSSOMInjection:!1})),s},[e.disableCSSOMInjection,e.sheet,e.target]),a=fe.exports.useMemo(function(){return s1({options:{prefix:!e.disableVendorPrefixes},plugins:r})},[e.disableVendorPrefixes,r]);return fe.exports.useEffect(function(){jm(r,e.stylisPlugins)||n(e.stylisPlugins)},[e.stylisPlugins]),he.createElement(Gp.Provider,{value:o},he.createElement(Yp.Provider,{value:a},e.children))}var ST=function(){function e(t,r){var n=this;this.inject=function(i,o){o===void 0&&(o=Xp);var a=n.name+o.hash;i.hasNameForId(n.id,a)||i.insertRules(n.id,a,o(n.rules,a,"@keyframes"))},this.toString=function(){return fa(12,String(n.name))},this.name=t,this.id="sc-keyframes-"+t,this.rules=r}return e.prototype.getName=function(t){return t===void 0&&(t=Xp),this.name+t.hash},e}(),OT=/([A-Z])/,xT=/([A-Z])/g,_T=/^ms-/,kT=function(e){return"-"+e.toLowerCase()};function l1(e){return OT.test(e)?e.replace(xT,kT).replace(_T,"-ms-"):e}var c1=function(e){return e==null||e===!1||e===""};function Nn(e,t,r,n){if(Array.isArray(e)){for(var i,o=[],a=0,s=e.length;a1?t-1:0),n=1;n?@[\\\]^`{|}~-]+/g,CT=/(^-|-$)/g;function Zp(e){return e.replace(TT,"-").replace(CT,"")}var h1=function(e){return Kp(o1(e)>>>0)};function Au(e){return typeof e=="string"&&!0}var ed=function(e){return typeof e=="function"||typeof e=="object"&&e!==null&&!Array.isArray(e)},AT=function(e){return e!=="__proto__"&&e!=="constructor"&&e!=="prototype"};function PT(e,t,r){var n=e[r];ed(t)&&ed(n)?v1(n,t):e[r]=t}function v1(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n=0||(M[P]=x[P]);return M}(t,["componentId"]),_=g&&g+"-"+(Au(v)?v:Zp(t1(v)));return y1(v,Or({},w,{attrs:c,componentId:_}),r)},Object.defineProperty(u,"defaultProps",{get:function(){return this._foldedDefaultProps},set:function(v){this._foldedDefaultProps=n?v1({},e.defaultProps,v):v}}),u.toString=function(){return"."+u.styledComponentId},i&&_m(u,e,{attrs:!0,componentStyle:!0,displayName:!0,foldedComponentIds:!0,shouldForwardProp:!0,styledComponentId:!0,target:!0,withComponent:!0}),u}var nd=function(e){return function t(r,n,i){if(i===void 0&&(i=un),!Is.exports.isValidElementType(n))return fa(1,String(n));var o=function(){return r(n,i,p1.apply(void 0,arguments))};return o.withConfig=function(a){return t(r,n,Or({},i,{},a))},o.attrs=function(a){return t(r,n,Or({},i,{attrs:Array.prototype.concat(i.attrs,a).filter(Boolean)}))},o}(y1,e)};["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","textPath","tspan"].forEach(function(e){nd[e]=nd(e)});var DT=function(){function e(r,n){this.rules=r,this.componentId=n,this.isStatic=a1(r),Cu.registerId(this.componentId+1)}var t=e.prototype;return t.createStyles=function(r,n,i,o){var a=o(Nn(this.rules,n,i,o).join(""),""),s=this.componentId+r;i.insertRules(s,s,a)},t.removeStyles=function(r,n){n.clearRules(this.componentId+r)},t.renderStyles=function(r,n,i,o){r>2&&Cu.registerId(this.componentId+r),this.removeStyles(r,i),this.createStyles(r,n,i,o)},e}();function JA(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n|~|\\(|\\)|\\[|\\]|=|\\*=|~=|\\^=|'[^']*'|"[^"]*"|`+l+")*?{)",Y="(?!"+W+h+"\\))",L="(?="+W+h+"\\))",F="(\\s*(?:!important\\s*)?[;}])",j=/`TMP`/g,E=new RegExp(g,"gi"),O=new RegExp("("+v+G+"[^;}]+;?)","gi"),k=new RegExp("("+v+d+"})","gi"),S=new RegExp("("+m+")ltr","gi"),N=new RegExp("("+m+")rtl","gi"),z=new RegExp(p+"(left)"+K+Y+G,"gi"),A=new RegExp(p+"(right)"+K+Y+G,"gi"),q=new RegExp(p+"(left)"+L,"gi"),U=new RegExp(p+"(right)"+L,"gi"),X=new RegExp(p+"(ltr)"+L,"gi"),C=new RegExp(p+"(rtl)"+L,"gi"),R=new RegExp(p+"([ns]?)e-resize","gi"),V=new RegExp(p+"([ns]?)w-resize","gi"),H=new RegExp(M+I+"(\\s+)"+I+"(\\s+)"+I+"(\\s+)"+I+F,"gi"),J=new RegExp(B+$+"(\\s+)"+$+"(\\s+)"+$+"(\\s+)"+$+F,"gi"),te=new RegExp("(background(?:-position)?\\s*:\\s*(?:[^:;}\\s]+\\s+)*?)("+P+")","gi"),ne=new RegExp("(background-position-x\\s*:\\s*)(-?"+b+"%)","gi"),ae=new RegExp("(border-radius\\s*:\\s*)"+I+"(?:(?:\\s+"+I+")(?:\\s+"+I+")?(?:\\s+"+I+")?)?(?:(?:(?:\\s*\\/\\s*)"+I+")(?:\\s+"+I+")?(?:\\s+"+I+")?(?:\\s+"+I+")?)?"+F,"gi"),xe=new RegExp("(box-shadow\\s*:\\s*(?:inset\\s*)?)"+I,"gi"),We=new RegExp("(text-shadow\\s*:\\s*)"+I+"(\\s*)"+$,"gi"),ke=new RegExp("(text-shadow\\s*:\\s*)"+$+"(\\s*)"+I,"gi"),we=new RegExp("(text-shadow\\s*:\\s*)"+I,"gi"),Te=new RegExp("(transform\\s*:[^;}]*)(translateX\\s*\\(\\s*)"+I+"(\\s*\\))","gi"),Se=new RegExp("(transform\\s*:[^;}]*)(translate\\s*\\(\\s*)"+I+"((?:\\s*,\\s*"+I+"){0,2}\\s*\\))","gi");function ie(de,nt,Ce){var it,st;return Ce.slice(-1)==="%"&&(it=Ce.indexOf("."),it!==-1?(st=Ce.length-it-2,Ce=100-parseFloat(Ce),Ce=Ce.toFixed(st)+"%"):Ce=100-parseFloat(Ce)+"%"),nt+Ce}function me(de){switch(de.length){case 4:de=[de[1],de[0],de[3],de[2]];break;case 3:de=[de[1],de[0],de[1],de[2]];break;case 2:de=[de[1],de[0]];break;case 1:de=[de[0]];break}return de.join(" ")}function Ge(de,nt){var Ce,it=[].slice.call(arguments),st=it.slice(2,6).filter(function(Nr){return Nr}),Ct=it.slice(6,10).filter(function(Nr){return Nr}),tr=it[10]||"";return Ct.length?Ce=me(st)+" / "+me(Ct):Ce=me(st),nt+Ce+tr}function rt(de){return parseFloat(de)===0?de:de[0]==="-"?de.slice(1):"-"+de}function Re(de,nt,Ce){return nt+rt(Ce)}function Tt(de,nt,Ce,it,st){return nt+Ce+rt(it)+st}function Lt(de,nt,Ce,it,st){return nt+Ce+it+rt(st)}return{transform:function(de,nt){var Ce=new n(O,a),it=new n(k,s),st=new n(E,l);return de=st.tokenize(it.tokenize(Ce.tokenize(de.replace("`","%60")))),nt.transformDirInUrl&&(de=de.replace(X,"$1"+o).replace(C,"$1ltr").replace(j,"rtl")),nt.transformEdgeInUrl&&(de=de.replace(q,"$1"+o).replace(U,"$1left").replace(j,"right")),de=de.replace(S,"$1"+o).replace(N,"$1ltr").replace(j,"rtl").replace(z,"$1"+o).replace(A,"$1left").replace(j,"right").replace(R,"$1$2"+o).replace(V,"$1$2e-resize").replace(j,"w-resize").replace(ae,Ge).replace(xe,Re).replace(We,Lt).replace(ke,Lt).replace(we,Re).replace(Te,Tt).replace(Se,Tt).replace(H,"$1$2$3$8$5$6$7$4$9").replace(J,"$1$2$3$8$5$6$7$4$9").replace(te,ie).replace(ne,ie),de=Ce.detokenize(it.detokenize(st.detokenize(de))),de}}}r=new i,e.exports?t.transform=function(o,a,s){var l;return typeof a=="object"?l=a:(l={},typeof a=="boolean"&&(l.transformDirInUrl=a),typeof s=="boolean"&&(l.transformEdgeInUrl=s)),r.transform(o,l)}:typeof window!="undefined"&&(window.cssjanus=r)})(id,id.exports);var RT=id.exports,od="comm",Pu="rule",g1="decl",IT="@media",NT="@import",LT="@supports",MT="@keyframes",jT=Math.abs,ad=String.fromCharCode;function b1(e){return e.trim()}function w1(e,t,r){return e.replace(t,r)}function sd(e,t){return e.charCodeAt(t)|0}function da(e,t,r){return e.slice(t,r)}function ln(e){return e.length}function E1(e){return e.length}function Du(e,t){return t.push(e),e}var Ru=1,Ii=1,S1=0,Zt=0,ot=0,Ni="";function ud(e,t,r,n,i,o,a){return{value:e,root:t,parent:r,type:n,props:i,children:o,line:Ru,column:Ii,length:a,return:""}}function FT(){return ot}function VT(){return ot=Zt>0?sd(Ni,--Zt):0,Ii--,ot===10&&(Ii=1,Ru--),ot}function fr(){return ot=Zt2||ld(ot)>3?"":" "}function zT(e,t){for(;--t&&fr()&&!(ot<48||ot>102||ot>57&&ot<65||ot>70&&ot<97););return Nu(e,Iu()+(t<6&&Ln()==32&&fr()==32))}function cd(e){for(;fr();)switch(ot){case e:return Zt;case 34:case 39:return cd(e===34||e===39?e:ot);case 40:e===41&&cd(e);break;case 92:fr();break}return Zt}function QT(e,t){for(;fr()&&e+ot!==47+10;)if(e+ot===42+42&&Ln()===47)break;return"/*"+Nu(t,Zt-1)+"*"+ad(e===47?e:fr())}function qT(e){for(;!ld(Ln());)fr();return Nu(e,Zt)}function HT(e){return BT(Lu("",null,null,null,[""],e=UT(e),0,[0],e))}function Lu(e,t,r,n,i,o,a,s,l){for(var f=0,y=0,b=a,c=0,m=0,u=0,h=1,p=1,d=1,v=0,g="",w=i,_=o,x=n,T=g;p;)switch(u=v,v=fr()){case 34:case 39:case 91:case 40:T+=O1(v);break;case 9:case 10:case 13:case 32:T+=$T(u);break;case 92:T+=zT(Iu()-1,7);continue;case 47:switch(Ln()){case 42:case 47:Du(WT(QT(fr(),Iu()),t,r),l);break;default:T+="/"}break;case 123*h:s[f++]=ln(T)*d;case 125*h:case 59:case 0:switch(v){case 0:case 125:p=0;case 59+y:m>0&&ln(T)-b&&Du(m>32?_1(T+";",n,r,b-1):_1(w1(T," ","")+";",n,r,b-2),l);break;case 59:T+=";";default:if(Du(x=x1(T,t,r,f,y,i,s,g,w=[],_=[],b),o),v===123)if(y===0)Lu(T,t,x,x,w,o,b,s,_);else switch(c){case 100:case 109:case 115:Lu(e,x,x,n&&Du(x1(e,x,x,0,0,i,s,g,i,w=[],b),_),i,_,b,s,n?w:_);break;default:Lu(T,x,x,x,[""],_,b,s,_)}}f=y=m=0,h=d=1,g=T="",b=a;break;case 58:b=1+ln(T),m=u;default:if(h<1){if(v==123)--h;else if(v==125&&h++==0&&VT()==125)continue}switch(T+=ad(v),v*h){case 38:d=y>0?1:(T+="\f",-1);break;case 44:s[f++]=(ln(T)-1)*d,d=1;break;case 64:Ln()===45&&(T+=O1(fr())),c=Ln(),y=ln(g=T+=qT(Iu())),v++;break;case 45:u===45&&ln(T)==2&&(h=0)}}return o}function x1(e,t,r,n,i,o,a,s,l,f,y){for(var b=i-1,c=i===0?o:[""],m=E1(c),u=0,h=0,p=0;u0?c[d]+" "+v:w1(v,/&\f/g,c[d])))&&(l[p++]=g);return ud(e,t,r,i===0?Pu:s,l,f,y)}function WT(e,t,r){return ud(e,t,r,od,ad(FT()),da(e,2,-2),0)}function _1(e,t,r,n){return ud(e,t,r,g1,da(e,0,n),da(e,n+1,-1),n)}function KT(e,t){for(var r="",n=E1(e),i=0;i1?arguments[1]:void 0)}},8457:function(c,m,u){var h=u(9974),p=u(7908),d=u(3411),v=u(7659),g=u(4411),w=u(6244),_=u(6135),x=u(8554),T=u(1246);c.exports=function(P){var I=p(P),M=g(this),B=arguments.length,$=B>1?arguments[1]:void 0,W=$!==void 0;W&&($=h($,B>2?arguments[2]:void 0,2));var K,G,Y,L,F,j,E=T(I),O=0;if(!E||this==Array&&v(E))for(K=w(I),G=M?new this(K):Array(K);K>O;O++)j=W?$(I[O],O):I[O],_(G,O,j);else for(F=(L=x(I,E)).next,G=M?new this:[];!(Y=F.call(L)).done;O++)j=W?d(L,$,[Y.value,O],!0):Y.value,_(G,O,j);return G.length=O,G}},1318:function(c,m,u){var h=u(5656),p=u(1400),d=u(6244),v=function(g){return function(w,_,x){var T,P=h(w),I=d(P),M=p(x,I);if(g&&_!=_){for(;I>M;)if((T=P[M++])!=T)return!0}else for(;I>M;M++)if((g||M in P)&&P[M]===_)return g||M||0;return!g&&-1}};c.exports={includes:v(!0),indexOf:v(!1)}},2092:function(c,m,u){var h=u(9974),p=u(8361),d=u(7908),v=u(6244),g=u(5417),w=[].push,_=function(x){var T=x==1,P=x==2,I=x==3,M=x==4,B=x==6,$=x==7,W=x==5||B;return function(K,G,Y,L){for(var F,j,E=d(K),O=p(E),k=h(G,Y,3),S=v(O),N=0,z=L||g,A=T?z(K,S):P||$?z(K,0):void 0;S>N;N++)if((W||N in O)&&(j=k(F=O[N],N,E),x))if(T)A[N]=j;else if(j)switch(x){case 3:return!0;case 5:return F;case 6:return N;case 2:w.call(A,F)}else switch(x){case 4:return!1;case 7:w.call(A,F)}return B?-1:I||M?M:A}};c.exports={forEach:_(0),map:_(1),filter:_(2),some:_(3),every:_(4),find:_(5),findIndex:_(6),filterReject:_(7)}},1194:function(c,m,u){var h=u(7293),p=u(5112),d=u(7392),v=p("species");c.exports=function(g){return d>=51||!h(function(){var w=[];return(w.constructor={})[v]=function(){return{foo:1}},w[g](Boolean).foo!==1})}},9341:function(c,m,u){var h=u(7293);c.exports=function(p,d){var v=[][p];return!!v&&h(function(){v.call(null,d||function(){throw 1},1)})}},3671:function(c,m,u){var h=u(9662),p=u(7908),d=u(8361),v=u(6244),g=function(w){return function(_,x,T,P){h(x);var I=p(_),M=d(I),B=v(I),$=w?B-1:0,W=w?-1:1;if(T<2)for(;;){if($ in M){P=M[$],$+=W;break}if($+=W,w?$<0:B<=$)throw TypeError("Reduce of empty array with no initial value")}for(;w?$>=0:B>$;$+=W)$ in M&&(P=x(P,M[$],$,I));return P}};c.exports={left:g(!1),right:g(!0)}},4362:function(c){var m=Math.floor,u=function(d,v){var g=d.length,w=m(g/2);return g<8?h(d,v):p(u(d.slice(0,w),v),u(d.slice(w),v),v)},h=function(d,v){for(var g,w,_=d.length,x=1;x<_;){for(w=x,g=d[x];w&&v(d[w-1],g)>0;)d[w]=d[--w];w!==x++&&(d[w]=g)}return d},p=function(d,v,g){for(var w=d.length,_=v.length,x=0,T=0,P=[];x=74)&&(h=v.match(/Chrome\/(\d+)/))&&(p=h[1]),c.exports=p&&+p},8008:function(c,m,u){var h=u(8113).match(/AppleWebKit\/(\d+)\./);c.exports=!!h&&+h[1]},748:function(c){c.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(c,m,u){var h=u(7854),p=u(1236).f,d=u(8880),v=u(1320),g=u(3505),w=u(9920),_=u(4705);c.exports=function(x,T){var P,I,M,B,$,W=x.target,K=x.global,G=x.stat;if(P=K?h:G?h[W]||g(W,{}):(h[W]||{}).prototype)for(I in T){if(B=T[I],M=x.noTargetGet?($=p(P,I))&&$.value:P[I],!_(K?I:W+(G?".":"#")+I,x.forced)&&M!==void 0){if(typeof B==typeof M)continue;w(B,M)}(x.sham||M&&M.sham)&&d(B,"sham",!0),v(P,I,B,x)}}},7293:function(c){c.exports=function(m){try{return!!m()}catch(u){return!0}}},7007:function(c,m,u){u(4916);var h=u(1320),p=u(2261),d=u(7293),v=u(5112),g=u(8880),w=v("species"),_=RegExp.prototype;c.exports=function(x,T,P,I){var M=v(x),B=!d(function(){var G={};return G[M]=function(){return 7},""[x](G)!=7}),$=B&&!d(function(){var G=!1,Y=/a/;return x==="split"&&((Y={}).constructor={},Y.constructor[w]=function(){return Y},Y.flags="",Y[M]=/./[M]),Y.exec=function(){return G=!0,null},Y[M](""),!G});if(!B||!$||P){var W=/./[M],K=T(M,""[x],function(G,Y,L,F,j){var E=Y.exec;return E===p||E===_.exec?B&&!j?{done:!0,value:W.call(Y,L,F)}:{done:!0,value:G.call(L,Y,F)}:{done:!1}});h(String.prototype,x,K[0]),h(_,M,K[1])}I&&g(_[M],"sham",!0)}},9974:function(c,m,u){var h=u(9662);c.exports=function(p,d,v){if(h(p),d===void 0)return p;switch(v){case 0:return function(){return p.call(d)};case 1:return function(g){return p.call(d,g)};case 2:return function(g,w){return p.call(d,g,w)};case 3:return function(g,w,_){return p.call(d,g,w,_)}}return function(){return p.apply(d,arguments)}}},6530:function(c,m,u){var h=u(9781),p=u(2597),d=Function.prototype,v=h&&Object.getOwnPropertyDescriptor,g=p(d,"name"),w=g&&function(){}.name==="something",_=g&&(!h||h&&v(d,"name").configurable);c.exports={EXISTS:g,PROPER:w,CONFIGURABLE:_}},5005:function(c,m,u){var h=u(7854),p=u(614),d=function(v){return p(v)?v:void 0};c.exports=function(v,g){return arguments.length<2?d(h[v]):h[v]&&h[v][g]}},1246:function(c,m,u){var h=u(648),p=u(8173),d=u(7497),v=u(5112)("iterator");c.exports=function(g){if(g!=null)return p(g,v)||p(g,"@@iterator")||d[h(g)]}},8554:function(c,m,u){var h=u(9662),p=u(9670),d=u(1246);c.exports=function(v,g){var w=arguments.length<2?d(v):g;if(h(w))return p(w.call(v));throw TypeError(String(v)+" is not iterable")}},8173:function(c,m,u){var h=u(9662);c.exports=function(p,d){var v=p[d];return v==null?void 0:h(v)}},647:function(c,m,u){var h=u(7908),p=Math.floor,d="".replace,v=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,g=/\$([$&'`]|\d{1,2})/g;c.exports=function(w,_,x,T,P,I){var M=x+w.length,B=T.length,$=g;return P!==void 0&&(P=h(P),$=v),d.call(I,$,function(W,K){var G;switch(K.charAt(0)){case"$":return"$";case"&":return w;case"`":return _.slice(0,x);case"'":return _.slice(M);case"<":G=P[K.slice(1,-1)];break;default:var Y=+K;if(Y===0)return W;if(Y>B){var L=p(Y/10);return L===0?W:L<=B?T[L-1]===void 0?K.charAt(1):T[L-1]+K.charAt(1):W}G=T[Y-1]}return G===void 0?"":G})}},7854:function(c,m,u){var h=function(p){return p&&p.Math==Math&&p};c.exports=h(typeof globalThis=="object"&&globalThis)||h(typeof window=="object"&&window)||h(typeof self=="object"&&self)||h(typeof u.g=="object"&&u.g)||function(){return this}()||Function("return this")()},2597:function(c,m,u){var h=u(7908),p={}.hasOwnProperty;c.exports=Object.hasOwn||function(d,v){return p.call(h(d),v)}},3501:function(c){c.exports={}},490:function(c,m,u){var h=u(5005);c.exports=h("document","documentElement")},4664:function(c,m,u){var h=u(9781),p=u(7293),d=u(317);c.exports=!h&&!p(function(){return Object.defineProperty(d("div"),"a",{get:function(){return 7}}).a!=7})},8361:function(c,m,u){var h=u(7293),p=u(4326),d="".split;c.exports=h(function(){return!Object("z").propertyIsEnumerable(0)})?function(v){return p(v)=="String"?d.call(v,""):Object(v)}:Object},9587:function(c,m,u){var h=u(614),p=u(111),d=u(7674);c.exports=function(v,g,w){var _,x;return d&&h(_=g.constructor)&&_!==w&&p(x=_.prototype)&&x!==w.prototype&&d(v,x),v}},2788:function(c,m,u){var h=u(614),p=u(5465),d=Function.toString;h(p.inspectSource)||(p.inspectSource=function(v){return d.call(v)}),c.exports=p.inspectSource},9909:function(c,m,u){var h,p,d,v=u(8536),g=u(7854),w=u(111),_=u(8880),x=u(2597),T=u(5465),P=u(6200),I=u(3501),M="Object already initialized",B=g.WeakMap;if(v||T.state){var $=T.state||(T.state=new B),W=$.get,K=$.has,G=$.set;h=function(L,F){if(K.call($,L))throw new TypeError(M);return F.facade=L,G.call($,L,F),F},p=function(L){return W.call($,L)||{}},d=function(L){return K.call($,L)}}else{var Y=P("state");I[Y]=!0,h=function(L,F){if(x(L,Y))throw new TypeError(M);return F.facade=L,_(L,Y,F),F},p=function(L){return x(L,Y)?L[Y]:{}},d=function(L){return x(L,Y)}}c.exports={set:h,get:p,has:d,enforce:function(L){return d(L)?p(L):h(L,{})},getterFor:function(L){return function(F){var j;if(!w(F)||(j=p(F)).type!==L)throw TypeError("Incompatible receiver, "+L+" required");return j}}}},7659:function(c,m,u){var h=u(5112),p=u(7497),d=h("iterator"),v=Array.prototype;c.exports=function(g){return g!==void 0&&(p.Array===g||v[d]===g)}},3157:function(c,m,u){var h=u(4326);c.exports=Array.isArray||function(p){return h(p)=="Array"}},614:function(c){c.exports=function(m){return typeof m=="function"}},4411:function(c,m,u){var h=u(7293),p=u(614),d=u(648),v=u(5005),g=u(2788),w=[],_=v("Reflect","construct"),x=/^\s*(?:class|function)\b/,T=x.exec,P=!x.exec(function(){}),I=function(M){if(!p(M))return!1;try{return _(Object,w,M),!0}catch(B){return!1}};c.exports=!_||h(function(){var M;return I(I.call)||!I(Object)||!I(function(){M=!0})||M})?function(M){if(!p(M))return!1;switch(d(M)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}return P||!!T.call(x,g(M))}:I},4705:function(c,m,u){var h=u(7293),p=u(614),d=/#|\.prototype\./,v=function(T,P){var I=w[g(T)];return I==x||I!=_&&(p(P)?h(P):!!P)},g=v.normalize=function(T){return String(T).replace(d,".").toLowerCase()},w=v.data={},_=v.NATIVE="N",x=v.POLYFILL="P";c.exports=v},5988:function(c,m,u){var h=u(111),p=Math.floor;c.exports=Number.isInteger||function(d){return!h(d)&&isFinite(d)&&p(d)===d}},111:function(c,m,u){var h=u(614);c.exports=function(p){return typeof p=="object"?p!==null:h(p)}},1913:function(c){c.exports=!1},7850:function(c,m,u){var h=u(111),p=u(4326),d=u(5112)("match");c.exports=function(v){var g;return h(v)&&((g=v[d])!==void 0?!!g:p(v)=="RegExp")}},2190:function(c,m,u){var h=u(614),p=u(5005),d=u(3307);c.exports=d?function(v){return typeof v=="symbol"}:function(v){var g=p("Symbol");return h(g)&&Object(v)instanceof g}},9212:function(c,m,u){var h=u(9670),p=u(8173);c.exports=function(d,v,g){var w,_;h(d);try{if(!(w=p(d,"return"))){if(v==="throw")throw g;return g}w=w.call(d)}catch(x){_=!0,w=x}if(v==="throw")throw g;if(_)throw w;return h(w),g}},3383:function(c,m,u){var h,p,d,v=u(7293),g=u(614),w=u(30),_=u(9518),x=u(1320),T=u(5112),P=u(1913),I=T("iterator"),M=!1;[].keys&&("next"in(d=[].keys())?(p=_(_(d)))!==Object.prototype&&(h=p):M=!0),h==null||v(function(){var B={};return h[I].call(B)!==B})?h={}:P&&(h=w(h)),g(h[I])||x(h,I,function(){return this}),c.exports={IteratorPrototype:h,BUGGY_SAFARI_ITERATORS:M}},7497:function(c){c.exports={}},6244:function(c,m,u){var h=u(7466);c.exports=function(p){return h(p.length)}},133:function(c,m,u){var h=u(7392),p=u(7293);c.exports=!!Object.getOwnPropertySymbols&&!p(function(){var d=Symbol();return!String(d)||!(Object(d)instanceof Symbol)||!Symbol.sham&&h&&h<41})},8536:function(c,m,u){var h=u(7854),p=u(614),d=u(2788),v=h.WeakMap;c.exports=p(v)&&/native code/.test(d(v))},3929:function(c,m,u){var h=u(7850);c.exports=function(p){if(h(p))throw TypeError("The method doesn't accept regular expressions");return p}},1574:function(c,m,u){var h=u(9781),p=u(7293),d=u(1956),v=u(5181),g=u(5296),w=u(7908),_=u(8361),x=Object.assign,T=Object.defineProperty;c.exports=!x||p(function(){if(h&&x({b:1},x(T({},"a",{enumerable:!0,get:function(){T(this,"b",{value:3,enumerable:!1})}}),{b:2})).b!==1)return!0;var P={},I={},M=Symbol(),B="abcdefghijklmnopqrst";return P[M]=7,B.split("").forEach(function($){I[$]=$}),x({},P)[M]!=7||d(x({},I)).join("")!=B})?function(P,I){for(var M=w(P),B=arguments.length,$=1,W=v.f,K=g.f;B>$;)for(var G,Y=_(arguments[$++]),L=W?d(Y).concat(W(Y)):d(Y),F=L.length,j=0;F>j;)G=L[j++],h&&!K.call(Y,G)||(M[G]=Y[G]);return M}:x},30:function(c,m,u){var h,p=u(9670),d=u(6048),v=u(748),g=u(3501),w=u(490),_=u(317),x=u(6200)("IE_PROTO"),T=function(){},P=function(B){return"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Free German Courses Level A1 to B1 | DW Learn German
-
-
-
-
-
-
-
-
-
-
diff --git a/sources-gen/hooks/useAudio.jsx b/sources-gen/hooks/useAudio.jsx
deleted file mode 100644
index 2595b9d..0000000
--- a/sources-gen/hooks/useAudio.jsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import { useContext } from 'react';
-import { AudioContext } from '../context/AudioContext';
-
-export const useAudio = () => {
- const [
- audiosRefArray,
- setAudiosRefArray,
- wrongAnswerAudioRef,
- correctAnswerAudioRef,
- ] = useContext(AudioContext);
-
- const stopOtherAudios = index => {
- const currentAudio = audiosRefArray[index];
- audiosRefArray.forEach(audio => {
- if (audio !== currentAudio) {
- audio.current.pause();
- // eslint-disable-next-line fp/no-mutation,no-param-reassign
- audio.current.currentTime = 0;
- }
- });
- };
- const playAudio = (e, ref) => {
- e.preventDefault();
- const index = audiosRefArray.indexOf(ref);
- stopOtherAudios(index);
- audiosRefArray[index].current.play();
- };
-
- const addRef = ref => {
- // eslint-disable-next-line fp/no-mutating-methods
- audiosRefArray.push(ref);
- setAudiosRefArray(audiosRefArray);
- };
-
- const playWrongDefaultAudioFeedBack = () => {
- wrongAnswerAudioRef.current.play();
- };
-
- const playCorrectDefaultAudioFeedBack = () => {
- correctAnswerAudioRef.current.play();
- };
-
- return {
- playAudio,
- addRef,
- playWrongDefaultAudioFeedBack,
- playCorrectDefaultAudioFeedBack,
- };
-};
diff --git a/sources-gen/hooks/useCheckSessionTimeout.jsx b/sources-gen/hooks/useCheckSessionTimeout.jsx
deleted file mode 100644
index cf0a5a2..0000000
--- a/sources-gen/hooks/useCheckSessionTimeout.jsx
+++ /dev/null
@@ -1,29 +0,0 @@
-/* eslint-disable react-hooks/exhaustive-deps */
-import { useDispatch, useSelector } from 'react-redux';
-import { useEffect } from 'react';
-import { useHistory } from 'react-router-dom';
-import { checkUserProfile } from '../services/userService';
-import { loginTimeout } from '../state/user/userDuck';
-import { feedbackHelper } from '../utils/url/feedbackHelpers';
-import { userSelector } from '../state/user/userSelectors';
-
-export const useCheckSessionTimeout = langCode => {
- const dispatch = useDispatch();
- const { isLoggedIn } = useSelector(userSelector);
- const history = useHistory();
-
- useEffect(() => {
- if (isLoggedIn) {
- checkUserProfile()
- .then(response => {
- if (response.status === 401) {
- dispatch(loginTimeout());
- history.push(feedbackHelper.forSessionTimeout('', langCode));
- }
- })
- .catch(() => {
- history.push(feedbackHelper.forGeneralError(langCode));
- });
- }
- }, [isLoggedIn]);
-};
diff --git a/sources-gen/hooks/useChineseSimpleTraditionalSwitch.jsx b/sources-gen/hooks/useChineseSimpleTraditionalSwitch.jsx
deleted file mode 100644
index a3d5504..0000000
--- a/sources-gen/hooks/useChineseSimpleTraditionalSwitch.jsx
+++ /dev/null
@@ -1,103 +0,0 @@
-/* eslint-disable no-undef, react-hooks/exhaustive-deps */
-import { useEffect, useState } from 'react';
-import { useLocation } from 'react-router-dom';
-import { useLocalStorage } from './useLocalStorage';
-import { useTimeout } from './useTimeout';
-import globals from '../utils/globals';
-import { useScripts } from './useScripts';
-import { LANG_CODES } from '../utils/mappers/langMapper';
-
-// located in public folder
-// @VisibleForTesting
-export const tongwenScripts = [
- '/tongwen/tongwen_core.min.js',
- '/tongwen/tongwen_table_s2t.min.js',
- '/tongwen/tongwen_table_t2s.min.js',
- '/tongwen/tongwen_table_ps2t.min.js',
- '/tongwen/tongwen_table_pt2s.min.js',
-];
-
-export const TRADITIONAL_CHIN_LOCAL_STORAGE_KEY = 'isTraditionalChin';
-export const URL_GET_PARAM_NAME = 'zhongwen';
-export const URL_GET_PARAM_SIMPLIFIED = 'simp';
-export const URL_GET_PARAM_TRADITIONAL = 'trad';
-
-const TOGGLE_BUTTON_SIMPLE_TEXT_CONTENT = '简';
-const TOGGLE_BUTTON_TRADITIONAL_TEXT_CONTENT = '繁';
-
-export const useChineseSimpleTraditionalSwitch = (langCode, toggleButtonId) => {
- const isChineseLangCode = langCode === LANG_CODES.CHINESE;
- const scripts = isChineseLangCode ? tongwenScripts : [];
- const [isScriptsLoaded, setScriptsLoaded] = useState(false);
- const [isTranslatedFirstTime, setTranslatedFirstTime] = useState(false);
- useScripts(scripts, () => setScriptsLoaded(true));
-
- const [isTraditionalChin, setIsTraditionalChin] = useLocalStorage(
- TRADITIONAL_CHIN_LOCAL_STORAGE_KEY,
- );
- const { search } = useLocation();
-
- const setToggleButtonTextContent = content => {
- // eslint-disable-next-line fp/no-mutation
- globals.document.getElementById(toggleButtonId).textContent = content;
- };
-
- // used to consider url request param if available
- useEffect(() => {
- if (search) {
- const cleanedSearch = search.replace('?', '');
- const urlParams = new URLSearchParams(cleanedSearch);
- const chineseVersionRequestParam = urlParams.get(URL_GET_PARAM_NAME);
- if (chineseVersionRequestParam === URL_GET_PARAM_SIMPLIFIED) {
- setIsTraditionalChin(false);
- } else if (chineseVersionRequestParam === URL_GET_PARAM_TRADITIONAL) {
- setIsTraditionalChin(true);
- }
- }
- }, []);
-
- // translate content on first load related to current local storage value
- useTimeout({
- callback: () => {
- if (isChineseLangCode && isScriptsLoaded) {
- isTraditionalChin
- ? TongWen.trans2Trad(globals.document)
- : TongWen.trans2Simp(globals.document);
- setTranslatedFirstTime(true);
- }
- },
- delay: 300,
- });
-
- // if translated initially or later with toggling button - we need to set button content again
- // because the simple one is also translated into the traditional one.
- useTimeout(
- {
- callback: () => {
- if (isTraditionalChin) {
- setToggleButtonTextContent(TOGGLE_BUTTON_SIMPLE_TEXT_CONTENT);
- } else {
- setToggleButtonTextContent(TOGGLE_BUTTON_TRADITIONAL_TEXT_CONTENT);
- }
- },
- delay: 300,
- },
- [isTraditionalChin, isTranslatedFirstTime],
- );
-
- const trans2Simple = () => {
- if (isScriptsLoaded) {
- TongWen.trans2Simp(globals.document);
- setIsTraditionalChin(false);
- }
- };
-
- const trans2Traditional = () => {
- if (isScriptsLoaded) {
- TongWen.trans2Trad(globals.document);
- setIsTraditionalChin(true);
- }
- };
-
- return { isTraditionalChin, trans2Simple, trans2Traditional };
-};
diff --git a/sources-gen/hooks/useCourseData.jsx b/sources-gen/hooks/useCourseData.jsx
deleted file mode 100644
index 35fad59..0000000
--- a/sources-gen/hooks/useCourseData.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { createContext, useContext } from 'react';
-
-// CONTEXT
-export const CourseDataContext = createContext({});
-
-// USAGE HOOK
-export const useCourseData = () => useContext(CourseDataContext);
diff --git a/sources-gen/hooks/useDebounce.jsx b/sources-gen/hooks/useDebounce.jsx
deleted file mode 100644
index 5225d8c..0000000
--- a/sources-gen/hooks/useDebounce.jsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { useState, useEffect } from 'react';
-
-export default function useDebounce(value, delay) {
- const [debouncedValue, setDebouncedValue] = useState(value);
-
- useEffect(() => {
- const handler = setTimeout(() => {
- setDebouncedValue(value);
- }, delay);
- return () => {
- clearTimeout(handler);
- };
- }, [delay, value]);
-
- return debouncedValue;
-}
diff --git a/sources-gen/hooks/useExerciseManager.jsx b/sources-gen/hooks/useExerciseManager.jsx
deleted file mode 100644
index 58353a4..0000000
--- a/sources-gen/hooks/useExerciseManager.jsx
+++ /dev/null
@@ -1,157 +0,0 @@
-import { useSelector } from 'react-redux';
-import { useParams } from 'react-router';
-import {
- findInquiryLearnProgressSelector,
- findLessonLearnProgressSelector,
-} from '../state/progress/learnProgressSelectors';
-import {
- createLinkToResultPage,
- getLessonExerciseUrl,
- getLessonUrl,
-} from '../utils/url/urlFactory';
-import { normalizeUrlName } from '../utils/url/url';
-import { isLessonInImproveModeSelector } from '../state/mode/lessonExerciseModeSelectors';
-
-export const useExerciseManager = ({
- lessonName,
- lessonExerciseOverviewItems,
- courseId,
- isFinalTest,
-}) => {
- const { langCode, lessonId, exerciseId } = useParams();
- const lessonProgress = useSelector(findLessonLearnProgressSelector(+lessonId));
- const isLessonInImproveMode = useSelector(isLessonInImproveModeSelector(+lessonId));
- const inquiryProgresses = useSelector(findInquiryLearnProgressSelector(+lessonId, +exerciseId));
-
- const generateNextExercisePath = nextItem => {
- if (!nextItem) {
- return undefined;
- }
-
- return getLessonExerciseUrl(
- langCode,
- lessonId,
- normalizeUrlName(nextItem.exerciseName),
- nextItem.exerciseId,
- );
- };
-
- const mapToFlatLessonExercises = lessonExerciseItems => {
- return lessonExerciseItems.map(item => ({
- exerciseId: item.targetId,
- exerciseName: item.target.name,
- }));
- };
-
- const filterExercisesWithNoFullScore = lessonExercises => {
- return lessonExercises.filter(lessonExercise => {
- const existingProgress = lessonProgress.exerciseProgresses.find(
- exerciseProgress => exerciseProgress.cosExerciseId === lessonExercise.exerciseId,
- );
- if (!existingProgress) {
- return true;
- }
- return existingProgress.maxPoints !== existingProgress.resultPoints;
- });
- };
-
- const getFirstExercisePath = isImproveMode => {
- const lessonExercises = mapToFlatLessonExercises(lessonExerciseOverviewItems);
-
- if (!lessonProgress || isFinalTest) {
- return getLessonExerciseUrl(
- langCode,
- lessonId,
- normalizeUrlName(lessonExercises[0].exerciseName),
- lessonExercises[0].exerciseId,
- );
- }
-
- // eslint-disable-next-line fp/no-let
- let firstExerciseItem;
- if (isLessonInImproveMode || isImproveMode) {
- const exercisesWithNoFullScore = filterExercisesWithNoFullScore(lessonExercises);
- // eslint-disable-next-line fp/no-mutation,prefer-destructuring
- firstExerciseItem = exercisesWithNoFullScore[0];
- } else {
- const exerciseIdsWithProgress = lessonProgress.exerciseProgresses.map(
- exerciseProgress => exerciseProgress.cosExerciseId,
- );
- // eslint-disable-next-line fp/no-mutation
- firstExerciseItem = lessonExercises.find(
- exercise => !exerciseIdsWithProgress.includes(exercise.exerciseId),
- );
- }
-
- if (firstExerciseItem) {
- return getLessonExerciseUrl(
- langCode,
- lessonId,
- normalizeUrlName(firstExerciseItem.exerciseName),
- firstExerciseItem.exerciseId,
- );
- }
-
- const lessonPath = getLessonUrl(lessonId, langCode, normalizeUrlName(lessonName));
- return createLinkToResultPage({ courseId, isFinalTest, lessonPath });
- };
-
- const getCurrentIndex = () => {
- const currentExerciseItem = lessonExerciseOverviewItems.find(
- item => item.targetId === +exerciseId,
- );
- return lessonExerciseOverviewItems.indexOf(currentExerciseItem);
- };
-
- const getNextExercisePath = () => {
- const lessonExercises = mapToFlatLessonExercises(lessonExerciseOverviewItems);
-
- if (isLessonInImproveMode) {
- // eslint-disable-next-line fp/no-mutating-methods
- const remainingLessonExercises = [...lessonExercises].splice(getCurrentIndex() + 1);
- const remainingExercisesWithNoFullScore = filterExercisesWithNoFullScore(
- remainingLessonExercises,
- );
- const [nextItem] = remainingExercisesWithNoFullScore;
- return generateNextExercisePath(nextItem);
- }
- const nextItem = lessonExercises[getCurrentIndex() + 1];
- return generateNextExercisePath(nextItem);
- };
-
- const getFullScoreAchieved = () => {
- if (!lessonProgress) {
- return false;
- }
- return lessonProgress.maxPointsForAllExercises === lessonProgress.resultPoints;
- };
-
- const filterExercises = data => {
- if (!isLessonInImproveMode) {
- return data;
- }
-
- const {
- content,
- content: { inquiries = [] },
- } = data;
-
- const remainingInquiries = inquiries.filter(inquiry => {
- const existingProgress = inquiryProgresses.find(
- inquiryProgress => inquiryProgress.inquiryId === inquiry.id,
- );
- return !existingProgress || existingProgress.score !== existingProgress.maxScore;
- });
-
- return { content: { ...content, inquiries: remainingInquiries } };
- };
-
- return {
- firstExerciseLink: isImproveMode => getFirstExercisePath(isImproveMode),
- nextExerciseLink: () => getNextExercisePath(),
- isFullScoreAchieved: () => getFullScoreAchieved(),
- currentExerciseCount: getCurrentIndex() + 1,
- allExerciseCount: lessonExerciseOverviewItems.length,
- filterExerciseDataIfInImproveMode: data => filterExercises(data),
- };
-};
diff --git a/sources-gen/hooks/useFrontendConfig.jsx b/sources-gen/hooks/useFrontendConfig.jsx
deleted file mode 100644
index b7ba850..0000000
--- a/sources-gen/hooks/useFrontendConfig.jsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { createContext, useContext } from 'react';
-
-// eslint-disable-next-line fp/no-let
-let frontendConfig = null;
-
-export function hasFrontendConfig() {
- return !!frontendConfig;
-}
-
-export function setFrontendConfig(inFrontendConfig) {
- frontendConfig = inFrontendConfig; // eslint-disable-line fp/no-mutation
-}
-
-export function getFrontendConfig() {
- return frontendConfig;
-}
-
-export function clearFrontendConfig() {
- frontendConfig = null; // eslint-disable-line fp/no-mutation
-}
-
-// CONTEXT
-export const FrontendConfigContext = createContext({ getFrontendConfig });
-
-// USAGE HOOK
-export const useFrontendConfig = () => useContext(FrontendConfigContext).getFrontendConfig();
diff --git a/sources-gen/hooks/useIsMountedRef.jsx b/sources-gen/hooks/useIsMountedRef.jsx
deleted file mode 100644
index 43d4c81..0000000
--- a/sources-gen/hooks/useIsMountedRef.jsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { useEffect, useRef } from 'react';
-
-export const useIsMountedRef = () => {
- const isMountedRef = useRef(false);
-
- const setMounted = isMounted => {
- // eslint-disable-next-line fp/no-mutation
- isMountedRef.current = isMounted;
- };
-
- useEffect(() => {
- setMounted(true);
- return () => setMounted(false);
- });
-
- return isMountedRef;
-};
diff --git a/sources-gen/hooks/useLocalStorage.jsx b/sources-gen/hooks/useLocalStorage.jsx
deleted file mode 100644
index 4957524..0000000
--- a/sources-gen/hooks/useLocalStorage.jsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { useState, useEffect } from 'react';
-import globals from '../utils/globals';
-import { isServer } from '../utils/ssr';
-
-const CUSTOM_LS_EVENT_NAME = 'local-storage';
-
-const readValue = key => {
- if (isServer()) {
- return null;
- }
- return JSON.parse(globals.localStorage.getItem(key));
-};
-
-export const useLocalStorage = key => {
- const [storedValue, setStoredValue] = useState(readValue(key));
-
- const setValue = value => {
- if (!isServer()) {
- globals.localStorage.setItem(key, JSON.stringify(value));
- setStoredValue(value);
-
- // We dispatch a custom event so every useLocalStorage hook are notified
- globals.window.dispatchEvent(new Event(CUSTOM_LS_EVENT_NAME));
- }
- };
-
- useEffect(() => {
- const handleStorageChange = () => {
- setStoredValue(readValue(key));
- };
-
- // this only works for other documents, not the current one
- globals.window.addEventListener('storage', handleStorageChange);
- // this is a custom event, triggered in writeValueToLocalStorage
- globals.window.addEventListener(CUSTOM_LS_EVENT_NAME, handleStorageChange);
-
- return () => {
- globals.window.removeEventListener('storage', handleStorageChange);
- globals.window.removeEventListener(CUSTOM_LS_EVENT_NAME, handleStorageChange);
- };
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, []);
-
- return [storedValue, setValue];
-};
diff --git a/sources-gen/hooks/useLocationGetter.jsx b/sources-gen/hooks/useLocationGetter.jsx
deleted file mode 100644
index b345238..0000000
--- a/sources-gen/hooks/useLocationGetter.jsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { useEffect, useState } from 'react';
-import globals from '../utils/globals';
-
-export const useLocationGetter = () => {
- const [location, setLocation] = useState({});
- const [langCode, setLangCode] = useState('');
- useEffect(() => {
- const locationFromWindow = globals.window.location;
- const pathnameFragments = locationFromWindow.pathname
- ? locationFromWindow.pathname.split('/')
- : [];
- const langCodeFromLocation = pathnameFragments.length > 1 ? pathnameFragments[1] : '';
- setLocation(locationFromWindow);
- setLangCode(langCodeFromLocation);
- }, []);
- return { location, langCode };
-};
diff --git a/sources-gen/hooks/useLocationQueryParam.jsx b/sources-gen/hooks/useLocationQueryParam.jsx
deleted file mode 100644
index b4aa232..0000000
--- a/sources-gen/hooks/useLocationQueryParam.jsx
+++ /dev/null
@@ -1,8 +0,0 @@
-import { useLocation } from 'react-router-dom';
-import { getQueryParamValueFrom } from '../utils/url/url';
-
-export const useLocationQueryParam = paramName => {
- const { search } = useLocation();
-
- return getQueryParamValueFrom({ from: search, value: paramName });
-};
diff --git a/sources-gen/hooks/useMetaDescription.jsx b/sources-gen/hooks/useMetaDescription.jsx
deleted file mode 100644
index afd87ee..0000000
--- a/sources-gen/hooks/useMetaDescription.jsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { html2text, PAGE_TYPE_TO_DESCRIPTION_TRANSLATION_KEYS } from '../utils/pageMetadata';
-import { useTranslation } from './useTranslation';
-
-export const useMetaDescription = ({
- pageType,
- contentName,
- teaser,
- description,
- useTeaserAsDescription,
- useDescriptionTranslation,
-} = {}) => {
- const descriptionTranslation = useTranslation({
- key: PAGE_TYPE_TO_DESCRIPTION_TRANSLATION_KEYS[pageType],
- parameters: { first: contentName },
- });
-
- return (
- (useTeaserAsDescription && html2text({ html: teaser })) ||
- (useDescriptionTranslation && descriptionTranslation) ||
- html2text({ html: description })
- );
-};
diff --git a/sources-gen/hooks/useMetaKeywords.jsx b/sources-gen/hooks/useMetaKeywords.jsx
deleted file mode 100644
index b4c5b67..0000000
--- a/sources-gen/hooks/useMetaKeywords.jsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { createKeywords, PAGE_TYPE_TO_KEYWORDS_TRANSLATION_KEYS } from '../utils/pageMetadata';
-import { useTranslation } from './useTranslation';
-
-export const useMetaKeywords = ({ pageType, useOnlyCmsKeywords, keywordStrings } = {}) => {
- const defaultKeywords = useTranslation('metadata.keywords');
- const pageKeywords = useTranslation(PAGE_TYPE_TO_KEYWORDS_TRANSLATION_KEYS[pageType]);
-
- const additionalKeyword = pageKeywords || defaultKeywords;
- const keywords = useOnlyCmsKeywords ? keywordStrings : [...keywordStrings, additionalKeyword];
-
- return createKeywords({ keywords });
-};
diff --git a/sources-gen/hooks/useMetaTitle.jsx b/sources-gen/hooks/useMetaTitle.jsx
deleted file mode 100644
index b68dfa8..0000000
--- a/sources-gen/hooks/useMetaTitle.jsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { useI18nContext } from '../context/I18nContext';
-import { createTitle, PAGE_TYPE_TO_TITLE_TRANSLATION_KEYS } from '../utils/pageMetadata';
-
-export const useMetaTitle = ({
- pageType,
- translationFirst,
- contentName,
- parentContentName,
-} = {}) => {
- const { i18n } = useI18nContext();
- const pageTitleTranslationKeys = PAGE_TYPE_TO_TITLE_TRANSLATION_KEYS[pageType];
- const pageTitleTranslations = pageTitleTranslationKeys
- ? pageTitleTranslationKeys.map(key => i18n.t(key))
- : [];
- const siteName = i18n.t('metadata.siteName');
-
- const titleParts = translationFirst
- ? [...pageTitleTranslations, contentName, parentContentName, siteName]
- : [contentName, ...pageTitleTranslations, parentContentName, siteName];
-
- return createTitle({ titleParts });
-};
diff --git a/sources-gen/hooks/useMetadata.jsx b/sources-gen/hooks/useMetadata.jsx
deleted file mode 100644
index 3a4dc29..0000000
--- a/sources-gen/hooks/useMetadata.jsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { createContext, useContext } from 'react';
-
-// eslint-disable-next-line fp/no-let
-let metadata = null;
-
-export function hasMetadata() {
- return !!metadata;
-}
-
-export function setMetadata(inMetadata) {
- metadata = inMetadata; // eslint-disable-line fp/no-mutation
-}
-
-export function getMetadata() {
- return metadata;
-}
-
-export function clearMetadata() {
- metadata = null; // eslint-disable-line fp/no-mutation
-}
-
-// CONTEXT
-export const FrontendMetadataContext = createContext({ getMetadata });
-
-// USAGE HOOK
-export const useMetadata = () => useContext(FrontendMetadataContext).getMetadata();
diff --git a/sources-gen/hooks/useRedirectAfterLogOut.jsx b/sources-gen/hooks/useRedirectAfterLogOut.jsx
deleted file mode 100644
index 8797494..0000000
--- a/sources-gen/hooks/useRedirectAfterLogOut.jsx
+++ /dev/null
@@ -1,20 +0,0 @@
-/* eslint-disable react-hooks/exhaustive-deps */
-import { useHistory } from 'react-router-dom';
-import { useDispatch, useSelector } from 'react-redux';
-import { useEffect } from 'react';
-import { feedbackHelper } from '../utils/url/feedbackHelpers';
-import { setHasLogOutRequestBeenCalled } from '../state/user/userDuck';
-import { userSelector } from '../state/user/userSelectors';
-
-export const useRedirectAfterLogOut = langCode => {
- const history = useHistory();
- const dispatch = useDispatch();
- const userState = useSelector(userSelector);
-
- useEffect(() => {
- if (userState.hasLogOutRequestBeenCalled) {
- history.push(feedbackHelper.forLogout(langCode));
- dispatch(setHasLogOutRequestBeenCalled(false));
- }
- }, [userState.hasLogOutRequestBeenCalled]);
-};
diff --git a/sources-gen/hooks/useRtl.jsx b/sources-gen/hooks/useRtl.jsx
deleted file mode 100644
index 38a272f..0000000
--- a/sources-gen/hooks/useRtl.jsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { useContext } from 'react';
-import { RtlContext } from '../context/rtlContext';
-
-/**
- * @deprecated since we use StylisRTLPlugin in MainPage we should not need to distinguish between
- * ltr/rtl in components because it's managed globally. This context still exists for old copy&paste
- * components because it has not been removed yet. The isRtl result of this provider is now always
- * undefined because the value is not set anymore.
- */
-export const useRtlContext = () => useContext(RtlContext);
diff --git a/sources-gen/hooks/useScripts.jsx b/sources-gen/hooks/useScripts.jsx
deleted file mode 100644
index 1cf6b7a..0000000
--- a/sources-gen/hooks/useScripts.jsx
+++ /dev/null
@@ -1,33 +0,0 @@
-/* eslint-disable fp/no-mutation, react-hooks/exhaustive-deps */
-import { useEffect } from 'react';
-import globals from '../utils/globals';
-
-const loadScript = (url, target) =>
- new Promise((resolve, reject) => {
- const tag = globals.document.createElement('script');
- tag.async = false;
- tag.src = url;
- target.appendChild(tag);
- tag.addEventListener('load', resolve, {
- once: true,
- });
- tag.addEventListener('error', reject, {
- once: true,
- });
- });
-
-export const useScripts = (scriptUrls = [], cb) => {
- useEffect(async () => {
- if (scriptUrls.length > 0) {
- const querySelectorForAllScriptTags = scriptUrls.map(
- scriptUrl => `script[src="${scriptUrl}"]`,
- );
- const existingScriptTags = globals.document.querySelectorAll(querySelectorForAllScriptTags);
- if (existingScriptTags.length !== scriptUrls.length) {
- Promise.all(scriptUrls.map(url => loadScript(url, globals.document.body))).then(cb);
- } else {
- cb();
- }
- }
- }, [scriptUrls]);
-};
diff --git a/sources-gen/hooks/useScrollToTop.jsx b/sources-gen/hooks/useScrollToTop.jsx
deleted file mode 100644
index 7cc6777..0000000
--- a/sources-gen/hooks/useScrollToTop.jsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { useEffect } from 'react';
-import { useLocation } from 'react-router-dom';
-import { isServer } from '../utils/ssr';
-import globals from '../utils/globals';
-
-export const useScrollToTop = () => {
- const { pathname } = useLocation();
-
- useEffect(() => {
- !isServer() && globals.window.scrollTo(0, 0);
- }, [pathname]);
-};
diff --git a/sources-gen/hooks/useSyncLessonProgress.jsx b/sources-gen/hooks/useSyncLessonProgress.jsx
deleted file mode 100644
index f82efbf..0000000
--- a/sources-gen/hooks/useSyncLessonProgress.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { useDispatch, useSelector } from 'react-redux';
-import { useEffect } from 'react';
-import { userSelector } from '../state/user/userSelectors';
-import { syncLessonProgress } from '../state/progress/learnProgressDuck';
-import { isLessonProgressSyncRequiredSelector } from '../state/progress/learnProgressSelectors';
-
-export const useSyncLearnProgress = () => {
- const { isLoggedIn } = useSelector(userSelector);
- const isLessonProgressSyncRequired = useSelector(isLessonProgressSyncRequiredSelector);
- const dispatch = useDispatch();
-
- useEffect(() => {
- if (isLoggedIn && isLessonProgressSyncRequired) {
- dispatch(syncLessonProgress());
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isLoggedIn]);
-};
diff --git a/sources-gen/hooks/useTimeout.jsx b/sources-gen/hooks/useTimeout.jsx
deleted file mode 100644
index 0ee84fb..0000000
--- a/sources-gen/hooks/useTimeout.jsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { useEffect, useRef } from 'react';
-import { isServer } from '../utils/ssr';
-import globals from '../utils/globals';
-
-export const useTimeout = ({ callback, delay = 100, conditional = true }, triggers = []) => {
- const savedCallback = useRef();
-
- useEffect(() => {
- // eslint-disable-next-line fp/no-mutation
- savedCallback.current = callback;
- }, [callback]);
-
- useEffect(() => {
- const tick = () => savedCallback.current();
- if (isServer() || !conditional) {
- return undefined;
- }
- const handleId = globals.window.setTimeout(tick, delay);
- return () => globals.window.clearTimeout(handleId);
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [delay, conditional, ...triggers]);
-};
diff --git a/sources-gen/hooks/useToggle.jsx b/sources-gen/hooks/useToggle.jsx
deleted file mode 100644
index 82cfd4a..0000000
--- a/sources-gen/hooks/useToggle.jsx
+++ /dev/null
@@ -1,20 +0,0 @@
-/* eslint-disable no-shadow */
-import { useCallback, useState } from 'react';
-
-export const useToggle = ({ initialState = false, key = 'Enter' } = {}) => {
- const [isEnabled, setEnabled] = useState(initialState);
- const toggleOnClick = useCallback(() => {
- setEnabled(isEnabled => !isEnabled);
- }, []);
-
- const toggleOnKeyPress = useCallback(
- e => {
- if (e.key === key) {
- setEnabled(isEnabled => !isEnabled);
- }
- },
- [key],
- );
-
- return [isEnabled, { toggleOnClick, toggleOnKeyPress }];
-};
diff --git a/sources-gen/hooks/useTransition.jsx b/sources-gen/hooks/useTransition.jsx
deleted file mode 100644
index ed61f7c..0000000
--- a/sources-gen/hooks/useTransition.jsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { useState } from 'react';
-import { useTimeout } from './useTimeout';
-
-export const TRANSITION_STATUS = Object.freeze({
- INITIAL: 'initial',
- BUSY: 'busy',
- READY: 'ready',
-});
-
-export const useTransition = ({ delay }) => {
- const [transition, setTransition] = useState({ status: TRANSITION_STATUS.INITIAL });
-
- useTimeout(
- {
- callback: () => {
- if (transition.status === TRANSITION_STATUS.BUSY) {
- transition.onTransitionEnd();
- }
- setTransition({ status: TRANSITION_STATUS.READY });
- },
- delay,
- },
- [transition],
- );
-
- const startTransition = newTransition => {
- setTransition({ ...newTransition, status: TRANSITION_STATUS.BUSY });
- };
-
- return { transitionStatus: transition.status, startTransition };
-};
diff --git a/sources-gen/hooks/useTranslation.jsx b/sources-gen/hooks/useTranslation.jsx
deleted file mode 100644
index 1956ffa..0000000
--- a/sources-gen/hooks/useTranslation.jsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { useI18nContext } from '../context/I18nContext';
-
-const isPlainKey = translation => typeof translation === 'string' || !translation;
-
-const normalizeTranslation = translation =>
- isPlainKey(translation) ? { key: translation, parameters: {} } : translation;
-
-export const useTranslation = translation => {
- const { i18n } = useI18nContext();
- const { key, parameters } = normalizeTranslation(translation);
- if (!key) {
- return null;
- }
- return i18n.t(key, parameters);
-};
diff --git a/sources-gen/hooks/useValidateTicketAndLoginUser.jsx b/sources-gen/hooks/useValidateTicketAndLoginUser.jsx
deleted file mode 100644
index c742d48..0000000
--- a/sources-gen/hooks/useValidateTicketAndLoginUser.jsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import { useDispatch } from 'react-redux';
-import { useHistory } from 'react-router-dom';
-import { useEffect } from 'react';
-import { feedbackHelper } from '../utils/url/feedbackHelpers';
-import { validateUserTicket } from '../services/userService';
-import { logInUser } from '../state/user/userDuck';
-import { removeSearchParam } from '../utils/url/urlUtils';
-import { getTicketDomain, getTicketFromUrlParam } from '../utils/userUtils';
-import { USER } from '../constants/userUrl';
-import { useGlobalsContext } from '../context/GlobalsContext';
-
-export const useValidateTicketAndLoginUser = (location, langCode) => {
- const dispatch = useDispatch();
- const { origin } = useGlobalsContext().window.location;
- const ticket = getTicketFromUrlParam(location);
- const history = useHistory();
-
- useEffect(() => {
- const ticketDomain = getTicketDomain(origin, location);
- if (ticket && ticketDomain) {
- validateUserTicket(ticket, ticketDomain)
- .then(response => {
- if (!response.ok) {
- // eslint-disable-next-line fp/no-throw
- throw new Error(response.status);
- } else {
- dispatch(logInUser());
- }
- })
- .then(() => {
- history.push({
- search: removeSearchParam(location, USER.TICKET_PARAM_NAME),
- });
- })
- .catch(() => {
- history.push(feedbackHelper.forGeneralError(langCode));
- });
- }
- }, [ticket, location.pathname]); // eslint-disable-line react-hooks/exhaustive-deps
-};
diff --git a/sources-gen/hooks/vocabularySearchHooks.jsx b/sources-gen/hooks/vocabularySearchHooks.jsx
deleted file mode 100644
index ff33c1f..0000000
--- a/sources-gen/hooks/vocabularySearchHooks.jsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import { useEffect } from 'react';
-import { useParams } from 'react-router';
-import {
- TYPE_GET_CACHED_RESULTS,
- TYPE_SET_HINTS_DATA,
-} from '../components/Vocabulary/VocabularySearch/duck/vocabularySearchDuck';
-import { getQueryVariables } from '../components/Vocabulary/VocabularyQuery';
-
-export const combineVocabularyData = data => {
- const mergedVocabularyData = [
- ...data.original.hits,
- ...data.translation.hits.map(obj => ({ ...obj, translation: true })),
- ];
- const idSet = new Set();
- return mergedVocabularyData.filter(vocabulary => {
- if (!idSet.has(vocabulary.id)) {
- idSet.add(vocabulary.id);
- return true;
- }
- return false;
- }, idSet);
-};
-
-export const useGetCachedHintsResponse = (state, dispatch) => {
- useEffect(
- () => {
- if (state.recentlySearched.get(state.input) && state.cursor === -1) {
- dispatch({ type: TYPE_GET_CACHED_RESULTS });
- }
- }, // eslint-disable-next-line
- [state.searchQuery, state.cursor],
- );
-};
-
-export const useGetHintsResponseAndCacheIt = (debouncedSearchQuery, state, dispatch, refetch) => {
- const { langCode } = useParams();
- useEffect(
- () => {
- if (debouncedSearchQuery) {
- const { searchQuery } = state;
- if (!state.recentlySearched.get(debouncedSearchQuery)) {
- refetch(
- getQueryVariables({
- langCode,
- searchQuery,
- sort: false,
- }),
- ).then(res => {
- return dispatch({
- type: TYPE_SET_HINTS_DATA,
- payload: {
- searchQuery: debouncedSearchQuery,
- response: combineVocabularyData(res.data),
- },
- });
- });
- }
- }
- }, // eslint-disable-next-line
- [debouncedSearchQuery],
- );
-};
diff --git a/sources-gen/imports b/sources-gen/imports
deleted file mode 100644
index c39c8df..0000000
--- a/sources-gen/imports
+++ /dev/null
@@ -1,6 +0,0 @@
-./index.jsx:import { ApolloProvider, ApolloClient, createHttpLink } from '@apollo/client';
-./index.jsx:import { createPersistedQueryLink } from '@apollo/client/link/persisted-queries';
-./index.jsx:import { InMemoryCache } from '@apollo/client/cache';
-./components/WithGraphQLQueryHandling/WithGraphQLQueryHandling.jsx:import { useQuery } from '@apollo/client';
-./components/Lesson/LessonVocabulary/LessonVocabulary.jsx:import { gql } from '@apollo/client';
-./components/Vocabulary/VocabularySearch/VocabularySearch.jsx:import { useQuery } from '@apollo/client';
diff --git a/sources-gen/imports.uniq b/sources-gen/imports.uniq
deleted file mode 100644
index 9e8bafd..0000000
--- a/sources-gen/imports.uniq
+++ /dev/null
@@ -1,21 +0,0 @@
-classnames
-crypto-hash
-graphql-tag
-react
-react-beforeunload
-react-dom
-react-google-recaptcha
-react-helmet-async
-react-hook-form
-react-redux
-react-router
-react-router-dom
-react-simple-keyboard
-redux
-redux-storage
-redux-storage-engine-localstorage
-redux-thunk
-simple-keyboard-layouts
-styled-components
-stylis-plugin-rtl
-video.js
diff --git a/sources-gen/index.jsx b/sources-gen/index.jsx
deleted file mode 100644
index 0f919e7..0000000
--- a/sources-gen/index.jsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import ReactDOM from 'react-dom';
-import { BrowserRouter as Router } from 'react-router-dom';
-import { HelmetProvider } from 'react-helmet-async';
-
-import { ApolloProvider, ApolloClient, createHttpLink } from '@apollo/client';
-import { createPersistedQueryLink } from '@apollo/client/link/persisted-queries';
-import { sha256 } from 'crypto-hash';
-import { InMemoryCache } from '@apollo/client/cache';
-
-import { Provider } from 'react-redux';
-import * as serviceWorker from './serviceWorker';
-import { App } from './components/App';
-import config from './config';
-
-import { possibleTypes } from './utils/apolloClient';
-import store from './state/store';
-
-const cache = new InMemoryCache({
- possibleTypes,
- addTypename: true,
-});
-
-const link = createPersistedQueryLink({ sha256, useGETForHashedQueries: true }).concat(
- createHttpLink({ uri: config.graphQL.baseUrl }),
-);
-
-const client = new ApolloClient({
- link,
- ssrForceFetchDelay: 100,
- cache: cache.restore(window.__APOLLO_STATE__), // eslint-disable-line no-underscore-dangle
-});
-
-//ReactDOM.hydrate(
-ReactDOM.render(
-
-
-
-
-
-
-
-
- ,
- document.getElementById('root'),
-);
-
-serviceWorker.unregister();
diff --git a/sources-gen/pages/CoursePage.jsx b/sources-gen/pages/CoursePage.jsx
deleted file mode 100644
index 35f5cb5..0000000
--- a/sources-gen/pages/CoursePage.jsx
+++ /dev/null
@@ -1,87 +0,0 @@
-import gql from 'graphql-tag';
-import { useSelector } from 'react-redux';
-import { toLang } from '../utils/mappers/langMapper';
-import { PageContainer } from '../components/Page/PageContainer';
-import { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { CourseOverview } from '../components/Course/CourseOverview';
-import { scoreFragment } from '../state/progress/learnProgress';
-import { userDataSelector, userSelector } from '../state/user/userSelectors';
-import { metaDataFragment, PageMetaData } from '../components/Page/PageMetaData';
-import { PAGE_TYPES } from '../constants/pageTypes';
-import {
- ImageOGMetaData,
- imageOGMetaDataFragment,
-} from '../components/ImageOGMetaData/ImageOGMetaData';
-import {
- gtmDataLayerFragment,
- GtmScriptWithDataLayer,
-} from '../components/GoogleTagManager/GtmScriptWithDataLayer';
-import { CourseDataContext } from '../hooks/useCourseData';
-
-export const coursePageQuery = ({ addMetaInfo, handicap }) => gql`
- query CoursePage($id: Int!, $lang: Language!) {
- content(id: $id, lang: $lang) {
- ... on Course {
- name
- dkLearningLevel
- mainContentImageLink {
- description
- targetId
- }
- contentLinks(targetTypes: LESSON) {
- id
- additionalInformation
- groupName
- target {
- ... on Lesson {
- id
- language
- shortTitle
- learningTargetHeadline
- grammarDescription
- }
- }
- }
- ...CourseImageOGMetaData
- ...${`CourseScore${handicap || ''}`}
- ...${metaDataFragment.name}
- ${gtmDataLayerFragment.partial()}
- }
- }
- }
- ${scoreFragment.fragment({ type: 'Course', addLearningMetaInfo: addMetaInfo, handicap })}
- ${imageOGMetaDataFragment.fragment({ type: 'Course' })}
- ${metaDataFragment.fragment({ type: 'Course' })}
-`;
-
-export const CoursePage = ({ contentId, langCode }) => {
- const { isLoggedIn } = useSelector(userSelector);
- const { handicap } = useSelector(userDataSelector) || {};
-
- const coursePageQueryVariables = {
- id: +contentId,
- lang: toLang(langCode),
- };
-
- return (
-
-
- {data => (
-
-
-
-
-
-
- )}
-
-
- );
-};
diff --git a/sources-gen/pages/DashboardPage.jsx b/sources-gen/pages/DashboardPage.jsx
deleted file mode 100644
index 83d3dc2..0000000
--- a/sources-gen/pages/DashboardPage.jsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import gql from 'graphql-tag';
-import { useParams } from 'react-router';
-import { Dashboard } from '../components/Dashboard/Dashboard';
-import { tileFragment } from '../components/Dashboard/Tiles/Tile/Tile';
-import { sortByLearningLevel } from '../utils/learningLevelUtils';
-import { toLang } from '../utils/mappers/langMapper';
-import { PageContainer } from '../components/Page/PageContainer';
-import { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { PageMetaData } from '../components/Page/PageMetaData';
-import { GTM_NO_CONTENT_PAGE_IDS, PAGE_TYPES } from '../constants/pageTypes';
-import {
- gtmDataLayerFragment,
- GtmScriptWithDataLayer,
-} from '../components/GoogleTagManager/GtmScriptWithDataLayer';
-
-export const dashboardPageQuery = gql`
- query DashboardPage($type: ModelType!, $courseLang: Language!, $amount: Int!) {
- # Get courses in the selected language till A2 level
- contentsByLang: contentsByType(
- type: $type
- lang: $courseLang
- amount: $amount
- filters: { field: "dkLearningLevel", value: ["0", "2", "4"] }
- ) {
- ...Tile
- ... on Course {
- ${gtmDataLayerFragment.partial()}
- }
- }
- # Get B1 courses in German
- contentsInGerman: contentsByType(
- type: $type
- lang: GERMAN
- amount: $amount
- filters: { field: "dkLearningLevel", value: ["8", "16"] }
- ) {
- ...Tile
- }
- }
- ${tileFragment}
-`;
-
-export const DashboardPage = () => {
- const { langCode } = useParams();
-
- const dashboardPageQueryVariables = {
- type: 'COURSE',
- courseLang: toLang(langCode),
- amount: 10,
- };
-
- return (
-
-
- {data => (
- <>
-
-
-
- >
- )}
-
-
- );
-};
diff --git a/sources-gen/pages/Default404Page.jsx b/sources-gen/pages/Default404Page.jsx
deleted file mode 100644
index af2c63d..0000000
--- a/sources-gen/pages/Default404Page.jsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { PageContainer } from '../components/Page/PageContainer';
-import { GtmScriptWithDataLayer } from '../components/GoogleTagManager';
-import { GTM_NO_CONTENT_PAGE_IDS } from '../constants/pageTypes';
-
-export const Default404Page = () => (
-
-
- Page not found (404).
-
-);
diff --git a/sources-gen/pages/GrammarOverviewPage.jsx b/sources-gen/pages/GrammarOverviewPage.jsx
deleted file mode 100644
index d6f6782..0000000
--- a/sources-gen/pages/GrammarOverviewPage.jsx
+++ /dev/null
@@ -1,89 +0,0 @@
-import gql from 'graphql-tag';
-import { useParams } from 'react-router';
-import { toLang } from '../utils/mappers/langMapper';
-import { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { PageContainer } from '../components/Page/PageContainer';
-import { GrammarOverview } from '../components/GrammarOverview/GrammarOverview';
-import { PageMetaData } from '../components/Page/PageMetaData';
-import { GTM_NO_CONTENT_PAGE_IDS, PAGE_TYPES } from '../constants/pageTypes';
-import { GtmScriptWithDataLayer } from '../components/GoogleTagManager/GtmScriptWithDataLayer';
-
-export const grammarOverviewPageFragment = gql`
- fragment GrammarOverviewItems on GrammarOverviewCategory {
- id
- headline
- grammars {
- id
- shortTitle
- language
- knowledgeType
- }
- }
-`;
-
-export const grammarOverviewPageQuery = gql`
- query GrammarOverviewPage($lang: Language!) {
- grammarOverview(lang: $lang) {
- verbs {
- ...GrammarOverviewItems
- }
- tenses {
- ...GrammarOverviewItems
- }
- nounsAndArticles {
- ...GrammarOverviewItems
- }
- declination {
- ...GrammarOverviewItems
- }
- negation {
- ...GrammarOverviewItems
- }
- pronoun {
- ...GrammarOverviewItems
- }
- prepositions {
- ...GrammarOverviewItems
- }
- adjectivesAndAdverbs {
- ...GrammarOverviewItems
- }
- sentenceStructure {
- ...GrammarOverviewItems
- }
- numbers {
- ...GrammarOverviewItems
- }
- spellingOrthography {
- ...GrammarOverviewItems
- }
- others {
- ...GrammarOverviewItems
- }
- }
- }
- ${grammarOverviewPageFragment}
-`;
-
-export const GrammarOverviewPage = () => {
- const { langCode } = useParams();
-
- const grammarPageQueryVariables = { lang: toLang(langCode) };
-
- return (
-
-
- {data => (
- <>
-
-
-
- >
- )}
-
-
- );
-};
diff --git a/sources-gen/pages/GrammarPage.jsx b/sources-gen/pages/GrammarPage.jsx
deleted file mode 100644
index 6a87378..0000000
--- a/sources-gen/pages/GrammarPage.jsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import gql from 'graphql-tag';
-import { toLang } from '../utils/mappers/langMapper';
-import { PageContainer } from '../components/Page/PageContainer';
-import { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { knowledgesFragment } from '../components/Lesson/LessonKnowledge/LessonKnowledge';
-import { GrammarItem } from '../components/GrammarItem/GrammarItem';
-import { PageMetaData } from '../components/Page/PageMetaData';
-import { PAGE_TYPES } from '../constants/pageTypes';
-import {
- gtmDataLayerFragment,
- GtmScriptWithDataLayer,
-} from '../components/GoogleTagManager/GtmScriptWithDataLayer';
-
-export const grammarPageQuery = gql`
- query GrammarPage($id: Int!, $lang: Language!) {
- content(id: $id, lang: $lang) {
- ... on Knowledge {
- name
- text
- }
- ...KnowledgeKnowledges
- ${gtmDataLayerFragment.partial()}
- }
- }
- ${knowledgesFragment.fragment({ type: 'Knowledge' })}
-`;
-
-export const GrammarPage = ({ contentId, langCode }) => {
- const grammarPageQueryVariables = {
- id: +contentId,
- lang: toLang(langCode),
- };
-
- return (
-
-
- {data => (
- <>
-
-
-
- >
- )}
-
-
- );
-};
diff --git a/sources-gen/pages/HelpPage.jsx b/sources-gen/pages/HelpPage.jsx
deleted file mode 100644
index 462e52d..0000000
--- a/sources-gen/pages/HelpPage.jsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import gql from 'graphql-tag';
-import { useParams } from 'react-router';
-import { toLang } from '../utils/mappers/langMapper';
-import { PageContainer } from '../components/Page/PageContainer';
-import { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { helpFragment, StyledHelp as Help } from '../components/Help/Help';
-import { PageMetaData } from '../components/Page/PageMetaData';
-import { PAGE_TYPES } from '../constants/pageTypes';
-import {
- gtmDataLayerFragment,
- GtmScriptWithDataLayer,
-} from '../components/GoogleTagManager/GtmScriptWithDataLayer';
-
-export const helpPageQuery = gql`
- query HelpPage($lang: Language!) {
- help(lang: $lang, appName: "mdl") {
- ...${helpFragment.name}
- ${gtmDataLayerFragment.partial()}
- }
- }
- ${helpFragment.fragment()}
-`;
-
-export const HelpPage = () => {
- const { langCode } = useParams();
-
- const helpPageQueryVariables = {
- lang: toLang(langCode),
- };
-
- return (
-
-
- {({ help }) => (
- <>
-
-
-
- >
- )}
-
-
- );
-};
diff --git a/sources-gen/pages/LegalPage.jsx b/sources-gen/pages/LegalPage.jsx
deleted file mode 100644
index 6558274..0000000
--- a/sources-gen/pages/LegalPage.jsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import gql from 'graphql-tag';
-import { useParams } from 'react-router';
-import { toLang } from '../utils/mappers/langMapper';
-import { PageContainer } from '../components/Page/PageContainer';
-import { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { PageMetaData } from '../components/Page/PageMetaData';
-import { PAGE_TYPES } from '../constants/pageTypes';
-import {
- legalFragment,
- StyledLegalNotice as LegalNotice,
-} from '../components/LegalNotice/LegalNotice';
-import { gtmDataLayerFragment } from '../components/GoogleTagManager';
-import { GtmScriptWithDataLayer } from '../components/GoogleTagManager/GtmScriptWithDataLayer';
-
-export const legalPageQuery = gql`
- query footer($lang: Language!) {
- footer(lang: $lang) {
- ${legalFragment.partial()}
- ${gtmDataLayerFragment.partial()}
- }
- }
-`;
-
-export const LegalPage = () => {
- const { langCode } = useParams();
-
- const helpPageQueryVariables = {
- lang: toLang(langCode),
- };
-
- return (
-
-
- {({ footer }) => (
- <>
-
-
-
- >
- )}
-
-
- );
-};
diff --git a/sources-gen/pages/LessonExtrasPage.jsx b/sources-gen/pages/LessonExtrasPage.jsx
deleted file mode 100644
index 0b0e58e..0000000
--- a/sources-gen/pages/LessonExtrasPage.jsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import gql from 'graphql-tag';
-import { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { lessonExtrasFragment, LessonExtras } from '../components/Lesson/LessonExtras/LessonExtras';
-import { metaDataFragment, PageMetaData } from '../components/Page/PageMetaData';
-import { PAGE_TYPES } from '../constants/pageTypes';
-import {
- gtmDataLayerFragment,
- GtmScriptWithDataLayer,
-} from '../components/GoogleTagManager/GtmScriptWithDataLayer';
-
-export const LessonExtrasQuery = gql`
- query LessonExtrasPage($id: Int!, $lang: Language!) {
- content(id: $id, lang: $lang) {
- ...LessonExtras
- ...${metaDataFragment.name}
- ${gtmDataLayerFragment.partial()}
- }
- }
- ${lessonExtrasFragment}
- ${metaDataFragment.fragment({ type: 'Lesson' })}
-`;
-
-export const LessonExtrasPage = ({ contentId, language }) => {
- const LessonExtraPageQueryVariables = {
- id: +contentId,
- lang: language,
- };
-
- return (
-
- {({ content }) => (
- <>
-
-
-
- >
- )}
-
- );
-};
diff --git a/sources-gen/pages/LessonPage.jsx b/sources-gen/pages/LessonPage.jsx
deleted file mode 100644
index 0684ac2..0000000
--- a/sources-gen/pages/LessonPage.jsx
+++ /dev/null
@@ -1,87 +0,0 @@
-import gql from 'graphql-tag';
-import { useParams } from 'react-router';
-import { useSelector } from 'react-redux';
-import { PageContainer } from '../components/Page/PageContainer';
-import { LANG_CODES, toLang } from '../utils/mappers/langMapper';
-import { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { scoreFragment } from '../state/progress/learnProgress';
-import { Lesson, lessonOverviewPartsFragment } from '../components/Lesson/Lesson';
-import { userDataSelector } from '../state/user/userSelectors';
-import { manuscriptFragment } from '../components/Manuscript/Manuscript';
-import { knowledgesFragment } from '../components/Lesson/LessonKnowledge/LessonKnowledge';
-import { metaDataFragment } from '../components/Page/PageMetaData';
-import { imageOGMetaDataFragment } from '../components/ImageOGMetaData/ImageOGMetaData';
-import { gtmDataLayerFragment } from '../components/GoogleTagManager';
-
-export const lessonPageQuery = ({ handicap }) => gql`
- query LessonPage($lessonId: Int!, $lessonIdString: String!, $lang: Language!) {
- content(id: $lessonId, lang: $lang) {
- ... on Lesson {
- id
- name
- language
- ...${`LessonOverviewParts${handicap || ''}`}
- ...${`LessonScore${handicap || ''}`}
- ...${metaDataFragment.name}
- }
- ...LessonManuscript
- ...LessonKnowledges
- ...LessonImageOGMetaData
- ${gtmDataLayerFragment.partial()}
- }
- contentsByType(
- lang: $lang
- type: COURSE
- amount: 1
- filters: { field: "contentLinks.targetId", value: [$lessonIdString] }
- ) {
- ... on Course {
- id
- name
- contentLinks(targetTypes: LESSON) {
- targetId
- additionalInformation
- }
- }
- ...CourseImageOGMetaData
- }
- }
- ${lessonOverviewPartsFragment.fragment({ scope: 'Lesson', handicap })}
- ${scoreFragment.fragment({ type: 'Lesson', handicap })}
- ${manuscriptFragment}
- ${knowledgesFragment.fragment({ type: 'Lesson' })}
- ${imageOGMetaDataFragment.fragment({ type: 'Lesson' })}
- ${imageOGMetaDataFragment.fragment({ type: 'Course' })}
- ${metaDataFragment.fragment({ type: 'Lesson' })}
-`;
-
-export const LessonPage = () => {
- const { langCode, lessonId } = useParams();
- const { handicap } = useSelector(userDataSelector) || {};
-
- const queryVariables = {
- lessonId: +lessonId,
- lessonIdString: lessonId,
- lang: toLang(langCode),
- };
-
- return (
-
-
- {(data, refetch) => {
- if (!data.content) {
- refetch({
- ...queryVariables,
- lang: toLang(LANG_CODES.GERMAN),
- });
- return null;
- }
- return ;
- }}
-
-
- );
-};
diff --git a/sources-gen/pages/LessonSummaryPage.jsx b/sources-gen/pages/LessonSummaryPage.jsx
deleted file mode 100644
index 931d502..0000000
--- a/sources-gen/pages/LessonSummaryPage.jsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import gql from 'graphql-tag';
-import { LessonSummary } from '../components/Lesson/LessonSummary/LessonSummary';
-import { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { PageMetaData } from '../components/Page/PageMetaData';
-import { PAGE_TYPES } from '../constants/pageTypes';
-import { gtmDataLayerFragment } from '../components/GoogleTagManager';
-import { GtmScriptWithDataLayer } from '../components/GoogleTagManager/GtmScriptWithDataLayer';
-
-export const lessonSummaryPageQuery = gql`
- query LessonSummaryPage($id: Int!, $lang: Language!) {
- content(id: $id, lang: $lang) {
- ... on Course {
- id
- contentLinks(targetTypes: LESSON) {
- additionalInformation
- targetId
- lesson: target {
- ... on Lesson {
- id
- shortTitle
- }
- }
- }
- ${gtmDataLayerFragment.partial()}
- }
- }
- }
-`;
-
-export const LessonSummaryPage = ({
- courseId,
- lessonId,
- language,
- lessonName,
- lessonKeywordStrings,
-}) => {
- const LessonSummaryQueryVariables = {
- id: +courseId,
- lang: language,
- };
-
- return (
-
- {data => (
- <>
-
-
-
- >
- )}
-
- );
-};
diff --git a/sources-gen/pages/MainPage.jsx b/sources-gen/pages/MainPage.jsx
deleted file mode 100644
index 07b27da..0000000
--- a/sources-gen/pages/MainPage.jsx
+++ /dev/null
@@ -1,82 +0,0 @@
-import { createGlobalStyle, StyleSheetManager } from 'styled-components';
-import stylisRTLPlugin from 'stylis-plugin-rtl';
-import { useParams } from 'react-router';
-import { colors } from '../utils/css';
-import { useValidateTicketAndLoginUser } from '../hooks/useValidateTicketAndLoginUser';
-import { useRedirectAfterLogOut } from '../hooks/useRedirectAfterLogOut';
-import { StyledPageLayout as PageLayout } from '../components/Page/PageLayout';
-import { useLocationGetter } from '../hooks/useLocationGetter';
-import { useCheckSessionTimeout } from '../hooks/useCheckSessionTimeout';
-import { isRtlByLangCode } from '../utils/mappers/rtlLanguages';
-import { useSyncLearnProgress } from '../hooks/useSyncLessonProgress';
-import bgDWDesktop from '../assets/images/bg-dw-desktop.jpg';
-import DWTheAntiquaBBoldWoff from '../assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff';
-import DWTheAntiquaBBoldWoff2 from '../assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff2';
-import DWTheAntiquaBSPlainWoff from '../assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff';
-import DWTheAntiquaBSPlainWoff2 from '../assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff2';
-import DWTheAntiquaBSPlainItalicWoff from '../assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff';
-import DWTheAntiquaBSPlainItalicWoff2 from '../assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff2';
-
-export const GlobalStyles = createGlobalStyle`
- * {
- box-sizing: border-box;
- font-family: Helvetica, Arial, sans-serif;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- }
- &:after, &:before {
- box-sizing: border-box;
- }
- html {
- -webkit-tap-highlight-color: transparent;
- }
- body {
- direction: ltr;
- text-align: left;
- background: url(${bgDWDesktop}) center top no-repeat ${colors.LG_GRAY_3};
- @font-face {
- font-family: DWTheAntiquaBBold;
- src: url(${DWTheAntiquaBBoldWoff}) format("woff"),
- url(${DWTheAntiquaBBoldWoff2}) format("woff2");
- font-style: normal;
- font-weight: 400
- }
- @font-face {
- font-family: DWTheAntiquaB;
- src: url(${DWTheAntiquaBSPlainWoff}) format("woff"),
- url(${DWTheAntiquaBSPlainWoff2}) format("woff2");
- font-style: normal;
- font-weight: 400
- }
- @font-face {
- font-family: DWTheAntiquaBItalic;
- src: url(${DWTheAntiquaBSPlainItalicWoff}) format("woff"),
- url(${DWTheAntiquaBSPlainItalicWoff2}) format("woff2");
- font-style: normal;
- font-weight: 400
- }
- }
- svg:not(:root) {
- overflow: hidden;
- }
-`;
-
-export const MainPage = ({ children }) => {
- const { langCode } = useParams();
- const { location } = useLocationGetter();
- useValidateTicketAndLoginUser(location, langCode);
- useRedirectAfterLogOut(langCode);
- useCheckSessionTimeout(langCode);
- useSyncLearnProgress();
-
- const isRtl = isRtlByLangCode(langCode);
-
- return (
-
- <>
-
- {children}
- >
-
- );
-};
diff --git a/sources-gen/pages/ManuscriptPage.jsx b/sources-gen/pages/ManuscriptPage.jsx
deleted file mode 100644
index 0acdd07..0000000
--- a/sources-gen/pages/ManuscriptPage.jsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import gql from 'graphql-tag';
-import { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { manuscriptFragment, Manuscript } from '../components/Manuscript/Manuscript';
-import { knowledgesFragment } from '../components/Lesson/LessonKnowledge/LessonKnowledge';
-import {
- MediaInputChooser,
- mediaInputChooserFragment,
-} from '../components/Lesson/MediaInputChooser/MediaInputChooser';
-import { metaDataFragment, PageMetaData } from '../components/Page/PageMetaData';
-import { PAGE_TYPES } from '../constants/pageTypes';
-import {
- gtmDataLayerFragment,
- GtmScriptWithDataLayer,
-} from '../components/GoogleTagManager/GtmScriptWithDataLayer';
-
-export const ManuscriptQuery = gql`
- query ManuscriptPage($id: Int!, $lang: Language!) {
- content(id: $id, lang: $lang) {
- ...LessonMediaInputChooser
- ...LessonManuscript
- ...LessonKnowledges
- ...${metaDataFragment.name}
- ${gtmDataLayerFragment.partial()}
- }
- }
- ${mediaInputChooserFragment.fragment({ type: 'Lesson' })}
- ${manuscriptFragment}
- ${knowledgesFragment.fragment({ type: 'Lesson' })}
- ${metaDataFragment.fragment({ type: 'Lesson' })}
-`;
-
-export const ManuscriptPage = ({ contentId, language }) => {
- const ManuscriptPageQueryVariables = {
- id: +contentId,
- lang: language,
- };
-
- return (
-
- {data => (
- <>
-
-
-
-
- >
- )}
-
- );
-};
diff --git a/sources-gen/pages/PlacementAndFinalTestResultPage.jsx b/sources-gen/pages/PlacementAndFinalTestResultPage.jsx
deleted file mode 100644
index 9af9afa..0000000
--- a/sources-gen/pages/PlacementAndFinalTestResultPage.jsx
+++ /dev/null
@@ -1,110 +0,0 @@
-import gql from 'graphql-tag';
-import { useParams } from 'react-router';
-import { useSelector } from 'react-redux';
-import {
- PlacementAndFinalTestResult,
- placementResultFragment,
-} from '../components/PlacementResult/PlacementAndFinalTestResult';
-import { PageContainer } from '../components/Page/PageContainer';
-import { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { sortByLearningLevel } from '../utils/learningLevelUtils';
-import { toLang } from '../utils/mappers/langMapper';
-import { lessonOverviewPartsFragment } from '../components/Lesson/Lesson';
-import { userDataSelector } from '../state/user/userSelectors';
-import { metaDataFragment } from '../components/Page/PageMetaData';
-import { gtmDataLayerFragment } from '../components/GoogleTagManager';
-
-export const placementResultPageQuery = ({ handicap }) => gql`
- query PlacementResultPage($id: Int!, $lessonIdString: String!, $amount: Int!, $lang: Language!, $type: ModelType!) {
- lesson: content(id: $id, lang: $lang) {
- ... on Lesson {
- id
- name
- dkLearningLevel
- dwLinks: contentLinks(targetTypes: [NAVIGATION]) {
- id: targetId
- description
- name
- }
- }
- ...${`PlacementOverviewParts${handicap || ''}`}
- ...${metaDataFragment.name}
- ${gtmDataLayerFragment.partial()}
- }
-
- dkCourses: contentsByType(
- type: $type
- lang: $lang
- amount: $amount
- filters: { field: "dkLearningLevel", value: ["2", "4"] }
- ) {
- ...PlacementResult
- }
-
- dkCoursesInGerman: contentsByType(
- type: $type
- lang: GERMAN
- amount: $amount
- filters: { field: "dkLearningLevel", value: ["8"] }
- ) {
- ...PlacementResult
- }
-
- currentCourse: contentsByType(
- lang: $lang
- type: COURSE
- amount: 1
- filters: { field: "contentLinks.targetId", value: [$lessonIdString] }
- ) {
- ... on Course {
- id
- name
- dkLearningLevel
- contentLinks(targetTypes: LESSON) {
- targetId
- additionalInformation
- }
- }
- }
- }
- ${lessonOverviewPartsFragment.fragment({ scope: 'Placement', handicap })}
- ${placementResultFragment}
- ${metaDataFragment.fragment({ type: 'Lesson' })}
-`;
-
-export const PlacementAndFinalTestResultPage = ({ contentId }) => {
- const { langCode } = useParams();
- const { handicap } = useSelector(userDataSelector) || {};
-
- const placementResultPageQueryVariables = {
- amount: 10,
- id: +contentId,
- lessonIdString: contentId,
- lang: toLang(langCode),
- type: 'COURSE',
- };
-
- return (
-
-
- {data => (
-
- )}
-
-
- );
-};
diff --git a/sources-gen/pages/PlacementTestPage.jsx b/sources-gen/pages/PlacementTestPage.jsx
deleted file mode 100644
index 1f2fe85..0000000
--- a/sources-gen/pages/PlacementTestPage.jsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import gql from 'graphql-tag';
-import { useParams } from 'react-router';
-import { toLang } from '../utils/mappers/langMapper';
-import { PageContainer } from '../components/Page/PageContainer';
-import { PlacementTest } from '../components/PlacementTest/PlacementTest';
-import { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { getPlacementTestIdForLangCode } from '../utils/mappers/placementTestCourseIds';
-import { metaDataFragment, PageMetaData } from '../components/Page/PageMetaData';
-import { PAGE_TYPES } from '../constants/pageTypes';
-import {
- gtmDataLayerFragment,
- GtmScriptWithDataLayer,
-} from '../components/GoogleTagManager/GtmScriptWithDataLayer';
-
-export const placementTestPageQuery = gql`
- query PlacementTestPage($id: Int!, $lang: Language!) {
- content(id: $id, lang: $lang) {
- ... on Course {
- id
- name
- subTitle
- mainContentImageLink {
- name
- targetId
- }
- lessons {
- subTitle: teaser
- id
- name
- language
- dkLearningLevel
- }
- ...${metaDataFragment.name}
- ${gtmDataLayerFragment.partial()}
- }
- }
- }
- ${metaDataFragment.fragment({ type: 'Course' })}
-`;
-
-export const PlacementTestPage = () => {
- const { langCode } = useParams();
- const placementCourseId = getPlacementTestIdForLangCode(langCode);
-
- const placementTestPageQueryVariables = {
- id: placementCourseId,
- lang: toLang(langCode),
- };
-
- return (
-
-
- {data => (
- <>
-
-
-
- >
- )}
-
-
- );
-};
diff --git a/sources-gen/pages/VocabularyPage.jsx b/sources-gen/pages/VocabularyPage.jsx
deleted file mode 100644
index 01b595e..0000000
--- a/sources-gen/pages/VocabularyPage.jsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { useParams } from 'react-router-dom';
-import { PageMetaData } from '../components/Page/PageMetaData';
-import { WithGraphQLQueryHandling } from '../components/WithGraphQLQueryHandling/WithGraphQLQueryHandling';
-import { GTM_NO_CONTENT_PAGE_IDS, PAGE_TYPES } from '../constants/pageTypes';
-import { Vocabulary } from '../components/Vocabulary/Vocabulary';
-import { PageContainer } from '../components/Page/PageContainer';
-import { getQueryVariables, vocabularySearchQuery } from '../components/Vocabulary/VocabularyQuery';
-import { GtmScriptWithDataLayer } from '../components/GoogleTagManager/GtmScriptWithDataLayer';
-
-export const VocabularyPage = () => {
- const { langCode } = useParams();
-
- const vocabularyPageQueryVariables = getQueryVariables({
- langCode,
- });
-
- return (
-
-
- {(data, refetch) => (
- <>
-
-
-
- >
- )}
-
-
- );
-};
diff --git a/sources-gen/serviceWorker.jsx b/sources-gen/serviceWorker.jsx
deleted file mode 100644
index de96136..0000000
--- a/sources-gen/serviceWorker.jsx
+++ /dev/null
@@ -1,131 +0,0 @@
-// This optional code is used to register a service worker.
-// register() is not called by default.
-
-// This lets the app load faster on subsequent visits in production, and gives
-// it offline capabilities. However, it also means that developers (and users)
-// will only see deployed updates on subsequent visits to a page, after all the
-// existing tabs open on the page have been closed, since previously cached
-// resources are updated in the background.
-
-// To learn more about the benefits of this model and instructions on how to
-// opt-in, read https://bit.ly/CRA-PWA
-
-const isLocalhost = Boolean(
- window.location.hostname === 'localhost' ||
- // [::1] is the IPv6 localhost address.
- window.location.hostname === '[::1]' ||
- // 127.0.0.1/8 is considered localhost for IPv4.
- window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/),
-);
-
-export function register(config) {
- if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
- // The URL constructor is available in all browsers that support SW.
- const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
- if (publicUrl.origin !== window.location.origin) {
- // Our service worker won't work if PUBLIC_URL is on a different origin
- // from what our page is served on. This might happen if a CDN is used to
- // serve assets; see https://github.com/facebook/create-react-app/issues/2374
- return;
- }
-
- window.addEventListener('load', () => {
- const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
-
- if (isLocalhost) {
- // This is running on localhost. Let's check if a service worker still exists or not.
- checkValidServiceWorker(swUrl, config);
-
- // Add some additional logging to localhost, pointing developers to the
- // service worker/PWA documentation.
- navigator.serviceWorker.ready.then(() => {
- console.log(
- 'This web app is being served cache-first by a service ' +
- 'worker. To learn more, visit https://bit.ly/CRA-PWA',
- );
- });
- } else {
- // Is not localhost. Just register service worker
- registerValidSW(swUrl, config);
- }
- });
- }
-}
-
-function registerValidSW(swUrl, config) {
- navigator.serviceWorker
- .register(swUrl)
- .then(registration => {
- registration.onupdatefound = () => {
- const installingWorker = registration.installing;
- if (installingWorker == null) {
- return;
- }
- installingWorker.onstatechange = () => {
- if (installingWorker.state === 'installed') {
- if (navigator.serviceWorker.controller) {
- // At this point, the updated precached content has been fetched,
- // but the previous service worker will still serve the older
- // content until all client tabs are closed.
- console.log(
- 'New content is available and will be used when all ' +
- 'tabs for this page are closed. See https://bit.ly/CRA-PWA.',
- );
-
- // Execute callback
- if (config && config.onUpdate) {
- config.onUpdate(registration);
- }
- } else {
- // At this point, everything has been precached.
- // It's the perfect time to display a
- // "Content is cached for offline use." message.
- console.log('Content is cached for offline use.');
-
- // Execute callback
- if (config && config.onSuccess) {
- config.onSuccess(registration);
- }
- }
- }
- };
- };
- })
- .catch(error => {
- console.error('Error during service worker registration:', error);
- });
-}
-
-function checkValidServiceWorker(swUrl, config) {
- // Check if the service worker can be found. If it can't reload the page.
- fetch(swUrl)
- .then(response => {
- // Ensure service worker exists, and that we really are getting a JS file.
- const contentType = response.headers.get('content-type');
- if (
- response.status === 404 ||
- (contentType != null && contentType.indexOf('javascript') === -1)
- ) {
- // No service worker found. Probably a different app. Reload the page.
- navigator.serviceWorker.ready.then(registration => {
- registration.unregister().then(() => {
- window.location.reload();
- });
- });
- } else {
- // Service worker found. Proceed as normal.
- registerValidSW(swUrl, config);
- }
- })
- .catch(() => {
- console.log('No internet connection found. App is running in offline mode.');
- });
-}
-
-export function unregister() {
- if ('serviceWorker' in navigator) {
- navigator.serviceWorker.ready.then(registration => {
- registration.unregister();
- });
- }
-}
diff --git a/sources-gen/services/certificateService.jsx b/sources-gen/services/certificateService.jsx
deleted file mode 100644
index d960fc7..0000000
--- a/sources-gen/services/certificateService.jsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { USER } from '../constants/userUrl';
-
-export const PS_PREFIX = USER.PS_URL;
-export const CERTIFICATE_URL = `${PS_PREFIX}protected/certificate/`;
-
-export const getCertificate = id => {
- return fetch(`${CERTIFICATE_URL}${id}`, {
- headers: {
- 'Content-Type': 'application/pdf',
- },
- }).then(response => (response.ok ? response : response.json().then(err => Promise.reject(err))));
-};
diff --git a/sources-gen/services/learnProgressService.jsx b/sources-gen/services/learnProgressService.jsx
deleted file mode 100644
index 4b3739f..0000000
--- a/sources-gen/services/learnProgressService.jsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { BASIC_JSON_CONTENT_TYPE_HEADER } from '../constants/services';
-import { USER } from '../constants/userUrl';
-
-const COURSE_PROGRESS = 'course/progress';
-const LESSON_PROGRESS = 'lesson/progress';
-const LESSON_PROGRESSES = 'lesson/progresses';
-const PROTECTED_URL = `${USER.PS_URL}protected`;
-
-export const LESSON_TYPE = 'lesson';
-export const COURSE_TYPE = 'course';
-
-const handleError = response =>
- console.error(
- `Something went wrong on service call: ${response.url}, status code: ${response.status}`,
- );
-
-export const getProgress = (id, type) => {
- const contentType = type.toLowerCase();
- return fetch(`${PROTECTED_URL}/${contentType}/progress/${id}`, {
- ...BASIC_JSON_CONTENT_TYPE_HEADER,
- })
- .then(response => (response.ok ? response.text() : Promise.reject(response)))
- .then(text => (text ? JSON.parse(text) : null))
- .catch(handleError);
-};
-
-export const getProgresses = (ids, type) => {
- const contentType = type.toLowerCase();
- return fetch(`${PROTECTED_URL}/${contentType}/progress`, {
- method: 'POST',
- body: JSON.stringify({ ids }),
- ...BASIC_JSON_CONTENT_TYPE_HEADER,
- })
- .then(response => response.json())
- .catch(handleError);
-};
-
-export const deleteLearnProgress = (id, type) => {
- const contentType = type.toLowerCase();
- return fetch(`${PROTECTED_URL}/${contentType}/progress/reset/${id}`, {
- method: 'DELETE',
- }).catch(handleError);
-};
-
-export const saveLessonProgress = lessonProgressData => {
- return fetch(`${PROTECTED_URL}/${LESSON_PROGRESS}/save`, {
- method: 'POST',
- body: JSON.stringify(lessonProgressData),
- dataType: 'json',
- ...BASIC_JSON_CONTENT_TYPE_HEADER,
- }).catch(handleError);
-};
-
-export const saveLessonProgresses = lessonProgressesData => {
- return fetch(`${PROTECTED_URL}/${LESSON_PROGRESSES}/save`, {
- method: 'POST',
- body: JSON.stringify(lessonProgressesData),
- dataType: 'json',
- ...BASIC_JSON_CONTENT_TYPE_HEADER,
- }).catch(handleError);
-};
-
-export const getLastEditedLessonsIds = (numberOfLessons, language) => {
- return fetch(`${PROTECTED_URL}/lesson?last=${numberOfLessons}&lang=${language}`, {
- ...BASIC_JSON_CONTENT_TYPE_HEADER,
- })
- .then(response => response.json())
- .catch(handleError);
-};
-
-export const initCourseProgress = initialCourseProgressData => {
- return fetch(`${PROTECTED_URL}/${COURSE_PROGRESS}/init`, {
- method: 'POST',
- body: JSON.stringify(initialCourseProgressData),
- ...BASIC_JSON_CONTENT_TYPE_HEADER,
- })
- .then(response => response.json())
- .catch(handleError);
-};
diff --git a/sources-gen/services/passwordService.jsx b/sources-gen/services/passwordService.jsx
deleted file mode 100644
index 39292f2..0000000
--- a/sources-gen/services/passwordService.jsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import { USER } from '../constants/userUrl';
-import { BASIC_JSON_CONTENT_TYPE_HEADER } from '../constants/services';
-import { formatPasswordResetUserData } from '../utils/mappers/passwordReset';
-
-const PS_PREFIX = USER.PS_URL;
-const PASSWORD_RESOURCE_PUBLIC_RESET = `${PS_PREFIX}public/user/password/reset`;
-export const PASSWORD_RESOURCE_PUBLIC_RESET_REQUEST = `${PS_PREFIX}public/user/password/reset-request`;
-const PASSWORD_RESOURCE_PROTECTED = `${PS_PREFIX}protected/user/password`;
-
-export const changePassword = (oldUserPassword, userPassword) =>
- fetch(`${PASSWORD_RESOURCE_PROTECTED}/change`, {
- method: 'POST',
- body: JSON.stringify({
- oldPassword: oldUserPassword,
- newPassword: userPassword,
- }),
- ...BASIC_JSON_CONTENT_TYPE_HEADER,
- });
-
-export const requestResetPassword = ({ userData, captchaToken }) => {
- const formattedData = formatPasswordResetUserData({ userData, captchaToken });
- return fetch(PASSWORD_RESOURCE_PUBLIC_RESET_REQUEST, {
- method: 'POST',
- body: JSON.stringify(formattedData),
- ...BASIC_JSON_CONTENT_TYPE_HEADER,
- }).then(response => (response.ok ? Promise.resolve(response) : Promise.reject(response)));
-};
-
-export const setPasswordByToken = (newPassword, token) =>
- fetch(PASSWORD_RESOURCE_PUBLIC_RESET, {
- method: 'POST',
- body: JSON.stringify({
- newPassword,
- passwordResetToken: token,
- }),
- ...BASIC_JSON_CONTENT_TYPE_HEADER,
- }).then(response => (response.ok ? Promise.resolve(response) : Promise.reject(response)));
-
-export const getUserByConfirmationId = confirmationId =>
- fetch(`${PS_PREFIX}public/user/mail?token=${confirmationId}`)
- .then(res => res.text())
- .catch(e => console.log(e));
diff --git a/sources-gen/services/userService.jsx b/sources-gen/services/userService.jsx
deleted file mode 100644
index e7bb699..0000000
--- a/sources-gen/services/userService.jsx
+++ /dev/null
@@ -1,75 +0,0 @@
-import { USER } from '../constants/userUrl';
-import { BASIC_JSON_CONTENT_TYPE_HEADER } from '../constants/services';
-import { formatRegistrationUserData, formatUserProfileData } from '../utils/userUtils';
-
-export const LOGOUT_SUFFIX = 'public/logout';
-const NOT_LOGGED_USER_SUFFIX = 'public/user';
-const LOGGED_USER_SUFFIX = 'protected/user';
-export const PROFILE_SUFFIX = 'profile';
-const REGISTRATION_SUFFIX = 'registration';
-export const PS_PREFIX = USER.PS_URL;
-const NOT_LOGGED_USER_RESOURCE = `${PS_PREFIX}${NOT_LOGGED_USER_SUFFIX}`;
-export const LOGGED_USER_RESOURCE = `${PS_PREFIX}${LOGGED_USER_SUFFIX}`;
-export const CONFIRMATION_RESOURCE = `${PS_PREFIX}public/registration/confirmation`;
-
-export const registerUser = ({ userData, captchaToken, langCode }) => {
- const formattedData = formatRegistrationUserData({ userData, captchaToken, langCode });
- return fetch(`${NOT_LOGGED_USER_RESOURCE}/${REGISTRATION_SUFFIX}`, {
- method: 'POST',
- body: JSON.stringify(formattedData),
- dataType: 'json',
- ...BASIC_JSON_CONTENT_TYPE_HEADER,
- });
-};
-
-export const deleteUser = () =>
- fetch(LOGGED_USER_RESOURCE, {
- method: 'DELETE',
- }).catch(msg => {
- console.error(`Something went wrong: ${JSON.stringify(msg)}`);
- });
-
-export const checkUserProfile = () =>
- fetch(`${LOGGED_USER_RESOURCE}/${PROFILE_SUFFIX}`, {
- ...BASIC_JSON_CONTENT_TYPE_HEADER,
- }).catch(response => {
- console.error(`Unable to retrieve user:${JSON.stringify(response)}`);
- });
-
-export const getUserProfile = () =>
- fetch(`${LOGGED_USER_RESOURCE}/${PROFILE_SUFFIX}`, {
- ...BASIC_JSON_CONTENT_TYPE_HEADER,
- })
- .then(response => response.json())
- .catch(response => {
- console.error(`Unable to retrieve user:${JSON.stringify(response)}`);
- });
-
-export const updateUserProfile = data => {
- const userData = formatUserProfileData({ data });
- return fetch(`${LOGGED_USER_RESOURCE}/${PROFILE_SUFFIX}`, {
- ...BASIC_JSON_CONTENT_TYPE_HEADER,
- method: 'POST',
- body: JSON.stringify(userData),
- }).then(response => (response.ok ? response.json() : Promise.reject(response)));
-};
-
-export const validateUserTicket = (ticket, ticketDomain) => {
- const VALIDATE_TICKET_URL = `${PS_PREFIX}public/login?ticket=${ticket}&ticketDomain=${ticketDomain}`;
-
- return fetch(VALIDATE_TICKET_URL);
-};
-
-export const getUserByToken = token => fetch(`${NOT_LOGGED_USER_RESOURCE}/mail?token=${token}`);
-
-export const confirmUserRegistration = confirmationId => {
- return fetch(`${CONFIRMATION_RESOURCE}?confirmationId=${confirmationId}`, {
- ...BASIC_JSON_CONTENT_TYPE_HEADER,
- method: 'POST',
- });
-};
-
-export const userService = {
- deleteUser,
- updateUserProfile,
-};
diff --git a/sources-gen/state/common/apiActions.jsx b/sources-gen/state/common/apiActions.jsx
deleted file mode 100644
index 6b8abdb..0000000
--- a/sources-gen/state/common/apiActions.jsx
+++ /dev/null
@@ -1,20 +0,0 @@
-export const API_CALL = 'API_CALL';
-
-export const apiAction = ({
- url = '',
- method = 'GET',
- data = null,
- onSuccess = () => {},
- onFailure = () => {},
- headersOverride = null,
-}) => ({
- type: API_CALL,
- payload: {
- url,
- method,
- data,
- onSuccess,
- onFailure,
- headersOverride,
- },
-});
diff --git a/sources-gen/state/middlewares/apiMiddleware.jsx b/sources-gen/state/middlewares/apiMiddleware.jsx
deleted file mode 100644
index aeec728..0000000
--- a/sources-gen/state/middlewares/apiMiddleware.jsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { API_CALL } from '../common/apiActions';
-
-export const apiMiddleware = ({ dispatch }) => next => action => {
- next(action);
-
- if (action.type !== API_CALL) {
- return;
- }
-
- const { url, method, data, onSuccess, onFailure, headers } = action.payload;
-
- const dataOrParams = ['GET', 'DELETE'].includes(method) ? 'params' : 'data';
-
- fetch(url, {
- method,
- headers,
- [dataOrParams]: data,
- })
- .then(response => {
- const contentType = response.headers.get('content-type');
- return contentType && contentType.indexOf('application/json') !== -1 ? response.json() : {};
- })
- .then(userData => {
- dispatch(onSuccess(userData));
- })
- .catch(error => {
- dispatch(onFailure(error));
- });
-};
diff --git a/sources-gen/state/mode/lessonExerciseModeDuck.jsx b/sources-gen/state/mode/lessonExerciseModeDuck.jsx
deleted file mode 100644
index 3fb0f27..0000000
--- a/sources-gen/state/mode/lessonExerciseModeDuck.jsx
+++ /dev/null
@@ -1,55 +0,0 @@
-export const SET_IMPROVE_MODE_FOR_LESSON = 'SET_IMPROVE_MODE_FOR_LESSON';
-export const REMOVE_IMPROVE_MODE_FOR_LESSON = 'REMOVE_IMPROVE_MODE_FOR_LESSON';
-
-export const LESSON_EXERCISE_MODE = Object.freeze({
- IMPROVE: 'IMPROVE',
-});
-
-// actions
-export const setImproveMode = cosLessonId => ({
- type: SET_IMPROVE_MODE_FOR_LESSON,
- payload: cosLessonId,
-});
-
-export const removeImproveMode = cosLessonId => ({
- type: REMOVE_IMPROVE_MODE_FOR_LESSON,
- payload: cosLessonId,
-});
-
-// helpers
-const findExistingLesson = ({ cosLessonId, lessons }) => {
- return lessons.find(lesson => lesson.cosLessonId === cosLessonId);
-};
-
-const addLessonMode = ({ cosLessonId, lessons }) => {
- const existingLesson = findExistingLesson({ cosLessonId, lessons });
- if (existingLesson) {
- const otherLessons = lessons.filter(lesson => lesson.cosLessonId !== cosLessonId);
- return [...otherLessons, { cosLessonId, mode: LESSON_EXERCISE_MODE.IMPROVE }];
- }
- return [...lessons, { cosLessonId, mode: LESSON_EXERCISE_MODE.IMPROVE }];
-};
-
-const removeLessonMode = ({ cosLessonId, lessons }) => {
- const existingLesson = findExistingLesson({ cosLessonId, lessons });
- if (existingLesson) {
- const otherLessons = lessons.filter(lesson => lesson.cosLessonId !== cosLessonId);
- return [...otherLessons];
- }
- return [...lessons];
-};
-
-// state
-const initialState = [];
-
-// reducer
-export const lessonExerciseModeReducer = (state = initialState, action) => {
- switch (action.type) {
- case SET_IMPROVE_MODE_FOR_LESSON:
- return addLessonMode({ cosLessonId: action.payload, lessons: state });
- case REMOVE_IMPROVE_MODE_FOR_LESSON:
- return removeLessonMode({ cosLessonId: action.payload, lessons: state });
- default:
- return state;
- }
-};
diff --git a/sources-gen/state/mode/lessonExerciseModeSelectors.jsx b/sources-gen/state/mode/lessonExerciseModeSelectors.jsx
deleted file mode 100644
index 2cb7111..0000000
--- a/sources-gen/state/mode/lessonExerciseModeSelectors.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { LESSON_EXERCISE_MODE } from './lessonExerciseModeDuck';
-
-export const isLessonInImproveModeSelector = lessonId => state => {
- return state.lessonExerciseMode.some(
- item => item.cosLessonId === lessonId && item.mode === LESSON_EXERCISE_MODE.IMPROVE,
- );
-};
diff --git a/sources-gen/state/progress/learnProgress.jsx b/sources-gen/state/progress/learnProgress.jsx
deleted file mode 100644
index 988ac83..0000000
--- a/sources-gen/state/progress/learnProgress.jsx
+++ /dev/null
@@ -1,283 +0,0 @@
-import gql from 'graphql-tag';
-import { sumScore } from './utils';
-import { filterDataFromService } from './serverDataFilterUtils';
-
-/**
- * the following data structure is generated here as lesson progress state for the global state
-{
- cosLessonId: 37250531,
- cosCourseId: 36519789,
- doneExerciseCount: 1,
- allExerciseCount: 12,
- maxPointsForAllExercises: 35,
- resultPoints: 1,
- exerciseProgresses: [
- {
- cosExerciseId: 42382962,
- resultPoints: 1,
- maxPoints: 2,
- inquiryProgresses: [
- {
- inquiryId: 42382995,
- score: 1,
- maxScore: 1,
- },
- {
- inquiryId: 42382999,
- score: 0,
- maxScore: 1,
- }
- ]
- }],
-}
- */
-
-const getLearningMetaInfoFragment = (name, type, handicap) => {
- const targetHandicap = handicap ? `(handicap: ${handicap})` : '';
-
- return gql`fragment ${type}${name}${handicap || ''} on ${type} {
- learningMetaInfo${targetHandicap} {
- achievableScore
- exerciseCount
- }
- }
- `;
-};
-
-export const scoreFragment = {
- name: 'Score',
- fragment({ type, addLearningMetaInfo = true, handicap }) {
- return addLearningMetaInfo
- ? getLearningMetaInfoFragment(this.name, type, handicap)
- : gql`fragment ${type}${this.name}${handicap || ''} on ${type} {
- id
- }
- `;
- },
-};
-
-export const createInquiryProgressMetaData = ({ inquiryId, score, achievableScore }) => {
- return { inquiryId, score, maxScore: achievableScore };
-};
-
-export const createLearnProgressData = ({
- langCode,
- lessonId,
- courseId,
- lessonAchievableScore,
- exerciseId,
- allExerciseCount,
- exerciseProgress,
- exerciseAchievableScore,
-}) => {
- return {
- language: langCode,
- cosLessonId: lessonId,
- cosCourseId: courseId,
- maxPointsForAllExercises: lessonAchievableScore,
- cosExerciseId: exerciseId,
- allExerciseCount,
- exerciseProgress,
- exerciseAchievableScore,
- };
-};
-
-export const initializeLessonLearnProgressWithDataFromServer = ({ lessonProgresses = [] }) => {
- const filteredLessonProgresses = lessonProgresses.map(lessonProgress =>
- filterDataFromService(lessonProgress),
- );
- return { lessons: filteredLessonProgresses };
-};
-
-export const initializeCourseLearnProgressWithDataFromServer = ({ courseProgresses = [] }) => {
- return { courses: courseProgresses };
-};
-
-export const updateLessonProgressFromService = ({ lessons, lessonProgress }) => {
- const filteredLessonProgress = filterDataFromService(lessonProgress);
- const existingLesson = findExistingLesson({ lessons, lessonProgress: filteredLessonProgress });
- if (existingLesson) {
- const otherLessons = lessons.filter(
- lesson => lesson.cosLessonId !== filteredLessonProgress.cosLessonId,
- );
- return { lessons: [...otherLessons, filteredLessonProgress] };
- }
- return {
- lessons: [...lessons, filteredLessonProgress],
- };
-};
-
-export const deleteLessonProgressById = ({ lessons, lessonId }) => {
- const lessonProgressToDelete = findExistingLessonById({ lessons, lessonId });
- if (!lessonProgressToDelete) {
- return { lessons };
- }
- const otherLessons = lessons.filter(lesson => lesson.cosLessonId !== lessonId);
- return { lessons: [...otherLessons] };
-};
-
-export const deleteLessonProgressesByCourseId = ({ lessons, courseId }) => {
- return { lessons: lessons.filter(lesson => lesson.cosCourseId !== courseId) };
-};
-
-export const deleteCourseProgressById = ({ courses, courseId }) => {
- const courseProgressToDelete = findExistingCourseById({ courses, courseId });
- if (!courseProgressToDelete) {
- return { courses };
- }
- const otherCourses = courses.filter(course => course.cosCourseId !== courseId);
- return { courses: [...otherCourses] };
-};
-
-export const addCourseProgressData = ({ courses, courseProgress }) => {
- const existingCourseProgress = findExistingCourseById({
- courses,
- courseId: courseProgress.cosCourseId,
- });
-
- if (existingCourseProgress) {
- const otherCourses = courses.filter(
- course => course.cosCourseId !== courseProgress.cosCourseId,
- );
- return {
- courses: [...otherCourses, courseProgress],
- };
- }
-
- return { courses: [...courses, courseProgress] };
-};
-
-export const findExistingLessonById = ({ lessons, lessonId }) => {
- return lessons.find(lesson => lesson.cosLessonId === lessonId);
-};
-
-export const findExistingCourseById = ({ courses, courseId }) => {
- return courses.find(course => course.cosCourseId === courseId);
-};
-
-export const findExistingLesson = ({ lessons, lessonProgress }) => {
- return lessons.find(lesson => lesson.cosLessonId === lessonProgress.cosLessonId);
-};
-
-export const findInquiryProgress = ({ lessons, lessonId, exerciseId }) => {
- const lesson = findExistingLessonById({ lessons, lessonId });
- if (!lesson) {
- return [];
- }
- const { exerciseProgresses } = lesson;
-
- const currentExerciseProgress = exerciseProgresses.find(
- exerciseProgress => exerciseProgress.cosExerciseId === exerciseId,
- );
-
- if (!currentExerciseProgress) {
- return [];
- }
- const { inquiryProgresses = [] } = currentExerciseProgress;
- return inquiryProgresses;
-};
-
-export const generateLessonProgress = ({ lessons, lessonProgress }) => {
- const { exerciseProgress } = lessonProgress;
- if (exerciseProgress.inquiryProgresses.length === 0) {
- return { lessons };
- }
- const existingLesson = findExistingLesson({ lessons, lessonProgress });
- if (existingLesson) {
- const otherLessons = lessons.filter(
- lesson => lesson.cosLessonId !== lessonProgress.cosLessonId,
- );
- return {
- lessons: [...otherLessons, updateExistingLessonMetaData(existingLesson, lessonProgress)],
- };
- }
- return {
- lessons: [...lessons, createNewLessonMetaData(lessonProgress)],
- };
-};
-
-const updateExerciseMetaDataForExistingLesson = (existingLesson, lessonProgress) => {
- const { exerciseProgresses } = existingLesson;
- const existingExercise = exerciseProgresses.find(
- exercise => exercise.cosExerciseId === lessonProgress.cosExerciseId,
- );
- if (existingExercise) {
- const otherExercises = exerciseProgresses.filter(
- exercise => exercise.cosExerciseId !== lessonProgress.cosExerciseId,
- );
- return [...otherExercises, updateExerciseMetaData(existingExercise, lessonProgress)];
- }
- return [...exerciseProgresses, createNewExerciseMetaData(lessonProgress)];
-};
-
-const updateExistingLessonMetaData = (existingLesson, lessonProgress) => {
- const newExerciseProgresses = [
- ...updateExerciseMetaDataForExistingLesson(existingLesson, lessonProgress),
- ];
- const newDoneExerciseCount = newExerciseProgresses.length;
-
- const updatedLesson = {
- ...existingLesson,
- doneExerciseCount: newDoneExerciseCount,
- exerciseProgresses: newExerciseProgresses,
- };
- return {
- ...updatedLesson,
- resultPoints: sumScore(updatedLesson.exerciseProgresses, 'resultPoints'),
- };
-};
-
-const createNewLessonMetaData = lessonProgress => {
- const exerciseProgresses = [createNewExerciseMetaData(lessonProgress)];
- const {
- cosLessonId,
- cosCourseId,
- allExerciseCount,
- maxPointsForAllExercises,
- language,
- } = lessonProgress;
- const newLesson = {
- language,
- cosLessonId,
- cosCourseId,
- allExerciseCount,
- doneExerciseCount: exerciseProgresses.length,
- maxPointsForAllExercises,
- exerciseProgresses,
- };
-
- return { ...newLesson, resultPoints: sumScore(newLesson.exerciseProgresses, 'resultPoints') };
-};
-
-const createNewExerciseMetaData = lessonProgress => {
- const { cosExerciseId, exerciseProgress, exerciseAchievableScore } = lessonProgress;
- return {
- cosExerciseId,
- maxPoints: exerciseAchievableScore,
- resultPoints: sumScore(exerciseProgress.inquiryProgresses, 'score'),
- inquiryProgresses: exerciseProgress.inquiryProgresses,
- };
-};
-
-const updateExerciseMetaData = (existingExercise, lessonProgress) => {
- const { cosExerciseId, exerciseProgress, exerciseAchievableScore } = lessonProgress;
-
- const cleanedExistingInquiryProgresses = existingExercise.inquiryProgresses.filter(
- inquiryProgress =>
- !exerciseProgress.inquiryProgresses.some(
- newInquiryProgress => newInquiryProgress.inquiryId === inquiryProgress.inquiryId,
- ),
- );
-
- const inquiryProgresses = [
- ...cleanedExistingInquiryProgresses,
- ...exerciseProgress.inquiryProgresses,
- ];
-
- return {
- cosExerciseId,
- maxPoints: exerciseAchievableScore,
- resultPoints: sumScore(inquiryProgresses, 'score'),
- inquiryProgresses,
- };
-};
diff --git a/sources-gen/state/progress/learnProgressDuck.jsx b/sources-gen/state/progress/learnProgressDuck.jsx
deleted file mode 100644
index 33d3efb..0000000
--- a/sources-gen/state/progress/learnProgressDuck.jsx
+++ /dev/null
@@ -1,274 +0,0 @@
-import {
- addCourseProgressData,
- deleteCourseProgressById,
- deleteLessonProgressById,
- deleteLessonProgressesByCourseId,
- findExistingLesson,
- generateLessonProgress,
- initializeCourseLearnProgressWithDataFromServer,
- initializeLessonLearnProgressWithDataFromServer,
- updateLessonProgressFromService,
-} from './learnProgress';
-import {
- COURSE_TYPE,
- deleteLearnProgress,
- getProgress,
- getProgresses,
- initCourseProgress,
- LESSON_TYPE,
- saveLessonProgress,
- saveLessonProgresses,
-} from '../../services/learnProgressService';
-
-export const ADD_LESSON_PROGRESS = 'ADD_LESSON_PROGRESS';
-export const READ_LESSON_PROGRESS = 'READ_LESSON_PROGRESS';
-export const READ_LESSON_PROGRESSES = 'READ_LESSON_PROGRESSES';
-export const DELETE_LESSON_PROGRESS = 'DELETE_LESSON_PROGRESS';
-export const READ_COURSE_PROGRESS = 'ADD_COURSE_PROGRESS';
-export const READ_COURSE_PROGRESSES = 'READ_COURSE_PROGRESSES';
-export const DELETE_COURSE_PROGRESS = 'DELETE_COURSE_PROGRESS';
-export const DELETE_LESSON_PROGRESSES = 'DELETE_LESSON_PROGRESSES';
-export const REMOVE_LEARN_PROGRESS = 'REMOVE_LEARN_PROGRESS';
-export const LESSON_PROGRESS_SYNC_NEEDED = 'LESSON_PROGRESS_SYNC_NEEDED';
-
-// external used actions
-export const addLessonProgress = lessonProgress => {
- return dispatch => {
- dispatch(addProgress(lessonProgress));
- dispatch(saveProgressOnServer(lessonProgress));
- };
-};
-
-export const deleteLessonProgress = lessonId => {
- return dispatch => {
- dispatch(deleteLProgress(lessonId));
- dispatch(deleteProgressOnServer(lessonId, LESSON_TYPE));
- };
-};
-
-export const readLessonProgress = lessonId => {
- return (dispatch, getState) => {
- const { user } = getState();
- if (user.isLoggedIn) {
- getProgress(lessonId, LESSON_TYPE).then(progress => dispatch(readProgress(progress)));
- }
- };
-};
-
-export const readLessonProgresses = lessonIds => {
- return (dispatch, getState) => {
- const { user } = getState();
- if (user.isLoggedIn) {
- getProgresses(lessonIds, LESSON_TYPE).then(progresses =>
- dispatch(readProgresses(progresses)),
- );
- }
- };
-};
-
-export const readCourseProgress = courseId => {
- return (dispatch, getState) => {
- const { user } = getState();
- if (user.isLoggedIn) {
- getProgress(courseId, COURSE_TYPE).then(courseProgress => {
- if (courseProgress) {
- dispatch(addCourseProgress(courseProgress));
- }
- });
- }
- };
-};
-
-export const readCourseProgresses = courseIds => {
- return (dispatch, getState) => {
- const { user } = getState();
- if (user.isLoggedIn) {
- getProgresses(courseIds, COURSE_TYPE).then(courseProgresses => {
- if (courseProgresses) {
- dispatch(readCProgresses(courseProgresses));
- }
- });
- }
- };
-};
-
-export const initCourse = initialCourseData => {
- return (dispatch, getState) => {
- const { user } = getState();
- if (user.isLoggedIn) {
- initCourseProgress(initialCourseData).then(courseProgress =>
- dispatch(readCourseProgress(courseProgress.cosCourseId)),
- );
- }
- };
-};
-
-export const deleteCourseProgress = courseId => {
- return dispatch => {
- dispatch(deleteCProgress(+courseId));
- dispatch(deleteProgressOnServer(courseId, COURSE_TYPE));
- dispatch(deleteLessonProgresses(+courseId));
- };
-};
-
-export const removeProgress = () => ({
- type: REMOVE_LEARN_PROGRESS,
-});
-
-export const setLessonProgressSyncNeeded = isSyncNeeded => ({
- type: LESSON_PROGRESS_SYNC_NEEDED,
- payload: isSyncNeeded,
-});
-
-export const syncLessonProgress = () => {
- return (dispatch, getState) => {
- const { learnProgress } = getState();
- const { lessons } = learnProgress;
- return saveLessonProgresses(lessons).then(() => dispatch(setLessonProgressSyncNeeded(false)));
- };
-};
-
-// internal actions
-
-const addCourseProgress = courseProgress => ({
- type: READ_COURSE_PROGRESS,
- payload: courseProgress,
-});
-
-const readCProgresses = courseProgresses => ({
- type: READ_COURSE_PROGRESSES,
- payload: courseProgresses,
-});
-
-const addProgress = lessonProgress => ({
- type: ADD_LESSON_PROGRESS,
- payload: lessonProgress,
-});
-
-const readProgress = lessonProgress => ({
- type: READ_LESSON_PROGRESS,
- payload: lessonProgress,
-});
-
-const readProgresses = lessonProgresses => ({
- type: READ_LESSON_PROGRESSES,
- payload: lessonProgresses,
-});
-
-const deleteLessonProgresses = courseId => ({
- type: DELETE_LESSON_PROGRESSES,
- payload: courseId,
-});
-
-const deleteLProgress = lessonId => ({
- type: DELETE_LESSON_PROGRESS,
- payload: lessonId,
-});
-
-const deleteCProgress = courseId => ({
- type: DELETE_COURSE_PROGRESS,
- payload: courseId,
-});
-
-// @VisibleForTesting
-export const saveProgressOnServer = lessonProgress => {
- return (dispatch, getState) => {
- const {
- user,
- learnProgress: { lessons },
- } = getState();
- if (user.isLoggedIn) {
- const progress = findExistingLesson({ lessons, lessonProgress });
- return progress ? saveLessonProgress(progress) : Promise.resolve('no progress available');
- }
- return Promise.resolve('nothing to do');
- };
-};
-
-// @VisibleForTesting
-export const deleteProgressOnServer = (contentId, type) => {
- return (dispatch, getState) => {
- const { user } = getState();
- if (user.isLoggedIn) {
- return deleteLearnProgress(contentId, type);
- }
- return Promise.resolve('nothing to do');
- };
-};
-
-const initialState = { lessons: [], courses: [], isSyncRequired: false };
-
-export const learnProgressReducer = (state = initialState, action) => {
- switch (action.type) {
- case ADD_LESSON_PROGRESS:
- // eslint-disable-next-line no-case-declarations
- const lessonProgress = generateLessonProgress({
- lessons: state.lessons,
- lessonProgress: action.payload,
- }) || { lessons: [] };
- return {
- ...state,
- ...lessonProgress,
- };
- case READ_LESSON_PROGRESS:
- if (!action.payload) {
- return state;
- }
- return {
- ...state,
- ...updateLessonProgressFromService({
- lessons: state.lessons,
- lessonProgress: action.payload,
- }),
- };
- case READ_LESSON_PROGRESSES:
- return {
- ...state,
- ...initializeLessonLearnProgressWithDataFromServer({
- lessonProgresses: action.payload,
- }),
- };
- case DELETE_LESSON_PROGRESS:
- return {
- ...state,
- ...deleteLessonProgressById({
- lessons: state.lessons,
- lessonId: action.payload,
- }),
- };
- case READ_COURSE_PROGRESS:
- return {
- ...state,
- ...addCourseProgressData({ courses: state.courses, courseProgress: action.payload }),
- };
- case READ_COURSE_PROGRESSES:
- return {
- ...state,
- ...initializeCourseLearnProgressWithDataFromServer({
- courseProgresses: action.payload,
- }),
- };
- case DELETE_COURSE_PROGRESS:
- return {
- ...state,
- ...deleteCourseProgressById({
- courses: state.courses,
- courseId: action.payload,
- }),
- };
- case DELETE_LESSON_PROGRESSES:
- return {
- ...state,
- ...deleteLessonProgressesByCourseId({ lessons: state.lessons, courseId: action.payload }),
- };
- case LESSON_PROGRESS_SYNC_NEEDED:
- return {
- ...state,
- isSyncRequired: action.payload,
- };
- case REMOVE_LEARN_PROGRESS:
- return initialState;
- default:
- return state;
- }
-};
diff --git a/sources-gen/state/progress/learnProgressSelectors.jsx b/sources-gen/state/progress/learnProgressSelectors.jsx
deleted file mode 100644
index 8eec4e0..0000000
--- a/sources-gen/state/progress/learnProgressSelectors.jsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import {
- findExistingCourseById,
- findExistingLessonById,
- findInquiryProgress,
-} from './learnProgress';
-
-export const learnProgressSelector = state => state.learnProgress;
-
-export const findLessonLearnProgressSelector = lessonId => state => {
- const { lessons } = state.learnProgress;
- return findExistingLessonById({ lessons, lessonId });
-};
-
-export const findInquiryLearnProgressSelector = (lessonId, exerciseId) => state => {
- if (!lessonId || !exerciseId) {
- return [];
- }
- const { lessons } = state.learnProgress;
- return findInquiryProgress({ lessons, lessonId, exerciseId });
-};
-
-export const findCourseLearnProgressSelector = courseId => state => {
- const { courses } = state.learnProgress;
- return { courseProgress: findExistingCourseById({ courses, courseId }) };
-};
-
-export const isLessonProgressSyncRequiredSelector = state => state.learnProgress.isSyncRequired;
diff --git a/sources-gen/state/progress/serverDataFilterUtils.jsx b/sources-gen/state/progress/serverDataFilterUtils.jsx
deleted file mode 100644
index 85e1581..0000000
--- a/sources-gen/state/progress/serverDataFilterUtils.jsx
+++ /dev/null
@@ -1,46 +0,0 @@
-const filterLessonFields = ['userId', 'lastModifiedDate', 'cosLessonVersion'];
-const filterExerciseFields = ['cosExerciseVersion'];
-const filterInquiryFields = ['minCorrectScore'];
-
-/**
- * Function which is responsible for removing currently not needed/wanted attributes from
- * server response on all hierarchy levels (lesson->exercise->inquiry). Those attributes
- * are provided from the server due to the current data model.
- *
- * @param payload - the server response with lesson progress data
- * @returns {*&{exerciseProgresses}}
- */
-export const filterDataFromService = payload => {
- const filteredLessonData = removeObjectAttributes(payload, filterLessonFields);
- const { exerciseProgresses } = filteredLessonData;
- const filteredExerciseProgresses = filterExerciseData(exerciseProgresses);
-
- return { ...filteredLessonData, exerciseProgresses: filteredExerciseProgresses };
-};
-
-const filterExerciseData = exerciseProgresses => {
- return exerciseProgresses.map(exerciseProgress => {
- const filteredExerciseProgress = removeObjectAttributes(exerciseProgress, filterExerciseFields);
- const { inquiryProgresses } = filteredExerciseProgress;
- const filteredInquiryProgresses = filterInquiryData(inquiryProgresses);
-
- return { ...filteredExerciseProgress, inquiryProgresses: filteredInquiryProgresses };
- });
-};
-
-const filterInquiryData = inquiryProgresses => {
- return inquiryProgresses.map(inquiryProgress =>
- removeObjectAttributes(inquiryProgress, filterInquiryFields),
- );
-};
-
-const removeObjectAttributes = (sourceObject, attributesToRemoveArray) => {
- const targetObject = { ...sourceObject };
- attributesToRemoveArray.forEach(field => {
- if (field in targetObject) {
- // eslint-disable-next-line fp/no-delete
- delete targetObject[field];
- }
- });
- return targetObject;
-};
diff --git a/sources-gen/state/progress/utils.jsx b/sources-gen/state/progress/utils.jsx
deleted file mode 100644
index f96ed74..0000000
--- a/sources-gen/state/progress/utils.jsx
+++ /dev/null
@@ -1,5 +0,0 @@
-export const sumScore = (contentsWithScore, scoreFieldName) =>
- contentsWithScore.reduce(
- (acc, nextContentWithScore) => acc + nextContentWithScore[scoreFieldName],
- 0,
- );
diff --git a/sources-gen/state/rootReducers.jsx b/sources-gen/state/rootReducers.jsx
deleted file mode 100644
index 2ecf840..0000000
--- a/sources-gen/state/rootReducers.jsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { combineReducers } from 'redux';
-import { userReducer } from './user/userDuck';
-import { learnProgressReducer } from './progress/learnProgressDuck';
-import { lessonExerciseModeReducer } from './mode/lessonExerciseModeDuck';
-
-const rootReducer = combineReducers({
- user: userReducer,
- learnProgress: learnProgressReducer,
- lessonExerciseMode: lessonExerciseModeReducer,
-});
-
-export default rootReducer;
diff --git a/sources-gen/state/store.jsx b/sources-gen/state/store.jsx
deleted file mode 100644
index 94bd88b..0000000
--- a/sources-gen/state/store.jsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import * as storage from 'redux-storage';
-import createEngine from 'redux-storage-engine-localstorage';
-import { createStore, applyMiddleware, compose } from 'redux';
-import thunk from 'redux-thunk';
-import rootReducer from './rootReducers';
-import { apiMiddleware } from './middlewares/apiMiddleware';
-import globals from '../utils/globals';
-import { isServer } from '../utils/ssr';
-
-const reducer = storage.reducer(rootReducer);
-const engine = createEngine('learngerman');
-const storageMiddleware = storage.createMiddleware(engine);
-
-// eslint-disable-next-line no-underscore-dangle
-const composeEnhancers = globals.window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
-
-const createStoreWithMiddleware = composeEnhancers(
- applyMiddleware(apiMiddleware, thunk, storageMiddleware),
-)(createStore);
-
-const store = createStoreWithMiddleware(reducer);
-
-const load = storage.createLoader(engine);
-if (!isServer()) {
- load(store);
-}
-
-export default store;
diff --git a/sources-gen/state/user/userDuck.jsx b/sources-gen/state/user/userDuck.jsx
deleted file mode 100644
index 7e03ab8..0000000
--- a/sources-gen/state/user/userDuck.jsx
+++ /dev/null
@@ -1,103 +0,0 @@
-import { apiAction } from '../common/apiActions';
-import {
- LOGGED_USER_RESOURCE,
- LOGOUT_SUFFIX,
- PROFILE_SUFFIX,
- PS_PREFIX,
-} from '../../services/userService';
-import { BASIC_JSON_CONTENT_TYPE_HEADER } from '../../constants/services';
-import { removeProgress } from '../progress/learnProgressDuck';
-
-export const SET_USER = 'SET_USER';
-export const REMOVE_USER = 'REMOVE_USER';
-export const API_ERROR = 'API_ERROR';
-const LOGOUT_REQUEST_CALLED_FLAG = 'LOGOUT_REQUEST_CALLED_FLAG';
-const SESSION_TIMEOUT = 'SESSION_TIMEOUT';
-
-export const logInUser = () =>
- apiAction({
- url: `${LOGGED_USER_RESOURCE}/${PROFILE_SUFFIX}`,
- onSuccess: setUser,
- onFailure: setApiError,
- headersOverride: { ...BASIC_JSON_CONTENT_TYPE_HEADER },
- });
-
-export const logOutUser = () =>
- apiAction({
- url: `${PS_PREFIX}${LOGOUT_SUFFIX}`,
- onSuccess: removeUserData,
- onFailure: setApiError,
- });
-
-export const deleteUserAccount = () =>
- apiAction({
- url: `${PS_PREFIX}${LOGOUT_SUFFIX}`,
- onSuccess: removeUserData,
- onFailure: setApiError,
- });
-
-export const removeUserData = () => {
- return dispatch => {
- dispatch(removeUser());
- dispatch(removeProgress());
- };
-};
-
-export const setUser = data => ({
- type: SET_USER,
- payload: data,
-});
-
-export const removeUser = () => ({
- type: REMOVE_USER,
-});
-
-export const setApiError = () => ({
- type: API_ERROR,
-});
-
-export const setHasLogOutRequestBeenCalled = hasBeenCalled => ({
- type: LOGOUT_REQUEST_CALLED_FLAG,
- payload: hasBeenCalled,
-});
-
-export const loginTimeout = () => ({
- type: SESSION_TIMEOUT,
-});
-
-const initialState = {
- userData: null,
- isLoggedIn: false,
- hasLogOutRequestBeenCalled: false,
- apiErrorHasOccurred: false,
-};
-
-export const userReducer = (state = initialState, action) => {
- switch (action.type) {
- case SET_USER:
- return {
- userData: action.payload,
- isLoggedIn: true,
- apiErrorHasOccurred: false,
- };
- case REMOVE_USER:
- return {
- ...initialState,
- hasLogOutRequestBeenCalled: true,
- };
- case API_ERROR:
- return {
- ...state,
- apiErrorHasOccurred: true,
- };
- case LOGOUT_REQUEST_CALLED_FLAG:
- return {
- ...state,
- hasLogOutRequestBeenCalled: action.payload,
- };
- case SESSION_TIMEOUT:
- return initialState;
- default:
- return state;
- }
-};
diff --git a/sources-gen/state/user/userSelectors.jsx b/sources-gen/state/user/userSelectors.jsx
deleted file mode 100644
index 5636b61..0000000
--- a/sources-gen/state/user/userSelectors.jsx
+++ /dev/null
@@ -1,2 +0,0 @@
-export const userSelector = state => state.user;
-export const userDataSelector = state => state.user.userData;
diff --git a/sources-gen/utils/apolloClient.jsx b/sources-gen/utils/apolloClient.jsx
deleted file mode 100644
index d09d920..0000000
--- a/sources-gen/utils/apolloClient.jsx
+++ /dev/null
@@ -1,55 +0,0 @@
-/* eslint-disable */
-export const possibleTypes = {
- ModelAspect: ['Exercise', 'Knowledge', 'Article', 'Category', 'Course', 'Subject', 'GeographicLocation', 'Lesson', 'Navigation', 'Person', 'Image', 'Audio', 'Video', 'Widget', 'Livestream', 'Download', 'Keyword', 'ImageGallery', 'GalleryImage', 'GeographicRegion', 'ExternalLink', 'PhysicalImage', 'ContentComposition', 'InformationSpace', 'CompositionComponent', 'CompositionComponentConfiguration'],
- DeliveryAspect: ['Exercise', 'Knowledge', 'Article', 'Category', 'Course', 'Lesson', 'Navigation', 'Person', 'Image', 'Audio', 'Video', 'Widget', 'ImageGallery', 'GeographicRegion', 'ContentComposition'],
- NamedAspect: ['Exercise', 'Knowledge', 'Article', 'Category', 'Course', 'Subject', 'GeographicLocation', 'Lesson', 'Navigation', 'Person', 'Image', 'Audio', 'Video', 'Widget', 'Livestream', 'Download', 'Keyword', 'ImageGallery', 'GalleryImage', 'GeographicRegion', 'ExternalLink', 'ContentComposition', 'InformationSpace'],
- AssociationsAspect: ['Exercise', 'Knowledge', 'Article', 'Course', 'Lesson', 'Navigation', 'Person', 'Image', 'Audio', 'Video', 'Widget', 'ImageGallery', 'GalleryImage'],
- TextualAspect: ['Article', 'Person', 'Audio', 'Video', 'ImageGallery'],
- ContactAspect: ['Article', 'Person', 'Audio', 'Video', 'ImageGallery'],
- MetadataAspect: ['Article', 'Audio', 'Video', 'ImageGallery'],
- DkMetadataAspect: ['Article'],
- GeographicLocationAspect: ['GeographicLocation'],
- TreeAspect: ['Category', 'Navigation', 'GeographicRegion'],
- DeletionAspect: ['Image', 'Audio', 'Video'],
- PlaybackResourceAspect: ['Audio', 'Video'],
- BinaryDataAspect: ['Download', 'PhysicalImage'],
- SocialMediaAspect: ['Article', 'Audio', 'Video', 'ImageGallery'],
- FooterAspect: ['Article', 'Navigation', 'Person', 'Audio', 'Video', 'ImageGallery'],
- BetaLayerAspect: ['Article', 'Navigation', 'Person', 'Audio', 'Video', 'ImageGallery'],
- UrlAspect: ['Article', 'Navigation', 'Person', 'Audio', 'Video', 'ImageGallery'],
- PersonRelatedContent: ['Article', 'Audio', 'Video', 'Image', 'ImageGallery'],
- Content: ['Article', 'Category', 'Subject', 'GeographicLocation', 'Navigation', 'Person', 'Image', 'Audio', 'Video', 'Widget', 'Livestream', 'Download', 'Keyword', 'ImageGallery', 'GalleryImage', 'GeographicRegion', 'CocoContent'],
-};
-
-// fetch(`http://localhost:4000/graphql`, {
-// method: 'POST',
-// headers: { 'Content-Type': 'application/json' },
-// body: JSON.stringify({
-// variables: {},
-// query: `
-// {
-// __schema {
-// types {
-// kind
-// name
-// possibleTypes {
-// name
-// }
-// }
-// }
-// }
-// `,
-// }),
-// })
-// .then(result => result.json())
-// .then(result => {
-// const possibleTypes = {};
-
-// result.data.__schema.types.forEach(supertype => {
-// if (supertype.possibleTypes) {
-// possibleTypes[supertype.name] =
-// supertype.possibleTypes.map(subtype => subtype.name);
-// }
-// });
-// console.log(JSON.stringify(possibleTypes));
-// });
diff --git a/sources-gen/utils/audioUtils.jsx b/sources-gen/utils/audioUtils.jsx
deleted file mode 100644
index 436763d..0000000
--- a/sources-gen/utils/audioUtils.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-export const findQuestionAudio = audios => audios.find(audio => audio.mainContent);
-
-export const findFeedbackAudio = (isSolutionAudioFallbackMode, audios) => {
- const feedbackAudio = audios.find(audio => !audio.mainContent);
- return feedbackAudio || (isSolutionAudioFallbackMode ? findQuestionAudio(audios) : undefined);
-};
diff --git a/sources-gen/utils/certificateUtils.jsx b/sources-gen/utils/certificateUtils.jsx
deleted file mode 100644
index 9d1d348..0000000
--- a/sources-gen/utils/certificateUtils.jsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import { getCertificate } from '../services/certificateService';
-import { FEEDBACK_TYPES } from '../constants/feedback';
-import { feedbackHelper } from './url/feedbackHelpers';
-
-export const handleCertificateGeneration = async ({ id, langCode, history }) => {
- if (!id) {
- history.push(feedbackHelper.forInvalidCertificate(langCode));
- }
-
- try {
- const response = await getCertificate(id);
- response.blob().then(blob => {
- const headerFilename = response.headers.get('Content-Disposition').split('filename=')[1];
- const filename = headerFilename.replace('?', '–');
- const url = window.URL.createObjectURL(blob);
- const downloadLink = document.createElement('a');
- // eslint-disable-next-line fp/no-mutation
- downloadLink.href = url;
- // eslint-disable-next-line fp/no-mutation
- downloadLink.download = decodeURIComponent(filename);
- downloadLink.click();
- });
- } catch (error) {
- error.errorCode === FEEDBACK_TYPES.MISSING_TRANSCRIPTION
- ? history.push(feedbackHelper.forCertificateMissingTranscription(langCode))
- : history.push(feedbackHelper.forInvalidCertificate(langCode));
- }
-};
diff --git a/sources-gen/utils/commons.jsx b/sources-gen/utils/commons.jsx
deleted file mode 100644
index a5a3368..0000000
--- a/sources-gen/utils/commons.jsx
+++ /dev/null
@@ -1,54 +0,0 @@
-export const noop = () => {};
-
-export const invert = inMap =>
- Object.entries(inMap).reduce((acc, next) => ({ ...acc, [next[1]]: next[0] }), {});
-
-export const not = predicate => args => !predicate(args);
-
-// eslint-disable-next-line fp/no-rest-parameters
-export const pipe = (...fns) => fns.reduce((v, f) => (...args) => f(v(...args)));
-
-// a functionality that groups a collection of items together into an object based on a given key
-export const groupBy = (key, array) =>
- array.reduce(
- // eslint-disable-next-line fp/no-mutating-assign
- (acc, next) => Object.assign(acc, { [next[key]]: (acc[next[key]] || []).concat(next) }),
- {},
- );
-
-export const removeContentLinksWithEmptyTarget = contentLinks =>
- contentLinks.filter(contentLink => !!contentLink.target);
-
-export const isFinalTestPredicate = contentLink =>
- contentLink.additionalInformation && contentLink.additionalInformation.includes('final_test');
-
-export const capitalize = text => text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();
-
-export const getMediaFileSizeInKBorMB = fileSizeInBytes =>
- fileSizeInBytes > 999999
- ? `${Math.floor(fileSizeInBytes / 1000000)}MB`
- : `${Math.floor(fileSizeInBytes / 1000)}KB`;
-
-export const shuffle = array => {
- // eslint-disable-next-line
- for (let i = array.length - 1; i > 0; i--) {
- const j = Math.floor(Math.random() * (i + 1));
- // eslint-disable-next-line
- [array[i], array[j]] = [array[j], array[i]];
- }
- return array;
-};
-
-export const calculatePercentage = (fraction, total) => Math.round((fraction / total) * 100) || 0;
-
-export const generateRandomNumber = (min, max) => Math.floor(Math.random() * (max - min)) + min;
-
-export const sortObjectsByProp = (array, prop, order = 1) => {
- // eslint-disable-next-line fp/no-mutating-methods
- return [...array].sort((a, b) => {
- if (a[prop] === b[prop]) {
- return 0;
- }
- return a[prop] < b[prop] ? -order : order;
- });
-};
diff --git a/sources-gen/utils/css.jsx b/sources-gen/utils/css.jsx
deleted file mode 100644
index 2edddfd..0000000
--- a/sources-gen/utils/css.jsx
+++ /dev/null
@@ -1,137 +0,0 @@
-import { css } from 'styled-components';
-
-export const resolutions = Object.freeze({
- min: Object.freeze({
- zero: 0,
- mobile: 320,
- tablet: 768,
- tabletLandscape: 1024,
- desktop: 1200,
- full: 1280,
- }),
- max: Object.freeze({
- mobile: 767,
- tablet: 1199,
- tabletLandscape: 992,
- desktop: Number.MAX_SAFE_INTEGER,
- }),
-});
-
-const wrapInMedia = (sizes, type) =>
- Object.keys(sizes).reduce(
- (acc, label) => ({
- ...acc,
- ...{
- // eslint-disable-next-line fp/no-rest-parameters
- [label]: (...args) => css`
- @media (${type}-width: ${sizes[label]}px) {
- ${css(...args)}
- }
- `,
- },
- }),
- {},
- );
-
-export const mediaMin = wrapInMedia(resolutions.min, 'min');
-export const mediaMax = wrapInMedia(resolutions.max, 'max');
-
-// eslint-disable-next-line fp/no-rest-parameters
-const wrapInHoverPointerMedia = (hover, pointer) => (...args) => css`
- @media (hover: ${hover}) and (pointer: ${pointer}) {
- ${css(...args)}
- }
-`;
-
-/* https://medium.com/@ferie/detect-a-touch-device-with-only-css-9f8e30fa1134 */
-/* https://media.kulturbanause.de/2017/05/interaction-type-media-queries.html */
-export const mediaDevice = {
- mouse: wrapInHoverPointerMedia('hover', 'fine'),
- touch: wrapInHoverPointerMedia('none', 'coarse'),
-};
-
-export const colors = Object.freeze({
- LG_WHITE: '#FFF',
- LG_BLACK: '#000',
-
- LG_ORANGE: '#F08C00',
- LG_ORANGE_DARK: '#E1500F',
- LG_PINK: '#DC1978',
- LG_RED: '#BE0046',
- LG_RED_SCORE: '#BE232D',
- LG_RED_DARK: '#B20028',
- LG_GREEN_YELLOW: '#CDBE00',
- LG_GREEN_LIGHT: '#91B423',
- LG_GREEN: '#55911E',
- LG_GREEN_SCORE: '#82B905',
-
- DW_BLUE: '#002D5A',
- DW_DARK_BLUE: '#032F59',
- DW_LIGHT_BLUE: '#0098FF',
-
- LG_BLUE_1: '#0098FF',
- LG_BLUE_2: '#0096FA',
- LG_BLUE_3: '#1B9EFD',
- LG_BLUE_4: '#99d7ff',
- LG_BLUE_5: '#1464A5',
- LG_BLUE_6: '#032F59',
- LG_BLUE_7: '#1B9EFD',
-
- LG_BAHAMA_BLUE: '#23527c',
-
- LG_GRAY_1: '#938A7F',
- LG_GRAY_2: '#BBB',
- LG_GRAY_3: '#F5F4F2',
- LG_GRAY_4: '#ddd',
- LG_GRAY_5: '#444',
- LG_GRAY_6: '#ccc',
- LG_GRAY_7: '#eee',
- LG_GRAY_8: '#9B9B9B',
- LG_GRAY_9: '#3e3e3e',
- LG_GRAY_10: '#252629',
- LG_GRAY_11: '#666',
- LG_GRAY_12: '#E6E1DD',
- LG_GRAY_13: '#4a4a4a',
- LG_GRAY_14: '#e7e7e7',
- LG_GRAY_15: '#777777',
-
- LG_ORANGE1: '#bf6f00',
-
- LIGHT_KHAKI: '#f4f3f2',
-
- LG_GRAY_TRANSPARENT_1: 'rgba(128,128,128,.5)',
- LG_GRAY_TRANSPARENT_15: 'rgba(128,128,128,.15)',
- LG_TRANSPARENT_BLACK_075: 'rgba(0,0,0,0.075)',
- LG_TRANSPARENT_BLACK_20: 'rgba(0,0,0,0.2)',
- LG_TRANSPARENT_BLACK_25: 'rgba(0,0,0,0.25)',
- LG_TRANSPARENT_BLACK_30: 'rgba(0,0,0,0.3)',
- LG_TRANSPARENT_BLACK_40: 'rgba(0,0,0,0.4)',
- LG_TRANSPARENT_BLACK_50: 'rgba(0,0,0,0.5)',
- LG_TRANSPARENT_WHITE_10: 'rgba(255,255,255,0.1)',
- LG_TRANSPARENT_WHITE_15: 'rgba(255,255,255,0.15)',
- LG_TRANSPARENT_WHITE_25: 'rgba(255,255,255,0.25)',
- LG_TRANSPARENT_WHITE_50: 'rgba(255,255,255,0.5)',
-});
-
-export const selector = Object.freeze({
- composition: Object.freeze({
- even: ':first-child:nth-last-child(2n)',
- odd: ':first-child:nth-last-child(2n+1)',
- _369: ':first-child:nth-last-child(3n)',
- _258: ':first-child:nth-last-child(3n+2)',
- _4710: ':first-child:nth-last-child(3n+1)',
- }),
- notFirst: ':not(:first-child)',
- notLast: ':not(:last-child)',
- disabled: '[disabled]:not([disabled="false"])',
- topElements: numberOfElements => `:nth-child(-n+${numberOfElements})`,
- justNElements: numberOfElements => `:first-child:nth-last-child(${numberOfElements})`,
-});
-
-export const clearfix = `
- &:after {
- display: table;
- content: "";
- clear: both;
- }
- `;
diff --git a/sources-gen/utils/errorClassAssigner.jsx b/sources-gen/utils/errorClassAssigner.jsx
deleted file mode 100644
index f3f77a2..0000000
--- a/sources-gen/utils/errorClassAssigner.jsx
+++ /dev/null
@@ -1,5 +0,0 @@
-export const hasErrorClassAssigner = (className, error) =>
- error ? `${className} has-error` : className;
-
-export const hasNestedErrorsClassAssigner = (className, error) =>
- error ? `${className} has-nested-errors` : className;
diff --git a/sources-gen/utils/globals.jsx b/sources-gen/utils/globals.jsx
deleted file mode 100644
index 6f2429d..0000000
--- a/sources-gen/utils/globals.jsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { isServer } from './ssr';
-
-const globals = {
- window: isServer() ? global.window || {} : window,
- document: isServer() ? {} : document,
- navigator: isServer() ? {} : navigator,
- localStorage: isServer() ? {} : window.localStorage,
-};
-
-export default globals;
diff --git a/sources-gen/utils/htmlUtils.jsx b/sources-gen/utils/htmlUtils.jsx
deleted file mode 100644
index b5db3eb..0000000
--- a/sources-gen/utils/htmlUtils.jsx
+++ /dev/null
@@ -1,10 +0,0 @@
-export const scrollIntoViewCenter = htmlElement => {
- htmlElement.scrollIntoView({
- behavior: 'smooth',
- block: 'center',
- inline: 'nearest',
- });
-};
-
-// Creates a string that can be used for dynamic id and key attributes
-export const uniqueId = () => `id-${Math.random().toString(36).substr(2, 16)}`;
diff --git a/sources-gen/utils/i18n.jsx b/sources-gen/utils/i18n.jsx
deleted file mode 100644
index 0ec75fe..0000000
--- a/sources-gen/utils/i18n.jsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import { accessPath } from './jsonPath';
-
-// eslint-disable-next-line fp/no-let
-let translations = null;
-
-export const replaceInPattern = (pattern, options) =>
- Object.keys(options).reduce((acc, nextVar) => {
- const varNameRegex = new RegExp(/\${/.source + nextVar + /}/.source, 'g'); // ${nextVar}
- return acc.replace(varNameRegex, options[nextVar]);
- }, pattern);
-
-const retrieveLabel = key => {
- const translation = accessPath(key, translations);
- if (!translation) {
- return key;
- }
- return translation;
-};
-
-export function hasTranslations() {
- return !!translations;
-}
-
-export function setTranslations(inTranslations) {
- translations = inTranslations; // eslint-disable-line fp/no-mutation
-}
-
-export function clearTranslations() {
- translations = null; // eslint-disable-line fp/no-mutation
-}
-
-export function t(key, options) {
- const label = retrieveLabel(key);
- return options ? replaceInPattern(label, options) : label;
-}
-
-export function gqlQueryByLang(lang) {
- const langValue = lang || '$lang';
- return `
- i18n: i18nByLang(lang: ${langValue}, appName: "mdl"){
- all
- }
- `;
-}
-
-export function gqlQueryByContent({ id, lang } = {}) {
- const idValue = id || '$id';
- const langValue = lang || '$lang';
-
- return `
- i18n: i18nByContent (id: ${idValue}, lang: ${langValue}){
- all
- }
- `;
-}
diff --git a/sources-gen/utils/imgUtils.jsx b/sources-gen/utils/imgUtils.jsx
deleted file mode 100644
index f883508..0000000
--- a/sources-gen/utils/imgUtils.jsx
+++ /dev/null
@@ -1,60 +0,0 @@
-const ratioToPercentage = (widthProportion, heightProportion) =>
- (heightProportion / widthProportion) * 100;
-
-const ASPECT_RATIO = {
- landscape: ratioToPercentage(16, 9),
- landscape_legacy: ratioToPercentage(4, 3),
- portrait: ratioToPercentage(3, 4),
- square: ratioToPercentage(1, 1),
-};
-
-export const imgWithFormatFn = (imageId, imageBasePath) => format =>
- `${imageBasePath}/${imageId}_${format.id}.jpg`;
-
-export const format = Object.freeze({
- legacy: {
- id: 4,
- aspectRatio: [ASPECT_RATIO.landscape_legacy, ASPECT_RATIO.portrait],
- },
- free: {
- id: 7,
- },
- sm: {
- id: 503,
- aspectRatio: ASPECT_RATIO.landscape,
- },
- sm_richtext: {
- id: 503,
- aspectRatio: [ASPECT_RATIO.landscape, ASPECT_RATIO.portrait],
- },
- md: {
- id: 505,
- aspectRatio: ASPECT_RATIO.landscape,
- },
- md_richtext: {
- id: 505,
- aspectRatio: [ASPECT_RATIO.landscape, ASPECT_RATIO.portrait],
- },
- lg: {
- id: 507,
- aspectRatio: ASPECT_RATIO.landscape,
- },
- lg_richtext: {
- id: 507,
- aspectRatio: [ASPECT_RATIO.landscape, ASPECT_RATIO.portrait],
- },
- full: {
- id: 509,
- aspectRatio: ASPECT_RATIO.landscape,
- },
-});
-
-export const getFormatForWidth = ({ innerWidth, sources = [] }) => {
- const source = sources.find(w => innerWidth >= w.minWidth && innerWidth <= w.maxWidth);
- return source ? source.imgFormat : format.lg;
-};
-
-export const getImgUrlForWidth = ({ innerWidth, sources = [], imageId, imageBasePath }) => {
- const useFormat = getFormatForWidth({ innerWidth, sources });
- return imgWithFormatFn(imageId, imageBasePath)(useFormat);
-};
diff --git a/sources-gen/utils/jsonPath.jsx b/sources-gen/utils/jsonPath.jsx
deleted file mode 100644
index d7985b4..0000000
--- a/sources-gen/utils/jsonPath.jsx
+++ /dev/null
@@ -1,25 +0,0 @@
-// watch out - arrays not supported ;) Maybe in future
-// we should replace this small function with something more powerful
-// but let us wait till it is really needed.
-
-function accessPathByArr(keysArr, obj) {
- if (!obj) {
- return null;
- }
- const objPartial = obj[keysArr[0]];
-
- if (!objPartial) {
- return null;
- }
- if (keysArr.length === 1) {
- return objPartial;
- }
- return accessPathByArr(keysArr.slice(1), objPartial);
-}
-
-export function accessPath(pathStr, obj) {
- if (!pathStr) {
- return obj;
- }
- return accessPathByArr(pathStr.split('.'), obj);
-}
diff --git a/sources-gen/utils/learningLevelUtils.jsx b/sources-gen/utils/learningLevelUtils.jsx
deleted file mode 100644
index 271be9b..0000000
--- a/sources-gen/utils/learningLevelUtils.jsx
+++ /dev/null
@@ -1,15 +0,0 @@
-// converts dkLearningLevel value to string learning levels
-export const learningLevelMapper = {
- 0: '',
- 2: 'A1',
- 4: 'A2',
- 8: 'B1',
- 16: 'B2',
-};
-
-export const sortByLearningLevel = coursesToSort =>
- // eslint-disable-next-line fp/no-mutating-methods
- [...coursesToSort].sort((a, b) => {
- if (a.dkLearningLevel === 0 && b.dkLearningLevel === 0) return 0;
- return a.dkLearningLevel - b.dkLearningLevel || a.id - b.id;
- });
diff --git a/sources-gen/utils/lessonUtils.jsx b/sources-gen/utils/lessonUtils.jsx
deleted file mode 100644
index 13bcd1a..0000000
--- a/sources-gen/utils/lessonUtils.jsx
+++ /dev/null
@@ -1,71 +0,0 @@
-import { LESSON_PARTS } from '../constants/lessonParts';
-import { isFinalTestPredicate } from './commons';
-import {
- getAlphabeticalOrderUrl,
- getFirstGrammarUrl,
- getFirstRegionalStudiesUrl,
- getVocabularyUrl,
-} from './url/urlFactory';
-
-export const hasLessonPart = (lessonOverviewParts, lessonPart) => {
- return lessonOverviewParts.some(part => part.lessonPart === lessonPart);
-};
-
-export const getFirstIdOfLessonPart = (lessonOverviewParts, lessonPart) => {
- const targetOverviewPart = lessonOverviewParts.find(part => part.lessonPart === lessonPart);
- return targetOverviewPart ? targetOverviewPart.targetId : null;
-};
-
-export const filterLessonKnowledgeOverviewItems = lessonOverviewParts =>
- lessonOverviewParts.filter(part =>
- [
- LESSON_PARTS.GRAMMAR,
- LESSON_PARTS.VOCABULARY_GLOSSARY,
- LESSON_PARTS.REGIONAL_STUDIES,
- ].includes(part.lessonPart),
- );
-
-export const filterLessonExerciseOverviewItems = lessonOverviewParts =>
- lessonOverviewParts.filter(part => part.lessonPart === LESSON_PARTS.EXERCISE);
-
-export const isFinalTestLesson = ({ lessonContentLinksFromCourse, currentLessonId }) => {
- const finalTestLessonContentLink = lessonContentLinksFromCourse.find(
- contentLink => contentLink.targetId === +currentLessonId && isFinalTestPredicate(contentLink),
- );
- return Boolean(finalTestLessonContentLink);
-};
-
-export const filteredAssembledInfos = ({ lessonOverviewParts, lessonPath }) => {
- return assembleOverviewInfos({ lessonOverviewParts, lessonPath }).filter(info => info.hasInfo);
-};
-
-export const assembleOverviewInfos = ({ lessonOverviewParts, lessonPath }) => {
- const firstGrammarId = getFirstIdOfLessonPart(lessonOverviewParts, LESSON_PARTS.GRAMMAR);
- const firstRegionalStudiesId = getFirstIdOfLessonPart(
- lessonOverviewParts,
- LESSON_PARTS.REGIONAL_STUDIES,
- );
-
- return [
- {
- name: 'grammar',
- hasInfo: hasLessonPart(lessonOverviewParts, LESSON_PARTS.GRAMMAR),
- url: getFirstGrammarUrl(lessonPath, firstGrammarId),
- },
- {
- name: 'alphabeticalOrder',
- hasInfo: hasLessonPart(lessonOverviewParts, LESSON_PARTS.PHONEMIC_CHART),
- url: getAlphabeticalOrderUrl(lessonPath),
- },
- {
- name: 'vocabulary',
- hasInfo: hasLessonPart(lessonOverviewParts, LESSON_PARTS.VOCABULARY_GLOSSARY),
- url: getVocabularyUrl(lessonPath),
- },
- {
- name: 'regionalStudies',
- hasInfo: hasLessonPart(lessonOverviewParts, LESSON_PARTS.REGIONAL_STUDIES),
- url: getFirstRegionalStudiesUrl(lessonPath, firstRegionalStudiesId),
- },
- ];
-};
diff --git a/sources-gen/utils/mappers/langMapper.jsx b/sources-gen/utils/mappers/langMapper.jsx
deleted file mode 100644
index eac28d3..0000000
--- a/sources-gen/utils/mappers/langMapper.jsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import { invert } from '../commons';
-
-export const LANG_CODES = Object.freeze({
- NEUTRAL: '',
- GERMAN: 'de',
- ENGLISH: 'en',
- RUSSIAN: 'ru',
- CHINESE: 'zh',
- PORTUGUESE_BRAZIL: 'pt-br',
- ALBANIAN: 'sq',
- AMHARIC: 'am',
- ARABIC: 'ar',
- BENGALI: 'bn',
- BOSNIAN: 'bs',
- BULGARIAN: 'bg',
- DARI: 'fa-af',
- FRENCH: 'fr',
- GREEK: 'el',
- HAUSA: 'ha',
- HINDI: 'hi',
- INDONESIAN: 'id',
- KISWAHILI: 'sw',
- CROATIAN: 'hr',
- MACEDONIAN: 'mk',
- PASHTO: 'ps',
- PERSIAN: 'fa-ir',
- POLISH: 'pl',
- PORTUGUESE_AFRICA: 'pt-002',
- ROMANIAN: 'ro',
- SERBIAN: 'sr',
- SPANISH: 'es',
- TURKISH: 'tr',
- UKRANIAN: 'uk',
- URDU: 'ur',
-});
-
-const codeToLang = invert(LANG_CODES);
-
-export const toLangCode = lang => lang && LANG_CODES[lang.toUpperCase()];
-export const toLang = code => code && codeToLang[code.toLowerCase()];
diff --git a/sources-gen/utils/mappers/lessonPartToTranslationCode.jsx b/sources-gen/utils/mappers/lessonPartToTranslationCode.jsx
deleted file mode 100644
index a9b653f..0000000
--- a/sources-gen/utils/mappers/lessonPartToTranslationCode.jsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { LESSON_PARTS } from '../../constants/lessonParts';
-
-const LESSON_PART_TRANSLATION_CODES = Object.freeze({
- [LESSON_PARTS.PHONEMIC_CHART]: '',
- [LESSON_PARTS.EXERCISE]: '',
- [LESSON_PARTS.GRAMMAR]: 'lesson.menu.grammar',
- [LESSON_PARTS.VOCABULARY_GLOSSARY]: 'lesson.menu.vocabulary',
- [LESSON_PARTS.REGIONAL_STUDIES]: 'lesson.menu.regionalStudies',
- [LESSON_PARTS.MANUSCRIPT]: '',
- [LESSON_PARTS.DOWNLOAD]: '',
-});
-
-export const getTranslationCodeForLessonPart = lessonPart =>
- LESSON_PART_TRANSLATION_CODES[lessonPart];
diff --git a/sources-gen/utils/mappers/passwordReset.jsx b/sources-gen/utils/mappers/passwordReset.jsx
deleted file mode 100644
index 3f36ab9..0000000
--- a/sources-gen/utils/mappers/passwordReset.jsx
+++ /dev/null
@@ -1,4 +0,0 @@
-export const formatPasswordResetUserData = ({ userData, captchaToken }) => ({
- email: userData.email,
- recaptcha: captchaToken,
-});
diff --git a/sources-gen/utils/mappers/placementTestCourseIds.jsx b/sources-gen/utils/mappers/placementTestCourseIds.jsx
deleted file mode 100644
index 8834dc1..0000000
--- a/sources-gen/utils/mappers/placementTestCourseIds.jsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { LANG_CODES } from './langMapper';
-
-const PLACEMENT_TEST_COURSE_IDS = Object.freeze({
- [LANG_CODES.ENGLISH]: 36519788,
- [LANG_CODES.GERMAN]: 36519653,
- [LANG_CODES.ARABIC]: 36519905,
- [LANG_CODES.PERSIAN]: 45477054,
- [LANG_CODES.PORTUGUESE_BRAZIL]: 45476784,
- [LANG_CODES.RUSSIAN]: 45476947,
- [LANG_CODES.SPANISH]: 47994050,
- [LANG_CODES.FRENCH]: 47994032,
- [LANG_CODES.CHINESE]: 47993840,
- [LANG_CODES.POLISH]: 50080753,
-});
-
-export const getPlacementTestIdForLangCode = langCode => PLACEMENT_TEST_COURSE_IDS[langCode];
-
-export const isPlacementTestCourse = courseId => {
- const allIds = Object.values(PLACEMENT_TEST_COURSE_IDS);
- return allIds.includes(courseId);
-};
diff --git a/sources-gen/utils/mappers/rtlLanguages.jsx b/sources-gen/utils/mappers/rtlLanguages.jsx
deleted file mode 100644
index 88d562f..0000000
--- a/sources-gen/utils/mappers/rtlLanguages.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { LANG_CODES } from './langMapper';
-
-const rtlLanguages = [
- LANG_CODES.ARABIC,
- LANG_CODES.DARI,
- LANG_CODES.HAUSA,
- LANG_CODES.PASHTO,
- LANG_CODES.PERSIAN,
- LANG_CODES.URDU,
-];
-export const isRtlByLangCode = langCode => rtlLanguages.includes(langCode);
diff --git a/sources-gen/utils/mappers/subtitlesLabel.jsx b/sources-gen/utils/mappers/subtitlesLabel.jsx
deleted file mode 100644
index da00d90..0000000
--- a/sources-gen/utils/mappers/subtitlesLabel.jsx
+++ /dev/null
@@ -1,31 +0,0 @@
-export const subtitlesLabels = Object.freeze({
- GERMAN: 'Deutsch/Deutsch',
- ENGLISH: 'English',
- RUSSIAN: 'Русский',
- CHINESE: '中文',
- PORTUGUESE_BRAZIL: 'Português',
- ALBANIAN: 'Shqip',
- AMHARIC: 'አማርኛ',
- ARABIC: 'عربي',
- BENGALI: 'বাংলা',
- BOSNIAN: 'Bosanski',
- BULGARIAN: 'Български',
- DARI: 'دری',
- FRENCH: 'Français',
- GREEK: 'Ελληνικά',
- HAUSA: 'Hausa',
- HINDI: 'हिन्दी',
- INDONESIAN: 'Bahasa Indonesia',
- KISWAHILI: 'Kiswahili',
- CROATIAN: 'Hrvatski',
- MACEDONIAN: 'Македонски',
- PASHTO: 'پښتو',
- PERSIAN: 'فارسی',
- POLISH: 'Polski',
- ROMANIAN: 'Română',
- SERBIAN: 'Srpski',
- SPANISH: 'Español',
- TURKISH: 'Türkçe',
- UKRANIAN: 'Українська мова',
- URDU: 'اردو',
-});
diff --git a/sources-gen/utils/pageMetadata.jsx b/sources-gen/utils/pageMetadata.jsx
deleted file mode 100644
index 395d437..0000000
--- a/sources-gen/utils/pageMetadata.jsx
+++ /dev/null
@@ -1,68 +0,0 @@
-import { PAGE_TYPES } from '../constants/pageTypes';
-
-const LESSON_MENU_VOCABULARY_KEY = 'lesson.menu.vocabulary';
-const LESSON_EXERCISE_RESULT_TITLE_KEY = 'lesson.exercises.result.title';
-const LESSON_MENU_GRAMMAR_KEY = 'lesson.menu.grammar';
-const LESSON_MENU_REGIONAL_STUDIES_KEY = 'lesson.menu.regionalStudies';
-const LESSON_MANUSCRIPT_KEY = 'lesson.menu.manuscript';
-const LESSON_MENU_EXTRAS_KEY = 'lesson.menu.extras';
-const LESSON_EXERCISES_RESULT_GENERAL_KEY = 'lesson.exercises.result.general';
-
-export const PAGE_TYPE_TO_TITLE_TRANSLATION_KEYS = Object.freeze({
- [PAGE_TYPES.ALPHABETICAL_ORDER]: ['lesson.menu.alphabeticalOrder'],
- [PAGE_TYPES.OVERVIEW]: ['metadata.overview'],
- [PAGE_TYPES.GRAMMAR_DETAIL]: [LESSON_MENU_GRAMMAR_KEY],
- [PAGE_TYPES.HELP]: ['common.help'],
- [PAGE_TYPES.VOCABULARY_OVERVIEW]: [LESSON_MENU_VOCABULARY_KEY],
- [PAGE_TYPES.USER_PROFILE]: ['profile.edit.title'],
- [PAGE_TYPES.FEEDBACK_STATUS]: ['common.feedback'],
- [PAGE_TYPES.REGISTER_USER]: ['profile.register.title'],
- [PAGE_TYPES.VOCABULARY]: [LESSON_MENU_VOCABULARY_KEY],
- [PAGE_TYPES.LEGAL]: ['metadata.legal'],
- [PAGE_TYPES.LESSON_EXERCISE_RESULT]: [LESSON_EXERCISE_RESULT_TITLE_KEY],
- [PAGE_TYPES.LESSON_SUMMARY]: [LESSON_EXERCISE_RESULT_TITLE_KEY],
- [PAGE_TYPES.GRAMMAR]: [LESSON_MENU_GRAMMAR_KEY],
- [PAGE_TYPES.GRAMMAR_OVERVIEW]: [LESSON_MENU_GRAMMAR_KEY],
- [PAGE_TYPES.REGIONAL_STUDIES]: [LESSON_MENU_REGIONAL_STUDIES_KEY],
- [PAGE_TYPES.MANUSCRIPT]: [LESSON_MANUSCRIPT_KEY],
- [PAGE_TYPES.EXTRAS]: [LESSON_MENU_EXTRAS_KEY],
- [PAGE_TYPES.VOCABULARY_TRAINER]: ['header.menu.vocabularyTrainer'],
- [PAGE_TYPES.PLACEMENT_DASHBOARD]: ['header.menu.levelTest'],
- [PAGE_TYPES.PASSWORD_CHANGE]: ['profile.edit.password.change.title'],
- [PAGE_TYPES.PASSWORD_RESET]: ['profile.edit.password.reset.title'],
- [PAGE_TYPES.PASSWORD_SET]: ['profile.edit.password.set.title'],
- [PAGE_TYPES.FINAL_TEST]: [LESSON_EXERCISES_RESULT_GENERAL_KEY],
- [PAGE_TYPES.PLACEMENT_TEST]: [LESSON_EXERCISES_RESULT_GENERAL_KEY, 'header.menu.levelTest'],
-});
-
-export const PAGE_TYPE_TO_DESCRIPTION_TRANSLATION_KEYS = Object.freeze({
- [PAGE_TYPES.HELP]: 'metadata.description.help',
- [PAGE_TYPES.VOCABULARY]: 'metadata.description.vocabulary',
- [PAGE_TYPES.LEGAL]: 'metadata.description.legal',
- [PAGE_TYPES.OVERVIEW]: 'metadata.description.overview',
- [PAGE_TYPES.GRAMMAR]: 'metadata.description.grammar',
- [PAGE_TYPES.REGIONAL_STUDIES]: 'metadata.description.regionalStudies',
- [PAGE_TYPES.MANUSCRIPT]: 'metadata.description.manuscript',
- [PAGE_TYPES.REGISTER_USER]: 'metadata.description.register',
- [PAGE_TYPES.EXTRAS]: 'metadata.description.extras',
-});
-
-export const PAGE_TYPE_TO_KEYWORDS_TRANSLATION_KEYS = Object.freeze({
- [PAGE_TYPES.VOCABULARY]: LESSON_MENU_VOCABULARY_KEY,
- [PAGE_TYPES.LESSON_EXERCISE_RESULT]: LESSON_EXERCISE_RESULT_TITLE_KEY,
- [PAGE_TYPES.LESSON_SUMMARY]: LESSON_EXERCISE_RESULT_TITLE_KEY,
- [PAGE_TYPES.GRAMMAR]: LESSON_MENU_GRAMMAR_KEY,
- [PAGE_TYPES.GRAMMAR_OVERVIEW]: LESSON_MENU_GRAMMAR_KEY,
- [PAGE_TYPES.GRAMMAR_DETAIL]: LESSON_MENU_GRAMMAR_KEY,
- [PAGE_TYPES.VOCABULARY_OVERVIEW]: LESSON_MENU_VOCABULARY_KEY,
- [PAGE_TYPES.REGIONAL_STUDIES]: LESSON_MENU_REGIONAL_STUDIES_KEY,
- [PAGE_TYPES.MANUSCRIPT]: LESSON_MANUSCRIPT_KEY,
- [PAGE_TYPES.EXTRAS]: LESSON_MENU_EXTRAS_KEY,
- [PAGE_TYPES.FINAL_TEST]: LESSON_EXERCISES_RESULT_GENERAL_KEY,
- [PAGE_TYPES.PLACEMENT_TEST]: LESSON_EXERCISES_RESULT_GENERAL_KEY,
-});
-
-export const createTitle = ({ titleParts }) => titleParts.filter(Boolean).join(' | ');
-export const createKeywords = ({ keywords }) => keywords.filter(Boolean).join(',');
-
-export const html2text = ({ html }) => (html ? html.replace(/<.*?>/g, ' ') : html);
diff --git a/sources-gen/utils/replacers/exerciseReplacer.jsx b/sources-gen/utils/replacers/exerciseReplacer.jsx
deleted file mode 100644
index ef47268..0000000
--- a/sources-gen/utils/replacers/exerciseReplacer.jsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { replaceWithComponent } from './replaceCommons';
-
-export const replacePlaceholderWithAnswerComponent = ({
- selector,
- createComponent,
- scopeClassName,
- node,
-}) => {
- replaceWithComponent({
- selector: scopeClassName
- ? `.${scopeClassName} ${selector || '.placeholder-cloze'}`
- : selector || '.placeholder-cloze',
- node,
- componentFn: (matchedElem, index) => createComponent(index, matchedElem),
- });
-};
diff --git a/sources-gen/utils/replacers/htmlReplacer.jsx b/sources-gen/utils/replacers/htmlReplacer.jsx
deleted file mode 100644
index bb87e54..0000000
--- a/sources-gen/utils/replacers/htmlReplacer.jsx
+++ /dev/null
@@ -1,21 +0,0 @@
-const TABLE_WITH_ATTRIBUTES = '';
-const OPEN_TABLE_TAG = '';
-const CLOSE_TABLE_TAG = '
';
-const TABLE_WRAPPER_DIV = '';
-const DIV_CLOSING = '
';
-
-export const wrapTablesWithDiv = htmlString => {
- const text = removeAttributesFromTables(htmlString);
- const textReplacedOpenings = text.replace(
- new RegExp(TABLE_WITH_ATTRIBUTES, 'g'),
- `${TABLE_WRAPPER_DIV}${OPEN_TABLE_TAG}`,
- );
- const textReplacedClosings = textReplacedOpenings.replace(
- new RegExp(CLOSE_TABLE_TAG, 'g'),
- `${CLOSE_TABLE_TAG}${DIV_CLOSING}`,
- );
- return textReplacedClosings;
-};
-
-const removeAttributesFromTables = htmlString =>
- htmlString.replace(new RegExp(TABLE_WITH_ATTRIBUTES, 'g'), OPEN_TABLE_TAG);
diff --git a/sources-gen/utils/replacers/imageReplacer.jsx b/sources-gen/utils/replacers/imageReplacer.jsx
deleted file mode 100644
index b3c4f0c..0000000
--- a/sources-gen/utils/replacers/imageReplacer.jsx
+++ /dev/null
@@ -1,82 +0,0 @@
-import { imgWithFormatFn, format } from '../imgUtils';
-import { resolutions } from '../css';
-import { DwPicture } from '../../components/DwPicture/DwPicture';
-import { getFrontendConfig } from '../../hooks/useFrontendConfig';
-import { replaceWithComponent } from './replaceCommons';
-
-export const mapImgPlaceholderToPicComponent = matchedElem => {
- const { imageBasePath } = getFrontendConfig();
- const rawImageFormat = matchedElem.getAttribute('data-format');
- const isLegacy = rawImageFormat.includes('LEGACY');
- const isFree = rawImageFormat === 'FREE_IMAGE';
- const imageId = matchedElem.getAttribute('data-id');
- const imgWithFormat = imgWithFormatFn(imageId, imageBasePath);
- const imageAspectRatio = matchedElem.getAttribute('data-aspect-ratio');
-
- const imagePropsText = {
- fallbackUrl: imgWithFormat(format.md_richtext),
- sources: [
- {
- media: `(min-width: ${resolutions.min.desktop}px)`,
- srcSet: imgWithFormat(format.lg_richtext),
- },
- {
- media: `(min-width: ${resolutions.min.tablet}px)`,
- srcSet: imgWithFormat(format.md_richtext),
- },
- {
- media: `(max-width: ${resolutions.max.mobile}px)`,
- srcSet: imgWithFormat(format.sm_richtext),
- },
- ],
- };
-
- const imagePropsLegacy = {
- fallbackUrl: imgWithFormat(format.legacy),
- sources: [
- {
- srcSet: imgWithFormat(format.legacy),
- },
- ],
- };
-
- const imagePropsFree = {
- fallbackUrl: imgWithFormat(format.free),
- sources: [
- {
- srcSet: imgWithFormat(format.free),
- },
- ],
- aspectRatio: { paddingBottom: `${imageAspectRatio}%`, height: 0 },
- };
-
- const getImageDisplayProps = () => {
- if (isLegacy) {
- return imagePropsLegacy;
- }
- if (isFree) {
- return imagePropsFree;
- }
- return imagePropsText;
- };
-
- const imageProps = {
- ...{
- imageId,
- alt: matchedElem.getAttribute('alt'),
- },
- ...getImageDisplayProps(),
- };
- return ;
-};
-
-// leave content as parameter as might be needed in future cases
-// eslint-disable-next-line no-unused-vars
-export const replacePlaceholderImagesWithResponsivePictures = content => {
- replaceWithComponent({
- selector: '.placeholder-image img',
- node: document,
- componentFn: mapImgPlaceholderToPicComponent,
- elementType: 'div',
- });
-};
diff --git a/sources-gen/utils/replacers/knowledgeReplacer.jsx b/sources-gen/utils/replacers/knowledgeReplacer.jsx
deleted file mode 100644
index f793cfd..0000000
--- a/sources-gen/utils/replacers/knowledgeReplacer.jsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Knowledge } from '../../components/Modal/KnowledgeModal/Knowledge';
-import { replaceWithComponent } from './replaceCommons';
-
-export const placeholderToKnowledgeComponent = (matchedElement, { knowledges, isRtl }) => {
- return (
- element.id === parseInt(matchedElement.dataset.id, 10))}
- isRtl={isRtl}
- >
- {matchedElement.textContent}
-
- );
-};
-
-export const replacePlaceholderMarkupWithKnowledges = param => {
- replaceWithComponent({
- selector: '.placeholder.editable',
- node: document,
- componentFn: placeholderToKnowledgeComponent,
- param,
- });
-};
diff --git a/sources-gen/utils/replacers/replaceCommons.jsx b/sources-gen/utils/replacers/replaceCommons.jsx
deleted file mode 100644
index 0a4c2dd..0000000
--- a/sources-gen/utils/replacers/replaceCommons.jsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import ReactDOM from 'react-dom';
-import globals from '../globals';
-
-export const replaceWithComponent = ({
- selector,
- componentFn,
- node,
- param = null,
- elementType = 'span',
-}) => {
- [...node.querySelectorAll(selector)].forEach((matchedElem, index) => {
- const renderContainer = globals.document.createElement(elementType);
- const placeholderClassNames = matchedElem.className;
- renderContainer.setAttribute('class', `render-container ${placeholderClassNames}`.trim());
- matchedElem.parentNode.replaceChild(renderContainer, matchedElem);
- const componentToRender = param
- ? componentFn(matchedElem, param, index)
- : componentFn(matchedElem, index);
- ReactDOM.render(componentToRender, renderContainer);
- });
- return { document: globals.document };
-};
diff --git a/sources-gen/utils/replacers/useImagePlaceholderReplacementEffect.jsx b/sources-gen/utils/replacers/useImagePlaceholderReplacementEffect.jsx
deleted file mode 100644
index e71c5f3..0000000
--- a/sources-gen/utils/replacers/useImagePlaceholderReplacementEffect.jsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { replacePlaceholderImagesWithResponsivePictures } from './imageReplacer';
-import { useTimeout } from '../../hooks/useTimeout';
-
-export const useImagePlaceholderReplacementEffect = ({ trigger = 'staticTrigger' }) => {
- useTimeout(
- {
- callback: () => {
- replacePlaceholderImagesWithResponsivePictures();
- },
- delay: 10,
- },
- [trigger],
- );
-};
diff --git a/sources-gen/utils/ssr.jsx b/sources-gen/utils/ssr.jsx
deleted file mode 100644
index f00affd..0000000
--- a/sources-gen/utils/ssr.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export function isServer() {
- return !(typeof window !== 'undefined' && window.document);
-}
-// CommonJS export to be able to use it on server and client
-//module.exports = {
-// isServer,
-//};
diff --git a/sources-gen/utils/url/feedbackHelpers.jsx b/sources-gen/utils/url/feedbackHelpers.jsx
deleted file mode 100644
index 9aa9f16..0000000
--- a/sources-gen/utils/url/feedbackHelpers.jsx
+++ /dev/null
@@ -1,92 +0,0 @@
-import { getErrorCode, getFeedbackUrl } from './urlFactory';
-import { FEEDBACK_TYPES } from '../../constants/feedback';
-
-export const feedbackHelper = {
- getForErrorCode(errorResponse, langCode) {
- const errorCode = getErrorCode(errorResponse);
- return feedbackHelper.error(errorCode, langCode);
- },
- getForPasswordChangeErrorCode(errorResponse, langCode) {
- const errorCode = getErrorCode(errorResponse);
- return feedbackHelper.errorPasswordChange(errorCode, langCode);
- },
- forLogin(redirectUrl, langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.LOGIN, langCode);
- },
- forLogout(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.LOGOUT, langCode);
- },
- forUserDelete(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.DELETED, langCode);
- },
- forInvalidToken(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.INVALID_TOKEN, langCode);
- },
- forProfileServiceUnavailable(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.PROFILE_SERVICE_UNAVAILABLE, langCode);
- },
- forSessionTimeout(redirectUrl, langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.SESSION_TIMEOUT, langCode);
- },
- forMissingUserProfile(redirectUrl, langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.MISSING_USER_PROFILE, langCode);
- },
- forForcedLogout(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.FORCED_LOGOUT, langCode);
- },
- forPasswordChanged(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.PASSWORD_CHANGED, langCode);
- },
- forMailChanged(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.MAIL_CHANGED, langCode);
- },
- forMailChangeRequest(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.MAIL_CHANGE_REQUEST, langCode);
- },
- forRegistered(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.REGISTERED, langCode);
- },
- forRegistrationConfirm(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.REGISTRATION_CONFIRMED, langCode);
- },
- forPasswordResetRequest(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.PASSWORD_RESET_REQUESTED, langCode);
- },
- forSetPassword(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.PASSWORD_RESET_SET, langCode);
- },
- forProfileUpdated(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.PROFILE_UPDATED, langCode);
- },
- forVocabularyTrainerUnavailable(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.VOCABULARY_TRAINER_UNAVAILABLE, langCode);
- },
- forVocabularyTrainerNoVocabularies(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.VOCABULARY_TRAINER_NO_VOCABULARIES, langCode);
- },
- forCertificateMissingTranscription(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.CERTIFICATE_NO_TRANSCRIPTION, langCode);
- },
- forInvalidCertificate(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.INVALID_CERTIFICATE, langCode);
- },
- forGeneralError(langCode) {
- return getFeedbackUrl(FEEDBACK_TYPES.OTHER, langCode);
- },
- error(errorCode, langCode) {
- return getFeedbackUrl(errorCode || FEEDBACK_TYPES.OTHER, langCode);
- },
- errorPasswordChange(errorCode, langCode) {
- return getFeedbackUrl(
- errorCode ? FEEDBACK_TYPES.PASSWORD_CHANGE + errorCode : FEEDBACK_TYPES.OTHER,
- langCode,
- );
- },
-
- getFeedbackContentKey(feedbackType) {
- const typeWithoutUnderline = feedbackType
- .toLowerCase()
- .replace(/_+./g, s => s.slice(-1).toUpperCase());
- return `client.status.${typeWithoutUnderline}`;
- },
-};
diff --git a/sources-gen/utils/url/pathAnalyser.jsx b/sources-gen/utils/url/pathAnalyser.jsx
deleted file mode 100644
index b6af30e..0000000
--- a/sources-gen/utils/url/pathAnalyser.jsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import { toLangCode } from '../mappers/langMapper';
-import { encodeUrlNamePart, normalizeUrlName } from './url';
-import { FEEDBACK_TYPES } from '../../constants/feedback';
-
-export const pathPartials = {
- // IMPORTANT: Avoid groups in regex, always check here: https://pshrmn.github.io/route-tester/
- langCodeRegex: '[a-z]{2}-?0?0?2?[briaf]{0,2}',
- titlePathRegex: '.*',
- contentIdRegex: '\\d+',
- contentTypeRegex: '[a-z_]{1,15}',
- knowledgeTypeRegex: 'lv|la',
- knowledgeWithContentIdTypeRegex: 'gr|rs',
- feedbackTypes: Object.values(FEEDBACK_TYPES).join('|'),
-};
-
-export const alignTitleRedirect = ({ title, language }) => ({ params, url }) => {
- const { typeId, contentId, title: titleFromPath } = params;
- if (titleFromPath !== normalizeUrlName(title.replace(/\//g, ''))) {
- return {
- redirect: true,
- path: `/${toLangCode(language)}/${encodeUrlNamePart(title)}/${typeId}-${contentId}`,
- };
- }
-
- return {
- redirect: false,
- path: url,
- };
-};
-
-export const notFoundRedirect = statement => ({ params, url }) => {
- const { langCode } = params;
- if (statement) {
- const langFromUrl = langCode ? `/${langCode}` : '/en';
- return {
- redirect: true,
- path: `${langFromUrl}/404?from=${url}`,
- };
- }
- return {
- redirect: false,
- path: url,
- };
-};
-
-export const checkRedirects = ({ fns = [], match }) =>
- fns.reduce(
- (initial, fn) => {
- if (!initial.redirect) {
- const result = fn()(match) || {};
- return result.redirect ? result : initial;
- }
- return initial;
- },
- {
- redirect: false,
- path: match.url,
- },
- );
diff --git a/sources-gen/utils/url/url.jsx b/sources-gen/utils/url/url.jsx
deleted file mode 100644
index 0beb8cb..0000000
--- a/sources-gen/utils/url/url.jsx
+++ /dev/null
@@ -1,78 +0,0 @@
-import { invert } from '../commons';
-import { isServer } from '../ssr';
-import globals from '../globals';
-import config from '../../config';
-
-const typeToUrlPrefixMap = {
- COURSE: 'c',
- GRAMMAR: 'gr',
- LESSON: 'l',
- PLACEMENT: 'placement',
- FINAL: 'final',
-};
-const urlPrefixToTypeMap = invert(typeToUrlPrefixMap);
-
-export const typeToUrlPrefix = type => {
- const typeName = type
- .replace(/([A-Z])/g, '_$1')
- .slice(1)
- .toUpperCase();
- return typeToUrlPrefixMap[type] || typeToUrlPrefixMap[typeName] || type.toLowerCase();
-};
-
-export const urlPrefixToType = typeId => urlPrefixToTypeMap[typeId] || typeId.toUpperCase();
-
-// If it gets too complex here, then maybe better to avoid negative match
-// and list special characters. But then watch out for very special characters ◕◡◕ 😛
-const allowedUrlCharactersRegexParts = {
- general: 'a-zA-Z',
- numbers: '0-9',
- whiteSpaces: ' ',
- allowedSpecial: '\\-äöüÄÖÜß',
- arabic: '\\u0600-\\u06FF',
- cyrillic: '\\u0400-\\u04FF',
- greek_and_coptic: '\\u0370-\\u03FF',
- chinese: '\\u4E00-\\u9FFF',
- devanagari: '\\u0900-\\u097F',
- bengali: '\\u0980-\\u09FF',
- ethiopian: '\\u1200-\\u137F',
-};
-const onlySpecialCharactersRegex = new RegExp(
- `[^${Object.values(allowedUrlCharactersRegexParts).join('')}]`,
- 'g',
-);
-
-export const normalizeUrlName = name =>
- name.replace(onlySpecialCharactersRegex, '').replace(/\s/g, '-').toLowerCase();
-
-export const encodeUrlNamePart = name => encodeURIComponent(normalizeUrlName(name));
-
-export const urlForNav = ({ id }) => `/s-${id}`;
-
-export const urlHostNameFromString = ({ url }) => {
- try {
- return new URL(url).hostname;
- } catch (e) {
- console.log(`error parsing url : ${url}\n`, e);
- return false;
- }
-};
-
-export const mainContentFullUrl = () => (isServer() ? null : globals.window.location.href);
-
-export const getVideoDownloadUrl = ({ videoUrl }) => `${config.download.videoBaseUrl}${videoUrl}`;
-
-export const getAudioDownloadUrl = ({ audioUrl }) => `${config.download.audioBaseUrl}${audioUrl}`;
-
-export const getDownloadUrl = ({ staticBaseHost, downloadId, filename }) =>
- `${staticBaseHost}/downloads/${downloadId}/${filename.toLowerCase()}`;
-
-export const getArticleUrl = ({ articleId, name }) =>
- `${config.dw.baseUrl}/de/${normalizeUrlName(name)}/a-${articleId}`;
-
-export const getDWStructureUrl = ({ id, name, langCode }) =>
- `${config.dw.baseUrl}/${langCode}/${normalizeUrlName(name)}/s-${id}`;
-
-export const getQueryParamValueFrom = ({ from = globals.window.location.search, value }) =>
- new URLSearchParams(from).get(value);
-export const objectToQueryParams = obj => new URLSearchParams(obj).toString();
diff --git a/sources-gen/utils/url/urlFactory.jsx b/sources-gen/utils/url/urlFactory.jsx
deleted file mode 100644
index 5599c15..0000000
--- a/sources-gen/utils/url/urlFactory.jsx
+++ /dev/null
@@ -1,189 +0,0 @@
-import { USER } from '../../constants/userUrl';
-import { FEEDBACK_TYPES, TYPES_WITH_PROFILE_PAGE_AS_TARGET } from '../../constants/feedback';
-import { toLangCode } from '../mappers/langMapper';
-import { encodeUrlNamePart, typeToUrlPrefix } from './url';
-import {
- getPlacementTestIdForLangCode,
- isPlacementTestCourse,
-} from '../mappers/placementTestCourseIds';
-import config from '../../config';
-
-export const PAGE_OVERVIEW = '/overview';
-export const PAGE_REGISTRATION = '/user/register';
-export const PAGE_PROFILE = '/user/profile';
-export const PAGE_PASSWORD_CHANGE = '/user/password/change';
-export const PAGE_PASSWORD_RESET = '/user/password/reset';
-export const PAGE_VOCABULARY_TRAINER = '/user/vocabularyTrainer';
-export const PAGE_VOCABULARY_TRAINER_START = '/user/vocabularyTrainerStart';
-export const STATUS_FEEDBACK = '/user/feedback/status';
-export const PAGE_GRAMMAR = '/grammar';
-const PAGE_HELP = '/help';
-export const PAGE_VOCABULARY = '/vocabulary';
-export const PAGE_LEGAL = '/legal';
-export const PAGE_PLACEMENT_TEST = '/placementDashboard';
-export const EXERCISES_RESULT_URL_SUFFIX = 'ler';
-const COURSE_PREFIX = 'c-';
-const LESSON_PREFIX = 'l-';
-const EXERCISE_PREFIX = 'e-';
-const LESSON_GRAMMAR_URL_SUFFIX = 'gr-';
-export const LESSON_VOCABULARY_URL_SUFFIX = 'lv';
-const LESSON_REGIONAL_STUDIES_SUFFIX = 'rs-';
-export const ALPHABETICAL_ORDER_URL_SUFFIX = 'la';
-export const LESSON_MANUSCRIPT_SUFFIX = 'lm';
-export const LESSON_EXTRAS_SUFFIX = 'le';
-export const LESSON_EXERCISE_RESULT_SUFFIX = 'ler';
-export const LESSON_SUMMARY_SUFFIX = 'sum';
-const SUMMARY_URL_SUFFIX = 'sum';
-export const URL_SEARCH_PARAM_TARGET_PATH = 'target';
-
-export const getErrorCode = errorResponse => errorResponse && errorResponse.errorCode;
-
-export const getPrefixedLanguageUrl = (url, langCode) => `/${langCode}${url}`;
-export const getCasLanguageParam = langCode => {
- if (!langCode) {
- return null;
- }
- return langCode.includes('-') ? langCode.substring(0, langCode.indexOf('-')) : langCode;
-};
-
-export const getDashboardUrl = langCode => getPrefixedLanguageUrl(PAGE_OVERVIEW, langCode);
-
-export const getGrammarUrl = langCode => getPrefixedLanguageUrl(PAGE_GRAMMAR, langCode);
-
-export const getVocabularyPageUrl = langCode => getPrefixedLanguageUrl(PAGE_VOCABULARY, langCode);
-
-export const getPlacementDashboardUrl = langCode =>
- getPrefixedLanguageUrl(PAGE_PLACEMENT_TEST, langCode);
-
-export const getLessonExerciseUrl = (languageCode, lessonId, normalizedUrlName, lessonPartId) =>
- `${getLessonUrl(lessonId, languageCode, normalizedUrlName)}/${EXERCISE_PREFIX}${lessonPartId}`;
-
-export const getLessonGrammarUrl = (languageCode, lessonId, normalizedUrlName, lessonPartId) =>
- `${getLessonUrl(
- lessonId,
- languageCode,
- normalizedUrlName,
- )}/${LESSON_GRAMMAR_URL_SUFFIX}${lessonPartId}`;
-
-export const getLessonPhonemicChartUrl = (languageCode, lessonId, normalizedUrlName) =>
- `${getLessonUrl(lessonId, languageCode, normalizedUrlName)}/${ALPHABETICAL_ORDER_URL_SUFFIX}`;
-
-export const getLessonVocabularyUrl = (languageCode, lessonId, normalizedUrlName) =>
- `${getLessonUrl(lessonId, languageCode, normalizedUrlName)}/${LESSON_VOCABULARY_URL_SUFFIX}`;
-
-export const getLessonRegionalStudiesUrl = (
- languageCode,
- lessonId,
- normalizedUrlName,
- lessonPartId,
-) =>
- `${getLessonUrl(
- lessonId,
- languageCode,
- normalizedUrlName,
- )}/${LESSON_REGIONAL_STUDIES_SUFFIX}${lessonPartId}`;
-
-export const getRegisterUrl = langCode => getPrefixedLanguageUrl(PAGE_REGISTRATION, langCode);
-
-export const getUserProfileUrl = langCode => getPrefixedLanguageUrl(PAGE_PROFILE, langCode);
-
-export const getPasswordChangeUrl = langCode =>
- getPrefixedLanguageUrl(PAGE_PASSWORD_CHANGE, langCode);
-
-export const getPasswordResetUrl = langCode =>
- getPrefixedLanguageUrl(PAGE_PASSWORD_RESET, langCode);
-
-export const getCourseUrl = (courseId, langCode, normalizedUrlCourseName) =>
- getPrefixedLanguageUrl(`/${normalizedUrlCourseName}/${COURSE_PREFIX}${courseId}`, langCode);
-
-export const getLessonUrl = (lessonId, languageCode, normalizedUrlLessonName) =>
- getPrefixedLanguageUrl(`/${normalizedUrlLessonName}/${LESSON_PREFIX}${lessonId}`, languageCode);
-
-export const getLessonExercisesResultUrl = lessonUrl =>
- `${lessonUrl}/${EXERCISES_RESULT_URL_SUFFIX}`;
-
-export const getFirstGrammarUrl = (lessonUrl, firstGrammarId) =>
- `${lessonUrl}/gr-${firstGrammarId}`;
-
-export const getVocabularyUrl = lessonUrl => `${lessonUrl}/${LESSON_VOCABULARY_URL_SUFFIX}`;
-
-export const getAlphabeticalOrderUrl = lessonUrl => `${lessonUrl}/${ALPHABETICAL_ORDER_URL_SUFFIX}`;
-
-export const getFirstRegionalStudiesUrl = (lessonUrl, firstRegionalStudiesId) =>
- `${lessonUrl}/${LESSON_REGIONAL_STUDIES_SUFFIX}${firstRegionalStudiesId}`;
-
-export const getManuscriptUrl = lessonUrl => `${lessonUrl}/${LESSON_MANUSCRIPT_SUFFIX}`;
-
-export const getExtrasUrl = lessonUrl => `${lessonUrl}/${LESSON_EXTRAS_SUFFIX}`;
-
-export const getSummaryUrl = lessonUrl => `${lessonUrl}/${SUMMARY_URL_SUFFIX}`;
-
-export const getPlacementTestResultUrl = ({ langCode, id, name }) =>
- getPrefixedLanguageUrl(`/${name}/placement-${id}`, langCode);
-
-export const transformUrlContentPrefix = (lessonPath, type) =>
- lessonPath.replace('/l-', `/${type}-`);
-
-export const createLinkToResultPage = ({ courseId, isFinalTest, lessonPath }) => {
- if (isFinalTest) return transformUrlContentPrefix(lessonPath, 'final');
-
- if (isPlacementTestCourse(courseId)) return transformUrlContentPrefix(lessonPath, 'placement');
-
- return getLessonExercisesResultUrl(lessonPath);
-};
-
-export const getHelpUrl = langCode => getPrefixedLanguageUrl(PAGE_HELP, langCode);
-export const getLegalUrl = langCode => getPrefixedLanguageUrl(PAGE_LEGAL, langCode);
-
-export const getCourseCertificateUrl = paramUrl =>
- getPrefixedLanguageUrl(`/certificate/${paramUrl}`);
-
-export const getVocabularyTrainerStartPage = langCode =>
- getPrefixedLanguageUrl(PAGE_VOCABULARY_TRAINER_START, langCode);
-
-export const getVocabularyTrainerPage = langCode =>
- getPrefixedLanguageUrl(PAGE_VOCABULARY_TRAINER, langCode);
-
-export const getTargetPageUrl = (type, langCode) => {
- return TYPES_WITH_PROFILE_PAGE_AS_TARGET.includes(type)
- ? getPrefixedLanguageUrl(PAGE_PROFILE, langCode)
- : getDashboardUrl(langCode);
-};
-
-export const getFeedbackUrl = (type, langCode) =>
- getPrefixedLanguageUrl(`${STATUS_FEEDBACK}/${type}`, langCode);
-
-export const getLoginPage = (origin, langCode, targetPath) => {
- const callbackUrl = origin + getFeedbackUrl(FEEDBACK_TYPES.LOGIN, langCode);
- return getLoginRedirectUrl(callbackUrl, langCode, false, targetPath);
-};
-
-const getLoginUrlSearchParamsString = (langCode, targetPath) => {
- return targetPath ? `?${URL_SEARCH_PARAM_TARGET_PATH}=${encodeURIComponent(targetPath)}` : '';
-};
-
-export const getLoginRedirectUrl = (callbackUrl, langCode, withDomain, targetPath) => {
- const urlSearchParams = getLoginUrlSearchParamsString(langCode, targetPath);
- const AUTH_SERVICE_PREFIX = withDomain ? USER.AS_URL_WITH_DOMAIN : USER.AS_URL;
- return `${AUTH_SERVICE_PREFIX}login?service=${encodeURIComponent(
- `${callbackUrl}${urlSearchParams}`,
- )}&locale=${getCasLanguageParam(langCode)}`;
-};
-
-export const getContentUrl = ({ id, name, language, __typename }) => {
- const langCode = toLangCode(language);
- const langUrlPart = language ? `/${langCode}` : '';
-
- if (id === getPlacementTestIdForLangCode(langCode)) {
- return getPlacementDashboardUrl(langCode);
- }
-
- const nameUrlPart = name ? `/${encodeUrlNamePart(name)}` : '';
- return `${langUrlPart}${nameUrlPart}/${typeToUrlPrefix(__typename)}-${id}`;
-};
-
-export const getFooterLinkForNamedUrl = ({ namedUrl }) => `${config.dw.mobileUrl}${namedUrl}`;
-
-export const getDwUrlWithLang = ({ langCode }) => `${config.dw.baseUrl}/${langCode}`;
-
-export const getDwContactUrl = () => `${config.dw.mobileUrl}/contact`;
diff --git a/sources-gen/utils/url/urlUtils.jsx b/sources-gen/utils/url/urlUtils.jsx
deleted file mode 100644
index 65dd7bd..0000000
--- a/sources-gen/utils/url/urlUtils.jsx
+++ /dev/null
@@ -1,42 +0,0 @@
-export const buildParamRegex = paramName =>
- new RegExp(`[?&]${encodeURIComponent(paramName)}=([^&]*)`);
-
-// eslint-disable-next-line consistent-return
-export const getFromUrl = (url, name, regexBuilder) => {
- const paramRegex = regexBuilder(name);
- const matchArray = paramRegex.exec(url);
- if (matchArray) {
- return decodeURIComponent(matchArray[1]);
- }
-};
-
-export const getSearchParam = (location, name) =>
- getFromUrl(location.search, name, buildParamRegex);
-
-export const removeSearchParam = (location, name) => {
- const paramRegex = buildParamRegex(name);
- const rawWiththoutParam = location.search ? location.search.replace(paramRegex, '') : '';
- if (rawWiththoutParam && rawWiththoutParam[0] !== '?') {
- return `?${rawWiththoutParam.substring(1)}`;
- }
- return rawWiththoutParam;
-};
-
-export const containsSearchParam = (location, name) => {
- const paramRegex = buildParamRegex(name);
- return paramRegex.test(location.search);
-};
-
-export const getPathVariable = (location, name) =>
- getFromUrl(location.pathname, name, buildPathVariableRegex);
-
-const buildPathVariableRegex = pathVariablePrefix =>
- new RegExp(`${encodeURIComponent(pathVariablePrefix)}-(\\d*)`);
-
-export const isPathInExerciseNavigationWhiteList = pathname => {
- const permittedNavigationPathsRegexp = new RegExp(
- /(\/e-[0-9]+|\/ler|\/placement-[0-9]+|\/final-[0-9]+)$/,
- 'g',
- );
- return permittedNavigationPathsRegexp.test(pathname);
-};
diff --git a/sources-gen/utils/userUtils.jsx b/sources-gen/utils/userUtils.jsx
deleted file mode 100644
index ae8faae..0000000
--- a/sources-gen/utils/userUtils.jsx
+++ /dev/null
@@ -1,63 +0,0 @@
-import { getSearchParam, removeSearchParam } from './url/urlUtils';
-import { USER } from '../constants/userUrl';
-
-export const getTicketFromUrlParam = location => getSearchParam(location, USER.TICKET_PARAM_NAME);
-
-export const getTicketDomain = (origin, location) =>
- encodeURIComponent(
- origin + location.pathname + removeSearchParam(location, USER.TICKET_PARAM_NAME),
- );
-
-export const formatRegistrationUserData = ({ userData, captchaToken, langCode }) => {
- const {
- sex,
- firstName,
- lastName,
- email,
- password,
- country,
- teacher,
- newsletter,
- year,
- } = userData;
-
- return {
- sex,
- firstName,
- lastName,
- email,
- password,
- country,
- 'g-recaptcha-response': captchaToken,
- teacher,
- newsletter,
- recaptcha: captchaToken,
- contactLanguage: langCode,
- ...(year && createDateOfBirth({ year })),
- };
-};
-
-export const formatUserProfileData = ({ data }) => {
- const { year, ...restProps } = data;
-
- return {
- ...restProps,
- ...(year && createDateOfBirth({ year })),
- };
-};
-
-const createDateOfBirth = ({ year }) => ({
- dateOfBirth: `${year}-01-01`,
-});
-
-export const deconstructDateOfBirth = dateOfBirth => {
- if (!dateOfBirth) return {};
-
- const datePartials = dateOfBirth.split('-');
-
- return {
- year: datePartials[0],
- month: datePartials[1],
- day: datePartials[2],
- };
-};
diff --git a/sources-gen/utils/validation/validationMessages.jsx b/sources-gen/utils/validation/validationMessages.jsx
deleted file mode 100644
index d7e2ff9..0000000
--- a/sources-gen/utils/validation/validationMessages.jsx
+++ /dev/null
@@ -1,30 +0,0 @@
-export const CUSTOM_ERROR_TRANSLATION_KEYS = {
- SAFE_MONGO_CHARACTERS_ONLY: 'safeMongoCharactersOnly',
- TRANSCRIPTION: 'transcription',
-};
-
-const buildKey = suffix => `client.validator.${suffix}`;
-
-export const getTranslatedValidationMessage = ({
- name,
- validationErrorTranslationKey,
- validationType,
- customErrorTranslationKey,
- t,
-}) => {
- const title = t(validationErrorTranslationKey);
- switch (validationType) {
- case 'required':
- return t(buildKey('required'), { first: title });
- case 'pattern':
- return t(customErrorTranslationKey ? buildKey(customErrorTranslationKey) : buildKey(name), {
- first: title,
- });
- case 'differsFromEmail':
- return t(buildKey('differFromEmail'));
- case 'passwordRetype':
- return t(buildKey('equalTo'));
- default:
- return '';
- }
-};
diff --git a/sources-gen/utils/validation/validators.jsx b/sources-gen/utils/validation/validators.jsx
deleted file mode 100644
index 415a1ec..0000000
--- a/sources-gen/utils/validation/validators.jsx
+++ /dev/null
@@ -1,56 +0,0 @@
-export const emailPattern = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
-export const transcriptionPattern = /^[\sa-zA-ZäöüÄÖÜß-]*$/;
-export const namePattern = /^[^\u0027\u0022;{}<>&:\\]+$/;
-
-export const passwordValid = password => {
- if (!password) {
- return false;
- }
-
- const minLength = 8;
- // eslint-disable-next-line
- let numberOfFulfilledConditions = 0;
- const minNumberOfFulfilledConditions = 3;
- const regexPatterns = [/[0-9]/, /[^A-Za-z_0-9]/, /[A-Z]/, /[a-z]/];
-
- regexPatterns.forEach(pattern => {
- if (password.match(pattern) !== null) {
- // eslint-disable-next-line
- numberOfFulfilledConditions += 1;
- }
- });
-
- return !!(
- password.length >= minLength && numberOfFulfilledConditions >= minNumberOfFulfilledConditions
- );
-};
-
-export const passwordRetypeValid = (passwordRetype, password) =>
- !!(password && password === passwordRetype);
-
-export const passwordDiffersFromEmail = (password, email) => {
- const repeatedCharsLimit = 4;
- const template = email;
- const { length } = template;
- // eslint-disable-next-line
- let subString;
-
- // eslint-disable-next-line
- for (let i = 0; i < length - repeatedCharsLimit; i++) {
- // eslint-disable-next-line
- subString = template.substring(i, i + repeatedCharsLimit);
- if (password.indexOf(subString) !== -1) {
- return false;
- }
- }
- return true;
-};
-
-const validateCaptcha = (state, setState) => {
- setState({ ...state, captchaError: !state.isCaptchaPassed });
- return state.isCaptchaPassed;
-};
-
-export const captcha = {
- validateCaptcha,
-};
diff --git a/sources-gen/video/api.jsx b/sources-gen/video/api.jsx
deleted file mode 100644
index c47232b..0000000
--- a/sources-gen/video/api.jsx
+++ /dev/null
@@ -1,80 +0,0 @@
-import globals from '../utils/globals';
-import { hasVideosOnly, hasAudiosOnly } from './videoTypeMatcher';
-import { importVideoPlugins } from './videoPlugins';
-import { importAudioPlugins } from './audioPlugins';
-import { importVideoJs } from './videojs';
-
-const commonOptions = {
- bigPlayButton: false,
-};
-
-const videoOptions = {
- ...commonOptions,
-};
-
-const audioOptions = {
- ...commonOptions,
- controlBar: {
- pictureInPictureToggle: false,
- fullscreenToggle: false,
- },
- playbackRates: [1, 1.3, 1.5],
-};
-
-export const getOptions = videoNode => {
- if (videoNode.tagName === 'AUDIO') {
- return audioOptions;
- }
- if (videoNode.tagName === 'VIDEO') {
- return videoOptions;
- }
- return undefined;
-};
-
-const importAllPlugins = async () => Promise.all([importVideoPlugins(), importAudioPlugins()]);
-
-const importPlayerPlugins = async content => {
- if (hasVideosOnly(content)) {
- return importVideoPlugins();
- }
- if (hasAudiosOnly(content)) {
- return importAudioPlugins();
- }
-
- return importAllPlugins();
-};
-
-const getPlayerWithPlugins = async content => {
- const { videojs } = await importVideoJs();
- await importPlayerPlugins(content);
- return videojs;
-};
-
-const initAudio = player => {
- player.seekButtons({
- forward: 30,
- back: 10,
- });
-};
-
-// eslint-disable-next-line no-unused-vars
-const initVideo = player => {
- player.hlsQualitySelector();
-};
-
-const initPluginsForPlayer = player => {
- if (player.isAudio()) {
- initAudio(player);
- } else {
- initVideo(player);
- }
-};
-
-export const loadVideoJsApi = async content => {
- const playerLib = await getPlayerWithPlugins(content);
- return {
- playerLib,
- document: globals.window.document,
- init: initPluginsForPlayer,
- };
-};
diff --git a/sources-gen/video/audioPlugins.jsx b/sources-gen/video/audioPlugins.jsx
deleted file mode 100644
index 0ebf500..0000000
--- a/sources-gen/video/audioPlugins.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export const importAudioPlugins = async () =>
- Promise.all([
- import(/* webpackChunkName: 'playerPlugins-audio' */ 'videojs-seek-buttons'),
- import(
- /* webpackChunkName: 'playerPlugins-audio' */ 'videojs-seek-buttons/dist/videojs-seek-buttons.css'
- ),
- ]);
diff --git a/sources-gen/video/useVideoPlayerEffect.jsx b/sources-gen/video/useVideoPlayerEffect.jsx
deleted file mode 100644
index 5edc529..0000000
--- a/sources-gen/video/useVideoPlayerEffect.jsx
+++ /dev/null
@@ -1,46 +0,0 @@
-/* eslint-disable max-len */
-import { useEffect } from 'react';
-
-import { loadVideoJsApi, getOptions } from './api';
-import { isServer } from '../utils/ssr';
-
-const renderVideoJsPlayers = async ({ playerLib, document, init }) => {
- const { durationBarComponentName } = await import(
- /* webpackChunkName: 'player-custom' */ '../components/MediaInput/MediaInputVideo/CustomPlayerComponents/InfoBar/VjsDurationInfoBar'
- );
- // const { videoMediaTagComponentName } = await import(/* webpackChunkName: 'player-custom' */'./components/VjsMediaTag');
- const { videoPlayButtonComponentName } = await import(
- /* webpackChunkName: 'player-custom' */ '../components/MediaInput/MediaInputVideo/CustomPlayerComponents/PlayButton/VjsPlayButton'
- );
-
- const videoPlaceholderNodes = [...document.querySelectorAll('.video-js:not(.rendered)')];
- videoPlaceholderNodes.forEach(playerNode => {
- playerNode.classList.add('rendered');
- const player = playerLib(playerNode, getOptions(playerNode));
-
- player.addChild(durationBarComponentName);
- // player.addChild(videoMediaTagComponentName);
- player.addChild(videoPlayButtonComponentName);
- init(player);
- });
-};
-
-export const useVideoPlayerEffect = content => {
- useEffect(() => {
- let didCancel = false; // eslint-disable-line fp/no-let
-
- async function convertVideoJsNodes() {
- const loadedApi = await loadVideoJsApi(content);
- if (!didCancel) {
- await renderVideoJsPlayers(loadedApi);
- }
- }
-
- if (!isServer()) {
- convertVideoJsNodes();
- }
- return () => {
- didCancel = true; // eslint-disable-line fp/no-mutation
- };
- }, [content]);
-};
diff --git a/sources-gen/video/videoPlugins.jsx b/sources-gen/video/videoPlugins.jsx
deleted file mode 100644
index eb149e7..0000000
--- a/sources-gen/video/videoPlugins.jsx
+++ /dev/null
@@ -1,8 +0,0 @@
-export const importVideoPlugins = async () =>
- Promise.all([
- import(/* webpackChunkName: 'playerPlugins-video' */ 'videojs-contrib-quality-levels'),
- import(/* webpackChunkName: 'playerPlugins-video' */ 'videojs-hls-quality-selector'),
- import(
- /* webpackChunkName: 'playerPlugins-video' */ 'videojs-hls-quality-selector/dist/videojs-hls-quality-selector.css'
- ),
- ]);
diff --git a/sources-gen/video/videoTypeMatcher.jsx b/sources-gen/video/videoTypeMatcher.jsx
deleted file mode 100644
index b0d410e..0000000
--- a/sources-gen/video/videoTypeMatcher.jsx
+++ /dev/null
@@ -1,14 +0,0 @@
-const hasVideoPlaceholdersInRichText = ({ text = '' }) =>
- /]*video-js vjs-fluid[^>]*>/g.test(text);
-const hasAudioPlaceholdersInRichText = ({ text = '' }) =>
- /]*video-js vjs-fluid[^>]*>/g.test(text);
-
-const hasVideoPlayer = ({ __typename, text = '' }) =>
- __typename === 'Video' || hasVideoPlaceholdersInRichText({ text });
-const hasAudioPlayer = ({ __typename, text = '' }) =>
- __typename === 'Audio' || hasAudioPlaceholdersInRichText({ text });
-
-export const hasVideosOnly = content => hasVideoPlayer(content) && !hasAudioPlayer(content);
-export const hasAudiosOnly = content => hasAudioPlayer(content) && !hasVideoPlayer(content);
-
-export const hasPlayer = content => hasVideoPlayer(content) || hasAudioPlayer(content);
diff --git a/sources-gen/video/videojs.jsx b/sources-gen/video/videojs.jsx
deleted file mode 100644
index 8e8c7de..0000000
--- a/sources-gen/video/videojs.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export const importVideoJs = async () => {
- const [videojsModule] = await Promise.all([
- import('video.js'),
- import('video.js/dist/video-js.min.css'),
- ]);
- return { videojs: videojsModule.default };
-};
diff --git a/sources-gen/vite.config.js b/sources-gen/vite.config.js
deleted file mode 100644
index eec881f..0000000
--- a/sources-gen/vite.config.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import { defineConfig } from 'vite'
-import react from '@vitejs/plugin-react'
-
-// https://vitejs.dev/config/
-export default defineConfig({
- plugins: [react()],
- build: {
- sourcemap: true,
- commonjsOptions: {
- // https://github.com/rollup/plugins/tree/master/packages/commonjs
- transformMixedEsModules: true,
- }
- }
-})
diff --git a/sources-gen/webpack:/src/components/Lesson/LessonExercise/Keyboard/index.css b/sources-gen/webpack:/src/components/Lesson/LessonExercise/Keyboard/index.css
deleted file mode 100644
index 54ccd8b..0000000
--- a/sources-gen/webpack:/src/components/Lesson/LessonExercise/Keyboard/index.css
+++ /dev/null
@@ -1,22 +0,0 @@
-/*!
- *
- * react-simple-keyboard v3.2.65
- * https://github.com/hodgef/react-simple-keyboard
- *
- * Copyright (c) Francisco Hodge (https://github.com/hodgef) and project contributors.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- *
- */
-/*!
- *
- * simple-keyboard v3.2.44
- * https://github.com/hodgef/simple-keyboard
- *
- * Copyright (c) Francisco Hodge (https://github.com/hodgef) and project contributors.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- *
- */.hg-theme-default{background-color:#ececec;border-radius:5px;box-sizing:border-box;font-family:HelveticaNeue-Light,Helvetica Neue Light,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;overflow:hidden;padding:5px;touch-action:manipulation;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.hg-theme-default .hg-button span{pointer-events:none}.hg-theme-default button.hg-button{border-width:0;font-size:inherit;outline:0}.hg-theme-default .hg-button{display:inline-block;flex-grow:1}.hg-theme-default .hg-row{display:flex}.hg-theme-default .hg-row:not(:last-child){margin-bottom:5px}.hg-theme-default .hg-row .hg-button:not(:last-child){margin-right:5px}.hg-theme-default .hg-row .hg-button-container{margin-right:5px}.hg-theme-default .hg-row>div:last-child{margin-right:0}.hg-theme-default .hg-row .hg-button-container{display:flex}.hg-theme-default .hg-button{-webkit-tap-highlight-color:rgba(0,0,0,0);align-items:center;background:#fff;border-bottom:1px solid #b5b5b5;border-radius:5px;box-shadow:0 0 3px -1px rgba(0,0,0,.3);box-sizing:border-box;cursor:pointer;display:flex;height:40px;justify-content:center;padding:5px}.hg-theme-default .hg-button.hg-standardBtn{width:20px}.hg-theme-default .hg-button.hg-activeButton{background:#efefef}.hg-theme-default.hg-layout-numeric .hg-button{align-items:center;display:flex;height:60px;justify-content:center;width:33.3%}.hg-theme-default .hg-button.hg-button-numpadadd,.hg-theme-default .hg-button.hg-button-numpadenter{height:85px}.hg-theme-default .hg-button.hg-button-numpad0{width:105px}.hg-theme-default .hg-button.hg-button-com{max-width:85px}.hg-theme-default .hg-button.hg-standardBtn.hg-button-at{max-width:45px}.hg-theme-default .hg-button.hg-selectedButton{background:rgba(5,25,70,.53);color:#fff}.hg-theme-default .hg-button.hg-standardBtn[data-skbtn=".com"]{max-width:82px}.hg-theme-default .hg-button.hg-standardBtn[data-skbtn="@"]{max-width:60px}.hg-candidate-box{background:#ececec;border-bottom:2px solid #b5b5b5;border-radius:5px;display:inline-flex;margin-top:-10px;max-width:272px;position:absolute;transform:translateY(-100%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}ul.hg-candidate-box-list{display:flex;flex:1;list-style:none;margin:0;padding:0}li.hg-candidate-box-list-item{align-items:center;display:flex;height:40px;justify-content:center;width:40px}li.hg-candidate-box-list-item:hover{background:rgba(0,0,0,.03);cursor:pointer}li.hg-candidate-box-list-item:active{background:rgba(0,0,0,.1)}.hg-candidate-box-prev:before{content:"◄"}.hg-candidate-box-next:before{content:"►"}.hg-candidate-box-next,.hg-candidate-box-prev{align-items:center;background:#d0d0d0;color:#969696;cursor:pointer;display:flex;padding:0 10px}.hg-candidate-box-next{border-bottom-right-radius:5px;border-top-right-radius:5px}.hg-candidate-box-prev{border-bottom-left-radius:5px;border-top-left-radius:5px}.hg-candidate-box-btn-active{color:#444}
diff --git a/static/assets/audio/signal_sound_failure.mp3 b/static/assets/audio/signal_sound_failure.mp3
new file mode 100644
index 0000000..c1d47db
Binary files /dev/null and b/static/assets/audio/signal_sound_failure.mp3 differ
diff --git a/static/assets/audio/signal_sound_success.mp3 b/static/assets/audio/signal_sound_success.mp3
new file mode 100644
index 0000000..71e7f18
Binary files /dev/null and b/static/assets/audio/signal_sound_success.mp3 differ
diff --git a/sources-gen/assets/css/basestyles.css b/static/assets/css/basestyles.css
similarity index 100%
rename from sources-gen/assets/css/basestyles.css
rename to static/assets/css/basestyles.css
diff --git a/sources-gen/assets/css/customBaku.css b/static/assets/css/customBaku.css
similarity index 100%
rename from sources-gen/assets/css/customBaku.css
rename to static/assets/css/customBaku.css
diff --git a/sources-gen/assets/css/stylesheets.css b/static/assets/css/stylesheets.css
similarity index 100%
rename from sources-gen/assets/css/stylesheets.css
rename to static/assets/css/stylesheets.css
diff --git a/static/assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff b/static/assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff
new file mode 100644
index 0000000..748add2
Binary files /dev/null and b/static/assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff differ
diff --git a/static/assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff2 b/static/assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff2
new file mode 100644
index 0000000..8a9cf54
Binary files /dev/null and b/static/assets/fonts/dw-theAntiquaB-W5Plain-web/dwtheantiquab-w5plain.woff2 differ
diff --git a/static/assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff b/static/assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff
new file mode 100644
index 0000000..37ef3f9
Binary files /dev/null and b/static/assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff differ
diff --git a/static/assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff2 b/static/assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff2
new file mode 100644
index 0000000..a521f81
Binary files /dev/null and b/static/assets/fonts/dw-theAntiquaB-W5PlainItalic-web/DWTheAntiquaB-W5PlainItalic.woff2 differ
diff --git a/static/assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff b/static/assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff
new file mode 100644
index 0000000..870f732
Binary files /dev/null and b/static/assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff differ
diff --git a/static/assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff2 b/static/assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff2
new file mode 100644
index 0000000..226377f
Binary files /dev/null and b/static/assets/fonts/dw-theAntiquaB-W7Bold-web/DWTheAntiquaB-W7Bold.woff2 differ
diff --git a/static/assets/images/bg-dw-desktop.jpg b/static/assets/images/bg-dw-desktop.jpg
new file mode 100644
index 0000000..8ac234f
Binary files /dev/null and b/static/assets/images/bg-dw-desktop.jpg differ
diff --git a/static/assets/images/landing/course_landing-1200x675.jpg b/static/assets/images/landing/course_landing-1200x675.jpg
new file mode 100644
index 0000000..48b09cc
--- /dev/null
+++ b/static/assets/images/landing/course_landing-1200x675.jpg
@@ -0,0 +1,117 @@
+
+
+ You need to enable JavaScript to run this app.
+
\ No newline at end of file
diff --git a/static/assets/images/landing/course_landing-480x270.jpg b/static/assets/images/landing/course_landing-480x270.jpg
new file mode 100644
index 0000000..a920474
--- /dev/null
+++ b/static/assets/images/landing/course_landing-480x270.jpg
@@ -0,0 +1,117 @@
+
+
+ You need to enable JavaScript to run this app.
+
\ No newline at end of file
diff --git a/static/assets/images/landing/course_landing-768x432.jpg b/static/assets/images/landing/course_landing-768x432.jpg
new file mode 100644
index 0000000..33b4ce0
--- /dev/null
+++ b/static/assets/images/landing/course_landing-768x432.jpg
@@ -0,0 +1,117 @@
+
+
+ You need to enable JavaScript to run this app.
+
\ No newline at end of file
diff --git a/static/assets/images/landing/course_landing-992x558.jpg b/static/assets/images/landing/course_landing-992x558.jpg
new file mode 100644
index 0000000..95374c0
--- /dev/null
+++ b/static/assets/images/landing/course_landing-992x558.jpg
@@ -0,0 +1,117 @@
+
+
+ You need to enable JavaScript to run this app.
+
\ No newline at end of file
diff --git a/static/favicon.png b/static/favicon.png
new file mode 100644
index 0000000..5652877
Binary files /dev/null and b/static/favicon.png differ
diff --git a/sources-gen/index.html b/static/index.html
similarity index 94%
rename from sources-gen/index.html
rename to static/index.html
index 2862da8..b6d12a4 100644
--- a/sources-gen/index.html
+++ b/static/index.html
@@ -1,16 +1,20 @@
+
+
+
+
-
+
Free German Courses Level A1 to B1 | DW Learn German
@@ -21,5 +25,7 @@
+
+
diff --git a/static/logo192.png b/static/logo192.png
new file mode 100644
index 0000000..fc44b0a
Binary files /dev/null and b/static/logo192.png differ
diff --git a/static/vite.config.js b/static/vite.config.js
new file mode 100644
index 0000000..fbc1cb0
--- /dev/null
+++ b/static/vite.config.js
@@ -0,0 +1,22 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()],
+ build: {
+ sourcemap: true,
+ commonjsOptions: {
+ // https://github.com/rollup/plugins/tree/master/packages/commonjs
+ transformMixedEsModules: true
+ }
+ },
+ server: {
+ proxy: {
+ '^(\/graphql|\/auth\/login|\/profiles)': {
+ target: 'https://learngerman.dw.com',
+ changeOrigin: true,
+ }
+ },
+ },
+})