diff --git a/.gitignore b/.gitignore index afbda82b..e0984952 100644 --- a/.gitignore +++ b/.gitignore @@ -3,10 +3,6 @@ node_modules package-lock.json # yarn.lock -build -dist -es -lib temp diff --git a/.travis.yml b/.travis.yml index be3721f6..4b51e6a4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,5 +11,9 @@ install: - yarn script: + - cd packages/rrweb-snapshot + - yarn bundle + - yarn test + - cd ../rrweb - yarn check-types - - xvfb-run --server-args="-screen 0 1920x1080x24" yarn test + - xvfb-run --server-args="-screen 0 1920x1080x24" yarn test \ No newline at end of file diff --git a/package.json b/package.json index 9b4cc861..3082e1b1 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,5 @@ { - "name": "rrweb", - "version": "1.0.2", "description": "record and replay the web", - "scripts": { - "prepare": "npm run prepack", - "prepack": "npm run bundle", - "test": "npm run bundle:browser && cross-env TS_NODE_CACHE=false TS_NODE_FILES=true mocha -r ts-node/register -r ignore-styles -r jsdom-global/register test/**.test.ts", - "test:headless": "npm run bundle:browser && cross-env TS_NODE_CACHE=false TS_NODE_FILES=true PUPPETEER_HEADLESS=true mocha -r ts-node/register -r ignore-styles -r jsdom-global/register test/**.test.ts", - "test:watch": "PUPPETEER_HEADLESS=true npm run test -- --watch --watch-extensions js,ts", - "repl": "npm run bundle:browser && cross-env TS_NODE_CACHE=false TS_NODE_FILES=true ts-node scripts/repl.ts", - "bundle:browser": "cross-env BROWSER_ONLY=true rollup --config", - "bundle": "rollup --config", - "typings": "tsc -d --declarationDir typings", - "check-types": "tsc -noEmit" - }, "repository": { "type": "git", "url": "git+ssh://git@github.com/rrweb-io/rrweb.git" @@ -21,59 +7,16 @@ "keywords": [ "rrweb" ], - "main": "lib/rrweb-all.js", - "module": "es/rrweb/src/entries/all.js", - "unpkg": "dist/rrweb.js", - "sideEffects": false, - "typings": "typings/entries/all.d.ts", - "files": [ - "dist", - "lib", - "es", - "typings" - ], "author": "yanzhen@smartx.com", "license": "MIT", "bugs": { "url": "https://github.com/rrweb-io/rrweb/issues" }, + "private": true, "homepage": "https://github.com/rrweb-io/rrweb#readme", - "devDependencies": { - "@types/chai": "^4.1.6", - "@types/inquirer": "0.0.43", - "@types/jsdom": "^16.2.12", - "@types/mocha": "^5.2.5", - "@types/node": "^12.20.16", - "@types/prettier": "^2.3.2", - "@types/puppeteer": "^5.4.3", - "chai": "^4.2.0", - "cross-env": "^5.2.0", - "fast-mhtml": "^1.1.9", - "ignore-styles": "^5.0.1", - "inquirer": "^6.2.1", - "jest-snapshot": "^23.6.0", - "jsdom": "^16.6.0", - "jsdom-global": "^3.0.2", - "mocha": "^5.2.0", - "prettier": "2.2.1", - "puppeteer": "^9.1.1", - "rollup": "^2.3.3", - "rollup-plugin-commonjs": "^9.2.0", - "rollup-plugin-node-resolve": "^3.4.0", - "rollup-plugin-postcss": "^3.1.1", - "rollup-plugin-rename-node-modules": "^1.1.0", - "rollup-plugin-terser": "^5.3.0", - "rollup-plugin-typescript": "^1.0.0", - "ts-node": "^7.0.1", - "tslib": "^1.9.3", - "tslint": "^4.5.1", - "typescript": "^3.9.5" - }, - "dependencies": { - "@types/css-font-loading-module": "0.0.4", - "@xstate/fsm": "^1.4.0", - "fflate": "^0.4.4", - "mitt": "^1.1.3", - "rrweb-snapshot": "^1.1.7" - } + "workspaces": [ + "packages/rrweb", + "packages/rrweb-snapshot", + "packages/rrweb-player" + ] } diff --git a/packages/rrweb-player/.eslintrc.json b/packages/rrweb-player/.eslintrc.json new file mode 100644 index 00000000..f9317620 --- /dev/null +++ b/packages/rrweb-player/.eslintrc.json @@ -0,0 +1,25 @@ +{ + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2019, + "sourceType": "module" + }, + "rules": { + "require-jsdoc": "off", + "arrow-parens": "off", + "object-curly-spacing": "off", + "indent": "off" + }, + "env": { + "es6": true, + "browser": true + }, + "plugins": ["svelte3", "@typescript-eslint"], + "overrides": [ + { + "files": ["*.svelte"], + "processor": "svelte3/svelte3" + } + ] +} diff --git a/packages/rrweb-player/.gitignore b/packages/rrweb-player/.gitignore new file mode 100644 index 00000000..b70d023a --- /dev/null +++ b/packages/rrweb-player/.gitignore @@ -0,0 +1,14 @@ +.DS_Store +node_modules +public/bundle.* +public/build +package-lock.json +yarn.lock + +.vscode +temp + +dist +lib + +*.log \ No newline at end of file diff --git a/packages/rrweb-player/.release-it.json b/packages/rrweb-player/.release-it.json new file mode 100644 index 00000000..65a2f9aa --- /dev/null +++ b/packages/rrweb-player/.release-it.json @@ -0,0 +1,5 @@ +{ + "non-interactive": false, + "buildCommand": "npm run build", + "requireCleanWorkingDir": false +} diff --git a/packages/rrweb-player/README.md b/packages/rrweb-player/README.md new file mode 100644 index 00000000..9539d354 --- /dev/null +++ b/packages/rrweb-player/README.md @@ -0,0 +1,72 @@ +*Psst — looking for a shareable component template? Go here --> [sveltejs/component-template](https://github.com/sveltejs/component-template)* + +*Looking for a Vue.js version? Go here --> [@preflight-hq/rrweb-player-vue](https://github.com/Preflight-HQ/rrweb-player-vue)* + +--- + +# svelte app + +This is a project template for [Svelte](https://svelte.technology) apps. It lives at https://github.com/sveltejs/template. + +To create a new project based on this template using [degit](https://github.com/Rich-Harris/degit): + +```bash +npm install -g degit # you only need to do this once + +degit sveltejs/template svelte-app +cd svelte-app +``` + +*Note that you will need to have [Node.js](https://nodejs.org) installed.* + + +## Get started + +Install the dependencies... + +```bash +cd svelte-app +npm install +``` + +...then start [Rollup](https://rollupjs.org): + +```bash +npm run dev +``` + +Navigate to [localhost:5000](http://localhost:5000). You should see your app running. Edit a component file in `src`, save it, and reload the page to see your changes. + + +## Deploying to the web + +### With [now](https://zeit.co/now) + +Install `now` if you haven't already: + +```bash +npm install -g now +``` + +Then, from within your project folder: + +```bash +now +``` + +As an alternative, use the [Now desktop client](https://zeit.co/download) and simply drag the unzipped project folder to the taskbar icon. + +### With [surge](https://surge.sh/) + +Install `surge` if you haven't already: + +```bash +npm install -g surge +``` + +Then, from within your project folder: + +```bash +npm run build +surge public +``` diff --git a/packages/rrweb-player/package.json b/packages/rrweb-player/package.json new file mode 100644 index 00000000..eba1f8d3 --- /dev/null +++ b/packages/rrweb-player/package.json @@ -0,0 +1,60 @@ +{ + "name": "rrweb-player", + "version": "0.7.4", + "devDependencies": { + "@rollup/plugin-commonjs": "^11.0.0", + "@rollup/plugin-node-resolve": "^7.0.0", + "@rollup/plugin-typescript": "^4.0.0", + "@typescript-eslint/eslint-plugin": "^3.7.0", + "@typescript-eslint/parser": "^3.7.0", + "eslint": "^7.5.0", + "eslint-config-google": "^0.11.0", + "eslint-plugin-svelte3": "^2.7.3", + "postcss-easy-import": "^3.0.0", + "rollup": "^2.45.2", + "rollup-plugin-css-only": "^3.1.0", + "rollup-plugin-livereload": "^2.0.0", + "rollup-plugin-svelte": "^7.1.0", + "rollup-plugin-terser": "^7.0.2", + "sirv-cli": "^0.4.4", + "svelte": "^3.2.0", + "svelte-check": "^1.4.0", + "svelte-preprocess": "^4.0.0", + "tslib": "^2.0.0", + "typescript": "^3.9.7" + }, + "dependencies": { + "@tsconfig/svelte": "^1.0.0", + "rrweb": "^1.0.2" + }, + "scripts": { + "build": "rollup -c", + "dev": "rollup -c -w", + "prepublishOnly": "yarn build", + "start": "sirv public", + "validate": "svelte-check" + }, + "description": "rrweb's replayer UI", + "main": "lib/index.js", + "module": "dist/index.mjs", + "unpkg": "dist/index.js", + "files": [ + "lib", + "dist", + "typings" + ], + "typings": "typings/index.d.ts", + "repository": { + "type": "git", + "url": "git+https://github.com/rrweb-io/rrweb.git" + }, + "keywords": [ + "rrweb" + ], + "author": "yanzhen@smartx.com", + "license": "MIT", + "bugs": { + "url": "https://github.com/rrweb-io/rrweb/issues" + }, + "homepage": "https://github.com/rrweb-io/rrweb#readme" +} diff --git a/packages/rrweb-player/public/events.js b/packages/rrweb-player/public/events.js new file mode 100644 index 00000000..9f82de94 --- /dev/null +++ b/packages/rrweb-player/public/events.js @@ -0,0 +1,3 @@ +/* eslint-disable */ +// prettier-ignore +const events = [{"type":4,"data":{"href":"https://demoit.app/e/react#ReactHooks.js","width":1166,"height":705},"timestamp":1544756766750,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":2,"data":{"node":{"type":0,"childNodes":[{"type":1,"name":"html","publicId":"","systemId":"","id":2},{"type":2,"tagName":"html","attributes":{"lang":"en","class":"gr__demoit_app"},"childNodes":[{"type":2,"tagName":"head","attributes":{},"childNodes":[{"type":3,"textContent":"\n ","id":5},{"type":2,"tagName":"meta","attributes":{"charset":"UTF-8"},"childNodes":[],"id":6},{"type":3,"textContent":"\n ","id":7},{"type":2,"tagName":"title","attributes":{},"childNodes":[{"type":3,"textContent":"demoit","id":9}],"id":8},{"type":3,"textContent":"\n ","id":10},{"type":2,"tagName":"link","attributes":{"_cssText":"@font-face { font-family: \"Fira Mono\"; font-style: normal; font-weight: 400; src: local(\"Fira Mono Regular\"), local(\"FiraMono-Regular\"), url('https://demoit.app/static/demoit/font/FiraMono.woff2') format(\"woff2\"); unicode-range: U+460-52F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }.CodeMirror { font-family: \"PT Mono\", monospace; height: 300px; color: black; direction: ltr; }.CodeMirror-lines { padding: 4px 0px; }.CodeMirror pre { padding: 0px 4px; }.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { background-color: white; }.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background-color: rgb(247, 247, 247); white-space: nowrap; }.CodeMirror-linenumber { padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; color: rgb(153, 153, 153); white-space: nowrap; }.CodeMirror-guttermarker { color: black; }.CodeMirror-guttermarker-subtle { color: rgb(153, 153, 153); }.CodeMirror-cursor { border-left: 1px solid black; border-right: 0px; width: 0px; }.CodeMirror div.CodeMirror-secondarycursor { border-left: 1px solid silver; }.cm-fat-cursor .CodeMirror-cursor { width: auto; background: rgb(119, 238, 119); border: 0px !important; }.cm-fat-cursor div.CodeMirror-cursors { z-index: 1; }.cm-fat-cursor-mark { background-color: rgba(20, 255, 20, 0.5); animation: blink 1.06s steps(1, end) 0s infinite normal none running; }.cm-animate-fat-cursor { width: auto; border: 0px; animation: blink 1.06s steps(1, end) 0s infinite normal none running; background-color: rgb(119, 238, 119); }@-webkit-keyframes blink { \n 50% { background-color: transparent; }\n}@keyframes blink { \n 50% { background-color: transparent; }\n}.cm-tab { display: inline-block; text-decoration: inherit; }.CodeMirror-rulers { position: absolute; left: 0px; right: 0px; top: -50px; bottom: -20px; overflow: hidden; }.CodeMirror-ruler { border-left: 1px solid rgb(204, 204, 204); top: 0px; bottom: 0px; position: absolute; }.cm-s-default .cm-header { color: blue; }.cm-s-default .cm-quote { color: rgb(0, 153, 0); }.cm-negative { color: rgb(221, 68, 68); }.cm-positive { color: rgb(34, 153, 34); }.cm-header, .cm-strong { font-weight: bold; }.cm-em { font-style: italic; }.cm-link { text-decoration: underline; }.cm-strikethrough { text-decoration: line-through; }.cm-s-default .cm-keyword { color: rgb(119, 0, 136); }.cm-s-default .cm-atom { color: rgb(34, 17, 153); }.cm-s-default .cm-number { color: rgb(17, 102, 68); }.cm-s-default .cm-def { color: rgb(0, 0, 255); }.cm-s-default .cm-variable-2 { color: rgb(0, 85, 170); }.cm-s-default .cm-variable-3, .cm-s-default .cm-type { color: rgb(0, 136, 85); }.cm-s-default .cm-comment { color: rgb(170, 85, 0); }.cm-s-default .cm-string { color: rgb(170, 17, 17); }.cm-s-default .cm-string-2 { color: rgb(255, 85, 0); }.cm-s-default .cm-meta { color: rgb(85, 85, 85); }.cm-s-default .cm-qualifier { color: rgb(85, 85, 85); }.cm-s-default .cm-builtin { color: rgb(51, 0, 170); }.cm-s-default .cm-bracket { color: rgb(153, 153, 119); }.cm-s-default .cm-tag { color: rgb(17, 119, 0); }.cm-s-default .cm-attribute { color: rgb(0, 0, 204); }.cm-s-default .cm-hr { color: rgb(153, 153, 153); }.cm-s-default .cm-link { color: rgb(0, 0, 204); }.cm-s-default .cm-error { color: red; }.cm-invalidchar { color: red; }.CodeMirror-composing { border-bottom: 2px solid; }div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 187, 0); }div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(170, 34, 34); }.CodeMirror-matchingtag { background: rgba(255, 150, 0, 0.3); }.CodeMirror-activeline-background { background: rgb(232, 242, 255); }.CodeMirror { position: relative; overflow: hidden; background: white; }.CodeMirror-scroll { margin-bottom: -30px; margin-right: -30px; padding-bottom: 30px; height: 100%; outline: 0px; position: relative; overflow: scroll !important; }.CodeMirror-sizer { position: relative; border-right: 30px solid transparent; }.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { position: absolute; z-index: 6; display: none; }.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden scroll; }.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: scroll hidden; }.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; min-height: 100%; z-index: 3; }.CodeMirror-gutter { white-space: normal; height: 100%; display: inline-block; vertical-align: top; margin-bottom: -30px; }.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: none !important; border: none !important; }.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }.CodeMirror-gutter-wrapper ::selection { background-color: transparent; }.CodeMirror-lines { cursor: text; min-height: 1px; }.CodeMirror pre { border-radius: 0px; border-width: 0px; background: transparent; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; line-height: inherit; color: inherit; z-index: 2; position: relative; overflow: visible; -webkit-tap-highlight-color: transparent; font-variant-ligatures: contextual; }.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }.CodeMirror-linebackground { position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; z-index: 0; }.CodeMirror-linewidget { position: relative; z-index: 2; padding: 0.1px; }.CodeMirror-rtl pre { direction: rtl; }.CodeMirror-code { outline: 0px; }.CodeMirror-scroll, .CodeMirror-sizer, .CodeMirror-gutter, .CodeMirror-gutters, .CodeMirror-linenumber { box-sizing: content-box; }.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }.CodeMirror-cursor { position: absolute; pointer-events: none; }.CodeMirror-measure pre { position: static; }div.CodeMirror-cursors { visibility: hidden; position: relative; z-index: 3; }div.CodeMirror-dragcursors { visibility: visible; }.CodeMirror-focused div.CodeMirror-cursors { visibility: visible; }.CodeMirror-selected { background: rgb(217, 217, 217); }.CodeMirror-focused .CodeMirror-selected { background: rgb(215, 212, 240); }.CodeMirror-crosshair { cursor: crosshair; }.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: rgb(215, 212, 240); }.cm-searching { background-color: rgba(255, 255, 0, 0.4); }.cm-force-border { padding-right: 0.1px; }@media print {\n .CodeMirror div.CodeMirror-cursors { visibility: hidden; }\n}.cm-tab-wrap-hack::after { content: \"\"; }span.CodeMirror-selectedtext { background: 0px center; }html { box-sizing: border-box; width: 100%; height: 100%; }*, ::before, ::after { box-sizing: inherit; }body { margin: 0px; padding: 0px; width: 100%; height: 100%; font-family: \"Fira Mono\", monospace; font-size: 14px; line-height: 14px; background: rgb(255, 255, 255); color: rgb(0, 0, 0); }.right { float: right; }svg { fill: currentcolor; }.centered { height: 100%; display: flex; align-items: center; justify-content: center; }.mt1 { margin-top: 1em !important; }.app { position: fixed; top: 0px; left: 0px; width: 100%; height: 100%; z-index: 8000; }.app.dark { background: rgb(32, 48, 58); color: rgb(254, 254, 254); }.app .layout { height: calc(100% - 8px); transition: height 200ms ease-out 0s; }.gutter.gutter-horizontal { cursor: ew-resize; float: left; height: 100%; background: rgb(234, 234, 234); }.gutter.gutter-vertical { cursor: ns-resize; width: 100%; background: rgb(234, 234, 234); }.dark .gutter.gutter-horizontal, .dark .gutter.gutter-vertical { background: rgb(46, 65, 76); }.editor-section { vertical-align: top; height: 100%; }.CodeMirror { height: 100%; transition: opacity 300ms ease 0s; opacity: 1; }.CodeMirror-lines { padding: 1em; }.CodeMirror-selected { background-color: rgb(255, 255, 255) !important; }.output { padding: 1em; position: relative; overflow: auto; }.console { position: relative; overflow: auto; }.console p { margin: 0px; padding: 0.5em; white-space: pre-wrap; }.js-code-editor { height: 100%; width: 100%; overflow: auto; line-height: 1.3em; float: left; z-index: 90; }.status-bar { width: 100%; height: 8px; background: rgb(204, 204, 204); cursor: pointer; transition: height 200ms ease-out 0s; overflow: hidden; }.dark .status-bar { background: rgb(0, 0, 0); }.status-bar > div { display: none; }.status-bar a { display: inline-block; color: rgb(0, 0, 0); text-decoration: none; padding: 8px; cursor: pointer; }.dark .status-bar a { color: rgb(165, 165, 165); }.status-bar a:hover { color: rgb(76, 0, 0); }.dark .status-bar a:hover { color: rgb(123, 109, 109); }.status-bar a.active { font-weight: bold; }.status-bar a svg { transform: translateY(3px); }.popup { position: fixed; top: 0px; left: 0px; width: 100%; height: 100%; z-index: 8100; color: rgb(255, 255, 255); background: rgba(0, 0, 0, 0.8); transition: opacity 200ms ease 0s, width 200ms ease-out 0s; opacity: 0; }.popup section { position: absolute; min-width: 600px; max-width: 90%; max-height: 90%; overflow-y: auto; padding: 1em; background: rgb(46, 46, 46); border-radius: 0.2em; box-shadow: rgb(0, 0, 0) 0px 0px 5px 3px; top: 50%; left: 50%; transform: translate(-50%, -50%); }.popup section.multiple-pages { padding: 0px; }.popup .close { background: 0px center; color: rgb(255, 255, 255); border: 0px; position: absolute; top: 0.4em; right: 0.5em; cursor: pointer; outline: 0px; }.popup .close:hover { color: rgb(153, 153, 153); background: 0px center; }.popup .multiple-pages .close { top: 4px; right: 0px; }.popup p { margin: 0px 0px 1em; padding: 0px; line-height: 1.2em; }.popup h1 { padding: 0px; margin: 1em 0px; }.popup h2 { padding: 0px; margin: 0px 0px 1em; }.popup button { padding: 0.6em 1em; background: 0px center; cursor: pointer; border-radius: 4px; border: 2px solid rgb(82, 82, 82); color: rgb(255, 255, 255); outline: 0px; display: inline-block; text-transform: uppercase; font-weight: bold; }.popup button:hover { background: rgb(49, 49, 49); }.popup .right { float: right; }.popup .secondary span { display: inline-block; transform: translateY(-5px); margin-left: 7px; }.popup hr { margin: 1em 0px; border-color: rgb(49, 49, 49); }.popup input, .popup textarea { width: 100%; border: 1px solid rgb(82, 82, 82); padding: 0.6em; display: block; border-radius: 4px; outline: 0px; margin-bottom: 1em; }.popup textarea { height: 162px; }.popup a { color: inherit; }.popup a:hover { text-decoration: none; }.popup .sub-nav { list-style: none; margin: 0px; padding: 0px; background: rgb(64, 64, 64); }.popup .sub-nav li { display: inline-block; margin: 0px; padding: 0px; background: rgb(64, 64, 64); }.popup .sub-nav li a { display: block; text-decoration: none; padding: 1em; text-transform: uppercase; border-right: 1px solid rgb(14, 14, 14); }.popup .sub-nav li a:hover { color: rgb(153, 153, 153); }.popup .sub-nav li.active { background: rgb(46, 46, 46); }.popup .content { padding: 1em; }@keyframes bubble { \n 0% { transform: scale(0.5); }\n 50% { transform: scale(1.2); }\n 100% { transform: scale(0.5); }\n}.spinner { width: 20px; height: 20px; background: rgb(0, 0, 0); border-radius: 10px; animation: bubble 1s ease 0s infinite normal none running; }.cm-s-light.CodeMirror { background: rgb(255, 255, 255); color: rgb(36, 41, 46); }.cm-s-light .CodeMirror-gutters { background: rgb(255, 255, 255); border-right-width: 0px; }.cm-s-light .CodeMirror-guttermarker { color: white; }.cm-s-light .CodeMirror-guttermarker-subtle { color: rgb(208, 208, 208); }.cm-s-light .CodeMirror-linenumber { color: rgb(149, 157, 165); padding: 0px 16px; }.cm-s-light .CodeMirror-cursor { border-left: 1px solid rgb(36, 41, 46); }.cm-s-light .CodeMirror-activeline-background { background: rgb(250, 251, 252); }.cm-s-light .CodeMirror-matchingbracket { text-decoration: underline; color: rgb(36, 41, 46) !important; }.cm-s-light .CodeMirror-lines { font-family: inherit; font-size: inherit; background: rgb(255, 255, 255); line-height: 1.5; }.cm-s-light .cm-comment { color: rgb(106, 115, 125); }.cm-s-light .cm-constant { color: rgb(0, 92, 197); }.cm-s-light .cm-entity { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(111, 66, 193); }.cm-s-light .cm-keyword { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(215, 58, 73); }.cm-s-light .cm-storage { color: rgb(215, 58, 73); }.cm-s-light .cm-string { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(3, 148, 30); }.cm-s-light .cm-support { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(0, 92, 197); }.cm-s-light .cm-variable { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(227, 98, 9); }.cm-s-light .cm-tag { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(13, 110, 171); }.cm-s-light .cm-string-2 { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(3, 148, 30); }.CodeMirror-selectedtext { color: rgb(0, 0, 0) !important; background: rgb(209, 216, 224) !important; }.cm-s-dark.CodeMirror { background: rgb(32, 48, 58); color: rgb(243, 243, 243); }.cm-s-dark .CodeMirror-gutters { background: rgb(32, 48, 58); border-right-width: 0px; }.cm-s-dark .CodeMirror-guttermarker { color: black; }.cm-s-dark .CodeMirror-guttermarker-subtle { color: rgb(208, 208, 208); }.cm-s-dark .CodeMirror-linenumber { color: rgb(149, 157, 165); padding: 0px 16px; }.cm-s-dark .CodeMirror-cursor { border-left: 1px solid rgb(243, 243, 243); }.cm-s-dark .CodeMirror-activeline-background { background: rgb(58, 58, 58); }.cm-s-dark .CodeMirror-matchingbracket { text-decoration: underline; color: rgb(255, 255, 255) !important; }.cm-s-dark .CodeMirror-lines { font-family: inherit; font-size: inherit; background: rgb(32, 48, 58); line-height: 1.5; }.cm-s-dark .cm-comment { color: rgb(106, 115, 125); }.cm-s-dark .cm-constant { color: rgb(0, 92, 197); }.cm-s-dark .cm-entity { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(111, 66, 193); }.cm-s-dark .cm-keyword { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(178, 194, 226); }.cm-s-dark .cm-storage { color: rgb(178, 194, 226); }.cm-s-dark .cm-string { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(142, 175, 134); }.cm-s-dark .cm-support { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(0, 92, 197); }.cm-s-dark .cm-variable { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(222, 183, 156); }.cm-s-dark .cm-def { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(222, 183, 156); }.cm-s-dark .cm-tag { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(175, 191, 230); }.cm-s-dark .cm-string-2 { font-weight: normal; font-style: normal; text-decoration: none; color: rgb(142, 175, 134); }.CodeMirror-selectedtext { color: rgb(0, 0, 0) !important; background: rgb(209, 216, 224) !important; }"},"childNodes":[],"id":11},{"type":3,"textContent":"\n ","id":12},{"type":2,"tagName":"link","attributes":{"rel":"shortcut icon","type":"image/png","href":"https://demoit.app/e/img/demoit_64x64.png"},"childNodes":[],"id":13},{"type":3,"textContent":"\n ","id":14},{"type":2,"tagName":"meta","attributes":{"name":"viewport","content":"user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0"},"childNodes":[],"id":15},{"type":3,"textContent":"\n","id":16}],"id":4},{"type":3,"textContent":"\n","id":17},{"type":2,"tagName":"body","attributes":{"data-gr-c-s-loaded":"true"},"childNodes":[{"type":3,"textContent":"\n ","id":19},{"type":2,"tagName":"script","attributes":{"type":"text/template","id":"template-output"},"childNodes":[{"type":3,"textContent":"SCRIPT_PLACEHOLDER","id":21}],"id":20},{"type":3,"textContent":"\n\n ","id":22},{"type":2,"tagName":"script","attributes":{"type":"text/template","id":"template-console"},"childNodes":[{"type":3,"textContent":"SCRIPT_PLACEHOLDER","id":24}],"id":23},{"type":3,"textContent":"\n\n ","id":25},{"type":2,"tagName":"script","attributes":{"type":"text/template","id":"template-editor"},"childNodes":[{"type":3,"textContent":"SCRIPT_PLACEHOLDER","id":27}],"id":26},{"type":3,"textContent":"\n\n ","id":28},{"type":2,"tagName":"script","attributes":{"type":"text/template","id":"template-code-preview"},"childNodes":[{"type":3,"textContent":"SCRIPT_PLACEHOLDER","id":30}],"id":29},{"type":3,"textContent":"\n\n ","id":31},{"type":2,"tagName":"div","attributes":{"class":"app light"},"childNodes":[{"type":3,"textContent":"\n ","id":33},{"type":2,"tagName":"div","attributes":{"class":"status-bar","style":"height: 36px;"},"childNodes":[{"type":2,"tagName":"div","attributes":{"data-export":"buttons","style":"display: block;"},"childNodes":[{"type":2,"tagName":"a","attributes":{"data-export":"file","href":"javascript:void(0);","class":"active"},"childNodes":[{"type":3,"textContent":"ReactHooks.js","id":37}],"id":36},{"type":2,"tagName":"a","attributes":{"data-export":"newFileButton","href":"javascript:void(0)"},"childNodes":[{"type":2,"tagName":"svg","attributes":{"width":"14","height":"14","viewBox":"0 0 1792 1792","xmlns":"http://www.w3.org/2000/svg"},"childNodes":[{"type":2,"tagName":"path","attributes":{"d":"M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"},"childNodes":[],"isSVG":true,"id":40}],"isSVG":true,"id":39}],"id":38},{"type":2,"tagName":"a","attributes":{"data-export":"closeButton","class":"right","href":"javascript:void(0)"},"childNodes":[{"type":2,"tagName":"svg","attributes":{"width":"14","height":"14","viewBox":"0 0 1792 1792","xmlns":"http://www.w3.org/2000/svg"},"childNodes":[{"type":2,"tagName":"path","attributes":{"d":"M1490 1322q0 40-28 68l-136 136q-28 28-68 28t-68-28l-294-294-294 294q-28 28-68 28t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 294 294-294q28-28 68-28t68 28l136 136q28 28 28 68t-28 68l-294 294 294 294q28 28 28 68z"},"childNodes":[],"isSVG":true,"id":43}],"isSVG":true,"id":42}],"id":41},{"type":2,"tagName":"a","attributes":{"data-export":"settingsButton","class":"right","href":"javascript:void(0)"},"childNodes":[{"type":2,"tagName":"svg","attributes":{"width":"14","height":"14","viewBox":"0 0 1792 1792","xmlns":"http://www.w3.org/2000/svg"},"childNodes":[{"type":2,"tagName":"path","attributes":{"d":"M1152 896q0-106-75-181t-181-75-181 75-75 181 75 181 181 75 181-75 75-181zm512-109v222q0 12-8 23t-20 13l-185 28q-19 54-39 91 35 50 107 138 10 12 10 25t-9 23q-27 37-99 108t-94 71q-12 0-26-9l-138-108q-44 23-91 38-16 136-29 186-7 28-36 28h-222q-14 0-24.5-8.5t-11.5-21.5l-28-184q-49-16-90-37l-141 107q-10 9-25 9-14 0-25-11-126-114-165-168-7-10-7-23 0-12 8-23 15-21 51-66.5t54-70.5q-27-50-41-99l-183-27q-13-2-21-12.5t-8-23.5v-222q0-12 8-23t19-13l186-28q14-46 39-92-40-57-107-138-10-12-10-24 0-10 9-23 26-36 98.5-107.5t94.5-71.5q13 0 26 10l138 107q44-23 91-38 16-136 29-186 7-28 36-28h222q14 0 24.5 8.5t11.5 21.5l28 184q49 16 90 37l142-107q9-9 24-9 13 0 25 10 129 119 165 170 7 8 7 22 0 12-8 23-15 21-51 66.5t-54 70.5q26 50 41 98l183 28q13 2 21 12.5t8 23.5z"},"childNodes":[],"isSVG":true,"id":46}],"isSVG":true,"id":45}],"id":44}],"id":35}],"id":34},{"type":3,"textContent":"\n ","id":47},{"type":2,"tagName":"div","attributes":{"class":"layout","style":"height: calc(100% - 36px); filter: none;"},"childNodes":[{"type":2,"tagName":"div","attributes":{"class":"editor-section editor","style":"height: calc(70% - 1px);"},"childNodes":[{"type":3,"textContent":"\n ","id":50},{"type":2,"tagName":"div","attributes":{"class":"js-code-editor"},"childNodes":[{"type":2,"tagName":"div","attributes":{"class":"CodeMirror cm-s-light CodeMirror-focused"},"childNodes":[{"type":2,"tagName":"div","attributes":{"style":"overflow: hidden; position: relative; width: 3px; height: 0px; top: 140px; left: 363px;"},"childNodes":[{"type":2,"tagName":"textarea","attributes":{"autocorrect":"off","autocapitalize":"off","spellcheck":"false","style":"position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;","tabindex":"0"},"childNodes":[],"id":54}],"id":53},{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-vscrollbar","tabindex":"-1","cm-not-content":"true","style":"bottom: 0px; display: block;"},"childNodes":[{"type":2,"tagName":"div","attributes":{"style":"min-width: 1px; height: 679px;"},"childNodes":[],"id":56}],"id":55},{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-hscrollbar","tabindex":"-1","cm-not-content":"true"},"childNodes":[{"type":2,"tagName":"div","attributes":{"style":"height: 100%; min-height: 1px; width: 0px;"},"childNodes":[],"id":58}],"id":57},{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-scrollbar-filler","cm-not-content":"true"},"childNodes":[],"id":59},{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-gutter-filler","cm-not-content":"true"},"childNodes":[],"id":60},{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-scroll","tabindex":"-1"},"childNodes":[{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-sizer","style":"margin-left: 0px; margin-bottom: -15px; border-right-width: 15px; min-height: 679px; min-width: 773.828px; padding-right: 15px; padding-bottom: 0px;"},"childNodes":[{"type":2,"tagName":"div","attributes":{"style":"position: relative; top: 0px;"},"childNodes":[{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-lines","role":"presentation"},"childNodes":[{"type":2,"tagName":"div","attributes":{"role":"presentation","style":"position: relative; outline: none;"},"childNodes":[{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-measure"},"childNodes":[],"id":66},{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-measure"},"childNodes":[],"id":67},{"type":2,"tagName":"div","attributes":{"style":"position: relative; z-index: 1;"},"childNodes":[],"id":68},{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-cursors","style":"visibility: hidden;"},"childNodes":[{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-cursor","style":"left: 349px; top: 273px; height: 21px;"},"childNodes":[{"type":3,"textContent":" ","id":71}],"id":70}],"id":69},{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-code","role":"presentation","style":""},"childNodes":[{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[{"type":3,"textContent":"const","id":76}],"id":75},{"type":3,"textContent":" ","id":77},{"type":2,"tagName":"span","attributes":{"class":"cm-def"},"childNodes":[{"type":3,"textContent":"base","id":79}],"id":78},{"type":3,"textContent":" ","id":80},{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[{"type":3,"textContent":"=","id":82}],"id":81},{"type":3,"textContent":" ","id":83},{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[{"type":3,"textContent":"Date","id":85}],"id":84},{"type":3,"textContent":".","id":86},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"now","id":88}],"id":87},{"type":3,"textContent":"()","id":89}],"id":74}],"id":73},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":2,"tagName":"span","attributes":{"cm-text":""},"childNodes":[{"type":3,"textContent":"​","id":93}],"id":92}],"id":91}],"id":90},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[{"type":3,"textContent":"class","id":97}],"id":96},{"type":3,"textContent":" ","id":98},{"type":2,"tagName":"span","attributes":{"class":"cm-def"},"childNodes":[{"type":3,"textContent":"App","id":100}],"id":99},{"type":3,"textContent":" ","id":101},{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[{"type":3,"textContent":"extends","id":103}],"id":102},{"type":3,"textContent":" ","id":104},{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[{"type":3,"textContent":"React","id":106}],"id":105},{"type":3,"textContent":".","id":107},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"Component","id":109}],"id":108},{"type":3,"textContent":" {","id":110}],"id":95}],"id":94},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":113},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"constructor","id":115}],"id":114},{"type":3,"textContent":"(","id":116},{"type":2,"tagName":"span","attributes":{"class":"cm-def"},"childNodes":[{"type":3,"textContent":"props","id":118}],"id":117},{"type":3,"textContent":") {","id":119}],"id":112}],"id":111},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":122},{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[{"type":3,"textContent":"super","id":124}],"id":123},{"type":3,"textContent":"(","id":125},{"type":2,"tagName":"span","attributes":{"class":"cm-variable-2"},"childNodes":[{"type":3,"textContent":"props","id":127}],"id":126},{"type":3,"textContent":");","id":128}],"id":121}],"id":120},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":131},{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[{"type":3,"textContent":"this","id":133}],"id":132},{"type":3,"textContent":".","id":134},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"state","id":136}],"id":135},{"type":3,"textContent":" ","id":137},{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[{"type":3,"textContent":"=","id":139}],"id":138},{"type":3,"textContent":" {","id":140}],"id":130}],"id":129},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":143},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"count","id":145}],"id":144},{"type":3,"textContent":": ","id":146},{"type":2,"tagName":"span","attributes":{"class":"cm-number"},"childNodes":[{"type":3,"textContent":"0","id":148}],"id":147},{"type":3,"textContent":",","id":149}],"id":142}],"id":141},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":152},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"time","id":154}],"id":153},{"type":3,"textContent":": ","id":155},{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[{"type":3,"textContent":"base","id":157}],"id":156},{"type":3,"textContent":",","id":158}],"id":151}],"id":150},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" };","id":161}],"id":160}],"id":159},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" }","id":164}],"id":163}],"id":162},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":167}],"id":166}],"id":165},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":170},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"componentDidMount","id":172}],"id":171},{"type":3,"textContent":"() {","id":173}],"id":169}],"id":168},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":176},{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[{"type":3,"textContent":"setInterval","id":178}],"id":177},{"type":3,"textContent":"(() ","id":179},{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[{"type":3,"textContent":"=>","id":181}],"id":180},{"type":3,"textContent":" {","id":182}],"id":175}],"id":174},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":185},{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[{"type":3,"textContent":"this","id":187}],"id":186},{"type":3,"textContent":".","id":188},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"setState","id":190}],"id":189},{"type":3,"textContent":"({ ","id":191},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"time","id":193}],"id":192},{"type":3,"textContent":": ","id":194},{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[{"type":3,"textContent":"Date","id":196}],"id":195},{"type":3,"textContent":".","id":197},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"now","id":199}],"id":198},{"type":3,"textContent":"() })","id":200}],"id":184}],"id":183},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" }, ","id":203},{"type":2,"tagName":"span","attributes":{"class":"cm-number"},"childNodes":[{"type":3,"textContent":"1000","id":205}],"id":204},{"type":3,"textContent":");","id":206}],"id":202}],"id":201},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" }","id":209}],"id":208}],"id":207},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":212}],"id":211}],"id":210},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":215},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"render","id":217}],"id":216},{"type":3,"textContent":"() {","id":218}],"id":214}],"id":213},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":221},{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[{"type":3,"textContent":"const","id":223}],"id":222},{"type":3,"textContent":" { ","id":224},{"type":2,"tagName":"span","attributes":{"class":"cm-def"},"childNodes":[{"type":3,"textContent":"count","id":226}],"id":225},{"type":3,"textContent":", ","id":227},{"type":2,"tagName":"span","attributes":{"class":"cm-def"},"childNodes":[{"type":3,"textContent":"time","id":229}],"id":228},{"type":3,"textContent":" } ","id":230},{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[{"type":3,"textContent":"=","id":232}],"id":231},{"type":3,"textContent":" ","id":233},{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[{"type":3,"textContent":"this","id":235}],"id":234},{"type":3,"textContent":".","id":236},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"state","id":238}],"id":237},{"type":3,"textContent":";","id":239}],"id":220}],"id":219},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":242},{"type":2,"tagName":"span","attributes":{"class":"cm-tab","role":"presentation","cm-text":"\t"},"childNodes":[{"type":3,"textContent":" ","id":244}],"id":243},{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[{"type":3,"textContent":"return","id":246}],"id":245},{"type":3,"textContent":" (","id":247}],"id":241}],"id":240},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":250},{"type":2,"tagName":"span","attributes":{"class":"cm-tab","role":"presentation","cm-text":"\t"},"childNodes":[{"type":3,"textContent":" ","id":252}],"id":251},{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[{"type":3,"textContent":"<","id":254}],"id":253},{"type":2,"tagName":"span","attributes":{"class":"cm-tag"},"childNodes":[{"type":3,"textContent":"section","id":256}],"id":255},{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[{"type":3,"textContent":">","id":258}],"id":257}],"id":249}],"id":248},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":261},{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[{"type":3,"textContent":"<","id":263}],"id":262},{"type":2,"tagName":"span","attributes":{"class":"cm-tag"},"childNodes":[{"type":3,"textContent":"div","id":265}],"id":264},{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[{"type":3,"textContent":">","id":267}],"id":266},{"type":3,"textContent":"Time {","id":268},{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[{"type":3,"textContent":"Math","id":270}],"id":269},{"type":3,"textContent":".","id":271},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"round","id":273}],"id":272},{"type":3,"textContent":"((","id":274},{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[{"type":3,"textContent":"time","id":276}],"id":275},{"type":3,"textContent":" ","id":277},{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[{"type":3,"textContent":"-","id":279}],"id":278},{"type":3,"textContent":" ","id":280},{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[{"type":3,"textContent":"base","id":282}],"id":281},{"type":3,"textContent":") ","id":283},{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[{"type":3,"textContent":"/","id":285}],"id":284},{"type":3,"textContent":" ","id":286},{"type":2,"tagName":"span","attributes":{"class":"cm-number"},"childNodes":[{"type":3,"textContent":"1000","id":288}],"id":287},{"type":3,"textContent":")}","id":289},{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[{"type":3,"textContent":"","id":295}],"id":294}],"id":260}],"id":259},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":298},{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[{"type":3,"textContent":"<","id":300}],"id":299},{"type":2,"tagName":"span","attributes":{"class":"cm-tag"},"childNodes":[{"type":3,"textContent":"div","id":302}],"id":301},{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[{"type":3,"textContent":">","id":304}],"id":303},{"type":3,"textContent":"Counter {","id":305},{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[{"type":3,"textContent":"count","id":307}],"id":306},{"type":3,"textContent":"}","id":308},{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[{"type":3,"textContent":"","id":314}],"id":313}],"id":297}],"id":296},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":317},{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[{"type":3,"textContent":"<","id":319}],"id":318},{"type":2,"tagName":"span","attributes":{"class":"cm-tag"},"childNodes":[{"type":3,"textContent":"button","id":321}],"id":320},{"type":3,"textContent":" ","id":322},{"type":2,"tagName":"span","attributes":{"class":"cm-attribute"},"childNodes":[{"type":3,"textContent":"onClick","id":324}],"id":323},{"type":3,"textContent":"={() ","id":325},{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[{"type":3,"textContent":"=>","id":327}],"id":326},{"type":3,"textContent":" ","id":328},{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[{"type":3,"textContent":"this","id":330}],"id":329},{"type":3,"textContent":".","id":331},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"setState","id":333}],"id":332},{"type":3,"textContent":"({ ","id":334},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"count","id":336}],"id":335},{"type":3,"textContent":": ","id":337},{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[{"type":3,"textContent":"count","id":339}],"id":338},{"type":3,"textContent":" ","id":340},{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[{"type":3,"textContent":"+","id":342}],"id":341},{"type":3,"textContent":" ","id":343},{"type":2,"tagName":"span","attributes":{"class":"cm-number"},"childNodes":[{"type":3,"textContent":"1","id":345}],"id":344},{"type":3,"textContent":" })}","id":346},{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[{"type":3,"textContent":">","id":348}],"id":347},{"type":3,"textContent":"click to count","id":349},{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[{"type":3,"textContent":"","id":355}],"id":354}],"id":316}],"id":315},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" ","id":358},{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[{"type":3,"textContent":"","id":364}],"id":363}],"id":357}],"id":356},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" )","id":367}],"id":366}],"id":365},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":" }","id":370}],"id":369}],"id":368},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":3,"textContent":"}","id":373}],"id":372}],"id":371},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":2,"tagName":"span","attributes":{"cm-text":""},"childNodes":[{"type":3,"textContent":"​","id":377}],"id":376}],"id":375}],"id":374},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[{"type":3,"textContent":"ReactDOM","id":381}],"id":380},{"type":3,"textContent":".","id":382},{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[{"type":3,"textContent":"render","id":384}],"id":383},{"type":3,"textContent":"(","id":385},{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[{"type":3,"textContent":"<","id":387}],"id":386},{"type":2,"tagName":"span","attributes":{"class":"cm-tag"},"childNodes":[{"type":3,"textContent":"App","id":389}],"id":388},{"type":3,"textContent":" ","id":390},{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[{"type":3,"textContent":"/>","id":392}],"id":391},{"type":3,"textContent":", ","id":393},{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[{"type":3,"textContent":"document","id":395}],"id":394},{"type":3,"textContent":".","id":396},{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[{"type":3,"textContent":"querySelector","id":398}],"id":397},{"type":3,"textContent":"(","id":399},{"type":2,"tagName":"span","attributes":{"class":"cm-string"},"childNodes":[{"type":3,"textContent":"'.output'","id":401}],"id":400},{"type":3,"textContent":"));","id":402}],"id":379}],"id":378},{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[{"type":2,"tagName":"span","attributes":{"cm-text":""},"childNodes":[{"type":3,"textContent":"​","id":406}],"id":405}],"id":404}],"id":403}],"id":72}],"id":65}],"id":64}],"id":63}],"id":62},{"type":2,"tagName":"div","attributes":{"style":"position: absolute; height: 15px; width: 1px; border-bottom: 0px solid transparent; top: 679px;"},"childNodes":[],"id":407},{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-gutters","style":"display: none; height: 694px;"},"childNodes":[],"id":408}],"id":61}],"id":52}],"id":51},{"type":3,"textContent":"\n ","id":409}],"id":49},{"type":2,"tagName":"div","attributes":{"class":"gutter gutter-vertical","style":"height: 2px;"},"childNodes":[],"id":410},{"type":2,"tagName":"div","attributes":{"class":"editor-section","style":"height: calc(30% - 1px);"},"childNodes":[{"type":2,"tagName":"div","attributes":{"class":"editor-section output","id":"output","style":"float: left; width: calc(50% - 1px);"},"childNodes":[{"type":2,"tagName":"section","attributes":{},"childNodes":[{"type":2,"tagName":"div","attributes":{},"childNodes":[{"type":3,"textContent":"Time ","id":415},{"type":3,"textContent":"0","id":416}],"id":414},{"type":2,"tagName":"div","attributes":{},"childNodes":[{"type":3,"textContent":"Counter ","id":418},{"type":3,"textContent":"0","id":419}],"id":417},{"type":2,"tagName":"button","attributes":{},"childNodes":[{"type":3,"textContent":"click to count","id":421}],"id":420}],"id":413}],"id":412},{"type":2,"tagName":"div","attributes":{"class":"gutter gutter-horizontal","style":"width: 2px;"},"childNodes":[],"id":422},{"type":2,"tagName":"div","attributes":{"class":"editor-section console","style":"float: left; width: calc(50% - 1px);"},"childNodes":[{"type":2,"tagName":"div","attributes":{"class":"centered"},"childNodes":[{"type":2,"tagName":"div","attributes":{},"childNodes":[{"type":3,"textContent":"console.log(...)","id":426}],"id":425}],"id":424}],"id":423}],"id":411}],"id":48},{"type":3,"textContent":"\n ","id":427}],"id":32},{"type":3,"textContent":"\n\n ","id":428},{"type":2,"tagName":"script","attributes":{},"childNodes":[{"type":3,"textContent":"SCRIPT_PLACEHOLDER","id":430}],"id":429},{"type":3,"textContent":"\n ","id":431},{"type":2,"tagName":"script","attributes":{"src":"https://demoit.app/static/demoit/demoit.js"},"childNodes":[],"id":432},{"type":2,"tagName":"script","attributes":{"src":"https://demoit.app/e/resources/editor.js"},"childNodes":[],"id":433},{"type":3,"textContent":"\n\n\n","id":434},{"type":2,"tagName":"script","attributes":{"src":"https://demoit.app/e/resources/react-16.7.0-alpha.0.js"},"childNodes":[],"id":435},{"type":2,"tagName":"script","attributes":{"src":"https://demoit.app/e/resources/react-dom.16.7.0-alpha.0.js"},"childNodes":[],"id":436}],"id":18}],"id":3}],"id":1},"initialOffset":{"left":0,"top":0}},"timestamp":1544756766761,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756767101,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":1158,"y":93,"id":55,"timeOffset":-1}]},"timestamp":1544756767119,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"1"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756767141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":1019,"y":171,"id":174,"timeOffset":-469},{"x":934,"y":230,"id":207,"timeOffset":-435},{"x":921,"y":239,"id":210,"timeOffset":-403},{"x":926,"y":238,"id":207,"timeOffset":-377}]},"timestamp":1544756767620,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756767631,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":918,"y":241,"id":210,"timeOffset":-280},{"x":896,"y":248,"id":210,"timeOffset":-255},{"x":848,"y":257,"id":210,"timeOffset":-223},{"x":806,"y":260,"id":213,"timeOffset":-190},{"x":764,"y":264,"id":213,"timeOffset":-156},{"x":757,"y":268,"id":213,"timeOffset":-122}]},"timestamp":1544756768122,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"2"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756768141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756768161,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":2,"type":1,"id":213,"x":757,"y":268},"timestamp":1544756768297,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":53,"attributes":{"style":"overflow: hidden; position: relative; width: 3px; height: 0px; top: 224px; left: 119px;"}}],"removes":[{"parentId":69,"id":70}],"adds":[{"parentId":69,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-cursor","style":"left: 105px; top: 357px; height: 21px;"},"childNodes":[],"id":437}},{"parentId":437,"previousId":null,"nextId":null,"node":{"type":3,"textContent":" ","id":438}}]},"timestamp":1544756768304,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":2,"type":0,"id":213,"x":757,"y":268},"timestamp":1544756768475,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":2,"type":2,"id":213,"x":757,"y":268},"timestamp":1544756768475,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756768830,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"3"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756769142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756769361,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756769890,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"4"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756770142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756770420,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756770951,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"5"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756771141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756771480,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756772010,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"6"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756772141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756772540,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756773070,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"7"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756773142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756773601,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756774131,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"8"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756774141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756774660,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"9"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756775142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756775190,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756775720,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"10"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756776142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756776250,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756776781,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"11"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756777141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756777311,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756777841,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"12"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756778142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756778371,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756778900,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"13"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756779141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756779430,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756779960,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"14"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756780141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756780490,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756781020,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"15"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756781140,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756781550,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756782081,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"16"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756782142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756782610,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"17"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756783141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756783142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756783670,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"18"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756784142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756784200,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756784730,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"19"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756785141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756785260,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756785791,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"20"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756786141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756786321,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756786851,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"21"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756787142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756787380,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756787911,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"22"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756788141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756788440,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756788970,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"23"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756789142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756789500,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756790031,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"24"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756790142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756790561,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756791090,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"25"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756791141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756791621,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"26"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756792142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756792151,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756792680,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"27"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756793142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756793211,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756793740,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"28"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756794141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756794270,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756794800,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"29"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756795141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756795331,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756795860,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"30"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756796142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756796390,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756796921,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"31"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756797142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756797450,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756797980,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"32"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756798142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756798510,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756799041,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"33"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756799142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756799570,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756800100,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"34"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756800142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756800631,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"35"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756801142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756801161,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756801691,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"36"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756802142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756802221,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756802750,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"37"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756803142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756803280,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756803810,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"38"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756804142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756804340,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756804871,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"39"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756805141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756805400,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756805930,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"40"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756806142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756806460,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756806990,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"41"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756807142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756807520,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756808051,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"42"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756808142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756808580,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756809110,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"43"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756809142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756809640,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"44"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756810141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756810170,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756810701,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"45"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756811141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":750,"y":268,"id":213,"timeOffset":0}]},"timestamp":1544756811187,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756811230,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":720,"y":274,"id":213,"timeOffset":-472},{"x":682,"y":281,"id":219,"timeOffset":-438},{"x":621,"y":284,"id":219,"timeOffset":-405},{"x":576,"y":288,"id":219,"timeOffset":-371},{"x":529,"y":305,"id":240,"timeOffset":-338},{"x":506,"y":327,"id":248,"timeOffset":-305},{"x":492,"y":345,"id":259,"timeOffset":-271},{"x":490,"y":356,"id":292,"timeOffset":-238},{"x":501,"y":374,"id":296,"timeOffset":-205}]},"timestamp":1544756811689,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756811760,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"46"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756812141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":505,"y":396,"id":338,"timeOffset":-337},{"x":505,"y":427,"id":356,"timeOffset":-306},{"x":511,"y":453,"id":368,"timeOffset":-273},{"x":520,"y":491,"id":374,"timeOffset":-240},{"x":526,"y":513,"id":412,"timeOffset":-205},{"x":536,"y":548,"id":413,"timeOffset":-173},{"x":540,"y":575,"id":412,"timeOffset":-139},{"x":539,"y":592,"id":412,"timeOffset":-107},{"x":536,"y":596,"id":412,"timeOffset":-73},{"x":533,"y":600,"id":412,"timeOffset":-38},{"x":527,"y":607,"id":412,"timeOffset":-6}]},"timestamp":1544756812190,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756812290,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":522,"y":612,"id":412,"timeOffset":-474},{"x":517,"y":618,"id":412,"timeOffset":-441},{"x":516,"y":618,"id":412,"timeOffset":-346}]},"timestamp":1544756812691,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756812821,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"47"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756813142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":507,"y":610,"id":412,"timeOffset":-131},{"x":487,"y":594,"id":412,"timeOffset":-107},{"x":440,"y":546,"id":417,"timeOffset":-74},{"x":412,"y":519,"id":414,"timeOffset":-40},{"x":394,"y":492,"id":374,"timeOffset":-7}]},"timestamp":1544756813191,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756813350,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":2,"type":1,"id":368,"x":387,"y":463},"timestamp":1544756813496,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":53,"attributes":{"style":"overflow: hidden; position: relative; width: 3px; height: 0px; top: 413px; left: 43px;"}},{"id":69,"attributes":{"style":""}}],"removes":[{"parentId":69,"id":437}],"adds":[{"parentId":69,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-cursor","style":"left: 29px; top: 546px; height: 21px;"},"childNodes":[],"id":439}},{"parentId":439,"previousId":null,"nextId":null,"node":{"type":3,"textContent":" ","id":440}}]},"timestamp":1544756813505,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":2,"type":0,"id":368,"x":387,"y":463},"timestamp":1544756813674,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":2,"type":2,"id":368,"x":387,"y":463},"timestamp":1544756813674,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":390,"y":475,"id":371,"timeOffset":-474}]},"timestamp":1544756813691,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756814033,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"48"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756814141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756814562,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":3,"id":55,"x":0,"y":120},"timestamp":1544756814684,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":3,"id":61,"x":0,"y":0},"timestamp":1544756814785,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756815093,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"49"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756815142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":3,"id":55,"x":0,"y":9},"timestamp":1544756815340,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":3,"id":61,"x":0,"y":163},"timestamp":1544756815441,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":3,"id":55,"x":0,"y":212},"timestamp":1544756815541,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756815623,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"50"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756816142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756816153,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756816683,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"51"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756817142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756817213,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756817743,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"52"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756818141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756818274,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":384,"y":449,"id":397,"timeOffset":0}]},"timestamp":1544756818391,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":3,"id":55,"x":0,"y":166},"timestamp":1544756818797,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756818804,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":379,"y":407,"id":371,"timeOffset":-476},{"x":375,"y":322,"id":315,"timeOffset":-443},{"x":379,"y":294,"id":260,"timeOffset":-410}]},"timestamp":1544756818891,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":3,"id":61,"x":0,"y":7},"timestamp":1544756818897,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":3,"id":55,"x":0,"y":0},"timestamp":1544756818998,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"53"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756819142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":3,"id":55,"x":0,"y":19},"timestamp":1544756819298,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756819333,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":3,"id":61,"x":0,"y":212},"timestamp":1544756819398,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756819863,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"54"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756820142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756820393,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756820923,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"55"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756821141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756821454,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756821983,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"56"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756822141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756822513,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756823043,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"57"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756823142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756823573,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756824103,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"58"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756824141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756824633,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"59"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756825141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756825163,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756825693,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"60"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756826142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756826223,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756826753,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"61"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756827142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756827283,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756827813,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"62"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756828142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756828343,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756828873,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"63"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756829141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756829403,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756829932,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"64"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756830142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756830463,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756830993,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"65"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756831144,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756831522,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756832054,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"66"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756832142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756832583,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756833114,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"67"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756833142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756833643,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"68"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756834141,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756834173,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756834703,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"69"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756835142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756835233,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756835763,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"70"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756836142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756836293,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":364,"y":238,"id":240,"timeOffset":0}]},"timestamp":1544756836504,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756836823,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":339,"y":167,"id":207,"timeOffset":-478},{"x":289,"y":47,"id":162,"timeOffset":-445},{"x":255,"y":11,"id":35,"timeOffset":-412},{"x":243,"y":24,"id":35,"timeOffset":-379},{"x":235,"y":45,"id":162,"timeOffset":-346},{"x":229,"y":52,"id":165,"timeOffset":-312},{"x":226,"y":53,"id":165,"timeOffset":-279},{"x":217,"y":56,"id":165,"timeOffset":-245},{"x":189,"y":60,"id":165,"timeOffset":-212},{"x":159,"y":56,"id":165,"timeOffset":-179},{"x":127,"y":41,"id":162,"timeOffset":-145},{"x":102,"y":25,"id":36,"timeOffset":-112},{"x":102,"y":24,"id":36,"timeOffset":-38},{"x":103,"y":24,"id":36,"timeOffset":-9}]},"timestamp":1544756837004,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":416,"value":"71"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756837142,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756837353,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":103,"y":23,"id":36,"timeOffset":-470},{"x":104,"y":23,"id":36,"timeOffset":-413},{"x":104,"y":23,"id":36,"timeOffset":-379},{"x":104,"y":23,"id":36,"timeOffset":-345},{"x":105,"y":23,"id":36,"timeOffset":-306}]},"timestamp":1544756837504,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":2,"type":1,"id":36,"x":105,"y":23},"timestamp":1544756837538,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":2,"type":6,"id":54},"timestamp":1544756837539,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":52,"attributes":{"class":"CodeMirror cm-s-light"}}],"removes":[],"adds":[]},"timestamp":1544756837540,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":2,"type":5,"id":36},"timestamp":1544756837542,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":2,"type":0,"id":36,"x":105,"y":23},"timestamp":1544756837716,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":2,"type":2,"id":36,"x":105,"y":23},"timestamp":1544756837716,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":2,"type":6,"id":36},"timestamp":1544756837717,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":441,"attributes":{"style":"display: block;"}}],"removes":[{"parentId":34,"id":35},{"parentId":412,"id":413}],"adds":[{"parentId":34,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"div","attributes":{"data-export":"buttons","style":"display: block;"},"childNodes":[],"id":441}},{"parentId":441,"previousId":null,"nextId":-1,"node":{"type":2,"tagName":"a","attributes":{"data-export":"file","href":"javascript:void(0);","class":"active"},"childNodes":[],"id":442}},{"parentId":442,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"ReactHooks.js","id":443}},{"parentId":441,"previousId":442,"nextId":-1,"node":{"type":2,"tagName":"a","attributes":{"data-export":"newFileButton","href":"javascript:void(0)"},"childNodes":[],"id":444}},{"parentId":444,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"svg","attributes":{"width":"14","height":"14","viewBox":"0 0 1792 1792","xmlns":"http://www.w3.org/2000/svg"},"childNodes":[],"isSVG":true,"id":445}},{"parentId":445,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"path","attributes":{"d":"M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"},"childNodes":[],"isSVG":true,"id":446}},{"parentId":441,"previousId":444,"nextId":-1,"node":{"type":2,"tagName":"a","attributes":{"data-export":"closeButton","class":"right","href":"javascript:void(0)"},"childNodes":[],"id":447}},{"parentId":447,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"svg","attributes":{"width":"14","height":"14","viewBox":"0 0 1792 1792","xmlns":"http://www.w3.org/2000/svg"},"childNodes":[],"isSVG":true,"id":448}},{"parentId":448,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"path","attributes":{"d":"M1490 1322q0 40-28 68l-136 136q-28 28-68 28t-68-28l-294-294-294 294q-28 28-68 28t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 294 294-294q28-28 68-28t68 28l136 136q28 28 28 68t-28 68l-294 294 294 294q28 28 28 68z"},"childNodes":[],"isSVG":true,"id":449}},{"parentId":441,"previousId":447,"nextId":null,"node":{"type":2,"tagName":"a","attributes":{"data-export":"settingsButton","class":"right","href":"javascript:void(0)"},"childNodes":[],"id":450}},{"parentId":450,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"svg","attributes":{"width":"14","height":"14","viewBox":"0 0 1792 1792","xmlns":"http://www.w3.org/2000/svg"},"childNodes":[],"isSVG":true,"id":451}},{"parentId":451,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"path","attributes":{"d":"M1152 896q0-106-75-181t-181-75-181 75-75 181 75 181 181 75 181-75 75-181zm512-109v222q0 12-8 23t-20 13l-185 28q-19 54-39 91 35 50 107 138 10 12 10 25t-9 23q-27 37-99 108t-94 71q-12 0-26-9l-138-108q-44 23-91 38-16 136-29 186-7 28-36 28h-222q-14 0-24.5-8.5t-11.5-21.5l-28-184q-49-16-90-37l-141 107q-10 9-25 9-14 0-25-11-126-114-165-168-7-10-7-23 0-12 8-23 15-21 51-66.5t54-70.5q-27-50-41-99l-183-27q-13-2-21-12.5t-8-23.5v-222q0-12 8-23t19-13l186-28q14-46 39-92-40-57-107-138-10-12-10-24 0-10 9-23 26-36 98.5-107.5t94.5-71.5q13 0 26 10l138 107q44-23 91-38 16-136 29-186 7-28 36-28h222q14 0 24.5 8.5t11.5 21.5l28 184q49 16 90 37l142-107q9-9 24-9 13 0 25 10 129 119 165 170 7 8 7 22 0 12-8 23-15 21-51 66.5t-54 70.5q26 50 41 98l183 28q13 2 21 12.5t8 23.5z"},"childNodes":[],"isSVG":true,"id":452}},{"parentId":412,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"div","attributes":{"class":"centered"},"childNodes":[],"id":453}},{"parentId":453,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"
","id":454}}]},"timestamp":1544756837723,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":2,"type":5,"id":54},"timestamp":1544756837758,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":72,"attributes":{"style":""}},{"id":53,"attributes":{"style":"overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 18px;"}},{"id":62,"attributes":{"style":"margin-left: 0px; margin-bottom: -15px; border-right-width: 15px; min-height: 679px; min-width: 773.828px; padding-right: 15px; padding-bottom: 0px;"}},{"id":408,"attributes":{"style":"display: none; height: 694px;"}},{"id":52,"attributes":{"class":"CodeMirror cm-s-light CodeMirror-focused"}},{"id":69,"attributes":{"style":""}},{"id":791,"attributes":{"style":"display: block;"}}],"removes":[{"parentId":423,"id":424},{"parentId":34,"id":441},{"parentId":72,"id":73},{"parentId":72,"id":90},{"parentId":72,"id":94},{"parentId":72,"id":111},{"parentId":72,"id":120},{"parentId":72,"id":129},{"parentId":72,"id":141},{"parentId":72,"id":150},{"parentId":72,"id":159},{"parentId":72,"id":162},{"parentId":72,"id":165},{"parentId":72,"id":168},{"parentId":72,"id":174},{"parentId":72,"id":183},{"parentId":72,"id":201},{"parentId":72,"id":207},{"parentId":72,"id":210},{"parentId":72,"id":213},{"parentId":72,"id":219},{"parentId":72,"id":240},{"parentId":72,"id":248},{"parentId":72,"id":259},{"parentId":72,"id":296},{"parentId":72,"id":315},{"parentId":72,"id":356},{"parentId":72,"id":365},{"parentId":72,"id":368},{"parentId":72,"id":371},{"parentId":72,"id":374},{"parentId":72,"id":378},{"parentId":72,"id":403},{"parentId":69,"id":439},{"parentId":412,"id":453}],"adds":[{"parentId":72,"previousId":null,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":455}},{"parentId":455,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":456}},{"parentId":456,"previousId":null,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[],"id":457}},{"parentId":457,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"const","id":458}},{"parentId":456,"previousId":457,"nextId":-1,"node":{"type":3,"textContent":" ","id":459}},{"parentId":456,"previousId":459,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-def"},"childNodes":[],"id":460}},{"parentId":460,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"base","id":461}},{"parentId":456,"previousId":460,"nextId":-1,"node":{"type":3,"textContent":" ","id":462}},{"parentId":456,"previousId":462,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[],"id":463}},{"parentId":463,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"=","id":464}},{"parentId":456,"previousId":463,"nextId":-1,"node":{"type":3,"textContent":" ","id":465}},{"parentId":456,"previousId":465,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[],"id":466}},{"parentId":466,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"Date","id":467}},{"parentId":456,"previousId":466,"nextId":-1,"node":{"type":3,"textContent":".","id":468}},{"parentId":456,"previousId":468,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":469}},{"parentId":469,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"now","id":470}},{"parentId":456,"previousId":469,"nextId":null,"node":{"type":3,"textContent":"()","id":471}},{"parentId":72,"previousId":455,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":472}},{"parentId":472,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":473}},{"parentId":473,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"cm-text":""},"childNodes":[],"id":474}},{"parentId":474,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"​","id":475}},{"parentId":72,"previousId":472,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":476}},{"parentId":476,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":477}},{"parentId":477,"previousId":null,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[],"id":478}},{"parentId":478,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"class","id":479}},{"parentId":477,"previousId":478,"nextId":-1,"node":{"type":3,"textContent":" ","id":480}},{"parentId":477,"previousId":480,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-def"},"childNodes":[],"id":481}},{"parentId":481,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"App","id":482}},{"parentId":477,"previousId":481,"nextId":-1,"node":{"type":3,"textContent":" ","id":483}},{"parentId":477,"previousId":483,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[],"id":484}},{"parentId":484,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"extends","id":485}},{"parentId":477,"previousId":484,"nextId":-1,"node":{"type":3,"textContent":" ","id":486}},{"parentId":477,"previousId":486,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[],"id":487}},{"parentId":487,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"React","id":488}},{"parentId":477,"previousId":487,"nextId":-1,"node":{"type":3,"textContent":".","id":489}},{"parentId":477,"previousId":489,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":490}},{"parentId":490,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"Component","id":491}},{"parentId":477,"previousId":490,"nextId":null,"node":{"type":3,"textContent":" {","id":492}},{"parentId":72,"previousId":476,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":493}},{"parentId":493,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":494}},{"parentId":494,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":495}},{"parentId":494,"previousId":495,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":496}},{"parentId":496,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"constructor","id":497}},{"parentId":494,"previousId":496,"nextId":-1,"node":{"type":3,"textContent":"(","id":498}},{"parentId":494,"previousId":498,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-def"},"childNodes":[],"id":499}},{"parentId":499,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"props","id":500}},{"parentId":494,"previousId":499,"nextId":null,"node":{"type":3,"textContent":") {","id":501}},{"parentId":72,"previousId":493,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":502}},{"parentId":502,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":503}},{"parentId":503,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":504}},{"parentId":503,"previousId":504,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[],"id":505}},{"parentId":505,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"super","id":506}},{"parentId":503,"previousId":505,"nextId":-1,"node":{"type":3,"textContent":"(","id":507}},{"parentId":503,"previousId":507,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-variable-2"},"childNodes":[],"id":508}},{"parentId":508,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"props","id":509}},{"parentId":503,"previousId":508,"nextId":null,"node":{"type":3,"textContent":");","id":510}},{"parentId":72,"previousId":502,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":511}},{"parentId":511,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":512}},{"parentId":512,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":513}},{"parentId":512,"previousId":513,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[],"id":514}},{"parentId":514,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"this","id":515}},{"parentId":512,"previousId":514,"nextId":-1,"node":{"type":3,"textContent":".","id":516}},{"parentId":512,"previousId":516,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":517}},{"parentId":517,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"state","id":518}},{"parentId":512,"previousId":517,"nextId":-1,"node":{"type":3,"textContent":" ","id":519}},{"parentId":512,"previousId":519,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[],"id":520}},{"parentId":520,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"=","id":521}},{"parentId":512,"previousId":520,"nextId":null,"node":{"type":3,"textContent":" {","id":522}},{"parentId":72,"previousId":511,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":523}},{"parentId":523,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":524}},{"parentId":524,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":525}},{"parentId":524,"previousId":525,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":526}},{"parentId":526,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"count","id":527}},{"parentId":524,"previousId":526,"nextId":-1,"node":{"type":3,"textContent":": ","id":528}},{"parentId":524,"previousId":528,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-number"},"childNodes":[],"id":529}},{"parentId":529,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"0","id":530}},{"parentId":524,"previousId":529,"nextId":null,"node":{"type":3,"textContent":",","id":531}},{"parentId":72,"previousId":523,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":532}},{"parentId":532,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":533}},{"parentId":533,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":534}},{"parentId":533,"previousId":534,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":535}},{"parentId":535,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"time","id":536}},{"parentId":533,"previousId":535,"nextId":-1,"node":{"type":3,"textContent":": ","id":537}},{"parentId":533,"previousId":537,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[],"id":538}},{"parentId":538,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"base","id":539}},{"parentId":533,"previousId":538,"nextId":null,"node":{"type":3,"textContent":",","id":540}},{"parentId":72,"previousId":532,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":541}},{"parentId":541,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":542}},{"parentId":542,"previousId":null,"nextId":null,"node":{"type":3,"textContent":" };","id":543}},{"parentId":72,"previousId":541,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":544}},{"parentId":544,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":545}},{"parentId":545,"previousId":null,"nextId":null,"node":{"type":3,"textContent":" }","id":546}},{"parentId":72,"previousId":544,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":547}},{"parentId":547,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":548}},{"parentId":548,"previousId":null,"nextId":null,"node":{"type":3,"textContent":" ","id":549}},{"parentId":72,"previousId":547,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":550}},{"parentId":550,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":551}},{"parentId":551,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":552}},{"parentId":551,"previousId":552,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":553}},{"parentId":553,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"componentDidMount","id":554}},{"parentId":551,"previousId":553,"nextId":null,"node":{"type":3,"textContent":"() {","id":555}},{"parentId":72,"previousId":550,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":556}},{"parentId":556,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":557}},{"parentId":557,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":558}},{"parentId":557,"previousId":558,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[],"id":559}},{"parentId":559,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"setInterval","id":560}},{"parentId":557,"previousId":559,"nextId":-1,"node":{"type":3,"textContent":"(() ","id":561}},{"parentId":557,"previousId":561,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[],"id":562}},{"parentId":562,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"=>","id":563}},{"parentId":557,"previousId":562,"nextId":null,"node":{"type":3,"textContent":" {","id":564}},{"parentId":72,"previousId":556,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":565}},{"parentId":565,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":566}},{"parentId":566,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":567}},{"parentId":566,"previousId":567,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[],"id":568}},{"parentId":568,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"this","id":569}},{"parentId":566,"previousId":568,"nextId":-1,"node":{"type":3,"textContent":".","id":570}},{"parentId":566,"previousId":570,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":571}},{"parentId":571,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"setState","id":572}},{"parentId":566,"previousId":571,"nextId":-1,"node":{"type":3,"textContent":"({ ","id":573}},{"parentId":566,"previousId":573,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":574}},{"parentId":574,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"time","id":575}},{"parentId":566,"previousId":574,"nextId":-1,"node":{"type":3,"textContent":": ","id":576}},{"parentId":566,"previousId":576,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[],"id":577}},{"parentId":577,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"Date","id":578}},{"parentId":566,"previousId":577,"nextId":-1,"node":{"type":3,"textContent":".","id":579}},{"parentId":566,"previousId":579,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":580}},{"parentId":580,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"now","id":581}},{"parentId":566,"previousId":580,"nextId":null,"node":{"type":3,"textContent":"() })","id":582}},{"parentId":72,"previousId":565,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":583}},{"parentId":583,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":584}},{"parentId":584,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" }, ","id":585}},{"parentId":584,"previousId":585,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-number"},"childNodes":[],"id":586}},{"parentId":586,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"1000","id":587}},{"parentId":584,"previousId":586,"nextId":null,"node":{"type":3,"textContent":");","id":588}},{"parentId":72,"previousId":583,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":589}},{"parentId":589,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":590}},{"parentId":590,"previousId":null,"nextId":null,"node":{"type":3,"textContent":" }","id":591}},{"parentId":72,"previousId":589,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":592}},{"parentId":592,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":593}},{"parentId":593,"previousId":null,"nextId":null,"node":{"type":3,"textContent":" ","id":594}},{"parentId":72,"previousId":592,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":595}},{"parentId":595,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":596}},{"parentId":596,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":597}},{"parentId":596,"previousId":597,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":598}},{"parentId":598,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"render","id":599}},{"parentId":596,"previousId":598,"nextId":null,"node":{"type":3,"textContent":"() {","id":600}},{"parentId":72,"previousId":595,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":601}},{"parentId":601,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":602}},{"parentId":602,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":603}},{"parentId":602,"previousId":603,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[],"id":604}},{"parentId":604,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"const","id":605}},{"parentId":602,"previousId":604,"nextId":-1,"node":{"type":3,"textContent":" { ","id":606}},{"parentId":602,"previousId":606,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-def"},"childNodes":[],"id":607}},{"parentId":607,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"count","id":608}},{"parentId":602,"previousId":607,"nextId":-1,"node":{"type":3,"textContent":", ","id":609}},{"parentId":602,"previousId":609,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-def"},"childNodes":[],"id":610}},{"parentId":610,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"time","id":611}},{"parentId":602,"previousId":610,"nextId":-1,"node":{"type":3,"textContent":" } ","id":612}},{"parentId":602,"previousId":612,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[],"id":613}},{"parentId":613,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"=","id":614}},{"parentId":602,"previousId":613,"nextId":-1,"node":{"type":3,"textContent":" ","id":615}},{"parentId":602,"previousId":615,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[],"id":616}},{"parentId":616,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"this","id":617}},{"parentId":602,"previousId":616,"nextId":-1,"node":{"type":3,"textContent":".","id":618}},{"parentId":602,"previousId":618,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":619}},{"parentId":619,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"state","id":620}},{"parentId":602,"previousId":619,"nextId":null,"node":{"type":3,"textContent":";","id":621}},{"parentId":72,"previousId":601,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":622}},{"parentId":622,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":623}},{"parentId":623,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":624}},{"parentId":623,"previousId":624,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tab","role":"presentation","cm-text":"\t"},"childNodes":[],"id":625}},{"parentId":625,"previousId":null,"nextId":null,"node":{"type":3,"textContent":" ","id":626}},{"parentId":623,"previousId":625,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[],"id":627}},{"parentId":627,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"return","id":628}},{"parentId":623,"previousId":627,"nextId":null,"node":{"type":3,"textContent":" (","id":629}},{"parentId":72,"previousId":622,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":630}},{"parentId":630,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":631}},{"parentId":631,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":632}},{"parentId":631,"previousId":632,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tab","role":"presentation","cm-text":"\t"},"childNodes":[],"id":633}},{"parentId":633,"previousId":null,"nextId":null,"node":{"type":3,"textContent":" ","id":634}},{"parentId":631,"previousId":633,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[],"id":635}},{"parentId":635,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"<","id":636}},{"parentId":631,"previousId":635,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag"},"childNodes":[],"id":637}},{"parentId":637,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"section","id":638}},{"parentId":631,"previousId":637,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[],"id":639}},{"parentId":639,"previousId":null,"nextId":null,"node":{"type":3,"textContent":">","id":640}},{"parentId":72,"previousId":630,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":641}},{"parentId":641,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":642}},{"parentId":642,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":643}},{"parentId":642,"previousId":643,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[],"id":644}},{"parentId":644,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"<","id":645}},{"parentId":642,"previousId":644,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag"},"childNodes":[],"id":646}},{"parentId":646,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"div","id":647}},{"parentId":642,"previousId":646,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[],"id":648}},{"parentId":648,"previousId":null,"nextId":null,"node":{"type":3,"textContent":">","id":649}},{"parentId":642,"previousId":648,"nextId":-1,"node":{"type":3,"textContent":"Time {","id":650}},{"parentId":642,"previousId":650,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[],"id":651}},{"parentId":651,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"Math","id":652}},{"parentId":642,"previousId":651,"nextId":-1,"node":{"type":3,"textContent":".","id":653}},{"parentId":642,"previousId":653,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":654}},{"parentId":654,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"round","id":655}},{"parentId":642,"previousId":654,"nextId":-1,"node":{"type":3,"textContent":"((","id":656}},{"parentId":642,"previousId":656,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[],"id":657}},{"parentId":657,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"time","id":658}},{"parentId":642,"previousId":657,"nextId":-1,"node":{"type":3,"textContent":" ","id":659}},{"parentId":642,"previousId":659,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[],"id":660}},{"parentId":660,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"-","id":661}},{"parentId":642,"previousId":660,"nextId":-1,"node":{"type":3,"textContent":" ","id":662}},{"parentId":642,"previousId":662,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[],"id":663}},{"parentId":663,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"base","id":664}},{"parentId":642,"previousId":663,"nextId":-1,"node":{"type":3,"textContent":") ","id":665}},{"parentId":642,"previousId":665,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[],"id":666}},{"parentId":666,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"/","id":667}},{"parentId":642,"previousId":666,"nextId":-1,"node":{"type":3,"textContent":" ","id":668}},{"parentId":642,"previousId":668,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-number"},"childNodes":[],"id":669}},{"parentId":669,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"1000","id":670}},{"parentId":642,"previousId":669,"nextId":-1,"node":{"type":3,"textContent":")}","id":671}},{"parentId":642,"previousId":671,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[],"id":672}},{"parentId":672,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"","id":677}},{"parentId":72,"previousId":641,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":678}},{"parentId":678,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":679}},{"parentId":679,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":680}},{"parentId":679,"previousId":680,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[],"id":681}},{"parentId":681,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"<","id":682}},{"parentId":679,"previousId":681,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag"},"childNodes":[],"id":683}},{"parentId":683,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"div","id":684}},{"parentId":679,"previousId":683,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[],"id":685}},{"parentId":685,"previousId":null,"nextId":null,"node":{"type":3,"textContent":">","id":686}},{"parentId":679,"previousId":685,"nextId":-1,"node":{"type":3,"textContent":"Counter {","id":687}},{"parentId":679,"previousId":687,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[],"id":688}},{"parentId":688,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"count","id":689}},{"parentId":679,"previousId":688,"nextId":-1,"node":{"type":3,"textContent":"}","id":690}},{"parentId":679,"previousId":690,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[],"id":691}},{"parentId":691,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"","id":696}},{"parentId":72,"previousId":678,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":697}},{"parentId":697,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":698}},{"parentId":698,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":699}},{"parentId":698,"previousId":699,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[],"id":700}},{"parentId":700,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"<","id":701}},{"parentId":698,"previousId":700,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag"},"childNodes":[],"id":702}},{"parentId":702,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"button","id":703}},{"parentId":698,"previousId":702,"nextId":-1,"node":{"type":3,"textContent":" ","id":704}},{"parentId":698,"previousId":704,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-attribute"},"childNodes":[],"id":705}},{"parentId":705,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"onClick","id":706}},{"parentId":698,"previousId":705,"nextId":-1,"node":{"type":3,"textContent":"={() ","id":707}},{"parentId":698,"previousId":707,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[],"id":708}},{"parentId":708,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"=>","id":709}},{"parentId":698,"previousId":708,"nextId":-1,"node":{"type":3,"textContent":" ","id":710}},{"parentId":698,"previousId":710,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-keyword"},"childNodes":[],"id":711}},{"parentId":711,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"this","id":712}},{"parentId":698,"previousId":711,"nextId":-1,"node":{"type":3,"textContent":".","id":713}},{"parentId":698,"previousId":713,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":714}},{"parentId":714,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"setState","id":715}},{"parentId":698,"previousId":714,"nextId":-1,"node":{"type":3,"textContent":"({ ","id":716}},{"parentId":698,"previousId":716,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":717}},{"parentId":717,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"count","id":718}},{"parentId":698,"previousId":717,"nextId":-1,"node":{"type":3,"textContent":": ","id":719}},{"parentId":698,"previousId":719,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[],"id":720}},{"parentId":720,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"count","id":721}},{"parentId":698,"previousId":720,"nextId":-1,"node":{"type":3,"textContent":" ","id":722}},{"parentId":698,"previousId":722,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-operator"},"childNodes":[],"id":723}},{"parentId":723,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"+","id":724}},{"parentId":698,"previousId":723,"nextId":-1,"node":{"type":3,"textContent":" ","id":725}},{"parentId":698,"previousId":725,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-number"},"childNodes":[],"id":726}},{"parentId":726,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"1","id":727}},{"parentId":698,"previousId":726,"nextId":-1,"node":{"type":3,"textContent":" })}","id":728}},{"parentId":698,"previousId":728,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[],"id":729}},{"parentId":729,"previousId":null,"nextId":null,"node":{"type":3,"textContent":">","id":730}},{"parentId":698,"previousId":729,"nextId":-1,"node":{"type":3,"textContent":"click to count","id":731}},{"parentId":698,"previousId":731,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[],"id":732}},{"parentId":732,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"","id":737}},{"parentId":72,"previousId":697,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":738}},{"parentId":738,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":739}},{"parentId":739,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":" ","id":740}},{"parentId":739,"previousId":740,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[],"id":741}},{"parentId":741,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"","id":746}},{"parentId":72,"previousId":738,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":747}},{"parentId":747,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":748}},{"parentId":748,"previousId":null,"nextId":null,"node":{"type":3,"textContent":" )","id":749}},{"parentId":72,"previousId":747,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":750}},{"parentId":750,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":751}},{"parentId":751,"previousId":null,"nextId":null,"node":{"type":3,"textContent":" }","id":752}},{"parentId":72,"previousId":750,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":753}},{"parentId":753,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":754}},{"parentId":754,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"}","id":755}},{"parentId":72,"previousId":753,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":756}},{"parentId":756,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":757}},{"parentId":757,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"cm-text":""},"childNodes":[],"id":758}},{"parentId":758,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"​","id":759}},{"parentId":72,"previousId":756,"nextId":-1,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":760}},{"parentId":760,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":761}},{"parentId":761,"previousId":null,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[],"id":762}},{"parentId":762,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"ReactDOM","id":763}},{"parentId":761,"previousId":762,"nextId":-1,"node":{"type":3,"textContent":".","id":764}},{"parentId":761,"previousId":764,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-property"},"childNodes":[],"id":765}},{"parentId":765,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"render","id":766}},{"parentId":761,"previousId":765,"nextId":-1,"node":{"type":3,"textContent":"(","id":767}},{"parentId":761,"previousId":767,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[],"id":768}},{"parentId":768,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"<","id":769}},{"parentId":761,"previousId":768,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag"},"childNodes":[],"id":770}},{"parentId":770,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"App","id":771}},{"parentId":761,"previousId":770,"nextId":-1,"node":{"type":3,"textContent":" ","id":772}},{"parentId":761,"previousId":772,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-tag cm-bracket"},"childNodes":[],"id":773}},{"parentId":773,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"/>","id":774}},{"parentId":761,"previousId":773,"nextId":-1,"node":{"type":3,"textContent":", ","id":775}},{"parentId":761,"previousId":775,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[],"id":776}},{"parentId":776,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"document","id":777}},{"parentId":761,"previousId":776,"nextId":-1,"node":{"type":3,"textContent":".","id":778}},{"parentId":761,"previousId":778,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-variable"},"childNodes":[],"id":779}},{"parentId":779,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"querySelector","id":780}},{"parentId":761,"previousId":779,"nextId":-1,"node":{"type":3,"textContent":"(","id":781}},{"parentId":761,"previousId":781,"nextId":-1,"node":{"type":2,"tagName":"span","attributes":{"class":"cm-string"},"childNodes":[],"id":782}},{"parentId":782,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"'.output'","id":783}},{"parentId":761,"previousId":782,"nextId":null,"node":{"type":3,"textContent":"));","id":784}},{"parentId":72,"previousId":760,"nextId":null,"node":{"type":2,"tagName":"pre","attributes":{"class":" CodeMirror-line ","role":"presentation"},"childNodes":[],"id":785}},{"parentId":785,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"role":"presentation","style":"padding-right: 0.1px;"},"childNodes":[],"id":786}},{"parentId":786,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"span","attributes":{"cm-text":""},"childNodes":[],"id":787}},{"parentId":787,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"​","id":788}},{"parentId":69,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"div","attributes":{"class":"CodeMirror-cursor","style":"left: 4px; top: 0px; height: 21px;"},"childNodes":[],"id":789}},{"parentId":789,"previousId":null,"nextId":null,"node":{"type":3,"textContent":" ","id":790}},{"parentId":34,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"div","attributes":{"data-export":"buttons","style":"display: block;"},"childNodes":[],"id":791}},{"parentId":791,"previousId":null,"nextId":-1,"node":{"type":2,"tagName":"a","attributes":{"data-export":"file","href":"javascript:void(0);","class":"active"},"childNodes":[],"id":792}},{"parentId":792,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"ReactHooks.js","id":793}},{"parentId":791,"previousId":792,"nextId":-1,"node":{"type":2,"tagName":"a","attributes":{"data-export":"newFileButton","href":"javascript:void(0)"},"childNodes":[],"id":794}},{"parentId":794,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"svg","attributes":{"width":"14","height":"14","viewBox":"0 0 1792 1792","xmlns":"http://www.w3.org/2000/svg"},"childNodes":[],"isSVG":true,"id":795}},{"parentId":795,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"path","attributes":{"d":"M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"},"childNodes":[],"isSVG":true,"id":796}},{"parentId":791,"previousId":794,"nextId":-1,"node":{"type":2,"tagName":"a","attributes":{"data-export":"closeButton","class":"right","href":"javascript:void(0)"},"childNodes":[],"id":797}},{"parentId":797,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"svg","attributes":{"width":"14","height":"14","viewBox":"0 0 1792 1792","xmlns":"http://www.w3.org/2000/svg"},"childNodes":[],"isSVG":true,"id":798}},{"parentId":798,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"path","attributes":{"d":"M1490 1322q0 40-28 68l-136 136q-28 28-68 28t-68-28l-294-294-294 294q-28 28-68 28t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 294 294-294q28-28 68-28t68 28l136 136q28 28 28 68t-28 68l-294 294 294 294q28 28 28 68z"},"childNodes":[],"isSVG":true,"id":799}},{"parentId":791,"previousId":797,"nextId":null,"node":{"type":2,"tagName":"a","attributes":{"data-export":"settingsButton","class":"right","href":"javascript:void(0)"},"childNodes":[],"id":800}},{"parentId":800,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"svg","attributes":{"width":"14","height":"14","viewBox":"0 0 1792 1792","xmlns":"http://www.w3.org/2000/svg"},"childNodes":[],"isSVG":true,"id":801}},{"parentId":801,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"path","attributes":{"d":"M1152 896q0-106-75-181t-181-75-181 75-75 181 75 181 181 75 181-75 75-181zm512-109v222q0 12-8 23t-20 13l-185 28q-19 54-39 91 35 50 107 138 10 12 10 25t-9 23q-27 37-99 108t-94 71q-12 0-26-9l-138-108q-44 23-91 38-16 136-29 186-7 28-36 28h-222q-14 0-24.5-8.5t-11.5-21.5l-28-184q-49-16-90-37l-141 107q-10 9-25 9-14 0-25-11-126-114-165-168-7-10-7-23 0-12 8-23 15-21 51-66.5t54-70.5q-27-50-41-99l-183-27q-13-2-21-12.5t-8-23.5v-222q0-12 8-23t19-13l186-28q14-46 39-92-40-57-107-138-10-12-10-24 0-10 9-23 26-36 98.5-107.5t94.5-71.5q13 0 26 10l138 107q44-23 91-38 16-136 29-186 7-28 36-28h222q14 0 24.5 8.5t11.5 21.5l28 184q49 16 90 37l142-107q9-9 24-9 13 0 25 10 129 119 165 170 7 8 7 22 0 12-8 23-15 21-51 66.5t-54 70.5q26 50 41 98l183 28q13 2 21 12.5t8 23.5z"},"childNodes":[],"isSVG":true,"id":802}},{"parentId":423,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"div","attributes":{"class":"centered"},"childNodes":[],"id":803}},{"parentId":803,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"div","attributes":{"class":"spinner"},"childNodes":[],"id":804}},{"parentId":412,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"div","attributes":{"class":"centered"},"childNodes":[],"id":805}},{"parentId":805,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"div","attributes":{"class":"spinner"},"childNodes":[],"id":806}}]},"timestamp":1544756837770,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":819,"attributes":{"style":"display: block;"}}],"removes":[{"parentId":423,"id":803},{"parentId":412,"id":805},{"parentId":34,"id":791}],"adds":[{"parentId":423,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"div","attributes":{"class":"centered"},"childNodes":[],"id":807}},{"parentId":807,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"div","attributes":{},"childNodes":[],"id":808}},{"parentId":808,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"console.log(...)","id":809}},{"parentId":412,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"section","attributes":{},"childNodes":[],"id":810}},{"parentId":810,"previousId":null,"nextId":-1,"node":{"type":2,"tagName":"div","attributes":{},"childNodes":[],"id":811}},{"parentId":811,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":"Time ","id":812}},{"parentId":811,"previousId":812,"nextId":null,"node":{"type":3,"textContent":"0","id":813}},{"parentId":810,"previousId":811,"nextId":-1,"node":{"type":2,"tagName":"div","attributes":{},"childNodes":[],"id":814}},{"parentId":814,"previousId":null,"nextId":-1,"node":{"type":3,"textContent":"Counter ","id":815}},{"parentId":814,"previousId":815,"nextId":null,"node":{"type":3,"textContent":"0","id":816}},{"parentId":810,"previousId":814,"nextId":null,"node":{"type":2,"tagName":"button","attributes":{},"childNodes":[],"id":817}},{"parentId":817,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"click to count","id":818}},{"parentId":34,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"div","attributes":{"data-export":"buttons","style":"display: block;"},"childNodes":[],"id":819}},{"parentId":819,"previousId":null,"nextId":-1,"node":{"type":2,"tagName":"a","attributes":{"data-export":"file","href":"javascript:void(0);","class":"active"},"childNodes":[],"id":820}},{"parentId":820,"previousId":null,"nextId":null,"node":{"type":3,"textContent":"ReactHooks.js","id":821}},{"parentId":819,"previousId":820,"nextId":-1,"node":{"type":2,"tagName":"a","attributes":{"data-export":"newFileButton","href":"javascript:void(0)"},"childNodes":[],"id":822}},{"parentId":822,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"svg","attributes":{"width":"14","height":"14","viewBox":"0 0 1792 1792","xmlns":"http://www.w3.org/2000/svg"},"childNodes":[],"isSVG":true,"id":823}},{"parentId":823,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"path","attributes":{"d":"M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"},"childNodes":[],"isSVG":true,"id":824}},{"parentId":819,"previousId":822,"nextId":-1,"node":{"type":2,"tagName":"a","attributes":{"data-export":"closeButton","class":"right","href":"javascript:void(0)"},"childNodes":[],"id":825}},{"parentId":825,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"svg","attributes":{"width":"14","height":"14","viewBox":"0 0 1792 1792","xmlns":"http://www.w3.org/2000/svg"},"childNodes":[],"isSVG":true,"id":826}},{"parentId":826,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"path","attributes":{"d":"M1490 1322q0 40-28 68l-136 136q-28 28-68 28t-68-28l-294-294-294 294q-28 28-68 28t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 294 294-294q28-28 68-28t68 28l136 136q28 28 28 68t-28 68l-294 294 294 294q28 28 28 68z"},"childNodes":[],"isSVG":true,"id":827}},{"parentId":819,"previousId":825,"nextId":null,"node":{"type":2,"tagName":"a","attributes":{"data-export":"settingsButton","class":"right","href":"javascript:void(0)"},"childNodes":[],"id":828}},{"parentId":828,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"svg","attributes":{"width":"14","height":"14","viewBox":"0 0 1792 1792","xmlns":"http://www.w3.org/2000/svg"},"childNodes":[],"isSVG":true,"id":829}},{"parentId":829,"previousId":null,"nextId":null,"node":{"type":2,"tagName":"path","attributes":{"d":"M1152 896q0-106-75-181t-181-75-181 75-75 181 75 181 181 75 181-75 75-181zm512-109v222q0 12-8 23t-20 13l-185 28q-19 54-39 91 35 50 107 138 10 12 10 25t-9 23q-27 37-99 108t-94 71q-12 0-26-9l-138-108q-44 23-91 38-16 136-29 186-7 28-36 28h-222q-14 0-24.5-8.5t-11.5-21.5l-28-184q-49-16-90-37l-141 107q-10 9-25 9-14 0-25-11-126-114-165-168-7-10-7-23 0-12 8-23 15-21 51-66.5t54-70.5q-27-50-41-99l-183-27q-13-2-21-12.5t-8-23.5v-222q0-12 8-23t19-13l186-28q14-46 39-92-40-57-107-138-10-12-10-24 0-10 9-23 26-36 98.5-107.5t94.5-71.5q13 0 26 10l138 107q44-23 91-38 16-136 29-186 7-28 36-28h222q14 0 24.5 8.5t11.5 21.5l28 184q49 16 90 37l142-107q9-9 24-9 13 0 25 10 129 119 165 170 7 8 7 22 0 12-8 23-15 21-51 66.5t-54 70.5q26 50 41 98l183 28q13 2 21 12.5t8 23.5z"},"childNodes":[],"isSVG":true,"id":830}}]},"timestamp":1544756837829,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":3,"id":55,"x":0,"y":0},"timestamp":1544756837834,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":3,"id":61,"x":0,"y":0},"timestamp":1544756837934,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756838290,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756838819,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":813,"value":"1"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756838830,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":106,"y":25,"id":820,"timeOffset":0}]},"timestamp":1544756838898,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756839350,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":114,"y":35,"id":34,"timeOffset":-475},{"x":130,"y":64,"id":466,"timeOffset":-441},{"x":151,"y":108,"id":484,"timeOffset":-408},{"x":221,"y":209,"id":532,"timeOffset":-375},{"x":294,"y":278,"id":547,"timeOffset":-341},{"x":368,"y":329,"id":565,"timeOffset":-308},{"x":391,"y":336,"id":565,"timeOffset":-48},{"x":439,"y":337,"id":565,"timeOffset":-24}]},"timestamp":1544756839399,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":813,"value":"2"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756839830,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":""}}],"removes":[],"adds":[]},"timestamp":1544756839879,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":585,"y":325,"id":565,"timeOffset":-491},{"x":729,"y":308,"id":556,"timeOffset":-459},{"x":830,"y":304,"id":556,"timeOffset":-425},{"x":888,"y":308,"id":556,"timeOffset":-391},{"x":896,"y":308,"id":556,"timeOffset":-17}]},"timestamp":1544756839899,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":1,"positions":[{"x":918,"y":309,"id":556,"timeOffset":-493},{"x":959,"y":310,"id":556,"timeOffset":-459},{"x":990,"y":311,"id":556,"timeOffset":-426},{"x":1032,"y":315,"id":556,"timeOffset":-393},{"x":1060,"y":323,"id":565,"timeOffset":-359},{"x":1101,"y":344,"id":583,"timeOffset":-326},{"x":1132,"y":363,"id":583,"timeOffset":-293},{"x":1154,"y":373,"id":55,"timeOffset":-259}]},"timestamp":1544756840400,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":69,"attributes":{"style":"visibility: hidden;"}}],"removes":[],"adds":[]},"timestamp":1544756840410,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":2,"type":6,"id":54},"timestamp":1544756840500,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[],"attributes":[{"id":52,"attributes":{"class":"CodeMirror cm-s-light"}}],"removes":[],"adds":[]},"timestamp":1544756840501,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":813,"value":"3"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756840830,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":813,"value":"4"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756841830,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":813,"value":"5"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756842830,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":813,"value":"6"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756843831,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":813,"value":"7"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756844831,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":813,"value":"8"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756845831,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":813,"value":"9"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756846830,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"},{"type":3,"data":{"source":0,"texts":[{"id":813,"value":"10"}],"attributes":[],"removes":[],"adds":[]},"timestamp":1544756847830,"sessionId":"8dda0c07-b950-47ec-a5ea-3d25746042bf"}] diff --git a/packages/rrweb-player/public/global.css b/packages/rrweb-player/public/global.css new file mode 100644 index 00000000..c30acb60 --- /dev/null +++ b/packages/rrweb-player/public/global.css @@ -0,0 +1,12 @@ +html, +body { + position: relative; + width: 100%; + height: 100%; +} + +body { + box-sizing: border-box; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif; +} diff --git a/packages/rrweb-player/public/index.html b/packages/rrweb-player/public/index.html new file mode 100644 index 00000000..032a9068 --- /dev/null +++ b/packages/rrweb-player/public/index.html @@ -0,0 +1,36 @@ + + + + + + + Svelte app + + + + + + + + + + + diff --git a/packages/rrweb-player/rollup.config.js b/packages/rrweb-player/rollup.config.js new file mode 100644 index 00000000..313b8e11 --- /dev/null +++ b/packages/rrweb-player/rollup.config.js @@ -0,0 +1,110 @@ +import svelte from 'rollup-plugin-svelte'; +import resolve from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import livereload from 'rollup-plugin-livereload'; +import { terser } from 'rollup-plugin-terser'; +import sveltePreprocess from 'svelte-preprocess'; +import typescript from '@rollup/plugin-typescript'; +import pkg from './package.json'; +import css from 'rollup-plugin-css-only'; + +// eslint-disable-next-line no-undef +const production = !process.env.ROLLUP_WATCH; + +const entries = (production + ? [ + { file: pkg.module, format: 'es', css: false }, + { file: pkg.main, format: 'cjs', css: false }, + { + file: pkg.unpkg, + format: 'iife', + name: 'rrwebPlayer', + css: 'style.css', + }, + ] + : [] +).concat([ + { + file: 'public/bundle.js', + format: 'iife', + name: 'rrwebPlayer', + css: 'bundle.css', + }, +]); + +export default entries.map((output) => ({ + input: 'src/main.ts', + output: { + file: output.file, + format: output.format, + name: output.name, + sourcemap: true, + exports: 'auto', + }, + plugins: [ + svelte({ + compilerOptions: { + // enable run-time checks when not in production + dev: !production, + }, + preprocess: sveltePreprocess({ + postcss: { + // eslint-disable-next-line no-undef + plugins: [require('postcss-easy-import')], + }, + }), + }), + + // If you have external dependencies installed from + // npm, you'll most likely need these plugins. In + // some cases you'll need additional configuration — + // consult the documentation for details: + // https://github.com/rollup/rollup-plugin-commonjs + resolve({ + browser: true, + dedupe: ['svelte'], + }), + commonjs(), + + typescript(), + + css({ + // we'll extract any component CSS out into + // a separate file — better for performance + output: output.css, + }), + + // In dev mode, call `npm run start` once + // the bundle has been generated + !production && serve(), + + // Watch the `public` directory and refresh the + // browser on changes when not in production + !production && livereload('public'), + + // If we're building for production (npm run build + // instead of npm run dev), minify + production && terser(), + ], + watch: { + clearScreen: false, + }, +})); + +function serve() { + let started = false; + + return { + writeBundle() { + if (!started) { + started = true; + + // eslint-disable-next-line @typescript-eslint/no-var-requires, no-undef + require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], { + stdio: ['ignore', 'inherit', 'inherit'], + shell: true, + }); + } + }, + }; +} diff --git a/packages/rrweb-player/src/Controller.svelte b/packages/rrweb-player/src/Controller.svelte new file mode 100644 index 00000000..e7e430e0 --- /dev/null +++ b/packages/rrweb-player/src/Controller.svelte @@ -0,0 +1,433 @@ + + + + +{#if showController} +
+
+ {formatTime(currentTime)} +
handleProgressClick(event)}> +
+ {#each customEvents as event} +
+ {/each} + +
+
+ {formatTime(meta.totalTime)} +
+
+ + {#each speedOption as s} + + {/each} + + +
+
+{/if} diff --git a/packages/rrweb-player/src/Player.svelte b/packages/rrweb-player/src/Player.svelte new file mode 100644 index 00000000..1d5583c9 --- /dev/null +++ b/packages/rrweb-player/src/Player.svelte @@ -0,0 +1,222 @@ + + + + +
+
+ {#if replayer} + toggleFullscreen()} /> + {/if} +
diff --git a/packages/rrweb-player/src/components/Switch.svelte b/packages/rrweb-player/src/components/Switch.svelte new file mode 100644 index 00000000..9aa68624 --- /dev/null +++ b/packages/rrweb-player/src/components/Switch.svelte @@ -0,0 +1,79 @@ + + + + +
+ +
diff --git a/packages/rrweb-player/src/main.ts b/packages/rrweb-player/src/main.ts new file mode 100644 index 00000000..341e39aa --- /dev/null +++ b/packages/rrweb-player/src/main.ts @@ -0,0 +1,22 @@ +import type { eventWithTime } from 'rrweb/typings/types'; +import _Player from './Player.svelte'; + +type PlayerProps = { + events: eventWithTime[]; +}; + +class Player extends _Player { + constructor(options: { + target: Element; + props: PlayerProps; + // for compatibility + data?: PlayerProps; + }) { + super({ + target: options.target, + props: options.data || options.props, + }); + } +} + +export default Player; diff --git a/packages/rrweb-player/src/utils.ts b/packages/rrweb-player/src/utils.ts new file mode 100644 index 00000000..b95f38e9 --- /dev/null +++ b/packages/rrweb-player/src/utils.ts @@ -0,0 +1,135 @@ +declare global { + interface Document { + mozExitFullscreen: Document['exitFullscreen']; + webkitExitFullscreen: Document['exitFullscreen']; + msExitFullscreen: Document['exitFullscreen']; + webkitIsFullScreen: Document['fullscreen']; + mozFullScreen: Document['fullscreen']; + msFullscreenElement: Document['fullscreen']; + } + + interface HTMLElement { + mozRequestFullScreen: Element['requestFullscreen']; + webkitRequestFullscreen: Element['requestFullscreen']; + msRequestFullscreen: Element['requestFullscreen']; + } +} + +export function inlineCss(cssObj: Record): string { + let style = ''; + Object.keys(cssObj).forEach((key) => { + style += `${key}: ${cssObj[key]};`; + }); + return style; +} + +function padZero(num: number, len = 2): string { + let str = String(num); + const threshold = Math.pow(10, len - 1); + if (num < threshold) { + while (String(threshold).length > str.length) { + str = '0' + num; + } + } + return str; +} + +const SECOND = 1000; +const MINUTE = 60 * SECOND; +const HOUR = 60 * MINUTE; +export function formatTime(ms: number): string { + if (ms <= 0) { + return '00:00'; + } + const hour = Math.floor(ms / HOUR); + ms = ms % HOUR; + const minute = Math.floor(ms / MINUTE); + ms = ms % MINUTE; + const second = Math.floor(ms / SECOND); + if (hour) { + return `${padZero(hour)}:${padZero(minute)}:${padZero(second)}`; + } + return `${padZero(minute)}:${padZero(second)}`; +} + +export function openFullscreen(el: HTMLElement): Promise { + if (el.requestFullscreen) { + return el.requestFullscreen(); + } else if (el.mozRequestFullScreen) { + /* Firefox */ + return el.mozRequestFullScreen(); + } else if (el.webkitRequestFullscreen) { + /* Chrome, Safari and Opera */ + return el.webkitRequestFullscreen(); + } else if (el.msRequestFullscreen) { + /* IE/Edge */ + return el.msRequestFullscreen(); + } +} + +export function exitFullscreen(): Promise { + if (document.exitFullscreen) { + return document.exitFullscreen(); + } else if (document.mozExitFullscreen) { + /* Firefox */ + return document.mozExitFullscreen(); + } else if (document.webkitExitFullscreen) { + /* Chrome, Safari and Opera */ + return document.webkitExitFullscreen(); + } else if (document.msExitFullscreen) { + /* IE/Edge */ + return document.msExitFullscreen(); + } +} + +export function isFullscreen(): boolean { + return ( + document.fullscreen || + document.webkitIsFullScreen || + document.mozFullScreen || + document.msFullscreenElement + ); +} + +export function onFullscreenChange(handler: () => unknown): () => void { + document.addEventListener('fullscreenchange', handler); + document.addEventListener('webkitfullscreenchange', handler); + document.addEventListener('mozfullscreenchange', handler); + document.addEventListener('MSFullscreenChange', handler); + + return () => { + document.removeEventListener('fullscreenchange', handler); + document.removeEventListener('webkitfullscreenchange', handler); + document.removeEventListener('mozfullscreenchange', handler); + document.removeEventListener('MSFullscreenChange', handler); + }; +} + +export function typeOf( + obj: unknown, +): + | 'boolean' + | 'number' + | 'string' + | 'function' + | 'array' + | 'date' + | 'regExp' + | 'undefined' + | 'null' + | 'object' { + const toString = Object.prototype.toString; + const map = { + '[object Boolean]': 'boolean', + '[object Number]': 'number', + '[object String]': 'string', + '[object Function]': 'function', + '[object Array]': 'array', + '[object Date]': 'date', + '[object RegExp]': 'regExp', + '[object Undefined]': 'undefined', + '[object Null]': 'null', + '[object Object]': 'object', + }; + return map[toString.call(obj)]; +} diff --git a/packages/rrweb-player/tsconfig.json b/packages/rrweb-player/tsconfig.json new file mode 100644 index 00000000..77db65da --- /dev/null +++ b/packages/rrweb-player/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "include": ["src/**/*"], + "exclude": ["node_modules/*", "__sapper__/*", "public/*"], +} \ No newline at end of file diff --git a/packages/rrweb-player/typings/index.d.ts b/packages/rrweb-player/typings/index.d.ts new file mode 100644 index 00000000..74124481 --- /dev/null +++ b/packages/rrweb-player/typings/index.d.ts @@ -0,0 +1,36 @@ +import { eventWithTime, playerConfig } from 'rrweb/typings/types'; +import { Replayer, mirror } from 'rrweb'; +import { SvelteComponent } from 'svelte'; + +export type RRwebPlayerOptions = { + target: HTMLElement; + props: { + events: eventWithTime[]; + width?: number; + height?: number; + autoPlay?: boolean; + speed?: number; + speedOption?: number[]; + showController?: boolean; + tags?: Record; + } & Partial; +}; + +export default class rrwebPlayer extends SvelteComponent { + constructor(options: RRwebPlayerOptions); + + addEventListener(event: string, handler: (params: any) => unknown): void; + + addEvent(event: eventWithTime): void; + getMetaData: Replayer['getMetaData']; + getReplayer: () => Replayer; + getMirror: () => typeof mirror; + + toggle: () => void; + setSpeed: (speed: number) => void; + toggleSkipInactive: () => void; + triggerResize: () => void; + play: () => void; + pause: () => void; + goto: (timeOffset: number, play?: boolean) => void; +} diff --git a/packages/rrweb-snapshot/.gitignore b/packages/rrweb-snapshot/.gitignore new file mode 100644 index 00000000..3365d492 --- /dev/null +++ b/packages/rrweb-snapshot/.gitignore @@ -0,0 +1,8 @@ +.vscode +node_modules +package-lock.json +build +dist +es +lib +temp diff --git a/packages/rrweb-snapshot/.release-it.json b/packages/rrweb-snapshot/.release-it.json new file mode 100644 index 00000000..e76cbd8e --- /dev/null +++ b/packages/rrweb-snapshot/.release-it.json @@ -0,0 +1,9 @@ +{ + "non-interactive": true, + "hooks": { + "before:init": ["npm run bundle", "npm run typings"] + }, + "git": { + "requireCleanWorkingDir": false + } +} diff --git a/packages/rrweb-snapshot/README.md b/packages/rrweb-snapshot/README.md new file mode 100644 index 00000000..934f9034 --- /dev/null +++ b/packages/rrweb-snapshot/README.md @@ -0,0 +1,40 @@ +# rrweb-snapshot + +[![Build Status](https://travis-ci.org/rrweb-io/rrweb.svg?branch=master)](https://travis-ci.org/rrweb-io/rrweb) [![Join the chat at slack](https://img.shields.io/badge/slack-@rrweb-teal.svg?logo=slack)](https://join.slack.com/t/rrweb/shared_invite/zt-siwoc6hx-uWay3s2wyG8t5GpZVb8rWg) + +Snapshot the DOM into a stateful and serializable data structure. +Also, provide the ability to rebuild the DOM via snapshot. + +## API + +This module export following methods: + +### snapshot + +`snapshot` will traverse the DOM and return a stateful and serializable data structure which can represent the current DOM **view**. + +There are several things will be done during snapshot: + +1. Inline some DOM states into HTML attributes, e.g, HTMLInputElement's value. +2. Turn script tags into `noscript` tags to avoid scripts being executed. +3. Try to inline stylesheets to make sure local stylesheets can be used. +4. Make relative paths in href, src, CSS to be absolute paths. +5. Give an id to each Node, and return the id node map when snapshot finished. + +#### rebuild + +`rebuild` will build the DOM according to the taken snapshot. + +There are several things will be done during rebuild: + +1. Add data-rrid attribute if the Node is an Element. +2. Create some extra DOM node like text node to place inline CSS and some states. +3. Add data-extra-child-index attribute if Node has some extra child DOM. + +#### serializeNodeWithId + +`serializeNodeWithId` can serialize a node into snapshot format with id. + +#### buildNodeWithSN + +`buildNodeWithSN` will build DOM from serialized node and store serialized information in `__sn` property. diff --git a/packages/rrweb-snapshot/package.json b/packages/rrweb-snapshot/package.json new file mode 100644 index 00000000..1025d7c3 --- /dev/null +++ b/packages/rrweb-snapshot/package.json @@ -0,0 +1,57 @@ +{ + "name": "rrweb-snapshot", + "version": "1.1.7", + "description": "rrweb's component to take a snapshot of DOM, aka DOM serializer", + "scripts": { + "prepare": "npm run prepack", + "prepack": "npm run bundle && npm run typings", + "test": "cross-env TS_NODE_CACHE=false TS_NODE_FILES=true mocha -r ts-node/register test/**/*.ts", + "bundle": "rollup --config", + "typings": "tsc -d --declarationDir typings" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/rrweb-io/rrweb.git" + }, + "keywords": [ + "rrweb", + "snapshot", + "DOM" + ], + "main": "lib/rrweb-snapshot.js", + "module": "es/rrweb-snapshot.js", + "unpkg": "dist/rrweb-snapshot.js", + "typings": "typings/index.d.ts", + "files": [ + "dist", + "lib", + "es", + "typings" + ], + "author": "yanzhen@smartx.com", + "license": "MIT", + "bugs": { + "url": "https://github.com/rrweb-io/rrweb/issues" + }, + "homepage": "https://github.com/rrweb-io/rrweb/tree/master/packages/rrweb-snapshot#readme", + "devDependencies": { + "@types/chai": "^4.1.4", + "@types/jsdom": "^16.2.4", + "@types/mocha": "^5.2.5", + "@types/node": "^10.11.3", + "@types/puppeteer": "^1.12.4", + "chai": "^4.1.2", + "cross-env": "^5.2.0", + "jest-snapshot": "^23.6.0", + "jsdom": "^16.4.0", + "mocha": "^5.2.0", + "puppeteer": "^1.15.0", + "rollup": "^0.66.4", + "rollup-plugin-terser": "^3.0.0", + "rollup-plugin-typescript": "^1.0.0", + "ts-node": "^7.0.1", + "tslib": "^1.9.3", + "tslint": "^4.5.1", + "typescript": "^3.4.1" + } +} diff --git a/packages/rrweb-snapshot/rollup.config.js b/packages/rrweb-snapshot/rollup.config.js new file mode 100644 index 00000000..942cc62f --- /dev/null +++ b/packages/rrweb-snapshot/rollup.config.js @@ -0,0 +1,67 @@ +import typescript from 'rollup-plugin-typescript'; +import { terser } from 'rollup-plugin-terser'; +import pkg from './package.json'; + +function toMinPath(path) { + return path.replace(/\.js$/, '.min.js'); +} + +export default [ + // browser + { + input: './src/index.ts', + plugins: [typescript()], + output: [ + { + name: 'rrwebSnapshot', + format: 'iife', + file: pkg.unpkg, + }, + ], + }, + { + input: './src/index.ts', + plugins: [typescript(), terser()], + output: [ + { + name: 'rrwebSnapshot', + format: 'iife', + file: toMinPath(pkg.unpkg), + sourcemap: true, + }, + ], + }, + // CommonJS + { + input: './src/index.ts', + plugins: [typescript()], + output: [ + { + format: 'cjs', + file: pkg.main, + }, + ], + }, + // ES module + { + input: './src/index.ts', + plugins: [typescript()], + output: [ + { + format: 'esm', + file: pkg.module, + }, + ], + }, + { + input: './src/index.ts', + plugins: [typescript(), terser()], + output: [ + { + format: 'esm', + file: toMinPath(pkg.module), + sourcemap: true, + }, + ], + }, +]; diff --git a/packages/rrweb-snapshot/src/css.ts b/packages/rrweb-snapshot/src/css.ts new file mode 100644 index 00000000..950ec0b4 --- /dev/null +++ b/packages/rrweb-snapshot/src/css.ts @@ -0,0 +1,909 @@ +/** + * This file is a fork of https://github.com/reworkcss/css/blob/master/lib/parse/index.js + * I fork it because: + * 1. The css library was built for node.js which does not have tree-shaking supports. + * 2. Rewrites into typescript give us a better type interface. + */ + +/* tslint:disable no-conditional-assignment interface-name no-shadowed-variable */ + +export interface ParserOptions { + /** Silently fail on parse errors */ + silent?: boolean; + /** + * The path to the file containing css. + * Makes errors and source maps more helpful, by letting them know where code comes from. + */ + source?: string; +} + +/** + * Error thrown during parsing. + */ +export interface ParserError { + /** The full error message with the source position. */ + message?: string; + /** The error message without position. */ + reason?: string; + /** The value of options.source if passed to css.parse. Otherwise undefined. */ + filename?: string; + line?: number; + column?: number; + /** The portion of code that couldn't be parsed. */ + source?: string; +} + +export interface Loc { + line?: number; + column?: number; +} + +/** + * Base AST Tree Node. + */ +export interface Node { + /** The possible values are the ones listed in the Types section on https://github.com/reworkcss/css page. */ + type?: string; + /** A reference to the parent node, or null if the node has no parent. */ + parent?: Node; + /** Information about the position in the source string that corresponds to the node. */ + position?: { + start?: Loc; + end?: Loc; + /** The value of options.source if passed to css.parse. Otherwise undefined. */ + source?: string; + /** The full source string passed to css.parse. */ + content?: string; + }; +} + +export interface Rule extends Node { + /** The list of selectors of the rule, split on commas. Each selector is trimmed from whitespace and comments. */ + selectors?: string[]; + /** Array of nodes with the types declaration and comment. */ + declarations?: Array; +} + +export interface Declaration extends Node { + /** The property name, trimmed from whitespace and comments. May not be empty. */ + property?: string; + /** The value of the property, trimmed from whitespace and comments. Empty values are allowed. */ + value?: string; +} + +/** + * A rule-level or declaration-level comment. Comments inside selectors, properties and values etc. are lost. + */ +export interface Comment extends Node { + comment?: string; +} + +/** + * The @charset at-rule. + */ +export interface Charset extends Node { + /** The part following @charset. */ + charset?: string; +} + +/** + * The @custom-media at-rule + */ +export interface CustomMedia extends Node { + /** The ---prefixed name. */ + name?: string; + /** The part following the name. */ + media?: string; +} + +/** + * The @document at-rule. + */ +export interface Document extends Node { + /** The part following @document. */ + document?: string; + /** The vendor prefix in @document, or undefined if there is none. */ + vendor?: string; + /** Array of nodes with the types rule, comment and any of the at-rule types. */ + rules?: Array; +} + +/** + * The @font-face at-rule. + */ +export interface FontFace extends Node { + /** Array of nodes with the types declaration and comment. */ + declarations?: Array; +} + +/** + * The @host at-rule. + */ +export interface Host extends Node { + /** Array of nodes with the types rule, comment and any of the at-rule types. */ + rules?: Array; +} + +/** + * The @import at-rule. + */ +export interface Import extends Node { + /** The part following @import. */ + import?: string; +} + +/** + * The @keyframes at-rule. + */ +export interface KeyFrames extends Node { + /** The name of the keyframes rule. */ + name?: string; + /** The vendor prefix in @keyframes, or undefined if there is none. */ + vendor?: string; + /** Array of nodes with the types keyframe and comment. */ + keyframes?: Array; +} + +export interface KeyFrame extends Node { + /** The list of "selectors" of the keyframe rule, split on commas. Each “selector” is trimmed from whitespace. */ + values?: string[]; + /** Array of nodes with the types declaration and comment. */ + declarations?: Array; +} + +/** + * The @media at-rule. + */ +export interface Media extends Node { + /** The part following @media. */ + media?: string; + /** Array of nodes with the types rule, comment and any of the at-rule types. */ + rules?: Array; +} + +/** + * The @namespace at-rule. + */ +export interface Namespace extends Node { + /** The part following @namespace. */ + namespace?: string; +} + +/** + * The @page at-rule. + */ +export interface Page extends Node { + /** The list of selectors of the rule, split on commas. Each selector is trimmed from whitespace and comments. */ + selectors?: string[]; + /** Array of nodes with the types declaration and comment. */ + declarations?: Array; +} + +/** + * The @supports at-rule. + */ +export interface Supports extends Node { + /** The part following @supports. */ + supports?: string; + /** Array of nodes with the types rule, comment and any of the at-rule types. */ + rules?: Array; +} + +/** All at-rules. */ +export type AtRule = + | Charset + | CustomMedia + | Document + | FontFace + | Host + | Import + | KeyFrames + | Media + | Namespace + | Page + | Supports; + +/** + * A collection of rules + */ +export interface StyleRules { + source?: string; + /** Array of nodes with the types rule, comment and any of the at-rule types. */ + rules: Array; + /** Array of Errors. Errors collected during parsing when option silent is true. */ + parsingErrors?: ParserError[]; +} + +/** + * The root node returned by css.parse. + */ +export interface Stylesheet extends Node { + stylesheet?: StyleRules; +} + +// http://www.w3.org/TR/CSS21/grammar.html +// https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027 +const commentre = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//g; + +export function parse(css: string, options: ParserOptions = {}) { + /** + * Positional. + */ + + let lineno = 1; + let column = 1; + + /** + * Update lineno and column based on `str`. + */ + + function updatePosition(str: string) { + const lines = str.match(/\n/g); + if (lines) { + lineno += lines.length; + } + let i = str.lastIndexOf('\n'); + column = i === -1 ? column + str.length : str.length - i; + } + + /** + * Mark position and patch `node.position`. + */ + + function position() { + const start = { line: lineno, column }; + return ( + node: Rule | Declaration | Comment | AtRule | Stylesheet | KeyFrame, + ) => { + node.position = new Position(start); + whitespace(); + return node; + }; + } + + /** + * Store position information for a node + */ + + class Position { + public content!: string; + public start!: Loc; + public end!: Loc; + public source?: string; + + constructor(start: Loc) { + this.start = start; + this.end = { line: lineno, column }; + this.source = options.source; + } + } + + /** + * Non-enumerable source string + */ + + Position.prototype.content = css; + + const errorsList: ParserError[] = []; + + function error(msg: string) { + const err = new Error( + options.source + ':' + lineno + ':' + column + ': ' + msg, + ) as ParserError; + err.reason = msg; + err.filename = options.source; + err.line = lineno; + err.column = column; + err.source = css; + + if (options.silent) { + errorsList.push(err); + } else { + throw err; + } + } + + /** + * Parse stylesheet. + */ + + function stylesheet(): Stylesheet { + const rulesList = rules(); + + return { + type: 'stylesheet', + stylesheet: { + source: options.source, + rules: rulesList, + parsingErrors: errorsList, + }, + }; + } + + /** + * Opening brace. + */ + + function open() { + return match(/^{\s*/); + } + + /** + * Closing brace. + */ + + function close() { + return match(/^}/); + } + + /** + * Parse ruleset. + */ + + function rules() { + let node: Rule | void; + const rules: Rule[] = []; + whitespace(); + comments(rules); + while (css.length && css.charAt(0) !== '}' && (node = atrule() || rule())) { + if (node !== false) { + rules.push(node); + comments(rules); + } + } + return rules; + } + + /** + * Match `re` and return captures. + */ + + function match(re: RegExp) { + const m = re.exec(css); + if (!m) { + return; + } + const str = m[0]; + updatePosition(str); + css = css.slice(str.length); + return m; + } + + /** + * Parse whitespace. + */ + + function whitespace() { + match(/^\s*/); + } + + /** + * Parse comments; + */ + + function comments(rules: Rule[] = []) { + let c: Comment | void; + while ((c = comment())) { + if (c !== false) { + rules.push(c); + } + c = comment(); + } + return rules; + } + + /** + * Parse comment. + */ + + function comment() { + const pos = position(); + if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) { + return; + } + + let i = 2; + while ( + '' !== css.charAt(i) && + ('*' !== css.charAt(i) || '/' !== css.charAt(i + 1)) + ) { + ++i; + } + i += 2; + + if ('' === css.charAt(i - 1)) { + return error('End of comment missing'); + } + + const str = css.slice(2, i - 2); + column += 2; + updatePosition(str); + css = css.slice(i); + column += 2; + + return pos({ + type: 'comment', + comment: str, + }); + } + + /** + * Parse selector. + */ + + function selector() { + const m = match(/^([^{]+)/); + if (!m) { + return; + } + /* @fix Remove all comments from selectors + * http://ostermiller.org/findcomment.html */ + return trim(m[0]) + .replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/g, '') + .replace(/"(?:\\"|[^"])*"|'(?:\\'|[^'])*'/g, (m) => { + return m.replace(/,/g, '\u200C'); + }) + .split(/\s*(?![^(]*\)),\s*/) + .map((s) => { + return s.replace(/\u200C/g, ','); + }); + } + + /** + * Parse declaration. + */ + + function declaration(): Declaration | void | never { + const pos = position(); + + // prop + let propMatch = match(/^(\*?[-#\/\*\\\w]+(\[[0-9a-z_-]+\])?)\s*/); + if (!propMatch) { + return; + } + const prop = trim(propMatch[0]); + + // : + if (!match(/^:\s*/)) { + return error(`property missing ':'`); + } + + // val + const val = match(/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^\)]*?\)|[^};])+)/); + + const ret = pos({ + type: 'declaration', + property: prop.replace(commentre, ''), + value: val ? trim(val[0]).replace(commentre, '') : '', + }); + + // ; + match(/^[;\s]*/); + + return ret; + } + + /** + * Parse declarations. + */ + + function declarations() { + const decls: Array = []; + + if (!open()) { + return error(`missing '{'`); + } + comments(decls); + + // declarations + let decl; + while ((decl = declaration())) { + if ((decl as unknown) !== false) { + decls.push(decl); + comments(decls); + } + decl = declaration(); + } + + if (!close()) { + return error(`missing '}'`); + } + return decls; + } + + /** + * Parse keyframe. + */ + + function keyframe() { + let m; + const vals = []; + const pos = position(); + + while ((m = match(/^((\d+\.\d+|\.\d+|\d+)%?|[a-z]+)\s*/))) { + vals.push(m[1]); + match(/^,\s*/); + } + + if (!vals.length) { + return; + } + + return pos({ + type: 'keyframe', + values: vals, + declarations: declarations() as Declaration[], + }); + } + + /** + * Parse keyframes. + */ + + function atkeyframes() { + const pos = position(); + let m = match(/^@([-\w]+)?keyframes\s*/); + + if (!m) { + return; + } + const vendor = m[1]; + + // identifier + m = match(/^([-\w]+)\s*/); + if (!m) { + return error('@keyframes missing name'); + } + const name = m[1]; + + if (!open()) { + return error(`@keyframes missing '{'`); + } + + let frame; + let frames = comments(); + while ((frame = keyframe())) { + frames.push(frame); + frames = frames.concat(comments()); + } + + if (!close()) { + return error(`@keyframes missing '}'`); + } + + return pos({ + type: 'keyframes', + name, + vendor, + keyframes: frames, + }); + } + + /** + * Parse supports. + */ + + function atsupports() { + const pos = position(); + const m = match(/^@supports *([^{]+)/); + + if (!m) { + return; + } + const supports = trim(m[1]); + + if (!open()) { + return error(`@supports missing '{'`); + } + + const style = comments().concat(rules()); + + if (!close()) { + return error(`@supports missing '}'`); + } + + return pos({ + type: 'supports', + supports, + rules: style, + }); + } + + /** + * Parse host. + */ + + function athost() { + const pos = position(); + const m = match(/^@host\s*/); + + if (!m) { + return; + } + + if (!open()) { + return error(`@host missing '{'`); + } + + const style = comments().concat(rules()); + + if (!close()) { + return error(`@host missing '}'`); + } + + return pos({ + type: 'host', + rules: style, + }); + } + + /** + * Parse media. + */ + + function atmedia() { + const pos = position(); + const m = match(/^@media *([^{]+)/); + + if (!m) { + return; + } + const media = trim(m[1]); + + if (!open()) { + return error(`@media missing '{'`); + } + + const style = comments().concat(rules()); + + if (!close()) { + return error(`@media missing '}'`); + } + + return pos({ + type: 'media', + media, + rules: style, + }); + } + + /** + * Parse custom-media. + */ + + function atcustommedia() { + const pos = position(); + const m = match(/^@custom-media\s+(--[^\s]+)\s*([^{;]+);/); + if (!m) { + return; + } + + return pos({ + type: 'custom-media', + name: trim(m[1]), + media: trim(m[2]), + }); + } + + /** + * Parse paged media. + */ + + function atpage() { + const pos = position(); + const m = match(/^@page */); + if (!m) { + return; + } + + const sel = selector() || []; + + if (!open()) { + return error(`@page missing '{'`); + } + let decls = comments(); + + // declarations + let decl; + while ((decl = declaration())) { + decls.push(decl); + decls = decls.concat(comments()); + } + + if (!close()) { + return error(`@page missing '}'`); + } + + return pos({ + type: 'page', + selectors: sel, + declarations: decls, + }); + } + + /** + * Parse document. + */ + + function atdocument() { + const pos = position(); + const m = match(/^@([-\w]+)?document *([^{]+)/); + if (!m) { + return; + } + + const vendor = trim(m[1]); + const doc = trim(m[2]); + + if (!open()) { + return error(`@document missing '{'`); + } + + const style = comments().concat(rules()); + + if (!close()) { + return error(`@document missing '}'`); + } + + return pos({ + type: 'document', + document: doc, + vendor, + rules: style, + }); + } + + /** + * Parse font-face. + */ + + function atfontface() { + const pos = position(); + const m = match(/^@font-face\s*/); + if (!m) { + return; + } + + if (!open()) { + return error(`@font-face missing '{'`); + } + let decls = comments(); + + // declarations + let decl; + while ((decl = declaration())) { + decls.push(decl); + decls = decls.concat(comments()); + } + + if (!close()) { + return error(`@font-face missing '}'`); + } + + return pos({ + type: 'font-face', + declarations: decls, + }); + } + + /** + * Parse import + */ + + const atimport = _compileAtrule('import'); + + /** + * Parse charset + */ + + const atcharset = _compileAtrule('charset'); + + /** + * Parse namespace + */ + + const atnamespace = _compileAtrule('namespace'); + + /** + * Parse non-block at-rules + */ + + function _compileAtrule(name: string) { + const re = new RegExp('^@' + name + '\\s*([^;]+);'); + return () => { + const pos = position(); + const m = match(re); + if (!m) { + return; + } + const ret: Record = { type: name }; + ret[name] = m[1].trim(); + return pos(ret); + }; + } + + /** + * Parse at rule. + */ + + function atrule() { + if (css[0] !== '@') { + return; + } + + return ( + atkeyframes() || + atmedia() || + atcustommedia() || + atsupports() || + atimport() || + atcharset() || + atnamespace() || + atdocument() || + atpage() || + athost() || + atfontface() + ); + } + + /** + * Parse rule. + */ + + function rule() { + const pos = position(); + const sel = selector(); + + if (!sel) { + return error('selector missing'); + } + comments(); + + return pos({ + type: 'rule', + selectors: sel, + declarations: declarations() as Declaration[], + }); + } + + return addParent(stylesheet()); +} + +/** + * Trim `str`. + */ + +function trim(str: string) { + return str ? str.replace(/^\s+|\s+$/g, '') : ''; +} + +/** + * Adds non-enumerable parent node reference to each node. + */ + +function addParent(obj: Stylesheet, parent?: Stylesheet) { + const isNode = obj && typeof obj.type === 'string'; + const childParent = isNode ? obj : parent; + + for (const k of Object.keys(obj)) { + const value = obj[k as keyof Stylesheet]; + if (Array.isArray(value)) { + value.forEach((v) => { + addParent(v, childParent); + }); + } else if (value && typeof value === 'object') { + addParent((value as unknown) as Stylesheet, childParent); + } + } + + if (isNode) { + Object.defineProperty(obj, 'parent', { + configurable: true, + writable: true, + enumerable: false, + value: parent || null, + }); + } + + return obj; +} diff --git a/packages/rrweb-snapshot/src/index.ts b/packages/rrweb-snapshot/src/index.ts new file mode 100644 index 00000000..8335768f --- /dev/null +++ b/packages/rrweb-snapshot/src/index.ts @@ -0,0 +1,24 @@ +import snapshot, { + serializeNodeWithId, + transformAttribute, + visitSnapshot, + cleanupSnapshot, + needMaskingText, + IGNORED_NODE, +} from './snapshot'; +import rebuild, { buildNodeWithSN, addHoverClass } from './rebuild'; +export * from './types'; +export * from './utils'; + +export { + snapshot, + serializeNodeWithId, + rebuild, + buildNodeWithSN, + addHoverClass, + transformAttribute, + visitSnapshot, + cleanupSnapshot, + needMaskingText, + IGNORED_NODE, +}; diff --git a/packages/rrweb-snapshot/src/rebuild.ts b/packages/rrweb-snapshot/src/rebuild.ts new file mode 100644 index 00000000..a0778a0c --- /dev/null +++ b/packages/rrweb-snapshot/src/rebuild.ts @@ -0,0 +1,392 @@ +import { parse } from './css'; +import { + serializedNodeWithId, + NodeType, + tagMap, + elementNode, + idNodeMap, + INode, +} from './types'; +import { isElement } from './utils'; + +const tagMap: tagMap = { + script: 'noscript', + // camel case svg element tag names + altglyph: 'altGlyph', + altglyphdef: 'altGlyphDef', + altglyphitem: 'altGlyphItem', + animatecolor: 'animateColor', + animatemotion: 'animateMotion', + animatetransform: 'animateTransform', + clippath: 'clipPath', + feblend: 'feBlend', + fecolormatrix: 'feColorMatrix', + fecomponenttransfer: 'feComponentTransfer', + fecomposite: 'feComposite', + feconvolvematrix: 'feConvolveMatrix', + fediffuselighting: 'feDiffuseLighting', + fedisplacementmap: 'feDisplacementMap', + fedistantlight: 'feDistantLight', + fedropshadow: 'feDropShadow', + feflood: 'feFlood', + fefunca: 'feFuncA', + fefuncb: 'feFuncB', + fefuncg: 'feFuncG', + fefuncr: 'feFuncR', + fegaussianblur: 'feGaussianBlur', + feimage: 'feImage', + femerge: 'feMerge', + femergenode: 'feMergeNode', + femorphology: 'feMorphology', + feoffset: 'feOffset', + fepointlight: 'fePointLight', + fespecularlighting: 'feSpecularLighting', + fespotlight: 'feSpotLight', + fetile: 'feTile', + feturbulence: 'feTurbulence', + foreignobject: 'foreignObject', + glyphref: 'glyphRef', + lineargradient: 'linearGradient', + radialgradient: 'radialGradient', +}; +function getTagName(n: elementNode): string { + let tagName = tagMap[n.tagName] ? tagMap[n.tagName] : n.tagName; + if (tagName === 'link' && n.attributes._cssText) { + tagName = 'style'; + } + return tagName; +} + +// based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping +function escapeRegExp(str: string) { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +const HOVER_SELECTOR = /([^\\]):hover/; +const HOVER_SELECTOR_GLOBAL = new RegExp(HOVER_SELECTOR, 'g'); +export function addHoverClass(cssText: string): string { + const ast = parse(cssText, { + silent: true, + }); + + if (!ast.stylesheet) { + return cssText; + } + + const selectors: string[] = []; + ast.stylesheet.rules.forEach((rule) => { + if ('selectors' in rule) { + (rule.selectors || []).forEach((selector: string) => { + if (HOVER_SELECTOR.test(selector)) { + selectors.push(selector); + } + }); + } + }); + + if (selectors.length === 0) { + return cssText; + } + + const selectorMatcher = new RegExp( + selectors + .filter((selector, index) => selectors.indexOf(selector) === index) + .sort((a, b) => b.length - a.length) + .map((selector) => { + return escapeRegExp(selector); + }) + .join('|'), + 'g', + ); + + return cssText.replace(selectorMatcher, (selector) => { + const newSelector = selector.replace(HOVER_SELECTOR_GLOBAL, '$1.\\:hover'); + return `${selector}, ${newSelector}`; + }); +} + +function buildNode( + n: serializedNodeWithId, + options: { + doc: Document; + hackCss: boolean; + }, +): Node | null { + const { doc, hackCss } = options; + switch (n.type) { + case NodeType.Document: + return doc.implementation.createDocument(null, '', null); + case NodeType.DocumentType: + return doc.implementation.createDocumentType( + n.name || 'html', + n.publicId, + n.systemId, + ); + case NodeType.Element: + const tagName = getTagName(n); + let node: Element; + if (n.isSVG) { + node = doc.createElementNS('http://www.w3.org/2000/svg', tagName); + } else { + node = doc.createElement(tagName); + } + for (const name in n.attributes) { + if (!n.attributes.hasOwnProperty(name)) { + continue; + } + let value = n.attributes[name]; + value = + typeof value === 'boolean' || typeof value === 'number' ? '' : value; + // attribute names start with rr_ are internal attributes added by rrweb + if (!name.startsWith('rr_')) { + const isTextarea = tagName === 'textarea' && name === 'value'; + const isRemoteOrDynamicCss = + tagName === 'style' && name === '_cssText'; + if (isRemoteOrDynamicCss && hackCss) { + value = addHoverClass(value); + } + if (isTextarea || isRemoteOrDynamicCss) { + const child = doc.createTextNode(value); + // https://github.com/rrweb-io/rrweb/issues/112 + for (const c of Array.from(node.childNodes)) { + if (c.nodeType === node.TEXT_NODE) { + node.removeChild(c); + } + } + node.appendChild(child); + continue; + } + + try { + if (n.isSVG && name === 'xlink:href') { + node.setAttributeNS('http://www.w3.org/1999/xlink', name, value); + } else if ( + name === 'onload' || + name === 'onclick' || + name.substring(0, 7) === 'onmouse' + ) { + // Rename some of the more common atttributes from https://www.w3schools.com/tags/ref_eventattributes.asp + // as setting them triggers a console.error (which shows up despite the try/catch) + // Assumption: these attributes are not used to css + node.setAttribute('_' + name, value); + } else if ( + tagName === 'meta' && + n.attributes['http-equiv'] === 'Content-Security-Policy' && + name === 'content' + ) { + // If CSP contains style-src and inline-style is disabled, there will be an error "Refused to apply inline style because it violates the following Content Security Policy directive: style-src '*'". + // And the function insertStyleRules in rrweb replayer will throw an error "Uncaught TypeError: Cannot read property 'insertRule' of null". + node.setAttribute('csp-content', value); + continue; + } else if ( + tagName === 'link' && + n.attributes.rel === 'preload' && + n.attributes.as === 'script' + ) { + // ignore + } else if ( + tagName === 'link' && + n.attributes.rel === 'prefetch' && + typeof n.attributes.href === 'string' && + n.attributes.href.endsWith('.js') + ) { + // ignore + } else { + node.setAttribute(name, value); + } + } catch (error) { + // skip invalid attribute + } + } else { + // handle internal attributes + if (tagName === 'canvas' && name === 'rr_dataURL') { + const image = document.createElement('img'); + image.src = value; + image.onload = () => { + const ctx = (node as HTMLCanvasElement).getContext('2d'); + if (ctx) { + ctx.drawImage(image, 0, 0, image.width, image.height); + } + }; + } + if (name === 'rr_width') { + (node as HTMLElement).style.width = value; + } + if (name === 'rr_height') { + (node as HTMLElement).style.height = value; + } + if (name === 'rr_mediaCurrentTime') { + (node as HTMLMediaElement).currentTime = n.attributes + .rr_mediaCurrentTime as number; + } + if (name === 'rr_mediaState') { + switch (value) { + case 'played': + (node as HTMLMediaElement) + .play() + .catch((e) => console.warn('media playback error', e)); + break; + case 'paused': + (node as HTMLMediaElement).pause(); + break; + default: + } + } + } + } + if (n.isShadowHost) { + /** + * Since node is newly rebuilt, it should be a normal element + * without shadowRoot. + * But if there are some weird situations that has defined + * custom element in the scope before we rebuild node, it may + * register the shadowRoot earlier. + * The logic in the 'else' block is just a try-my-best solution + * for the corner case, please let we know if it is wrong and + * we can remove it. + */ + if (!node.shadowRoot) { + node.attachShadow({ mode: 'open' }); + } else { + while (node.shadowRoot.firstChild) { + node.shadowRoot.removeChild(node.shadowRoot.firstChild); + } + } + } + return node; + case NodeType.Text: + return doc.createTextNode( + n.isStyle && hackCss ? addHoverClass(n.textContent) : n.textContent, + ); + case NodeType.CDATA: + return doc.createCDATASection(n.textContent); + case NodeType.Comment: + return doc.createComment(n.textContent); + default: + return null; + } +} + +export function buildNodeWithSN( + n: serializedNodeWithId, + options: { + doc: Document; + map: idNodeMap; + skipChild?: boolean; + hackCss: boolean; + afterAppend?: (n: INode) => unknown; + }, +): INode | null { + const { doc, map, skipChild = false, hackCss = true, afterAppend } = options; + let node = buildNode(n, { doc, hackCss }); + if (!node) { + return null; + } + if (n.rootId) { + console.assert( + ((map[n.rootId] as unknown) as Document) === doc, + 'Target document should has the same root id.', + ); + } + // use target document as root document + if (n.type === NodeType.Document) { + // close before open to make sure document was closed + doc.close(); + doc.open(); + node = doc; + } + + (node as INode).__sn = n; + map[n.id] = node as INode; + + if ( + (n.type === NodeType.Document || n.type === NodeType.Element) && + !skipChild + ) { + for (const childN of n.childNodes) { + const childNode = buildNodeWithSN(childN, { + doc, + map, + skipChild: false, + hackCss, + afterAppend, + }); + if (!childNode) { + console.warn('Failed to rebuild', childN); + continue; + } + + if (childN.isShadow && isElement(node) && node.shadowRoot) { + node.shadowRoot.appendChild(childNode); + } else { + node.appendChild(childNode); + } + if (afterAppend) { + afterAppend(childNode); + } + } + } + + return node as INode; +} + +function visit(idNodeMap: idNodeMap, onVisit: (node: INode) => void) { + function walk(node: INode) { + onVisit(node); + } + + for (const key in idNodeMap) { + if (idNodeMap[key]) { + walk(idNodeMap[key]); + } + } +} + +function handleScroll(node: INode) { + const n = node.__sn; + if (n.type !== NodeType.Element) { + return; + } + const el = (node as Node) as HTMLElement; + for (const name in n.attributes) { + if (!(n.attributes.hasOwnProperty(name) && name.startsWith('rr_'))) { + continue; + } + const value = n.attributes[name]; + if (name === 'rr_scrollLeft') { + el.scrollLeft = value as number; + } + if (name === 'rr_scrollTop') { + el.scrollTop = value as number; + } + } +} + +function rebuild( + n: serializedNodeWithId, + options: { + doc: Document; + onVisit?: (node: INode) => unknown; + hackCss?: boolean; + afterAppend?: (n: INode) => unknown; + }, +): [Node | null, idNodeMap] { + const { doc, onVisit, hackCss = true, afterAppend } = options; + const idNodeMap: idNodeMap = {}; + const node = buildNodeWithSN(n, { + doc, + map: idNodeMap, + skipChild: false, + hackCss, + afterAppend, + }); + visit(idNodeMap, (visitedNode) => { + if (onVisit) { + onVisit(visitedNode); + } + handleScroll(visitedNode); + }); + return [node, idNodeMap]; +} + +export default rebuild; diff --git a/packages/rrweb-snapshot/src/snapshot.ts b/packages/rrweb-snapshot/src/snapshot.ts new file mode 100644 index 00000000..49c2e13c --- /dev/null +++ b/packages/rrweb-snapshot/src/snapshot.ts @@ -0,0 +1,970 @@ +import { + serializedNode, + serializedNodeWithId, + NodeType, + attributes, + INode, + idNodeMap, + MaskInputOptions, + SlimDOMOptions, + MaskTextFn, + MaskInputFn, + KeepIframeSrcFn, +} from './types'; +import { isElement, isShadowRoot, maskInputValue } from './utils'; + +let _id = 1; +const tagNameRegex = RegExp('[^a-z0-9-_:]'); + +export const IGNORED_NODE = -2; + +function genId(): number { + return _id++; +} + +function getValidTagName(element: HTMLElement): string { + if (element instanceof HTMLFormElement) { + return 'form'; + } + + const processedTagName = element.tagName.toLowerCase().trim(); + + if (tagNameRegex.test(processedTagName)) { + // if the tag name is odd and we cannot extract + // anything from the string, then we return a + // generic div + return 'div'; + } + + return processedTagName; +} + +function getCssRulesString(s: CSSStyleSheet): string | null { + try { + const rules = s.rules || s.cssRules; + return rules ? Array.from(rules).map(getCssRuleString).join('') : null; + } catch (error) { + return null; + } +} + +function getCssRuleString(rule: CSSRule): string { + return isCSSImportRule(rule) + ? getCssRulesString(rule.styleSheet) || '' + : rule.cssText; +} + +function isCSSImportRule(rule: CSSRule): rule is CSSImportRule { + return 'styleSheet' in rule; +} + +function extractOrigin(url: string): string { + let origin; + if (url.indexOf('//') > -1) { + origin = url.split('/').slice(0, 3).join('/'); + } else { + origin = url.split('/')[0]; + } + origin = origin.split('?')[0]; + return origin; +} + +const URL_IN_CSS_REF = /url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm; +const RELATIVE_PATH = /^(?!www\.|(?:http|ftp)s?:\/\/|[A-Za-z]:\\|\/\/|#).*/; +const DATA_URI = /^(data:)([^,]*),(.*)/i; +export function absoluteToStylesheet( + cssText: string | null, + href: string, +): string { + return (cssText || '').replace( + URL_IN_CSS_REF, + (origin, quote1, path1, quote2, path2, path3) => { + const filePath = path1 || path2 || path3; + const maybeQuote = quote1 || quote2 || ''; + if (!filePath) { + return origin; + } + if (!RELATIVE_PATH.test(filePath)) { + return `url(${maybeQuote}${filePath}${maybeQuote})`; + } + if (DATA_URI.test(filePath)) { + return `url(${maybeQuote}${filePath}${maybeQuote})`; + } + if (filePath[0] === '/') { + return `url(${maybeQuote}${ + extractOrigin(href) + filePath + }${maybeQuote})`; + } + const stack = href.split('/'); + const parts = filePath.split('/'); + stack.pop(); + for (const part of parts) { + if (part === '.') { + continue; + } else if (part === '..') { + stack.pop(); + } else { + stack.push(part); + } + } + return `url(${maybeQuote}${stack.join('/')}${maybeQuote})`; + }, + ); +} + +const SRCSET_NOT_SPACES = /^[^ \t\n\r\u000c]+/; // Don't use \s, to avoid matching non-breaking space +const SRCSET_COMMAS_OR_SPACES = /^[, \t\n\r\u000c]+/; +function getAbsoluteSrcsetString(doc: Document, attributeValue: string) { + /* + run absoluteToDoc over every url in the srcset + + this is adapted from https://github.com/albell/parse-srcset/ + without the parsing of the descriptors (we return these as-is) + parce-srcset is in turn based on + https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute + */ + if (attributeValue.trim() === '') { + return attributeValue; + } + + let pos = 0; + + function collectCharacters(regEx: RegExp) { + var chars, + match = regEx.exec(attributeValue.substring(pos)); + if (match) { + chars = match[0]; + pos += chars.length; + return chars; + } + return ''; + } + + let output = []; + while (true) { + collectCharacters(SRCSET_COMMAS_OR_SPACES); + if (pos >= attributeValue.length) { + break; + } + // don't split on commas within urls + let url = collectCharacters(SRCSET_NOT_SPACES); + if (url.slice(-1) === ',') { + // aside: according to spec more than one comma at the end is a parse error, but we ignore that + url = absoluteToDoc(doc, url.substring(0, url.length - 1)); + // the trailing comma splits the srcset, so the interpretion is that + // another url will follow, and the descriptor is empty + output.push(url); + } else { + let descriptorsStr = ''; + url = absoluteToDoc(doc, url); + let inParens = false; + while (true) { + let c = attributeValue.charAt(pos); + if (c === '') { + output.push((url + descriptorsStr).trim()); + break; + } else if (!inParens) { + if (c === ',') { + pos += 1; + output.push((url + descriptorsStr).trim()); + break; // parse the next url + } else if (c === '(') { + inParens = true; + } + } else { + // in parenthesis; ignore commas + // (parenthesis may be supported by future additions to spec) + if (c === ')') { + inParens = false; + } + } + descriptorsStr += c; + pos += 1; + } + } + } + return output.join(', '); +} + +export function absoluteToDoc(doc: Document, attributeValue: string): string { + if (!attributeValue || attributeValue.trim() === '') { + return attributeValue; + } + const a: HTMLAnchorElement = doc.createElement('a'); + a.href = attributeValue; + return a.href; +} + +function isSVGElement(el: Element): boolean { + return el.tagName === 'svg' || el instanceof SVGElement; +} + +function getHref() { + // return a href without hash + const a = document.createElement('a'); + a.href = ''; + return a.href; +} + +export function transformAttribute( + doc: Document, + tagName: string, + name: string, + value: string, +): string { + // relative path in attribute + if (name === 'src' || ((name === 'href' || name === 'xlink:href') && value)) { + return absoluteToDoc(doc, value); + } else if ( + name === 'background' && + value && + (tagName === 'table' || tagName === 'td' || tagName === 'th') + ) { + return absoluteToDoc(doc, value); + } else if (name === 'srcset' && value) { + return getAbsoluteSrcsetString(doc, value); + } else if (name === 'style' && value) { + return absoluteToStylesheet(value, getHref()); + } else { + return value; + } +} + +export function _isBlockedElement( + element: HTMLElement, + blockClass: string | RegExp, + blockSelector: string | null, +): boolean { + if (typeof blockClass === 'string') { + if (element.classList.contains(blockClass)) { + return true; + } + } else { + // tslint:disable-next-line: prefer-for-of + for (let eIndex = 0; eIndex < element.classList.length; eIndex++) { + const className = element.classList[eIndex]; + if (blockClass.test(className)) { + return true; + } + } + } + if (blockSelector) { + return element.matches(blockSelector); + } + + return false; +} + +export function needMaskingText( + node: Node | null, + maskTextClass: string | RegExp, + maskTextSelector: string | null, +): boolean { + if (!node) { + return false; + } + if (node.nodeType === node.ELEMENT_NODE) { + if (typeof maskTextClass === 'string') { + if ((node as HTMLElement).classList.contains(maskTextClass)) { + return true; + } + } else { + (node as HTMLElement).classList.forEach((className) => { + if (maskTextClass.test(className)) { + return true; + } + }); + } + if (maskTextSelector) { + if ((node as HTMLElement).matches(maskTextSelector)) { + return true; + } + } + return needMaskingText(node.parentNode, maskTextClass, maskTextSelector); + } + if (node.nodeType === node.TEXT_NODE) { + // check parent node since text node do not have class name + return needMaskingText(node.parentNode, maskTextClass, maskTextSelector); + } + return needMaskingText(node.parentNode, maskTextClass, maskTextSelector); +} + +// https://stackoverflow.com/a/36155560 +function onceIframeLoaded( + iframeEl: HTMLIFrameElement, + listener: () => unknown, + iframeLoadTimeout: number, +) { + const win = iframeEl.contentWindow; + if (!win) { + return; + } + // document is loading + let fired = false; + + let readyState: DocumentReadyState; + try { + readyState = win.document.readyState; + } catch (error) { + return; + } + if (readyState !== 'complete') { + const timer = setTimeout(() => { + if (!fired) { + listener(); + fired = true; + } + }, iframeLoadTimeout); + iframeEl.addEventListener('load', () => { + clearTimeout(timer); + fired = true; + listener(); + }); + return; + } + // check blank frame for Chrome + const blankUrl = 'about:blank'; + if ( + win.location.href !== blankUrl || + iframeEl.src === blankUrl || + iframeEl.src === '' + ) { + // iframe was already loaded, make sure we wait to trigger the listener + // till _after_ the mutation that found this iframe has had time to process + setTimeout(listener, 0); + return; + } + // use default listener + iframeEl.addEventListener('load', listener); +} + +function serializeNode( + n: Node, + options: { + doc: Document; + blockClass: string | RegExp; + blockSelector: string | null; + maskTextClass: string | RegExp; + maskTextSelector: string | null; + inlineStylesheet: boolean; + maskInputOptions: MaskInputOptions; + maskTextFn: MaskTextFn | undefined; + maskInputFn: MaskInputFn | undefined; + recordCanvas: boolean; + keepIframeSrcFn: KeepIframeSrcFn; + }, +): serializedNode | false { + const { + doc, + blockClass, + blockSelector, + maskTextClass, + maskTextSelector, + inlineStylesheet, + maskInputOptions = {}, + maskTextFn, + maskInputFn, + recordCanvas, + keepIframeSrcFn, + } = options; + // Only record root id when document object is not the base document + let rootId: number | undefined; + if (((doc as unknown) as INode).__sn) { + const docId = ((doc as unknown) as INode).__sn.id; + rootId = docId === 1 ? undefined : docId; + } + switch (n.nodeType) { + case n.DOCUMENT_NODE: + return { + type: NodeType.Document, + childNodes: [], + rootId, + }; + case n.DOCUMENT_TYPE_NODE: + return { + type: NodeType.DocumentType, + name: (n as DocumentType).name, + publicId: (n as DocumentType).publicId, + systemId: (n as DocumentType).systemId, + rootId, + }; + case n.ELEMENT_NODE: + const needBlock = _isBlockedElement( + n as HTMLElement, + blockClass, + blockSelector, + ); + const tagName = getValidTagName(n as HTMLElement); + let attributes: attributes = {}; + for (const { name, value } of Array.from((n as HTMLElement).attributes)) { + attributes[name] = transformAttribute(doc, tagName, name, value); + } + // remote css + if (tagName === 'link' && inlineStylesheet) { + const stylesheet = Array.from(doc.styleSheets).find((s) => { + return s.href === (n as HTMLLinkElement).href; + }); + const cssText = getCssRulesString(stylesheet as CSSStyleSheet); + if (cssText) { + delete attributes.rel; + delete attributes.href; + attributes._cssText = absoluteToStylesheet( + cssText, + stylesheet!.href!, + ); + } + } + // dynamic stylesheet + if ( + tagName === 'style' && + (n as HTMLStyleElement).sheet && + // TODO: Currently we only try to get dynamic stylesheet when it is an empty style element + !( + (n as HTMLElement).innerText || + (n as HTMLElement).textContent || + '' + ).trim().length + ) { + const cssText = getCssRulesString( + (n as HTMLStyleElement).sheet as CSSStyleSheet, + ); + if (cssText) { + attributes._cssText = absoluteToStylesheet(cssText, getHref()); + } + } + // form fields + if ( + tagName === 'input' || + tagName === 'textarea' || + tagName === 'select' + ) { + const value = (n as HTMLInputElement | HTMLTextAreaElement).value; + if ( + attributes.type !== 'radio' && + attributes.type !== 'checkbox' && + attributes.type !== 'submit' && + attributes.type !== 'button' && + value + ) { + attributes.value = maskInputValue({ + type: attributes.type, + tagName, + value, + maskInputOptions, + maskInputFn, + }); + } else if ((n as HTMLInputElement).checked) { + attributes.checked = (n as HTMLInputElement).checked; + } + } + if (tagName === 'option') { + const selectValue = (n as HTMLOptionElement).parentElement; + if (attributes.value === (selectValue as HTMLSelectElement).value) { + attributes.selected = (n as HTMLOptionElement).selected; + } + } + // canvas image data + if (tagName === 'canvas' && recordCanvas) { + attributes.rr_dataURL = (n as HTMLCanvasElement).toDataURL(); + } + // media elements + if (tagName === 'audio' || tagName === 'video') { + attributes.rr_mediaState = (n as HTMLMediaElement).paused + ? 'paused' + : 'played'; + attributes.rr_mediaCurrentTime = (n as HTMLMediaElement).currentTime; + } + // scroll + if ((n as HTMLElement).scrollLeft) { + attributes.rr_scrollLeft = (n as HTMLElement).scrollLeft; + } + if ((n as HTMLElement).scrollTop) { + attributes.rr_scrollTop = (n as HTMLElement).scrollTop; + } + // block element + if (needBlock) { + const { width, height } = (n as HTMLElement).getBoundingClientRect(); + attributes = { + class: attributes.class, + rr_width: `${width}px`, + rr_height: `${height}px`, + }; + } + // iframe + if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src as string)) { + delete attributes.src; + } + return { + type: NodeType.Element, + tagName, + attributes, + childNodes: [], + isSVG: isSVGElement(n as Element) || undefined, + needBlock, + rootId, + }; + case n.TEXT_NODE: + // The parent node may not be a html element which has a tagName attribute. + // So just let it be undefined which is ok in this use case. + const parentTagName = + n.parentNode && (n.parentNode as HTMLElement).tagName; + let textContent = (n as Text).textContent; + const isStyle = parentTagName === 'STYLE' ? true : undefined; + const isScript = parentTagName === 'SCRIPT' ? true : undefined; + if (isStyle && textContent) { + textContent = absoluteToStylesheet(textContent, getHref()); + } + if (isScript) { + textContent = 'SCRIPT_PLACEHOLDER'; + } + if ( + !isStyle && + !isScript && + needMaskingText(n, maskTextClass, maskTextSelector) && + textContent + ) { + textContent = maskTextFn + ? maskTextFn(textContent) + : textContent.replace(/[\S]/g, '*'); + } + return { + type: NodeType.Text, + textContent: textContent || '', + isStyle, + rootId, + }; + case n.CDATA_SECTION_NODE: + return { + type: NodeType.CDATA, + textContent: '', + rootId, + }; + case n.COMMENT_NODE: + return { + type: NodeType.Comment, + textContent: (n as Comment).textContent || '', + rootId, + }; + default: + return false; + } +} + +function lowerIfExists(maybeAttr: string | number | boolean): string { + if (maybeAttr === undefined) { + return ''; + } else { + return (maybeAttr as string).toLowerCase(); + } +} + +function slimDOMExcluded( + sn: serializedNode, + slimDOMOptions: SlimDOMOptions, +): boolean { + if (slimDOMOptions.comment && sn.type === NodeType.Comment) { + // TODO: convert IE conditional comments to real nodes + return true; + } else if (sn.type === NodeType.Element) { + if ( + slimDOMOptions.script && + // script tag + (sn.tagName === 'script' || + // preload link + (sn.tagName === 'link' && + sn.attributes.rel === 'preload' && + sn.attributes.as === 'script') || + // prefetch link + (sn.tagName === 'link' && + sn.attributes.rel === 'prefetch' && + typeof sn.attributes.href === 'string' && + sn.attributes.href.endsWith('.js'))) + ) { + return true; + } else if ( + slimDOMOptions.headFavicon && + ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') || + (sn.tagName === 'meta' && + (lowerIfExists(sn.attributes.name).match( + /^msapplication-tile(image|color)$/, + ) || + lowerIfExists(sn.attributes.name) === 'application-name' || + lowerIfExists(sn.attributes.rel) === 'icon' || + lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' || + lowerIfExists(sn.attributes.rel) === 'shortcut icon'))) + ) { + return true; + } else if (sn.tagName === 'meta') { + if ( + slimDOMOptions.headMetaDescKeywords && + lowerIfExists(sn.attributes.name).match(/^description|keywords$/) + ) { + return true; + } else if ( + slimDOMOptions.headMetaSocial && + (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) || // og = opengraph (facebook) + lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) || + lowerIfExists(sn.attributes.name) === 'pinterest') + ) { + return true; + } else if ( + slimDOMOptions.headMetaRobots && + (lowerIfExists(sn.attributes.name) === 'robots' || + lowerIfExists(sn.attributes.name) === 'googlebot' || + lowerIfExists(sn.attributes.name) === 'bingbot') + ) { + return true; + } else if ( + slimDOMOptions.headMetaHttpEquiv && + sn.attributes['http-equiv'] !== undefined + ) { + // e.g. X-UA-Compatible, Content-Type, Content-Language, + // cache-control, X-Translated-By + return true; + } else if ( + slimDOMOptions.headMetaAuthorship && + (lowerIfExists(sn.attributes.name) === 'author' || + lowerIfExists(sn.attributes.name) === 'generator' || + lowerIfExists(sn.attributes.name) === 'framework' || + lowerIfExists(sn.attributes.name) === 'publisher' || + lowerIfExists(sn.attributes.name) === 'progid' || + lowerIfExists(sn.attributes.property).match(/^article:/) || + lowerIfExists(sn.attributes.property).match(/^product:/)) + ) { + return true; + } else if ( + slimDOMOptions.headMetaVerification && + (lowerIfExists(sn.attributes.name) === 'google-site-verification' || + lowerIfExists(sn.attributes.name) === 'yandex-verification' || + lowerIfExists(sn.attributes.name) === 'csrf-token' || + lowerIfExists(sn.attributes.name) === 'p:domain_verify' || + lowerIfExists(sn.attributes.name) === 'verify-v1' || + lowerIfExists(sn.attributes.name) === 'verification' || + lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token') + ) { + return true; + } + } + } + return false; +} + +export function serializeNodeWithId( + n: Node | INode, + options: { + doc: Document; + map: idNodeMap; + blockClass: string | RegExp; + blockSelector: string | null; + maskTextClass: string | RegExp; + maskTextSelector: string | null; + skipChild: boolean; + inlineStylesheet: boolean; + maskInputOptions?: MaskInputOptions; + maskTextFn: MaskTextFn | undefined; + maskInputFn: MaskInputFn | undefined; + slimDOMOptions: SlimDOMOptions; + keepIframeSrcFn?: KeepIframeSrcFn; + recordCanvas?: boolean; + preserveWhiteSpace?: boolean; + onSerialize?: (n: INode) => unknown; + onIframeLoad?: (iframeINode: INode, node: serializedNodeWithId) => unknown; + iframeLoadTimeout?: number; + }, +): serializedNodeWithId | null { + const { + doc, + map, + blockClass, + blockSelector, + maskTextClass, + maskTextSelector, + skipChild = false, + inlineStylesheet = true, + maskInputOptions = {}, + maskTextFn, + maskInputFn, + slimDOMOptions, + recordCanvas = false, + onSerialize, + onIframeLoad, + iframeLoadTimeout = 5000, + keepIframeSrcFn = () => false, + } = options; + let { preserveWhiteSpace = true } = options; + const _serializedNode = serializeNode(n, { + doc, + blockClass, + blockSelector, + maskTextClass, + maskTextSelector, + inlineStylesheet, + maskInputOptions, + maskTextFn, + maskInputFn, + recordCanvas, + keepIframeSrcFn, + }); + if (!_serializedNode) { + // TODO: dev only + console.warn(n, 'not serialized'); + return null; + } + + let id; + // Try to reuse the previous id + if ('__sn' in n) { + id = n.__sn.id; + } else if ( + slimDOMExcluded(_serializedNode, slimDOMOptions) || + (!preserveWhiteSpace && + _serializedNode.type === NodeType.Text && + !_serializedNode.isStyle && + !_serializedNode.textContent.replace(/^\s+|\s+$/gm, '').length) + ) { + id = IGNORED_NODE; + } else { + id = genId(); + } + const serializedNode = Object.assign(_serializedNode, { id }); + (n as INode).__sn = serializedNode; + if (id === IGNORED_NODE) { + return null; // slimDOM + } + map[id] = n as INode; + if (onSerialize) { + onSerialize(n as INode); + } + let recordChild = !skipChild; + if (serializedNode.type === NodeType.Element) { + recordChild = recordChild && !serializedNode.needBlock; + // this property was not needed in replay side + delete serializedNode.needBlock; + } + if ( + (serializedNode.type === NodeType.Document || + serializedNode.type === NodeType.Element) && + recordChild + ) { + if ( + slimDOMOptions.headWhitespace && + _serializedNode.type === NodeType.Element && + _serializedNode.tagName === 'head' + // would impede performance: || getComputedStyle(n)['white-space'] === 'normal' + ) { + preserveWhiteSpace = false; + } + const bypassOptions = { + doc, + map, + blockClass, + blockSelector, + maskTextClass, + maskTextSelector, + skipChild, + inlineStylesheet, + maskInputOptions, + maskTextFn, + maskInputFn, + slimDOMOptions, + recordCanvas, + preserveWhiteSpace, + onSerialize, + onIframeLoad, + iframeLoadTimeout, + keepIframeSrcFn, + }; + for (const childN of Array.from(n.childNodes)) { + const serializedChildNode = serializeNodeWithId(childN, bypassOptions); + if (serializedChildNode) { + serializedNode.childNodes.push(serializedChildNode); + } + } + + if (isElement(n) && n.shadowRoot) { + serializedNode.isShadowHost = true; + for (const childN of Array.from(n.shadowRoot.childNodes)) { + const serializedChildNode = serializeNodeWithId(childN, bypassOptions); + if (serializedChildNode) { + serializedChildNode.isShadow = true; + serializedNode.childNodes.push(serializedChildNode); + } + } + } + } + + if (n.parentNode && isShadowRoot(n.parentNode)) { + serializedNode.isShadow = true; + } + + if ( + serializedNode.type === NodeType.Element && + serializedNode.tagName === 'iframe' + ) { + onceIframeLoaded( + n as HTMLIFrameElement, + () => { + const iframeDoc = (n as HTMLIFrameElement).contentDocument; + if (iframeDoc && onIframeLoad) { + const serializedIframeNode = serializeNodeWithId(iframeDoc, { + doc: iframeDoc, + map, + blockClass, + blockSelector, + maskTextClass, + maskTextSelector, + skipChild: false, + inlineStylesheet, + maskInputOptions, + maskTextFn, + maskInputFn, + slimDOMOptions, + recordCanvas, + preserveWhiteSpace, + onSerialize, + onIframeLoad, + iframeLoadTimeout, + keepIframeSrcFn, + }); + + if (serializedIframeNode) { + onIframeLoad(n as INode, serializedIframeNode); + } + } + }, + iframeLoadTimeout, + ); + } + + return serializedNode; +} + +function snapshot( + n: Document, + options?: { + blockClass?: string | RegExp; + blockSelector?: string | null; + maskTextClass?: string | RegExp; + maskTextSelector?: string | null; + inlineStylesheet?: boolean; + maskAllInputs?: boolean | MaskInputOptions; + maskTextFn?: MaskTextFn; + maskInputFn?: MaskTextFn; + slimDOM?: boolean | SlimDOMOptions; + recordCanvas?: boolean; + preserveWhiteSpace?: boolean; + onSerialize?: (n: INode) => unknown; + onIframeLoad?: (iframeINode: INode, node: serializedNodeWithId) => unknown; + iframeLoadTimeout?: number; + keepIframeSrcFn?: KeepIframeSrcFn; + }, +): [serializedNodeWithId | null, idNodeMap] { + const { + blockClass = 'rr-block', + blockSelector = null, + maskTextClass = 'rr-mask', + maskTextSelector = null, + inlineStylesheet = true, + recordCanvas = false, + maskAllInputs = false, + maskTextFn, + maskInputFn, + slimDOM = false, + preserveWhiteSpace, + onSerialize, + onIframeLoad, + iframeLoadTimeout, + keepIframeSrcFn = () => false, + } = options || {}; + const idNodeMap: idNodeMap = {}; + const maskInputOptions: MaskInputOptions = + maskAllInputs === true + ? { + color: true, + date: true, + 'datetime-local': true, + email: true, + month: true, + number: true, + range: true, + search: true, + tel: true, + text: true, + time: true, + url: true, + week: true, + textarea: true, + select: true, + password: true, + } + : maskAllInputs === false + ? { + password: true, + } + : maskAllInputs; + const slimDOMOptions: SlimDOMOptions = + slimDOM === true || slimDOM === 'all' + ? // if true: set of sensible options that should not throw away any information + { + script: true, + comment: true, + headFavicon: true, + headWhitespace: true, + headMetaDescKeywords: slimDOM === 'all', // destructive + headMetaSocial: true, + headMetaRobots: true, + headMetaHttpEquiv: true, + headMetaAuthorship: true, + headMetaVerification: true, + } + : slimDOM === false + ? {} + : slimDOM; + return [ + serializeNodeWithId(n, { + doc: n, + map: idNodeMap, + blockClass, + blockSelector, + maskTextClass, + maskTextSelector, + skipChild: false, + inlineStylesheet, + maskInputOptions, + maskTextFn, + maskInputFn, + slimDOMOptions, + recordCanvas, + preserveWhiteSpace, + onSerialize, + onIframeLoad, + iframeLoadTimeout, + keepIframeSrcFn, + }), + idNodeMap, + ]; +} + +export function visitSnapshot( + node: serializedNodeWithId, + onVisit: (node: serializedNodeWithId) => unknown, +) { + function walk(current: serializedNodeWithId) { + onVisit(current); + if ( + current.type === NodeType.Document || + current.type === NodeType.Element + ) { + current.childNodes.forEach(walk); + } + } + + walk(node); +} + +export function cleanupSnapshot() { + // allow a new recording to start numbering nodes from scratch + _id = 1; +} + +export default snapshot; diff --git a/packages/rrweb-snapshot/src/types.ts b/packages/rrweb-snapshot/src/types.ts new file mode 100644 index 00000000..ffeef690 --- /dev/null +++ b/packages/rrweb-snapshot/src/types.ts @@ -0,0 +1,113 @@ +export enum NodeType { + Document, + DocumentType, + Element, + Text, + CDATA, + Comment, +} + +export type documentNode = { + type: NodeType.Document; + childNodes: serializedNodeWithId[]; +}; + +export type documentTypeNode = { + type: NodeType.DocumentType; + name: string; + publicId: string; + systemId: string; +}; + +export type attributes = { + [key: string]: string | number | boolean; +}; +export type elementNode = { + type: NodeType.Element; + tagName: string; + attributes: attributes; + childNodes: serializedNodeWithId[]; + isSVG?: true; + needBlock?: boolean; +}; + +export type textNode = { + type: NodeType.Text; + textContent: string; + isStyle?: true; +}; + +export type cdataNode = { + type: NodeType.CDATA; + textContent: ''; +}; + +export type commentNode = { + type: NodeType.Comment; + textContent: string; +}; + +export type serializedNode = ( + | documentNode + | documentTypeNode + | elementNode + | textNode + | cdataNode + | commentNode +) & { + rootId?: number; + isShadowHost?: boolean; + isShadow?: boolean; +}; + +export type serializedNodeWithId = serializedNode & { id: number }; + +export type tagMap = { + [key: string]: string; +}; + +export interface INode extends Node { + __sn: serializedNodeWithId; +} + +export type idNodeMap = { + [key: number]: INode; +}; + +export type MaskInputOptions = Partial<{ + color: boolean; + date: boolean; + 'datetime-local': boolean; + email: boolean; + month: boolean; + number: boolean; + range: boolean; + search: boolean; + tel: boolean; + text: boolean; + time: boolean; + url: boolean; + week: boolean; + // unify textarea and select element with text input + textarea: boolean; + select: boolean; + password: boolean; +}>; + +export type SlimDOMOptions = Partial<{ + script: boolean; + comment: boolean; + headFavicon: boolean; + headWhitespace: boolean; + headMetaDescKeywords: boolean; + headMetaSocial: boolean; + headMetaRobots: boolean; + headMetaHttpEquiv: boolean; + headMetaAuthorship: boolean; + headMetaVerification: boolean; +}>; + +export type MaskTextFn = (text: string) => string; +export type MaskInputFn = (text: string) => string; + +export type KeepIframeSrcFn = (src: string) => boolean; diff --git a/packages/rrweb-snapshot/src/utils.ts b/packages/rrweb-snapshot/src/utils.ts new file mode 100644 index 00000000..ed5c5f75 --- /dev/null +++ b/packages/rrweb-snapshot/src/utils.ts @@ -0,0 +1,37 @@ +import { INode, MaskInputFn, MaskInputOptions } from './types'; + +export function isElement(n: Node | INode): n is Element { + return n.nodeType === n.ELEMENT_NODE; +} + +export function isShadowRoot(n: Node): n is ShadowRoot { + const host: Element | null = (n as ShadowRoot)?.host; + return Boolean(host && host.shadowRoot && host.shadowRoot === n); +} + +export function maskInputValue({ + maskInputOptions, + tagName, + type, + value, + maskInputFn, +}: { + maskInputOptions: MaskInputOptions; + tagName: string; + type: string | number | boolean | null; + value: string | null; + maskInputFn?: MaskInputFn; +}): string { + let text = value || ''; + if ( + maskInputOptions[tagName.toLowerCase() as keyof MaskInputOptions] || + maskInputOptions[type as keyof MaskInputOptions] + ) { + if (maskInputFn) { + text = maskInputFn(text); + } else { + text = '*'.repeat(text.length); + } + } + return text; +} diff --git a/packages/rrweb-snapshot/test.d.ts b/packages/rrweb-snapshot/test.d.ts new file mode 100644 index 00000000..a3b614ee --- /dev/null +++ b/packages/rrweb-snapshot/test.d.ts @@ -0,0 +1,21 @@ +declare module 'rollup-plugin-typescript' { + function typescript(): any; + export = typescript; +} + +declare module 'jest-snapshot' { + export class SnapshotState { + constructor(testFile: string, options: any); + + save(): any; + } + type matchResult = { + pass: boolean; + report(): string; + }; + export function toMatchSnapshot( + received: any, + propertyMatchers?: any, + testName?: string, + ): matchResult; +} diff --git a/packages/rrweb-snapshot/test/__snapshots__/integration.ts.snap b/packages/rrweb-snapshot/test/__snapshots__/integration.ts.snap new file mode 100644 index 00000000..e087f79b --- /dev/null +++ b/packages/rrweb-snapshot/test/__snapshots__/integration.ts.snap @@ -0,0 +1,838 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`[html file]: about-mozilla.html 1`] = ` +" + The Book of Mozilla, 11:9 + +

+ Mammon slept. And the beast reborn spread over the earth and its numbers + grew legion. And they proclaimed the times and sacrificed crops unto the + fire, with the cunning of foxes. And they built a new world in their own + image as promised by the + sacred words, and spoke + of the beast with their children. Mammon awoke, and lo! it was + naught but a follower. +

+ from The Book of Mozilla, 11:9
(10th Edition) +

" +`; + +exports[`[html file]: basic.html 1`] = ` +" + + + + Document + +

Title

" +`; + +exports[`[html file]: block-element.html 1`] = ` +" + + + + Document + + +
+
record 2
+
+
+ " +`; + +exports[`[html file]: cors-style-sheet.html 1`] = ` +" + + + + with style sheet + + + + " +`; + +exports[`[html file]: dynamic-stylesheet.html 1`] = ` +" + + + + dynamic stylesheet + + + + +

p tag

+ " +`; + +exports[`[html file]: form-fields.html 1`] = ` +" + + + + form fields + +
+ + + + + + +
+ + " +`; + +exports[`[html file]: hover.html 1`] = ` +" + + + + hover selector + + +
hover me
+" +`; + +exports[`[html file]: iframe.html 1`] = ` +" + + + + iframe + + + +" +`; + +exports[`[html file]: iframe-inner.html 1`] = ` +" +" +`; + +exports[`[html file]: invalid-attribute.html 1`] = ` +" +" +`; + +exports[`[html file]: invalid-doctype.html 1`] = ` +" + + + Invalid Doctype + + " +`; + +exports[`[html file]: invalid-tagname.html 1`] = ` +" + + + + Document + + +
Hello
+
Hello
+
+" +`; + +exports[`[html file]: mask-text.html 1`] = ` +" + + + + Document + +

**** *

+
+ **** * +
+
**** *
+ " +`; + +exports[`[html file]: picture.html 1`] = ` +" + + + + + " +`; + +exports[`[html file]: preload.html 1`] = ` +" + + + Document + + + + " +`; + +exports[`[html file]: shadow-dom.html 1`] = ` +" + + + shadow DOM + + + + + + +
content panel 1
+
content panel 2
+
content panel 3
+
+ + " +`; + +exports[`[html file]: video.html 1`] = ` +" + + + + video + + + + " +`; + +exports[`[html file]: with-relative-res.html 1`] = ` +" + + + + Document + + + +
Hello
+ Hello +
Hello
+
+ \\"\\" + \\"\\" + \\"\\" + \\"\\" + \\"\\"" +`; + +exports[`[html file]: with-script.html 1`] = ` +" + + + + with script + + + " +`; + +exports[`[html file]: with-style-sheet.html 1`] = ` +" + + + + with style sheet + + +" +`; + +exports[`[html file]: with-style-sheet-with-import.html 1`] = ` +" + + + + with style sheet with import + + +" +`; + +exports[`iframe integration tests 1`] = ` +"{ + \\"type\\": 0, + \\"childNodes\\": [ + { + \\"type\\": 1, + \\"name\\": \\"html\\", + \\"publicId\\": \\"\\", + \\"systemId\\": \\"\\", + \\"id\\": 2 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"html\\", + \\"attributes\\": { + \\"lang\\": \\"en\\" + }, + \\"childNodes\\": [ + { + \\"type\\": 2, + \\"tagName\\": \\"head\\", + \\"attributes\\": {}, + \\"childNodes\\": [ + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 5 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"meta\\", + \\"attributes\\": { + \\"charset\\": \\"UTF-8\\" + }, + \\"childNodes\\": [], + \\"id\\": 6 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 7 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"meta\\", + \\"attributes\\": { + \\"name\\": \\"viewport\\", + \\"content\\": \\"width=device-width, initial-scale=1.0\\" + }, + \\"childNodes\\": [], + \\"id\\": 8 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 9 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"title\\", + \\"attributes\\": {}, + \\"childNodes\\": [ + { + \\"type\\": 3, + \\"textContent\\": \\"Main\\", + \\"id\\": 11 + } + ], + \\"id\\": 10 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 12 + } + ], + \\"id\\": 4 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 13 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"body\\", + \\"attributes\\": {}, + \\"childNodes\\": [ + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 15 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"iframe\\", + \\"attributes\\": { + \\"id\\": \\"one\\" + }, + \\"childNodes\\": [], + \\"id\\": 16 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 17 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"iframe\\", + \\"attributes\\": { + \\"id\\": \\"two\\" + }, + \\"childNodes\\": [], + \\"id\\": 18 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\\\n\\\\n\\", + \\"id\\": 19 + } + ], + \\"id\\": 14 + } + ], + \\"id\\": 3 + } + ], + \\"id\\": 1 +}" +`; + +exports[`shadown DOM integration tests 1`] = ` +"{ + \\"type\\": 0, + \\"childNodes\\": [ + { + \\"type\\": 1, + \\"name\\": \\"html\\", + \\"publicId\\": \\"\\", + \\"systemId\\": \\"\\", + \\"id\\": 2 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"html\\", + \\"attributes\\": { + \\"lang\\": \\"en\\" + }, + \\"childNodes\\": [ + { + \\"type\\": 2, + \\"tagName\\": \\"head\\", + \\"attributes\\": {}, + \\"childNodes\\": [ + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 5 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"meta\\", + \\"attributes\\": { + \\"charset\\": \\"UTF-8\\" + }, + \\"childNodes\\": [], + \\"id\\": 6 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 7 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"meta\\", + \\"attributes\\": { + \\"name\\": \\"viewport\\", + \\"content\\": \\"width=device-width, initial-scale=1.0\\" + }, + \\"childNodes\\": [], + \\"id\\": 8 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 9 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"title\\", + \\"attributes\\": {}, + \\"childNodes\\": [ + { + \\"type\\": 3, + \\"textContent\\": \\"shadow DOM\\", + \\"id\\": 11 + } + ], + \\"id\\": 10 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 12 + } + ], + \\"id\\": 4 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 13 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"body\\", + \\"attributes\\": {}, + \\"childNodes\\": [ + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 15 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"fancy-tabs\\", + \\"attributes\\": { + \\"background\\": \\"\\", + \\"role\\": \\"tablist\\", + \\"selected\\": \\"1\\" + }, + \\"childNodes\\": [ + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 17 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"button\\", + \\"attributes\\": { + \\"slot\\": \\"title\\", + \\"role\\": \\"tab\\", + \\"tabindex\\": \\"-1\\", + \\"aria-selected\\": \\"false\\" + }, + \\"childNodes\\": [ + { + \\"type\\": 3, + \\"textContent\\": \\"Tab 1\\", + \\"id\\": 19 + } + ], + \\"id\\": 18 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 20 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"button\\", + \\"attributes\\": { + \\"slot\\": \\"title\\", + \\"selected\\": \\"\\", + \\"role\\": \\"tab\\", + \\"tabindex\\": \\"0\\", + \\"aria-selected\\": \\"true\\" + }, + \\"childNodes\\": [ + { + \\"type\\": 3, + \\"textContent\\": \\"Tab 2\\", + \\"id\\": 22 + } + ], + \\"id\\": 21 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 23 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"button\\", + \\"attributes\\": { + \\"slot\\": \\"title\\", + \\"role\\": \\"tab\\", + \\"tabindex\\": \\"-1\\", + \\"aria-selected\\": \\"false\\" + }, + \\"childNodes\\": [ + { + \\"type\\": 3, + \\"textContent\\": \\"Tab 3\\", + \\"id\\": 25 + } + ], + \\"id\\": 24 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 26 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"section\\", + \\"attributes\\": { + \\"role\\": \\"tabpanel\\", + \\"tabindex\\": \\"0\\", + \\"aria-hidden\\": \\"true\\" + }, + \\"childNodes\\": [ + { + \\"type\\": 3, + \\"textContent\\": \\"content panel 1\\", + \\"id\\": 28 + } + ], + \\"id\\": 27 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 29 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"section\\", + \\"attributes\\": { + \\"role\\": \\"tabpanel\\", + \\"tabindex\\": \\"0\\", + \\"aria-hidden\\": \\"false\\" + }, + \\"childNodes\\": [ + { + \\"type\\": 3, + \\"textContent\\": \\"content panel 2\\", + \\"id\\": 31 + } + ], + \\"id\\": 30 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 32 + }, + { + \\"type\\": 2, + \\"tagName\\": \\"section\\", + \\"attributes\\": { + \\"role\\": \\"tabpanel\\", + \\"tabindex\\": \\"0\\", + \\"aria-hidden\\": \\"true\\" + }, + \\"childNodes\\": [ + { + \\"type\\": 3, + \\"textContent\\": \\"content panel 3\\", + \\"id\\": 34 + } + ], + \\"id\\": 33 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 35 + }, + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n \\", + \\"id\\": 36, + \\"isShadow\\": true + }, + { + \\"type\\": 2, + \\"tagName\\": \\"style\\", + \\"attributes\\": {}, + \\"childNodes\\": [ + { + \\"type\\": 3, + \\"textContent\\": \\"\\\\n :host {\\\\n display: inline-block;\\\\n width: 650px;\\\\n font-family: 'Roboto Slab';\\\\n contain: content;\\\\n }\\\\n :host([background]) {\\\\n background: var(--background-color, #9E9E9E);\\\\n border-radius: 10px;\\\\n padding: 10px;\\\\n }\\\\n #panels {\\\\n box-shadow: 0 2px 2px rgba(0, 0, 0, .3);\\\\n background: white;\\\\n border-radius: 3px;\\\\n padding: 16px;\\\\n height: 250px;\\\\n overflow: auto;\\\\n }\\\\n #tabs {\\\\n display: inline-flex;\\\\n -webkit-user-select: none;\\\\n user-select: none;\\\\n }\\\\n #tabs slot {\\\\n display: inline-flex; /* Safari bug. Treats as a parent */\\\\n }\\\\n /* Safari does not support #id prefixes on ::slotted\\\\n See https://bugs.webkit.org/show_bug.cgi?id=160538 */\\\\n #tabs ::slotted(*) {\\\\n font: 400 16px/22px 'Roboto';\\\\n padding: 16px 8px;\\\\n margin: 0;\\\\n text-align: center;\\\\n width: 100px;\\\\n text-overflow: ellipsis;\\\\n white-space: nowrap;\\\\n overflow: hidden;\\\\n cursor: pointer;\\\\n border-top-left-radius: 3px;\\\\n border-top-right-radius: 3px;\\\\n background: linear-gradient(#fafafa, #eee);\\\\n border: none; /* if the user users a diff --git a/packages/rrweb-snapshot/test/html/iframe.html b/packages/rrweb-snapshot/test/html/iframe.html new file mode 100644 index 00000000..8b45139e --- /dev/null +++ b/packages/rrweb-snapshot/test/html/iframe.html @@ -0,0 +1,12 @@ + + + + + + + iframe + + + + + diff --git a/packages/rrweb-snapshot/test/html/invalid-attribute.html b/packages/rrweb-snapshot/test/html/invalid-attribute.html new file mode 100644 index 00000000..e2428e28 --- /dev/null +++ b/packages/rrweb-snapshot/test/html/invalid-attribute.html @@ -0,0 +1,3 @@ + + + diff --git a/packages/rrweb-snapshot/test/html/invalid-doctype.html b/packages/rrweb-snapshot/test/html/invalid-doctype.html new file mode 100644 index 00000000..395c916d --- /dev/null +++ b/packages/rrweb-snapshot/test/html/invalid-doctype.html @@ -0,0 +1,9 @@ + + + + + + Invalid Doctype + + + diff --git a/packages/rrweb-snapshot/test/html/invalid-tagname.html b/packages/rrweb-snapshot/test/html/invalid-tagname.html new file mode 100644 index 00000000..e28dd710 --- /dev/null +++ b/packages/rrweb-snapshot/test/html/invalid-tagname.html @@ -0,0 +1,14 @@ + + + + + + + Document + + + Hello + Hello + + + diff --git a/packages/rrweb-snapshot/test/html/mask-text.html b/packages/rrweb-snapshot/test/html/mask-text.html new file mode 100644 index 00000000..fe177a61 --- /dev/null +++ b/packages/rrweb-snapshot/test/html/mask-text.html @@ -0,0 +1,17 @@ + + + + + + + Document + + + +

mask 1

+
+ mask 2 +
+
mask 3
+ + diff --git a/packages/rrweb-snapshot/test/html/picture.html b/packages/rrweb-snapshot/test/html/picture.html new file mode 100644 index 00000000..27d83686 --- /dev/null +++ b/packages/rrweb-snapshot/test/html/picture.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/rrweb-snapshot/test/html/preload.html b/packages/rrweb-snapshot/test/html/preload.html new file mode 100644 index 00000000..32e84a26 --- /dev/null +++ b/packages/rrweb-snapshot/test/html/preload.html @@ -0,0 +1,11 @@ + + + + + + Document + + + + + diff --git a/packages/rrweb-snapshot/test/html/shadow-dom.html b/packages/rrweb-snapshot/test/html/shadow-dom.html new file mode 100644 index 00000000..0050bede --- /dev/null +++ b/packages/rrweb-snapshot/test/html/shadow-dom.html @@ -0,0 +1,209 @@ + + + + + + shadow DOM + + + + + + +
content panel 1
+
content panel 2
+
content panel 3
+
+ + + diff --git a/packages/rrweb-snapshot/test/html/video.html b/packages/rrweb-snapshot/test/html/video.html new file mode 100644 index 00000000..653f7172 --- /dev/null +++ b/packages/rrweb-snapshot/test/html/video.html @@ -0,0 +1,19 @@ + + + + + + + video + + + + + diff --git a/packages/rrweb-snapshot/test/html/with-relative-res.html b/packages/rrweb-snapshot/test/html/with-relative-res.html new file mode 100644 index 00000000..c390dc53 --- /dev/null +++ b/packages/rrweb-snapshot/test/html/with-relative-res.html @@ -0,0 +1,21 @@ + + + + + + + Document + + + + Hello + Hello + Hello + + + + + + + + \ No newline at end of file diff --git a/packages/rrweb-snapshot/test/html/with-script.html b/packages/rrweb-snapshot/test/html/with-script.html new file mode 100644 index 00000000..b4812e96 --- /dev/null +++ b/packages/rrweb-snapshot/test/html/with-script.html @@ -0,0 +1,18 @@ + + + + + + + + with script + + + + + + + + diff --git a/packages/rrweb-snapshot/test/html/with-style-sheet-with-import.html b/packages/rrweb-snapshot/test/html/with-style-sheet-with-import.html new file mode 100644 index 00000000..6b45f65b --- /dev/null +++ b/packages/rrweb-snapshot/test/html/with-style-sheet-with-import.html @@ -0,0 +1,16 @@ + + + + + + + + with style sheet with import + + + + + + + + diff --git a/packages/rrweb-snapshot/test/html/with-style-sheet.html b/packages/rrweb-snapshot/test/html/with-style-sheet.html new file mode 100644 index 00000000..2083dae9 --- /dev/null +++ b/packages/rrweb-snapshot/test/html/with-style-sheet.html @@ -0,0 +1,16 @@ + + + + + + + + with style sheet + + + + + + + + diff --git a/test/html/frame1.html b/packages/rrweb-snapshot/test/iframe-html/frame1.html similarity index 100% rename from test/html/frame1.html rename to packages/rrweb-snapshot/test/iframe-html/frame1.html diff --git a/packages/rrweb-snapshot/test/iframe-html/frame2.html b/packages/rrweb-snapshot/test/iframe-html/frame2.html new file mode 100644 index 00000000..34324085 --- /dev/null +++ b/packages/rrweb-snapshot/test/iframe-html/frame2.html @@ -0,0 +1,11 @@ + + + + + + Frame 2 + + + frame 2 + + diff --git a/packages/rrweb-snapshot/test/iframe-html/main.html b/packages/rrweb-snapshot/test/iframe-html/main.html new file mode 100644 index 00000000..d8e712bc --- /dev/null +++ b/packages/rrweb-snapshot/test/iframe-html/main.html @@ -0,0 +1,12 @@ + + + + + + Main + + + + + + diff --git a/packages/rrweb-snapshot/test/integration.ts b/packages/rrweb-snapshot/test/integration.ts new file mode 100644 index 00000000..751fbeed --- /dev/null +++ b/packages/rrweb-snapshot/test/integration.ts @@ -0,0 +1,215 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as http from 'http'; +import * as url from 'url'; +import 'mocha'; +import * as puppeteer from 'puppeteer'; +import * as rollup from 'rollup'; +import typescript = require('rollup-plugin-typescript'); +import { assert } from 'chai'; +import { SnapshotState, toMatchSnapshot } from 'jest-snapshot'; +import { Suite } from 'mocha'; + +const htmlFolder = path.join(__dirname, 'html'); +const htmls = fs.readdirSync(htmlFolder).map((filePath) => { + const raw = fs.readFileSync(path.resolve(htmlFolder, filePath), 'utf-8'); + return { + filePath, + src: raw, + }; +}); + +interface IMimeType { + [key: string]: string; +} + +const server = () => + new Promise((resolve) => { + const mimeType: IMimeType = { + '.html': 'text/html', + '.js': 'text/javascript', + '.css': 'text/css', + }; + const s = http.createServer((req, res) => { + const parsedUrl = url.parse(req.url!); + const sanitizePath = path + .normalize(parsedUrl.pathname!) + .replace(/^(\.\.[\/\\])+/, ''); + let pathname = path.join(__dirname, sanitizePath); + try { + const data = fs.readFileSync(pathname); + const ext = path.parse(pathname).ext; + res.setHeader('Content-type', mimeType[ext] || 'text/plain'); + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Methods', 'GET'); + res.setHeader('Access-Control-Allow-Headers', 'Content-type'); + res.end(data); + } catch (error) { + res.end(); + } + }); + s.listen(3030).on('listening', () => { + resolve(s); + }); + }); + +function matchSnapshot(actual: string, testFile: string, testTitle: string) { + const snapshotState = new SnapshotState(testFile, { + updateSnapshot: process.env.SNAPSHOT_UPDATE ? 'all' : 'new', + }); + + const matcher = toMatchSnapshot.bind({ + snapshotState, + currentTestName: testTitle, + }); + const result = matcher(actual); + snapshotState.save(); + return result; +} + +interface ISuite extends Suite { + server: http.Server; + browser: puppeteer.Browser; + code: string; +} + +describe('integration tests', function (this: ISuite) { + before(async () => { + this.server = await server(); + this.browser = await puppeteer.launch({ + // headless: false, + }); + + const bundle = await rollup.rollup({ + input: path.resolve(__dirname, '../src/index.ts'), + plugins: [typescript()], + }); + const { code } = await bundle.generate({ + name: 'rrweb', + format: 'iife', + }); + this.code = code; + }); + + after(async () => { + await this.browser.close(); + await this.server.close(); + }); + + for (const html of htmls) { + const title = '[html file]: ' + html.filePath; + it(title, async () => { + const page: puppeteer.Page = await this.browser.newPage(); + // console for debug + // tslint:disable-next-line: no-console + page.on('console', (msg) => console.log(msg.text())); + await page.goto(`http://localhost:3030/html`); + await page.setContent(html.src, { + waitUntil: 'load', + }); + const rebuildHtml = ( + await page.evaluate(`${this.code} + const x = new XMLSerializer(); + const [snap] = rrweb.snapshot(document); + x.serializeToString(rrweb.rebuild(snap, { doc: document })[0]); + `) + ).replace(/\n\n/g, ''); + const result = matchSnapshot(rebuildHtml, __filename, title); + assert(result.pass, result.pass ? '' : result.report()); + }).timeout(5000); + } +}); + +describe('iframe integration tests', function (this: ISuite) { + const iframeHtml = path.join(__dirname, 'iframe-html/main.html'); + const raw = fs.readFileSync(iframeHtml, 'utf-8'); + + before(async () => { + this.server = await server(); + this.browser = await puppeteer.launch({ + // headless: false, + }); + + const bundle = await rollup.rollup({ + input: path.resolve(__dirname, '../src/index.ts'), + plugins: [typescript()], + }); + const { code } = await bundle.generate({ + name: 'rrweb', + format: 'iife', + }); + this.code = code; + }); + + after(async () => { + await this.browser.close(); + await this.server.close(); + }); + + it('snapshot async iframes', async () => { + const page: puppeteer.Page = await this.browser.newPage(); + // console for debug + // tslint:disable-next-line: no-console + page.on('console', (msg) => console.log(msg.text())); + await page.goto(`http://localhost:3030/html`); + await page.setContent(raw, { + waitUntil: 'load', + }); + const snapshotResult = JSON.stringify( + await page.evaluate(`${this.code}; + rrweb.snapshot(document)[0]; + `), + null, + 2, + ); + const result = matchSnapshot(snapshotResult, __filename, this.title); + assert(result.pass, result.pass ? '' : result.report()); + }).timeout(5000); +}); + +describe('shadown DOM integration tests', function (this: ISuite) { + const shadowDomHtml = path.join(__dirname, 'html/shadow-dom.html'); + const raw = fs.readFileSync(shadowDomHtml, 'utf-8'); + + before(async () => { + this.server = await server(); + this.browser = await puppeteer.launch({ + // headless: false, + }); + + const bundle = await rollup.rollup({ + input: path.resolve(__dirname, '../src/index.ts'), + plugins: [typescript()], + }); + const { code } = await bundle.generate({ + name: 'rrweb', + format: 'iife', + }); + this.code = code; + }); + + after(async () => { + await this.browser.close(); + await this.server.close(); + }); + + it('snapshot shadow DOM', async () => { + const page: puppeteer.Page = await this.browser.newPage(); + // console for debug + // tslint:disable-next-line: no-console + page.on('console', (msg) => console.log(msg.text())); + await page.goto(`http://localhost:3030/html`); + await page.setContent(raw, { + waitUntil: 'load', + }); + const snapshotResult = JSON.stringify( + await page.evaluate(`${this.code}; + rrweb.snapshot(document)[0]; + `), + null, + 2, + ); + const result = matchSnapshot(snapshotResult, __filename, this.title); + assert(result.pass, result.pass ? '' : result.report()); + }).timeout(5000); +}); diff --git a/packages/rrweb-snapshot/test/js/a.js b/packages/rrweb-snapshot/test/js/a.js new file mode 100644 index 00000000..7a776f91 --- /dev/null +++ b/packages/rrweb-snapshot/test/js/a.js @@ -0,0 +1 @@ +var a = 1 + 1; diff --git a/packages/rrweb-snapshot/test/rebuild.test.ts b/packages/rrweb-snapshot/test/rebuild.test.ts new file mode 100644 index 00000000..a343e780 --- /dev/null +++ b/packages/rrweb-snapshot/test/rebuild.test.ts @@ -0,0 +1,64 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import 'mocha'; +import { expect } from 'chai'; +import { addHoverClass } from '../src/rebuild'; + +describe('add hover class to hover selector related rules', () => { + it('will do nothing to css text without :hover', () => { + const cssText = 'body { color: white }'; + expect(addHoverClass(cssText)).to.equal(cssText); + }); + + it('can add hover class to css text', () => { + const cssText = '.a:hover { color: white }'; + expect(addHoverClass(cssText)).to.equal( + '.a:hover, .a.\\:hover { color: white }', + ); + }); + + it('can add hover class when there is multi selector', () => { + const cssText = '.a, .b:hover, .c { color: white }'; + expect(addHoverClass(cssText)).to.equal( + '.a, .b:hover, .b.\\:hover, .c { color: white }', + ); + }); + + it('can add hover class when there is a multi selector with the same prefix', () => { + const cssText = '.a:hover, .a:hover::after { color: white }'; + expect(addHoverClass(cssText)).to.equal( + '.a:hover, .a.\\:hover, .a:hover::after, .a.\\:hover::after { color: white }', + ); + }); + + it('can add hover class when :hover is not the end of selector', () => { + const cssText = 'div:hover::after { color: white }'; + expect(addHoverClass(cssText)).to.equal( + 'div:hover::after, div.\\:hover::after { color: white }', + ); + }); + + it('can add hover class when the selector has multi :hover', () => { + const cssText = 'a:hover b:hover { color: white }'; + expect(addHoverClass(cssText)).to.equal( + 'a:hover b:hover, a.\\:hover b.\\:hover { color: white }', + ); + }); + + it('will ignore :hover in css value', () => { + const cssText = '.a::after { content: ":hover" }'; + expect(addHoverClass(cssText)).to.equal(cssText); + }); + + it('benchmark', () => { + const cssText = fs.readFileSync( + path.resolve(__dirname, './css/benchmark.css'), + 'utf8', + ); + const start = process.hrtime(); + addHoverClass(cssText); + const end = process.hrtime(start); + const duration = end[0] * 1_000 + end[1] / 1_000_000; + expect(duration).to.below(100); + }); +}); diff --git a/packages/rrweb-snapshot/test/snapshot.test.ts b/packages/rrweb-snapshot/test/snapshot.test.ts new file mode 100644 index 00000000..4d96a02b --- /dev/null +++ b/packages/rrweb-snapshot/test/snapshot.test.ts @@ -0,0 +1,130 @@ +import 'mocha'; +import { JSDOM } from 'jsdom'; +import { expect } from 'chai'; +import { absoluteToStylesheet, _isBlockedElement } from '../src/snapshot'; + +describe('absolute url to stylesheet', () => { + const href = 'http://localhost/css/style.css'; + + it('can handle relative path', () => { + expect(absoluteToStylesheet('url(a.jpg)', href)).to.equal( + `url(http://localhost/css/a.jpg)`, + ); + }); + + it('can handle same level path', () => { + expect(absoluteToStylesheet('url("./a.jpg")', href)).to.equal( + `url("http://localhost/css/a.jpg")`, + ); + }); + + it('can handle parent level path', () => { + expect(absoluteToStylesheet('url("../a.jpg")', href)).to.equal( + `url("http://localhost/a.jpg")`, + ); + }); + + it('can handle absolute path', () => { + expect(absoluteToStylesheet('url("/a.jpg")', href)).to.equal( + `url("http://localhost/a.jpg")`, + ); + }); + + it('can handle external path', () => { + expect( + absoluteToStylesheet('url("http://localhost/a.jpg")', href), + ).to.equal(`url("http://localhost/a.jpg")`); + }); + + it('can handle single quote path', () => { + expect(absoluteToStylesheet(`url('./a.jpg')`, href)).to.equal( + `url('http://localhost/css/a.jpg')`, + ); + }); + + it('can handle no quote path', () => { + expect(absoluteToStylesheet('url(./a.jpg)', href)).to.equal( + `url(http://localhost/css/a.jpg)`, + ); + }); + + it('can handle multiple no quote paths', () => { + expect( + absoluteToStylesheet( + 'background-image: url(images/b.jpg);background: #aabbcc url(images/a.jpg) 50% 50% repeat;', + href, + ), + ).to.equal( + `background-image: url(http://localhost/css/images/b.jpg);` + + `background: #aabbcc url(http://localhost/css/images/a.jpg) 50% 50% repeat;`, + ); + }); + + it('can handle data url image', () => { + expect( + absoluteToStylesheet('url(data:image/gif;base64,ABC)', href), + ).to.equal('url(data:image/gif;base64,ABC)'); + expect( + absoluteToStylesheet( + 'url(data:application/font-woff;base64,d09GMgABAAAAAAm)', + href, + ), + ).to.equal('url(data:application/font-woff;base64,d09GMgABAAAAAAm)'); + }); + + it('preserves quotes around inline svgs with spaces', () => { + expect( + absoluteToStylesheet( + "url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%2328a745' d='M3'/%3E%3C/svg%3E\")", + href, + ), + ).to.equal( + "url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%2328a745' d='M3'/%3E%3C/svg%3E\")", + ); + expect( + absoluteToStylesheet( + 'url(\'data:image/svg+xml;utf8,\')', + href, + ), + ).to.equal( + 'url(\'data:image/svg+xml;utf8,\')', + ); + expect( + absoluteToStylesheet( + 'url("data:image/svg+xml;utf8,")', + href, + ), + ).to.equal( + 'url("data:image/svg+xml;utf8,")', + ); + }); + it('can handle empty path', () => { + expect(absoluteToStylesheet(`url('')`, href)).to.equal(`url('')`); + }); +}); + +describe('isBlockedElement()', () => { + const subject = (html: string, opt: any = {}) => + _isBlockedElement(render(html), 'rr-block', opt.blockSelector); + + const render = (html: string): HTMLElement => + JSDOM.fragment(html).querySelector('div')!; + + it('can handle empty elements', () => { + expect(subject('
')).to.equal(false); + }); + + it('blocks prohibited className', () => { + expect(subject('
')).to.equal(true); + }); + + it('does not block random data selector', () => { + expect(subject('
')).to.equal(false); + }); + + it('blocks blocked selector', () => { + expect( + subject('
', { blockSelector: '[data-rr-block]' }), + ).to.equal(true); + }); +}); diff --git a/packages/rrweb-snapshot/tsconfig.json b/packages/rrweb-snapshot/tsconfig.json new file mode 100644 index 00000000..d58ee546 --- /dev/null +++ b/packages/rrweb-snapshot/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "commonjs", + "noImplicitAny": true, + "strictNullChecks": true, + "removeComments": true, + "preserveConstEnums": true, + "sourceMap": true, + "rootDir": "src", + "outDir": "build", + "lib": ["es6", "dom"] + }, + "compileOnSave": true, + "exclude": ["test"], + "include": ["src", "test.d.ts"] +} diff --git a/packages/rrweb-snapshot/tslint.json b/packages/rrweb-snapshot/tslint.json new file mode 100644 index 00000000..a153081c --- /dev/null +++ b/packages/rrweb-snapshot/tslint.json @@ -0,0 +1,21 @@ +{ + "defaultSeverity": "error", + "extends": ["tslint:recommended"], + "jsRules": {}, + "rules": { + "no-any": true, + "quotemark": [true, "single"], + "ordered-imports": false, + "object-literal-sort-keys": false, + "no-unused-variable": true, + "object-literal-key-quotes": false, + "variable-name": [ + true, + "ban-keywords", + "check-format", + "allow-leading-underscore" + ], + "arrow-parens": false + }, + "rulesDirectory": [] +} diff --git a/packages/rrweb-snapshot/typings/css.d.ts b/packages/rrweb-snapshot/typings/css.d.ts new file mode 100644 index 00000000..6207385a --- /dev/null +++ b/packages/rrweb-snapshot/typings/css.d.ts @@ -0,0 +1,92 @@ +export interface ParserOptions { + silent?: boolean; + source?: string; +} +export interface ParserError { + message?: string; + reason?: string; + filename?: string; + line?: number; + column?: number; + source?: string; +} +export interface Loc { + line?: number; + column?: number; +} +export interface Node { + type?: string; + parent?: Node; + position?: { + start?: Loc; + end?: Loc; + source?: string; + content?: string; + }; +} +export interface Rule extends Node { + selectors?: string[]; + declarations?: Array; +} +export interface Declaration extends Node { + property?: string; + value?: string; +} +export interface Comment extends Node { + comment?: string; +} +export interface Charset extends Node { + charset?: string; +} +export interface CustomMedia extends Node { + name?: string; + media?: string; +} +export interface Document extends Node { + document?: string; + vendor?: string; + rules?: Array; +} +export interface FontFace extends Node { + declarations?: Array; +} +export interface Host extends Node { + rules?: Array; +} +export interface Import extends Node { + import?: string; +} +export interface KeyFrames extends Node { + name?: string; + vendor?: string; + keyframes?: Array; +} +export interface KeyFrame extends Node { + values?: string[]; + declarations?: Array; +} +export interface Media extends Node { + media?: string; + rules?: Array; +} +export interface Namespace extends Node { + namespace?: string; +} +export interface Page extends Node { + selectors?: string[]; + declarations?: Array; +} +export interface Supports extends Node { + supports?: string; + rules?: Array; +} +export declare type AtRule = Charset | CustomMedia | Document | FontFace | Host | Import | KeyFrames | Media | Namespace | Page | Supports; +export interface StyleRules { + source?: string; + rules: Array; + parsingErrors?: ParserError[]; +} +export interface Stylesheet extends Node { + stylesheet?: StyleRules; +} +export declare function parse(css: string, options?: ParserOptions): Stylesheet; diff --git a/packages/rrweb-snapshot/typings/index.d.ts b/packages/rrweb-snapshot/typings/index.d.ts new file mode 100644 index 00000000..000750d0 --- /dev/null +++ b/packages/rrweb-snapshot/typings/index.d.ts @@ -0,0 +1,5 @@ +import snapshot, { serializeNodeWithId, transformAttribute, visitSnapshot, cleanupSnapshot, needMaskingText, IGNORED_NODE } from './snapshot'; +import rebuild, { buildNodeWithSN, addHoverClass } from './rebuild'; +export * from './types'; +export * from './utils'; +export { snapshot, serializeNodeWithId, rebuild, buildNodeWithSN, addHoverClass, transformAttribute, visitSnapshot, cleanupSnapshot, needMaskingText, IGNORED_NODE, }; diff --git a/packages/rrweb-snapshot/typings/rebuild.d.ts b/packages/rrweb-snapshot/typings/rebuild.d.ts new file mode 100644 index 00000000..6ab9f04b --- /dev/null +++ b/packages/rrweb-snapshot/typings/rebuild.d.ts @@ -0,0 +1,16 @@ +import { serializedNodeWithId, idNodeMap, INode } from './types'; +export declare function addHoverClass(cssText: string): string; +export declare function buildNodeWithSN(n: serializedNodeWithId, options: { + doc: Document; + map: idNodeMap; + skipChild?: boolean; + hackCss: boolean; + afterAppend?: (n: INode) => unknown; +}): INode | null; +declare function rebuild(n: serializedNodeWithId, options: { + doc: Document; + onVisit?: (node: INode) => unknown; + hackCss?: boolean; + afterAppend?: (n: INode) => unknown; +}): [Node | null, idNodeMap]; +export default rebuild; diff --git a/packages/rrweb-snapshot/typings/snapshot.d.ts b/packages/rrweb-snapshot/typings/snapshot.d.ts new file mode 100644 index 00000000..9ccb147a --- /dev/null +++ b/packages/rrweb-snapshot/typings/snapshot.d.ts @@ -0,0 +1,47 @@ +import { serializedNodeWithId, INode, idNodeMap, MaskInputOptions, SlimDOMOptions, MaskTextFn, MaskInputFn, KeepIframeSrcFn } from './types'; +export declare const IGNORED_NODE = -2; +export declare function absoluteToStylesheet(cssText: string | null, href: string): string; +export declare function absoluteToDoc(doc: Document, attributeValue: string): string; +export declare function transformAttribute(doc: Document, tagName: string, name: string, value: string): string; +export declare function _isBlockedElement(element: HTMLElement, blockClass: string | RegExp, blockSelector: string | null): boolean; +export declare function needMaskingText(node: Node | null, maskTextClass: string | RegExp, maskTextSelector: string | null): boolean; +export declare function serializeNodeWithId(n: Node | INode, options: { + doc: Document; + map: idNodeMap; + blockClass: string | RegExp; + blockSelector: string | null; + maskTextClass: string | RegExp; + maskTextSelector: string | null; + skipChild: boolean; + inlineStylesheet: boolean; + maskInputOptions?: MaskInputOptions; + maskTextFn: MaskTextFn | undefined; + maskInputFn: MaskInputFn | undefined; + slimDOMOptions: SlimDOMOptions; + keepIframeSrcFn?: KeepIframeSrcFn; + recordCanvas?: boolean; + preserveWhiteSpace?: boolean; + onSerialize?: (n: INode) => unknown; + onIframeLoad?: (iframeINode: INode, node: serializedNodeWithId) => unknown; + iframeLoadTimeout?: number; +}): serializedNodeWithId | null; +declare function snapshot(n: Document, options?: { + blockClass?: string | RegExp; + blockSelector?: string | null; + maskTextClass?: string | RegExp; + maskTextSelector?: string | null; + inlineStylesheet?: boolean; + maskAllInputs?: boolean | MaskInputOptions; + maskTextFn?: MaskTextFn; + maskInputFn?: MaskTextFn; + slimDOM?: boolean | SlimDOMOptions; + recordCanvas?: boolean; + preserveWhiteSpace?: boolean; + onSerialize?: (n: INode) => unknown; + onIframeLoad?: (iframeINode: INode, node: serializedNodeWithId) => unknown; + iframeLoadTimeout?: number; + keepIframeSrcFn?: KeepIframeSrcFn; +}): [serializedNodeWithId | null, idNodeMap]; +export declare function visitSnapshot(node: serializedNodeWithId, onVisit: (node: serializedNodeWithId) => unknown): void; +export declare function cleanupSnapshot(): void; +export default snapshot; diff --git a/packages/rrweb-snapshot/typings/types.d.ts b/packages/rrweb-snapshot/typings/types.d.ts new file mode 100644 index 00000000..8524801c --- /dev/null +++ b/packages/rrweb-snapshot/typings/types.d.ts @@ -0,0 +1,92 @@ +export declare enum NodeType { + Document = 0, + DocumentType = 1, + Element = 2, + Text = 3, + CDATA = 4, + Comment = 5 +} +export declare type documentNode = { + type: NodeType.Document; + childNodes: serializedNodeWithId[]; +}; +export declare type documentTypeNode = { + type: NodeType.DocumentType; + name: string; + publicId: string; + systemId: string; +}; +export declare type attributes = { + [key: string]: string | number | boolean; +}; +export declare type elementNode = { + type: NodeType.Element; + tagName: string; + attributes: attributes; + childNodes: serializedNodeWithId[]; + isSVG?: true; + needBlock?: boolean; +}; +export declare type textNode = { + type: NodeType.Text; + textContent: string; + isStyle?: true; +}; +export declare type cdataNode = { + type: NodeType.CDATA; + textContent: ''; +}; +export declare type commentNode = { + type: NodeType.Comment; + textContent: string; +}; +export declare type serializedNode = (documentNode | documentTypeNode | elementNode | textNode | cdataNode | commentNode) & { + rootId?: number; + isShadowHost?: boolean; + isShadow?: boolean; +}; +export declare type serializedNodeWithId = serializedNode & { + id: number; +}; +export declare type tagMap = { + [key: string]: string; +}; +export interface INode extends Node { + __sn: serializedNodeWithId; +} +export declare type idNodeMap = { + [key: number]: INode; +}; +export declare type MaskInputOptions = Partial<{ + color: boolean; + date: boolean; + 'datetime-local': boolean; + email: boolean; + month: boolean; + number: boolean; + range: boolean; + search: boolean; + tel: boolean; + text: boolean; + time: boolean; + url: boolean; + week: boolean; + textarea: boolean; + select: boolean; + password: boolean; +}>; +export declare type SlimDOMOptions = Partial<{ + script: boolean; + comment: boolean; + headFavicon: boolean; + headWhitespace: boolean; + headMetaDescKeywords: boolean; + headMetaSocial: boolean; + headMetaRobots: boolean; + headMetaHttpEquiv: boolean; + headMetaAuthorship: boolean; + headMetaVerification: boolean; +}>; +export declare type MaskTextFn = (text: string) => string; +export declare type MaskInputFn = (text: string) => string; +export declare type KeepIframeSrcFn = (src: string) => boolean; diff --git a/packages/rrweb-snapshot/typings/utils.d.ts b/packages/rrweb-snapshot/typings/utils.d.ts new file mode 100644 index 00000000..dfb1b70a --- /dev/null +++ b/packages/rrweb-snapshot/typings/utils.d.ts @@ -0,0 +1,10 @@ +import { INode, MaskInputFn, MaskInputOptions } from './types'; +export declare function isElement(n: Node | INode): n is Element; +export declare function isShadowRoot(n: Node): n is ShadowRoot; +export declare function maskInputValue({ maskInputOptions, tagName, type, value, maskInputFn, }: { + maskInputOptions: MaskInputOptions; + tagName: string; + type: string | number | boolean | null; + value: string | null; + maskInputFn?: MaskInputFn; +}): string; diff --git a/packages/rrweb/.gitignore b/packages/rrweb/.gitignore new file mode 100644 index 00000000..afbda82b --- /dev/null +++ b/packages/rrweb/.gitignore @@ -0,0 +1,15 @@ +.vscode +.idea +node_modules +package-lock.json +# yarn.lock +build +dist +es +lib + +temp + +*.log + +.env diff --git a/.release-it.json b/packages/rrweb/.release-it.json similarity index 100% rename from .release-it.json rename to packages/rrweb/.release-it.json diff --git a/packages/rrweb/package.json b/packages/rrweb/package.json new file mode 100644 index 00000000..9b4cc861 --- /dev/null +++ b/packages/rrweb/package.json @@ -0,0 +1,79 @@ +{ + "name": "rrweb", + "version": "1.0.2", + "description": "record and replay the web", + "scripts": { + "prepare": "npm run prepack", + "prepack": "npm run bundle", + "test": "npm run bundle:browser && cross-env TS_NODE_CACHE=false TS_NODE_FILES=true mocha -r ts-node/register -r ignore-styles -r jsdom-global/register test/**.test.ts", + "test:headless": "npm run bundle:browser && cross-env TS_NODE_CACHE=false TS_NODE_FILES=true PUPPETEER_HEADLESS=true mocha -r ts-node/register -r ignore-styles -r jsdom-global/register test/**.test.ts", + "test:watch": "PUPPETEER_HEADLESS=true npm run test -- --watch --watch-extensions js,ts", + "repl": "npm run bundle:browser && cross-env TS_NODE_CACHE=false TS_NODE_FILES=true ts-node scripts/repl.ts", + "bundle:browser": "cross-env BROWSER_ONLY=true rollup --config", + "bundle": "rollup --config", + "typings": "tsc -d --declarationDir typings", + "check-types": "tsc -noEmit" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/rrweb-io/rrweb.git" + }, + "keywords": [ + "rrweb" + ], + "main": "lib/rrweb-all.js", + "module": "es/rrweb/src/entries/all.js", + "unpkg": "dist/rrweb.js", + "sideEffects": false, + "typings": "typings/entries/all.d.ts", + "files": [ + "dist", + "lib", + "es", + "typings" + ], + "author": "yanzhen@smartx.com", + "license": "MIT", + "bugs": { + "url": "https://github.com/rrweb-io/rrweb/issues" + }, + "homepage": "https://github.com/rrweb-io/rrweb#readme", + "devDependencies": { + "@types/chai": "^4.1.6", + "@types/inquirer": "0.0.43", + "@types/jsdom": "^16.2.12", + "@types/mocha": "^5.2.5", + "@types/node": "^12.20.16", + "@types/prettier": "^2.3.2", + "@types/puppeteer": "^5.4.3", + "chai": "^4.2.0", + "cross-env": "^5.2.0", + "fast-mhtml": "^1.1.9", + "ignore-styles": "^5.0.1", + "inquirer": "^6.2.1", + "jest-snapshot": "^23.6.0", + "jsdom": "^16.6.0", + "jsdom-global": "^3.0.2", + "mocha": "^5.2.0", + "prettier": "2.2.1", + "puppeteer": "^9.1.1", + "rollup": "^2.3.3", + "rollup-plugin-commonjs": "^9.2.0", + "rollup-plugin-node-resolve": "^3.4.0", + "rollup-plugin-postcss": "^3.1.1", + "rollup-plugin-rename-node-modules": "^1.1.0", + "rollup-plugin-terser": "^5.3.0", + "rollup-plugin-typescript": "^1.0.0", + "ts-node": "^7.0.1", + "tslib": "^1.9.3", + "tslint": "^4.5.1", + "typescript": "^3.9.5" + }, + "dependencies": { + "@types/css-font-loading-module": "0.0.4", + "@xstate/fsm": "^1.4.0", + "fflate": "^0.4.4", + "mitt": "^1.1.3", + "rrweb-snapshot": "^1.1.7" + } +} diff --git a/rollup.config.js b/packages/rrweb/rollup.config.js similarity index 100% rename from rollup.config.js rename to packages/rrweb/rollup.config.js diff --git a/scripts/repl.ts b/packages/rrweb/scripts/repl.ts similarity index 100% rename from scripts/repl.ts rename to packages/rrweb/scripts/repl.ts diff --git a/src/entries/all.ts b/packages/rrweb/src/entries/all.ts similarity index 100% rename from src/entries/all.ts rename to packages/rrweb/src/entries/all.ts diff --git a/src/entries/record-pack.ts b/packages/rrweb/src/entries/record-pack.ts similarity index 100% rename from src/entries/record-pack.ts rename to packages/rrweb/src/entries/record-pack.ts diff --git a/src/entries/replay-unpack.ts b/packages/rrweb/src/entries/replay-unpack.ts similarity index 100% rename from src/entries/replay-unpack.ts rename to packages/rrweb/src/entries/replay-unpack.ts diff --git a/src/index.ts b/packages/rrweb/src/index.ts similarity index 100% rename from src/index.ts rename to packages/rrweb/src/index.ts diff --git a/src/packer/base.ts b/packages/rrweb/src/packer/base.ts similarity index 100% rename from src/packer/base.ts rename to packages/rrweb/src/packer/base.ts diff --git a/src/packer/index.ts b/packages/rrweb/src/packer/index.ts similarity index 100% rename from src/packer/index.ts rename to packages/rrweb/src/packer/index.ts diff --git a/src/packer/pack.ts b/packages/rrweb/src/packer/pack.ts similarity index 100% rename from src/packer/pack.ts rename to packages/rrweb/src/packer/pack.ts diff --git a/src/packer/unpack.ts b/packages/rrweb/src/packer/unpack.ts similarity index 100% rename from src/packer/unpack.ts rename to packages/rrweb/src/packer/unpack.ts diff --git a/src/plugins/console/record/error-stack-parser.ts b/packages/rrweb/src/plugins/console/record/error-stack-parser.ts similarity index 100% rename from src/plugins/console/record/error-stack-parser.ts rename to packages/rrweb/src/plugins/console/record/error-stack-parser.ts diff --git a/src/plugins/console/record/index.ts b/packages/rrweb/src/plugins/console/record/index.ts similarity index 100% rename from src/plugins/console/record/index.ts rename to packages/rrweb/src/plugins/console/record/index.ts diff --git a/src/plugins/console/record/stringify.ts b/packages/rrweb/src/plugins/console/record/stringify.ts similarity index 100% rename from src/plugins/console/record/stringify.ts rename to packages/rrweb/src/plugins/console/record/stringify.ts diff --git a/src/plugins/console/replay/index.ts b/packages/rrweb/src/plugins/console/replay/index.ts similarity index 100% rename from src/plugins/console/replay/index.ts rename to packages/rrweb/src/plugins/console/replay/index.ts diff --git a/src/record/iframe-manager.ts b/packages/rrweb/src/record/iframe-manager.ts similarity index 100% rename from src/record/iframe-manager.ts rename to packages/rrweb/src/record/iframe-manager.ts diff --git a/src/record/index.ts b/packages/rrweb/src/record/index.ts similarity index 100% rename from src/record/index.ts rename to packages/rrweb/src/record/index.ts diff --git a/src/record/mutation.ts b/packages/rrweb/src/record/mutation.ts similarity index 100% rename from src/record/mutation.ts rename to packages/rrweb/src/record/mutation.ts diff --git a/src/record/observer.ts b/packages/rrweb/src/record/observer.ts similarity index 100% rename from src/record/observer.ts rename to packages/rrweb/src/record/observer.ts diff --git a/src/record/shadow-dom-manager.ts b/packages/rrweb/src/record/shadow-dom-manager.ts similarity index 100% rename from src/record/shadow-dom-manager.ts rename to packages/rrweb/src/record/shadow-dom-manager.ts diff --git a/src/replay/index.ts b/packages/rrweb/src/replay/index.ts similarity index 100% rename from src/replay/index.ts rename to packages/rrweb/src/replay/index.ts diff --git a/src/replay/machine.ts b/packages/rrweb/src/replay/machine.ts similarity index 100% rename from src/replay/machine.ts rename to packages/rrweb/src/replay/machine.ts diff --git a/src/replay/smoothscroll.ts b/packages/rrweb/src/replay/smoothscroll.ts similarity index 100% rename from src/replay/smoothscroll.ts rename to packages/rrweb/src/replay/smoothscroll.ts diff --git a/src/replay/styles/inject-style.ts b/packages/rrweb/src/replay/styles/inject-style.ts similarity index 100% rename from src/replay/styles/inject-style.ts rename to packages/rrweb/src/replay/styles/inject-style.ts diff --git a/src/replay/styles/style.css b/packages/rrweb/src/replay/styles/style.css similarity index 100% rename from src/replay/styles/style.css rename to packages/rrweb/src/replay/styles/style.css diff --git a/src/replay/timer.ts b/packages/rrweb/src/replay/timer.ts similarity index 100% rename from src/replay/timer.ts rename to packages/rrweb/src/replay/timer.ts diff --git a/src/replay/virtual-styles.ts b/packages/rrweb/src/replay/virtual-styles.ts similarity index 100% rename from src/replay/virtual-styles.ts rename to packages/rrweb/src/replay/virtual-styles.ts diff --git a/src/rrdom/index.ts b/packages/rrweb/src/rrdom/index.ts similarity index 100% rename from src/rrdom/index.ts rename to packages/rrweb/src/rrdom/index.ts diff --git a/src/rrdom/tree-node.ts b/packages/rrweb/src/rrdom/tree-node.ts similarity index 100% rename from src/rrdom/tree-node.ts rename to packages/rrweb/src/rrdom/tree-node.ts diff --git a/src/types.ts b/packages/rrweb/src/types.ts similarity index 100% rename from src/types.ts rename to packages/rrweb/src/types.ts diff --git a/src/utils.ts b/packages/rrweb/src/utils.ts similarity index 100% rename from src/utils.ts rename to packages/rrweb/src/utils.ts diff --git a/test.d.ts b/packages/rrweb/test.d.ts similarity index 100% rename from test.d.ts rename to packages/rrweb/test.d.ts diff --git a/test/__snapshots__/integration.test.ts.snap b/packages/rrweb/test/__snapshots__/integration.test.ts.snap similarity index 100% rename from test/__snapshots__/integration.test.ts.snap rename to packages/rrweb/test/__snapshots__/integration.test.ts.snap diff --git a/test/__snapshots__/packer.test.ts.snap b/packages/rrweb/test/__snapshots__/packer.test.ts.snap similarity index 100% rename from test/__snapshots__/packer.test.ts.snap rename to packages/rrweb/test/__snapshots__/packer.test.ts.snap diff --git a/test/__snapshots__/record.test.ts.snap b/packages/rrweb/test/__snapshots__/record.test.ts.snap similarity index 100% rename from test/__snapshots__/record.test.ts.snap rename to packages/rrweb/test/__snapshots__/record.test.ts.snap diff --git a/test/__snapshots__/replayer.test.ts.snap b/packages/rrweb/test/__snapshots__/replayer.test.ts.snap similarity index 100% rename from test/__snapshots__/replayer.test.ts.snap rename to packages/rrweb/test/__snapshots__/replayer.test.ts.snap diff --git a/test/events/style-sheet-rule-events.ts b/packages/rrweb/test/events/style-sheet-rule-events.ts similarity index 100% rename from test/events/style-sheet-rule-events.ts rename to packages/rrweb/test/events/style-sheet-rule-events.ts diff --git a/test/html/block.html b/packages/rrweb/test/html/block.html similarity index 100% rename from test/html/block.html rename to packages/rrweb/test/html/block.html diff --git a/test/html/canvas.html b/packages/rrweb/test/html/canvas.html similarity index 100% rename from test/html/canvas.html rename to packages/rrweb/test/html/canvas.html diff --git a/test/html/form.html b/packages/rrweb/test/html/form.html similarity index 100% rename from test/html/form.html rename to packages/rrweb/test/html/form.html diff --git a/packages/rrweb/test/html/frame1.html b/packages/rrweb/test/html/frame1.html new file mode 100644 index 00000000..8810af46 --- /dev/null +++ b/packages/rrweb/test/html/frame1.html @@ -0,0 +1,13 @@ + + + + + + Frame 1 + + + frame 1 + + + + diff --git a/test/html/frame2.html b/packages/rrweb/test/html/frame2.html similarity index 100% rename from test/html/frame2.html rename to packages/rrweb/test/html/frame2.html diff --git a/test/html/ignore.html b/packages/rrweb/test/html/ignore.html similarity index 100% rename from test/html/ignore.html rename to packages/rrweb/test/html/ignore.html diff --git a/test/html/log.html b/packages/rrweb/test/html/log.html similarity index 100% rename from test/html/log.html rename to packages/rrweb/test/html/log.html diff --git a/test/html/main.html b/packages/rrweb/test/html/main.html similarity index 100% rename from test/html/main.html rename to packages/rrweb/test/html/main.html diff --git a/test/html/mask-text.html b/packages/rrweb/test/html/mask-text.html similarity index 100% rename from test/html/mask-text.html rename to packages/rrweb/test/html/mask-text.html diff --git a/test/html/move-node.html b/packages/rrweb/test/html/move-node.html similarity index 100% rename from test/html/move-node.html rename to packages/rrweb/test/html/move-node.html diff --git a/test/html/mutation-observer.html b/packages/rrweb/test/html/mutation-observer.html similarity index 100% rename from test/html/mutation-observer.html rename to packages/rrweb/test/html/mutation-observer.html diff --git a/test/html/password.html b/packages/rrweb/test/html/password.html similarity index 100% rename from test/html/password.html rename to packages/rrweb/test/html/password.html diff --git a/test/html/react-styled-components.html b/packages/rrweb/test/html/react-styled-components.html similarity index 100% rename from test/html/react-styled-components.html rename to packages/rrweb/test/html/react-styled-components.html diff --git a/test/html/select2.html b/packages/rrweb/test/html/select2.html similarity index 100% rename from test/html/select2.html rename to packages/rrweb/test/html/select2.html diff --git a/test/html/shadow-dom.html b/packages/rrweb/test/html/shadow-dom.html similarity index 100% rename from test/html/shadow-dom.html rename to packages/rrweb/test/html/shadow-dom.html diff --git a/test/html/shuffle.html b/packages/rrweb/test/html/shuffle.html similarity index 100% rename from test/html/shuffle.html rename to packages/rrweb/test/html/shuffle.html diff --git a/test/integration.test.ts b/packages/rrweb/test/integration.test.ts similarity index 100% rename from test/integration.test.ts rename to packages/rrweb/test/integration.test.ts diff --git a/test/machine.test.ts b/packages/rrweb/test/machine.test.ts similarity index 100% rename from test/machine.test.ts rename to packages/rrweb/test/machine.test.ts diff --git a/test/packer.test.ts b/packages/rrweb/test/packer.test.ts similarity index 100% rename from test/packer.test.ts rename to packages/rrweb/test/packer.test.ts diff --git a/test/record.test.ts b/packages/rrweb/test/record.test.ts similarity index 100% rename from test/record.test.ts rename to packages/rrweb/test/record.test.ts diff --git a/test/replay/virtual-styles.test.ts b/packages/rrweb/test/replay/virtual-styles.test.ts similarity index 100% rename from test/replay/virtual-styles.test.ts rename to packages/rrweb/test/replay/virtual-styles.test.ts diff --git a/test/replayer.test.ts b/packages/rrweb/test/replayer.test.ts similarity index 100% rename from test/replayer.test.ts rename to packages/rrweb/test/replayer.test.ts diff --git a/test/utils.ts b/packages/rrweb/test/utils.ts similarity index 100% rename from test/utils.ts rename to packages/rrweb/test/utils.ts diff --git a/tsconfig.json b/packages/rrweb/tsconfig.json similarity index 100% rename from tsconfig.json rename to packages/rrweb/tsconfig.json diff --git a/tslint.json b/packages/rrweb/tslint.json similarity index 100% rename from tslint.json rename to packages/rrweb/tslint.json diff --git a/typings/boost.d.ts b/packages/rrweb/typings/boost.d.ts similarity index 100% rename from typings/boost.d.ts rename to packages/rrweb/typings/boost.d.ts diff --git a/typings/entries/all.d.ts b/packages/rrweb/typings/entries/all.d.ts similarity index 100% rename from typings/entries/all.d.ts rename to packages/rrweb/typings/entries/all.d.ts diff --git a/typings/entries/record-pack.d.ts b/packages/rrweb/typings/entries/record-pack.d.ts similarity index 100% rename from typings/entries/record-pack.d.ts rename to packages/rrweb/typings/entries/record-pack.d.ts diff --git a/typings/entries/replay-unpack.d.ts b/packages/rrweb/typings/entries/replay-unpack.d.ts similarity index 100% rename from typings/entries/replay-unpack.d.ts rename to packages/rrweb/typings/entries/replay-unpack.d.ts diff --git a/typings/index.d.ts b/packages/rrweb/typings/index.d.ts similarity index 100% rename from typings/index.d.ts rename to packages/rrweb/typings/index.d.ts diff --git a/typings/packer/base.d.ts b/packages/rrweb/typings/packer/base.d.ts similarity index 100% rename from typings/packer/base.d.ts rename to packages/rrweb/typings/packer/base.d.ts diff --git a/typings/packer/index.d.ts b/packages/rrweb/typings/packer/index.d.ts similarity index 100% rename from typings/packer/index.d.ts rename to packages/rrweb/typings/packer/index.d.ts diff --git a/typings/packer/pack.d.ts b/packages/rrweb/typings/packer/pack.d.ts similarity index 100% rename from typings/packer/pack.d.ts rename to packages/rrweb/typings/packer/pack.d.ts diff --git a/typings/packer/unpack.d.ts b/packages/rrweb/typings/packer/unpack.d.ts similarity index 100% rename from typings/packer/unpack.d.ts rename to packages/rrweb/typings/packer/unpack.d.ts diff --git a/typings/plugins/console/record/error-stack-parser.d.ts b/packages/rrweb/typings/plugins/console/record/error-stack-parser.d.ts similarity index 100% rename from typings/plugins/console/record/error-stack-parser.d.ts rename to packages/rrweb/typings/plugins/console/record/error-stack-parser.d.ts diff --git a/typings/plugins/console/record/index.d.ts b/packages/rrweb/typings/plugins/console/record/index.d.ts similarity index 100% rename from typings/plugins/console/record/index.d.ts rename to packages/rrweb/typings/plugins/console/record/index.d.ts diff --git a/typings/plugins/console/record/stringify.d.ts b/packages/rrweb/typings/plugins/console/record/stringify.d.ts similarity index 100% rename from typings/plugins/console/record/stringify.d.ts rename to packages/rrweb/typings/plugins/console/record/stringify.d.ts diff --git a/typings/plugins/console/replay/index.d.ts b/packages/rrweb/typings/plugins/console/replay/index.d.ts similarity index 100% rename from typings/plugins/console/replay/index.d.ts rename to packages/rrweb/typings/plugins/console/replay/index.d.ts diff --git a/typings/record/collection.d.ts b/packages/rrweb/typings/record/collection.d.ts similarity index 100% rename from typings/record/collection.d.ts rename to packages/rrweb/typings/record/collection.d.ts diff --git a/typings/record/error-stack-parser.d.ts b/packages/rrweb/typings/record/error-stack-parser.d.ts similarity index 100% rename from typings/record/error-stack-parser.d.ts rename to packages/rrweb/typings/record/error-stack-parser.d.ts diff --git a/typings/record/iframe-manager.d.ts b/packages/rrweb/typings/record/iframe-manager.d.ts similarity index 100% rename from typings/record/iframe-manager.d.ts rename to packages/rrweb/typings/record/iframe-manager.d.ts diff --git a/typings/record/index.d.ts b/packages/rrweb/typings/record/index.d.ts similarity index 100% rename from typings/record/index.d.ts rename to packages/rrweb/typings/record/index.d.ts diff --git a/typings/record/mutation.d.ts b/packages/rrweb/typings/record/mutation.d.ts similarity index 100% rename from typings/record/mutation.d.ts rename to packages/rrweb/typings/record/mutation.d.ts diff --git a/typings/record/observer.d.ts b/packages/rrweb/typings/record/observer.d.ts similarity index 100% rename from typings/record/observer.d.ts rename to packages/rrweb/typings/record/observer.d.ts diff --git a/typings/record/shadow-dom-manager.d.ts b/packages/rrweb/typings/record/shadow-dom-manager.d.ts similarity index 100% rename from typings/record/shadow-dom-manager.d.ts rename to packages/rrweb/typings/record/shadow-dom-manager.d.ts diff --git a/typings/record/stringify.d.ts b/packages/rrweb/typings/record/stringify.d.ts similarity index 100% rename from typings/record/stringify.d.ts rename to packages/rrweb/typings/record/stringify.d.ts diff --git a/typings/replay/index.d.ts b/packages/rrweb/typings/replay/index.d.ts similarity index 100% rename from typings/replay/index.d.ts rename to packages/rrweb/typings/replay/index.d.ts diff --git a/typings/replay/machine.d.ts b/packages/rrweb/typings/replay/machine.d.ts similarity index 100% rename from typings/replay/machine.d.ts rename to packages/rrweb/typings/replay/machine.d.ts diff --git a/typings/replay/smoothscroll.d.ts b/packages/rrweb/typings/replay/smoothscroll.d.ts similarity index 100% rename from typings/replay/smoothscroll.d.ts rename to packages/rrweb/typings/replay/smoothscroll.d.ts diff --git a/typings/replay/styles/inject-style.d.ts b/packages/rrweb/typings/replay/styles/inject-style.d.ts similarity index 100% rename from typings/replay/styles/inject-style.d.ts rename to packages/rrweb/typings/replay/styles/inject-style.d.ts diff --git a/typings/replay/timer.d.ts b/packages/rrweb/typings/replay/timer.d.ts similarity index 100% rename from typings/replay/timer.d.ts rename to packages/rrweb/typings/replay/timer.d.ts diff --git a/typings/replay/virtual-styles.d.ts b/packages/rrweb/typings/replay/virtual-styles.d.ts similarity index 100% rename from typings/replay/virtual-styles.d.ts rename to packages/rrweb/typings/replay/virtual-styles.d.ts diff --git a/typings/rrdom/index.d.ts b/packages/rrweb/typings/rrdom/index.d.ts similarity index 100% rename from typings/rrdom/index.d.ts rename to packages/rrweb/typings/rrdom/index.d.ts diff --git a/typings/rrdom/tree-node.d.ts b/packages/rrweb/typings/rrdom/tree-node.d.ts similarity index 100% rename from typings/rrdom/tree-node.d.ts rename to packages/rrweb/typings/rrdom/tree-node.d.ts diff --git a/typings/types.d.ts b/packages/rrweb/typings/types.d.ts similarity index 100% rename from typings/types.d.ts rename to packages/rrweb/typings/types.d.ts diff --git a/typings/utils.d.ts b/packages/rrweb/typings/utils.d.ts similarity index 98% rename from typings/utils.d.ts rename to packages/rrweb/typings/utils.d.ts index 763fa503..e259f176 100644 --- a/typings/utils.d.ts +++ b/packages/rrweb/typings/utils.d.ts @@ -46,6 +46,7 @@ export declare class TreeIndex { inputMap: TreeIndex['inputMap']; }; private reset; + idRemoved(id: number): boolean; } declare type ResolveTree = { value: addedNodeMutation; diff --git a/yarn.lock b/yarn.lock index 30d9e620..e0138bfb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,42 +2,152 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0-beta.35", "@babel/code-frame@^7.5.5": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.5.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" + integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/highlight" "^7.14.5" + +"@babel/helper-validator-identifier@^7.14.5": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz#32be33a756f29e278a0d644fa08a2c9e0f88a34c" + integrity sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow== + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" chalk "^2.0.0" js-tokens "^4.0.0" +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + +"@polka/url@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-0.5.0.tgz#b21510597fd601e5d7c95008b76bf0d254ebfd31" + integrity sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw== + +"@rollup/plugin-commonjs@^11.0.0": + version "11.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-11.1.0.tgz#60636c7a722f54b41e419e1709df05c7234557ef" + integrity sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA== + dependencies: + "@rollup/pluginutils" "^3.0.8" + commondir "^1.0.1" + estree-walker "^1.0.1" + glob "^7.1.2" + is-reference "^1.1.2" + magic-string "^0.25.2" + resolve "^1.11.0" + +"@rollup/plugin-node-resolve@^7.0.0": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" + integrity sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q== + dependencies: + "@rollup/pluginutils" "^3.0.8" + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + is-module "^1.0.0" + resolve "^1.14.2" + +"@rollup/plugin-typescript@^4.0.0": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-4.1.2.tgz#6f910430276ae3e53a47a12ad65820627e7b6ad9" + integrity sha512-+7UlGat/99e2JbmGNnIauxwEhYLwrL7adO/tSJxUN57xrrS3Ps+ZzYpLCDGPZJ57j+ZJTZLLN89KXW9JMEB+jg== + dependencies: + "@rollup/pluginutils" "^3.0.1" + resolve "^1.14.1" + +"@rollup/pluginutils@4": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.1.1.tgz#1d4da86dd4eded15656a57d933fda2b9a08d47ec" + integrity sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@rollup/pluginutils@^3.0.1", "@rollup/pluginutils@^3.0.8": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@types/chai@^4.1.6": - version "4.2.14" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.14.tgz#44d2dd0b5de6185089375d976b4ec5caf6861193" - integrity sha512-G+ITQPXkwTrslfG5L/BksmbLUA0M1iybEsmCWPqzSxsRRhJZimBKJkoMi8fr/CPygPTj4zO5pJH7I2/cm9M7SQ== +"@tsconfig/svelte@^1.0.0": + version "1.0.13" + resolved "https://registry.yarnpkg.com/@tsconfig/svelte/-/svelte-1.0.13.tgz#2fa34376627192c0d643ce54964915e2bd3a58e4" + integrity sha512-5lYJP45Xllo4yE/RUBccBT32eBlRDbqN8r1/MIvQbKxW3aFqaYPCNgm8D5V20X4ShHcwvYWNlKg3liDh1MlBoA== + +"@types/chai@^4.1.4", "@types/chai@^4.1.6": + version "4.2.21" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.21.tgz#9f35a5643129df132cf3b5c1ec64046ea1af0650" + integrity sha512-yd+9qKmJxm496BOV9CMNaey8TWsikaZOwMRwPHQIjcOJM9oV+fi9ZMNw3JsVnbEEbo2gRTDnGEBv8pjyn67hNg== "@types/css-font-loading-module@0.0.4": version "0.0.4" resolved "https://registry.yarnpkg.com/@types/css-font-loading-module/-/css-font-loading-module-0.0.4.tgz#94a835e27d1af444c65cba88523533c174463d64" integrity sha512-ENdXf7MW4m9HeDojB2Ukbi7lYMIuQNBHVf98dbzaiG4EEJREBd6oleVAjrLRCrp7dm6CK1mmdmU9tcgF61acbw== +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@types/estree@*": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + "@types/inquirer@0.0.43": version "0.0.43" resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-0.0.43.tgz#1eb0bbb4648e6cc568bd396c1e989f620ad01273" @@ -46,24 +156,34 @@ "@types/rx" "*" "@types/through" "*" -"@types/jsdom@^16.2.12": - version "16.2.12" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-16.2.12.tgz#2d47f5c9f7e40b4d5d9b5f0534c736dc475f9569" - integrity sha512-rD68Q2XSKBYOl38Tb9jbPuqZeTtpw09dFeuKWi7yhlZVfY8rV4xnQmISNQQZfhkQJGpJWp2qCmmrWjhiqDFNvA== +"@types/jsdom@^16.2.12", "@types/jsdom@^16.2.4": + version "16.2.13" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-16.2.13.tgz#126c8b7441b159d6234610a48de77b6066f1823f" + integrity sha512-8JQCjdeAidptSsOcRWk2iTm9wCcwn9l+kRG6k5bzUacrnm1ezV4forq0kWjUih/tumAeoG+OspOvQEbbRucBTw== dependencies: "@types/node" "*" "@types/parse5" "*" "@types/tough-cookie" "*" +"@types/json-schema@^7.0.3": + version "7.0.8" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" + integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== + "@types/mocha@^5.2.5": version "5.2.7" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== "@types/node@*": - version "14.14.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.2.tgz#d25295f9e4ca5989a2c610754dc02a9721235eeb" - integrity sha512-jeYJU2kl7hL9U5xuI/BhKPZ4vqGM/OmK6whiFAXVhlstzZhVamWhDSmHyGLIp+RVyuF9/d0dqr2P85aFj4BvJg== + version "16.4.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.0.tgz#2c219eaa3b8d1e4d04f4dd6e40bc68c7467d5272" + integrity sha512-HrJuE7Mlqcjj+00JqMWpZ3tY8w7EUd+S0U3L1+PQSWiXZbOgyQDvi+ogoUxaHApPJq5diKxYBQwA3iIlNcPqOg== + +"@types/node@^10.11.3": + version "10.17.60" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" + integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== "@types/node@^12.20.16": version "12.20.16" @@ -71,26 +191,45 @@ integrity sha512-6CLxw83vQf6DKqXxMPwl8qpF8I7THFZuIwLt4TnNsumxkp1VsRZWT8txQxncT/Rl2UojTsFzWgDG4FRMwafrlA== "@types/parse5@*": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.0.tgz#38590dc2c3cf5717154064e3ee9b6947ee21b299" - integrity sha512-oPwPSj4a1wu9rsXTEGIJz91ISU725t0BmSnUhb57sI+M8XEmvUop84lzuiYdq0Y5M6xLY8DBPg0C2xEQKLyvBA== + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.1.tgz#f8ae4fbcd2b9ba4ff934698e28778961f9cb22ca" + integrity sha512-ARATsLdrGPUnaBvxLhUlnltcMgn7pQG312S8ccdYlnyijabrX9RN/KN/iGj9Am96CoW8e/K9628BA7Bv4XHdrA== "@types/prettier@^2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.3.2.tgz#fc8c2825e4ed2142473b4a81064e6e081463d1b3" integrity sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog== +"@types/pug@^2.0.4": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.5.tgz#69bc700934dd473c7ab97270bd2dbacefe562231" + integrity sha512-LOnASQoeNZMkzexRuyqcBBDZ6rS+rQxUMkmj5A0PkhhiSZivLIuz6Hxyr1mkGoEZEkk66faROmpMi4fFkrKsBA== + +"@types/puppeteer@^1.12.4": + version "1.20.8" + resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-1.20.8.tgz#fadbf64f7ac497e9248297beb6ed6a01705c0918" + integrity sha512-yJZzz9NeEmTxRGaZzUxUtBIEAoVXTtAx40mG8K0eDPwEeWyuxXKC7Lredxs6uNcgbvMDc8xzYy4v54jbbpoqrg== + dependencies: + "@types/node" "*" + "@types/puppeteer@^5.4.3": - version "5.4.3" - resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-5.4.3.tgz#cdca84aa7751d77448d8a477dbfa0af1f11485f2" - integrity sha512-3nE8YgR9DIsgttLW+eJf6mnXxq8Ge+27m5SU3knWmrlfl6+KOG0Bf9f7Ua7K+C4BnaTMAh3/UpySqdAYvrsvjg== + version "5.4.4" + resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-5.4.4.tgz#e92abeccc4f46207c3e1b38934a1246be080ccd0" + integrity sha512-3Nau+qi69CN55VwZb0ATtdUAlYlqOOQ3OfQfq0Hqgc4JMFXiQT/XInlwQ9g6LbicDslE6loIFsXFklGh5XmI6Q== dependencies: "@types/node" "*" "@types/q@^1.5.1": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" - integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + version "1.5.5" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== + +"@types/resolve@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" "@types/rx-core-binding@*": version "4.0.4" @@ -193,6 +332,13 @@ "@types/rx-lite-time" "*" "@types/rx-lite-virtualtime" "*" +"@types/sass@^1.16.0": + version "1.16.1" + resolved "https://registry.yarnpkg.com/@types/sass/-/sass-1.16.1.tgz#cf465bd1fea486d0331f760db023de14daf4980d" + integrity sha512-iZUcRrGuz/Tbg3loODpW7vrQJkUtpY2fFSf4ELqqkApcS2TkZ1msk7ie8iZPB86lDOP8QOTTmuvWjc5S0R9OjQ== + dependencies: + "@types/node" "*" + "@types/through@*": version "0.0.30" resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895" @@ -206,16 +352,76 @@ integrity sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg== "@types/yauzl@^2.9.1": - version "2.9.1" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" - integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== + version "2.9.2" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.2.tgz#c48e5d56aff1444409e39fa164b0b4d4552a7b7a" + integrity sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA== dependencies: "@types/node" "*" +"@typescript-eslint/eslint-plugin@^3.7.0": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz#7e061338a1383f59edc204c605899f93dc2e2c8f" + integrity sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ== + dependencies: + "@typescript-eslint/experimental-utils" "3.10.1" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" + integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^3.7.0": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" + integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "3.10.1" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/types@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" + integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== + +"@typescript-eslint/typescript-estree@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" + integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== + dependencies: + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/visitor-keys" "3.10.1" + debug "^4.1.1" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" + integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== + dependencies: + eslint-visitor-keys "^1.1.0" + "@xstate/fsm@^1.4.0": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@xstate/fsm/-/fsm-1.5.1.tgz#b1ebedc77b11e4956fda0a6429cef986cd17979e" - integrity sha512-t8blLI0e90jCE71yUQHLH5uEljD1v0aC8PKkHUtNWEnXt81EOj7xBjnlwmaHn/8cmE2aSygiBElUpkRZUV9hXA== + version "1.6.1" + resolved "https://registry.yarnpkg.com/@xstate/fsm/-/fsm-1.6.1.tgz#c92972b835540c4e3c5e14277f40dbcbdaee9571" + integrity sha512-xYKDNuPR36/fUK+jmhM+oauBmbdUAfuJKnDjg3/7NbN+Pj03TX7e94LXnzkwGgAR+U/HWoMqM5UPTuGIYfIx9g== abab@^2.0.3, abab@^2.0.5: version "2.0.5" @@ -238,12 +444,17 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^7.1.1: +acorn@^7.1.1, acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -260,6 +471,33 @@ agent-base@6: dependencies: debug "4" +agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.6.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571" + integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" @@ -272,6 +510,11 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" @@ -292,6 +535,11 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -304,13 +552,21 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -335,6 +591,18 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" @@ -350,6 +618,16 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -383,9 +661,9 @@ babel-types@^6.0.0: to-fast-properties "^1.0.3" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.3.1: version "1.5.1" @@ -397,6 +675,11 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + bl@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -462,6 +745,13 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" @@ -513,11 +803,24 @@ builtin-modules@^2.0.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-2.0.0.tgz#60b7ef5ae6546bd7deefa74b08b62a43a232648e" integrity sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg== +builtin-modules@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" + integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== + bytes@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" @@ -537,6 +840,11 @@ callsites@^2.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + camelcase@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -553,25 +861,25 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001219: - version "1.0.30001230" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz#8135c57459854b2240b57a4a6786044bdc5a9f71" - integrity sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ== + version "1.0.30001246" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001246.tgz#fe17d9919f87124d6bb416ef7b325356d69dc76c" + integrity sha512-Tc+ff0Co/nFNbLOrziBXmMVtpt9S2c2Y+Z9Nk9Khj09J+0zR9ejvIW5qkZAErCbOrVODCx/MN+GpB5FNBs5GFA== capture-stack-trace@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== -chai@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" - integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== +chai@^4.1.2, chai@^4.2.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" + integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" deep-eql "^3.0.1" get-func-name "^2.0.0" - pathval "^1.1.0" + pathval "^1.1.1" type-detect "^4.0.5" chalk@^1.1.3: @@ -595,9 +903,9 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: supports-color "^5.3.0" chalk@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -636,6 +944,21 @@ cheerio@^1.0.0-rc.3: parse5-htmlparser2-tree-adapter "^6.0.1" tslib "^2.2.0" +chokidar@^3.4.1, chokidar@^3.5.0: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -672,7 +995,7 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" -color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -696,21 +1019,21 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.5.4: - version "1.5.5" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" - integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== +color-string@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" color@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" - integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== dependencies: - color-convert "^1.9.1" - color-string "^1.5.4" + color-convert "^1.9.3" + color-string "^1.6.0" colorette@^1.2.2: version "1.2.2" @@ -734,16 +1057,31 @@ commander@2.15.1: resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== -commander@^2.20.0: +commander@^2.19.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +concat-stream@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + concat-with-sourcemaps@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" @@ -763,6 +1101,11 @@ configstore@^3.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +console-clear@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/console-clear/-/console-clear-1.1.1.tgz#995e20cbfbf14dd792b672cde387bd128d674bf7" + integrity sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ== + content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -786,9 +1129,14 @@ cookie@0.4.0: integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== core-js@^2.4.0: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cosmiconfig@^5.0.0: version "5.2.1" @@ -834,6 +1182,15 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" @@ -906,15 +1263,7 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" -css-tree@1.0.0-alpha.39: - version "1.0.0-alpha.39" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" - integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== - dependencies: - mdn-data "2.0.6" - source-map "^0.6.1" - -css-tree@^1.0.0-alpha.39: +css-tree@^1.0.0-alpha.39, css-tree@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== @@ -937,10 +1286,10 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== +cssnano-preset-default@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== dependencies: css-declaration-sorter "^4.0.1" cssnano-util-raw-cache "^4.0.1" @@ -970,7 +1319,7 @@ cssnano-preset-default@^4.0.7: postcss-ordered-values "^4.1.2" postcss-reduce-initial "^4.0.3" postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.2" + postcss-svgo "^4.0.3" postcss-unique-selectors "^4.0.1" cssnano-util-get-arguments@^4.0.0: @@ -996,21 +1345,21 @@ cssnano-util-same-parent@^4.0.0: integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== cssnano@^4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + version "4.1.11" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== dependencies: cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.7" + cssnano-preset-default "^4.0.8" is-resolvable "^1.0.0" postcss "^7.0.0" csso@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" - integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: - css-tree "1.0.0-alpha.39" + css-tree "^1.1.2" cssom@^0.4.4: version "0.4.4" @@ -1038,7 +1387,7 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -debug@2.6.9: +debug@2.6.9, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -1052,13 +1401,20 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== dependencies: ms "2.1.2" +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + decimal.js@^10.2.1: version "10.3.1" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" @@ -1076,7 +1432,7 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= @@ -1103,6 +1459,11 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + devtools-protocol@0.0.869402: version "0.0.869402" resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.869402.tgz#03ade701761742e43ae4de5dc188bcd80f156d8d" @@ -1113,6 +1474,13 @@ diff@3.5.0, diff@^3.0.1, diff@^3.1.0, diff@^3.2.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + dom-serializer@0: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" @@ -1135,12 +1503,7 @@ domelementtype@1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== -domelementtype@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971" - integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA== - -domelementtype@^2.2.0: +domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== @@ -1201,9 +1564,14 @@ ee-first@1.1.1: integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.723: - version "1.3.739" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz#f07756aa92cabd5a6eec6f491525a64fe62f98b9" - integrity sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A== + version "1.3.784" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.784.tgz#c370be79374b02b7f13e8a8fb0d7a02641161dac" + integrity sha512-JTPxdUibkefeomWNaYs8lI/x/Zb4cOhZWX+d7kpzsNKzUd07pNuo/AcHeNJ/qgEchxM1IAxda9aaGUhKN/poOg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emojis-list@^3.0.0: version "3.0.0" @@ -1222,10 +1590,17 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + entities@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" - integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== error-ex@^1.3.1: version "1.3.2" @@ -1234,40 +1609,27 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: - version "1.17.7" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" - integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== +es-abstract@^1.17.2, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: + version "1.18.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" + integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + get-intrinsic "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-regex "^1.1.1" - object-inspect "^1.8.0" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.3" + is-string "^1.0.6" + object-inspect "^1.10.3" object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1: - version "1.18.0-next.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" - integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-negative-zero "^2.0.0" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -1278,6 +1640,18 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -1293,6 +1667,16 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escodegen@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" @@ -1305,12 +1689,121 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" +eslint-config-google@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/eslint-config-google/-/eslint-config-google-0.11.0.tgz#fd0fc70be2e9114df097cac93a9b5b0d4e1c6830" + integrity sha512-z541Fs5TFaY7/35v/z100InQ2f3V2J7e3u/0yKrnImgsHjh6JWgSRngfC/mZepn/+XN16jUydt64k//kxXc1fw== + +eslint-plugin-svelte3@^2.7.3: + version "2.7.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-svelte3/-/eslint-plugin-svelte3-2.7.3.tgz#e793b646b848e717674fe668c21b909cfa025eb3" + integrity sha512-p6HhxyICX9x/x+8WSy6AVk2bmv9ayoznoTSyCvK47th/k/07ksuJixMwbGX9qxJVAmPBaYMjEIMSEZtJHPIN7w== + +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^7.5.0: + version "7.31.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.31.0.tgz#f972b539424bf2604907a970860732c5d99d3aca" + integrity sha512-vafgJpSh2ia8tnTkNUkwxGmnumgckLh5aAbLa1xRmIn9+owi8qBNGKL+B881kNKNTy7FFqTEkpNkUvmw0n6PkA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -estraverse@^5.2.0: +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== @@ -1320,6 +1813,11 @@ estree-walker@^0.6.0, estree-walker@^0.6.1: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + estree-walker@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" @@ -1419,6 +1917,16 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" +extract-zip@^1.6.6: + version "1.7.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== + dependencies: + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" + extract-zip@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" @@ -1430,7 +1938,17 @@ extract-zip@^2.0.0: optionalDependencies: "@types/yauzl" "^2.9.1" -fast-levenshtein@~2.0.6: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -1459,9 +1977,9 @@ fd-slicer@~1.1.0: pend "~1.2.0" fflate@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.4.4.tgz#b23c3f53a687bbce62a091af98f621ca7f68a191" - integrity sha512-BBKysCIvETp1l5wTUvjCR+tfFmlvSWtzNZe3SkQN1xDeTD9dscGypw5NZEZIkyPazKGOnpaKFlMwOmuTgApiJQ== + version "0.4.8" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.4.8.tgz#f90b82aefbd8ac174213abb338bd7ef848f0f5ae" + integrity sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA== figures@^2.0.0: version "2.0.0" @@ -1470,6 +1988,13 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -1500,6 +2025,13 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -1528,6 +2060,26 @@ findup-sync@~0.3.0: dependencies: glob "~5.0.0" +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.1.tgz#bbef080d95fca6709362c73044a1634f7c6e7d05" + integrity sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + for-in@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -1569,16 +2121,21 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + generic-names@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-2.0.1.tgz#f8a378ead2ccaa7a34f0317b05554832ae41b872" @@ -1591,6 +2148,20 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-port@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" + integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -1618,6 +2189,13 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob@7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -1630,10 +2208,10 @@ glob@7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.1, glob@^7.1.3: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1660,6 +2238,24 @@ global-dirs@^0.1.0: dependencies: ini "^1.3.4" +globals@^13.6.0, globals@^13.9.0: + version "13.10.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.10.0.tgz#60ba56c3ac2ca845cfbf4faeca727ad9dd204676" + integrity sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g== + dependencies: + type-fest "^0.20.2" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -1678,9 +2274,9 @@ got@^6.7.1: url-parse-lax "^1.0.0" graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== growl@1.10.5: version "1.10.5" @@ -1694,6 +2290,11 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" @@ -1709,10 +2310,10 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has@^1.0.0, has@^1.0.3: version "1.0.3" @@ -1741,11 +2342,6 @@ hsla-regex@^1.0.0: resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -1794,6 +2390,14 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" +https-proxy-agent@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" @@ -1824,6 +2428,11 @@ ignore-styles@^5.0.1: resolved "https://registry.yarnpkg.com/ignore-styles/-/ignore-styles-5.0.1.tgz#b49ef2274bdafcd8a4880a966bfe38d1a0bf4671" integrity sha1-tJ7yJ0va/NikiAqWa/440aC/RnE= +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" @@ -1846,6 +2455,14 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-from@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" @@ -1883,7 +2500,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1937,15 +2554,34 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-bigint@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + dependencies: + call-bind "^1.0.2" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" - integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== is-ci@^1.0.10: version "1.2.1" @@ -1966,17 +2602,17 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" - integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== +is-core-module@^2.2.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" + integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== dependencies: has "^1.0.3" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== is-directory@^0.3.1: version "0.3.1" @@ -2005,11 +2641,21 @@ is-extglob@^1.0.0: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -2017,6 +2663,13 @@ is-glob@^2.0.0, is-glob@^2.0.1: dependencies: is-extglob "^1.0.0" +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + is-installed-globally@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" @@ -2030,16 +2683,21 @@ is-module@^1.0.0: resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= -is-negative-zero@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" - integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= +is-number-object@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" + integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== + is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" @@ -2052,6 +2710,11 @@ is-number@^4.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -2089,12 +2752,20 @@ is-redirect@^1.0.0: resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= -is-regex@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== +is-reference@^1.1.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== dependencies: - has-symbols "^1.0.1" + "@types/estree" "*" + +is-regex@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.2" is-resolvable@^1.0.0: version "1.1.0" @@ -2111,21 +2782,19 @@ is-stream@^1.0.0, is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== - dependencies: - html-comment-regex "^1.1.0" +is-string@^1.0.5, is-string@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" -isarray@1.0.0: +isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -2202,6 +2871,13 @@ jest-snapshot@^23.6.0: pretty-format "^23.6.0" semver "^5.5.0" +jest-worker@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9" + integrity sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk= + dependencies: + merge-stream "^1.0.1" + jest-worker@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" @@ -2210,6 +2886,15 @@ jest-worker@^24.9.0: merge-stream "^2.0.0" supports-color "^6.1.0" +jest-worker@^26.2.1: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" @@ -2221,9 +2906,9 @@ js-tokens@^4.0.0: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -2233,7 +2918,7 @@ jsdom-global@^3.0.2: resolved "https://registry.yarnpkg.com/jsdom-global/-/jsdom-global-3.0.2.tgz#6bd299c13b0c4626b2da2c0393cd4385d606acb9" integrity sha1-a9KZwTsMRiay2iwDk81DhdYGrLk= -jsdom@^16.6.0: +jsdom@^16.4.0, jsdom@^16.6.0: version "16.6.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== @@ -2271,6 +2956,21 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -2290,6 +2990,11 @@ kind-of@^6.0.0: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +kleur@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -2297,6 +3002,14 @@ latest-version@^3.0.0: dependencies: package-json "^4.0.0" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -2305,6 +3018,21 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +livereload-js@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-3.3.2.tgz#c88b009c6e466b15b91faa26fd7c99d620e12651" + integrity sha512-w677WnINxFkuixAoUEXOStewzLYGI76XVag+0JWMMEyjJQKs0ibWZMxkTlB96Lm3EjZ7IeOxVziBEbtxVQqQZA== + +livereload@^0.9.1: + version "0.9.3" + resolved "https://registry.yarnpkg.com/livereload/-/livereload-0.9.3.tgz#a714816375ed52471408bede8b49b2ee6a0c55b1" + integrity sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw== + dependencies: + chokidar "^3.5.0" + livereload-js "^3.3.1" + opts ">= 1.2.0" + ws "^7.4.3" + loader-utils@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" @@ -2314,6 +3042,11 @@ loader-utils@^1.1.0: emojis-list "^3.0.0" json5 "^1.0.1" +local-access@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/local-access/-/local-access-1.1.0.tgz#e007c76ba2ca83d5877ba1a125fc8dfe23ba4798" + integrity sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw== + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -2326,17 +3059,32 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.12, lodash@^4.17.4, lodash@^4.7.0: +lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -2354,6 +3102,13 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + magic-string@^0.25.2, magic-string@^0.25.7: version "0.25.7" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" @@ -2388,11 +3143,6 @@ mdn-data@2.0.4: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== -mdn-data@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" - integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -2403,6 +3153,13 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= + dependencies: + readable-stream "^2.0.1" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -2449,11 +3206,21 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^2.0.3, mime@^2.3.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + "minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -2493,7 +3260,7 @@ mkdirp@0.5.1: dependencies: minimist "0.0.8" -mkdirp@^0.5.1, mkdirp@~0.5.1: +mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -2517,6 +3284,11 @@ mocha@^5.2.0: mkdirp "0.5.1" supports-color "5.4.0" +mri@^1.1.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.6.tgz#49952e1044db21dbf90f6cd92bc9c9a777d415a6" + integrity sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -2532,6 +3304,11 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -2558,9 +3335,9 @@ node-fetch@^2.6.1: integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== node-releases@^1.1.71: - version "1.1.72" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" - integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== + version "1.1.73" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" + integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== normalize-path@^2.0.1: version "2.1.1" @@ -2569,6 +3346,11 @@ normalize-path@^2.0.1: dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + normalize-url@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" @@ -2600,33 +3382,39 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -object-inspect@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== +object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.10.3: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" - integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.0" has-symbols "^1.0.1" object-keys "^1.1.1" -object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== +object.getownpropertydescriptors@^2.1.0, object.getownpropertydescriptors@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.2" object.omit@^2.0.0: version "2.0.1" @@ -2637,14 +3425,13 @@ object.omit@^2.0.0: is-extendable "^0.1.1" object.values@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" + integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" + es-abstract "^1.18.2" on-finished@~2.3.0: version "2.3.0" @@ -2687,6 +3474,23 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +"opts@>= 1.2.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/opts/-/opts-2.0.2.tgz#a17e189fbbfee171da559edd8a42423bc5993ce1" + integrity sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg== + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -2741,6 +3545,13 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -2796,26 +3607,41 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -pathval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" @@ -2826,6 +3652,18 @@ pify@^5.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -2889,6 +3727,31 @@ postcss-discard-overridden@^4.0.1: dependencies: postcss "^7.0.0" +postcss-easy-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-easy-import/-/postcss-easy-import-3.0.0.tgz#8eaaf5ae59566083d0cae98735dfd803e3ab194d" + integrity sha512-cfNsear/v8xlkl9v5Wm8y4Do/puiDQTFF+WX2Fo++h7oKt1fKWVVW/5Ca8hslYDQWnjndrg813cA23Pt1jsYdg== + dependencies: + globby "^6.1.0" + is-glob "^4.0.0" + lodash "^4.17.4" + object-assign "^4.0.1" + pify "^3.0.0" + postcss "^6.0.11" + postcss-import "^10.0.0" + resolve "^1.1.7" + +postcss-import@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-10.0.0.tgz#4c85c97b099136cc5ea0240dc1dfdbfde4e2ebbe" + integrity sha1-TIXJewmRNsxeoCQNwd/b/eTi674= + dependencies: + object-assign "^4.0.1" + postcss "^6.0.1" + postcss-value-parser "^3.2.3" + read-cache "^1.0.0" + resolve "^1.1.7" + postcss-load-config@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" @@ -3121,21 +3984,18 @@ postcss-selector-parser@^3.0.0: uniq "^1.0.1" postcss-selector-parser@^6.0.2: - version "6.0.4" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" - integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== dependencies: cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" util-deprecate "^1.0.2" -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== +postcss-svgo@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== dependencies: - is-svg "^3.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" svgo "^1.0.0" @@ -3149,7 +4009,7 @@ postcss-unique-selectors@^4.0.1: postcss "^7.0.0" uniqs "^2.0.0" -postcss-value-parser@^3.0.0: +postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== @@ -3168,7 +4028,7 @@ postcss@6.0.1: source-map "^0.5.6" supports-color "^3.2.3" -postcss@^6.0.1: +postcss@^6.0.1, postcss@^6.0.11: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== @@ -3178,14 +4038,19 @@ postcss@^6.0.1: supports-color "^5.4.0" postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.27: - version "7.0.35" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" - integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + version "7.0.36" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" + integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== dependencies: chalk "^2.4.2" source-map "^0.6.1" supports-color "^6.1.0" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -3214,7 +4079,12 @@ pretty-format@^23.6.0: ansi-regex "^3.0.0" ansi-styles "^3.2.0" -progress@^2.0.1: +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0, progress@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -3232,7 +4102,7 @@ proxy-addr@~2.0.5: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@^1.1.0: +proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -3255,11 +4125,25 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.1: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +puppeteer@^1.15.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.20.0.tgz#e3d267786f74e1d87cf2d15acc59177f471bbe38" + integrity sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ== + dependencies: + debug "^4.1.0" + extract-zip "^1.6.6" + https-proxy-agent "^2.2.1" + mime "^2.0.3" + progress "^2.0.1" + proxy-from-env "^1.0.0" + rimraf "^2.6.1" + ws "^6.1.0" + puppeteer@^9.1.1: version "9.1.1" resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-9.1.1.tgz#f74b7facf86887efd6c6b9fabb7baae6fdce012c" @@ -3329,6 +4213,26 @@ rc@^1.0.1, rc@^1.1.6: minimist "^1.2.0" strip-json-comments "~2.0.1" +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + +readable-stream@^2.0.1, readable-stream@^2.2.2: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@^3.1.1, readable-stream@^3.4.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -3338,6 +4242,13 @@ readable-stream@^3.1.1, readable-stream@^3.4.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + realpath-native@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" @@ -3357,6 +4268,11 @@ regex-cache@^0.4.2: dependencies: is-equal-shallow "^0.1.3" +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + registry-auth-token@^3.0.1: version "3.4.0" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" @@ -3378,20 +4294,35 @@ remove-trailing-separator@^1.0.1: integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-relative@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" + integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" @@ -3402,12 +4333,12 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.16.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" - integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.1, resolve@^1.14.2, resolve@^1.16.1: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: - is-core-module "^2.0.0" + is-core-module "^2.2.0" path-parse "^1.0.6" restore-cursor@^2.0.0: @@ -3428,6 +4359,13 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= +rimraf@^2.6.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -3445,6 +4383,20 @@ rollup-plugin-commonjs@^9.2.0: resolve "^1.10.0" rollup-pluginutils "^2.6.0" +rollup-plugin-css-only@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-css-only/-/rollup-plugin-css-only-3.1.0.tgz#6a701cc5b051c6b3f0961e69b108a9a118e1b1df" + integrity sha512-TYMOE5uoD76vpj+RTkQLzC9cQtbnJNktHPB507FzRWBVaofg7KhIqq1kGbcVOadARSozWF883Ho9KpSPKH8gqA== + dependencies: + "@rollup/pluginutils" "4" + +rollup-plugin-livereload@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.5.tgz#4747fa292a2cceb0c972c573d71b3d66b4252b37" + integrity sha512-vqQZ/UQowTW7VoiKEM5ouNW90wE5/GZLfdWuR0ELxyKOJUIaj+uismPZZaICU4DnWPVjnpCDDxEqwU7pcKY/PA== + dependencies: + livereload "^0.9.1" + rollup-plugin-node-resolve@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz#908585eda12e393caac7498715a01e08606abc89" @@ -3482,6 +4434,24 @@ rollup-plugin-rename-node-modules@^1.1.0: estree-walker "^2.0.1" magic-string "^0.25.7" +rollup-plugin-svelte@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-svelte/-/rollup-plugin-svelte-7.1.0.tgz#d45f2b92b1014be4eb46b55aa033fb9a9c65f04d" + integrity sha512-vopCUq3G+25sKjwF5VilIbiY6KCuMNHP1PFvx2Vr3REBNMDllKHFZN2B9jwwC+MqNc3UPKkjXnceLPEjTjXGXg== + dependencies: + require-relative "^0.8.7" + rollup-pluginutils "^2.8.2" + +rollup-plugin-terser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-3.0.0.tgz#045bd7cf625ee1affcfe6971dab6fffe6fb48c65" + integrity sha512-Ed9zRD7OoCBnh0XGlEAJle5TCUsFXMLClwKzZWnS1zbNO4MelHjfCSdFZxCAdH70M40nhZ1nRrY2GZQJhSMcjA== + dependencies: + "@babel/code-frame" "^7.0.0" + jest-worker "^23.2.0" + serialize-javascript "^1.5.0" + terser "^3.8.2" + rollup-plugin-terser@^5.3.0: version "5.3.1" resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz#8c650062c22a8426c64268548957463bf981b413" @@ -3493,6 +4463,16 @@ rollup-plugin-terser@^5.3.0: serialize-javascript "^4.0.0" terser "^4.6.2" +rollup-plugin-terser@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" + rollup-plugin-typescript@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/rollup-plugin-typescript/-/rollup-plugin-typescript-1.0.1.tgz#86565033b714c3d1f3aba510aad3dc519f7091e9" @@ -3508,17 +4488,20 @@ rollup-pluginutils@^2.5.0, rollup-pluginutils@^2.6.0, rollup-pluginutils@^2.8.2: dependencies: estree-walker "^0.6.1" -rollup@^2.3.3: - version "2.32.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.32.1.tgz#625a92c54f5b4d28ada12d618641491d4dbb548c" - integrity sha512-Op2vWTpvK7t6/Qnm1TTh7VjEZZkN8RWgf0DHbkKzQBwNf748YhXbozHVefqpPp/Fuyk/PQPAnYsBxAEtlMvpUw== - optionalDependencies: - fsevents "~2.1.2" +rollup@^0.66.4: + version "0.66.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.66.6.tgz#ce7d6185beb7acea644ce220c25e71ae03275482" + integrity sha512-J7/SWanrcb83vfIHqa8+aVVGzy457GcjA6GVZEnD0x2u4OnOd0Q1pCrEoNe8yLwM6z6LZP02zBT2uW0yh5TqOw== + dependencies: + "@types/estree" "0.0.39" + "@types/node" "*" -rrweb-snapshot@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/rrweb-snapshot/-/rrweb-snapshot-1.1.7.tgz#92a3b47b1112a1b566c2fae2edb02fa48a6f6653" - integrity sha512-+f2kCCvIQ1hbEeCWnV7mPVPDEdWEExqwcYqMd/r1nfK52QE7qU52jefUOyTe85Vy67rZGqWnfK/B25e/OTSgYg== +rollup@^2.3.3, rollup@^2.45.2: + version "2.53.3" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.53.3.tgz#14b0e57f0874d4ad23bdbb13050cf70bcd1eabf7" + integrity sha512-79QIGP5DXz5ZHYnCPi3tLz+elOQi6gudp9YINdaJdjG0Yddubo6JRFUM//qCZ0Bap/GJrsUoEBVdSOc4AkMlRA== + optionalDependencies: + fsevents "~2.3.2" run-async@^2.2.0: version "2.4.1" @@ -3526,13 +4509,20 @@ run-async@^2.2.0: integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== rxjs@^6.4.0: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" -safe-buffer@5.1.2: +sade@^1.4.0, sade@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.7.4.tgz#ea681e0c65d248d2095c90578c03ca0bb1b54691" + integrity sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA== + dependencies: + mri "^1.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -3576,6 +4566,13 @@ semver@^5.0.3, semver@^5.1.0, semver@^5.5.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@^7.2.1, semver@^7.3.2: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -3595,6 +4592,11 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" +serialize-javascript@^1.5.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" + integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== + serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -3624,11 +4626,23 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -3641,12 +4655,42 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +sirv-cli@^0.4.4: + version "0.4.6" + resolved "https://registry.yarnpkg.com/sirv-cli/-/sirv-cli-0.4.6.tgz#c28ab20deb3b34637f5a60863dc350f055abca04" + integrity sha512-/Vj85/kBvPL+n9ibgX6FicLE8VjidC1BhlX67PYPBfbBAphzR6i0k0HtU5c2arejfU3uzq8l3SYPCwl1x7z6Ww== + dependencies: + console-clear "^1.1.0" + get-port "^3.2.0" + kleur "^3.0.0" + local-access "^1.0.1" + sade "^1.4.0" + sirv "^0.4.6" + tinydate "^1.0.0" + +sirv@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-0.4.6.tgz#185e44eb93d24009dd183b7494285c5180b81f22" + integrity sha512-rYpOXlNbpHiY4nVXxuDf4mXPvKz1reZGap/LkWp9TvcZ84qD/nPBjjH/6GZsgIjVMbOslnY8YYULAyP8jMn1GQ== + dependencies: + "@polka/url" "^0.5.0" + mime "^2.3.1" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= -source-map-support@^0.5.6, source-map-support@~0.5.12: +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +source-map-support@^0.5.6, source-map-support@~0.5.10, source-map-support@~0.5.12, source-map-support@~0.5.19: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -3664,6 +4708,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@^0.7.3, source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + sourcemap-codec@^1.4.4: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" @@ -3680,9 +4729,11 @@ stable@^0.1.8: integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== + dependencies: + escape-string-regexp "^2.0.0" "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" @@ -3702,21 +4753,30 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string.prototype.trimend@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" - integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw== +string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== dependencies: - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" -string.prototype.trimstart@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" - integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg== +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" string_decoder@^1.1.1: version "1.3.0" @@ -3725,6 +4785,13 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -3746,11 +4813,30 @@ strip-ansi@^5.1.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -3810,13 +4896,43 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: +supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" +svelte-check@^1.4.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/svelte-check/-/svelte-check-1.6.0.tgz#fcc7b28252a89be0e4cd369c58bbf8e76e81295f" + integrity sha512-nQTlbFJWhwoeLY5rkhgbjzGQSwk5F1pRdEXait0EFaQSrE/iJF+PIjrQlk0BjL/ogk9HaR9ZI0DQSYrl7jl3IQ== + dependencies: + chalk "^4.0.0" + chokidar "^3.4.1" + glob "^7.1.6" + import-fresh "^3.2.1" + minimist "^1.2.5" + sade "^1.7.4" + source-map "^0.7.3" + svelte-preprocess "^4.0.0" + typescript "*" + +svelte-preprocess@^4.0.0: + version "4.7.4" + resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.7.4.tgz#e4d5208ab25c2aaaf19e837f7d7bbf7930e61d2b" + integrity sha512-mDAmaltQl6e5zU2VEtoWEf7eLTfuOTGr9zt+BpA3AGHo8MIhKiNSPE9OLTCTOMgj0vj/uL9QBbaNmpG4G1CgIA== + dependencies: + "@types/pug" "^2.0.4" + "@types/sass" "^1.16.0" + detect-indent "^6.0.0" + strip-indent "^3.0.0" + +svelte@^3.2.0: + version "3.40.0" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.40.0.tgz#777d47b0aad840bb4dd2eea74400e8caccfb7a5a" + integrity sha512-PCof5NCkxw7ZIkypiHwmjk8jCnnlmJ62NQIcGr/keBCOCx2FdAYmpjLjAey8hGy58xKK4WtwLUgFNcQZK2fPLQ== + svgo@^1.0.0: version "1.3.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" @@ -3841,6 +4957,18 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +table@^6.0.9: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== + dependencies: + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + tar-fs@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" @@ -3869,6 +4997,15 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" +terser@^3.8.2: + version "3.17.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" + integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== + dependencies: + commander "^2.19.0" + source-map "~0.6.1" + source-map-support "~0.5.10" + terser@^4.6.2: version "4.8.0" resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" @@ -3878,6 +5015,20 @@ terser@^4.6.2: source-map "~0.6.1" source-map-support "~0.5.12" +terser@^5.0.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.1.tgz#2dc7a61009b66bb638305cb2a824763b116bf784" + integrity sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -3893,6 +5044,11 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tinydate@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/tinydate/-/tinydate-1.3.0.tgz#e6ca8e5a22b51bb4ea1c3a2a4fd1352dbd4c57fb" + integrity sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -3905,6 +5061,13 @@ to-fast-properties@^1.0.3: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" @@ -3947,12 +5110,12 @@ ts-node@^7.0.1: source-map-support "^0.5.6" yn "^2.0.0" -tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.2.0: +tslib@^2.0.0, tslib@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== @@ -3977,6 +5140,20 @@ tsutils@^1.1.0: resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.9.1.tgz#b9f9ab44e55af9681831d5f28d0aeeaf5c750cb0" integrity sha1-ufmrROVa+WgYMdXyjQrur1x1DLA= +tsutils@^3.17.1: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -3989,6 +5166,11 @@ type-detect@^4.0.0, type-detect@^4.0.5: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -3997,10 +5179,30 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typescript@^3.9.5: - version "3.9.7" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" - integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@*: + version "4.3.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" + integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== + +typescript@^3.4.1, typescript@^3.9.5, typescript@^3.9.7: + version "3.9.10" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" + integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" unbzip2-stream@^1.3.3: version "1.4.3" @@ -4063,6 +5265,13 @@ update-notifier@^2.0.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" @@ -4070,12 +5279,23 @@ url-parse-lax@^1.0.0: dependencies: prepend-http "^1.0.1" -util-deprecate@^1.0.1, util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@^1.0.0, util.promisify@~1.0.0: +util.promisify@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + for-each "^0.3.3" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.1" + +util.promisify@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== @@ -4090,6 +5310,11 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -4145,6 +5370,17 @@ whatwg-url@^8.0.0, whatwg-url@^8.5.0: tr46 "^2.1.0" webidl-conversions "^6.1.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -4152,6 +5388,13 @@ which@^1.2.9: dependencies: isexe "^2.0.0" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + widest-line@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" @@ -4159,7 +5402,7 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" -word-wrap@~1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -4183,15 +5426,17 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" -ws@^7.2.3: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@^6.1.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" -ws@^7.4.5: - version "7.5.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.1.tgz#44fc000d87edb1d9c53e51fbc69a0ac1f6871d66" - integrity sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow== +ws@^7.2.3, ws@^7.4.3, ws@^7.4.5: + version "7.5.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== xdg-basedir@^3.0.0: version "3.0.0" @@ -4213,6 +5458,11 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"