diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..75c7c36268690dc4877e3a3c0cc4a1006505da55 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,14 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +favicon.ico filter=lfs diff=lfs merge=lfs -text +js/vendors~editor~embed~fullscreen~player~playground.js filter=lfs diff=lfs merge=lfs -text +js/vendors~editor~embed~fullscreen~player~playground.js.map filter=lfs diff=lfs merge=lfs -text +static/assets/48d66af328a669a1c84c5dc87a4e9a3b.ttf filter=lfs diff=lfs merge=lfs -text +static/assets/4c768843c9fa6593074231cd762b83f8.ttf filter=lfs diff=lfs merge=lfs -text +static/assets/57f5c040b2ec7c6f269042b4e1c32a03.png filter=lfs diff=lfs merge=lfs -text +static/assets/5f46c8dc3b8cc2296eb73f013dfce3db.ttf filter=lfs diff=lfs merge=lfs -text +static/assets/8996930d8e83f63cc3341172205df460.otf filter=lfs diff=lfs merge=lfs -text +static/assets/8d83d454d2c42614a203322393c23a5b.ttf filter=lfs diff=lfs merge=lfs -text +static/assets/9ec3449723269a806ec6eaba0f8f6cef.ttf filter=lfs diff=lfs merge=lfs -text +static/assets/eb64e706eb7a3b324ba50d3279a980b1.ttf filter=lfs diff=lfs merge=lfs -text diff --git a/41f50eb9f984c12c2544.worker.js b/41f50eb9f984c12c2544.worker.js new file mode 100644 index 0000000000000000000000000000000000000000..6d66d96d7ee0f2f2ec6007a83576c2bf12e45c30 --- /dev/null +++ b/41f50eb9f984c12c2544.worker.js @@ -0,0 +1,228 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./node_modules/babel-loader/lib/index.js?!./node_modules/scratch-storage/src/FetchWorkerTool.worker.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/scratch-storage/src/FetchWorkerTool.worker.js": +/*!************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib??ref--4!./node_modules/scratch-storage/src/FetchWorkerTool.worker.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* eslint-env worker */ + +const saferFetchAsArrayBuffer = __webpack_require__(/*! ./safer-fetch */ "./node_modules/scratch-storage/src/safer-fetch.js"); +const complete = []; +let timeoutId = null; +const checkCompleted = () => { + if (timeoutId) return; + timeoutId = setTimeout(() => { + timeoutId = null; + if (complete.length) { + // Send our chunk of completed requests and instruct postMessage to + // transfer the buffers instead of copying them. + postMessage(complete.slice(), + // Instruct postMessage that these buffers in the sent message + // should use their Transferable trait. After the postMessage + // call the "buffers" will still be in complete if you looked, + // but they will all be length 0 as the data they reference has + // been sent to the window. This lets us send a lot of data + // without the normal postMessage behaviour of making a copy of + // all of the data for the window. + complete.map(response => response.buffer).filter(Boolean)); + complete.length = 0; + } + }); +}; + +/** + * Receive a job from the parent and fetch the requested data. + * @param {object} options.job A job id, url, and options descriptor to perform. + */ +const onMessage = _ref => { + let { + data: job + } = _ref; + saferFetchAsArrayBuffer(job.url, job.options).then(buffer => complete.push({ + id: job.id, + buffer + })).catch(error => complete.push({ + id: job.id, + error: error && error.message || "Failed request: ".concat(job.url) + })).then(checkCompleted); +}; +if (self.fetch) { + postMessage({ + support: { + fetch: true + } + }); + self.addEventListener('message', onMessage); +} else { + postMessage({ + support: { + fetch: false + } + }); + self.addEventListener('message', _ref2 => { + let { + data: job + } = _ref2; + postMessage([{ + id: job.id, + error: 'fetch is unavailable' + }]); + }); +} + +/***/ }), + +/***/ "./node_modules/scratch-storage/src/safer-fetch.js": +/*!*********************************************************!*\ + !*** ./node_modules/scratch-storage/src/safer-fetch.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* eslint-env browser */ +/* eslint-disable no-use-before-define */ + +// This throttles and retries fetch() to mitigate the effect of random network errors and +// random browser errors (especially in Chrome) + +let currentFetches = 0; +const queue = []; +const startNextFetch = _ref => { + let [resolve, url, options] = _ref; + let firstError; + let failedAttempts = 0; + const attemptToFetch = () => fetch(url, options).then(result => { + // In a macOS WKWebView, requests from file: URLs to other file: URLs always have status: 0 and ok: false + // even though the requests were successful. If the requested file doesn't exist, fetch() rejects instead. + // We aren't aware of any other cases where fetch() can resolve with status 0, so this should be safe. + if (result.ok || result.status === 0) return result.arrayBuffer(); + if (result.status === 404) return null; + return Promise.reject(result.status); + }).then(buffer => { + currentFetches--; + checkStartNextFetch(); + return buffer; + }).catch(error => { + if (error === 403) { + // Retrying this request will not help, so return an error now. + throw error; + } + console.warn("Attempt to fetch ".concat(url, " failed"), error); + if (!firstError) { + firstError = error; + } + if (failedAttempts < 2) { + failedAttempts++; + return new Promise(cb => setTimeout(cb, (failedAttempts + Math.random() - 1) * 5000)).then(attemptToFetch); + } + currentFetches--; + checkStartNextFetch(); + throw firstError; + }); + return resolve(attemptToFetch()); +}; +const checkStartNextFetch = () => { + if (currentFetches < 100 && queue.length > 0) { + currentFetches++; + startNextFetch(queue.shift()); + } +}; +const saferFetchAsArrayBuffer = (url, options) => new Promise(resolve => { + queue.push([resolve, url, options]); + checkStartNextFetch(); +}); +module.exports = saferFetchAsArrayBuffer; + +/***/ }) + +/******/ }); +//# sourceMappingURL=41f50eb9f984c12c2544.worker.js.map \ No newline at end of file diff --git a/41f50eb9f984c12c2544.worker.js.map b/41f50eb9f984c12c2544.worker.js.map new file mode 100644 index 0000000000000000000000000000000000000000..fd90466f2d3b4ee46e3596819c944d91c46036a6 --- /dev/null +++ b/41f50eb9f984c12c2544.worker.js.map @@ -0,0 +1 @@ +{"version":3,"file":"41f50eb9f984c12c2544.worker.js","sources":["webpack://GUI/webpack/bootstrap","webpack://GUI/./node_modules/scratch-storage/src/FetchWorkerTool.worker.js","webpack://GUI/./node_modules/scratch-storage/src/safer-fetch.js"],"sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./node_modules/babel-loader/lib/index.js?!./node_modules/scratch-storage/src/FetchWorkerTool.worker.js\");\n","/* eslint-env worker */\n\nconst saferFetchAsArrayBuffer = require('./safer-fetch');\n\nconst complete = [];\n\nlet timeoutId = null;\n\nconst checkCompleted = () => {\n if (timeoutId) return;\n timeoutId = setTimeout(() => {\n timeoutId = null;\n if (complete.length) {\n // Send our chunk of completed requests and instruct postMessage to\n // transfer the buffers instead of copying them.\n postMessage(\n complete.slice(),\n // Instruct postMessage that these buffers in the sent message\n // should use their Transferable trait. After the postMessage\n // call the \"buffers\" will still be in complete if you looked,\n // but they will all be length 0 as the data they reference has\n // been sent to the window. This lets us send a lot of data\n // without the normal postMessage behaviour of making a copy of\n // all of the data for the window.\n complete.map(response => response.buffer).filter(Boolean)\n );\n complete.length = 0;\n }\n });\n};\n\n/**\n * Receive a job from the parent and fetch the requested data.\n * @param {object} options.job A job id, url, and options descriptor to perform.\n */\nconst onMessage = ({data: job}) => {\n saferFetchAsArrayBuffer(job.url, job.options)\n .then(buffer => complete.push({id: job.id, buffer}))\n .catch(error => complete.push({id: job.id, error: (error && error.message) || `Failed request: ${job.url}`}))\n .then(checkCompleted);\n};\n\nif (self.fetch) {\n postMessage({support: {fetch: true}});\n self.addEventListener('message', onMessage);\n} else {\n postMessage({support: {fetch: false}});\n self.addEventListener('message', ({data: job}) => {\n postMessage([{id: job.id, error: 'fetch is unavailable'}]);\n });\n}\n","/* eslint-env browser */\n/* eslint-disable no-use-before-define */\n\n// This throttles and retries fetch() to mitigate the effect of random network errors and\n// random browser errors (especially in Chrome)\n\nlet currentFetches = 0;\nconst queue = [];\n\nconst startNextFetch = ([resolve, url, options]) => {\n let firstError;\n let failedAttempts = 0;\n\n const attemptToFetch = () => fetch(url, options)\n .then(result => {\n // In a macOS WKWebView, requests from file: URLs to other file: URLs always have status: 0 and ok: false\n // even though the requests were successful. If the requested file doesn't exist, fetch() rejects instead.\n // We aren't aware of any other cases where fetch() can resolve with status 0, so this should be safe.\n if (result.ok || result.status === 0) return result.arrayBuffer();\n if (result.status === 404) return null;\n return Promise.reject(result.status);\n })\n .then(buffer => {\n currentFetches--;\n checkStartNextFetch();\n return buffer;\n })\n .catch(error => {\n if (error === 403) {\n // Retrying this request will not help, so return an error now.\n throw error;\n }\n\n console.warn(`Attempt to fetch ${url} failed`, error);\n if (!firstError) {\n firstError = error;\n }\n\n if (failedAttempts < 2) {\n failedAttempts++;\n return new Promise(cb => setTimeout(cb, (failedAttempts + Math.random() - 1) * 5000))\n .then(attemptToFetch);\n }\n\n currentFetches--;\n checkStartNextFetch();\n throw firstError;\n });\n\n return resolve(attemptToFetch());\n};\n\nconst checkStartNextFetch = () => {\n if (currentFetches < 100 && queue.length > 0) {\n currentFetches++;\n startNextFetch(queue.shift());\n }\n};\n\nconst saferFetchAsArrayBuffer = (url, options) => new Promise(resolve => {\n queue.push([resolve, url, options]);\n checkStartNextFetch();\n});\n\nmodule.exports = saferFetchAsArrayBuffer;\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClFA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AACA;;;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/addons.html b/addons.html new file mode 100644 index 0000000000000000000000000000000000000000..cb06398a389d378677d5604aee23bc21280bc7c4 --- /dev/null +++ b/addons.html @@ -0,0 +1,22 @@ + + + + + + Addon Settings - PenguinMod + + + + +
+ + diff --git a/bloomfilter.svg b/bloomfilter.svg new file mode 100644 index 0000000000000000000000000000000000000000..fa538bb9b3965f55a4ab85997a298d6a885692e9 --- /dev/null +++ b/bloomfilter.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/contact.html b/contact.html new file mode 100644 index 0000000000000000000000000000000000000000..fffe02d2c4afdc2d70e301bf0e4c5644064cfd48 --- /dev/null +++ b/contact.html @@ -0,0 +1,49 @@ + + + + PenguinMod - Contact + + + + + + +
+

Contact

+
+ +
+

+ Please only contact us personally for serious matters such as security, copyright, etc. +
+ Spam, advertisments, or other mail may be blocked. +

+ +
+ +

Email us at penguinmodhelp@gmail.com

+

Make an issue on our GitHub

+

Post or reply mentioning our X account

+

Join our Discord Server

+
+ + diff --git a/credits.html b/credits.html new file mode 100644 index 0000000000000000000000000000000000000000..94277a1b0ae38c11696cb0df58fb3ecaf38d3ea2 --- /dev/null +++ b/credits.html @@ -0,0 +1,22 @@ + + + + + + PenguinMod & TurboWarp Credits + + + + +
+ + diff --git a/editor.html b/editor.html new file mode 100644 index 0000000000000000000000000000000000000000..235b11ef02c99b31e7924fd563f1cac4bb50bdd4 --- /dev/null +++ b/editor.html @@ -0,0 +1,53 @@ + + + + + + + + PenguinMod - Editor + + + + + + + + + + +
+ + diff --git a/embed.html b/embed.html new file mode 100644 index 0000000000000000000000000000000000000000..bbf7167d830ff5e518f41e821717b7415db875b9 --- /dev/null +++ b/embed.html @@ -0,0 +1,50 @@ + + + + + + + + Embedded Project - PenguinMod + + + + + + + + + + +
+ + diff --git a/embedtest.html b/embedtest.html new file mode 100644 index 0000000000000000000000000000000000000000..3ddd79a21bf6dac0372f3dfc2be5a63b5b848a92 --- /dev/null +++ b/embedtest.html @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7902be7a25a944acb76ef00b73f721e76bca444b --- /dev/null +++ b/favicon.ico @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b6414945f53b55f68a2b3f62381e2ab92f2385a39a5329bfd7a8baa2e2ecba2 +size 238142 diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..5edd20a8cfbfbac54e21554850b882cfc89597eb Binary files /dev/null and b/favicon.png differ diff --git a/featured_project.png b/featured_project.png new file mode 100644 index 0000000000000000000000000000000000000000..d92d93a88142c372154829d93616e52322a6be66 Binary files /dev/null and b/featured_project.png differ diff --git a/fullscreen.html b/fullscreen.html new file mode 100644 index 0000000000000000000000000000000000000000..7132eef44d04f5d1868c6353272aac056125daae --- /dev/null +++ b/fullscreen.html @@ -0,0 +1,53 @@ + + + + + + + + PenguinMod - A mod of TurboWarp + + + + + + + + + + +
+ + diff --git a/iframeposttest.html b/iframeposttest.html new file mode 100644 index 0000000000000000000000000000000000000000..1d3f4fab5ef1bdfe39ecfe235ee9c384f8611c4b --- /dev/null +++ b/iframeposttest.html @@ -0,0 +1,37 @@ + + + + + + aegewg + + + + + + + + + + \ No newline at end of file diff --git a/iframereceivetest.html b/iframereceivetest.html new file mode 100644 index 0000000000000000000000000000000000000000..a23aa256cfd81eab2cff2a461f94e5c7608c164a --- /dev/null +++ b/iframereceivetest.html @@ -0,0 +1,22 @@ + + + + + + Document + + + + + + + + \ No newline at end of file diff --git a/images/192.png b/images/192.png new file mode 100644 index 0000000000000000000000000000000000000000..5edd20a8cfbfbac54e21554850b882cfc89597eb Binary files /dev/null and b/images/192.png differ diff --git a/images/512.png b/images/512.png new file mode 100644 index 0000000000000000000000000000000000000000..5edd20a8cfbfbac54e21554850b882cfc89597eb Binary files /dev/null and b/images/512.png differ diff --git a/images/apple-touch-icon.png b/images/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5edd20a8cfbfbac54e21554850b882cfc89597eb Binary files /dev/null and b/images/apple-touch-icon.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000000000000000000000000000000000000..37024f23807acd0bd8053723c275865cfc424707 --- /dev/null +++ b/index.html @@ -0,0 +1,53 @@ + + + + + + + + PenguinMod - A mod of TurboWarp + + + + + + + + + + +
+ + diff --git a/js/0.js b/js/0.js new file mode 100644 index 0000000000000000000000000000000000000000..035597b19595bcfaf68078d98871af9dbc8b01dd --- /dev/null +++ b/js/0.js @@ -0,0 +1,74 @@ +(window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([[0],{ + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/debug-console/style.css": +/*!*****************************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/debug-console/style.css ***! + \*****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, ".mediaRecorderPopup {\n box-sizing: border-box;\n width: 700px;\n max-height: min(800px, 80vh);\n max-width: 85%;\n margin-top: 12vh;\n overflow-y: auto;\n margin-left: auto;\n margin-right: auto;\n}\n\n.mediaRecorderPopupContent {\n padding: 1.5rem 2.25rem;\n}\n\n.mediaRecorderPopup p {\n font-size: 1rem;\n margin: 0.5rem auto;\n}\n\n.mediaRecorderPopup p :last-child {\n margin-left: 1rem;\n}\n\n.mediaRecorderPopup[dir=\"rtl\"] p :last-child {\n margin-left: 0;\n margin-right: 1rem;\n}\n\np.mediaRecorderPopupOption {\n display: flex;\n align-items: center;\n}\n\n.mediaRecorderPopupOption input[type=\"checkbox\"] {\n height: 1.5rem;\n}\n\n#recordOptionSecondsInput,\n#recordOptionDelayInput {\n width: 6rem;\n}\n\n.mediaRecorderPopupButtons {\n margin-top: 1.5rem;\n}\n\n.mediaRecorderPopupButtons button {\n margin-left: 0.5rem;\n}\n\n/* TW: Fixes cancel button in dark mode */\n.mediaRecorderPopupButtons button:nth-of-type(1) {\n color: black;\n}", ""]); + +// exports + + +/***/ }), + +/***/ "./src/addons/addons/debug-console/_runtime_entry.js": +/*!***********************************************************!*\ + !*** ./src/addons/addons/debug-console/_runtime_entry.js ***! + \***********************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/debug-console/userscript.js"); +/* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./style.css */ "./node_modules/css-loader/index.js!./src/addons/addons/debug-console/style.css"); +/* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__); +/* generated by pull.js */ + + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"], + "style.css": _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default.a +}; + +/***/ }), + +/***/ "./src/addons/addons/debug-console/userscript.js": +/*!*******************************************************!*\ + !*** ./src/addons/addons/debug-console/userscript.js ***! + \*******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (async _ref => { + let { + addon, + console, + msg + } = _ref; + // ページ読み込み直後にerudaを読み込む + if (!window.eruda) { + const script = document.createElement('script'); + script.src = 'https://soiz1-eruda3.hf.space/eruda.js'; + script.onload = () => { + eruda.init(); + }; + document.body.appendChild(script); + } +}); + +/***/ }) + +}]); +//# sourceMappingURL=0.js.map \ No newline at end of file diff --git a/js/0.js.map b/js/0.js.map new file mode 100644 index 0000000000000000000000000000000000000000..81fe3262851aca34409a1d6d6d4975ff777604b2 --- /dev/null +++ b/js/0.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/0.js","sources":["webpack://GUI/./src/addons/addons/debug-console/style.css","webpack://GUI/./src/addons/addons/debug-console/_runtime_entry.js","webpack://GUI/./src/addons/addons/debug-console/userscript.js"],"sourcesContent":["exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".mediaRecorderPopup {\\n box-sizing: border-box;\\n width: 700px;\\n max-height: min(800px, 80vh);\\n max-width: 85%;\\n margin-top: 12vh;\\n overflow-y: auto;\\n margin-left: auto;\\n margin-right: auto;\\n}\\n\\n.mediaRecorderPopupContent {\\n padding: 1.5rem 2.25rem;\\n}\\n\\n.mediaRecorderPopup p {\\n font-size: 1rem;\\n margin: 0.5rem auto;\\n}\\n\\n.mediaRecorderPopup p :last-child {\\n margin-left: 1rem;\\n}\\n\\n.mediaRecorderPopup[dir=\\\"rtl\\\"] p :last-child {\\n margin-left: 0;\\n margin-right: 1rem;\\n}\\n\\np.mediaRecorderPopupOption {\\n display: flex;\\n align-items: center;\\n}\\n\\n.mediaRecorderPopupOption input[type=\\\"checkbox\\\"] {\\n height: 1.5rem;\\n}\\n\\n#recordOptionSecondsInput,\\n#recordOptionDelayInput {\\n width: 6rem;\\n}\\n\\n.mediaRecorderPopupButtons {\\n margin-top: 1.5rem;\\n}\\n\\n.mediaRecorderPopupButtons button {\\n margin-left: 0.5rem;\\n}\\n\\n/* TW: Fixes cancel button in dark mode */\\n.mediaRecorderPopupButtons button:nth-of-type(1) {\\n color: black;\\n}\", \"\"]);\n\n// exports\n","/* generated by pull.js */\nimport _js from \"./userscript.js\";\nimport _css from \"!css-loader!./style.css\";\nexport const resources = {\n \"userscript.js\": _js,\n \"style.css\": _css,\n};","export default async ({ addon, console, msg }) => {\n // ページ読み込み直後にerudaを読み込む\n if (!window.eruda) {\n const script = document.createElement('script');\n script.src = 'https://soiz1-eruda3.hf.space/eruda.js';\n script.onload = () => {\n eruda.init();\n };\n document.body.appendChild(script);\n }\n};\n"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACPA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACNA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/js/1.js b/js/1.js new file mode 100644 index 0000000000000000000000000000000000000000..8886c3d2115abe6b651529c6958f10e3435b70ba --- /dev/null +++ b/js/1.js @@ -0,0 +1,124 @@ +(window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([[1],{ + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/fps/userstyle.css": +/*!***********************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/fps/userstyle.css ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, ".fps-counter {\n font-size: 0.625rem;\n font-weight: bold;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n white-space: nowrap;\n padding: 0.25rem;\n user-select: none;\n color: #0fbd8c;\n display: none;\n align-items: center;\n}\n\n.fps-counter.show {\n display: flex;\n}\n\n.sa-small-stage .fps-counter {\n display: none;\n}", ""]); + +// exports + + +/***/ }), + +/***/ "./src/addons/addons/fps/_runtime_entry.js": +/*!*************************************************!*\ + !*** ./src/addons/addons/fps/_runtime_entry.js ***! + \*************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/fps/userscript.js"); +/* harmony import */ var _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./userstyle.css */ "./node_modules/css-loader/index.js!./src/addons/addons/fps/userstyle.css"); +/* harmony import */ var _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1__); +/* generated by pull.js */ + + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"], + "userstyle.css": _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1___default.a +}; + +/***/ }), + +/***/ "./src/addons/addons/fps/userscript.js": +/*!*********************************************!*\ + !*** ./src/addons/addons/fps/userscript.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (async function (_ref) { + let { + addon, + console, + msg + } = _ref; + const { + vm + } = addon.tab.traps; + const { + runtime + } = vm; + if (!vm.editingTarget) { + await new Promise(resolve => runtime.once("PROJECT_LOADED", resolve)); + } + let fpsCounterElement = document.createElement("span"); + fpsCounterElement.className = "fps-counter"; + addon.tab.displayNoneWhileDisabled(fpsCounterElement); + let lastRender; + let lastFps; + let wasRunning = false; + const { + renderer + } = runtime; + const _draw = renderer.draw; + renderer.draw = function () { + _draw.call(this); + const now = runtime.currentMSecs; + // If it's been more than 500ms since the last draw, we want to reset the variables. + if (typeof lastRender !== "number" || now - lastRender > 500) { + lastRender = now; + lastFps = null; + return; + } + // If the current time has been rendered, return, Don't show infinity. + if (now === lastRender) return; + // Every time this function is ran, store the current time and remove times from half a second ago + let smoothing = 0.9; + let calculatedFps = 1000 / (now - lastRender); + if (typeof lastFps !== "number") lastFps = calculatedFps; + // Calculate a smoothed FPS so that numbers aren't changing too fast. + const fps = Math.round(lastFps * smoothing + calculatedFps * (1 - smoothing)); + lastRender = now; + + // Show/Hide the element based on if there are any threads running + if (runtime.threads.length === 0) { + if (wasRunning) fpsCounterElement.classList.remove("show"); + wasRunning = false; + return; + } + if (!wasRunning) fpsCounterElement.classList.add("show"); + if (fps !== lastFps || !wasRunning) fpsCounterElement.innerText = "FPS: ".concat(lastFps = fps); + wasRunning = true; + }; + while (true) { + await addon.tab.waitForElement('[class*="controls_controls-container"]', { + markAsSeen: true, + reduxEvents: ["scratch-gui/mode/SET_PLAYER", "fontsLoaded/SET_FONTS_LOADED", "scratch-gui/locales/SELECT_LOCALE"] + }); + addon.tab.appendToSharedSpace({ + space: "afterStopButton", + element: fpsCounterElement, + order: 3 + }); + } +}); + +/***/ }) + +}]); +//# sourceMappingURL=1.js.map \ No newline at end of file diff --git a/js/1.js.map b/js/1.js.map new file mode 100644 index 0000000000000000000000000000000000000000..c063cebf8e9a94238e96d763578ced61f196be8d --- /dev/null +++ b/js/1.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/1.js","sources":["webpack://GUI/./src/addons/addons/fps/userstyle.css","webpack://GUI/./src/addons/addons/fps/_runtime_entry.js","webpack://GUI/./src/addons/addons/fps/userscript.js"],"sourcesContent":["exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".fps-counter {\\n font-size: 0.625rem;\\n font-weight: bold;\\n font-family: \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n white-space: nowrap;\\n padding: 0.25rem;\\n user-select: none;\\n color: #0fbd8c;\\n display: none;\\n align-items: center;\\n}\\n\\n.fps-counter.show {\\n display: flex;\\n}\\n\\n.sa-small-stage .fps-counter {\\n display: none;\\n}\", \"\"]);\n\n// exports\n","/* generated by pull.js */\nimport _js from \"./userscript.js\";\nimport _css from \"!css-loader!./userstyle.css\";\nexport const resources = {\n \"userscript.js\": _js,\n \"userstyle.css\": _css,\n};","\nexport default async function ({ addon, console, msg }) {\n const { vm } = addon.tab.traps;\n const { runtime } = vm;\n if (!vm.editingTarget) {\n await new Promise((resolve) => runtime.once(\"PROJECT_LOADED\", resolve));\n }\n\n let fpsCounterElement = document.createElement(\"span\");\n fpsCounterElement.className = \"fps-counter\";\n addon.tab.displayNoneWhileDisabled(fpsCounterElement);\n\n let lastRender;\n let lastFps;\n let wasRunning = false;\n\n const { renderer } = runtime;\n const _draw = renderer.draw;\n renderer.draw = function () {\n _draw.call(this);\n\n const now = runtime.currentMSecs;\n // If it's been more than 500ms since the last draw, we want to reset the variables.\n if (typeof lastRender !== \"number\" || now - lastRender > 500) {\n lastRender = now;\n lastFps = null;\n return;\n }\n // If the current time has been rendered, return, Don't show infinity.\n if (now === lastRender) return;\n // Every time this function is ran, store the current time and remove times from half a second ago\n let smoothing = 0.9;\n let calculatedFps = 1000 / (now - lastRender);\n if (typeof lastFps !== \"number\") lastFps = calculatedFps;\n // Calculate a smoothed FPS so that numbers aren't changing too fast.\n const fps = Math.round(lastFps * smoothing + calculatedFps * (1 - smoothing));\n lastRender = now;\n\n // Show/Hide the element based on if there are any threads running\n if (runtime.threads.length === 0) {\n if (wasRunning) fpsCounterElement.classList.remove(\"show\");\n wasRunning = false;\n return;\n }\n if (!wasRunning) fpsCounterElement.classList.add(\"show\");\n if (fps !== lastFps || !wasRunning) fpsCounterElement.innerText = `FPS: ${lastFps = fps}`;\n wasRunning = true;\n };\n\n while (true) {\n await addon.tab.waitForElement('[class*=\"controls_controls-container\"]', {\n markAsSeen: true,\n reduxEvents: [\"scratch-gui/mode/SET_PLAYER\", \"fontsLoaded/SET_FONTS_LOADED\", \"scratch-gui/locales/SELECT_LOCALE\"],\n });\n addon.tab.appendToSharedSpace({ space: \"afterStopButton\", element: fpsCounterElement, order: 3 });\n }\n}"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACPA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACLA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/js/2.js b/js/2.js new file mode 100644 index 0000000000000000000000000000000000000000..3f95b34351cea325700df0e96288c582f470ca0f --- /dev/null +++ b/js/2.js @@ -0,0 +1,53 @@ +(window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([[2],{ + +/***/ "./src/addons/addons/ScratchHighlightFullwidthNumber/_runtime_entry.js": +/*!*****************************************************************************!*\ + !*** ./src/addons/addons/ScratchHighlightFullwidthNumber/_runtime_entry.js ***! + \*****************************************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/ScratchHighlightFullwidthNumber/userscript.js"); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_userscript_js__WEBPACK_IMPORTED_MODULE_0__); +/* generated by pull.js */ + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0___default.a +}; + +/***/ }), + +/***/ "./src/addons/addons/ScratchHighlightFullwidthNumber/userscript.js": +/*!*************************************************************************!*\ + !*** ./src/addons/addons/ScratchHighlightFullwidthNumber/userscript.js ***! + \*************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +const target = document.querySelectorAll('.blocklyBlockCanvas'); +const regexp = /[0-9]/; +const observer = new MutationObserver(records => { + document.querySelectorAll('*[data-argument-type~="text"] text, *[data-argument-type~="number"] text').forEach(e => { + if (regexp.test(e.textContent)) { + e.style.fill = 'red'; + } else { + e.style.fill = ''; + } + }); +}); +target.forEach(e => { + observer.observe(e, { + attributes: true, + characterData: true, + childList: true, + subtree: true + }); +}); + +/***/ }) + +}]); +//# sourceMappingURL=2.js.map \ No newline at end of file diff --git a/js/2.js.map b/js/2.js.map new file mode 100644 index 0000000000000000000000000000000000000000..165b3f1331fccef00d8a1331ca9985eca50b7715 --- /dev/null +++ b/js/2.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/2.js","sources":["webpack://GUI/./src/addons/addons/ScratchHighlightFullwidthNumber/_runtime_entry.js","webpack://GUI/./src/addons/addons/ScratchHighlightFullwidthNumber/userscript.js"],"sourcesContent":["/* generated by pull.js */\nimport _js from \"./userscript.js\";\nexport const resources = {\n \"userscript.js\": _js\n};","const target = document.querySelectorAll('.blocklyBlockCanvas');\nconst regexp = /[0-9]/;\n\nconst observer = new MutationObserver(records => {\n document.querySelectorAll('*[data-argument-type~=\"text\"] text, *[data-argument-type~=\"number\"] text').forEach(e => {\n if (regexp.test(e.textContent)){\n e.style.fill = 'red';\n } else {\n e.style.fill = '';\n }\n });\n});\n\ntarget.forEach(e => {\n observer.observe(e, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true\n });\n});"],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACJA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/js/addon-default-entry.js b/js/addon-default-entry.js new file mode 100644 index 0000000000000000000000000000000000000000..1506b100e47f4e64782bb23fc1d78407143cbbd2 --- /dev/null +++ b/js/addon-default-entry.js @@ -0,0 +1,13439 @@ +(window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-default-entry"],{ + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/color-picker/style.css": +/*!****************************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/color-picker/style.css ***! + \****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, ".sa-color-picker {\n display: flex;\n}\n\n.sa-color-picker-code {\n margin: 8px 0;\n}\n\n.sa-color-picker-paint {\n margin-top: 16px;\n margin-bottom: 4px;\n}\n\n.sa-color-picker > .sa-color-picker-color {\n border: none;\n border-top-left-radius: 1rem;\n border-bottom-left-radius: 1rem;\n padding: 0;\n padding-left: 0.6rem;\n padding-right: 0.4rem;\n margin-left: 0.5rem;\n outline: none;\n box-sizing: border-box;\n width: 3rem;\n height: 2rem;\n}\n[theme=\"dark\"] .sa-color-picker > .sa-color-picker-color {\n background: var(--ui-secondary);\n}\n\n.sa-color-picker > .sa-color-picker-text {\n box-sizing: border-box;\n width: calc(150px - 3rem);\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n[dir=\"rtl\"] .sa-color-picker > .sa-color-picker-color {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n border-top-right-radius: 1rem;\n border-bottom-right-radius: 1rem;\n margin-left: 0;\n margin-right: 0.5rem;\n}\n\n[dir=\"rtl\"] .sa-color-picker > .sa-color-picker-text {\n border-top-left-radius: 1rem;\n border-bottom-left-radius: 1rem;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\nbody.sa-hide-eye-dropper-background div[class*=\"stage_color-picker-background\"] {\n /* Do not show eye dropper background if the color picker is \"fake\" */\n display: none;\n}\n", ""]); + +// exports + + +/***/ }), + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/editor-comment-previews/userstyle.css": +/*!*******************************************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/editor-comment-previews/userstyle.css ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, ".sa-comment-preview-outer {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 100000000;\n pointer-events: none;\n}\n\n.sa-comment-preview-inner {\n width: calc(200px - 16px);\n max-height: calc(132px - 8px);\n padding: 8px;\n overflow: hidden;\n\n font-size: 12px;\n white-space: pre-wrap;\n pointer-events: none;\n\n color: rgb(87, 94, 117);\n background-color: rgb(255 255 255 / 90%);\n border-style: none;\n border-radius: 8px;\n filter: drop-shadow(0px 5px 5px rgb(0 0 0 / 10%));\n\n transform: perspective(200px);\n}\n\n@supports (backdrop-filter: blur(16px)) {\n .sa-comment-preview-inner {\n background-color: rgb(255 255 255 / 75%);\n backdrop-filter: blur(16px);\n }\n}\n\n.sa-comment-preview-fade {\n transition: opacity 0.1s, filter 0.1s, transform 0.1s linear;\n}\n\n.sa-comment-preview-hidden {\n opacity: 0;\n filter: none;\n transform: perspective(200px) translateZ(-20px);\n}\n\n.sa-comment-preview-reduce-transparency {\n background-color: rgb(255 255 255);\n backdrop-filter: none;\n}\n", ""]); + +// exports + + +/***/ }), + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/editor-searchable-dropdowns/userscript.css": +/*!************************************************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/editor-searchable-dropdowns/userscript.css ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, ".u-dropdown-searchbar {\n width: 100%;\n box-sizing: border-box;\n /* based on styles for the title input */\n color: white;\n background-color: hsla(0, 100%, 100%, 0.25);\n border: 1px solid hsla(0, 0%, 0%, 0.15);\n padding: 0.5rem;\n outline: none;\n transition: 0.25s ease-out;\n font-size: 13px;\n font-weight: bold;\n border-radius: 4px;\n}\n.u-dropdown-searchbar:hover {\n background-color: hsla(0, 100%, 100%, 0.5);\n}\n.u-dropdown-searchbar:focus {\n background-color: white;\n color: black;\n}\n.blocklyDropDownDiv .goog-menu {\n overflow-x: hidden;\n}\n", ""]); + +// exports + + +/***/ }), + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/editor-theme3/compatibility.css": +/*!*************************************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/editor-theme3/compatibility.css ***! + \*************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, "/* Imported by other addons */\n\n.sa-block-color {\n --sa-block-colored-background: var(--sa-block-background-primary);\n --sa-block-colored-background-secondary: var(--sa-block-field-background);\n --sa-block-bright-background: var(--sa-block-background-primary);\n --sa-block-text: white;\n --sa-block-gray-text: white;\n --sa-block-colored-text: var(--sa-block-background-primary);\n --sa-block-text-on-bright-background: white;\n}\n\n.sa-block-color-motion {\n --sa-block-background-primary: var(--editorTheme3-motion-primary, #4c97ff);\n --sa-block-background-secondary: var(--editorTheme3-motion-secondary, #4280d7);\n --sa-block-background-tertiary: var(--editorTheme3-motion-tertiary, #3373cc);\n --sa-block-field-background: var(--editorTheme3-motion-field, #3373cc);\n}\n\n.sa-block-color-looks {\n --sa-block-background-primary: var(--editorTheme3-looks-primary, #9966ff);\n --sa-block-background-secondary: var(--editorTheme3-looks-secondary, #855cd6);\n --sa-block-background-tertiary: var(--editorTheme3-looks-tertiary, #774dcb);\n --sa-block-field-background: var(--editorTheme3-looks-field, #774dcb);\n}\n\n.sa-block-color-sounds {\n --sa-block-background-primary: var(--editorTheme3-sounds-primary, #cf63cf);\n --sa-block-background-secondary: var(--editorTheme3-sounds-secondary, #c94fc9);\n --sa-block-background-tertiary: var(--editorTheme3-sounds-tertiary, #bd42bd);\n --sa-block-field-background: var(--editorTheme3-sounds-field, #bd42bd);\n}\n\n.sa-block-color-events {\n --sa-block-background-primary: var(--editorTheme3-event-primary, #ffbf00);\n --sa-block-background-secondary: var(--editorTheme3-event-secondary, #e6ac00);\n --sa-block-background-tertiary: var(--editorTheme3-event-tertiary, #cc9900);\n --sa-block-field-background: var(--editorTheme3-event-field, #cc9900);\n}\n\n.sa-block-color-control {\n --sa-block-background-primary: var(--editorTheme3-control-primary, #ffab19);\n --sa-block-background-secondary: var(--editorTheme3-control-secondary, #ec9c13);\n --sa-block-background-tertiary: var(--editorTheme3-control-tertiary, #cf8b17);\n --sa-block-field-background: var(--editorTheme3-control-field, #cf8b17);\n}\n\n.sa-block-color-sensing {\n --sa-block-background-primary: var(--editorTheme3-sensing-primary, #5cb1d6);\n --sa-block-background-secondary: var(--editorTheme3-sensing-secondary, #47a8d1);\n --sa-block-background-tertiary: var(--editorTheme3-sensing-tertiary, #2e8eb8);\n --sa-block-field-background: var(--editorTheme3-sensing-field, #2e8eb8);\n}\n\n.sa-block-color-operators {\n --sa-block-background-primary: var(--editorTheme3-operators-primary, #59c059);\n --sa-block-background-secondary: var(--editorTheme3-operators-secondary, #46b946);\n --sa-block-background-tertiary: var(--editorTheme3-operators-tertiary, #389438);\n --sa-block-field-background: var(--editorTheme3-operators-field, #389438);\n}\n\n.sa-block-color-data {\n --sa-block-background-primary: var(--editorTheme3-data-primary, #ff8c1a);\n --sa-block-background-secondary: var(--editorTheme3-data-secondary, #ff8000);\n --sa-block-background-tertiary: var(--editorTheme3-data-tertiary, #db6e00);\n --sa-block-field-background: var(--editorTheme3-data-field, #db6e00);\n}\n\n.sa-block-color-data-lists,\n.sa-block-color-list {\n --sa-block-background-primary: var(--editorTheme3-data_lists-primary, #ff661a);\n --sa-block-background-secondary: var(--editorTheme3-data_lists-secondary, #ff5500);\n --sa-block-background-tertiary: var(--editorTheme3-data_lists-tertiary, #e64d00);\n --sa-block-field-background: var(--editorTheme3-data_lists-field, #e64d00);\n}\n\n.sa-block-color-more,\n.sa-block-color-null {\n --sa-block-background-primary: var(--editorTheme3-more-primary, #ff6680);\n --sa-block-background-secondary: var(--editorTheme3-more-secondary, #ff4d6a);\n --sa-block-background-tertiary: var(--editorTheme3-more-tertiary, #ff3355);\n --sa-block-field-background: var(--editorTheme3-more-field, #ff3355);\n}\n\n.sa-block-color-pen {\n --sa-block-background-primary: var(--editorTheme3-pen-primary, #0fbd8c);\n --sa-block-background-secondary: var(--editorTheme3-pen-secondary, #0da57a);\n --sa-block-background-tertiary: var(--editorTheme3-pen-tertiary, #0b8e69);\n --sa-block-field-background: var(--editorTheme3-pen-field, #0b8e69);\n}\n\n.sa-block-color-addon-custom-block {\n --sa-block-background-primary: var(--editorTheme3-sa-primary, #29beb8);\n --sa-block-background-secondary: var(--editorTheme3-sa-secondary, #3aa8a4);\n --sa-block-background-tertiary: var(--editorTheme3-sa-tertiary, #3aa8a4);\n --sa-block-field-background: var(--editorTheme3-sa-field, #3aa8a4);\n}\n\n.sa-block-color-TurboWarp {\n --sa-block-background-primary: var(--editorTheme3-tw-primary, #ff4c4c);\n --sa-block-background-secondary: var(--editorTheme3-tw-secondary, #e64444);\n --sa-block-background-tertiary: var(--editorTheme3-tw-tertiary, #e64444);\n --sa-block-field-background: var(--editorTheme3-tw-field, #e64444);\n}\n", ""]); + +// exports + + +/***/ }), + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/find-bar/userstyle.css": +/*!****************************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/find-bar/userstyle.css ***! + \****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports +exports.i(__webpack_require__(/*! -!../../../../node_modules/css-loader!../editor-theme3/compatibility.css */ "./node_modules/css-loader/index.js!./src/addons/addons/editor-theme3/compatibility.css"), ""); + +// module +exports.push([module.i, ".sa-find-bar {\n display: flex;\n align-items: center;\n white-space: nowrap;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n width: 100%;\n height: 100%;\n margin-left: 1em;\n}\n.sa-find-bar[hidden] {\n /* !important to override displayNoneWhileDisabled */\n display: none !important;\n}\n\n.sa-find-wrapper {\n overflow: visible;\n position: relative;\n height: 2rem;\n width: 100%;\n max-width: 16em;\n}\n\n.sa-find-dropdown-out {\n display: block;\n top: -6px;\n z-index: 100;\n width: 100%;\n max-width: 16em;\n position: relative;\n padding: 4px;\n border: none;\n border-radius: 4px;\n margin-top: 6px;\n}\n\n.sa-find-dropdown-out.visible {\n position: absolute;\n width: 16em;\n box-shadow: 0px 0px 8px 1px var(--ui-black-transparent, rgba(0, 0, 0, 0.3));\n background-color: var(--ui-primary, white);\n}\n\n/* We need to modify Scratch styles so that the place where the find bar is injected */\n/* has actually correct size information, which is used to make the find bar not cover up controls */\n[class*=\"gui_tab-list_\"] {\n width: 100%;\n}\n[class*=\"gui_tab_\"] {\n flex-grow: 0;\n}\n\n.sa-find-input {\n width: 100%;\n box-sizing: border-box !important;\n /* !important required for extension, because CSS injection method (and hence order) differs from addon */\n height: 1.5rem;\n\n /* Change Scratch default styles */\n border-radius: 0.25rem;\n font-size: 0.75rem;\n padding-left: 0.4em;\n}\n\n.sa-find-input:focus {\n /* Change Scratch default styles */\n box-shadow: none;\n}\n\n.sa-find-dropdown {\n display: none;\n position: relative;\n padding: 0.2em 0;\n font-size: 0.75rem;\n line-height: 1;\n overflow-y: auto;\n min-height: 128px;\n max-height: 65vh;\n user-select: none;\n max-width: 100%;\n margin-top: 6px;\n border: none;\n}\n\n.sa-find-dropdown-out.visible > .sa-find-dropdown {\n display: block;\n}\n\n.sa-find-dropdown > li {\n display: block;\n padding: 0.5em 0.3em;\n white-space: nowrap;\n margin: 0;\n font-weight: bold;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.sa-find-dropdown > li > b {\n background-color: #aaffaa;\n color: black;\n}\n\n/* Drop down items */\n.sa-find-dropdown > li:hover,\n.sa-find-dropdown > li.sel {\n color: var(--sa-block-text-on-bright-background);\n cursor: pointer;\n}\n\n.sa-find-dropdown > li::before {\n content: \"\\25CF \"; /* ● */\n}\n\n.sa-find-flag {\n color: #4cbf56;\n}\n/* .sa-find-dropdown added for specificity */\n.sa-find-dropdown > .sa-find-flag:hover,\n.sa-find-dropdown > .sa-find-flag.sel {\n background-color: #4cbf56;\n color: white;\n}\n\n.sa-find-dropdown .sa-block-color {\n color: var(--sa-block-colored-text);\n}\n.sa-find-dropdown .sa-block-color:hover,\n.sa-find-dropdown .sa-block-color.sel {\n background-color: var(--sa-block-bright-background);\n}\n\n.sa-find-carousel {\n font-weight: normal;\n position: absolute;\n right: 0;\n white-space: nowrap;\n background-color: inherit;\n z-index: 1;\n padding: 0;\n}\n\n.sa-find-carousel-control {\n padding: 0 6px;\n}\n\n.sa-find-carousel-control:hover {\n color: #ffff80;\n}\n", ""]); + +// exports + + +/***/ }), + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/folders/style.css": +/*!***********************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/folders/style.css ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, ".sa-folders-contextmenu-item {\n max-width: 250px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n[sa-folders-context-type=\"folder\"] .react-contextmenu > :not(.sa-ctx-menu) {\n display: none;\n}\n", ""]); + +// exports + + +/***/ }), + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/middle-click-popup/userstyle.css": +/*!**************************************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/middle-click-popup/userstyle.css ***! + \**************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports +exports.i(__webpack_require__(/*! -!../../../../node_modules/css-loader!../editor-theme3/compatibility.css */ "./node_modules/css-loader/index.js!./src/addons/addons/editor-theme3/compatibility.css"), ""); + +// module +exports.push([module.i, ".sa-mcp-root {\n display: flex;\n white-space: nowrap;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n\n position: absolute;\n min-width: 100px;\n background-color: white;\n border-radius: 4px;\n box-shadow:\n rgba(0, 0, 0, 0.3) 0 0 3px,\n rgba(0, 0, 0, 0.2) 0 3px 10px;\n\n z-index: 999;\n}\n\n.sa-mcp-container {\n display: flex;\n flex-flow: column;\n top: -6px;\n z-index: 100;\n position: absolute;\n box-shadow: 0px 0px 8px 1px rgba(0, 0, 0, 0.3);\n background-color: white;\n border: none;\n border-radius: 4px;\n overflow: auto;\n resize: both;\n}\n[theme=\"dark\"] .sa-mcp-container {\n background-color: #222;\n}\n\n.sa-mcp-input-wrapper {\n position: relative;\n margin: 4px;\n /* !important required for extension, because CSS injection method (and hence order) differs from addon */\n box-sizing: border-box !important;\n height: 1.5rem;\n min-height: 1.5rem;\n\n /* Change Scratch default styles */\n border-radius: 0.25rem;\n font-size: 0.75rem;\n padding-left: 0.2rem;\n padding-right: 0.2rem;\n}\n\n.sa-mcp-input-wrapper:focus {\n /* Change Scratch default styles */\n box-shadow: none;\n}\n\n.sa-mcp-input-wrapper[data-error=\"true\"] {\n border-color: red;\n}\n\n.sa-mcp-input-wrapper > input {\n position: absolute;\n border: 0;\n background-color: transparent;\n outline: none;\n width: 100%;\n height: 100%;\n line-height: 100%;\n box-sizing: border-box;\n}\n\n.sa-mcp-input-suggestion {\n color: hsla(225, 15%, 40%, 0.65);\n}\n\n.sa-mcp-preview-container {\n flex: auto;\n overflow-y: scroll;\n scrollbar-width: none;\n}\n\n.sa-mcp-preview-container::-webkit-scrollbar {\n width: 0;\n height: 0;\n}\n\n.sa-mcp-preview-blocks {\n width: 100%;\n min-height: 100%;\n /* https://stackoverflow.com/a/22166728/8448397 */\n float: left;\n}\n\n.sa-mcp-preview-scrollbar {\n position: absolute;\n width: 11px;\n right: 0;\n bottom: 0;\n}\n\n.sa-mcp-preview-block-bg {\n width: 100%;\n fill: transparent;\n cursor: grab;\n}\n\n.sa-mcp-preview-block {\n filter: brightness(95%);\n cursor: grab;\n}\n\n.sa-mcp-preview-block-selection {\n filter: brightness(103%);\n}\n\n.sa-mcp-preview-block-bg-selection {\n fill: #7774;\n}\n", ""]); + +// exports + + +/***/ }), + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/multi-tab-code/userstyle.css": +/*!**********************************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/multi-tab-code/userstyle.css ***! + \**********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, ".tab-scroller {\n width: max-content;\n display: flex;\n position: absolute;\n}\n.tab-scrollbar {\n position: absolute;\n background-color: black;\n height: 1px;\n width: 20px;\n bottom: 0;\n}\n.tab-scrollbar:hover { height: 3px; }\n.tab-wrapper {\n position: absolute;\n right: 0;\n height: 17px;\n overflow-x: hidden;\n overflow-y: visible;\n scrollbar-width: thin;\n}\n.tab-wrapper.copying {\n height: 29px;\n}\n.tab-adder-button {\n width: 12px;\n height: 12px;\n margin: 1px;\n margin-right: 11px;\n border-radius: 3px;\n border: none;\n}\n[theme=dark] .tab-adder-button {\n filter: invert(1);\n}\n.tab-adder-button:hover {\n background-color: rgba(0 0 0 / 15%);\n}\n.tab-bounds {\n height: 14px;\n display: inline-flex;\n flex-direction: column;\n align-items: flex-start;\n width: max-content;\n}\n.tab-bounds.copying {\n height: 28px;\n}\n.tab {\n border-radius: 3px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n padding: 1px 4px;\n min-width: 20px;\n font-size: 10px;\n text-align: center;\n cursor: pointer;\n overflow-y: hidden;\n user-select: none;\n background-color: var(--ui-primary, hsla(215, 100%, 95%, 1));\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n border-top: none;\n transition: height 100ms ease-in, color 100ms ease-in;\n}\n.tab.unselected {\n height: 7px;\n color: transparent;\n}\n.tab.hover {\n height: 10px;\n color: #333;\n}\n.tab.selected {\n height: 14px;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n}\n.tab.copying {\n height: 28px;\n color: var(--text-primary, hsla(225, 15%, 40%, 1));\n}", ""]); + +// exports + + +/***/ }), + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/onion-skinning/style.css": +/*!******************************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/onion-skinning/style.css ***! + \******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, ".sa-onion-button {\n position: relative;\n}\n.sa-onion-button:focus-within {\n background-color: hsla(194, 100%, 50%, 0.2);\n}\n[theme=\"dark\"] .sa-onion-image {\n filter: brightness(0) invert(0.8);\n}\n.sa-onion-button[data-enabled=\"true\"] .sa-onion-image {\n filter: brightness(0) invert(1);\n}\n.sa-onion-button[data-enabled=\"true\"] {\n background-color: #00c3ff;\n}\n\n.sa-onion-group {\n position: relative;\n flex-direction: row;\n}\n\n.sa-onion-settings-wrapper {\n position: absolute;\n justify-items: center;\n left: 50%;\n width: 1.95rem;\n height: 1.95rem;\n display: grid;\n}\n\n.sa-onion-settings {\n position: absolute;\n bottom: 100%;\n /* based on the styles for the color dropdown */\n padding: 4px;\n border-radius: 4px;\n border: 1px solid var(--paint-ui-pane-border, #ddd);\n box-shadow: 0px 0px 8px 1px rgba(0, 0, 0, 0.3);\n transition-property: bottom, opacity;\n transition-duration: 500ms;\n transition-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n opacity: 0;\n pointer-events: none;\n background: var(--ui-primary, white);\n min-height: 100%;\n min-width: 100%;\n display: flex;\n flex-direction: column;\n gap: 0.25em;\n}\n.sa-onion-settings[data-visible=\"true\"] {\n bottom: calc(100% + 22px);\n pointer-events: auto;\n opacity: 1;\n}\n\n.sa-onion-settings-line {\n display: flex;\n justify-content: flex-end;\n align-items: baseline;\n gap: 0.25em;\n}\n\n.sa-onion-settings-input {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n text-align: center;\n border: 0;\n background: transparent;\n -moz-appearance: textfield;\n border: 0;\n outline: 0;\n}\n\n.sa-onion-settings-input::-webkit-outer-spin-button,\n.sa-onion-settings-input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.sa-onion-settings-tip {\n position: absolute;\n bottom: 0;\n transform: translateY(100%);\n right: calc(50% - 7px);\n}\n.sa-onion-settings-polygon {\n fill: var(--ui-primary, white);\n stroke: var(--paint-ui-pane-border, #ddd);\n}\n\n.sa-onion-settings-label {\n white-space: nowrap;\n}\n", ""]); + +// exports + + +/***/ }), + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/pick-colors-from-stage/style.css": +/*!**************************************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/pick-colors-from-stage/style.css ***! + \**************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, ".sa-stage-color-picker-picking [class^=\"stage_color-picker-background_\"] {\n display: none;\n}\n", ""]); + +// exports + + +/***/ }), + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/reorder-custom-inputs/arrows.css": +/*!**************************************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/reorder-custom-inputs/arrows.css ***! + \**************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, ".blocklyTextShiftArrow {\n position: absolute;\n top: -50px;\n left: 50%;\n margin-left: -12.5px;\n cursor: pointer;\n}", ""]); + +// exports + + +/***/ }), + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/toolbox-category-drag/userstyle.css": +/*!*****************************************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/toolbox-category-drag/userstyle.css ***! + \*****************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, "div[class=\"scratchCategoryMenuRow\"][data-dragger=\"true\"] > div {\n background: white;\n font-size: 0.65rem;\n}\n\n[theme=\"dark\"] div[class=\"scratchCategoryMenuRow\"][data-dragger=\"true\"] > div {\n background: var(--ui-secondary);\n}", ""]); + +// exports + + +/***/ }), + +/***/ "./node_modules/css-loader/index.js!./src/addons/addons/toolbox-full-blocks-on-hover/userstyle.css": +/*!************************************************************************************************!*\ + !*** ./node_modules/css-loader!./src/addons/addons/toolbox-full-blocks-on-hover/userstyle.css ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, "[class*=\"blocks_blocks_\"] .blocklyFlyout:has(.blocklyDraggable:hover) {\n overflow: visible;\n z-index: 31;\n}\n\n[class*=\"blocks_blocks_\"] .blocklyFlyout:has(.blocklyDraggable:hover) .blocklyWorkspace {\n clip-path: unset !important;\n}", ""]); + +// exports + + +/***/ }), + +/***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/editor-devtools/icon--close.svg": +/*!*************************************************************************************************!*\ + !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/editor-devtools/icon--close.svg ***! + \*************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3LjQ4IDcuNDgiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6MnB4O308L3N0eWxlPjwvZGVmcz48dGl0bGU+aWNvbi0tYWRkPC90aXRsZT48bGluZSBjbGFzcz0iY2xzLTEiIHgxPSIzLjc0IiB5MT0iNi40OCIgeDI9IjMuNzQiIHkyPSIxIi8+PGxpbmUgY2xhc3M9ImNscy0xIiB4MT0iMSIgeTE9IjMuNzQiIHgyPSI2LjQ4IiB5Mj0iMy43NCIvPjwvc3ZnPg=="); + +/***/ }), + +/***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/folders/folder.svg": +/*!************************************************************************************!*\ + !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/folders/folder.svg ***! + \************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMCA0SDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJoLThsLTItMnoiLz48L3N2Zz4="); + +/***/ }), + +/***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/multi-tab-code/add.svg": +/*!****************************************************************************************!*\ + !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/multi-tab-code/add.svg ***! + \****************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZwogICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgd2lkdGg9IjE0IgogICAgaGVpZ2h0PSIxNCIKICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgIHN0cm9rZT0iYmxhY2siCiAgICBzdHJva2UtbGluZWNhcD0icm91bmQiCj4KICAgIDxsaW5lIHgxPSI1IiB5MT0iMS41IiB4Mj0iNSIgeTI9IjguNSI+PC9saW5lPgogICAgPGxpbmUgeDE9IjEuNSIgeTE9IjUiIHgyPSI4LjUiIHkyPSI1Ij48L2xpbmU+Cjwvc3ZnPg=="); + +/***/ }), + +/***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/onion-skinning/decrement.svg": +/*!**********************************************************************************************!*\ + !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/onion-skinning/decrement.svg ***! + \**********************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PHBhdGggc3R5bGU9ImZpbGw6IzU3NWU3NTtzdHJva2Utd2lkdGg6LjczNDczNiIgZD0iTTMuMjUgMTEuMzU4aDE3LjUwMXYxLjI4NUgzLjI1eiIvPjwvc3ZnPg=="); + +/***/ }), + +/***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/onion-skinning/increment.svg": +/*!**********************************************************************************************!*\ + !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/onion-skinning/increment.svg ***! + \**********************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggc3R5bGU9ImZpbGw6IzU3NWU3NTtzdHJva2Utd2lkdGg6LjczNDczNiIgZD0iTTMuMjUgMTEuMzU4aDE3LjUwMXYxLjI4NUgzLjI1eiIvPjxwYXRoIHRyYW5zZm9ybT0icm90YXRlKDkwKSIgc3R5bGU9ImZpbGw6IzU3NWU3NTtzdHJva2Utd2lkdGg6LjczNDczNiIgZD0iTTMuMjUtMTIuNjQyaDE3LjUwMXYxLjI4NUgzLjI1eiIvPjwvc3ZnPg=="); + +/***/ }), + +/***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/onion-skinning/settings.svg": +/*!*********************************************************************************************!*\ + !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/onion-skinning/settings.svg ***! + \*********************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PHBhdGggc3R5bGU9Im9wYWNpdHk6Ljc1O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgZD0iTTU2IDE2djk2IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMi4zNzYgLTIuMzc2KSBzY2FsZSguMjI0NjIpIi8+PHBhdGggc3R5bGU9Im9wYWNpdHk6LjU7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS13aWR0aDo0O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiBkPSJNNDAgMzJ2NjQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjM3NiAtMi4zNzYpIHNjYWxlKC4yMjQ2MikiLz48cGF0aCBzdHlsZT0ib3BhY2l0eTouMjU7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS13aWR0aDo0O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiBkPSJNMjQgNDh2MzIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjM3NiAtMi4zNzYpIHNjYWxlKC4yMjQ2MikiLz48cGF0aCBzdHlsZT0ib3BhY2l0eTouNzU7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS13aWR0aDo0O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiBkPSJNNzIgMTZ2OTYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjM3NiAtMi4zNzYpIHNjYWxlKC4yMjQ2MikiLz48cGF0aCBzdHlsZT0ib3BhY2l0eTouNTtmaWxsOm5vbmU7c3Ryb2tlOiMwMDA7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGQ9Ik04OCAzMnY2NCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIuMzc2IC0yLjM3Nikgc2NhbGUoLjIyNDYyKSIvPjxwYXRoIHN0eWxlPSJvcGFjaXR5Oi4yNTtmaWxsOm5vbmU7c3Ryb2tlOiMwMDA7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGQ9Ik0xMDQgNDh2MzIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjM3NiAtMi4zNzYpIHNjYWxlKC4yMjQ2MikiLz48L3N2Zz4="); + +/***/ }), + +/***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/onion-skinning/toggle.svg": +/*!*******************************************************************************************!*\ + !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/onion-skinning/toggle.svg ***! + \*******************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PGcgc3Ryb2tlLXdpZHRoPSIxLjIiIHN0cm9rZT0iIzAwMTAyNiI+PGcgc3R5bGU9Im9wYWNpdHk6LjU7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWRhc2hhcnJheTpub25lIj48cGF0aCBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsO2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6NDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCIgZmlsbD0iI2JmYmZiZiIgZD0iTTY4LjQ1IDMyLjQ1N2MuMy0uMi44LS4xLjkuM2wyLjYgMTAuN3M2LjQgNC43IDguMyA4YzMuMiA1LjUgMy4zIDEwIDMuMyAxMHM3LjEgMi4xIDguMyA3LjhjMS4yIDUuNy0zLjIgMTYuNS0yMiAyMC4yLTE4LjggMy43LTMzLjktMS40LTQxLTEyLjgtNy4xLTExLjQgNC4xLTI1IDMuNS0yNC4ybC0yLjEtMTcuOWMtLjEtLjQuNC0uNy44LS41bDEyLjEgNy45czQuNS0xLjcgOS4yLTEuOWMyLjgtLjIgNS4yIDAgNy41LjR6IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNC42NTIgLTQuNjUpIHNjYWxlKC4yMzI5KSIvPjxwYXRoIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7ZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDo0O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbGluZWNhcD0icm91bmQiIGZpbGw9Im5vbmUiIGQ9Ik0xMDEuNjUgNjIuOTU3Yy00LjcgMy44LTExLjkgMy45LTExLjkgMy45bTEwLjYgNy4zYy02LjMuNS0xMC4yLTEuNC0xMC4yLTEuNG0tNjguOC0xMC4xczguNiAyLjggMTIuMSA1LjltLjMgMy41Yy00LjMgMS43LTExLjcuNi0xMS43LjYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00LjY1MiAtNC42NSkgc2NhbGUoLjIzMjkpIi8+PC9nPjxnIHN0eWxlPSJvcGFjaXR5Oi43NTtzdHJva2Utd2lkdGg6NDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmUiPjxwYXRoIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7ZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDo0O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiBmaWxsPSIjYmZiZmJmIiBkPSJNNjguNDUgMzIuNDU3Yy4zLS4yLjgtLjEuOS4zbDIuNiAxMC43czYuNCA0LjcgOC4zIDhjMy4yIDUuNSAzLjMgMTAgMy4zIDEwczcuMSAyLjEgOC4zIDcuOGMxLjIgNS43LTMuMiAxNi41LTIyIDIwLjItMTguOCAzLjctMzMuOS0xLjQtNDEtMTIuOC03LjEtMTEuNCA0LjEtMjUgMy41LTI0LjJsLTIuMS0xNy45Yy0uMS0uNC40LS43LjgtLjVsMTIuMSA3LjlzNC41LTEuNyA5LjItMS45YzIuOC0uMiA1LjIgMCA3LjUuNHoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjMyMyAtMi4zMjEpIHNjYWxlKC4yMzI5KSIvPjxwYXRoIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7ZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDo0O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbGluZWNhcD0icm91bmQiIGZpbGw9Im5vbmUiIGQ9Ik0xMDEuNjUgNjIuOTU3Yy00LjcgMy44LTExLjkgMy45LTExLjkgMy45bTEwLjYgNy4zYy02LjMuNS0xMC4yLTEuNC0xMC4yLTEuNG0tNjguOC0xMC4xczguNiAyLjggMTIuMSA1LjltLjMgMy41Yy00LjMgMS43LTExLjcuNi0xMS43LjYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjMyMyAtMi4zMjEpIHNjYWxlKC4yMzI5KSIvPjwvZz48ZyBzdHlsZT0ic3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWRhc2hhcnJheTpub25lIj48cGF0aCBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsO2ZpbGw6I2ZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6NDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCIgZmlsbD0iI2JmYmZiZiIgZD0iTTczLjQ1IDM3LjQ1N2MuMy0uMi44LS4xLjkuM2wyLjYgMTAuN3M2LjQgNC43IDguMyA4YzMuMiA1LjUgMy4zIDEwIDMuMyAxMHM3LjEgMi4xIDguMyA3LjhjMS4yIDUuNy0zLjIgMTYuNS0yMiAyMC4yLTE4LjggMy43LTMzLjktMS40LTQxLTEyLjgtNy4xLTExLjQgNC4xLTI1IDMuNS0yNC4ybC0yLjEtMTcuOWMtLjEtLjQuNC0uNy44LS41bDEyLjEgNy45czQuNS0xLjcgOS4yLTEuOWMyLjgtLjIgNS4yIDAgNy41LjR6IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMS4xNTkgLTEuMTU3KSBzY2FsZSguMjMyOSkiLz48cGF0aCBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsO2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6NDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBmaWxsPSJub25lIiBkPSJNMTA2LjY1IDY3Ljk1N2MtNC43IDMuOC0xMS45IDMuOS0xMS45IDMuOW0xMC42IDcuM2MtNi4zLjUtMTAuMi0xLjQtMTAuMi0xLjRtLTY4LjgtMTAuMXM4LjYgMi44IDEyLjEgNS45bS4zIDMuNWMtNC4zIDEuNy0xMS43LjYtMTEuNy42IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMS4xNTkgLTEuMTU3KSBzY2FsZSguMjMyOSkiLz48L2c+PC9nPjwvc3ZnPg=="); + +/***/ }), + +/***/ "./src/addons/addons/bitmap-copy/_runtime_entry.js": +/*!*********************************************************!*\ + !*** ./src/addons/addons/bitmap-copy/_runtime_entry.js ***! + \*********************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/bitmap-copy/userscript.js"); +/* generated by pull.js */ + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"] +}; + +/***/ }), + +/***/ "./src/addons/addons/bitmap-copy/userscript.js": +/*!*****************************************************!*\ + !*** ./src/addons/addons/bitmap-copy/userscript.js ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (async _ref => { + let { + addon, + console + } = _ref; + if (!addon.tab.redux.state) return console.warn("Redux is not available!"); + addon.tab.redux.initialize(); + addon.tab.redux.addEventListener("statechanged", _ref2 => { + let { + detail + } = _ref2; + if (addon.self.disabled) return; + const e = detail; + if (!e.action || e.action.type !== "scratch-paint/clipboard/SET") return; + const items = e.next.scratchPaint.clipboard.items; + if (items.length !== 1) return; + const firstItem = items[0]; + // TODO vector support + if (!Array.isArray(firstItem) || firstItem[0] !== "Raster") return console.log("copied element is vector"); + const dataURL = firstItem[1].source; + addon.tab.copyImage(dataURL).then(() => console.log("Image successfully copied")).catch(e => console.error("Image could not be copied: ".concat(e))); + }); +}); + +/***/ }), + +/***/ "./src/addons/addons/block-cherry-picking/_runtime_entry.js": +/*!******************************************************************!*\ + !*** ./src/addons/addons/block-cherry-picking/_runtime_entry.js ***! + \******************************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/block-cherry-picking/userscript.js"); +/* generated by pull.js */ + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"] +}; + +/***/ }), + +/***/ "./src/addons/addons/block-cherry-picking/userscript.js": +/*!**************************************************************!*\ + !*** ./src/addons/addons/block-cherry-picking/userscript.js ***! + \**************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _block_duplicate_module_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../block-duplicate/module.js */ "./src/addons/addons/block-duplicate/module.js"); + +/* harmony default export */ __webpack_exports__["default"] = (async function (_ref) { + let { + addon, + console + } = _ref; + const update = () => { + _block_duplicate_module_js__WEBPACK_IMPORTED_MODULE_0__["setCherryPicking"](!addon.self.disabled, addon.settings.get("invertDrag")); + }; + addon.self.addEventListener("disabled", update); + addon.self.addEventListener("reenabled", update); + addon.settings.addEventListener("change", update); + update(); + _block_duplicate_module_js__WEBPACK_IMPORTED_MODULE_0__["load"](addon); +}); + +/***/ }), + +/***/ "./src/addons/addons/block-duplicate/_runtime_entry.js": +/*!*************************************************************!*\ + !*** ./src/addons/addons/block-duplicate/_runtime_entry.js ***! + \*************************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/block-duplicate/userscript.js"); +/* generated by pull.js */ + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"] +}; + +/***/ }), + +/***/ "./src/addons/addons/block-duplicate/module.js": +/*!*****************************************************!*\ + !*** ./src/addons/addons/block-duplicate/module.js ***! + \*****************************************************/ +/*! exports provided: setCherryPicking, setDuplication, load */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setCherryPicking", function() { return setCherryPicking; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setDuplication", function() { return setDuplication; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "load", function() { return load; }); +let enableCherryPicking = false; +let invertCherryPicking = false; +function setCherryPicking(newEnabled, newInverted) { + enableCherryPicking = newEnabled; + // If cherry picking is disabled, also disable invert. Duplicating blocks can still cause + // this setting to be used. + invertCherryPicking = newEnabled && newInverted; +} +let enableDuplication = false; +function setDuplication(newEnabled) { + enableDuplication = newEnabled; +} + +// mostRecentEvent_ is sometimes a fake event, so we can't rely on reading its properties. +let ctrlOrMetaPressed = false; +let altPressed = false; +document.addEventListener("mousedown", function (e) { + ctrlOrMetaPressed = e.ctrlKey || e.metaKey; + altPressed = e.altKey; +}, { + capture: true +}); +let loaded = false; +async function load(addon) { + if (loaded) { + return; + } + loaded = true; + const ScratchBlocks = await addon.tab.traps.getBlockly(); + + // https://github.com/LLK/scratch-blocks/blob/912b8cc728bea8fd91af85078c64fcdbfe21c87a/core/gesture.js#L454 + const originalStartDraggingBlock = ScratchBlocks.Gesture.prototype.startDraggingBlock_; + ScratchBlocks.Gesture.prototype.startDraggingBlock_ = function () { + let block = this.targetBlock_; + + // Scratch uses fake mouse events to implement right click > duplicate + const isRightClickDuplicate = !(this.mostRecentEvent_ instanceof MouseEvent); + const isDuplicating = enableDuplication && altPressed && !isRightClickDuplicate && !this.flyout_ && !this.shouldDuplicateOnDrag_ && (this.targetBlock_.type !== "procedures_definition" || this.targetBlock_.type !== "procedures_definition_return"); + const isCherryPickingInverted = invertCherryPicking && !isRightClickDuplicate && block.getParent(); + const canCherryPick = enableCherryPicking || isDuplicating; + const isCherryPicking = canCherryPick && ctrlOrMetaPressed === !isCherryPickingInverted && !block.isShadow(); + if (isDuplicating || isCherryPicking) { + if (!ScratchBlocks.Events.getGroup()) { + // Scratch will disable grouping on its own later. + ScratchBlocks.Events.setGroup(true); + } + } + if (isDuplicating) { + // Based on https://github.com/LLK/scratch-blocks/blob/feda366947432b9d82a4f212f43ff6d4ab6f252f/core/scratch_blocks_utils.js#L171 + // Setting this.shouldDuplicateOnDrag_ = true does NOT work because it doesn't call changeObscuredShadowIds + this.startWorkspace_.setResizesEnabled(false); + ScratchBlocks.Events.disable(); + let newBlock; + try { + const xmlBlock = ScratchBlocks.Xml.blockToDom(block); + newBlock = ScratchBlocks.Xml.domToBlock(xmlBlock, this.startWorkspace_); + ScratchBlocks.scratchBlocksUtils.changeObscuredShadowIds(newBlock); + const xy = block.getRelativeToSurfaceXY(); + newBlock.moveBy(xy.x, xy.y); + } catch (e) { + console.error(e); + } + ScratchBlocks.Events.enable(); + if (newBlock) { + block = newBlock; + this.targetBlock_ = newBlock; + if (ScratchBlocks.Events.isEnabled()) { + ScratchBlocks.Events.fire(new ScratchBlocks.Events.BlockCreate(newBlock)); + } + } + } + if (isCherryPicking) { + if (isRightClickDuplicate || isDuplicating) { + const nextBlock = block.getNextBlock(); + if (nextBlock) { + nextBlock.dispose(); + } + } + block.unplug(true); + } + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return originalStartDraggingBlock.call(this, ...args); + }; +} + +/***/ }), + +/***/ "./src/addons/addons/block-duplicate/userscript.js": +/*!*********************************************************!*\ + !*** ./src/addons/addons/block-duplicate/userscript.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _module_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./module.js */ "./src/addons/addons/block-duplicate/module.js"); + +/* harmony default export */ __webpack_exports__["default"] = (async function (_ref) { + let { + addon, + console + } = _ref; + const update = () => { + _module_js__WEBPACK_IMPORTED_MODULE_0__["setDuplication"](!addon.self.disabled); + }; + addon.self.addEventListener("disabled", update); + addon.self.addEventListener("reenabled", update); + update(); + _module_js__WEBPACK_IMPORTED_MODULE_0__["load"](addon); +}); + +/***/ }), + +/***/ "./src/addons/addons/block-switching/_runtime_entry.js": +/*!*************************************************************!*\ + !*** ./src/addons/addons/block-switching/_runtime_entry.js ***! + \*************************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/block-switching/userscript.js"); +/* generated by pull.js */ + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"] +}; + +/***/ }), + +/***/ "./src/addons/addons/block-switching/userscript.js": +/*!*********************************************************!*\ + !*** ./src/addons/addons/block-switching/userscript.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* eslint-disable */ + +/* harmony default export */ __webpack_exports__["default"] = (async function (_ref) { + let { + addon, + console, + msg + } = _ref; + const ScratchBlocks = await addon.tab.traps.getBlockly(); + const vm = addon.tab.traps.vm; + let blockSwitches = {}; + let procedureSwitches = {}; + const noopSwitch = { + isNoop: true + }; + const randomColor = () => { + const num = Math.floor(Math.random() * 256 * 256 * 256); + return "#".concat(num.toString(16).padStart(6, "0")); + }; + const buildSwitches = () => { + blockSwitches = {}; + procedureSwitches = {}; + if (addon.settings.get("motion")) { + blockSwitches["motion_turnright"] = [noopSwitch, { + opcode: "motion_turnleft" + }]; + blockSwitches["motion_turnleft"] = [{ + opcode: "motion_turnright" + }, noopSwitch]; + blockSwitches["motion_gotoxy"] = [noopSwitch, { + opcode: "motion_changebyxy", + remapInputName: { + X: "DX", + Y: "DY" + } + }]; + blockSwitches["motion_changebyxy"] = [{ + opcode: "motion_gotoxy", + remapInputName: { + DX: "X", + DY: "Y" + } + }, noopSwitch]; + blockSwitches["motion_setx"] = [noopSwitch, { + opcode: "motion_changexby", + remapInputName: { + X: "DX" + } + }, { + opcode: "motion_sety", + remapInputName: { + X: "Y" + } + }, { + opcode: "motion_changeyby", + remapInputName: { + X: "DY" + } + }]; + blockSwitches["motion_changexby"] = [{ + opcode: "motion_setx", + remapInputName: { + DX: "X" + } + }, noopSwitch, { + opcode: "motion_sety", + remapInputName: { + DX: "Y" + } + }, { + opcode: "motion_changeyby", + remapInputName: { + DX: "DY" + } + }]; + blockSwitches["motion_sety"] = [{ + opcode: "motion_setx", + remapInputName: { + Y: "X" + } + }, { + opcode: "motion_changexby", + remapInputName: { + Y: "DX" + } + }, noopSwitch, { + opcode: "motion_changeyby", + remapInputName: { + Y: "DY" + } + }]; + blockSwitches["motion_changeyby"] = [{ + opcode: "motion_setx", + remapInputName: { + DY: "X" + } + }, { + opcode: "motion_changexby", + remapInputName: { + DY: "DX" + } + }, { + opcode: "motion_sety", + remapInputName: { + DY: "Y" + } + }, noopSwitch]; + blockSwitches["motion_xposition"] = [noopSwitch, { + opcode: "motion_yposition" + }]; + blockSwitches["motion_yposition"] = [{ + opcode: "motion_xposition" + }, noopSwitch]; + } + if (addon.settings.get("looks")) { + blockSwitches["looks_seteffectto"] = [noopSwitch, { + opcode: "looks_changeeffectby", + remapInputName: { + VALUE: "CHANGE" + } + }]; + blockSwitches["looks_changeeffectby"] = [{ + opcode: "looks_seteffectto", + remapInputName: { + CHANGE: "VALUE" + } + }, noopSwitch]; + blockSwitches["looks_setsizeto"] = [noopSwitch, { + opcode: "looks_changesizeby", + remapInputName: { + SIZE: "CHANGE" + } + }]; + blockSwitches["looks_changesizeby"] = [{ + opcode: "looks_setsizeto", + remapInputName: { + CHANGE: "SIZE" + } + }, noopSwitch]; + blockSwitches["looks_costumenumbername"] = [noopSwitch, { + opcode: "looks_backdropnumbername" + }]; + blockSwitches["looks_backdropnumbername"] = [{ + opcode: "looks_costumenumbername" + }, noopSwitch]; + blockSwitches["looks_show"] = [noopSwitch, { + opcode: "looks_hide" + }]; + blockSwitches["looks_hide"] = [{ + opcode: "looks_show" + }, noopSwitch]; + blockSwitches["looks_setShape"] = [{ + opcode: "looks_setShape" + }, noopSwitch]; + blockSwitches["looks_setColor"] = [{ + opcode: "looks_setColor" + }, noopSwitch]; + blockSwitches["looks_setFont"] = [{ + opcode: "looks_setFont" + }, noopSwitch]; + blockSwitches["looks_nextcostume"] = [noopSwitch, { + opcode: "looks_nextbackdrop" + }]; + blockSwitches["looks_nextbackdrop"] = [{ + opcode: "looks_nextcostume" + }, noopSwitch]; + blockSwitches["looks_say"] = [noopSwitch, { + opcode: "looks_sayforsecs", + createInputs: { + SECS: { + shadowType: "math_number", + value: "2" + } + } + }, { + opcode: "looks_think" + }, { + opcode: "looks_thinkforsecs", + createInputs: { + SECS: { + shadowType: "math_number", + value: "2" + } + } + }]; + blockSwitches["looks_think"] = [{ + opcode: "looks_say" + }, { + opcode: "looks_sayforsecs", + createInputs: { + SECS: { + shadowType: "math_number", + value: "2" + } + } + }, noopSwitch, { + opcode: "looks_thinkforsecs", + createInputs: { + SECS: { + shadowType: "math_number", + value: "2" + } + } + }]; + blockSwitches["looks_sayforsecs"] = [{ + opcode: "looks_say", + splitInputs: ["SECS"] + }, { + opcode: "looks_think", + splitInputs: ["SECS"] + }, noopSwitch, { + opcode: "looks_thinkforsecs" + }]; + blockSwitches["looks_thinkforsecs"] = [{ + opcode: "looks_say", + splitInputs: ["SECS"] + }, { + opcode: "looks_think", + splitInputs: ["SECS"] + }, { + opcode: "looks_sayforsecs" + }, noopSwitch]; + blockSwitches["looks_switchbackdropto"] = [noopSwitch, { + opcode: "looks_switchbackdroptoandwait" + }]; + blockSwitches["looks_switchbackdroptoandwait"] = [{ + opcode: "looks_switchbackdropto" + }, noopSwitch]; + blockSwitches["looks_gotofrontback"] = [noopSwitch, { + opcode: "looks_goforwardbackwardlayers", + remapInputName: { + FRONT_BACK: "FORWARD_BACKWARD" + }, + mapFieldValues: { + FRONT_BACK: { + front: "forward", + back: "backward" + } + }, + createInputs: { + NUM: { + shadowType: "math_integer", + value: "1" + } + } + }]; + blockSwitches["looks_goforwardbackwardlayers"] = [{ + opcode: "looks_gotofrontback", + splitInputs: ["NUM"], + remapInputName: { + FORWARD_BACKWARD: "FRONT_BACK" + }, + mapFieldValues: { + FORWARD_BACKWARD: { + forward: "front", + backward: "back" + } + } + }, noopSwitch]; + } + if (addon.settings.get("sound")) { + blockSwitches["sound_play"] = [noopSwitch, { + opcode: "sound_playuntildone" + }]; + blockSwitches["sound_playuntildone"] = [{ + opcode: "sound_play" + }, noopSwitch]; + blockSwitches["sound_seteffectto"] = [noopSwitch, { + opcode: "sound_changeeffectby" + }]; + blockSwitches["sound_changeeffectby"] = [{ + opcode: "sound_seteffectto" + }, noopSwitch]; + blockSwitches["sound_setvolumeto"] = [noopSwitch, { + opcode: "sound_changevolumeby" + }]; + blockSwitches["sound_changevolumeby"] = [{ + opcode: "sound_setvolumeto" + }, noopSwitch]; + } + if (addon.settings.get("event")) { + blockSwitches["event_broadcast"] = [noopSwitch, { + opcode: "event_broadcastandwait" + }]; + blockSwitches["event_broadcastandwait"] = [{ + opcode: "event_broadcast" + }, noopSwitch]; + } + if (addon.settings.get("control")) { + blockSwitches["control_if"] = [noopSwitch, { + opcode: "control_if_else" + }]; + blockSwitches["control_if_else"] = [{ + opcode: "control_if", + splitInputs: ["SUBSTACK2"] + }, noopSwitch]; + blockSwitches["control_repeat_until"] = [noopSwitch, { + opcode: "control_while" + }, { + opcode: "control_wait_until", + splitInputs: ["SUBSTACK"] + }, { + opcode: "control_forever", + splitInputs: ["CONDITION"] + }]; + blockSwitches["control_forever"] = [{ + opcode: "control_repeat_until" + }, { + opcode: "control_while" + }, noopSwitch]; + blockSwitches["control_wait_until"] = [{ + opcode: "control_repeat_until" + }, noopSwitch]; + blockSwitches["control_while"] = [{ + opcode: "control_repeat_until" + }, noopSwitch, { + opcode: "control_forever", + splitInputs: ["CONDITION"] + }]; + } + if (addon.settings.get("operator")) { + blockSwitches["operator_equals"] = [{ + opcode: "operator_gt" + }, { + opcode: "operator_gtorequal" + }, { + opcode: "operator_lt" + }, { + opcode: "operator_ltorequal" + }, noopSwitch, { + opcode: "operator_notequal" + }]; + blockSwitches["operator_gt"] = [noopSwitch, { + opcode: "operator_gtorequal" + }, { + opcode: "operator_lt" + }, { + opcode: "operator_ltorequal" + }, { + opcode: "operator_equals" + }, { + opcode: "operator_notequal" + }]; + blockSwitches["operator_lt"] = [{ + opcode: "operator_gt" + }, { + opcode: "operator_gtorequal" + }, noopSwitch, { + opcode: "operator_ltorequal" + }, { + opcode: "operator_equals" + }, { + opcode: "operator_notequal" + }]; + blockSwitches["operator_notequal"] = [{ + opcode: "operator_gt" + }, { + opcode: "operator_gtorequal" + }, { + opcode: "operator_lt" + }, { + opcode: "operator_ltorequal" + }, { + opcode: "operator_equals" + }, noopSwitch]; + blockSwitches["operator_gtorequal"] = [{ + opcode: "operator_gt" + }, noopSwitch, { + opcode: "operator_lt" + }, { + opcode: "operator_ltorequal" + }, { + opcode: "operator_equals" + }, { + opcode: "operator_notequal" + }]; + blockSwitches["operator_ltorequal"] = [{ + opcode: "operator_gt" + }, { + opcode: "operator_gtorequal" + }, { + opcode: "operator_lt" + }, noopSwitch, { + opcode: "operator_equals" + }, { + opcode: "operator_notequal" + }]; + blockSwitches["operator_add"] = [noopSwitch, { + opcode: "operator_subtract" + }, { + opcode: "operator_multiply" + }, { + opcode: "operator_divide" + }, { + opcode: "operator_power" + }, { + opcode: "operator_mod" + }]; + blockSwitches["operator_subtract"] = [{ + opcode: "operator_add" + }, noopSwitch, { + opcode: "operator_multiply" + }, { + opcode: "operator_divide" + }, { + opcode: "operator_power" + }, { + opcode: "operator_mod" + }]; + blockSwitches["operator_multiply"] = [{ + opcode: "operator_add" + }, { + opcode: "operator_subtract" + }, noopSwitch, { + opcode: "operator_divide" + }, { + opcode: "operator_power" + }, { + opcode: "operator_mod" + }]; + blockSwitches["operator_divide"] = [{ + opcode: "operator_add" + }, { + opcode: "operator_subtract" + }, { + opcode: "operator_multiply" + }, noopSwitch, { + opcode: "operator_power" + }, { + opcode: "operator_mod" + }]; + blockSwitches["operator_power"] = [{ + opcode: "operator_add" + }, { + opcode: "operator_subtract" + }, { + opcode: "operator_multiply" + }, { + opcode: "operator_divide" + }, noopSwitch, { + opcode: "operator_mod" + }]; + blockSwitches["operator_mod"] = [{ + opcode: "operator_add" + }, { + opcode: "operator_subtract" + }, { + opcode: "operator_multiply" + }, { + opcode: "operator_divide" + }, { + opcode: "operator_power" + }, noopSwitch]; + blockSwitches["operator_and"] = [noopSwitch, { + opcode: "operator_or" + }]; + blockSwitches["operator_or"] = [{ + opcode: "operator_and" + }, noopSwitch]; + blockSwitches["operator_trueBoolean"] = [noopSwitch, { + opcode: "operator_falseBoolean" + }]; + blockSwitches["operator_falseBoolean"] = [{ + opcode: "operator_trueBoolean" + }, noopSwitch]; + } + if (addon.settings.get("sensing")) { + blockSwitches["sensing_mousex"] = [noopSwitch, { + opcode: "sensing_mousey" + }]; + blockSwitches["sensing_mousey"] = [{ + opcode: "sensing_mousex" + }, noopSwitch]; + blockSwitches["sensing_touchingcolor"] = [noopSwitch, { + opcode: "sensing_coloristouchingcolor", + createInputs: { + COLOR2: { + shadowType: "colour_picker", + value: randomColor + } + } + }]; + blockSwitches["sensing_coloristouchingcolor"] = [{ + opcode: "sensing_touchingcolor", + splitInputs: ["COLOR2"] + }, noopSwitch]; + } + if (addon.settings.get("data")) { + blockSwitches["data_setvariableto"] = [noopSwitch, { + opcode: "data_changevariableby", + remapShadowType: { + VALUE: "math_number" + } + }]; + blockSwitches["data_changevariableby"] = [{ + opcode: "data_setvariableto", + remapShadowType: { + VALUE: "text" + } + }, noopSwitch]; + blockSwitches["data_showvariable"] = [noopSwitch, { + opcode: "data_hidevariable" + }]; + blockSwitches["data_hidevariable"] = [{ + opcode: "data_showvariable" + }, noopSwitch]; + blockSwitches["data_showlist"] = [noopSwitch, { + opcode: "data_hidelist" + }]; + blockSwitches["data_hidelist"] = [{ + opcode: "data_showlist" + }, noopSwitch]; + blockSwitches["data_replaceitemoflist"] = [noopSwitch, { + opcode: "data_insertatlist" + }]; + blockSwitches["data_insertatlist"] = [{ + opcode: "data_replaceitemoflist" + }, noopSwitch]; + blockSwitches["data_deleteoflist"] = [noopSwitch, { + opcode: "data_deletealloflist", + splitInputs: ["INDEX"] + }]; + blockSwitches["data_deletealloflist"] = [{ + opcode: "data_deleteoflist", + createInputs: { + INDEX: { + shadowType: "math_integer", + value: "1" + } + } + }, noopSwitch]; + } + if (addon.settings.get("extension")) { + blockSwitches["pen_penDown"] = [noopSwitch, { + opcode: "pen_penUp" + }]; + blockSwitches["pen_penUp"] = [{ + opcode: "pen_penDown" + }, noopSwitch]; + blockSwitches["pen_setPenColorParamTo"] = [noopSwitch, { + opcode: "pen_changePenColorParamBy" + }]; + blockSwitches["pen_changePenColorParamBy"] = [{ + opcode: "pen_setPenColorParamTo" + }, noopSwitch]; + blockSwitches["pen_setPenHueToNumber"] = [noopSwitch, { + opcode: "pen_changePenHueBy" + }]; + blockSwitches["pen_changePenHueBy"] = [{ + opcode: "pen_setPenHueToNumber" + }, noopSwitch]; + blockSwitches["pen_setPenShadeToNumber"] = [noopSwitch, { + opcode: "pen_changePenShadeBy" + }]; + blockSwitches["pen_changePenShadeBy"] = [{ + opcode: "pen_setPenShadeToNumber" + }, noopSwitch]; + blockSwitches["pen_setPenSizeTo"] = [noopSwitch, { + opcode: "pen_changePenSizeBy" + }]; + blockSwitches["pen_changePenSizeBy"] = [{ + opcode: "pen_setPenSizeTo" + }, noopSwitch]; + blockSwitches["music_setTempo"] = [noopSwitch, { + opcode: "music_changeTempo" + }]; + blockSwitches["music_changeTempo"] = [{ + opcode: "music_setTempo" + }, noopSwitch]; + if (vm.extensionManager) { + const switches = vm.extensionManager.getAddonBlockSwitches(); + Object.getOwnPropertyNames(switches).forEach(extID => { + Object.getOwnPropertyNames(switches[extID]).forEach(block => { + blockSwitches["".concat(extID, "_").concat(block)] = switches[extID][block]; + }); + }); + } + vm.runtime.on("EXTENSION_ADDED", () => { + const switches = vm.extensionManager.getAddonBlockSwitches(); + Object.getOwnPropertyNames(switches).forEach(extID => { + Object.getOwnPropertyNames(switches[extID]).forEach(block => { + blockSwitches["".concat(extID, "_").concat(block)] = switches[extID][block]; + }); + }); + }); + } + if (addon.settings.get("sa")) { + const logProc = "\u200B\u200Blog\u200B\u200B %s"; + const warnProc = "\u200B\u200Bwarn\u200B\u200B %s"; + const errorProc = "\u200B\u200Berror\u200B\u200B %s"; + const logMessage = msg("debugger_log"); + const warnMessage = msg("debugger_warn"); + const errorMessage = msg("debugger_error"); + const logSwitch = { + mutate: { + proccode: logProc + }, + msg: logMessage + }; + const warnSwitch = { + mutate: { + proccode: warnProc + }, + msg: warnMessage + }; + const errorSwitch = { + mutate: { + proccode: errorProc + }, + msg: errorMessage + }; + procedureSwitches[logProc] = [{ + msg: logMessage, + isNoop: true + }, warnSwitch, errorSwitch]; + procedureSwitches[warnProc] = [logSwitch, { + msg: warnMessage, + isNoop: true + }, errorSwitch]; + procedureSwitches[errorProc] = [logSwitch, warnSwitch, { + msg: errorMessage, + isNoop: true + }]; + } + + // Switching for these is implemented by Scratch. We only define them here to optionally add a border. + // Because we don't implement the switching ourselves, this is not controlled by the data category option. + blockSwitches["data_variable"] = []; + blockSwitches["data_listcontents"] = []; + }; + buildSwitches(); + addon.settings.addEventListener("change", buildSwitches); + + /** + * @param {*} workspace + * @param {Element} xmlBlock + */ + const pasteBlockXML = (workspace, xmlBlock) => { + // Similar to https://github.com/LLK/scratch-blocks/blob/7575c9a0f2c267676569c4b102b76d77f35d9fd6/core/workspace_svg.js#L1020 + // but without the collision checking. + const block = ScratchBlocks.Xml.domToBlock(xmlBlock, workspace); + const x = +xmlBlock.getAttribute("x"); + const y = +xmlBlock.getAttribute("y"); + // Don't need to handle RTL here + block.moveBy(x, y); + return block; + }; + + /** + * @param {string} shadowType The type of shadow eg. "math_number" + * @returns {string} The name of the shadow's inner field that contains the user-visible value + */ + const getShadowFieldName = shadowType => { + // This is non-comprehensive. + if (shadowType === "text") { + return "TEXT"; + } + if (shadowType === "colour_picker") { + return "COLOUR"; + } + return "NUM"; + }; + + /** + * @template T + * @param {T|()=>T} value + * @returns {T} + */ + const callIfFunction = value => { + if (typeof value === "function") { + return value(); + } + return value; + }; + const menuCallbackFactory = (block, opcodeData) => () => { + if (opcodeData.isNoop) { + return; + } + if (opcodeData.fieldValue) { + block.setFieldValue(opcodeData.fieldValue, "VALUE"); + return; + } + try { + ScratchBlocks.Events.setGroup(true); + const workspace = block.workspace; + const blocksToBringToForeground = []; + // Split inputs before we clone the block. + if (opcodeData.splitInputs) { + for (const inputName of opcodeData.splitInputs) { + const input = block.getInput(inputName); + if (!input) { + continue; + } + const connection = input.connection; + if (!connection) { + continue; + } + if (connection.isConnected()) { + const targetBlock = connection.targetBlock(); + if (targetBlock.isShadow()) { + // Deleting shadows is handled later. + } else { + connection.disconnect(); + blocksToBringToForeground.push(targetBlock); + } + } + } + } + + // Make a copy of the block with the proper type set. + // It doesn't seem to be possible to change a Block's type after it's created, so we'll just make a new block instead. + const xml = ScratchBlocks.Xml.blockToDom(block); + // blockToDomWithXY's handling of RTL is strange, so we encode the position ourselves. + const position = block.getRelativeToSurfaceXY(); + xml.setAttribute("x", position.x); + xml.setAttribute("y", position.y); + if (opcodeData.opcode) { + xml.setAttribute("type", opcodeData.opcode); + } + const parentBlock = block.getParent(); + let parentConnection; + let blockConnectionType; + if (parentBlock) { + // If the block has a parent, find the parent -> child connection that will be reattached later. + const parentConnections = parentBlock.getConnections_(); + parentConnection = parentConnections.find(c => c.targetConnection && c.targetConnection.sourceBlock_ === block); + // There's two types of connections from child -> parent. We need to figure out which one is used. + const blockConnections = block.getConnections_(); + const blockToParentConnection = blockConnections.find(c => c.targetConnection && c.targetConnection.sourceBlock_ === parentBlock); + blockConnectionType = blockToParentConnection.type; + } + + // Array.from creates a clone of the children list. This is important as we may remove + // children as we iterate. + for (const child of Array.from(xml.children)) { + const oldName = child.getAttribute("name"); + + // Any inputs that were supposed to be split that were not should be removed. + // (eg. shadow inputs) + if (opcodeData.splitInputs && opcodeData.splitInputs.includes(oldName)) { + xml.removeChild(child); + continue; + } + const newName = opcodeData.remapInputName && opcodeData.remapInputName[oldName]; + if (newName) { + child.setAttribute("name", newName); + } + const newShadowType = opcodeData.remapShadowType && opcodeData.remapShadowType[oldName]; + if (newShadowType) { + const valueNode = child.firstChild; + const fieldNode = valueNode.firstChild; + valueNode.setAttribute("type", newShadowType); + fieldNode.setAttribute("name", getShadowFieldName(newShadowType)); + } + const fieldValueMap = opcodeData.mapFieldValues && opcodeData.mapFieldValues[oldName]; + if (fieldValueMap && child.tagName === "FIELD") { + const oldValue = child.innerText; + const newValue = fieldValueMap[oldValue]; + if (typeof newValue === "string") { + child.innerText = newValue; + } + } + } + if (opcodeData.mutate) { + const mutation = xml.querySelector("mutation"); + for (const [key, value] of Object.entries(opcodeData.mutate)) { + mutation.setAttribute(key, value); + } + } + if (opcodeData.createInputs) { + for (const [inputName, inputData] of Object.entries(opcodeData.createInputs)) { + const valueElement = document.createElement("value"); + valueElement.setAttribute("name", inputName); + const shadowElement = document.createElement("shadow"); + shadowElement.setAttribute("type", inputData.shadowType); + const shadowFieldElement = document.createElement("field"); + shadowFieldElement.setAttribute("name", getShadowFieldName(inputData.shadowType)); + shadowFieldElement.innerText = callIfFunction(inputData.value); + shadowElement.appendChild(shadowFieldElement); + valueElement.appendChild(shadowElement); + xml.appendChild(valueElement); + } + } + + // Remove the old block and insert the new one. + block.dispose(); + const newBlock = pasteBlockXML(workspace, xml); + if (parentConnection) { + // Search for the same type of connection on the new block as on the old block. + const newBlockConnections = newBlock.getConnections_(); + const newBlockConnection = newBlockConnections.find(c => c.type === blockConnectionType); + newBlockConnection.connect(parentConnection); + } + for (const otherBlock of blocksToBringToForeground) { + // By re-appending the element, we move it to the end, which will make it display + // on top. + const svgRoot = otherBlock.getSvgRoot(); + svgRoot.parentNode.appendChild(svgRoot); + } + } finally { + ScratchBlocks.Events.setGroup(false); + } + }; + const uniques = array => [...new Set(array)]; + addon.tab.createBlockContextMenu((items, block) => { + if (!addon.self.disabled) { + const type = block.type; + let switches = blockSwitches[block.type] || []; + const customArgsMode = addon.settings.get("customargs") ? addon.settings.get("customargsmode") : "off"; + if (customArgsMode !== "off" && ["argument_reporter_boolean", "argument_reporter_string_number"].includes(type) && + // if the arg is a shadow, it's in a procedures_prototype so we don't want it to be switchable + !block.isShadow()) { + const customBlocks = getCustomBlocks(); + if (customArgsMode === "all") { + switch (type) { + case "argument_reporter_string_number": + switches = Object.values(customBlocks).map(cb => cb.stringArgs).flat(1); + break; + case "argument_reporter_boolean": + switches = Object.values(customBlocks).map(cb => cb.boolArgs).flat(1); + break; + } + } else if (customArgsMode === "defOnly") { + const root = block.getRootBlock(); + if (root.type !== "procedures_definition" || root.type !== "procedures_definition_return") return items; + const customBlockObj = customBlocks[root.getChildren(true)[0].getProcCode()]; + switch (type) { + case "argument_reporter_string_number": + switches = customBlockObj.stringArgs; + break; + case "argument_reporter_boolean": + switches = customBlockObj.boolArgs; + break; + } + } + const currentValue = block.getFieldValue("VALUE"); + switches = uniques(switches).map(i => ({ + isNoop: i === currentValue, + fieldValue: i, + msg: i + })); + } + if (block.type === "procedures_call") { + const proccode = block.getProcCode(); + if (procedureSwitches[proccode]) { + switches = procedureSwitches[proccode]; + } + } + if (!addon.settings.get("noop")) { + switches = switches.filter(i => !i.isNoop); + } + switches.forEach((opcodeData, i) => { + const makeSpaceItemIndex = items.findIndex(obj => obj._isDevtoolsFirstItem); + const insertBeforeIndex = makeSpaceItemIndex !== -1 ? + // If "make space" button exists, add own items before it + makeSpaceItemIndex : + // If there's no such button, insert at end + items.length; + const text = opcodeData.msg ? opcodeData.msg : opcodeData.opcode ? msg(opcodeData.opcode) : msg(block.type); + items.splice(insertBeforeIndex, 0, { + enabled: true, + text, + callback: menuCallbackFactory(block, opcodeData), + separator: i === 0 + }); + }); + if (block.type === "data_variable" || block.type === "data_listcontents") { + // Add top border to first variable (if it exists) + const delBlockIndex = items.findIndex(item => item.text === ScratchBlocks.Msg.DELETE_BLOCK); + // firstVariableItem might be undefined, a variable to switch to, + // or an item added by editor-devtools (or any addon before this one) + const firstVariableItem = items[delBlockIndex + 1]; + if (firstVariableItem) firstVariableItem.separator = true; + } + } + return items; + }, { + blocks: true + }); + + // https://github.com/LLK/scratch-blocks/blob/abbfe93136fef57fdfb9a077198b0bc64726f012/blocks_vertical/procedures.js#L207-L215 + // Returns a list like ["%s", "%d"] + const parseArguments = code => code.split(/(?=[^\\]%[nbs])/g).map(i => i.trim()).filter(i => i.charAt(0) === "%").map(i => i.substring(0, 2)); + const getCustomBlocks = () => { + const customBlocks = {}; + const target = vm.editingTarget; + Object.values(target.blocks._blocks).filter(block => block.opcode === "procedures_prototype").forEach(block => { + const procCode = block.mutation.proccode; + const argumentNames = JSON.parse(block.mutation.argumentnames); + // argumentdefaults is unreliable, so we have to parse the procedure code to determine argument types + const parsedArguments = parseArguments(procCode); + const stringArgs = []; + const boolArgs = []; + for (let i = 0; i < argumentNames.length; i++) { + if (parsedArguments[i] === "%b") { + boolArgs.push(argumentNames[i]); + } else { + stringArgs.push(argumentNames[i]); + } + } + customBlocks[procCode] = { + stringArgs, + boolArgs + }; + }); + return customBlocks; + }; +}); + +/***/ }), + +/***/ "./src/addons/addons/color-picker/_runtime_entry.js": +/*!**********************************************************!*\ + !*** ./src/addons/addons/color-picker/_runtime_entry.js ***! + \**********************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/color-picker/userscript.js"); +/* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./style.css */ "./node_modules/css-loader/index.js!./src/addons/addons/color-picker/style.css"); +/* harmony import */ var _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_style_css__WEBPACK_IMPORTED_MODULE_1__); +/* generated by pull.js */ + + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"], + "style.css": _css_loader_style_css__WEBPACK_IMPORTED_MODULE_1___default.a +}; + +/***/ }), + +/***/ "./src/addons/addons/color-picker/code-editor.js": +/*!*******************************************************!*\ + !*** ./src/addons/addons/color-picker/code-editor.js ***! + \*******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _libraries_common_cs_normalize_color_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../libraries/common/cs/normalize-color.js */ "./src/addons/libraries/common/cs/normalize-color.js"); +/* harmony import */ var _libraries_common_cs_rate_limiter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../libraries/common/cs/rate-limiter.js */ "./src/addons/libraries/common/cs/rate-limiter.js"); +/* harmony import */ var _libraries_thirdparty_cs_tinycolor_min_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../libraries/thirdparty/cs/tinycolor-min.js */ "./src/addons/libraries/thirdparty/cs/tinycolor-min.js"); + + + +/* harmony default export */ __webpack_exports__["default"] = (async _ref => { + let { + addon, + console, + msg + } = _ref; + // 250-ms rate limit + const rateLimiter = new _libraries_common_cs_rate_limiter_js__WEBPACK_IMPORTED_MODULE_1__["default"](250); + const getColor = element => { + const { + children + } = element.parentElement; + // h: 0 - 360 + const h = children[1].getAttribute("aria-valuenow"); + // s: 0 - 1 + const s = children[3].getAttribute("aria-valuenow"); + // v: 0 - 255, divide by 255 + const vMultipliedBy255 = children[5].getAttribute("aria-valuenow"); + const v = Number(vMultipliedBy255) / 255; + return Object(_libraries_thirdparty_cs_tinycolor_min_js__WEBPACK_IMPORTED_MODULE_2__["default"])("hsv(".concat(h, ", ").concat(s, ", ").concat(v || 0, ")")).toHexString(); + }; + const setColor = (hex, element) => { + hex = Object(_libraries_common_cs_normalize_color_js__WEBPACK_IMPORTED_MODULE_0__["normalizeHex"])(hex); + if (!addon.tab.redux.state || !addon.tab.redux.state.scratchGui) return; + // The only way to reliably set color is to invoke eye dropper via click() + // then faking that the eye dropper reported the value. + const onEyeDropperClosed = _ref2 => { + let { + detail + } = _ref2; + if (detail.action.type !== "scratch-gui/color-picker/DEACTIVATE_COLOR_PICKER") return; + addon.tab.redux.removeEventListener("statechanged", onEyeDropperClosed); + setTimeout(() => { + document.body.classList.remove("sa-hide-eye-dropper-background"); + }, 50); + }; + const onEyeDropperOpened = _ref3 => { + let { + detail + } = _ref3; + if (detail.action.type !== "scratch-gui/color-picker/ACTIVATE_COLOR_PICKER") return; + addon.tab.redux.removeEventListener("statechanged", onEyeDropperOpened); + addon.tab.redux.addEventListener("statechanged", onEyeDropperClosed); + setTimeout(() => { + addon.tab.redux.dispatch({ + type: "scratch-gui/color-picker/DEACTIVATE_COLOR_PICKER", + color: hex + }); + }, 50); + }; + addon.tab.redux.addEventListener("statechanged", onEyeDropperOpened); + document.body.classList.add("sa-hide-eye-dropper-background"); + element.click(); + }; + const addColorPicker = () => { + const element = document.querySelector("button.scratchEyedropper"); + rateLimiter.abort(false); + addon.tab.redux.initialize(); + const defaultColor = getColor(element); + const saColorPicker = Object.assign(document.createElement("div"), { + className: "sa-color-picker sa-color-picker-code" + }); + addon.tab.displayNoneWhileDisabled(saColorPicker, { + display: "flex" + }); + const saColorPickerColor = Object.assign(document.createElement("input"), { + className: "sa-color-picker-color sa-color-picker-code-color", + type: "color", + value: defaultColor || "#000000" + }); + const saColorPickerText = Object.assign(document.createElement("input"), { + className: addon.tab.scratchClass("input_input-form", { + others: "sa-color-picker-text sa-color-picker-code-text" + }), + type: "text", + pattern: "^#?([0-9a-fA-F]{3}){1,2}$", + placeholder: msg("hex"), + value: defaultColor || "" + }); + saColorPickerColor.addEventListener("input", () => rateLimiter.limit(() => setColor(saColorPickerText.value = saColorPickerColor.value, element))); + saColorPickerText.addEventListener("change", () => { + const { + value + } = saColorPickerText; + if (!Object(_libraries_common_cs_normalize_color_js__WEBPACK_IMPORTED_MODULE_0__["getHexRegex"])().test(value)) return; + setColor(saColorPickerColor.value = Object(_libraries_common_cs_normalize_color_js__WEBPACK_IMPORTED_MODULE_0__["normalizeHex"])(value), element); + }); + saColorPicker.appendChild(saColorPickerColor); + saColorPicker.appendChild(saColorPickerText); + element.parentElement.insertBefore(saColorPicker, element); + }; + const ScratchBlocks = await addon.tab.traps.getBlockly(); + const originalShowEditor = ScratchBlocks.FieldColourSlider.prototype.showEditor_; + ScratchBlocks.FieldColourSlider.prototype.showEditor_ = function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + const r = originalShowEditor.call(this, ...args); + addColorPicker(); + return r; + }; +}); + +/***/ }), + +/***/ "./src/addons/addons/color-picker/userscript.js": +/*!******************************************************!*\ + !*** ./src/addons/addons/color-picker/userscript.js ***! + \******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _code_editor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./code-editor.js */ "./src/addons/addons/color-picker/code-editor.js"); + +/* harmony default export */ __webpack_exports__["default"] = (async api => { + Object(_code_editor_js__WEBPACK_IMPORTED_MODULE_0__["default"])(api); +}); + +/***/ }), + +/***/ "./src/addons/addons/editor-animations/_runtime_entry.js": +/*!***************************************************************!*\ + !*** ./src/addons/addons/editor-animations/_runtime_entry.js ***! + \***************************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/editor-animations/userscript.js"); +/* generated by pull.js */ + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"] +}; + +/***/ }), + +/***/ "./src/addons/addons/editor-animations/userscript.js": +/*!***********************************************************!*\ + !*** ./src/addons/addons/editor-animations/userscript.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +// Editor Animations (remake of Reactive Animation by ) +// By: SharkPool +// By: reflow + +/* TODO +- patch custom modal api when added +- patch adding modals from addons (they dont use react) +*/ + +/* harmony default export */ __webpack_exports__["default"] = (async function (_ref) { + let { + addon + } = _ref; + const mediaQuery = window.matchMedia("(prefers-reduced-motion: reduce)"); + const addonKey = "addonAnimations-"; + const animationTypes = { + "default": "cubic-bezier(0.63, 0.32, 0.08, 0.95)", + "easeIn": "cubic-bezier(0.42, 0, 1.0, 1.0)", + "easeOut": "cubic-bezier(0, 0, 0.58, 1.0)", + "easeInOut": "cubic-bezier(0.42, 0, 0.58, 1.0)", + "smoothStep": "cubic-bezier(0.25, 0.1, 0.25, 1.0)", + "fastInSlowOut": "cubic-bezier(0.4, 0.0, 0.2, 1.0)", + "sineIn": "cubic-bezier(0.47, 0, 0.745, 0.715)", + "sineOut": "cubic-bezier(0.39, 0.575, 0.565, 1)", + "sineInOut": "cubic-bezier(0.445, 0.05, 0.55, 0.95)", + "quadIn": "cubic-bezier(0.55, 0.085, 0.68, 0.53)", + "quadOut": "cubic-bezier(0.25, 0.46, 0.45, 0.94)", + "quadInOut": "cubic-bezier(0.455, 0.03, 0.515, 0.955)", + "cubicIn": "cubic-bezier(0.55, 0.055, 0.675, 0.19)", + "cubicOut": "cubic-bezier(0.215, 0.61, 0.355, 1)", + "cubicInOut": "cubic-bezier(0.645, 0.045, 0.355, 1)", + "quartIn": "cubic-bezier(0.895, 0.03, 0.685, 0.22)", + "quartOut": "cubic-bezier(0.165, 0.84, 0.44, 1)", + "quartInOut": "cubic-bezier(0.77, 0, 0.175, 1)", + "quintIn": "cubic-bezier(0.755, 0.05, 0.855, 0.06)", + "quintOut": "cubic-bezier(0.23, 1, 0.32, 1)", + "quintInOut": "cubic-bezier(0.86, 0, 0.07, 1)", + "backIn": "cubic-bezier(0.6, -0.28, 0.74, 0.05)", + "backOut": "cubic-bezier(0.18, 0.89, 0.32, 1.28)", + "backInOut": "cubic-bezier(0.68, -0.55, 0.27, 1.55)", + "elastic": "linear(0 0%, 0.22 2.1%, 0.86 6.5%, 1.11 8.6%, 1.3 10.7%, 1.35 11.8%, 1.37 12.9%, 1.37 13.7%, 1.36 14.5%, 1.32 16.2%, 1.03 21.8%, 0.94 24%, 0.89 25.9%, 0.88 26.85%, 0.87 27.8%, 0.87 29.25%, 0.88 30.7%, 0.91 32.4%, 0.98 36.4%, 1.01 38.3%, 1.04 40.5%, 1.05 42.7%, 1.05 44.1%, 1.04 45.7%, 1 53.3%, 0.99 55.4%, 0.98 57.5%, 0.99 60.7%, 1 68.1%, 1.01 72.2%, 1 86.7%, 1 100%)", + "bounce": "linear(0 0%, 0 2.27%, 0.02 4.53%, 0.04 6.8%, 0.06 9.07%, 0.1 11.33%, 0.14 13.6%, 0.25 18.15%, 0.39 22.7%, 0.56 27.25%, 0.77 31.8%, 1 36.35%, 0.89 40.9%, 0.85 43.18%, 0.81 45.45%, 0.79 47.72%, 0.77 50%, 0.75 52.27%, 0.75 54.55%, 0.75 56.82%, 0.77 59.1%, 0.79 61.38%, 0.81 63.65%, 0.85 65.93%, 0.89 68.2%, 1 72.7%, 0.97 74.98%, 0.95 77.25%, 0.94 79.53%, 0.94 81.8%, 0.94 84.08%, 0.95 86.35%, 0.97 88.63%, 1 90.9%, 0.99 93.18%, 0.98 95.45%, 0.99 97.73%, 1 100%)", + "emphasis": "linear(0 0%, 0 1.8%, 0.01 3.6%, 0.03 6.35%, 0.07 9.1%, 0.13 11.4%, 0.19 13.4%, 0.27 15%, 0.34 16.1%, 0.54 18.35%, 0.66 20.6%, 0.72 22.4%, 0.77 24.6%, 0.81 27.3%, 0.85 30.4%, 0.88 35.1%, 0.92 40.6%, 0.94 47.2%, 0.96 55%, 0.98 64%, 0.99 74.4%, 1 86.4%, 1 100%)" + }; + const hasNoVariation = ["default", "fastInSlowOut", "smoothStep", "elastic", "bounce", "emphasis"]; + let needsInit = true, + animateModals = true, + animateLibraries = true, + animateButtons = true, + animationSpeed = 1, + animationType = "default", + animationDir = "InOut"; + let patchedBody = false, + sbPatched = false, + sbEverPatched = false, + listenerAttached = false; + const genStyles = () => "\n/* Top Bar Items */\n.".concat(addonKey, "top-bar-scaler {\n transition: transform ").concat(getAnim(.1), ";\n transform-origin: center center;\n transform-box: fill-box;\n}\n.").concat(addonKey, "top-bar-scaler:hover:not([addon-scale-stop=\"true\"]) {\n transform: scale(1.05);\n}\n.").concat(addonKey, "top-bar-scaler:active:not([addon-scale-stop=\"true\"]) {\n transform: scale(.95);\n}\n\n/*\n Assets, Blockly Button Texts\n Costume/Extension/Sprite/Sound Library UI\n*/\n.").concat(addonKey, "static-scaler {\n transition: transform ").concat(getAnim(.1), ";\n transform-origin: center center;\n transform-box: fill-box;\n}\n.").concat(addonKey, "static-scaler:hover:not([addon-scale-stop=\"true\"]) {\n transform: scale(1.05);\n}\n.").concat(addonKey, "static-scaler:active:not([addon-scale-stop=\"true\"]) {\n transform: scale(.95);\n}\n\n/*\n Sound & Costume Editor Buttons,\n Project Controls, Blockly Zoom\n*/\n.").concat(addonKey, "static-scaler-big {\n transition: transform ").concat(getAnim(.2), " !important;\n transform-origin: center center;\n transform-box: fill-box;\n}\n.").concat(addonKey, "static-scaler-big:hover {\n transform: scale(1.1);\n}\n.").concat(addonKey, "static-scaler-big:active {\n transform: scale(.9);\n}\n\n/* Custom Extension Button (Library) */\n.").concat(addonKey, "custom-ext-hover {\n transition: transform ").concat(getAnim(.2), ", border ").concat(getAnim(.5), ";\n justify-content: center;\n border: none;\n}\n.").concat(addonKey, "custom-ext-hover:hover {\n border: solid 3px #00000050;\n}\n.").concat(addonKey, "custom-ext-hover:active {\n transform: scale(.95);\n border: none;\n}\n\n/* Library Items */\n.").concat(addonKey, "library-item-scaler div[class^=\"library-item_library-item\"] {\n transition: transform ").concat(getAnim(.1), ";\n transform-origin: center center;\n transform-box: fill-box;\n}\n.").concat(addonKey, "library-item-scaler div[class^=\"library-item_library-item\"]:hover {\n transform: scale(1.05);\n}\n.").concat(addonKey, "library-item-scaler div[class^=\"library-item_library-item\"]:active {\n transform: scale(.95);\n}\n\n/* Categories */\n.").concat(addonKey, "category-scaler div div[class=\"scratchCategoryMenuRow\"] {\n transition: transform ").concat(getAnim(.1), ";\n transform-origin: center center;\n transform-box: fill-box;\n}\n.").concat(addonKey, "category-scaler div div[class=\"scratchCategoryMenuRow\"]:hover {\n transform: scale(1.05);\n}\n.").concat(addonKey, "category-scaler div div[class=\"scratchCategoryMenuRow\"]:active {\n transform: scale(.95);\n}\n"); + const styleElement = document.createElement("style"); + styleElement.classList.add("addon-editorAnimations"); + styleElement.textContent = genStyles(); + document.head.appendChild(styleElement); + let animationEnabled = !mediaQuery.matches; + mediaQuery.addEventListener("change", e => { + animationEnabled = !e.matches; + }); + function requestAddonState() { + animateModals = addon.settings.get("animateModals"); + animateLibraries = addon.settings.get("animateLibraries"); + animateButtons = addon.settings.get("animateButtons"); + animationType = addon.settings.get("animationType"); + animationDir = addon.settings.get("animationDir"); + const oldSpeed = animationSpeed; + animationSpeed = 1 / (Number(addon.settings.get("animateSpeed")) / 100); + if (oldSpeed !== animationSpeed) styleElement.textContent = genStyles(); + } + function getEasing() { + if (hasNoVariation.includes(animationType)) { + return animationTypes[animationType]; + } else { + return animationTypes[animationType + animationDir]; + } + } + function getAnim(time) { + time *= animationSpeed; + return "".concat(time, "s ").concat(getEasing()); + } + ; + function observeMenuScalers(element, observerSub, observerAtt) { + if (!animateModals) return; + if (element.hasAttribute("addon-scale-listeners-bound")) return; + const onMouseOver = () => element.setAttribute("addon-scale-stop", true); + const onMouseOut = () => element.setAttribute("addon-scale-stop", false); + element.addEventListener("mouseover", onMouseOver); + element.addEventListener("mouseout", onMouseOut); + element.setAttribute("addon-scale-listeners-bound", "true"); + element.setAttribute("addon-scale-stop", true); + const observer = new MutationObserver(() => { + var _element$querySelecto, _element$querySelecto2; + if (!element.classList.contains("menu-bar_active") && ((_element$querySelecto = element.querySelector("nav")) === null || _element$querySelecto === void 0 ? void 0 : (_element$querySelecto2 = _element$querySelecto.style) === null || _element$querySelecto2 === void 0 ? void 0 : _element$querySelecto2.opacity) !== "1") { + element.removeEventListener("mouseover", onMouseOver); + element.removeEventListener("mouseout", onMouseOut); + element.removeAttribute("addon-scale-listeners-bound"); + element.setAttribute("addon-scale-stop", false); + observer.disconnect(); + } + }); + observer.observe(element, { + subtree: observerSub, + attributes: true, + attributeFilter: observerAtt + }); + } + function handleOpenAnimation(elementName) { + var _document$querySelect; + const type = elementName.endsWith("Library") ? "library" : elementName.endsWith("Menu") ? "menu" : "modal"; + if (!animateLibraries && type === "library") return; + if (!animateModals && type !== "library") return; + let element; + let animTime = 200; + if (type === "menu") { + if (elementName === "ctxMenu") element = document.querySelector("div[class*=\"blocklyContextMenu\"]");else if (elementName === "guiCtxMenu") element = document.querySelector("nav[class*=\"context-menu_context-menu\"][class*=\"react-contextmenu--visible\"]");else { + element = Array.from(document.querySelectorAll("div[class*=\"menu-bar_menu-bar-menu_\"] ul[class*=\"menu_menu_\"]")); + if (!element.length) return; + element = element.find(e => !e.hasAttribute("style")); + } + if (!element) return; + if (type === "menu") { + const menuItem = element.parentNode.parentNode; + setTimeout(() => observeMenuScalers(menuItem, false, ["class"]), 10); + } + const ogHeight = element.getBoundingClientRect().height; + element.style.overflow = "hidden"; + element.style.transition = "transform ".concat(getAnim(.2)); + element.style.transformOrigin = "left top"; + if (elementName === "guiCtxMenu") animTime = 500;else element.style.transform = "translateY(-2px) scale(.999)"; + const animation = element.animate([{ + height: "0px", + opacity: 0 + }, { + height: "".concat(ogHeight, "px"), + opacity: 1 + }], { + duration: animTime * animationSpeed, + easing: getEasing() + }); + animation.onfinish = () => { + element.style.overflow = "hidden"; + }; + return; + } + element = (_document$querySelect = document.querySelector("div[class=\"ReactModalPortal\"] div[class*=\"ReactModal__Overlay\"]")) === null || _document$querySelect === void 0 ? void 0 : _document$querySelect.firstChild; + if (!element) return; + if (type === "library") { + animTime = 500; + if (elementName === "extensionLibrary" || elementName === "costumeLibrary") element.style.transformOrigin = "left bottom";else element.style.transformOrigin = "center bottom"; + } + element.animate([{ + transform: "scale(0)", + opacity: 0 + }, { + transform: "scale(1)", + opacity: 1 + }], { + duration: animTime * animationSpeed, + easing: getEasing() + }); + } + function attachCloseHijack(elementName) { + const type = elementName.endsWith("Library") ? "library" : elementName.endsWith("Menu") ? "menu" : "modal"; + if (type === "menu" || patchedBody) return; + if (!animateLibraries && type === "library") return; + if (!animateModals && type !== "library") return; + + // Monkey Patch + const ogRemoveChild = document.body.constructor.prototype.removeChild; + document.body.constructor.prototype.removeChild = function (child) { + const element = document.querySelector("div[class=\"ReactModalPortal\"]"); + if (!element) return ogRemoveChild.call(this, child); + let animTime = 200; + patchedBody = true; + if (child === element) { + const child = element.firstChild; + if (child) { + const animClone = child.cloneNode(true); + animClone.style.position = "fixed"; + animClone.style.top = child.getBoundingClientRect().top + "px"; + animClone.style.left = child.getBoundingClientRect().left + "px"; + animClone.style.zIndex = "99999"; + animClone.style.pointerEvents = "none"; + if (type === "library") { + animTime = 500; + if (elementName === "extensionLibrary" || elementName === "costumeLibrary") animClone.style.transformOrigin = "left bottom";else animClone.style.transformOrigin = "center bottom"; + } + document.body.appendChild(animClone); + animClone.animate([{ + opacity: 1 + }, { + opacity: 0 + }], { + duration: animTime * animationSpeed, + easing: getEasing() + }); + const animation = animClone.firstChild.animate([{ + transform: "scale(1)", + opacity: 1 + }, { + transform: "scale(0)", + opacity: 0 + }], { + duration: animTime * animationSpeed, + easing: getEasing() + }); + animation.onfinish = () => { + animClone.remove(); + ogRemoveChild.call(element.parentNode, element); + }; + document.body.constructor.prototype.removeChild = ogRemoveChild; + patchedBody = false; + return child; + } + } + return ogRemoveChild.call(this, child); + }; + } + function compileClasses(optLibrary) { + if (!animateButtons) return; + const classMapper = new Map(); + if (optLibrary) { + const collapser = document.querySelector("button[class^=\"library_library-filter-collapse\"]"); + const filterDiv = document.querySelector("div[class^=\"library_library-filter-bar\"]"); + collapser.style.transform = "rotateY(180deg)"; + collapser.addEventListener("click", e => { + e.preventDefault(); + const isClosed = collapser.hasAttribute("closed"); + if (isClosed) { + collapser.style.transform = "rotateY(180deg)"; + collapser.removeAttribute("closed"); + filterDiv.style.display = ""; + filterDiv.animate([{ + width: "0px", + opacity: 0 + }, { + width: "342px", + opacity: 1 + }], { + duration: 300, + easing: getEasing() + }); + } else { + collapser.style.transform = "rotateY(0deg)"; + const animation = filterDiv.animate([{ + width: "342px", + opacity: 1 + }, { + width: "0px", + opacity: 0 + }], { + duration: 300, + easing: getEasing() + }); + animation.onfinish = () => { + collapser.setAttribute("closed", "true"); + filterDiv.style.display = "none"; + }; + } + e.stopPropagation(); + }); + if (optLibrary === "extensionLibrary") { + classMapper.set("custom-ext-hover", [document.querySelector("span[class*=\"button_outlined-button\"][class*=\"tag-button_tag-button\"]")]); + } + classMapper.set("library-item-scaler", [document.querySelector("div[class*=\"library_library-scroll-grid\"]")]); + classMapper.set("static-scaler", [document.querySelector("span[class*=\"modal_back-button_\"]"), collapser]); + } else { + classMapper.set("top-bar-scaler", document.querySelectorAll("div[class*=\"menu-bar_main-menu\"] div[class*=\"menu-bar_menu-bar-item\"][class*=\"hoverable\"]")); + classMapper.set("category-scaler", [document.querySelector("div[class=\"blocklyToolboxDiv\"]")]); + classMapper.set("static-scaler", [/* Blockly Button Texts */ + ...document.querySelectorAll("g[class=\"blocklyFlyoutButton\"] text[class=\"blocklyText\"]"), /* Costume & Sound Assets */ + ...document.querySelectorAll("div[class*=\"selector_list-item\"][class*=\"sprite-selector-item\"]"), /* Sprite Selector */ + ...document.querySelectorAll("div[class*=\"sprite-selector_sprite\"][class*=\"sprite-selector-item\"]"), /* Backpack Selector */ + ...document.querySelectorAll("div[class*=\"backpack_backpack-item\"][class*=\"sprite-selector-item\"]")]); + classMapper.set("static-scaler-big", [/* Sound & Costume Editor Buttons */ + ...document.querySelectorAll("div[class*=\"sound-editor_effect-button\"]"), ...document.querySelectorAll("div[class*=\"sound-editor_tool-button\"]"), ...document.querySelectorAll("button[class*=\"sound-editor_round-button\"]"), ...document.querySelectorAll("span[class*=\"tool-select-base_mod-tool-select\"]"), /* Project Controls */ + ...document.querySelectorAll("div[class^=\"controls_controls-container\"] img"), /* Blockly Zoom */ + ...document.querySelectorAll("g[class=\"blocklyZoom\"] image")]); + } + classMapper.forEach((elements, classN) => { + for (const element of elements) { + if (!element) continue; + element.classList.add(addonKey + classN); + } + }); + needsInit = false; + } + function tryPatchScratchBlocks() { + if (typeof ScratchBlocks !== "object") return; + sbPatched = true; + + // some modals are from ScratchBlocks, patch them! + queueMicrotask(() => { + const ogSBPrompt = ScratchBlocks.prompt; + ScratchBlocks.prompt = function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + ogSBPrompt.call(this, ...args); + handleOpenAnimation("modal"); + attachCloseHijack("modal"); + }; + if (sbEverPatched) return; + sbEverPatched = true; + const ogSBProcCreate = ScratchBlocks.Procedures.createProcedureDefCallback_; + ScratchBlocks.Procedures.createProcedureDefCallback_ = function () { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + ogSBProcCreate.call(this, ...args); + handleOpenAnimation("modal"); + attachCloseHijack("modal"); + }; + const ogSBProcEdit = ScratchBlocks.Procedures.editProcedureCallback_; + ScratchBlocks.Procedures.editProcedureCallback_ = function () { + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + ogSBProcEdit.call(this, ...args); + handleOpenAnimation("modal"); + attachCloseHijack("modal"); + }; + const ogContextMenuShow = ScratchBlocks.ContextMenu.show; + ScratchBlocks.ContextMenu.show = function () { + for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + args[_key4] = arguments[_key4]; + } + ogContextMenuShow.call(this, ...args); + handleOpenAnimation("ctxMenu"); + }; + + /* this isnt a modal, but we still want to patch it for animations */ + const ogInitButton = ScratchBlocks.FlyoutButton.prototype.show; + ScratchBlocks.FlyoutButton.prototype.show = function () { + for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { + args[_key5] = arguments[_key5]; + } + ogInitButton.call(this, ...args); + queueMicrotask(() => compileClasses()); + }; + }); + } + function attachListeners() { + const spriteRow = document.querySelector("div[class^=\"sprite-selector_items-wrapper\"]"); + if (!spriteRow) return; + document.addEventListener("contextmenu", event => { + let element = event.target.closest("div[class*=\"sprite-selector_sprite-wrapper\"]"); + if (element) element = element.firstChild;else element = event.target.closest("div[class^=\"react-contextmenu-wrapper\"][class*=\"sprite-selector-item_sprite-selector\"]"); + if (element) { + setTimeout(() => { + element.querySelector("nav").style.opacity = 1; + handleOpenAnimation("guiCtxMenu"); + observeMenuScalers(element, true, ["class", "style"]); + }, 10); + } + }); + listenerAttached = true; + } + function startListenerWorker() { + const checkInEditor = () => !ReduxStore.getState().scratchGui.mode.isPlayerOnly; + window.vm.on("workspaceUpdate", () => { + queueMicrotask(() => compileClasses()); + }); + let lastModalStateID, inEditor; + ReduxStore.subscribe(() => { + const reduxState = ReduxStore.getState().scratchGui; + let entries = Object.entries(reduxState.modals); + entries.push(...Object.entries(reduxState.menus)); + const genID = [...entries, ["tab", reduxState.editorTab.activeTabIndex]]; + const modalStateID = genID.map(entry => entry[1]).join("."); + const currentlyInEditor = checkInEditor(); + if (inEditor !== currentlyInEditor) { + inEditor = currentlyInEditor; + if (inEditor) { + sbPatched = false; + listenerAttached = false; + } + } + if (!sbPatched) tryPatchScratchBlocks(); + if (!listenerAttached) attachListeners(); + if (!needsInit && lastModalStateID === modalStateID) return; + lastModalStateID = modalStateID; + queueMicrotask(() => { + compileClasses(); + for (const entry of entries) { + if (entry[1] === true) { + const name = entry[0]; + handleOpenAnimation(name); + attachCloseHijack(name); + compileClasses(name.endsWith("Library") ? name : undefined); + break; + } + } + }); + }); + } + if (typeof scaffolding === "undefined") startListenerWorker(); + addon.settings.addEventListener("change", requestAddonState); + addon.self.addEventListener("disabled", () => { + animateModals = false; + animateLibraries = false; + animateButtons = false; + }); + addon.self.addEventListener("reenabled", () => { + animateModals = true; + animateLibraries = true; + animateButtons = true; + }); +}); + +/***/ }), + +/***/ "./src/addons/addons/editor-block-chomping/_runtime_entry.js": +/*!*******************************************************************!*\ + !*** ./src/addons/addons/editor-block-chomping/_runtime_entry.js ***! + \*******************************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/editor-block-chomping/userscript.js"); +/* generated by pull.js */ + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"] +}; + +/***/ }), + +/***/ "./src/addons/addons/editor-block-chomping/userscript.js": +/*!***************************************************************!*\ + !*** ./src/addons/addons/editor-block-chomping/userscript.js ***! + \***************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (async function (_ref) { + let { + addon + } = _ref; + const ScratchBlocks = await addon.tab.traps.getBlockly(); + + // Rerender the dragged block when updating the insertion marker + const ogConnectMarker = ScratchBlocks.InsertionMarkerManager.prototype.connectMarker_; + ScratchBlocks.InsertionMarkerManager.prototype.connectMarker_ = function () { + ogConnectMarker.call(this); + if (!addon.self.disabled && this.firstMarker_) { + var _this$workspace_, _this$workspace_$curr, _this$workspace_$curr2; + const block = this === null || this === void 0 ? void 0 : (_this$workspace_ = this.workspace_) === null || _this$workspace_ === void 0 ? void 0 : (_this$workspace_$curr = _this$workspace_.currentGesture_) === null || _this$workspace_$curr === void 0 ? void 0 : (_this$workspace_$curr2 = _this$workspace_$curr.blockDragger_) === null || _this$workspace_$curr2 === void 0 ? void 0 : _this$workspace_$curr2.draggingBlock_; + block.noMoveConnection = true; + if (block) block.render(false); + } + }; + const ogDisconnectMarker = ScratchBlocks.InsertionMarkerManager.prototype.disconnectMarker_; + ScratchBlocks.InsertionMarkerManager.prototype.disconnectMarker_ = function () { + ogDisconnectMarker.call(this); + if (!addon.self.disabled && this.firstMarker_) { + var _this$workspace_2, _this$workspace_2$cur, _this$workspace_2$cur2; + const block = this === null || this === void 0 ? void 0 : (_this$workspace_2 = this.workspace_) === null || _this$workspace_2 === void 0 ? void 0 : (_this$workspace_2$cur = _this$workspace_2.currentGesture_) === null || _this$workspace_2$cur === void 0 ? void 0 : (_this$workspace_2$cur2 = _this$workspace_2$cur.blockDragger_) === null || _this$workspace_2$cur2 === void 0 ? void 0 : _this$workspace_2$cur2.draggingBlock_; + block.noMoveConnection = true; + if (block) block.render(false); + } + }; + const ogDraw = ScratchBlocks.BlockSvg.prototype.renderDraw_; + const ogMoveConnections = ScratchBlocks.BlockSvg.prototype.renderMoveConnections_; + ScratchBlocks.BlockSvg.prototype.renderDraw_ = function (iconWidth, inputRows) { + var _this$workspace, _this$workspace$curre, _this$workspace$curre2; + if (addon.self.disabled) return ogDraw.call(this, iconWidth, inputRows); + + // If the block contains a statement (C) input and has an insertion marker, + // use that to calculate the height of the statement inputs + let computeBlock = this; + if (this !== null && this !== void 0 && (_this$workspace = this.workspace) !== null && _this$workspace !== void 0 && (_this$workspace$curre = _this$workspace.currentGesture_) !== null && _this$workspace$curre !== void 0 && (_this$workspace$curre2 = _this$workspace$curre.blockDragger_) !== null && _this$workspace$curre2 !== void 0 && _this$workspace$curre2.draggedConnectionManager_) { + const dragger = this.workspace.currentGesture_.blockDragger_; + const manager = dragger.draggedConnectionManager_; + if (manager.markerConnection_ && manager.firstMarker_ && dragger.draggingBlock_ == this && dragger.draggingBlock_.type == manager.firstMarker_.type) { + if (inputRows.some(row => row.some(input => input.type === ScratchBlocks.NEXT_STATEMENT))) { + computeBlock = manager.firstMarker_; + } + } + } + + // Change the height of substacks + // (If we set inputRows to computeBlock.renderCompute_, + // the references to the inputs would be wrong + // so they just won't update properly) + if (computeBlock !== this) { + const _inputRows = computeBlock.renderCompute_(iconWidth); + for (let i = 0; i < inputRows.length; i++) { + const row = inputRows[i]; + let update = false; + for (const input of row) { + if (input.type === ScratchBlocks.NEXT_STATEMENT) update = true; + } + if (update) row.height = Math.max(row.height, _inputRows[i].height); + } + } + ogDraw.call(this, iconWidth, inputRows); + + // Moving the connections of a block while it's being dragged breaks it, + // so don't + if (computeBlock === this && !this.noMoveConnection) ogMoveConnections.call(this); + this.noMoveConnection = false; + }; + ScratchBlocks.BlockSvg.prototype.renderMoveConnections_ = function () { + if (addon.self.disabled) return ogMoveConnections.call(this); + // Do nothing (this function is instead called by renderDraw_) + }; +}); + +/***/ }), + +/***/ "./src/addons/addons/editor-comment-previews/_runtime_entry.js": +/*!*********************************************************************!*\ + !*** ./src/addons/addons/editor-comment-previews/_runtime_entry.js ***! + \*********************************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/editor-comment-previews/userscript.js"); +/* harmony import */ var _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./userstyle.css */ "./node_modules/css-loader/index.js!./src/addons/addons/editor-comment-previews/userstyle.css"); +/* harmony import */ var _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1__); +/* generated by pull.js */ + + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"], + "userstyle.css": _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1___default.a +}; + +/***/ }), + +/***/ "./src/addons/addons/editor-comment-previews/userscript.js": +/*!*****************************************************************!*\ + !*** ./src/addons/addons/editor-comment-previews/userscript.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (async function (_ref) { + let { + addon, + console + } = _ref; + const vm = addon.tab.traps.vm; + const updateStyles = () => { + previewInner.classList.toggle("sa-comment-preview-delay", addon.settings.get("delay") !== "none"); + previewInner.classList.toggle("sa-comment-preview-reduce-transparency", addon.settings.get("reduce-transparency")); + previewInner.classList.toggle("sa-comment-preview-fade", !addon.settings.get("reduce-animation")); + }; + const afterDelay = cb => { + if (!previewInner.classList.contains("sa-comment-preview-hidden")) { + // If not hidden, updating immediately is preferred + cb(); + return; + } + const delay = addon.settings.get("delay"); + if (delay === "long") return setTimeout(cb, 500); + if (delay === "short") return setTimeout(cb, 300); + cb(); + }; + let hoveredElement = null; + let showTimeout = null; + let mouseX = 0; + let mouseY = 0; + let doNotShowUntilMoveMouse = false; + const previewOuter = document.createElement("div"); + previewOuter.classList.add("sa-comment-preview-outer"); + const previewInner = document.createElement("div"); + previewInner.classList.add("sa-comment-preview-inner"); + previewInner.classList.add("sa-comment-preview-hidden"); + updateStyles(); + addon.settings.addEventListener("change", updateStyles); + previewOuter.appendChild(previewInner); + document.body.appendChild(previewOuter); + const getBlock = id => vm.editingTarget.blocks.getBlock(id) || vm.runtime.flyoutBlocks.getBlock(id); + const getComment = block => block && block.comment && vm.editingTarget.comments[block.comment]; + const getProcedureDefinitionBlock = procCode => { + const procedurePrototype = Object.values(vm.editingTarget.blocks._blocks).find(i => i.opcode === "procedures_prototype" && i.mutation.proccode === procCode); + if (procedurePrototype) { + // Usually `parent` will exist but sometimes it doesn't + if (procedurePrototype.parent) { + return getBlock(procedurePrototype.parent); + } + const id = procedurePrototype.id; + return Object.values(vm.editingTarget.blocks._blocks).find(i => (i.opcode === "procedures_definition" || i.opcode === "procedures_definition_return") && i.inputs.custom_block && i.inputs.custom_block.block === id); + } + return null; + }; + const setText = text => { + previewInner.innerText = text; + previewInner.classList.remove("sa-comment-preview-hidden"); + updateMousePosition(); + }; + const updateMousePosition = () => { + previewOuter.style.transform = "translate(".concat(mouseX + 8, "px, ").concat(mouseY + 8, "px)"); + }; + const hidePreview = () => { + if (hoveredElement) { + hoveredElement = null; + previewInner.classList.add("sa-comment-preview-hidden"); + } + }; + document.addEventListener("mouseover", e => { + if (addon.self.disabled) { + return; + } + clearTimeout(showTimeout); + if (doNotShowUntilMoveMouse) { + return; + } + const el = e.target.closest(".blocklyBubbleCanvas > g, .blocklyBlockCanvas .blocklyDraggable[data-id]"); + if (el === hoveredElement) { + // Nothing to do. + return; + } + if (!el) { + hidePreview(); + return; + } + let text = null; + if (addon.settings.get("hover-view") && e.target.closest(".blocklyBubbleCanvas > g") && + // Hovering over the thin line that connects comments to blocks should never show a preview + !e.target.closest("line")) { + const collapsedText = el.querySelector("text.scratchCommentText"); + if (!collapsedText) return; + if (collapsedText.getAttribute("display") !== "none") { + const textarea = el.querySelector("textarea"); + text = textarea.value; + } + } else if (e.target.closest(".blocklyBlockCanvas .blocklyDraggable[data-id]")) { + const id = el.dataset.id; + const block = getBlock(id); + const comment = getComment(block); + if (addon.settings.get("hover-view-block") && comment) { + text = comment.text; + } else if (block && block.opcode === "procedures_call" && addon.settings.get("hover-view-procedure")) { + const procCode = block.mutation.proccode; + const procedureDefinitionBlock = getProcedureDefinitionBlock(procCode); + const procedureComment = getComment(procedureDefinitionBlock); + if (procedureComment) { + text = procedureComment.text; + } + } + } + if (text !== null && text.trim() !== "") { + showTimeout = afterDelay(() => { + hoveredElement = el; + setText(text); + }); + } else { + hidePreview(); + } + }); + document.addEventListener("mousemove", e => { + mouseX = e.clientX; + mouseY = e.clientY; + doNotShowUntilMoveMouse = false; + if (addon.settings.get("follow-mouse") && !previewInner.classList.contains("sa-comment-preview-hidden")) { + updateMousePosition(); + } + }); + document.addEventListener("mousedown", () => { + hidePreview(); + doNotShowUntilMoveMouse = true; + }, { + capture: true + }); +}); + +/***/ }), + +/***/ "./src/addons/addons/editor-devtools/DevTools.js": +/*!*******************************************************!*\ + !*** ./src/addons/addons/editor-devtools/DevTools.js ***! + \*******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DevTools; }); +/* harmony import */ var _DomHelpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DomHelpers.js */ "./src/addons/addons/editor-devtools/DomHelpers.js"); +/* harmony import */ var _UndoGroup_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./UndoGroup.js */ "./src/addons/addons/editor-devtools/UndoGroup.js"); +// import ShowBroadcast from "./show-broadcast.js"; + + +class DevTools { + constructor(addon, msg, m) { + this.addon = addon; + this.msg = msg; + this.m = m; + /** + * @type {VirtualMachine} + */ + this.domHelpers = new _DomHelpers_js__WEBPACK_IMPORTED_MODULE_0__["default"](addon); + this.codeTab = null; + this.costTab = null; + this.costTabBody = null; + this.selVarID = null; + this.canShare = false; + this.mouseXY = { + x: 0, + y: 0 + }; + } + async init() { + this.addContextMenus(); + while (true) { + const root = await this.addon.tab.waitForElement("ul[class*=gui_tab-list_]", { + markAsSeen: true, + reduxEvents: ["scratch-gui/mode/SET_PLAYER", "fontsLoaded/SET_FONTS_LOADED", "scratch-gui/locales/SELECT_LOCALE"], + reduxCondition: state => !state.scratchGui.mode.isPlayerOnly + }); + this.initInner(root); + } + } + async addContextMenus() { + const blockly = await this.addon.tab.traps.getBlockly(); + const oldCleanUpFunc = blockly.WorkspaceSvg.prototype.cleanUp; + const self = this; + blockly.WorkspaceSvg.prototype.cleanUp = function () { + if (self.addon.settings.get("enableCleanUpPlus")) { + self.doCleanUp(); + } else { + oldCleanUpFunc.call(this); + } + }; + let originalMsg = blockly.Msg.CLEAN_UP; + if (this.addon.settings.get("enableCleanUpPlus")) blockly.Msg.CLEAN_UP = this.m("clean-plus"); + this.addon.settings.addEventListener("change", () => { + if (this.addon.settings.get("enableCleanUpPlus")) blockly.Msg.CLEAN_UP = this.m("clean-plus");else blockly.Msg.CLEAN_UP = originalMsg; + }); + this.addon.tab.createBlockContextMenu((items, block) => { + items.push({ + enabled: blockly.clipboardXml_, + text: this.m("paste"), + separator: true, + _isDevtoolsFirstItem: true, + callback: () => { + let ids = this.getTopBlockIDs(); + document.dispatchEvent(new KeyboardEvent("keydown", { + keyCode: 86, + ctrlKey: true, + griff: true + })); + setTimeout(() => { + this.beginDragOfNewBlocksNotInIDs(ids); + }, 10); + } + }); + return items; + }, { + workspace: true + }); + this.addon.tab.createBlockContextMenu((items, block) => { + items.push({ + enabled: true, + text: this.m("make-space"), + _isDevtoolsFirstItem: true, + callback: () => { + this.doCleanUp(block); + }, + separator: true + }, { + enabled: true, + text: this.m("copy-all"), + callback: () => { + this.eventCopyClick(block); + }, + separator: true + }, { + enabled: true, + text: this.m("copy-block"), + callback: () => { + this.eventCopyClick(block, 1); + } + }, { + enabled: true, + text: this.m("cut-block"), + callback: () => { + this.eventCopyClick(block, 2); + } + }); + // const BROADCAST_BLOCKS = ["event_whenbroadcastreceived", "event_broadcast", "event_broadcastandwait"]; + // if (BROADCAST_BLOCKS.includes(block.type)) { + // // Show Broadcast + // const broadcastId = this.showBroadcastSingleton.getAssociatedBroadcastId(block.id); + // if (broadcastId) { + // ["Senders", "Receivers"].forEach((showKey, i) => { + // items.push({ + // enabled: true, + // text: this.msg(`show-${showKey}`.toLowerCase()), + // callback: () => { + // this.showBroadcastSingleton[`show${showKey}`](broadcastId); + // }, + // separator: i == 0, + // }); + // }); + // } + // } + return items; + }, { + blocks: true + }); + this.addon.tab.createBlockContextMenu((items, block) => { + if (block.getCategory() === "data" || block.getCategory() === "data-lists") { + this.selVarID = block.getVars()[0]; + items.push({ + enabled: true, + text: this.m("swap", { + var: block.getCategory() === "data" ? this.m("variables") : this.m("lists") + }), + callback: async () => { + let wksp = this.getWorkspace(); + let v = wksp.getVariableById(this.selVarID); + // prompt() returns Promise in desktop app + let varName = await window.prompt(this.msg("replace", { + name: v.name + })); + if (varName) { + this.doReplaceVariable(this.selVarID, varName, v.type); + } + }, + separator: true + }); + } + return items; + }, { + blocks: true, + flyout: true + }); + } + getWorkspace() { + return Blockly.getMainWorkspace(); + } + isCostumeEditor() { + return this.costTab.className.indexOf("gui_is-selected") >= 0; + } + + /** + * A nicely ordered version of the top blocks + * @returns {[Blockly.Block]} + */ + getTopBlocks() { + let result = this.getOrderedTopBlockColumns(); + let columns = result.cols; + /** + * @type {[[Blockly.Block]]} + */ + let topBlocks = []; + for (const col of columns) { + topBlocks = topBlocks.concat(col.blocks); + } + return topBlocks; + } + + /** + * A much nicer way of laying out the blocks into columns + */ + doCleanUp(block) { + let workspace = this.getWorkspace(); + let makeSpaceForBlock = block && block.getRootBlock(); + _UndoGroup_js__WEBPACK_IMPORTED_MODULE_1__["default"].startUndoGroup(workspace); + let result = this.getOrderedTopBlockColumns(true); + let columns = result.cols; + let orphanCount = result.orphans.blocks.length; + if (orphanCount > 0 && !block) { + let message = this.msg("orphaned", { + count: orphanCount + }); + if (confirm(message)) { + for (const block of result.orphans.blocks) { + block.dispose(); + } + } else { + columns.unshift(result.orphans); + } + } + let cursorX = 48; + let maxWidths = result.maxWidths; + for (const column of columns) { + let cursorY = 64; + let maxWidth = 0; + for (const block of column.blocks) { + let extraWidth = block === makeSpaceForBlock ? 380 : 0; + let extraHeight = block === makeSpaceForBlock ? 480 : 72; + let xy = block.getRelativeToSurfaceXY(); + if (cursorX - xy.x !== 0 || cursorY - xy.y !== 0) { + block.moveBy(cursorX - xy.x, cursorY - xy.y); + } + let heightWidth = block.getHeightWidth(); + cursorY += heightWidth.height + extraHeight; + let maxWidthWithComments = maxWidths[block.id] || 0; + maxWidth = Math.max(maxWidth, Math.max(heightWidth.width + extraWidth, maxWidthWithComments)); + } + cursorX += maxWidth + 96; + } + let topComments = workspace.getTopComments(); + for (const comment of topComments) { + if (comment.setVisible) { + comment.setVisible(false); + comment.needsAutoPositioning_ = true; + comment.setVisible(true); + } + } + setTimeout(() => { + // Locate unused local variables... + let workspace = this.getWorkspace(); + let map = workspace.getVariableMap(); + let vars = map.getVariablesOfType(""); + let unusedLocals = []; + for (const row of vars) { + if (row.isLocal) { + let usages = map.getVariableUsesById(row.getId()); + if (!usages || usages.length === 0) { + unusedLocals.push(row); + } + } + } + if (unusedLocals.length > 0) { + const unusedCount = unusedLocals.length; + let message = this.msg("unused-var", { + count: unusedCount + }); + for (let i = 0; i < unusedLocals.length; i++) { + let orphan = unusedLocals[i]; + if (i > 0) { + message += ", "; + } + message += orphan.name; + } + if (confirm(message)) { + for (const orphan of unusedLocals) { + workspace.deleteVariableById(orphan.getId()); + } + } + } + + // Locate unused local lists... + let lists = map.getVariablesOfType("list"); + let unusedLists = []; + for (const row of lists) { + if (row.isLocal) { + let usages = map.getVariableUsesById(row.getId()); + if (!usages || usages.length === 0) { + unusedLists.push(row); + } + } + } + if (unusedLists.length > 0) { + const unusedCount = unusedLists.length; + let message = this.msg("unused-list", { + count: unusedCount + }); + for (let i = 0; i < unusedLists.length; i++) { + let orphan = unusedLists[i]; + if (i > 0) { + message += ", "; + } + message += orphan.name; + } + if (confirm(message)) { + for (const orphan of unusedLists) { + workspace.deleteVariableById(orphan.getId()); + } + } + } + _UndoGroup_js__WEBPACK_IMPORTED_MODULE_1__["default"].endUndoGroup(workspace); + }, 100); + } + + /** + * Badly Orphaned - might want to delete these! + * @param topBlock + * @returns {boolean} + */ + isBlockAnOrphan(topBlock) { + return !!topBlock.outputConnection; + } + + /** + * Split the top blocks into ordered columns + * @param separateOrphans true to keep all orphans separate + * @returns {{orphans: {blocks: [Block], x: number, count: number}, cols: [Col]}} + */ + getOrderedTopBlockColumns(separateOrphans) { + let w = this.getWorkspace(); + let topBlocks = w.getTopBlocks(); + let maxWidths = {}; + if (separateOrphans) { + let topComments = w.getTopComments(); + + // todo: tie comments to blocks... find widths and width of block stack row... + for (const comment of topComments) { + // comment.autoPosition_(); + // Hiding and showing repositions the comment right next to it's block - nice! + if (comment.setVisible) { + comment.setVisible(false); + comment.needsAutoPositioning_ = true; + comment.setVisible(true); + + // let bb = comment.block_.svgPath_.getBBox(); + let right = comment.getBoundingRectangle().bottomRight.x; + + // Get top block for stack... + let root = comment.block_.getRootBlock(); + let left = root.getBoundingRectangle().topLeft.x; + maxWidths[root.id] = Math.max(right - left, maxWidths[root.id] || 0); + } + } + } + + // Default scratch ordering is horrid... Lets try something more clever. + + /** + * @type {Col[]} + */ + let cols = []; + const TOLERANCE = 256; + let orphans = { + x: -999999, + count: 0, + blocks: [] + }; + for (const topBlock of topBlocks) { + // let r = b.getBoundingRectangle(); + let position = topBlock.getRelativeToSurfaceXY(); + /** + * @type {Col} + */ + let bestCol = null; + let bestError = TOLERANCE; + if (separateOrphans && this.isBlockAnOrphan(topBlock)) { + orphans.blocks.push(topBlock); + continue; + } + + // Find best columns + for (const col of cols) { + let err = Math.abs(position.x - col.x); + if (err < bestError) { + bestError = err; + bestCol = col; + } + } + if (bestCol) { + // We found a column that we fitted into + bestCol.x = (bestCol.x * bestCol.count + position.x) / ++bestCol.count; // re-average the columns as more items get added... + bestCol.blocks.push(topBlock); + } else { + // Create a new column + cols.push(new Col(position.x, 1, [topBlock])); + } + } + + // if (orphans.blocks.length > 0) { + // cols.push(orphans); + // } + + // Sort columns, then blocks inside the columns + cols.sort((a, b) => a.x - b.x); + for (const col of cols) { + col.blocks.sort((a, b) => a.getRelativeToSurfaceXY().y - b.getRelativeToSurfaceXY().y); + } + return { + cols: cols, + orphans: orphans, + maxWidths: maxWidths + }; + } + + /** + * Find all the uses of a named variable. + * @param {string} id ID of the variable to find. + * @return {!Array.} Array of block usages. + */ + getVariableUsesById(id) { + let uses = []; + let topBlocks = this.getTopBlocks(true); // todo: Confirm this was the right getTopBlocks? + for (const topBlock of topBlocks) { + /** @type {!Array} */ + let kids = topBlock.getDescendants(); + for (const block of kids) { + /** @type {!Array} */ + let blockVariables = block.getVarModels(); + if (blockVariables) { + for (const blockVar of blockVariables) { + if (blockVar.getId() === id) { + uses.push(block); + } + } + } + } + } + return uses; + } + + /** + * Quick and dirty replace all instances of one variable / list with another variable / list + * @param varId original variable name + * @param newVarName new variable name + * @param type type of variable ("" = variable, anything else is a list? + */ + doReplaceVariable(varId, newVarName, type) { + let wksp = this.getWorkspace(); + let v = wksp.getVariable(newVarName, type); + if (!v) { + alert(this.msg("var-not-exist")); + return; + } + let newVId = v.getId(); + _UndoGroup_js__WEBPACK_IMPORTED_MODULE_1__["default"].startUndoGroup(wksp); + let blocks = this.getVariableUsesById(varId); + for (const block of blocks) { + try { + if (type === "") { + block.getField("VARIABLE").setValue(newVId); + } else { + block.getField("LIST").setValue(newVId); + } + } catch (e) { + // ignore + } + } + _UndoGroup_js__WEBPACK_IMPORTED_MODULE_1__["default"].endUndoGroup(wksp); + } + + /* + function doInjectScripts(codeString) { + let w = getWorkspace(); + let xml = new XML(); // document.implementation.createDocument(null, "xml"); + let x = xml.xmlDoc.firstChild; + let tree = math.parse(codeString); + console.log(tree); + const binaryOperatorTypes = { + add: "operator_add", + subtract: "operator_subtract", + this.multiply: "operator_multiply", + divide: "operator_divide", + }; + const BLOCK_TYPE = { + number: "math_number", + text: "text", + }; + function translateMathToXml(x, tree, shadowType) { + let xShadowField = null; + if (shadowType) { + let xShadow = xml.newXml(x, "shadow", { type: shadowType }); + if (shadowType === BLOCK_TYPE.number) { + xShadowField = xml.newXml(xShadow, "field", { name: "NUM" }); + } else if (shadowType === BLOCK_TYPE.text) { + xShadowField = xml.newXml(xShadow, "field", { name: "TEXT" }); + } + } + if (!tree || !tree.type) { + return; + } + if (tree.type === "OperatorNode") { + let operatorType = binaryOperatorTypes[tree.fn]; + if (operatorType) { + let xOp = newXml(x, "block", { type: operatorType }); + translateMathToXml(xml.newXml(xOp, "value", { name: "NUM1" }), tree.args[0], BLOCK_TYPE.number); + translateMathToXml(xml.newXml(xOp, "value", { name: "NUM2" }), tree.args[1], BLOCK_TYPE.number); + return; + } + return; + } + if (tree.type === "ConstantNode") { + // number or text in quotes + if (xShadowField) { + xml.setAttr(xShadowField, { text: tree.value }); + } + return; + } + if (tree.type === "SymbolNode") { + // variable + let xVar = xml.newXml(x, "block", { type: "data_variable" }); + xml.newXml(xVar, "field", { name: "VARIABLE", text: tree.name }); + return; + } + if (tree.type === "FunctionNode") { + // Method Call + if (tree.fn.name === "join") { + let xOp = newXml(x, "block", { type: "operator_join" }); + translateMathToXml(xml.newXml(xOp, "value", { name: "STRING1" }), tree.args[0], BLOCK_TYPE.text); + translateMathToXml(xml.newXml(xOp, "value", { name: "STRING2" }), tree.args[1], BLOCK_TYPE.text); + return; + } + } + } + translateMathToXml(x, tree); + console.log(x); + let ids = Blockly.Xml.domToWorkspace(x, w); + console.log(ids); + } + */ + /* + function clickInject(e) { + let codeString = window.prompt("Griffpatch: Enter an expression (i.e. a+2*3)"); + if (codeString) { + doInjectScripts(codeString); + } + e.preventDefault(); + return false; + } + */ + + /** + * Returns a Set of the top blocks in this workspace / sprite + * @returns {Set} Set of top blocks + */ + getTopBlockIDs() { + let wksp = this.getWorkspace(); + let topBlocks = wksp.getTopBlocks(); + let ids = new Set(); + for (const block of topBlocks) { + ids.add(block.id); + } + return ids; + } + + /** + * Initiates a drag event for all block stacks except those in the set of ids. + * But why? - Because we know all the ids of the existing stacks before we paste / duplicate - so we can find the + * new stack by excluding all the known ones. + * @param ids Set of previously known ids + */ + beginDragOfNewBlocksNotInIDs(ids) { + if (!this.addon.settings.get("enablePasteBlocksAtMouse")) { + return; + } + let wksp = this.getWorkspace(); + let topBlocks = wksp.getTopBlocks(); + for (const block of topBlocks) { + if (!ids.has(block.id)) { + // console.log("I found a new block!!! - " + block.id); + // todo: move the block to the mouse pointer? + let mouseXYClone = { + x: this.mouseXY.x, + y: this.mouseXY.y + }; + block.setIntersects(true); // fixes offscreen block pasting in Turbo Warp + this.domHelpers.triggerDragAndDrop(block.svgPath_, null, mouseXYClone); + } + } + } + updateMousePosition(e) { + this.mouseXY.x = e.clientX; + this.mouseXY.y = e.clientY; + } + eventMouseMove(e) { + this.updateMousePosition(e); + } + eventKeyDown(e) { + const switchCostume = up => { + // todo: select previous costume + let selected = this.costTabBody.querySelector("div[class*='sprite-selector-item_is-selected']"); + let node = up ? selected.parentNode.previousSibling : selected.parentNode.nextSibling; + if (node) { + let wrapper = node.closest("div[class*=gui_flex-wrapper]"); + node.querySelector("div[class^='sprite-selector-item_sprite-name']").click(); + node.scrollIntoView({ + behavior: "auto", + block: "center", + inline: "start" + }); + wrapper.scrollTop = 0; + } + }; + if (document.URL.indexOf("editor") <= 0) { + return; + } + let ctrlKey = e.ctrlKey || e.metaKey; + if (e.keyCode === 37 && ctrlKey) { + // Ctrl + Left Arrow Key + if (document.activeElement.tagName === "INPUT") { + return; + } + if (this.isCostumeEditor()) { + switchCostume(true); + e.cancelBubble = true; + e.preventDefault(); + return true; + } + } + if (e.keyCode === 39 && ctrlKey) { + // Ctrl + Right Arrow Key + if (document.activeElement.tagName === "INPUT") { + return; + } + if (this.isCostumeEditor()) { + switchCostume(false); + e.cancelBubble = true; + e.preventDefault(); + return true; + } + } + if (e.keyCode === 86 && ctrlKey && !e.griff) { + // Ctrl + V + // Set a timeout so we can take control of the paste after the event + let ids = this.getTopBlockIDs(); + setTimeout(() => { + this.beginDragOfNewBlocksNotInIDs(ids); + }, 10); + } + + // if (e.keyCode === 220 && (!document.activeElement || document.activeElement.tagName === 'INPUT')) { + // + // } + } + eventCopyClick(block, blockOnly) { + let wksp = this.getWorkspace(); + if (block) { + block.select(); + let next = blockOnly ? block.getNextBlock() : null; + if (next) { + next.unplug(false); // setParent(null); + } + + // separate child temporarily + document.dispatchEvent(new KeyboardEvent("keydown", { + keyCode: 67, + ctrlKey: true + })); + if (next || blockOnly === 2) { + setTimeout(() => { + if (next) { + wksp.undo(); // undo the unplug above... + } + if (blockOnly === 2) { + _UndoGroup_js__WEBPACK_IMPORTED_MODULE_1__["default"].startUndoGroup(wksp); + block.dispose(true); + _UndoGroup_js__WEBPACK_IMPORTED_MODULE_1__["default"].endUndoGroup(wksp); + } + }, 0); + } + } + } + eventMouseDown(e) { + this.updateMousePosition(e); + } + eventMouseUp(e) { + this.updateMousePosition(e); + } + initInner(root) { + var _this = this; + let guiTabs = root.childNodes; + if (this.codeTab && guiTabs[0] !== this.codeTab) { + // We have been CHANGED!!! - Happens when going to project page, and then back inside again!!! + this.domHelpers.unbindAllEvents(); + } + this.codeTab = guiTabs[0]; + this.costTab = guiTabs[1]; + this.costTabBody = document.querySelector("div[aria-labelledby=" + this.costTab.id + "]"); + this.domHelpers.bindOnce(document, "keydown", function () { + return _this.eventKeyDown(...arguments); + }, true); + this.domHelpers.bindOnce(document, "mousemove", function () { + return _this.eventMouseMove(...arguments); + }, true); + this.domHelpers.bindOnce(document, "mousedown", function () { + return _this.eventMouseDown(...arguments); + }, true); // true to capture all mouse downs 'before' the dom events handle them + this.domHelpers.bindOnce(document, "mouseup", function () { + return _this.eventMouseUp(...arguments); + }, true); + } +} +class Col { + /** + * @param x {Number} x position (for ordering) + * @param count {Number} + * @param blocks {[Block]} + */ + constructor(x, count, blocks) { + /** + * x position (for ordering) + * @type {Number} + */ + this.x = x; + /** + * @type {Number} + */ + this.count = count; + /** + * @type {[Blockly.Block]} + */ + this.blocks = blocks; + } +} + +/***/ }), + +/***/ "./src/addons/addons/editor-devtools/DomHelpers.js": +/*!*********************************************************!*\ + !*** ./src/addons/addons/editor-devtools/DomHelpers.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DomHelpers; }); +class DomHelpers { + constructor(addon) { + this.addon = addon; + this.vm = addon.tab.traps.vm; + /** + * @type {eventDetails[]} + */ + this.events = []; + } + + /** + * Simulate a drag and drop programmatically through javascript + * @param selectorDrag + * @param selectorDrop + * @param mouseXY + * @param [shiftKey=false] + * @returns {boolean} + */ + triggerDragAndDrop(selectorDrag, selectorDrop, mouseXY, shiftKey) { + // function for triggering mouse events + shiftKey = shiftKey || false; + let fireMouseEvent = function fireMouseEvent(type, elem, centerX, centerY) { + let evt = document.createEvent("MouseEvents"); + evt.initMouseEvent(type, true, true, window, 1, 1, 1, centerX, centerY, shiftKey, false, false, false, 0, elem); + elem.dispatchEvent(evt); + }; + + // fetch target elements + let elemDrag = selectorDrag; // document.querySelector(selectorDrag); + let elemDrop = selectorDrop; // document.querySelector(selectorDrop); + if (!elemDrag /* || !elemDrop*/) { + return false; + } + + // calculate positions + let pos = elemDrag.getBoundingClientRect(); + let center1X = Math.floor((pos.left + pos.right) / 2); + let center1Y = Math.floor((pos.top + pos.bottom) / 2); + + // mouse over dragged element and mousedown + fireMouseEvent("mouseover", elemDrag, center1X, center1Y); + fireMouseEvent("mousedown", elemDrag, center1X, center1Y); + + // start dragging process over to drop target + fireMouseEvent("dragstart", elemDrag, center1X, center1Y); + fireMouseEvent("drag", elemDrag, center1X, center1Y); + fireMouseEvent("mousemove", elemDrag, center1X, center1Y); + if (!elemDrop) { + if (mouseXY) { + // console.log(mouseXY); + let center2X = mouseXY.x; + let center2Y = mouseXY.y; + fireMouseEvent("drag", elemDrag, center2X, center2Y); + fireMouseEvent("mousemove", elemDrag, center2X, center2Y); + } + return false; + } + pos = elemDrop.getBoundingClientRect(); + let center2X = Math.floor((pos.left + pos.right) / 2); + let center2Y = Math.floor((pos.top + pos.bottom) / 2); + fireMouseEvent("drag", elemDrag, center2X, center2Y); + fireMouseEvent("mousemove", elemDrop, center2X, center2Y); + + // trigger dragging process on top of drop target + fireMouseEvent("mouseenter", elemDrop, center2X, center2Y); + fireMouseEvent("dragenter", elemDrop, center2X, center2Y); + fireMouseEvent("mouseover", elemDrop, center2X, center2Y); + fireMouseEvent("dragover", elemDrop, center2X, center2Y); + + // release dragged element on top of drop target + fireMouseEvent("drop", elemDrop, center2X, center2Y); + fireMouseEvent("dragend", elemDrag, center2X, center2Y); + fireMouseEvent("mouseup", elemDrag, center2X, center2Y); + return true; + } + bindOnce(dom, event, func, capture) { + capture = !!capture; + dom.removeEventListener(event, func, capture); + dom.addEventListener(event, func, capture); + this.events.push(new eventDetails(dom, event, func, capture)); + } + unbindAllEvents() { + for (const event of this.events) { + event.dom.removeEventListener(event.event, event.func, event.capture); + } + this.events = []; + } +} + +/** + * A record of an event + */ +class eventDetails { + constructor(dom, event, func, capture) { + this.dom = dom; + this.event = event; + this.func = func; + this.capture = capture; + } +} + +/***/ }), + +/***/ "./src/addons/addons/editor-devtools/UndoGroup.js": +/*!********************************************************!*\ + !*** ./src/addons/addons/editor-devtools/UndoGroup.js ***! + \********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return UndoGroup; }); +/** + * This class is dedicated to maintaining the Undo stack of Blockly + * It allows us to initiate an undo group such that all subsequent operations are recorded as a single + * undoable transaction. + */ +class UndoGroup { + /** + * Start an Undo group - begin recording + * @param workspace the workspace + */ + static startUndoGroup(workspace) { + const undoStack = workspace.undoStack_; + if (undoStack.length) { + undoStack[undoStack.length - 1]._devtoolsLastUndo = true; + } + } + + /** + * End an Undo group - stops recording + * @param workspace the workspace + */ + static endUndoGroup(workspace) { + const undoStack = workspace.undoStack_; + // Events (responsible for undoStack updates) are delayed with a setTimeout(f, 0) + // https://github.com/LLK/scratch-blocks/blob/f159a1779e5391b502d374fb2fdd0cb5ca43d6a2/core/events.js#L182 + setTimeout(() => { + const group = generateUID(); + for (let i = undoStack.length - 1; i >= 0 && !undoStack[i]._devtoolsLastUndo; i--) { + undoStack[i].group = group; + } + }, 0); + } +} + +/** + * https://github.com/LLK/scratch-blocks/blob/f159a1779e5391b502d374fb2fdd0cb5ca43d6a2/core/events.js#L182 + * @returns {string} + * @private + */ +function generateUID() { + const CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%()*+,-./:;=?@[]^_`{|}~"; + let result = ""; + for (let i = 0; i < 20; i++) { + result += CHARACTERS[Math.floor(Math.random() * CHARACTERS.length)]; + } + return result; +} + +/***/ }), + +/***/ "./src/addons/addons/editor-devtools/_runtime_entry.js": +/*!*************************************************************!*\ + !*** ./src/addons/addons/editor-devtools/_runtime_entry.js ***! + \*************************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/editor-devtools/userscript.js"); +/* harmony import */ var _url_loader_icon_close_svg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! url-loader!./icon--close.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/editor-devtools/icon--close.svg"); +/* generated by pull.js */ + + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"], + "icon--close.svg": _url_loader_icon_close_svg__WEBPACK_IMPORTED_MODULE_1__["default"] +}; + +/***/ }), + +/***/ "./src/addons/addons/editor-devtools/userscript.js": +/*!*********************************************************!*\ + !*** ./src/addons/addons/editor-devtools/userscript.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _DevTools_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DevTools.js */ "./src/addons/addons/editor-devtools/DevTools.js"); + +/* harmony default export */ __webpack_exports__["default"] = (async function (_ref) { + let { + addon, + console, + msg, + safeMsg: m + } = _ref; + const devTools = new _DevTools_js__WEBPACK_IMPORTED_MODULE_0__["default"](addon, msg, m); + devTools.init(); +}); + +/***/ }), + +/***/ "./src/addons/addons/editor-searchable-dropdowns/_runtime_entry.js": +/*!*************************************************************************!*\ + !*** ./src/addons/addons/editor-searchable-dropdowns/_runtime_entry.js ***! + \*************************************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/editor-searchable-dropdowns/userscript.js"); +/* harmony import */ var _css_loader_userscript_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./userscript.css */ "./node_modules/css-loader/index.js!./src/addons/addons/editor-searchable-dropdowns/userscript.css"); +/* harmony import */ var _css_loader_userscript_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_userscript_css__WEBPACK_IMPORTED_MODULE_1__); +/* generated by pull.js */ + + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"], + "userscript.css": _css_loader_userscript_css__WEBPACK_IMPORTED_MODULE_1___default.a +}; + +/***/ }), + +/***/ "./src/addons/addons/editor-searchable-dropdowns/userscript.js": +/*!*********************************************************************!*\ + !*** ./src/addons/addons/editor-searchable-dropdowns/userscript.js ***! + \*********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* eslint-disable */ +/* harmony default export */ __webpack_exports__["default"] = (async function (_ref) { + let { + addon, + console, + msg + } = _ref; + const Blockly = await addon.tab.traps.getBlockly(); + const vm = addon.tab.traps.vm; + const SCRATCH_ITEMS_TO_HIDE = ["RENAME_VARIABLE_ID", "DELETE_VARIABLE_ID", "NEW_BROADCAST_MESSAGE_ID", + // From rename-broadcasts addon + "RENAME_BROADCAST_MESSAGE_ID"]; + const canUseAsGlobalVariableName = (name, type) => { + return !vm.runtime.getAllVarNamesOfType(type).includes(name); + }; + const canUseAsLocalVariableName = (name, type) => { + return !vm.editingTarget.lookupVariableByNameAndType(name, type); + }; + const ADDON_ITEMS = { + createGlobalVariable: { + enabled: name => canUseAsGlobalVariableName(name, ""), + createVariable: (workspace, name) => workspace.createVariable(name) + }, + createLocalVariable: { + enabled: name => canUseAsLocalVariableName(name, ""), + createVariable: (workspace, name) => workspace.createVariable(name, "", null, true) + }, + createGlobalList: { + enabled: name => canUseAsGlobalVariableName(name, "list"), + createVariable: (workspace, name) => workspace.createVariable(name, "list") + }, + createLocalList: { + enabled: name => canUseAsLocalVariableName(name, "list"), + createVariable: (workspace, name) => workspace.createVariable(name, "list", null, true) + }, + createBroadcast: { + enabled: name => canUseAsGlobalVariableName(name, "broadcast_msg"), + createVariable: (workspace, name) => workspace.createVariable(name, "broadcast_msg") + } + }; + let blocklyDropDownContent = null; + let blocklyDropdownMenu = null; + let searchBar = null; + // Contains DOM and addon state + let items = []; + let searchedItems = []; + // Tracks internal Scratch state + let currentDropdownOptions = []; + let resultOfLastGetOptions = []; + const oldDropDownDivShow = Blockly.DropDownDiv.show; + Blockly.DropDownDiv.show = function () { + blocklyDropdownMenu = document.querySelector(".blocklyDropdownMenu"); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + if (!blocklyDropdownMenu) { + return oldDropDownDivShow.call(this, ...args); + } + blocklyDropdownMenu.focus = () => {}; // no-op focus() so it can't steal it from the search bar + + searchBar = document.createElement("input"); + addon.tab.displayNoneWhileDisabled(searchBar, { + display: "flex" + }); + searchBar.type = "text"; + searchBar.addEventListener("input", updateSearch); + searchBar.addEventListener("keydown", handleKeyDownEvent); + searchBar.classList.add("u-dropdown-searchbar"); + blocklyDropdownMenu.insertBefore(searchBar, blocklyDropdownMenu.firstChild); + items = Array.from(blocklyDropdownMenu.children).filter(child => child.tagName !== "INPUT").map(element => ({ + element, + text: element.textContent + })); + currentDropdownOptions = resultOfLastGetOptions; + updateSearch(); + + // Call the original show method after adding everything so that it can perform the correct size calculations + const ret = oldDropDownDivShow.call(this, ...args); + + // Lock the size of the dropdown + blocklyDropDownContent = Blockly.DropDownDiv.getContentDiv(); + blocklyDropDownContent.style.width = getComputedStyle(blocklyDropDownContent).width; + blocklyDropDownContent.style.height = getComputedStyle(blocklyDropDownContent).height; + + // This is really strange, but if you don't reinsert the search bar into the DOM then focus() doesn't work + blocklyDropdownMenu.insertBefore(searchBar, blocklyDropdownMenu.firstChild); + searchBar.focus(); + return ret; + }; + const oldDropDownDivClearContent = Blockly.DropDownDiv.clearContent; + Blockly.DropDownDiv.clearContent = function () { + oldDropDownDivClearContent.call(this); + items = []; + searchedItems = []; + Blockly.DropDownDiv.content_.style.height = ""; + }; + const oldFieldDropdownGetOptions = Blockly.FieldDropdown.prototype.getOptions; + Blockly.FieldDropdown.prototype.getOptions = function () { + const options = oldFieldDropdownGetOptions.call(this); + const block = this.sourceBlock_; + const isStage = vm.editingTarget && vm.editingTarget.isStage; + if (block) { + if (block.category_ === "data") { + options.push(getMenuItemMessage("createGlobalVariable")); + if (!isStage) { + options.push(getMenuItemMessage("createLocalVariable")); + } + } else if (block.category_ === "data-lists") { + options.push(getMenuItemMessage("createGlobalList")); + if (!isStage) { + options.push(getMenuItemMessage("createLocalList")); + } + } else if (block.type === "event_broadcast_menu" || block.type === "event_whenbroadcastreceived") { + options.push(getMenuItemMessage("createBroadcast")); + } + } + // Options aren't normally stored anywhere, so we'll store them ourselves. + resultOfLastGetOptions = options; + return options; + }; + const oldFieldTextDropdownGetOptions = Blockly.FieldTextDropdown.prototype.getOptions; + Blockly.FieldTextDropdown.prototype.getOptions = function () { + const options = oldFieldTextDropdownGetOptions.call(this); + const block = this.sourceBlock_; + const isStage = vm.editingTarget && vm.editingTarget.isStage; + if (block) { + if (block.category_ === "data") { + options.push(getMenuItemMessage("createGlobalVariable")); + if (!isStage) { + options.push(getMenuItemMessage("createLocalVariable")); + } + } else if (block.category_ === "data-lists") { + options.push(getMenuItemMessage("createGlobalList")); + if (!isStage) { + options.push(getMenuItemMessage("createLocalList")); + } + } else if (block.type === "event_broadcast_menu" || block.type === "event_whenbroadcastreceived") { + options.push(getMenuItemMessage("createBroadcast")); + } + } + // Options aren't normally stored anywhere, so we'll store them ourselves. + resultOfLastGetOptions = options; + return options; + }; + const oldFieldVariableOnItemSelected = Blockly.FieldVariable.prototype.onItemSelected; + Blockly.FieldVariable.prototype.onItemSelected = function (menu, menuItem) { + const sourceBlock = this.sourceBlock_; + if (sourceBlock && sourceBlock.workspace && searchBar.value.length !== 0) { + const workspace = sourceBlock.workspace; + const optionId = menuItem.getValue(); + if (Object.prototype.hasOwnProperty.call(ADDON_ITEMS, optionId)) { + const addonItem = ADDON_ITEMS[optionId]; + Blockly.Events.setGroup(true); + const variable = addonItem.createVariable(workspace, searchBar.value.trim()); + if (this.sourceBlock_) this.setValue(variable.getId()); + Blockly.Events.setGroup(false); + return; + } + } + return oldFieldVariableOnItemSelected.call(this, menu, menuItem); + }; + function selectItem(item, click) { + // You can't just use click() or focus() because Blockly uses mousedown and mouseup handlers, not click handlers. + item.dispatchEvent(new MouseEvent("mousedown", { + relatedTarget: item, + bubbles: true + })); + if (click) item.dispatchEvent(new MouseEvent("mouseup", { + relatedTarget: item, + bubbles: true + })); + + // Scroll the item into view if it is offscreen. + const itemTop = item.offsetTop; + const itemEnd = itemTop + item.offsetHeight; + const scrollTop = blocklyDropDownContent.scrollTop; + const scrollHeight = blocklyDropDownContent.offsetHeight; + const scrollEnd = scrollTop + scrollHeight; + if (scrollTop > itemTop) { + blocklyDropDownContent.scrollTop = itemTop; + } else if (itemEnd > scrollEnd) { + blocklyDropDownContent.scrollTop = itemEnd - scrollHeight; + } + } + function performSearch() { + const rawQuery = searchBar.value.trim(); + const query = rawQuery.trim().toLowerCase(); + const rank = (item, index) => { + // Negative number will hide + // Higher numbers will appear first + const option = currentDropdownOptions[index]; + const optionId = option[1]; + if (SCRATCH_ITEMS_TO_HIDE.includes(optionId)) { + return query ? -1 : 0; + } else if (Object.prototype.hasOwnProperty.call(ADDON_ITEMS, optionId)) { + if (!query) { + return -1; + } + const addonInfo = ADDON_ITEMS[optionId]; + if (addonInfo.enabled(rawQuery)) { + item.element.lastChild.lastChild.textContent = getMenuItemMessage(optionId)[0]; + return 0; + } + return -1; + } + const itemText = item.text.toLowerCase(); + if (query === itemText) { + return 2; + } + if (itemText.startsWith(query)) { + return 1; + } + if (itemText.includes(query)) { + return 0; + } + return -1; + }; + return items.map((item, index) => ({ + item, + score: rank(item, index) + })).sort((_ref2, _ref3) => { + let { + score: scoreA + } = _ref2; + let { + score: scoreB + } = _ref3; + return Math.max(0, scoreB) - Math.max(0, scoreA); + }); + } + function updateSearch() { + const previousSearchedItems = searchedItems; + searchedItems = performSearch(); + let needToUpdateDOM = previousSearchedItems.length !== searchedItems.length; + if (!needToUpdateDOM) { + for (let i = 0; i < searchedItems.length; i++) { + if (searchedItems[i].item !== previousSearchedItems[i].item) { + needToUpdateDOM = true; + break; + } + } + } + if (needToUpdateDOM && previousSearchedItems.length > 0) { + for (const { + item + } of previousSearchedItems) { + item.element.remove(); + } + for (const { + item + } of searchedItems) { + blocklyDropdownMenu.appendChild(item.element); + } + } + for (const { + item, + score + } of searchedItems) { + item.element.hidden = score < 0; + } + } + function handleKeyDownEvent(event) { + if (event.key === "Enter") { + // Reimplement enter to select item to account for hidden items and default to the top item. + event.stopPropagation(); + event.preventDefault(); + const selectedItem = document.querySelector(".goog-menuitem-highlight"); + if (selectedItem && !selectedItem.hidden) { + selectItem(selectedItem, true); + return; + } + const selectedBlock = Blockly.selected; + if (searchBar.value === "" && selectedBlock) { + if (selectedBlock.type === "event_broadcast" || selectedBlock.type === "event_broadcastandwait" || selectedBlock.type === "event_whenbroadcastreceived") { + // The top item of these dropdowns is always "New message" + // When pressing enter on an empty search bar, we close the dropdown instead of making a new broadcast. + Blockly.DropDownDiv.hide(); + return; + } + } + for (const { + item + } of searchedItems) { + if (!item.element.hidden) { + selectItem(item.element, true); + break; + } + } + // If there is no top value, do nothing and leave the dropdown open + } else if (event.key === "Escape") { + Blockly.DropDownDiv.hide(); + } else if (event.key === "ArrowDown" || event.key === "ArrowUp") { + // Reimplement keyboard navigation to account for hidden items. + event.preventDefault(); + event.stopPropagation(); + const items = searchedItems.filter(i => i.score >= 0).map(i => i.item); + if (items.length === 0) { + return; + } + let selectedIndex = -1; + for (let i = 0; i < items.length; i++) { + if (items[i].element.classList.contains("goog-menuitem-highlight")) { + selectedIndex = i; + break; + } + } + const lastIndex = items.length - 1; + let newIndex = 0; + if (event.key === "ArrowDown") { + if (selectedIndex === -1 || selectedIndex === lastIndex) { + newIndex = 0; + } else { + newIndex = selectedIndex + 1; + } + } else { + if (selectedIndex === -1 || selectedIndex === 0) { + newIndex = lastIndex; + } else { + newIndex = selectedIndex - 1; + } + } + selectItem(items[newIndex].element, false); + } + } + function getMenuItemMessage(message) { + var _searchBar; + // Format used internally by Scratch: + // [human readable name, internal name] + return [msg(message, { + name: ((_searchBar = searchBar) === null || _searchBar === void 0 ? void 0 : _searchBar.value.trim()) || "" + }), message]; + } +}); + +/***/ }), + +/***/ "./src/addons/addons/find-bar/_runtime_entry.js": +/*!******************************************************!*\ + !*** ./src/addons/addons/find-bar/_runtime_entry.js ***! + \******************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/find-bar/userscript.js"); +/* harmony import */ var _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! css-loader!./userstyle.css */ "./node_modules/css-loader/index.js!./src/addons/addons/find-bar/userstyle.css"); +/* harmony import */ var _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1__); +/* generated by pull.js */ + + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"], + "userstyle.css": _css_loader_userstyle_css__WEBPACK_IMPORTED_MODULE_1___default.a +}; + +/***/ }), + +/***/ "./src/addons/addons/find-bar/blockly/BlockItem.js": +/*!*********************************************************!*\ + !*** ./src/addons/addons/find-bar/blockly/BlockItem.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BlockItem; }); +class BlockItem { + constructor(cls, procCode, labelID, y) { + this.cls = cls; + this.procCode = procCode; + this.labelID = labelID; + this.y = y; + this.lower = procCode.toLowerCase(); + /** + * An Array of block ids + * @type {Array.} + */ + this.clones = null; + this.eventName = null; + } + + /** + * True if the blockID matches a black represented by this BlockItem + * @param id + * @returns {boolean} + */ + matchesID(id) { + if (this.labelID === id) { + return true; + } + if (this.clones) { + for (const cloneID of this.clones) { + if (cloneID === id) { + return true; + } + } + } + return false; + } +} + +/***/ }), + +/***/ "./src/addons/addons/find-bar/userscript.js": +/*!**************************************************!*\ + !*** ./src/addons/addons/find-bar/userscript.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _blockly_BlockItem_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./blockly/BlockItem.js */ "./src/addons/addons/find-bar/blockly/BlockItem.js"); +/* harmony import */ var _blockly_BlockInstance_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./blockly/BlockInstance.js */ "./src/addons/addons/find-bar/blockly/BlockInstance.js"); +/* harmony import */ var _blockly_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./blockly/Utils.js */ "./src/addons/addons/find-bar/blockly/Utils.js"); + + + +/* harmony default export */ __webpack_exports__["default"] = (async function (_ref) { + let { + addon, + msg, + console + } = _ref; + const Blockly = await addon.tab.traps.getBlockly(); + class FindBar { + constructor() { + this.utils = new _blockly_Utils_js__WEBPACK_IMPORTED_MODULE_2__["default"](addon); + this.prevValue = ""; + this.findBarOuter = null; + this.findWrapper = null; + this.findInput = null; + this.dropdownOut = null; + this.dropdown = new Dropdown(this.utils); + document.addEventListener("keydown", e => this.eventKeyDown(e), true); + } + get workspace() { + return Blockly.getMainWorkspace(); + } + createDom(root) { + this.findBarOuter = document.createElement("div"); + this.findBarOuter.className = "sa-find-bar"; + addon.tab.displayNoneWhileDisabled(this.findBarOuter, { + display: "flex" + }); + root.appendChild(this.findBarOuter); + this.findWrapper = this.findBarOuter.appendChild(document.createElement("span")); + this.findWrapper.className = "sa-find-wrapper"; + this.dropdownOut = this.findWrapper.appendChild(document.createElement("label")); + this.dropdownOut.className = "sa-find-dropdown-out"; + this.findInput = this.dropdownOut.appendChild(document.createElement("input")); + this.findInput.className = addon.tab.scratchClass("input_input-form", { + others: "sa-find-input" + }); + // for \n );\n return (\n \n {setting.type === 'boolean' && (\n \n {label}\n SettingsStore.setAddonSetting(addonId, settingId, e.target.checked)}\n />\n \n )}\n {setting.type === 'integer' && (\n \n {label}\n SettingsStore.setAddonSetting(addonId, settingId, newValue)}\n />\n \n \n )}\n {setting.type === 'color' && (\n \n {label}\n SettingsStore.setAddonSetting(addonId, settingId, e.target.value)}\n />\n \n \n )}\n {setting.type === 'select' && (\n \n {label}\n ({\n id,\n name: addonTranslations[`${addonId}/@settings-select-${settingId}-${id}`] || name\n }))}\n onChange={v => SettingsStore.setAddonSetting(addonId, settingId, v)}\n setting={setting}\n />\n \n )}\n \n );\n};\nSetting.propTypes = {\n addonId: PropTypes.string,\n setting: PropTypes.shape({\n type: PropTypes.string,\n id: PropTypes.string,\n name: PropTypes.string,\n min: PropTypes.number,\n max: PropTypes.number,\n default: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.bool]),\n potentialValues: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string,\n name: PropTypes.string\n })),\n if: PropTypes.shape({\n addonEnabled: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]),\n // eslint-disable-next-line react/forbid-prop-types\n settings: PropTypes.object\n })\n }),\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.bool, PropTypes.number])\n};\n\nconst Notice = ({\n type,\n text\n}) => (\n \n
\n \n
\n
\n {text}\n
\n \n);\nNotice.propTypes = {\n type: PropTypes.string,\n text: PropTypes.string\n};\n\nconst Presets = ({\n addonId,\n presets\n}) => (\n
\n
\n {settingsTranslations.presets}\n
\n {presets.map(preset => {\n const presetId = preset.id;\n const name = addonTranslations[`${addonId}/@preset-name-${presetId}`] || preset.name;\n const description = addonTranslations[`${addonId}/@preset-description-${presetId}`] || preset.description;\n return (\n SettingsStore.applyAddonPreset(addonId, presetId)}\n >\n {name}\n \n );\n })}\n
\n);\nPresets.propTypes = {\n addonId: PropTypes.string,\n presets: PropTypes.arrayOf(PropTypes.shape({\n name: PropTypes.string,\n id: PropTypes.string,\n description: PropTypes.string,\n values: PropTypes.shape({})\n }))\n};\n\nconst Addon = ({\n id,\n settings,\n manifest,\n extended\n}) => (\n
\n
\n \n \n {!settings.enabled && (\n
\n {addonTranslations[`${id}/@description`] || manifest.description}\n
\n )}\n
\n {settings.enabled && manifest.settings && (\n SettingsStore.resetAddon(id)}\n title={settingsTranslations.reset}\n >\n \n \n )}\n
\n
\n {settings.enabled && (\n
\n
\n {addonTranslations[`${id}/@description`] || manifest.description}\n
\n {manifest.credits && (\n
\n \n {settingsTranslations.credits}\n \n \n
\n )}\n {manifest.info && (\n manifest.info.map(info => (\n \n ))\n )}\n {manifest.noCompiler && (\n \n )}\n {manifest.settings && (\n
\n {manifest.settings.map(setting => (\n \n ))}\n {manifest.presets && (\n \n )}\n
\n )}\n
\n )}\n
\n);\nAddon.propTypes = {\n id: PropTypes.string,\n settings: PropTypes.shape({\n enabled: PropTypes.bool,\n dirty: PropTypes.bool\n }),\n manifest: PropTypes.shape({\n name: PropTypes.string,\n description: PropTypes.string,\n credits: PropTypes.arrayOf(PropTypes.shape({})),\n info: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string\n })),\n settings: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string\n })),\n presets: PropTypes.arrayOf(PropTypes.shape({})),\n tags: PropTypes.arrayOf(PropTypes.string),\n noCompiler: PropTypes.bool\n }),\n extended: PropTypes.bool\n};\n\nconst Dirty = props => (\n
\n
\n {settingsTranslations.dirty}\n {props.onReloadNow && (\n \n {settingsTranslations.dirtyButton}\n \n )}\n
\n
\n);\nDirty.propTypes = {\n onReloadNow: PropTypes.func\n};\n\nconst UnsupportedAddons = ({ addons: addonList }) => (\n
\n \n {settingsTranslations.unsupported}\n \n {addonList.map(({ id, manifest }, index) => (\n \n {addonTranslations[`${id}/@name`] || manifest.name}\n {index !== addonList.length - 1 && (\n ', '\n )}\n \n ))}\n
\n);\nUnsupportedAddons.propTypes = {\n addons: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string,\n manifest: PropTypes.shape({\n name: PropTypes.string\n })\n }))\n};\n\nconst InternalAddonList = ({ addons, extended }) => (\n addons.map(({ id, manifest, state }) => (\n \n ))\n);\n\nclass AddonGroup extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n open: props.open\n };\n }\n render() {\n if (this.props.addons.length === 0) {\n return null;\n }\n return (\n
\n {\n this.setState({\n open: !this.state.open\n });\n }}\n >\n \n {this.props.label.replace('{number}', this.props.addons.length)}\n \n {this.state.open && (\n \n )}\n
\n );\n }\n}\nAddonGroup.propTypes = {\n label: PropTypes.string,\n open: PropTypes.bool,\n addons: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string.isRequired,\n state: PropTypes.shape({}).isRequired,\n manifest: PropTypes.shape({}).isRequired\n })).isRequired,\n extended: PropTypes.bool.isRequired\n};\n\nconst addonToSearchItem = ({ id, manifest }) => {\n const texts = new Set();\n const addText = (score, text) => {\n if (text) {\n texts.add({\n score,\n text\n });\n }\n };\n addText(1, id);\n addText(1, manifest.name);\n addText(1, addonTranslations[`${id}/@name`]);\n addText(0.5, manifest.description);\n addText(0.5, addonTranslations[`${id}/@description`]);\n if (manifest.settings) {\n for (const setting of manifest.settings) {\n addText(0.25, setting.name);\n addText(0.25, addonTranslations[`${id}/@settings-name-${setting.id}`]);\n }\n }\n if (manifest.presets) {\n for (const preset of manifest.presets) {\n addText(0.1, preset.name);\n addText(0.1, addonTranslations[`${id}/@preset-name-${preset.id}`]);\n addText(0.1, preset.description);\n addText(0.1, addonTranslations[`${id}/@preset-description-${preset.id}`]);\n }\n }\n for (const tag of manifest.tags) {\n const key = `tags.${tag}`;\n if (settingsTranslations[key]) {\n addText(0.25, settingsTranslations[key]);\n }\n }\n if (manifest.info) {\n for (const info of manifest.info) {\n addText(0.25, info.text);\n addText(0.25, addonTranslations[`${id}/@info-${info.id}`]);\n }\n }\n return texts;\n};\n\nclass AddonList extends React.Component {\n constructor(props) {\n super(props);\n this.search = new Search(this.props.addons.map(addonToSearchItem));\n this.groups = [];\n }\n render() {\n if (this.props.search) {\n const addons = this.search.search(this.props.search)\n .slice(0, 20)\n .map(({ index }) => this.props.addons[index]);\n if (addons.length === 0) {\n return (\n
\n {settingsTranslations.noResults}\n
\n );\n }\n return (\n
\n \n
\n );\n }\n return (\n
\n {Object.entries(groupedAddons).map(([id, { label, addons, open }]) => (\n this.props.addons[index])}\n extended={this.props.extended}\n />\n ))}\n
\n );\n }\n}\nAddonList.propTypes = {\n addons: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string.isRequired,\n state: PropTypes.shape({}).isRequired,\n manifest: PropTypes.shape({}).isRequired\n })).isRequired,\n search: PropTypes.string.isRequired,\n extended: PropTypes.bool.isRequired\n};\n\nclass AddonSettingsComponent extends React.Component {\n constructor(props) {\n super(props);\n this.handleSettingStoreChanged = this.handleSettingStoreChanged.bind(this);\n this.handleReloadNow = this.handleReloadNow.bind(this);\n this.handleResetAll = this.handleResetAll.bind(this);\n this.handleExport = this.handleExport.bind(this);\n this.handleImport = this.handleImport.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleSearch = this.handleSearch.bind(this);\n this.handleClickSearchButton = this.handleClickSearchButton.bind(this);\n this.handleClickVersion = this.handleClickVersion.bind(this);\n this.searchRef = this.searchRef.bind(this);\n this.searchBar = null;\n this.state = {\n loading: false,\n dirty: false,\n search: location.hash ? location.hash.substr(1) : '',\n extended: false,\n ...this.readFullAddonState()\n };\n if (Channels.changeChannel) {\n Channels.changeChannel.addEventListener('message', () => {\n SettingsStore.readLocalStorage();\n this.setState(this.readFullAddonState());\n });\n }\n }\n componentDidMount() {\n SettingsStore.addEventListener('setting-changed', this.handleSettingStoreChanged);\n document.body.addEventListener('keydown', this.handleKeyDown);\n }\n componentWillUnmount() {\n SettingsStore.removeEventListener('setting-changed', this.handleSettingStoreChanged);\n document.body.removeEventListener('keydown', this.handleKeyDown);\n }\n readFullAddonState() {\n const result = {};\n for (const [id, manifest] of Object.entries(supportedAddons)) {\n const enabled = SettingsStore.getAddonEnabled(id);\n const addonState = {\n enabled: enabled,\n dirty: false\n };\n if (manifest.settings) {\n for (const setting of manifest.settings) {\n addonState[setting.id] = SettingsStore.getAddonSetting(id, setting.id);\n }\n }\n result[id] = addonState;\n }\n return result;\n }\n handleSettingStoreChanged(e) {\n const { addonId, settingId, value } = e.detail;\n // If channels are unavailable, every change requires reload.\n const reloadRequired = e.detail.reloadRequired || !Channels.changeChannel;\n this.setState(state => {\n const newState = {\n [addonId]: {\n ...state[addonId],\n [settingId]: value,\n dirty: true\n }\n };\n if (reloadRequired) {\n newState.dirty = true;\n }\n return newState;\n });\n if (!reloadRequired) {\n postThrottledSettingsChange(SettingsStore.store);\n }\n }\n handleReloadNow() {\n // Value posted does not matter\n Channels.reloadChannel.postMessage(0);\n this.setState({\n dirty: false\n });\n for (const addonId of Object.keys(supportedAddons)) {\n if (this.state[addonId].dirty) {\n this.setState(state => ({\n [addonId]: {\n ...state[addonId],\n dirty: false\n }\n }));\n }\n }\n }\n handleResetAll() {\n if (confirm(settingsTranslations.confirmResetAll)) {\n SettingsStore.resetAllAddons();\n this.setState({\n search: ''\n });\n }\n }\n handleExport() {\n const exportedData = SettingsStore.export({\n theme\n });\n this.props.onExportSettings(exportedData);\n }\n handleImport() {\n const fileSelector = document.createElement('input');\n fileSelector.type = 'file';\n fileSelector.accept = '.json';\n document.body.appendChild(fileSelector);\n fileSelector.click();\n document.body.removeChild(fileSelector);\n fileSelector.addEventListener('change', async () => {\n const file = fileSelector.files[0];\n if (!file) {\n return;\n }\n try {\n const text = await file.text();\n const data = JSON.parse(text);\n SettingsStore.import(data);\n this.setState({\n search: ''\n });\n } catch (e) {\n console.error(e);\n alert(e);\n }\n });\n }\n handleSearch(e) {\n const value = e.target.value;\n this.setState({\n search: value\n });\n }\n handleClickSearchButton() {\n this.setState({\n search: ''\n });\n this.searchBar.focus();\n }\n handleClickVersion() {\n this.setState({\n extended: !this.state.extended\n });\n }\n searchRef(searchBar) {\n this.searchBar = searchBar;\n }\n handleKeyDown(e) {\n const key = e.key;\n if (key.length === 1 && key !== ' ' && e.target === document.body && !(e.ctrlKey || e.metaKey || e.altKey)) {\n this.searchBar.focus();\n }\n // Only preventDefault() if the search bar isn't already focused so\n // that we don't break the browser's builtin ctrl+f\n if (key === 'f' && (e.ctrlKey || e.metaKey) && document.activeElement !== this.searchBar) {\n this.searchBar.focus();\n e.preventDefault();\n }\n }\n render() {\n const addonState = Object.entries(supportedAddons).map(([id, manifest]) => ({\n id,\n manifest,\n state: this.state[id]\n }));\n const unsupported = Object.entries(unsupportedAddons).map(([id, manifest]) => ({\n id,\n manifest\n }));\n return (\n
\n
\n
\n
\n \n \n
\n \n \n {settingsTranslations.addonFeedback}\n \n \n
\n {this.state.dirty && (\n \n )}\n
\n
\n {!this.state.loading && (\n
\n \n
\n \n {settingsTranslations.resetAll}\n \n \n {settingsTranslations.export}\n \n \n {settingsTranslations.import}\n \n
\n
\n {unsupported.length ? (\n \n ) : null}\n \n {this.state.extended ?\n // Don't bother translating, pretty much no one will ever see this.\n // eslint-disable-next-line max-len\n `You have enabled debug mode. (Addons version ${upstreamMeta.commit})` :\n `Addons version ${upstreamMeta.commit}`}\n \n
\n
\n )}\n
\n
\n );\n }\n}\nAddonSettingsComponent.propTypes = {\n onExportSettings: PropTypes.func\n};\n\nexport default AddonSettingsComponent;\n","/**\n * @fileoverview\n * Utility function to detect locale from the browser setting or paramenter on the URL.\n */\n\nimport queryString from 'query-string';\n\n// tw: read language from localStorage\nexport const LANGUAGE_KEY = 'tw:language';\n\n/**\n * look for language setting in the browser. Check against supported locales.\n * If there's a parameter in the URL, override the browser setting\n * @param {Array.string} supportedLocales An array of supported locale codes.\n * @return {string} the preferred locale\n */\nconst detectLocale = supportedLocales => {\n // tw: read language from localStorage\n try {\n const storedLanguage = localStorage.getItem(LANGUAGE_KEY);\n if (storedLanguage && supportedLocales.includes(storedLanguage)) {\n return storedLanguage;\n }\n } catch (e) { /* ignore */ }\n\n let locale = 'en'; // default\n let browserLocale = window.navigator.userLanguage || window.navigator.language;\n browserLocale = browserLocale.toLowerCase();\n // try to set locale from browserLocale\n if (supportedLocales.includes(browserLocale)) {\n locale = browserLocale;\n } else {\n browserLocale = browserLocale.split('-')[0];\n if (supportedLocales.includes(browserLocale)) {\n locale = browserLocale;\n }\n }\n\n const queryParams = queryString.parse(location.search);\n // Flatten potential arrays and remove falsy values\n const potentialLocales = [].concat(queryParams.locale, queryParams.lang).filter(l => l);\n if (!potentialLocales.length) {\n return locale;\n }\n\n const urlLocale = potentialLocales[0].toLowerCase();\n if (supportedLocales.includes(urlLocale)) {\n return urlLocale;\n }\n\n return locale;\n};\n\nexport {\n detectLocale\n};\n","export default (filename, blob) => {\n const downloadLink = document.createElement('a');\n document.body.appendChild(downloadLink);\n\n // Use special ms version if available to get it working on Edge.\n if (navigator.msSaveOrOpenBlob) {\n navigator.msSaveOrOpenBlob(blob, filename);\n return;\n }\n\n if ('download' in HTMLAnchorElement.prototype) {\n const url = window.URL.createObjectURL(blob);\n downloadLink.href = url;\n downloadLink.download = filename;\n downloadLink.type = blob.type;\n downloadLink.click();\n // remove the link after a timeout to prevent a crash on iOS 13 Safari\n window.setTimeout(() => {\n document.body.removeChild(downloadLink);\n window.URL.revokeObjectURL(url);\n }, 1000);\n } else {\n // iOS 12 Safari, open a new page and set href to data-uri\n let popup = window.open('', '_blank');\n const reader = new FileReader();\n reader.onloadend = function () {\n popup.location.href = reader.result;\n popup = null;\n };\n reader.readAsDataURL(blob);\n }\n\n};\n","/**\n * Internal stored state. Not valid until after at least one call to `setIsScratchDesktop()`.\n * @type {boolean}\n */\nlet _isScratchDesktop; // undefined = not ready yet\n\n/**\n * Tell the `isScratchDesktop()` whether or not the GUI is running under Scratch Desktop.\n * @param {boolean} value - the new value which `isScratchDesktop()` should return in the future.\n */\nconst setIsScratchDesktop = function (value) {\n _isScratchDesktop = value;\n};\n\n/**\n * @returns {boolean} - true if it seems like the GUI is running under Scratch Desktop; false otherwise.\n * If `setIsScratchDesktop()` has not yet been called, this can return `undefined`.\n */\nconst isScratchDesktop = function () {\n return _isScratchDesktop;\n};\n\n/**\n * @returns {boolean} - false if it seems like the GUI is running under Scratch Desktop; true otherwise.\n */\nconst notScratchDesktop = function () {\n return !isScratchDesktop();\n};\n\nexport default isScratchDesktop;\nexport {\n isScratchDesktop,\n notScratchDesktop,\n setIsScratchDesktop\n};\n","\nvar content = require(\"!!../../node_modules/css-loader/index.js??ref--5-1!../../node_modules/postcss-loader/src/index.js??postcss!./normalize.css\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../node_modules/css-loader/index.js??ref--5-1!../../node_modules/postcss-loader/src/index.js??postcss!./normalize.css\", function() {\n\t\tvar newContent = require(\"!!../../node_modules/css-loader/index.js??ref--5-1!../../node_modules/postcss-loader/src/index.js??postcss!./normalize.css\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","import React from 'react';\nimport darkModeCSS from '!raw-loader!./tw-theme-dark.css';\n\nconst THEME_KEY = 'tw:theme';\n\nconst darkMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\nexport const getInitialDarkMode = () => {\n try {\n const item = localStorage.getItem(THEME_KEY);\n if (item !== null) {\n return item === 'dark';\n }\n } catch (e) {\n // ignore\n }\n return darkMediaQuery.matches;\n};\n\nconst darkModeStylesheet = document.createElement('style');\ndarkModeStylesheet.textContent = darkModeCSS;\n\nconst ThemeHOC = function (WrappedComponent) {\n class ThemeComponent extends React.Component {\n constructor (props) {\n super(props);\n this.handleQueryChange = this.handleQueryChange.bind(this);\n this.handleClickTheme = this.handleClickTheme.bind(this);\n this.state = {\n dark: getInitialDarkMode()\n };\n }\n componentDidMount () {\n // media query does not have listeners in legacy edge\n if (darkMediaQuery.addEventListener) {\n darkMediaQuery.addEventListener('change', this.handleQueryChange);\n }\n this.updateDark();\n }\n componentDidUpdate () {\n try {\n localStorage.setItem(THEME_KEY, this.state.dark ? 'dark' : 'light');\n } catch (e) {\n // ignore\n }\n this.updateDark();\n }\n componentWillUnmount () {\n // media query does not have listeners in legacy edge\n if (darkMediaQuery.removeEventListener) {\n darkMediaQuery.removeEventListener('change', this.handleQueryChange);\n }\n }\n updateDark () {\n const dark = this.state.dark;\n document.body.setAttribute('theme', dark ? 'dark' : 'light');\n if (dark && !darkModeStylesheet.parentNode) {\n // Append at the start of we override scratch-gui styles in \n // but are overridden by addon styles at the end of \n document.body.insertBefore(darkModeStylesheet, document.body.firstChild);\n } else if (!dark && darkModeStylesheet.parentNode) {\n darkModeStylesheet.parentNode.removeChild(darkModeStylesheet);\n }\n }\n handleQueryChange () {\n this.setState({\n dark: darkMediaQuery.matches\n });\n }\n handleClickTheme () {\n this.setState(state => ({\n dark: !state.dark\n }));\n }\n render () {\n return (\n \n );\n }\n }\n return ThemeComponent;\n};\n\nexport {\n ThemeHOC as default\n};\n","/**\n * Copyright (C) 2021 Thomas Weber\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License version 3 as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\nimport 'core-js';\nimport 'regenerator-runtime/runtime';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport downloadBlob from '../lib/download-blob.js';\nimport Settings from '../addons/settings/settings.jsx';\nimport appTarget from './app-target';\n\nconst onExportSettings = settings => {\n const blob = new Blob([JSON.stringify(settings)]);\n downloadBlob('penguinmod-addon-settings.json', blob);\n};\n\nReactDOM.render((\n \n), appTarget);\n","const appTarget = document.getElementById('app');\n\n// Remove everything from the target to fix macOS Safari \"Save Page As\",\nwhile (appTarget.firstChild) {\n appTarget.removeChild(appTarget.firstChild);\n}\n\ndocument.body.classList.add('tw-loaded');\n\nexport default appTarget;\n"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA,UAEA;AACA;;;;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC/NA;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACLA;AAAA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACXA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;ACrCA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAOA;AAIA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AAEA;AACA;AAAA;AAIA;AACA;AACA;AAAA;AAYA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAKA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAEA;AAAA;AAKA;AAAA;AAKA;AAAA;AAKA;AAAA;AAKA;AAAA;AAIA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAAA;AAGA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AAAA;AAGA;AACA;AAAA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAIA;AAHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAKA;AAEA;AAAA;AAMA;AACA;AACA;AACA;AAAA;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGA;AACA;AACA;AAAA;AAQA;AACA;AACA;AAAA;AAGA;AACA;AAAA;AAQA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AAAA;AAEA;AACA;AAAA;AAIA;AACA;AACA;AACA;AAAA;AAMA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AAIA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAKA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAAA;AAKA;AACA;AACA;AACA;AAAA;AAIA;AACA;AACA;AACA;AAAA;AAGA;AAAA;AAIA;AAAA;AAKA;AAAA;AAEA;AAAA;AAIA;AAAA;AAGA;AACA;AACA;AAAA;AAGA;AACA;AACA;AACA;AAAA;AAOA;AAAA;AACA;AAAA;AAIA;AAAA;AACA;AAAA;AAGA;AAAA;AAMA;AACA;AACA;AAAA;AAMA;AACA;AAAA;AAIA;AAAA;AAGA;AACA;AACA;AACA;AAAA;AAKA;AACA;AAAA;AAOA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AAAA;AAIA;AACA;AAAA;AAQA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AACA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AAAA;AAMA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGA;AACA;AACA;AACA;AAAA;AAMA;AACA;AAAA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAIA;AACA;AAGA;AACA;AAAA;AAIA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGA;AACA;AAAA;AAIA;AACA;AACA;AACA;AAAA;AAEA;AAAA;AAOA;AAAA;AAIA;AAAA;AAEA;AAAA;AAEA;AACA;AACA;AAAA;AAEA;AAAA;AAEA;AACA;AAAA;AAKA;AACA;AAAA;AAKA;AACA;AAAA;AAKA;AAAA;AAGA;AAAA;AAIA;AACA;AAAA;AAIA;AAAA;AAUA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;ACvmCA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;;;;;;;;;;;;;ACnDA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;;AChCA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACnBA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAIA;AACA;AACA;AACA;;;;;;;;;;;;;ACrFA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AAAA;;;;;;;;;;;;AC/BA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/js/addon-settings~addons~editor~fullscreen~player~playground.js b/js/addon-settings~addons~editor~fullscreen~player~playground.js new file mode 100644 index 0000000000000000000000000000000000000000..47b81101502a854415c9d9253c5bdc2dd3312979 --- /dev/null +++ b/js/addon-settings~addons~editor~fullscreen~player~playground.js @@ -0,0 +1,4831 @@ +(window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-settings~addons~editor~fullscreen~player~playground"],{ + +/***/ "./src/addons/addons/2d-color-picker/_manifest_entry.js": +/*!**************************************************************!*\ + !*** ./src/addons/addons/2d-color-picker/_manifest_entry.js ***! + \**************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "2D color picker", + "description": "Replaces saturation and brightness sliders in the costume editor with a 2D color picker. Hold Shift while dragging the cursor to change the values on a single axis.", + "tags": [], + "credits": [{ + "name": "Ucrash" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }], + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/ScratchHighlightFullwidthNumber/_manifest_entry.js": +/*!******************************************************************************!*\ + !*** ./src/addons/addons/ScratchHighlightFullwidthNumber/_manifest_entry.js ***! + \******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "全角数字をハイライト", + "description": "エラーの原因となる「0」から「9」の全角数字をハイライトして警告します。", + "credits": [{ + "name": "champierre", + "link": "https://github.com/champierre" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "dynamicDisable": true, + "tags": [], + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/better-img-uploads/_manifest_entry.js": +/*!*****************************************************************!*\ + !*** ./src/addons/addons/better-img-uploads/_manifest_entry.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "HD image uploads", + "description": "Adds a new button above the \"upload costume\" button that automatically converts uploaded bitmap images into SVG (vector) images to avoid losing quality.", + "tags": ["beta"], + "info": [{ + "type": "notice", + "text": "Avoid using the HD upload button if you plan to edit the image after uploading.", + "id": "notSuitableEdit" + }], + "credits": [{ + "name": "ErrorGamer2000", + "link": "https://scratch.mit.edu/users/ErrorGamer2000/" + }, { + "name": "GarboMuffin" + }, { + "name": "World_Languages" + }, { + "name": "SheepTester", + "link": "https://scratch.mit.edu/users/Sheep_maker/" + }], + "dynamicDisable": true, + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }], + "settings": [{ + "dynamic": true, + "name": "Image sizing", + "id": "fitting", + "type": "select", + "potentialValues": [{ + "id": "full", + "name": "Original size" + }, { + "id": "fill", + "name": "Stretch to fill stage" + }, { + "id": "fit", + "name": "Shrink to fit stage" + }], + "default": "fit" + }] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/bitmap-copy/_manifest_entry.js": +/*!**********************************************************!*\ + !*** ./src/addons/addons/bitmap-copy/_manifest_entry.js ***! + \**********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../environment */ "./src/addons/environment.js"); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Bitmap images copying", + "description": "Allows you to copy a bitmap image from the costume editor into the system clipboard, so that you can paste it in other websites or software.", + "info": [{ + "type": "notice", + "text": "\"Right click → copy\" is not supported. You must press Ctrl+C while a bitmap image is selected.", + "id": "norightclick" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "dynamicDisable": true, + "tags": [], + "enabledByDefault": true +}; + +if (!_environment__WEBPACK_IMPORTED_MODULE_0__["clipboardSupported"]) manifest.unsupported = true; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/block-cherry-picking/_manifest_entry.js": +/*!*******************************************************************!*\ + !*** ./src/addons/addons/block-cherry-picking/_manifest_entry.js ***! + \*******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Grab single block with Ctrl key", + "description": "Adds the ability to drag a single block out of the middle of a script (instead of the entire stack attached below it) while holding the Ctrl key.", + "info": [{ + "text": "On macOS, use the Cmd key instead of the Ctrl key.", + "id": "macContextDisabled" + }, { + "text": "If \"flip controls\" is enabled, grabbing blocks individually will be the default behavior. Hold Ctrl to drag the entire stack.", + "id": "flipControls" + }], + "credits": [{ + "name": "lisa_wolfgang", + "link": "https://scratch.mit.edu/users/lisa_wolfgang/" + }, { + "name": "GarboMuffin" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "settings": [{ + "dynamic": true, + "name": "Flip controls", + "id": "invertDrag", + "type": "boolean", + "default": false + }], + "tags": [], + "dynamicDisable": true, + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/block-count/_manifest_entry.js": +/*!**********************************************************!*\ + !*** ./src/addons/addons/block-count/_manifest_entry.js ***! + \**********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "enabledByDefault": true, + "editorOnly": true, + "name": "Block count", + "description": "Shows the total number of blocks in a project in the editor menu bar. Previously part of \"sprite and script count\".", + "tags": [], + "credits": [{ + "name": "TheColaber", + "link": "https://scratch.mit.edu/users/TheColaber/" + }], + "dynamicDisable": true, + "userscripts": [{ + "url": "blockcount.js" + }] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/block-duplicate/_manifest_entry.js": +/*!**************************************************************!*\ + !*** ./src/addons/addons/block-duplicate/_manifest_entry.js ***! + \**************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Duplicate script with Alt key", + "description": "Quickly duplicate a script by dragging it while holding the Alt key. Hold Ctrl as well to only duplicate a single block instead of the entire stack attached below it.", + "credits": [{ + "name": "GarboMuffin" + }], + "info": [{ + "text": "On macOS, use the Option key instead of the Alt key and Command key instead of the Control key.", + "id": "mac" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "dynamicDisable": true, + "tags": [], + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/block-palette-icons/_manifest_entry.js": +/*!******************************************************************!*\ + !*** ./src/addons/addons/block-palette-icons/_manifest_entry.js ***! + \******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Block palette category icons", + "description": "Adds icons inside the colored circles that identify block categories.", + "tags": ["theme"], + "enabledByDefault": false, + "dynamicDisable": true, + "userstyles": [{ + "url": "userstyle.css" + }], + "credits": [{ + "name": "--Explosion--", + "link": "https://scratch.mit.edu/users/--Explosion--/" + }, { + "name": "RedGuy7", + "link": "https://scratch.mit.edu/users/RedGuy7/" + }] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/block-switching/_manifest_entry.js": +/*!**************************************************************!*\ + !*** ./src/addons/addons/block-switching/_manifest_entry.js ***! + \**************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Block switching", + "description": "Right click on a block to switch it to a related block.", + "credits": [{ + "name": "GarboMuffin" + }, { + "name": "pufferfish101007", + "link": "https://scratch.mit.edu/users/pufferfish101007/" + }, { + "name": "JeremyGamer13", + "link": "https://penguinmod.com/profile?user=JGamerTesting" + }], + "dynamicDisable": true, + "userscripts": [{ + "url": "userscript.js" + }], + "tags": ["recommended"], + "settings": [{ + "dynamic": true, + "name": "Motion blocks", + "id": "motion", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Looks blocks", + "id": "looks", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Sound blocks", + "id": "sound", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Event blocks", + "id": "event", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Control blocks", + "id": "control", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Operator blocks", + "id": "operator", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Sensing blocks", + "id": "sensing", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Data blocks", + "id": "data", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Extension blocks", + "id": "extension", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Addon blocks", + "id": "sa", + "type": "boolean", + "default": true, + "if": { + "addonEnabled": ["debugger"] + } + }, { + "dynamic": true, + "name": "Custom block arguments", + "id": "customargs", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Shown custom block arguments options", + "id": "customargsmode", + "type": "select", + "default": "defOnly", + "potentialValues": [{ + "id": "defOnly", + "name": "Arguments in own custom block" + }, { + "id": "all", + "name": "Arguments in all custom blocks in sprite" + }], + "if": { + "settings": { + "customargs": true + } + } + }, { + "dynamic": true, + "name": "Show option to change block to self", + "id": "noop", + "type": "boolean", + "default": true + }], + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/blocks2image/_manifest_entry.js": +/*!***********************************************************!*\ + !*** ./src/addons/addons/blocks2image/_manifest_entry.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Save blocks as image", + "description": "Right click the code area to export blocks as SVG/PNG images.", + "tags": [], + "credits": [{ + "name": "summerscar" + }], + "dynamicDisable": true, + "userscripts": [{ + "url": "userscript.js" + }], + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/cat-blocks/_manifest_entry.js": +/*!*********************************************************!*\ + !*** ./src/addons/addons/cat-blocks/_manifest_entry.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Cat blocks", + "description": "Brings back editor cat hat blocks from April Fools 2020.", + "credits": [{ + "name": "TheColaber", + "link": "https://scratch.mit.edu/users/TheColaber/" + }, { + "name": "GarboMuffin" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "info": [{ + "type": "notice", + "text": "The \"watch mouse cursor\" setting may impact performance when the editor is open.", + "id": "watch" + }], + "settings": [{ + "id": "watch", + "name": "Watch mouse cursor", + "default": false, + "type": "boolean" + }], + "tags": ["theme"], + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/clones/_manifest_entry.js": +/*!*****************************************************!*\ + !*** ./src/addons/addons/clones/_manifest_entry.js ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Clone counter", + "description": "Adds a counter above the stage in the editor which shows the total amount of clones.", + "credits": [{ + "name": "Jeffalo" + }, { + "name": "OregSam", + "link": "https://scratch.mit.edu/users/simiagain/" + }], + "dynamicDisable": true, + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }], + "settings": [{ + "dynamic": true, + "id": "showicononly", + "name": "Show icon only", + "default": false, + "type": "boolean" + }], + "tags": ["recommended"], + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/color-picker/_manifest_entry.js": +/*!***********************************************************!*\ + !*** ./src/addons/addons/color-picker/_manifest_entry.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Hex color picker", + "description": "Adds hex code inputs to color pickers.", + "tags": ["recommended"], + "credits": [{ + "name": "Richie Bendall" + }, { + "name": "apple502j" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }], + "dynamicDisable": true, + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/columns/_manifest_entry.js": +/*!******************************************************!*\ + !*** ./src/addons/addons/columns/_manifest_entry.js ***! + \******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Two-column category menu", + "description": "Splits the block category menu into two columns and moves it to the top of the block palette, like in Scratch 2.0.", + "credits": [{ + "name": "TheColaber", + "link": "https://scratch.mit.edu/TheColaber" + }], + "tags": [], + "dynamicDisable": true, + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/custom-block-shape/_manifest_entry.js": +/*!*****************************************************************!*\ + !*** ./src/addons/addons/custom-block-shape/_manifest_entry.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Customizable block shape", + "description": "Adjust the padding, corner radius, and notch height of blocks.", + "tags": ["theme"], + "credits": [{ + "name": "SheepTester", + "link": "https://scratch.mit.edu/users/Sheep_maker/" + }, { + "name": "lisa_wolfgang", + "link": "https://scratch.mit.edu/users/lisa_wolfgang/" + }, { + "name": "GarboMuffin", + "link": "https://scratch.mit.edu/users/GarboMuffin/" + }], + "enabledByDefault": false, + "dynamicDisable": true, + "userscripts": [{ + "url": "userscript.js" + }], + "info": [{ + "type": "notice", + "text": "Decreasing the padding size is only visible to you, so when your projects are viewed by other users, your scripts may overlap.", + "id": "paddingWarning" + }], + "settings": [{ + "dynamic": true, + "name": "Padding size (50-200%)", + "id": "paddingSize", + "type": "integer", + "min": 50, + "default": 100, + "max": 200 + }, { + "dynamic": true, + "name": "Corner size (0-300%)", + "id": "cornerSize", + "type": "integer", + "min": 0, + "default": 100, + "max": 300 + }, { + "dynamic": true, + "name": "Notch height (0-150%)", + "id": "notchSize", + "type": "integer", + "min": 0, + "default": 100, + "max": 150 + }], + "presets": [{ + "name": "3.0 Blocks", + "id": "default3", + "description": "The regular appearance of Scratch 3.0 blocks", + "values": { + "paddingSize": 100, + "cornerSize": 100, + "notchSize": 100 + } + }, { + "name": "2.0 Blocks", + "id": "default2", + "description": "An appearance similar to Scratch 2.0 blocks", + "values": { + "paddingSize": 70, + "cornerSize": 150, + "notchSize": 75 + } + }, { + "name": "3.0 Flat", + "id": "flat3", + "description": "Scratch 3.0 blocks with notches and corners removed", + "values": { + "paddingSize": 100, + "cornerSize": 0, + "notchSize": 0 + } + }, { + "name": "2.0 Flat", + "id": "flat2", + "description": "Scratch 2.0 blocks with notches and corners removed", + "values": { + "paddingSize": 70, + "cornerSize": 0, + "notchSize": 0 + } + }] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/custom-block-text/_manifest_entry.js": +/*!****************************************************************!*\ + !*** ./src/addons/addons/custom-block-text/_manifest_entry.js ***! + \****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "name": "Customizable block text style", + "description": "Changes the thickness of the text on blocks and optionally adds a text shadow.", + "tags": [], + "credits": [{ + "name": "Secret-chest" + }, { + "name": "_nix", + "link": "https://scratch.mit.edu/users/_nix" + }], + "userstyles": [{ + "url": "text-bold.css", + "if": { + "settings": { + "bold": true + } + } + }, { + "url": "text-shadow.css", + "if": { + "settings": { + "shadow": true + } + } + }], + "settings": [{ + "dynamic": true, + "name": "Bold text", + "id": "bold", + "type": "boolean", + "default": false + }, { + "dynamic": true, + "name": "Shadow under text", + "id": "shadow", + "type": "boolean", + "default": false + }], + "dynamicDisable": true, + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/custom-zoom/_manifest_entry.js": +/*!**********************************************************!*\ + !*** ./src/addons/addons/custom-zoom/_manifest_entry.js ***! + \**********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Customizable code area zoom", + "description": "Choose custom settings for the minimum, maximum, speed, and start size of the zoom of scripts in the code area, and autohide the controls.", + "tags": [], + "credits": [{ + "name": "ErrorGamer2000", + "link": "https://scratch.mit.edu/users/ErrorGamer2000/" + }], + "enabledByDefault": true, + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }], + "settings": [{ + "dynamic": true, + "name": "Maximum Zoom (100-500%)", + "id": "maxZoom", + "type": "integer", + "min": 100, + "default": 500, + "max": 500 + }, { + "dynamic": true, + "name": "Minimum Zoom (1-100%)", + "id": "minZoom", + "type": "integer", + "min": 1, + "default": 1, + "max": 100 + }, { + "dynamic": true, + "name": "Start Zoom (50-500%)", + "id": "startZoom", + "type": "integer", + "min": 50, + "default": 68, + "max": 500 + }, { + "dynamic": true, + "name": "Zoom Speed (50-200%)", + "id": "zoomSpeed", + "type": "integer", + "min": 50, + "default": 100, + "max": 200 + }, { + "name": "Autohide Zoom Controls", + "id": "autohide", + "type": "boolean", + "default": false + }, { + "dynamic": true, + "name": "Autohide Animation Speed", + "id": "speed", + "type": "select", + "potentialValues": [{ + "id": "none", + "name": "Instant" + }, { + "id": "short", + "name": "Quick" + }, { + "id": "default", + "name": "Default" + }, { + "id": "long", + "name": "Slow" + }], + "default": "default", + "if": { + "settings": { + "autohide": true + } + } + }] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/debug-console/_manifest_entry.js": +/*!************************************************************!*\ + !*** ./src/addons/addons/debug-console/_manifest_entry.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../environment */ "./src/addons/environment.js"); +/* generated by pull.js */ +const manifest = { + "name": "Developer JS Console", + "description": "開発者用のJavascriptコンソール。これが何か分からない場合は無視してください。", + "tags": ["recommended"], + "userscripts": [{ + "url": "userscript.js" + }], + "enabledByDefault": true +}; + +if (!_environment__WEBPACK_IMPORTED_MODULE_0__["mediaRecorderSupported"]) manifest.unsupported = true; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/debugger/_manifest_entry.js": +/*!*******************************************************!*\ + !*** ./src/addons/addons/debugger/_manifest_entry.js ***! + \*******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Debugger", + "description": "Adds a new \"debugger\" window to the editor. Allows for logging into the \"Logs\" tab of the debugger window using the \"log\", \"warn\" and \"error\" blocks.", + "credits": [{ + "name": "Tacodiva", + "link": "https://scratch.mit.edu/users/Tacodiva7729/" + }, { + "name": "GarboMuffin" + }, { + "name": "GrahamSH" + }, { + "name": "TheColaber" + }, { + "name": "retronbv" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }], + "settings": [{ + "dynamic": true, + "name": "Clear logs on green flag", + "id": "log_clear_greenflag", + "type": "boolean", + "default": false + }, { + "dynamic": true, + "name": "Log green flag clicks", + "id": "log_greenflag", + "type": "boolean", + "default": false + }, { + "dynamic": true, + "name": "Log clone creation", + "id": "log_clone_create", + "type": "boolean", + "default": false + }, { + "dynamic": true, + "name": "Log when max clones exceeded", + "id": "log_failed_clone_creation", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Log broadcasts", + "id": "log_broadcasts", + "type": "boolean", + "default": false + }], + "tags": ["beta"], + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/default-costume-editor-color/_manifest_entry.js": +/*!***************************************************************************!*\ + !*** ./src/addons/addons/default-costume-editor-color/_manifest_entry.js ***! + \***************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Customizable default costume editor colors", + "description": "Changes the default colors and outline size used by the costume editor.", + "credits": [{ + "name": "GarboMuffin" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "settings": [{ + "dynamic": true, + "name": "Default fill color", + "id": "fill", + "type": "color", + "default": "#9966FF" + }, { + "dynamic": true, + "name": "Default outline color", + "id": "stroke", + "type": "color", + "default": "#000000" + }, { + "dynamic": true, + "name": "Default outline size", + "id": "strokeSize", + "type": "integer", + "min": 0, + "max": 100, + "default": 4 + }, { + "dynamic": true, + "name": "Use previous color instead of resetting after switching tools", + "id": "persistence", + "type": "boolean", + "default": true + }], + "tags": [], + "dynamicDisable": true, + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/disable-paste-offset/_manifest_entry.js": +/*!*******************************************************************!*\ + !*** ./src/addons/addons/disable-paste-offset/_manifest_entry.js ***! + \*******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Do not shift pasted items", + "description": "Paste copied items at their original position instead of shifted slightly in the costume editor.", + "info": [{ + "text": "This behavior can also be achieved without this addon by Alt+Clicking the item.", + "id": "vanilla" + }], + "credits": [{ + "name": "GarboMuffin" + }], + "dynamicDisable": true, + "userscripts": [{ + "url": "userscript.js" + }], + "tags": [], + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/disable-stage-drag-select/_manifest_entry.js": +/*!************************************************************************!*\ + !*** ./src/addons/addons/disable-stage-drag-select/_manifest_entry.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Non-draggable sprites in editor", + "description": "Removes the ability to drag sprites around on the stage in the editor, except those explicitly set as draggable. Hold Shift while dragging a sprite to move it normally.", + "credits": [{ + "name": "Chrome_Cat", + "link": "https://scratch.mit.edu/users/Chrome_Cat/" + }, { + "name": "GarboMuffin" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "tags": [], + "enabledByDefault": false, + "dynamicDisable": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/drag-drop/_manifest_entry.js": +/*!********************************************************!*\ + !*** ./src/addons/addons/drag-drop/_manifest_entry.js ***! + \********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "noTranslations": true, + "name": "File drag and drop", + "description": "Lets you drag images and sounds from your file manager into the sprite pane or costume/sound list. You can also drag text files into lists or \"ask and wait\" question inputs.", + "credits": [{ + "name": "Sheep_maker" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "settings": [{ + "dynamic": true, + "id": "use-hd-upload", + "name": "Use HD uploads", + "type": "boolean", + "default": false, + "if": { + "addonEnabled": "better-img-uploads" + } + }], + "dynamicDisable": true, + "tags": ["recommended"], + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/editor-animations/_manifest_entry.js": +/*!****************************************************************!*\ + !*** ./src/addons/addons/editor-animations/_manifest_entry.js ***! + \****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Editor Animations", + "description": "Adds smooth animations to various aspects of the editor!", + "credits": [{ + "name": "reflow" + }, { + "name": "SharkPool" + }], + "info": [{ + "type": "notice", + "text": "This addon will not take effect if you have animations turned off on your system. See https://mgik.dev/turn-on-motion for how to turn it on.", + "id": "reduced-motion-notice" + }, { + "type": "notice", + "text": "Some animation types don't support animation direction; therefore, the animation direction may be ignored.", + "id": "animation-support" + }], + "settings": [{ + "id": "animateButtons", + "name": "Animate Buttons", + "default": true, + "dynamic": true, + "type": "boolean" + }, { + "id": "animateLibraries", + "name": "Animate Libraries (costumes, sprites, sounds, etc)", + "default": true, + "dynamic": true, + "type": "boolean" + }, { + "id": "animateModals", + "name": "Animate Modals (create variable/list, custom block, etc)", + "default": true, + "dynamic": true, + "type": "boolean" + }, { + "id": "animateSpeed", + "name": "Animation Speed (1-500%)", + "type": "integer", + "dynamic": true, + "min": 1, + "default": 100, + "max": 500 + }, { + "id": "animationType", + "name": "Animation Type", + "type": "select", + "dynamic": true, + "default": "default", + "potentialValues": [{ + "id": "default", + "name": "Default" + }, { + "id": "ease", + "name": "Ease" + }, { + "id": "smoothStep", + "name": "Smooth Step" + }, { + "id": "fastInSlowOut", + "name": "Fast In Slow Out" + }, { + "id": "sine", + "name": "Sine" + }, { + "id": "quad", + "name": "Quadratic" + }, { + "id": "cubic", + "name": "Cubic" + }, { + "id": "quart", + "name": "Quartic" + }, { + "id": "quint", + "name": "Quintic" + }, { + "id": "back", + "name": "Back" + }, { + "id": "elastic", + "name": "Elastic" + }, { + "id": "bounce", + "name": "Bounce" + }, { + "id": "emphasis", + "name": "Emphasis" + }] + }, { + "id": "animationDir", + "name": "Animation Direction", + "type": "select", + "dynamic": true, + "default": "InOut", + "potentialValues": [{ + "id": "In", + "name": "In" + }, { + "id": "Out", + "name": "Out" + }, { + "id": "InOut", + "name": "Both" + }] + }], + "userscripts": [{ + "url": "userscript.js" + }], + "tags": ["new", "theme"], + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/editor-block-chomping/_manifest_entry.js": +/*!********************************************************************!*\ + !*** ./src/addons/addons/editor-block-chomping/_manifest_entry.js ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "name": "Extend wrapped C blocks", + "description": "Makes C blocks extend when wrapping them around blocks, like in Scratch 2.0.", + "credits": [{ + "name": "CST1229", + "link": "https://github.com/CST1229/" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "tags": ["editor", "codeEditor", "new", "beta"], + "enabledByDefault": false, + "dynamicEnable": true, + "dynamicDisable": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/editor-buttons-reverse-order/_manifest_entry.js": +/*!***************************************************************************!*\ + !*** ./src/addons/addons/editor-buttons-reverse-order/_manifest_entry.js ***! + \***************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "name": "Reverse order of project controls", + "description": "Moves the green flag and stop buttons to the right and the full screen button to the left, like in Scratch 2.0.", + "tags": ["theme"], + "dynamicDisable": true, + "userstyles": [{ + "url": "userstyle.css" + }] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/editor-colored-context-menus/_manifest_entry.js": +/*!***************************************************************************!*\ + !*** ./src/addons/addons/editor-colored-context-menus/_manifest_entry.js ***! + \***************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Colored context menus", + "description": "Makes block right click context menus colorful.", + "credits": [{ + "name": "GarboMuffin" + }], + "dynamicDisable": true, + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "userscript.css" + }], + "tags": ["theme"], + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/editor-comment-previews/_manifest_entry.js": +/*!**********************************************************************!*\ + !*** ./src/addons/addons/editor-comment-previews/_manifest_entry.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Editor comment previews", + "description": "Allows you to preview the contents of comments by hovering over collapsed comments and blocks. You can use this to view comments that are off-screen, identify a loop block from the bottom by its preview, fit many long comments in a small space, and more.", + "tags": [], + "credits": [{ + "name": "lisa_wolfgang", + "link": "https://scratch.mit.edu/users/lisa_wolfgang/" + }, { + "name": "GarboMuffin" + }], + "userstyles": [{ + "url": "userstyle.css" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "settings": [{ + "dynamic": true, + "name": "Hover collapsed comments to preview", + "id": "hover-view", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Hover blocks to preview attached comments", + "id": "hover-view-block", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Hover custom blocks to preview definition comments", + "id": "hover-view-procedure", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Delay duration", + "id": "delay", + "type": "select", + "potentialValues": [{ + "name": "None", + "id": "none" + }, { + "name": "Short", + "id": "short" + }, { + "name": "Long", + "id": "long" + }], + "default": "short" + }, { + "dynamic": true, + "name": "Follow mouse", + "id": "follow-mouse", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Reduce transparency", + "id": "reduce-transparency", + "type": "boolean", + "default": false + }, { + "dynamic": true, + "name": "Reduce animation", + "id": "reduce-animation", + "type": "boolean", + "default": false + }], + "dynamicDisable": true, + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/editor-extra-keys/_manifest_entry.js": +/*!****************************************************************!*\ + !*** ./src/addons/addons/editor-extra-keys/_manifest_entry.js ***! + \****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Extra key options", + "description": "Adds more keys to the \"key () pressed?\" and \"when () key pressed\" block dropdowns, such as enter, dot, comma, and more. These keys will work even for users who do not have this addon.", + "tags": ["beta"], + "credits": [{ + "name": "Tacodiva", + "link": "https://scratch.mit.edu/users/Tacodiva7729/" + }], + "info": [{ + "type": "notice", + "text": "The \"experimental keys\" include equals, slash, semicolon and more. They may not work on all operating systems or keyboard layouts.", + "id": "experimentalKeysWarn" + }, { + "type": "notice", + "text": "The \"Shift keys\" include keys which typically require the Shift key and a number key, like hashtag, exclamation mark and more. These keys only work with the \"when () key pressed\" block and do not work on all operating systems or keyboard layouts.", + "id": "shiftKeysWarn" + }, { + "type": "warning", + "text": "The \"TurboWarp keys\" will only work in TurboWarp, not in Scratch.", + "id": "twKeysWarn" + }], + "settings": [{ + "dynamic": true, + "name": "Show experimental keys", + "id": "experimentalKeys", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Show Shift keys", + "id": "shiftKeys", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Show TurboWarp keys", + "id": "twKeys", + "type": "boolean", + "default": true + }], + "userscripts": [{ + "url": "userscript.js" + }], + "dynamicDisable": true, + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/editor-searchable-dropdowns/_manifest_entry.js": +/*!**************************************************************************!*\ + !*** ./src/addons/addons/editor-searchable-dropdowns/_manifest_entry.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../environment */ "./src/addons/environment.js"); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Searchable dropdowns", + "description": "Allows you to search block dropdowns.", + "credits": [{ + "name": "GarboMuffin" + }], + "dynamicDisable": true, + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "userscript.css" + }], + "tags": ["recommended"], + "enabledByDefault": true +}; + +if (_environment__WEBPACK_IMPORTED_MODULE_0__["isMobile"]) manifest.enabledByDefault = false; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/editor-sounds/_manifest_entry.js": +/*!************************************************************!*\ + !*** ./src/addons/addons/editor-sounds/_manifest_entry.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Editor sound effects", + "description": "Plays sound effects when you connect or delete blocks.", + "credits": [{ + "name": "GarboMuffin" + }], + "dynamicDisable": true, + "userscripts": [{ + "url": "userscript.js" + }], + "tags": [], + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/editor-stage-left/_manifest_entry.js": +/*!****************************************************************!*\ + !*** ./src/addons/addons/editor-stage-left/_manifest_entry.js ***! + \****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "noTranslations": true, + "name": "Display stage on left side", + "description": "Moves the stage to the left side of the editor, like in Scratch 2.0.", + "info": [{ + "id": "reverseOrder", + "text": "To change the position of buttons above the stage, use the \"reverse order of project controls\" addon." + }], + "credits": [{ + "name": "NitroCipher/ZenithRogue" + }], + "userscripts": [{ + "url": "fix-share-the-love.js" + }], + "dynamicDisable": true, + "userstyles": [{ + "url": "stageleft.css" + }], + "tags": ["theme"], + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/editor-theme3/_manifest_entry.js": +/*!************************************************************!*\ + !*** ./src/addons/addons/editor-theme3/_manifest_entry.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Customizable block colors", + "description": "Edit block colors for each category in the editor.", + "credits": [{ + "name": "NitroCipher/ZenithRogue" + }, { + "name": "TheColaber", + "link": "https://scratch.mit.edu/users/TheColaber/" + }], + "customCssVariables": [{ + "name": "inputColor-text", + "value": { + "type": "alphaThreshold", + "source": { + "type": "settingValue", + "settingId": "input-color" + }, + "opaque": { + "type": "textColor", + "source": { + "type": "settingValue", + "settingId": "input-color" + } + }, + "transparent": { + "type": "map", + "source": { + "type": "settingValue", + "settingId": "text" + }, + "options": { + "white": "#ffffff", + "black": "#575e75", + "colorOnWhite": "#575e75", + "colorOnBlack": "#ffffff" + } + } + } + }, { + "name": "inputColor-blackText", + "value": { + "type": "alphaThreshold", + "source": { + "type": "settingValue", + "settingId": "input-color" + }, + "opaque": { + "type": "textColor", + "black": "#000000", + "source": { + "type": "settingValue", + "settingId": "input-color" + } + }, + "transparent": { + "type": "map", + "source": { + "type": "settingValue", + "settingId": "text" + }, + "options": { + "white": "#ffffff", + "black": "#000000", + "colorOnWhite": "#000000", + "colorOnBlack": "#ffffff" + } + } + } + }, { + "name": "commentText", + "value": { + "type": "textColor", + "source": { + "type": "settingValue", + "settingId": "comment-color" + } + } + }, { + "name": "commentTextTransparent", + "value": { + "type": "textColor", + "black": "rgba(0, 0, 0, 0.50)", + "white": "rgba(255, 255, 255, 0.50)", + "source": { + "type": "settingValue", + "settingId": "comment-color" + } + } + }, { + "name": "commentBorder", + "value": { + "type": "multiply", + "source": { + "type": "settingValue", + "settingId": "comment-color" + }, + "r": 0.7, + "g": 0.7, + "b": 0.7 + } + }], + "dynamicDisable": true, + "userscripts": [{ + "url": "theme3.js" + }], + "userstyles": [{ + "url": "theme3.css" + }, { + "url": "black_text.css", + "if": { + "settings": { + "text": "black" + } + } + }, { + "url": "color_on_white.css", + "if": { + "settings": { + "text": "colorOnWhite" + } + } + }, { + "url": "color_on_black.css", + "if": { + "settings": { + "text": "colorOnBlack" + } + } + }], + "settings": [{ + "dynamic": true, + "name": "motion", + "id": "motion-color", + "type": "color", + "default": "#4C97FF", + "allowTransparency": true + }, { + "dynamic": true, + "name": "looks", + "id": "looks-color", + "type": "color", + "default": "#9966FF", + "allowTransparency": true + }, { + "dynamic": true, + "name": "sounds", + "id": "sounds-color", + "type": "color", + "default": "#CF63CF", + "allowTransparency": true + }, { + "dynamic": true, + "name": "events", + "id": "events-color", + "type": "color", + "default": "#FFBF00", + "allowTransparency": true + }, { + "dynamic": true, + "name": "control", + "id": "control-color", + "type": "color", + "default": "#FFAB19", + "allowTransparency": true + }, { + "dynamic": true, + "name": "sensing", + "id": "sensing-color", + "type": "color", + "default": "#5CB1D6", + "allowTransparency": true + }, { + "dynamic": true, + "name": "operators", + "id": "operators-color", + "type": "color", + "default": "#59C059", + "allowTransparency": true + }, { + "dynamic": true, + "name": "variables", + "id": "data-color", + "type": "color", + "default": "#FF8C1A", + "allowTransparency": true + }, { + "dynamic": true, + "name": "lists", + "id": "data-lists-color", + "type": "color", + "default": "#FF661A", + "allowTransparency": true + }, { + "dynamic": true, + "name": "custom", + "id": "custom-color", + "type": "color", + "default": "#FF6680", + "allowTransparency": true + }, { + "dynamic": true, + "name": "extensions", + "id": "Pen-color", + "type": "color", + "default": "#0FBD8C", + "allowTransparency": true + }, { + "dynamic": true, + "name": "TurboWarp", + "id": "tw-color", + "type": "color", + "default": "#ff4c4c", + "allowTransparency": true + }, { + "dynamic": true, + "name": "Addon blocks", + "id": "sa-color", + "type": "color", + "default": "#29BEB8", + "allowTransparency": true, + "if": { + "addonEnabled": ["debugger"] + } + }, { + "dynamic": true, + "name": "Block inputs", + "id": "input-color", + "type": "color", + "default": "#FFFFFF", + "allowTransparency": true + }, { + "dynamic": true, + "name": "Comments", + "id": "comment-color", + "type": "color", + "default": "#FEF49C" + }, { + "dynamic": true, + "name": "Text color", + "id": "text", + "type": "select", + "default": "white", + "potentialValues": [{ + "id": "white", + "name": "White" + }, { + "id": "black", + "name": "Black" + }, { + "id": "colorOnWhite", + "name": "Colored on white background" + }, { + "id": "colorOnBlack", + "name": "Colored on black background" + }] + }], + "tags": ["theme"], + "enabledByDefault": false, + "presets": [{ + "name": "3.0 Tweaks", + "id": "tweaks", + "description": "Events, Control, and Custom blocks with 2.0 inspired colors", + "values": { + "motion-color": "#4C97FF", + "looks-color": "#9966FF", + "sounds-color": "#CF63CF", + "events-color": "#DE9E2E", + "control-color": "#FFBF00", + "sensing-color": "#5CB1D6", + "operators-color": "#59C059", + "data-color": "#FF8C1A", + "data-lists-color": "#FF661A", + "custom-color": "#5f49d8", + "Pen-color": "#0FBD8C", + "sa-color": "#29BEB8", + "comment-color": "#FEF49C", + "input-color": "#FFFFFF", + "text": "white" + } + }, { + "name": "2.0 Colors", + "id": "original", + "description": "The original block colors from Scratch 2.0", + "values": { + "motion-color": "#4a6cd4", + "looks-color": "#8a55d7", + "sounds-color": "#bb42c3", + "events-color": "#c88330", + "control-color": "#e1a91a", + "sensing-color": "#2ca5e2", + "operators-color": "#5cb712", + "data-color": "#ee7d16", + "data-lists-color": "#cc5b22", + "custom-color": "#632d99", + "Pen-color": "#0e9a6c", + "sa-color": "#29beb8", + "comment-color": "#FFFFD2", + "input-color": "#ffffff", + "text": "white" + } + }, { + "name": "Dark", + "id": "dark", + "description": "Dark versions of the default colors", + "values": { + "motion-color": "#004099", + "looks-color": "#220066", + "sounds-color": "#752475", + "events-color": "#997300", + "control-color": "#664100", + "sensing-color": "#1f5f7a", + "operators-color": "#235c23", + "data-color": "#b35900", + "data-lists-color": "#993300", + "custom-color": "#99004d", + "Pen-color": "#064734", + "tw-color": "#660000", + "sa-color": "#166966", + "comment-color": "#423f24", + "input-color": "#202020", + "text": "white" + } + }, { + "name": "Black", + "id": "black", + "description": "Makes block backgrounds black", + "values": { + "motion-color": "#4C97FF", + "looks-color": "#9966FF", + "sounds-color": "#CF63CF", + "events-color": "#FFBF00", + "control-color": "#FFAB19", + "sensing-color": "#5CB1D6", + "operators-color": "#59C059", + "data-color": "#FF8C1A", + "data-lists-color": "#FF661A", + "custom-color": "#FF6680", + "Pen-color": "#0FBD8C", + "sa-color": "#29BEB8", + "comment-color": "#FEF49C", + "input-color": "#202020", + "text": "colorOnBlack" + } + }] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/find-bar/_manifest_entry.js": +/*!*******************************************************!*\ + !*** ./src/addons/addons/find-bar/_manifest_entry.js ***! + \*******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Editor find bar", + "description": "Adds a find bar to find and jump to scripts, costumes and sounds next to the sounds tab. Use Ctrl+Left and Ctrl+Right in the code area to navigate to previous or next visited position after using the find bar.", + "info": [{ + "text": "This addon was previously part of the \"developer tools\" addon but has moved here.", + "id": "developer-tools" + }], + "credits": [{ + "name": "griffpatch" + }, { + "name": "TheColaber", + "link": "https://scratch.mit.edu/users/thecolaber/" + }], + "dynamicDisable": true, + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "userstyle.css" + }], + "tags": ["recommended"], + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/folders/_manifest_entry.js": +/*!******************************************************!*\ + !*** ./src/addons/addons/folders/_manifest_entry.js ***! + \******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Sprite folders", + "description": "Adds folders to the sprite pane, as well as costume and sound lists. To create a folder, right click any sprite and click \"create folder\". Click a folder to open or close it. Right click a sprite to see what folders you can move it to, or alternatively drag and drop it into an open folder. This feature works by adding \"[folderName]//\" at the beginning of the names for your sprites.", + "info": [{ + "type": "notice", + "text": "Users with this feature enabled will be able to see the folders in your project. Anyone else will see sprite lists normally (no folders).", + "id": "notice-folders-are-public" + }], + "credits": [{ + "name": "GarboMuffin" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }], + "tags": ["recommended"], + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/fps/_manifest_entry.js": +/*!**************************************************!*\ + !*** ./src/addons/addons/fps/_manifest_entry.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../environment */ "./src/addons/environment.js"); +/* generated by pull.js */ +const manifest = { + "name": "FPS", + "description": "FPS(処理速度)を常に表示します。", + "tags": ["recommended"], + "userscripts": [{ + "url": "userscript.js" + }], + "enabledByDefault": true +}; + +if (!_environment__WEBPACK_IMPORTED_MODULE_0__["mediaRecorderSupported"]) manifest.unsupported = true; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/fullscreen/_manifest_entry.js": +/*!*********************************************************!*\ + !*** ./src/addons/addons/fullscreen/_manifest_entry.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "name": "Enhanced full screen", + "description": "Fixes some undesired effects in the project player's full screen mode, opens it in your browser's full screen mode, and hides the green flag toolbar.", + "credits": [{ + "name": "lisa_wolfgang", + "link": "https://scratch.mit.edu/users/lisa_wolfgang/" + }], + "info": [{ + "type": "notice", + "text": "If you choose to hide the toolbar, remember that you can use the Esc key to exit the project player's full screen mode.", + "id": "hideToolbarNotice" + }], + "settings": [{ + "dynamic": true, + "name": "Open full screen project player in full screen browser mode", + "id": "browserFullscreen", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Hide toolbar in full screen", + "id": "hideToolbar", + "type": "boolean", + "default": false + }], + "dynamicDisable": true, + "userstyles": [{ + "url": "hideOverflow.css" + }, { + "url": "removeBorder.css" + }, { + "url": "resizeWindow.css", + "if": { + "settings": { + "hideToolbar": false + } + } + }, { + "url": "resizeWindow_noToolbar.css", + "if": { + "settings": { + "hideToolbar": true + } + } + }, { + "url": "hideToolbar.css", + "if": { + "settings": { + "hideToolbar": true + } + } + }], + "userscripts": [{ + "url": "userscript.js" + }], + "tags": ["beta"], + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/gamepad/_manifest_entry.js": +/*!******************************************************!*\ + !*** ./src/addons/addons/gamepad/_manifest_entry.js ***! + \******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "name": "Gamepad support", + "description": "Interact with projects using a USB or Bluetooth controller/gamepad.", + "credits": [{ + "name": "GarboMuffin" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }, { + "url": "gamepadlib.css" + }], + "settings": [{ + "dynamic": true, + "name": "Hide settings button when no controllers detected", + "type": "boolean", + "default": false, + "id": "hide" + }], + "tags": [], + "enabledByDefault": false, + "dynamicDisable": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/hide-delete-button/_manifest_entry.js": +/*!*****************************************************************!*\ + !*** ./src/addons/addons/hide-delete-button/_manifest_entry.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "name": "Hide delete button", + "description": "Hides delete button (trash can icon) from sprites, costumes and sounds. They can still be deleted using the right click context menu.", + "tags": [], + "dynamicDisable": true, + "settings": [{ + "dynamic": true, + "name": "Sprites", + "id": "sprites", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Costumes and backdrops", + "id": "costumes", + "type": "boolean", + "default": true + }, { + "dynamic": true, + "name": "Sounds", + "id": "sounds", + "type": "boolean", + "default": true + }], + "userstyles": [{ + "url": "sprites.css", + "if": { + "settings": { + "sprites": true + } + } + }, { + "url": "costumes.css", + "if": { + "settings": { + "costumes": true + } + } + }, { + "url": "sounds.css", + "if": { + "settings": { + "sounds": true + } + } + }] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/hide-flyout/_manifest_entry.js": +/*!**********************************************************!*\ + !*** ./src/addons/addons/hide-flyout/_manifest_entry.js ***! + \**********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Auto-hiding block palette", + "description": "Hides the block palette if not hovered. Click the lock icon to lock it in place temporarily. Alternatively, use \"category click\" mode.", + "credits": [{ + "name": "TheColaber", + "link": "https://scratch.mit.edu/users/TheColaber/" + }, { + "name": "Maximouse", + "link": "https://scratch.mit.edu/users/Maximouse/" + }], + "info": [{ + "text": "\"Palette area hover\" mode only extends the viewing area. If you want to be able to drag blocks into that area without them getting trashed, use one of the other modes.", + "id": "hoverExplanation" + }], + "dynamicDisable": true, + "customCssVariables": [{ + "name": "lockDisplay", + "value": { + "type": "map", + "source": { + "type": "settingValue", + "settingId": "toggle" + }, + "options": { + "hover": "flex", + "cathover": "flex", + "category": "none" + } + } + }, { + "name": "placeholderDisplay", + "value": { + "type": "map", + "source": { + "type": "settingValue", + "settingId": "toggle" + }, + "options": { + "hover": "block", + "cathover": "none", + "category": "none" + } + } + }], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }], + "settings": [{ + "dynamic": true, + "name": "Toggle on...", + "id": "toggle", + "type": "select", + "potentialValues": [{ + "id": "hover", + "name": "Palette area hover" + }, { + "id": "cathover", + "name": "Category hover" + }, { + "id": "category", + "name": "Category click" + }], + "default": "cathover" + }, { + "dynamic": true, + "name": "Animation speed", + "id": "speed", + "type": "select", + "potentialValues": [{ + "id": "none", + "name": "Instant" + }, { + "id": "short", + "name": "Quick" + }, { + "id": "default", + "name": "Default" + }, { + "id": "long", + "name": "Slow" + }], + "default": "default" + }], + "tags": ["recommended"] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/hide-new-variables/_manifest_entry.js": +/*!*****************************************************************!*\ + !*** ./src/addons/addons/hide-new-variables/_manifest_entry.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Hide new variables", + "description": "Do not automatically create monitors for newly created variables or lists.", + "credits": [{ + "name": "GarboMuffin" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "tags": [], + "dynamicDisable": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/hide-stage/_manifest_entry.js": +/*!*********************************************************!*\ + !*** ./src/addons/addons/hide-stage/_manifest_entry.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Hide stage and sprite pane", + "description": "Adds a button next to the \"small stage\" and \"large stage\" buttons that hides the stage and the sprite pane, making the code area much larger.", + "credits": [{ + "name": "Maximouse", + "link": "https://scratch.mit.edu/users/Maximouse/" + }], + "dynamicDisable": true, + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }], + "tags": [] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/initialise-sprite-position/_manifest_entry.js": +/*!*************************************************************************!*\ + !*** ./src/addons/addons/initialise-sprite-position/_manifest_entry.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Customizable new sprite position", + "description": "Change the default x/y position of new sprites.", + "credits": [{ + "name": "pufferfish101007", + "link": "https://scratch.mit.edu/users/pufferfish101007/" + }], + "dynamicDisable": true, + "userscripts": [{ + "url": "userscript.js" + }], + "settings": [{ + "dynamic": true, + "id": "x", + "name": "X position", + "type": "integer", + "default": 0, + "min": -240, + "max": 240 + }, { + "dynamic": true, + "id": "y", + "name": "Y position", + "type": "integer", + "default": 0, + "min": -180, + "max": 180 + }, { + "dynamic": true, + "id": "library", + "name": "Randomize the position of library sprites", + "type": "boolean", + "default": false + }, { + "dynamic": true, + "id": "duplicate", + "name": "Behavior when duplicating sprites", + "type": "select", + "default": "randomize", + "potentialValues": [{ + "id": "custom", + "name": "Send to specified x/y values" + }, { + "id": "keep", + "name": "Keep the same as the original sprite" + }, { + "id": "randomize", + "name": "Randomize" + }] + }], + "tags": [], + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/jump-to-def/_manifest_entry.js": +/*!**********************************************************!*\ + !*** ./src/addons/addons/jump-to-def/_manifest_entry.js ***! + \**********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "name": "Jump to custom block definition", + "description": "Allows you to jump to a custom block's definition using the middle mouse button or Shift+Click on the block.", + "info": [{ + "text": "This addon was previously part of the \"developer tools\" addon but has moved here.", + "id": "developer-tools" + }], + "credits": [{ + "name": "griffpatch" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "tags": ["recommended"], + "enabledByDefault": true, + "dynamicDisable": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/load-extensions/_manifest_entry.js": +/*!**************************************************************!*\ + !*** ./src/addons/addons/load-extensions/_manifest_entry.js ***! + \**************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Automatically add extensions", + "description": "Auto-shows music, pen, and other extensions in the block category menu in the editor.", + "userscripts": [{ + "url": "userscript.js" + }], + "settings": [{ + "name": "Music", + "id": "music", + "type": "boolean", + "default": true + }, { + "name": "Pen", + "id": "pen", + "type": "boolean", + "default": true + }, { + "name": "Text to Speech", + "id": "text2speech", + "type": "boolean", + "default": false + }, { + "name": "Translate", + "id": "translate", + "type": "boolean", + "default": false + }], + "dynamicDisable": true, + "tags": [] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/mediarecorder/_manifest_entry.js": +/*!************************************************************!*\ + !*** ./src/addons/addons/mediarecorder/_manifest_entry.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../environment */ "./src/addons/environment.js"); +/* generated by pull.js */ +const manifest = { + "name": "Project video recorder", + "description": "Adds a \"start recording\" button to the editor menu bar that allows you to record the project's stage.", + "tags": ["recommended"], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }], + "enabledByDefault": true +}; + +if (!_environment__WEBPACK_IMPORTED_MODULE_0__["mediaRecorderSupported"]) manifest.unsupported = true; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/middle-click-popup/_manifest_entry.js": +/*!*****************************************************************!*\ + !*** ./src/addons/addons/middle-click-popup/_manifest_entry.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Insert blocks by name", + "description": "Middle click on the code area, use Ctrl+Space or Shift+Click to bring up a floating input box where you can type the name of a block (or parts of it) and drag the block into the code area. Hold Shift while dragging to avoid closing the box when adding multiple blocks at once.", + "credits": [{ + "name": "griffpatch" + }, { + "name": "TheColaber", + "link": "https://scratch.mit.edu/users/TheColaber/" + }, { + "name": "JeremyGamer13" + }], + "tags": ["recommended"], + "enabledByDefault": true, + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "userstyle.css" + }], + "settings": [{ + "name": "Popup Block Size", + "id": "popup_scale", + "type": "integer", + "min": 1, + "max": 100, + "default": 64 + }, { + "name": "Popup Default Width", + "id": "popup_width", + "type": "integer", + "min": 1, + "max": 100, + "default": 16 + }, { + "name": "Popup Max Search Height", + "id": "popup_max_height", + "type": "integer", + "min": 1, + "max": 100, + "default": 40 + }, { + "name": "Max Search Results", + "id": "popup_max_search", + "type": "integer", + "min": 1, + "max": 1000, + "default": 100 + }, { + "name": "Max Object Variants", + "id": "popup_max_variants", + "type": "integer", + "min": 1, + "max": 1000, + "default": 7 + }], + "info": [{ + "text": "This addon was previously part of the \"developer tools\" addon but has moved here.", + "id": "developer-tools" + }, { + "text": "Changing the \"Max Object Variants\" will limit the amount of results that just use a different costume, sprite, sound or menu option selected in the block.", + "id": "maxObjectVariants" + }] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/mouse-pos/_manifest_entry.js": +/*!********************************************************!*\ + !*** ./src/addons/addons/mouse-pos/_manifest_entry.js ***! + \********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Mouse position", + "description": "Displays your mouse x/y position above the stage in the editor.", + "credits": [{ + "name": "Jeffalo" + }], + "dynamicDisable": true, + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }], + "tags": ["recommended"], + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/move-to-top-bottom/_manifest_entry.js": +/*!*****************************************************************!*\ + !*** ./src/addons/addons/move-to-top-bottom/_manifest_entry.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "enabledByDefault": true, + "editorOnly": true, + "name": "Move costume to top or bottom", + "description": "Adds options to the right click context menu for costumes and sounds to move them to the top or the bottom of the list.", + "info": [{ + "text": "This addon was previously part of the \"developer tools\" addon but has moved here.", + "id": "developer-tools" + }], + "tags": [], + "userscripts": [{ + "url": "userscript.js" + }], + "dynamicDisable": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/multi-tab-code/_manifest_entry.js": +/*!*************************************************************!*\ + !*** ./src/addons/addons/multi-tab-code/_manifest_entry.js ***! + \*************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Code Editor Tabbing", + "description": "Adds tabs to the code editor, allowing you to divide many scripts from inside one sprite in to seperate parts.", + "info": [], + "credits": [{ + "name": "RedMan13", + "link": "https://github.com/RedMan13" + }], + "dynamicEnable": false, + "dynamicDisable": false, + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "userstyle.css" + }], + "settings": [{ + "type": "boolean", + "id": "shouldDelete", + "name": "Merge tabs on delete", + "default": true, + "description": "If we should keep blocks from deleted tabs, moving them into the new selected tab, or if we should delete blocks inside a deleted tab." + }, { + "type": "boolean", + "id": "moveOnDrag", + "name": "Move blocks into tabs", + "default": false, + "description": "If, when blocks are dragged over a tab, we should copy blocks into the tab or move the selected blocks into the tab." + }], + "tags": [], + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/mute-project/_manifest_entry.js": +/*!***********************************************************!*\ + !*** ./src/addons/addons/mute-project/_manifest_entry.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "noTranslations": true, + "name": "Muted project player mode", + "description": "Ctrl+Click the green flag to mute/unmute the project.", + "info": [{ + "text": "On macOS, use the Cmd key instead of the Ctrl key.", + "id": "macOS" + }], + "credits": [{ + "name": "TheColaber", + "link": "https://scratch.mit.edu/users/TheColaber/" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "dynamicDisable": true, + "enabledByDefault": true, + "tags": ["recommended"] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/no-script-bumping/_manifest_entry.js": +/*!****************************************************************!*\ + !*** ./src/addons/addons/no-script-bumping/_manifest_entry.js ***! + \****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Do not automatically space overlapping scripts", + "description": "Allows scripts to be moved and modified without causing overlapping scripts to move around.", + "credits": [{ + "name": "GarboMuffin" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "dynamicDisable": true, + "tags": [], + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/number-pad/_manifest_entry.js": +/*!*********************************************************!*\ + !*** ./src/addons/addons/number-pad/_manifest_entry.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Always show number pad", + "description": "Show Scratch's number pad input when editing number fields on all devices, instead of only touchscreen devices.", + "credits": [{ + "name": "GarboMuffin" + }], + "info": [{ + "text": "A number pad will show when editing number inputs from certain blocks, such as \"set x to\".", + "id": "explanation" + }], + "tags": [], + "userscripts": [{ + "url": "userscript.js" + }], + "dynamicDisable": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/onion-skinning/_manifest_entry.js": +/*!*************************************************************!*\ + !*** ./src/addons/addons/onion-skinning/_manifest_entry.js ***! + \*************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Onion skinning", + "description": "Shows transparent overlays of previous or next costumes when editing a costume. Controlled by buttons under the costume editor by the zoom buttons.", + "credits": [{ + "name": "GarboMuffin" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }], + "settings": [{ + "id": "default", + "name": "Enable by default", + "type": "boolean", + "default": false + }, { + "id": "previous", + "name": "Default previous costumes", + "type": "integer", + "default": 1, + "min": 0, + "max": 100 + }, { + "id": "next", + "name": "Default next costumes", + "type": "integer", + "default": 0, + "min": 0, + "max": 100 + }, { + "id": "opacity", + "name": "Opacity (%)", + "type": "integer", + "min": 0, + "max": 100, + "default": 25 + }, { + "id": "opacityStep", + "name": "Opacity Step (%)", + "type": "integer", + "min": 0, + "max": 100, + "default": 10 + }, { + "id": "layering", + "name": "Default layering", + "type": "select", + "default": "front", + "potentialValues": [{ + "id": "front", + "name": "Front" + }, { + "id": "behind", + "name": "Behind" + }] + }, { + "id": "mode", + "name": "Default mode", + "type": "select", + "default": "merge", + "potentialValues": [{ + "id": "merge", + "name": "Merge images" + }, { + "id": "tint", + "name": "Color tint" + }] + }, { + "name": "Previous costume tint", + "id": "beforeTint", + "type": "color", + "default": "#FF0000" + }, { + "name": "Next costume tint", + "id": "afterTint", + "type": "color", + "default": "#0000FF" + }], + "tags": ["recommended"], + "dynamicDisable": true, + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/paint-by-default/_manifest_entry.js": +/*!***************************************************************!*\ + !*** ./src/addons/addons/paint-by-default/_manifest_entry.js ***! + \***************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Paint costume by default", + "description": "Changes the default action of \"Choose a Sprite/Costume/Backdrop/Sound\" buttons, which open the library by default.", + "credits": [{ + "name": "GarboMuffin" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "settings": [{ + "dynamic": true, + "id": "sprite", + "name": "Add sprite", + "type": "select", + "potentialValues": [{ + "id": "library", + "name": "Library" + }, { + "id": "paint", + "name": "Paint" + }, { + "id": "surprise", + "name": "Surprise" + }, { + "id": "upload", + "name": "Upload" + }], + "default": "paint" + }, { + "dynamic": true, + "id": "costume", + "name": "Add costume", + "type": "select", + "potentialValues": [{ + "id": "library", + "name": "Library" + }, { + "id": "paint", + "name": "Paint" + }, { + "id": "surprise", + "name": "Surprise" + }, { + "id": "upload", + "name": "Upload" + }], + "default": "paint" + }, { + "dynamic": true, + "id": "backdrop", + "name": "Add backdrop", + "type": "select", + "potentialValues": [{ + "id": "library", + "name": "Library" + }, { + "id": "paint", + "name": "Paint" + }, { + "id": "surprise", + "name": "Surprise" + }, { + "id": "upload", + "name": "Upload" + }], + "default": "paint" + }, { + "dynamic": true, + "id": "sound", + "name": "Add sound", + "type": "select", + "potentialValues": [{ + "id": "library", + "name": "Library" + }, { + "id": "record", + "name": "Record" + }, { + "id": "surprise", + "name": "Surprise" + }, { + "id": "upload", + "name": "Upload" + }], + "default": "library" + }], + "dynamicDisable": true, + "tags": ["recommended"], + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/paint-default-smoothing/_manifest_entry.js": +/*!**********************************************************************!*\ + !*** ./src/addons/addons/paint-default-smoothing/_manifest_entry.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "noTranslations": true, + "name": "Custom default Brush, Eraser and Pen smoothing", + "description": "Makes the default values for Brush, Eraser and Pen smoothing configurable.", + "credits": [{ + "name": "JeremyGamer13" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "settings": [{ + "name": "Brush Smoothing", + "id": "brush", + "type": "integer", + "min": 0, + "max": 1000, + "default": 10 + }, { + "name": "Eraser Smoothing", + "id": "eraser", + "type": "integer", + "min": 0, + "max": 1000, + "default": 10 + }, { + "name": "Pen Smoothing", + "id": "pen", + "type": "integer", + "min": 0, + "max": 1000, + "default": 2 + }], + "dynamicEnable": true, + "dynamicDisable": true, + "enabledByDefault": false, + "tags": ["new"] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/paint-gradient-maker/_manifest_entry.js": +/*!*******************************************************************!*\ + !*** ./src/addons/addons/paint-gradient-maker/_manifest_entry.js ***! + \*******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "name": "Costume Gradient Editor", + "description": "Adds a custom gradient maker to the costume editor, available next to the other gradient options.", + "credits": [{ + "name": "SharkPool", + "link": "https://github.com/SharkPool-SP/" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "tags": ["editor", "new", "recommended"], + "enabledByDefault": true, + "dynamicEnable": true, + "dynamicDisable": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/paint-rounded-rect-seperate/_manifest_entry.js": +/*!**************************************************************************!*\ + !*** ./src/addons/addons/paint-rounded-rect-seperate/_manifest_entry.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "noTranslations": true, + "name": "Seperate Rectangle tool and Rounded Rectangle tool", + "description": "Adds a seperate Rounded Rectangle tool like in earlier versions of PenguinMod. Does not remove the rounding option from the current rectangle tool.", + "credits": [{ + "name": "JeremyGamer13" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "dynamicEnable": true, + "dynamicDisable": true, + "enabledByDefault": false, + "tags": ["new"] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/paint-snap/_manifest_entry.js": +/*!*********************************************************!*\ + !*** ./src/addons/addons/paint-snap/_manifest_entry.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "name": "Costume editor snapping", + "description": "Snap objects in the costume editor to bounding boxes and vector nodes.", + "tags": ["recommended"], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "userstyle.css" + }], + "settings": [{ + "type": "boolean", + "id": "enable-default", + "name": "Enable by default", + "default": true + }, { + "dynamic": true, + "type": "color", + "id": "guide-color", + "name": "Snapping guide color", + "default": "#ff0000", + "allowTransparency": true + }, { + "type": "boolean", + "id": "pageCenter", + "name": "Snap to page center", + "default": true + }, { + "type": "boolean", + "id": "pageAxes", + "name": "Snap to page x and y axes", + "default": true + }, { + "type": "boolean", + "id": "pageEdges", + "name": "Snap to page edges", + "default": true + }, { + "type": "boolean", + "id": "pageCorners", + "name": "Snap to page corners", + "default": true + }, { + "type": "boolean", + "id": "objectEdges", + "name": "Snap to object edges", + "default": true + }, { + "type": "boolean", + "id": "objectCenters", + "name": "Snap to object centers", + "default": true + }, { + "type": "boolean", + "id": "objectMidlines", + "name": "Snap to object midlines", + "default": true + }, { + "type": "boolean", + "id": "objectCorners", + "name": "Snap to object corners", + "default": true + }, { + "type": "boolean", + "id": "boxCenter", + "name": "Snap from selection box center", + "default": true + }, { + "type": "boolean", + "id": "boxCorners", + "name": "Snap from selection box corners", + "default": true + }, { + "type": "boolean", + "id": "boxEdgeMids", + "name": "Snap from selection box edge midpoints", + "default": true + }, { + "type": "positive_integer", + "id": "threshold", + "name": "Snapping distance", + "default": 10, + "min": 4, + "max": 100 + }], + "dynamicDisable": true, + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/paint-tool-panel/_manifest_entry.js": +/*!***************************************************************!*\ + !*** ./src/addons/addons/paint-tool-panel/_manifest_entry.js ***! + \***************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "name": "Costume Tool Panel", + "description": "Adds a tool menu to the costume editor, to manually edit object transforms and properties.", + "credits": [{ + "name": "SharkPool", + "link": "https://github.com/SharkPool-SP/" + }, { + "name": "DogeisCut", + "link": "https://github.com/DogeisCut/" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "tags": ["editor", "new", "recommended"], + "enabledByDefault": true, + "dynamicEnable": true, + "dynamicDisable": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/pick-colors-from-stage/_manifest_entry.js": +/*!*********************************************************************!*\ + !*** ./src/addons/addons/pick-colors-from-stage/_manifest_entry.js ***! + \*********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "enabledByDefault": true, + "name": "Select stage colors in the costume editor", + "description": "Allows the costume editor's eye dropper to also pick colors from the stage.", + "credits": [{ + "name": "GarboMuffin" + }], + "tags": [], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }], + "dynamicDisable": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/remove-curved-stage-border/_manifest_entry.js": +/*!*************************************************************************!*\ + !*** ./src/addons/addons/remove-curved-stage-border/_manifest_entry.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "noTranslations": true, + "name": "Remove curved stage border", + "description": "Removes the curved border around the stage, allowing you to see the corners.", + "tags": ["theme"], + "credits": [{ + "name": "Tacodiva", + "link": "https://scratch.mit.edu/users/Tacodiva7729/" + }], + "enabledByDefault": true, + "dynamicDisable": true, + "userstyles": [{ + "url": "remove-borders.css" + }] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/remove-sprite-confirm/_manifest_entry.js": +/*!********************************************************************!*\ + !*** ./src/addons/addons/remove-sprite-confirm/_manifest_entry.js ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Sprite deletion confirmation", + "description": "Asks if you're sure when deleting a sprite inside a project.", + "userscripts": [{ + "url": "userscript.js" + }], + "dynamicDisable": true, + "tags": ["recommended"], + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/reorder-custom-inputs/_manifest_entry.js": +/*!********************************************************************!*\ + !*** ./src/addons/addons/reorder-custom-inputs/_manifest_entry.js ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Rearrangeable custom block inputs", + "description": "Allows rearranging custom block parameters on the \"Make a block\" screen.", + "credits": [{ + "name": "Chrome_Cat", + "link": "https://scratch.mit.edu/users/Chrome_Cat/" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "arrows.css" + }], + "settings": [{ + "dynamic": true, + "name": "Insert new inputs after selected input", + "id": "InsertInputsAfter", + "type": "boolean", + "default": false + }], + "tags": ["recommended"], + "enabledByDefault": true, + "dynamicDisable": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/script-snap/_manifest_entry.js": +/*!**********************************************************!*\ + !*** ./src/addons/addons/script-snap/_manifest_entry.js ***! + \**********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Snap scripts to grid", + "description": "Drag a script to automatically align its position to the code area dots.", + "tags": [], + "credits": [{ + "name": "CST1229", + "link": "https://scratch.mit.edu/users/CST1229/" + }, { + "name": "TheColaber", + "link": "https://scratch.mit.edu/users/TheColaber/" + }, { + "name": "lisa_wolfgang", + "link": "https://scratch.mit.edu/users/lisa_wolfgang/" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "settings": [{ + "dynamic": true, + "name": "Grid size (px)", + "id": "grid", + "type": "integer", + "min": 1, + "default": 40 + }], + "presets": [{ + "name": "Whole-block", + "id": "whole-block", + "values": { + "grid": 48 + } + }, { + "name": "Half-block", + "id": "half-block", + "values": { + "grid": 24 + } + }, { + "name": "Default", + "id": "default", + "values": { + "grid": 40 + } + }], + "dynamicDisable": true, + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/search-sprites/_manifest_entry.js": +/*!*************************************************************!*\ + !*** ./src/addons/addons/search-sprites/_manifest_entry.js ***! + \*************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Search sprites by name", + "description": "Adds a search box to the sprite pane to search for sprites by name.", + "credits": [{ + "name": "BarelySmooth", + "link": "https://scratch.mit.edu/users/BarelySmooth/" + }, { + "name": "GarboMuffin" + }], + "userstyles": [{ + "url": "search-bar.css" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "dynamicDisable": true, + "tags": [], + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/sprite-properties/_manifest_entry.js": +/*!****************************************************************!*\ + !*** ./src/addons/addons/sprite-properties/_manifest_entry.js ***! + \****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Collapsing sprite properties", + "description": "Hides the sprite properties panel by default, like in Scratch 2.0. Use the info button on the currently selected sprite or double-click a sprite to show the properties panel again. To re-hide it, use the collapse button in the properties panel or double-click a sprite.", + "tags": ["recommended"], + "credits": [{ + "name": "lisa_wolfgang", + "link": "https://scratch.mit.edu/users/lisa_wolfgang/" + }], + "userstyles": [{ + "url": "userstyle.css" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "customCssVariables": [{ + "name": "transitionDuration", + "value": { + "type": "map", + "source": { + "type": "settingValue", + "settingId": "transitionDuration" + }, + "options": { + "none": "0s", + "short": "0.15s", + "default": "0.25s", + "long": "0.5s" + } + } + }], + "settings": [{ + "dynamic": true, + "name": "Automatically collapse when mouse leaves sprite panel", + "id": "autoCollapse", + "type": "boolean", + "default": false + }, { + "dynamic": true, + "name": "Collapse panel by default", + "id": "hideByDefault", + "type": "boolean", + "default": true, + "if": { + "settings": { + "autoCollapse": false + } + } + }, { + "dynamic": true, + "name": "Animation speed", + "id": "transitionDuration", + "type": "select", + "potentialValues": [{ + "id": "none", + "name": "Instant" + }, { + "id": "short", + "name": "Quick" + }, { + "id": "default", + "name": "Default" + }, { + "id": "long", + "name": "Slow" + }], + "default": "default" + }], + "dynamicDisable": true, + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/swap-local-global/_manifest_entry.js": +/*!****************************************************************!*\ + !*** ./src/addons/addons/swap-local-global/_manifest_entry.js ***! + \****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Switch variables between \"For all sprites\" and \"For this sprite only\"", + "description": "Adds more options when renaming an existing variable or list: allows changing between \"For all sprites\" and \"For this sprite only\" and whether variables are stored in the cloud. Also adds a new option when right clicking a variable/list to quickly change its scope.", + "credits": [{ + "name": "GarboMuffin" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "style.css" + }], + "tags": [], + "dynamicDisable": true, + "enabledByDefault": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/toolbox-category-drag/_manifest_entry.js": +/*!********************************************************************!*\ + !*** ./src/addons/addons/toolbox-category-drag/_manifest_entry.js ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "name": "Draggable Categories in Block Palette", + "description": "Allows you to click-and-hold categories in the block palette to re-arrange them.", + "credits": [{ + "name": "SharkPool", + "link": "https://github.com/SharkPool-SP/" + }], + "info": [{ + "type": "notice", + "text": "This addon is currently somewhat buggy when enabled alongside the \"Two-column category menu\" addon.", + "id": "draggable-incompatibility" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "userstyle.css" + }], + "tags": ["editor", "new", "recommended"], + "enabledByDefault": true, + "dynamicEnable": true, + "dynamicDisable": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/toolbox-full-blocks-on-hover/_manifest_entry.js": +/*!***************************************************************************!*\ + !*** ./src/addons/addons/toolbox-full-blocks-on-hover/_manifest_entry.js ***! + \***************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Show full blocks in block palette on hover", + "description": "When hovering the mouse over a block in the block palette, all blocks in the palette will no longer be cut off at the edge.", + "tags": ["new", "recommended"], + "enabledByDefault": false, + "dynamicEnable": true, + "dynamicDisable": true, + "userstyles": [{ + "url": "userstyle.css" + }], + "credits": [{ + "name": "Gandi-IDE", + "link": "https://github.com/Gandi-IDE/" + }] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/transparent-orphans/_manifest_entry.js": +/*!******************************************************************!*\ + !*** ./src/addons/addons/transparent-orphans/_manifest_entry.js ***! + \******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Block transparency", + "description": "Adjust the transparency for blocks in the editor, with separate options for orphaned blocks (those without a hat block at the top) and blocks that are being dragged.", + "tags": [], + "dynamicDisable": true, + "credits": [{ + "name": "ErrorGamer2000", + "link": "https://scratch.mit.edu/users/ErrorGamer2000/" + }, { + "name": "GarboMuffin" + }], + "settings": [{ + "dynamic": true, + "name": "Block transparency (%)", + "id": "block", + "type": "integer", + "min": 0, + "max": 100, + "default": 0 + }, { + "dynamic": true, + "name": "Orphaned transparency (%)", + "id": "orphan", + "type": "integer", + "min": 0, + "max": 100, + "default": 25 + }, { + "dynamic": true, + "name": "Dragged transparency (%)", + "id": "dragged", + "type": "integer", + "min": 0, + "max": 100, + "default": 25 + }], + "userstyles": [{ + "url": "userstyle.css" + }] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/tw-disable-cloud-variables/_manifest_entry.js": +/*!*************************************************************************!*\ + !*** ./src/addons/addons/tw-disable-cloud-variables/_manifest_entry.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _lib_isScratchDesktop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../lib/isScratchDesktop */ "./src/lib/isScratchDesktop.js"); +/* generated by pull.js */ +const manifest = { + "noTranslations": true, + "name": "Disable cloud variables", + "description": "Disable cloud variables by default. You can still re-enable them using the Edit > Enable cloud variables menu.", + "userscripts": [{ + "url": "userscript.js" + }], + "tags": ["danger"], + "enabledByDefault": false +}; + +if (Object(_lib_isScratchDesktop__WEBPACK_IMPORTED_MODULE_0__["isScratchDesktop"])()) manifest.unsupported = true; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/tw-remove-backpack/_manifest_entry.js": +/*!*****************************************************************!*\ + !*** ./src/addons/addons/tw-remove-backpack/_manifest_entry.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "noTranslations": true, + "name": "Hide backpack", + "description": "Removes the backpack feature from the editor.", + "userscripts": [{ + "url": "remove-backpack.js" + }], + "userstyles": [{ + "url": "remove-backpack.css" + }], + "tags": ["danger"], + "dynamicDisable": true, + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/tw-remove-feedback/_manifest_entry.js": +/*!*****************************************************************!*\ + !*** ./src/addons/addons/tw-remove-feedback/_manifest_entry.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "noTranslations": true, + "name": "Remove Back to Home button", + "description": "Removes the Back to Home button from the menu bar.", + "userstyles": [{ + "url": "remove-feedback.css" + }], + "tags": [], + "dynamicDisable": true, + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/tw-straighten-comments/_manifest_entry.js": +/*!*********************************************************************!*\ + !*** ./src/addons/addons/tw-straighten-comments/_manifest_entry.js ***! + \*********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Keep block comment connections straight", + "description": "Forces block comments to always be connected to their source block by a horizontal straight line, not at an angle.", + "tags": [], + "credits": [{ + "name": "lisa_wolfgang", + "link": "https://scratch.mit.edu/users/lisa_wolfgang/" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "dynamicDisable": true, + "enabledByDefault": false +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/vol-slider/_manifest_entry.js": +/*!*********************************************************!*\ + !*** ./src/addons/addons/vol-slider/_manifest_entry.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "noTranslations": true, + "name": "Project volume slider", + "description": "Adds a volume slider next to the green flag controls.", + "credits": [{ + "name": "samq64", + "link": "https://scratch.mit.edu/users/samq64/" + }, { + "name": "GarboMuffin" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "userstyle.css" + }], + "settings": [{ + "name": "Default volume", + "id": "defVol", + "type": "integer", + "min": 0, + "max": 100, + "default": 100 + }], + "dynamicDisable": true, + "enabledByDefault": true, + "tags": ["recommended"] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/waveform-chunk-size/_manifest_entry.js": +/*!******************************************************************!*\ + !*** ./src/addons/addons/waveform-chunk-size/_manifest_entry.js ***! + \******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "noTranslations": true, + "name": "High-quality sound editor waveform", + "description": "Makes the quality of the sound editor's waveform preview configurable, at the cost of performance.", + "credits": [{ + "name": "JeremyGamer13" + }, { + "name": "SharkPool-SP", + "link": "https://github.com/SharkPool-SP" + }], + "userscripts": [{ + "url": "userscript.js" + }], + "info": [{ + "text": "Lower numbers means more samples are used to make the waveform, which may impact performance to the point of crashing the editor.", + "id": "qualityWarning" + }], + "settings": [{ + "name": "Use every (n)th sample", + "id": "quality", + "type": "integer", + "min": 1, + "max": Number.MAX_SAFE_INTEGER, + "default": 64 + }], + "dynamicEnable": true, + "dynamicDisable": true, + "enabledByDefault": false, + "tags": ["new"] +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/addons/zebra-striping/_manifest_entry.js": +/*!*************************************************************!*\ + !*** ./src/addons/addons/zebra-striping/_manifest_entry.js ***! + \*************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Alternating nested block colors", + "description": "Makes blocks of the same category alternate between lighter and darker shades when nested inside each other. This is also known as zebra striping.", + "credits": [{ + "name": "CST1229", + "link": "https://scratch.mit.edu/users/CST1229/" + }, { + "name": "GarboMuffin" + }, { + "name": "TheColaber", + "link": "https://scratch.mit.edu/users/thecolaber" + }], + "tags": [], + "userscripts": [{ + "url": "userscript.js" + }], + "userstyles": [{ + "url": "userstyle.css" + }], + "settings": [{ + "dynamic": true, + "name": "Shade", + "id": "shade", + "type": "select", + "potentialValues": [{ + "name": "Lighter", + "id": "lighter" + }, { + "name": "Darker", + "id": "darker" + }], + "default": "lighter" + }, { + "dynamic": true, + "name": "Intensity (0-100%)", + "id": "intensity", + "type": "integer", + "min": 0, + "default": 20, + "max": 100 + }], + "customCssVariables": [{ + "name": "shadeNumber", + "value": { + "type": "map", + "source": { + "type": "settingValue", + "settingId": "shade" + }, + "options": { + "lighter": "1", + "darker": "-1" + } + } + }], + "dynamicDisable": true +}; +/* harmony default export */ __webpack_exports__["default"] = (manifest); + +/***/ }), + +/***/ "./src/addons/environment.js": +/*!***********************************!*\ + !*** ./src/addons/environment.js ***! + \***********************************/ +/*! exports provided: isMobile, clipboardSupported, mediaRecorderSupported */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isMobile", function() { return isMobile; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clipboardSupported", function() { return clipboardSupported; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mediaRecorderSupported", function() { return mediaRecorderSupported; }); +const isMobile = typeof window !== 'undefined' && 'ontouchstart' in window; +const clipboardSupported = typeof navigator !== 'undefined' && navigator.clipboard && navigator.clipboard.write; +const mediaRecorderSupported = typeof MediaRecorder !== 'undefined' && MediaRecorder.isTypeSupported('video/webm'); + +/***/ }), + +/***/ "./src/addons/event-target.js": +/*!************************************!*\ + !*** ./src/addons/event-target.js ***! + \************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +// Some browsers have a non-functional EventTarget, so we write our own version that works everywhere. + +class EventTargetShim { + constructor() { + this._events = {}; + } + addEventListener(event, handler) { + if (!this._events[event]) { + this._events[event] = []; + } + this._events[event].push(handler); + } + removeEventListener(event, handler) { + const handlers = this._events[event]; + if (handlers) { + this._events[event] = handlers.filter(i => i !== handler); + } + } + dispatchEvent(event) { + const handlers = this._events[event.type]; + if (handlers) { + for (const fn of handlers) { + fn(event); + } + } + } +} +/* harmony default export */ __webpack_exports__["default"] = (EventTargetShim); + +/***/ }), + +/***/ "./src/addons/generated/addon-manifests.js": +/*!*************************************************!*\ + !*** ./src/addons/generated/addon-manifests.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _addons_toolbox_category_drag_manifest_entry_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../addons/toolbox-category-drag/_manifest_entry.js */ "./src/addons/addons/toolbox-category-drag/_manifest_entry.js"); +/* harmony import */ var _addons_cat_blocks_manifest_entry_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../addons/cat-blocks/_manifest_entry.js */ "./src/addons/addons/cat-blocks/_manifest_entry.js"); +/* harmony import */ var _addons_fps_manifest_entry_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../addons/fps/_manifest_entry.js */ "./src/addons/addons/fps/_manifest_entry.js"); +/* harmony import */ var _addons_debug_console_manifest_entry_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../addons/debug-console/_manifest_entry.js */ "./src/addons/addons/debug-console/_manifest_entry.js"); +/* harmony import */ var _addons_ScratchHighlightFullwidthNumber_manifest_entry_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../addons/ScratchHighlightFullwidthNumber/_manifest_entry.js */ "./src/addons/addons/ScratchHighlightFullwidthNumber/_manifest_entry.js"); +/* harmony import */ var _addons_find_bar_manifest_entry_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../addons/find-bar/_manifest_entry.js */ "./src/addons/addons/find-bar/_manifest_entry.js"); +/* harmony import */ var _addons_paint_tool_panel_manifest_entry_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../addons/paint-tool-panel/_manifest_entry.js */ "./src/addons/addons/paint-tool-panel/_manifest_entry.js"); +/* harmony import */ var _addons_middle_click_popup_manifest_entry_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../addons/middle-click-popup/_manifest_entry.js */ "./src/addons/addons/middle-click-popup/_manifest_entry.js"); +/* harmony import */ var _addons_editor_block_chomping_manifest_entry_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../addons/editor-block-chomping/_manifest_entry.js */ "./src/addons/addons/editor-block-chomping/_manifest_entry.js"); +/* harmony import */ var _addons_jump_to_def_manifest_entry_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../addons/jump-to-def/_manifest_entry.js */ "./src/addons/addons/jump-to-def/_manifest_entry.js"); +/* harmony import */ var _addons_editor_searchable_dropdowns_manifest_entry_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../addons/editor-searchable-dropdowns/_manifest_entry.js */ "./src/addons/addons/editor-searchable-dropdowns/_manifest_entry.js"); +/* harmony import */ var _addons_block_palette_icons_manifest_entry_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../addons/block-palette-icons/_manifest_entry.js */ "./src/addons/addons/block-palette-icons/_manifest_entry.js"); +/* harmony import */ var _addons_hide_flyout_manifest_entry_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../addons/hide-flyout/_manifest_entry.js */ "./src/addons/addons/hide-flyout/_manifest_entry.js"); +/* harmony import */ var _addons_mediarecorder_manifest_entry_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../addons/mediarecorder/_manifest_entry.js */ "./src/addons/addons/mediarecorder/_manifest_entry.js"); +/* harmony import */ var _addons_drag_drop_manifest_entry_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../addons/drag-drop/_manifest_entry.js */ "./src/addons/addons/drag-drop/_manifest_entry.js"); +/* harmony import */ var _addons_debugger_manifest_entry_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../addons/debugger/_manifest_entry.js */ "./src/addons/addons/debugger/_manifest_entry.js"); +/* harmony import */ var _addons_mute_project_manifest_entry_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../addons/mute-project/_manifest_entry.js */ "./src/addons/addons/mute-project/_manifest_entry.js"); +/* harmony import */ var _addons_vol_slider_manifest_entry_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../addons/vol-slider/_manifest_entry.js */ "./src/addons/addons/vol-slider/_manifest_entry.js"); +/* harmony import */ var _addons_clones_manifest_entry_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../addons/clones/_manifest_entry.js */ "./src/addons/addons/clones/_manifest_entry.js"); +/* harmony import */ var _addons_mouse_pos_manifest_entry_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../addons/mouse-pos/_manifest_entry.js */ "./src/addons/addons/mouse-pos/_manifest_entry.js"); +/* harmony import */ var _addons_color_picker_manifest_entry_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../addons/color-picker/_manifest_entry.js */ "./src/addons/addons/color-picker/_manifest_entry.js"); +/* harmony import */ var _addons_remove_sprite_confirm_manifest_entry_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../addons/remove-sprite-confirm/_manifest_entry.js */ "./src/addons/addons/remove-sprite-confirm/_manifest_entry.js"); +/* harmony import */ var _addons_block_count_manifest_entry_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../addons/block-count/_manifest_entry.js */ "./src/addons/addons/block-count/_manifest_entry.js"); +/* harmony import */ var _addons_onion_skinning_manifest_entry_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../addons/onion-skinning/_manifest_entry.js */ "./src/addons/addons/onion-skinning/_manifest_entry.js"); +/* harmony import */ var _addons_paint_snap_manifest_entry_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../addons/paint-snap/_manifest_entry.js */ "./src/addons/addons/paint-snap/_manifest_entry.js"); +/* harmony import */ var _addons_default_costume_editor_color_manifest_entry_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../addons/default-costume-editor-color/_manifest_entry.js */ "./src/addons/addons/default-costume-editor-color/_manifest_entry.js"); +/* harmony import */ var _addons_bitmap_copy_manifest_entry_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../addons/bitmap-copy/_manifest_entry.js */ "./src/addons/addons/bitmap-copy/_manifest_entry.js"); +/* harmony import */ var _addons_2d_color_picker_manifest_entry_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../addons/2d-color-picker/_manifest_entry.js */ "./src/addons/addons/2d-color-picker/_manifest_entry.js"); +/* harmony import */ var _addons_better_img_uploads_manifest_entry_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../addons/better-img-uploads/_manifest_entry.js */ "./src/addons/addons/better-img-uploads/_manifest_entry.js"); +/* harmony import */ var _addons_pick_colors_from_stage_manifest_entry_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../addons/pick-colors-from-stage/_manifest_entry.js */ "./src/addons/addons/pick-colors-from-stage/_manifest_entry.js"); +/* harmony import */ var _addons_custom_block_shape_manifest_entry_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../addons/custom-block-shape/_manifest_entry.js */ "./src/addons/addons/custom-block-shape/_manifest_entry.js"); +/* harmony import */ var _addons_zebra_striping_manifest_entry_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../addons/zebra-striping/_manifest_entry.js */ "./src/addons/addons/zebra-striping/_manifest_entry.js"); +/* harmony import */ var _addons_editor_theme3_manifest_entry_js__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../addons/editor-theme3/_manifest_entry.js */ "./src/addons/addons/editor-theme3/_manifest_entry.js"); +/* harmony import */ var _addons_custom_block_text_manifest_entry_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../addons/custom-block-text/_manifest_entry.js */ "./src/addons/addons/custom-block-text/_manifest_entry.js"); +/* harmony import */ var _addons_editor_colored_context_menus_manifest_entry_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../addons/editor-colored-context-menus/_manifest_entry.js */ "./src/addons/addons/editor-colored-context-menus/_manifest_entry.js"); +/* harmony import */ var _addons_editor_stage_left_manifest_entry_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../addons/editor-stage-left/_manifest_entry.js */ "./src/addons/addons/editor-stage-left/_manifest_entry.js"); +/* harmony import */ var _addons_editor_buttons_reverse_order_manifest_entry_js__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../addons/editor-buttons-reverse-order/_manifest_entry.js */ "./src/addons/addons/editor-buttons-reverse-order/_manifest_entry.js"); +/* harmony import */ var _addons_search_sprites_manifest_entry_js__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../addons/search-sprites/_manifest_entry.js */ "./src/addons/addons/search-sprites/_manifest_entry.js"); +/* harmony import */ var _addons_sprite_properties_manifest_entry_js__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ../addons/sprite-properties/_manifest_entry.js */ "./src/addons/addons/sprite-properties/_manifest_entry.js"); +/* harmony import */ var _addons_gamepad_manifest_entry_js__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../addons/gamepad/_manifest_entry.js */ "./src/addons/addons/gamepad/_manifest_entry.js"); +/* harmony import */ var _addons_editor_sounds_manifest_entry_js__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../addons/editor-sounds/_manifest_entry.js */ "./src/addons/addons/editor-sounds/_manifest_entry.js"); +/* harmony import */ var _addons_folders_manifest_entry_js__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../addons/folders/_manifest_entry.js */ "./src/addons/addons/folders/_manifest_entry.js"); +/* harmony import */ var _addons_block_switching_manifest_entry_js__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../addons/block-switching/_manifest_entry.js */ "./src/addons/addons/block-switching/_manifest_entry.js"); +/* harmony import */ var _addons_load_extensions_manifest_entry_js__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../addons/load-extensions/_manifest_entry.js */ "./src/addons/addons/load-extensions/_manifest_entry.js"); +/* harmony import */ var _addons_custom_zoom_manifest_entry_js__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../addons/custom-zoom/_manifest_entry.js */ "./src/addons/addons/custom-zoom/_manifest_entry.js"); +/* harmony import */ var _addons_initialise_sprite_position_manifest_entry_js__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../addons/initialise-sprite-position/_manifest_entry.js */ "./src/addons/addons/initialise-sprite-position/_manifest_entry.js"); +/* harmony import */ var _addons_blocks2image_manifest_entry_js__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../addons/blocks2image/_manifest_entry.js */ "./src/addons/addons/blocks2image/_manifest_entry.js"); +/* harmony import */ var _addons_remove_curved_stage_border_manifest_entry_js__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ../addons/remove-curved-stage-border/_manifest_entry.js */ "./src/addons/addons/remove-curved-stage-border/_manifest_entry.js"); +/* harmony import */ var _addons_transparent_orphans_manifest_entry_js__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ../addons/transparent-orphans/_manifest_entry.js */ "./src/addons/addons/transparent-orphans/_manifest_entry.js"); +/* harmony import */ var _addons_paint_by_default_manifest_entry_js__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ../addons/paint-by-default/_manifest_entry.js */ "./src/addons/addons/paint-by-default/_manifest_entry.js"); +/* harmony import */ var _addons_block_cherry_picking_manifest_entry_js__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ../addons/block-cherry-picking/_manifest_entry.js */ "./src/addons/addons/block-cherry-picking/_manifest_entry.js"); +/* harmony import */ var _addons_hide_new_variables_manifest_entry_js__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ../addons/hide-new-variables/_manifest_entry.js */ "./src/addons/addons/hide-new-variables/_manifest_entry.js"); +/* harmony import */ var _addons_editor_extra_keys_manifest_entry_js__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ../addons/editor-extra-keys/_manifest_entry.js */ "./src/addons/addons/editor-extra-keys/_manifest_entry.js"); +/* harmony import */ var _addons_hide_delete_button_manifest_entry_js__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ../addons/hide-delete-button/_manifest_entry.js */ "./src/addons/addons/hide-delete-button/_manifest_entry.js"); +/* harmony import */ var _addons_no_script_bumping_manifest_entry_js__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ../addons/no-script-bumping/_manifest_entry.js */ "./src/addons/addons/no-script-bumping/_manifest_entry.js"); +/* harmony import */ var _addons_paint_gradient_maker_manifest_entry_js__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ../addons/paint-gradient-maker/_manifest_entry.js */ "./src/addons/addons/paint-gradient-maker/_manifest_entry.js"); +/* harmony import */ var _addons_paint_rounded_rect_seperate_manifest_entry_js__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ../addons/paint-rounded-rect-seperate/_manifest_entry.js */ "./src/addons/addons/paint-rounded-rect-seperate/_manifest_entry.js"); +/* harmony import */ var _addons_paint_default_smoothing_manifest_entry_js__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ../addons/paint-default-smoothing/_manifest_entry.js */ "./src/addons/addons/paint-default-smoothing/_manifest_entry.js"); +/* harmony import */ var _addons_waveform_chunk_size_manifest_entry_js__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ../addons/waveform-chunk-size/_manifest_entry.js */ "./src/addons/addons/waveform-chunk-size/_manifest_entry.js"); +/* harmony import */ var _addons_toolbox_full_blocks_on_hover_manifest_entry_js__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ../addons/toolbox-full-blocks-on-hover/_manifest_entry.js */ "./src/addons/addons/toolbox-full-blocks-on-hover/_manifest_entry.js"); +/* harmony import */ var _addons_disable_stage_drag_select_manifest_entry_js__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ../addons/disable-stage-drag-select/_manifest_entry.js */ "./src/addons/addons/disable-stage-drag-select/_manifest_entry.js"); +/* harmony import */ var _addons_move_to_top_bottom_manifest_entry_js__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ../addons/move-to-top-bottom/_manifest_entry.js */ "./src/addons/addons/move-to-top-bottom/_manifest_entry.js"); +/* harmony import */ var _addons_multi_tab_code_manifest_entry_js__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ../addons/multi-tab-code/_manifest_entry.js */ "./src/addons/addons/multi-tab-code/_manifest_entry.js"); +/* harmony import */ var _addons_editor_animations_manifest_entry_js__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ../addons/editor-animations/_manifest_entry.js */ "./src/addons/addons/editor-animations/_manifest_entry.js"); +/* harmony import */ var _addons_reorder_custom_inputs_manifest_entry_js__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ../addons/reorder-custom-inputs/_manifest_entry.js */ "./src/addons/addons/reorder-custom-inputs/_manifest_entry.js"); +/* harmony import */ var _addons_disable_paste_offset_manifest_entry_js__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ../addons/disable-paste-offset/_manifest_entry.js */ "./src/addons/addons/disable-paste-offset/_manifest_entry.js"); +/* harmony import */ var _addons_block_duplicate_manifest_entry_js__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ../addons/block-duplicate/_manifest_entry.js */ "./src/addons/addons/block-duplicate/_manifest_entry.js"); +/* harmony import */ var _addons_swap_local_global_manifest_entry_js__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ../addons/swap-local-global/_manifest_entry.js */ "./src/addons/addons/swap-local-global/_manifest_entry.js"); +/* harmony import */ var _addons_editor_comment_previews_manifest_entry_js__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(/*! ../addons/editor-comment-previews/_manifest_entry.js */ "./src/addons/addons/editor-comment-previews/_manifest_entry.js"); +/* harmony import */ var _addons_columns_manifest_entry_js__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(/*! ../addons/columns/_manifest_entry.js */ "./src/addons/addons/columns/_manifest_entry.js"); +/* harmony import */ var _addons_number_pad_manifest_entry_js__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(/*! ../addons/number-pad/_manifest_entry.js */ "./src/addons/addons/number-pad/_manifest_entry.js"); +/* harmony import */ var _addons_script_snap_manifest_entry_js__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(/*! ../addons/script-snap/_manifest_entry.js */ "./src/addons/addons/script-snap/_manifest_entry.js"); +/* harmony import */ var _addons_fullscreen_manifest_entry_js__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(/*! ../addons/fullscreen/_manifest_entry.js */ "./src/addons/addons/fullscreen/_manifest_entry.js"); +/* harmony import */ var _addons_hide_stage_manifest_entry_js__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(/*! ../addons/hide-stage/_manifest_entry.js */ "./src/addons/addons/hide-stage/_manifest_entry.js"); +/* harmony import */ var _addons_tw_straighten_comments_manifest_entry_js__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(/*! ../addons/tw-straighten-comments/_manifest_entry.js */ "./src/addons/addons/tw-straighten-comments/_manifest_entry.js"); +/* harmony import */ var _addons_tw_remove_feedback_manifest_entry_js__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(/*! ../addons/tw-remove-feedback/_manifest_entry.js */ "./src/addons/addons/tw-remove-feedback/_manifest_entry.js"); +/* harmony import */ var _addons_tw_remove_backpack_manifest_entry_js__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(/*! ../addons/tw-remove-backpack/_manifest_entry.js */ "./src/addons/addons/tw-remove-backpack/_manifest_entry.js"); +/* harmony import */ var _addons_tw_disable_cloud_variables_manifest_entry_js__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(/*! ../addons/tw-disable-cloud-variables/_manifest_entry.js */ "./src/addons/addons/tw-disable-cloud-variables/_manifest_entry.js"); +/* generated by pull.js */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/* harmony default export */ __webpack_exports__["default"] = ({ + "paint-gradient-maker": _addons_paint_gradient_maker_manifest_entry_js__WEBPACK_IMPORTED_MODULE_55__["default"], + "paint-rounded-rect-seperate": _addons_paint_rounded_rect_seperate_manifest_entry_js__WEBPACK_IMPORTED_MODULE_56__["default"], + "paint-tool-panel": _addons_paint_tool_panel_manifest_entry_js__WEBPACK_IMPORTED_MODULE_6__["default"], + "paint-default-smoothing": _addons_paint_default_smoothing_manifest_entry_js__WEBPACK_IMPORTED_MODULE_57__["default"], + "toolbox-full-blocks-on-hover": _addons_toolbox_full_blocks_on_hover_manifest_entry_js__WEBPACK_IMPORTED_MODULE_59__["default"], + "waveform-chunk-size": _addons_waveform_chunk_size_manifest_entry_js__WEBPACK_IMPORTED_MODULE_58__["default"], + "fps": _addons_fps_manifest_entry_js__WEBPACK_IMPORTED_MODULE_2__["default"], + "debug-console": _addons_debug_console_manifest_entry_js__WEBPACK_IMPORTED_MODULE_3__["default"], + "ScratchHighlightFullwidthNumber": _addons_cat_blocks_manifest_entry_js__WEBPACK_IMPORTED_MODULE_1__["default"], + "cat-blocks": _addons_cat_blocks_manifest_entry_js__WEBPACK_IMPORTED_MODULE_1__["default"], + "editor-devtools": _addons_ScratchHighlightFullwidthNumber_manifest_entry_js__WEBPACK_IMPORTED_MODULE_4__["default"], + "find-bar": _addons_find_bar_manifest_entry_js__WEBPACK_IMPORTED_MODULE_5__["default"], + "middle-click-popup": _addons_middle_click_popup_manifest_entry_js__WEBPACK_IMPORTED_MODULE_7__["default"], + "editor-block-chomping": _addons_editor_block_chomping_manifest_entry_js__WEBPACK_IMPORTED_MODULE_8__["default"], + "jump-to-def": _addons_jump_to_def_manifest_entry_js__WEBPACK_IMPORTED_MODULE_9__["default"], + "editor-searchable-dropdowns": _addons_editor_searchable_dropdowns_manifest_entry_js__WEBPACK_IMPORTED_MODULE_10__["default"], + "block-palette-icons": _addons_block_palette_icons_manifest_entry_js__WEBPACK_IMPORTED_MODULE_11__["default"], + "hide-flyout": _addons_hide_flyout_manifest_entry_js__WEBPACK_IMPORTED_MODULE_12__["default"], + "mediarecorder": _addons_mediarecorder_manifest_entry_js__WEBPACK_IMPORTED_MODULE_13__["default"], + "drag-drop": _addons_drag_drop_manifest_entry_js__WEBPACK_IMPORTED_MODULE_14__["default"], + "debugger": _addons_debugger_manifest_entry_js__WEBPACK_IMPORTED_MODULE_15__["default"], + "mute-project": _addons_mute_project_manifest_entry_js__WEBPACK_IMPORTED_MODULE_16__["default"], + "vol-slider": _addons_vol_slider_manifest_entry_js__WEBPACK_IMPORTED_MODULE_17__["default"], + "clones": _addons_clones_manifest_entry_js__WEBPACK_IMPORTED_MODULE_18__["default"], + "mouse-pos": _addons_mouse_pos_manifest_entry_js__WEBPACK_IMPORTED_MODULE_19__["default"], + "color-picker": _addons_color_picker_manifest_entry_js__WEBPACK_IMPORTED_MODULE_20__["default"], + "remove-sprite-confirm": _addons_remove_sprite_confirm_manifest_entry_js__WEBPACK_IMPORTED_MODULE_21__["default"], + "block-count": _addons_block_count_manifest_entry_js__WEBPACK_IMPORTED_MODULE_22__["default"], + "onion-skinning": _addons_onion_skinning_manifest_entry_js__WEBPACK_IMPORTED_MODULE_23__["default"], + "paint-snap": _addons_paint_snap_manifest_entry_js__WEBPACK_IMPORTED_MODULE_24__["default"], + "default-costume-editor-color": _addons_default_costume_editor_color_manifest_entry_js__WEBPACK_IMPORTED_MODULE_25__["default"], + "bitmap-copy": _addons_bitmap_copy_manifest_entry_js__WEBPACK_IMPORTED_MODULE_26__["default"], + "2d-color-picker": _addons_2d_color_picker_manifest_entry_js__WEBPACK_IMPORTED_MODULE_27__["default"], + "better-img-uploads": _addons_better_img_uploads_manifest_entry_js__WEBPACK_IMPORTED_MODULE_28__["default"], + "pick-colors-from-stage": _addons_pick_colors_from_stage_manifest_entry_js__WEBPACK_IMPORTED_MODULE_29__["default"], + "custom-block-shape": _addons_custom_block_shape_manifest_entry_js__WEBPACK_IMPORTED_MODULE_30__["default"], + "zebra-striping": _addons_zebra_striping_manifest_entry_js__WEBPACK_IMPORTED_MODULE_31__["default"], + "editor-theme3": _addons_editor_theme3_manifest_entry_js__WEBPACK_IMPORTED_MODULE_32__["default"], + "custom-block-text": _addons_custom_block_text_manifest_entry_js__WEBPACK_IMPORTED_MODULE_33__["default"], + "editor-colored-context-menus": _addons_editor_colored_context_menus_manifest_entry_js__WEBPACK_IMPORTED_MODULE_34__["default"], + "editor-stage-left": _addons_editor_stage_left_manifest_entry_js__WEBPACK_IMPORTED_MODULE_35__["default"], + "editor-buttons-reverse-order": _addons_editor_buttons_reverse_order_manifest_entry_js__WEBPACK_IMPORTED_MODULE_36__["default"], + "search-sprites": _addons_search_sprites_manifest_entry_js__WEBPACK_IMPORTED_MODULE_37__["default"], + "sprite-properties": _addons_sprite_properties_manifest_entry_js__WEBPACK_IMPORTED_MODULE_38__["default"], + "gamepad": _addons_gamepad_manifest_entry_js__WEBPACK_IMPORTED_MODULE_39__["default"], + "editor-sounds": _addons_editor_sounds_manifest_entry_js__WEBPACK_IMPORTED_MODULE_40__["default"], + "folders": _addons_folders_manifest_entry_js__WEBPACK_IMPORTED_MODULE_41__["default"], + "block-switching": _addons_block_switching_manifest_entry_js__WEBPACK_IMPORTED_MODULE_42__["default"], + "load-extensions": _addons_load_extensions_manifest_entry_js__WEBPACK_IMPORTED_MODULE_43__["default"], + "custom-zoom": _addons_custom_zoom_manifest_entry_js__WEBPACK_IMPORTED_MODULE_44__["default"], + "initialise-sprite-position": _addons_initialise_sprite_position_manifest_entry_js__WEBPACK_IMPORTED_MODULE_45__["default"], + "blocks2image": _addons_blocks2image_manifest_entry_js__WEBPACK_IMPORTED_MODULE_46__["default"], + "remove-curved-stage-border": _addons_remove_curved_stage_border_manifest_entry_js__WEBPACK_IMPORTED_MODULE_47__["default"], + "transparent-orphans": _addons_transparent_orphans_manifest_entry_js__WEBPACK_IMPORTED_MODULE_48__["default"], + "paint-by-default": _addons_paint_by_default_manifest_entry_js__WEBPACK_IMPORTED_MODULE_49__["default"], + "block-cherry-picking": _addons_block_cherry_picking_manifest_entry_js__WEBPACK_IMPORTED_MODULE_50__["default"], + "hide-new-variables": _addons_hide_new_variables_manifest_entry_js__WEBPACK_IMPORTED_MODULE_51__["default"], + "editor-extra-keys": _addons_editor_extra_keys_manifest_entry_js__WEBPACK_IMPORTED_MODULE_52__["default"], + "toolbox-category-drag": _addons_toolbox_category_drag_manifest_entry_js__WEBPACK_IMPORTED_MODULE_0__["default"], + "hide-delete-button": _addons_hide_delete_button_manifest_entry_js__WEBPACK_IMPORTED_MODULE_53__["default"], + "no-script-bumping": _addons_no_script_bumping_manifest_entry_js__WEBPACK_IMPORTED_MODULE_54__["default"], + "disable-stage-drag-select": _addons_disable_stage_drag_select_manifest_entry_js__WEBPACK_IMPORTED_MODULE_60__["default"], + "move-to-top-bottom": _addons_move_to_top_bottom_manifest_entry_js__WEBPACK_IMPORTED_MODULE_61__["default"], + "disable-paste-offset": _addons_disable_paste_offset_manifest_entry_js__WEBPACK_IMPORTED_MODULE_65__["default"], + "block-duplicate": _addons_block_duplicate_manifest_entry_js__WEBPACK_IMPORTED_MODULE_66__["default"], + "swap-local-global": _addons_swap_local_global_manifest_entry_js__WEBPACK_IMPORTED_MODULE_67__["default"], + "editor-comment-previews": _addons_editor_comment_previews_manifest_entry_js__WEBPACK_IMPORTED_MODULE_68__["default"], + "columns": _addons_columns_manifest_entry_js__WEBPACK_IMPORTED_MODULE_69__["default"], + "number-pad": _addons_number_pad_manifest_entry_js__WEBPACK_IMPORTED_MODULE_70__["default"], + "script-snap": _addons_script_snap_manifest_entry_js__WEBPACK_IMPORTED_MODULE_71__["default"], + "fullscreen": _addons_fullscreen_manifest_entry_js__WEBPACK_IMPORTED_MODULE_72__["default"], + "hide-stage": _addons_hide_stage_manifest_entry_js__WEBPACK_IMPORTED_MODULE_73__["default"], + "tw-straighten-comments": _addons_tw_straighten_comments_manifest_entry_js__WEBPACK_IMPORTED_MODULE_74__["default"], + "tw-remove-feedback": _addons_tw_remove_feedback_manifest_entry_js__WEBPACK_IMPORTED_MODULE_75__["default"], + "tw-remove-backpack": _addons_tw_remove_backpack_manifest_entry_js__WEBPACK_IMPORTED_MODULE_76__["default"], + "tw-disable-cloud-variables": _addons_tw_disable_cloud_variables_manifest_entry_js__WEBPACK_IMPORTED_MODULE_77__["default"], + "vol-slider": _addons_vol_slider_manifest_entry_js__WEBPACK_IMPORTED_MODULE_17__["default"], + "multi-tab-code": _addons_multi_tab_code_manifest_entry_js__WEBPACK_IMPORTED_MODULE_62__["default"], + "editor-animations": _addons_editor_animations_manifest_entry_js__WEBPACK_IMPORTED_MODULE_63__["default"], + "reorder-custom-inputs": _addons_reorder_custom_inputs_manifest_entry_js__WEBPACK_IMPORTED_MODULE_64__["default"] +}); + +/***/ }), + +/***/ "./src/addons/generated/upstream-meta.json": +/*!*************************************************!*\ + !*** ./src/addons/generated/upstream-meta.json ***! + \*************************************************/ +/*! exports provided: commit, default */ +/***/ (function(module) { + +module.exports = JSON.parse("{\"commit\":\"7fcab09\"}"); + +/***/ }), + +/***/ "./src/addons/settings-store-singleton.js": +/*!************************************************!*\ + !*** ./src/addons/settings-store-singleton.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _settings_store__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./settings-store */ "./src/addons/settings-store.js"); + +const settingStore = new _settings_store__WEBPACK_IMPORTED_MODULE_0__["default"](); +const urlParameters = new URLSearchParams(location.search); +if (urlParameters.has('addons')) { + settingStore.parseUrlParameter(urlParameters.get('addons')); +} else { + settingStore.readLocalStorage(); +} +/* harmony default export */ __webpack_exports__["default"] = (settingStore); + +/***/ }), + +/***/ "./src/addons/settings-store.js": +/*!**************************************!*\ + !*** ./src/addons/settings-store.js ***! + \**************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _generated_addon_manifests__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./generated/addon-manifests */ "./src/addons/generated/addon-manifests.js"); +/* harmony import */ var _generated_upstream_meta_json__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./generated/upstream-meta.json */ "./src/addons/generated/upstream-meta.json"); +var _generated_upstream_meta_json__WEBPACK_IMPORTED_MODULE_1___namespace = /*#__PURE__*/__webpack_require__.t(/*! ./generated/upstream-meta.json */ "./src/addons/generated/upstream-meta.json", 1); +/* harmony import */ var _event_target__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./event-target */ "./src/addons/event-target.js"); +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +/** + * Copyright (C) 2021 Thomas Weber + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + + + +const SETTINGS_KEY = 'tw:addons'; +const VERSION = 4; +const migrateSettings = settings => { + const oldVersion = settings._; + if (oldVersion === VERSION || !oldVersion) { + return settings; + } + + // Migrate 1 -> 2 + // tw-project-info is now block-count + // tw-interface-customization split into tw-remove-backpack and tw-remove-feedback + if (oldVersion < 2) { + const projectInfo = settings['tw-project-info']; + if (projectInfo && projectInfo.enabled) { + settings['block-count'] = { + enabled: true + }; + } + const interfaceCustomization = settings['tw-interface-customization']; + if (interfaceCustomization && interfaceCustomization.enabled) { + if (interfaceCustomization.removeBackpack) { + settings['tw-remove-backpack'] = { + enabled: true + }; + } + if (interfaceCustomization.removeFeedback) { + settings['tw-remove-feedback'] = { + enabled: true + }; + } + } + } + + // Migrate 2 -> 3 + // The default value of hide-flyout's toggle setting changed from "hover" to "cathover" + // We want to keep the old default value for existing users. + if (oldVersion < 3) { + const hideFlyout = settings['hide-flyout']; + if (hideFlyout && hideFlyout.enabled && typeof hideFlyout.toggled === 'undefined') { + hideFlyout.toggle = 'hover'; + } + } + + // Migrate 3 -> 4 + // editor-devtools was broken up into find-bar and middle-click-popup. + // If someone disabled editor-devtools, we want to keep these disabled. + if (oldVersion < 4) { + const editorDevtools = settings['editor-devtools']; + if (editorDevtools && editorDevtools.enabled === false) { + settings['find-bar'] = { + enabled: false + }; + settings['middle-click-popup'] = { + enabled: false + }; + } + } + return settings; +}; + +/** + * @template T + * @param {T|T[]} v A value + * @returns {T[]} The value if it is a list, otherwise a 1 item list + */ +const asArray = v => { + if (Array.isArray(v)) { + return v; + } + return [v]; +}; +class SettingsStore extends _event_target__WEBPACK_IMPORTED_MODULE_2__["default"] { + constructor() { + super(); + this.store = this.createEmptyStore(); + this.remote = false; + } + + /** + * @private + */ + createEmptyStore() { + const result = {}; + for (const addonId of Object.keys(_generated_addon_manifests__WEBPACK_IMPORTED_MODULE_0__["default"])) { + result[addonId] = {}; + } + return result; + } + readLocalStorage() { + const base = this.store; + try { + const local = localStorage.getItem(SETTINGS_KEY); + if (local) { + let result = JSON.parse(local); + if (result && typeof result === 'object') { + result = migrateSettings(result); + for (const key of Object.keys(result)) { + if (base.hasOwnProperty(key)) { + const value = result[key]; + if (value && typeof value === 'object') { + base[key] = value; + } + } + } + } + } + } catch (e) { + // ignore + } + this.store = base; + } + + /** + * @private + */ + saveToLocalStorage() { + if (this.remote) { + return; + } + try { + const result = { + _: VERSION + }; + for (const addonId of Object.keys(_generated_addon_manifests__WEBPACK_IMPORTED_MODULE_0__["default"])) { + const data = this.getAddonStorage(addonId); + if (Object.keys(data).length > 0) { + result[addonId] = data; + } + } + localStorage.setItem(SETTINGS_KEY, JSON.stringify(result)); + } catch (e) { + // ignore + } + } + + /** + * @private + */ + getAddonStorage(addonId) { + if (this.store[addonId]) { + return this.store[addonId]; + } + throw new Error("Unknown addon store: ".concat(addonId)); + } + + /** + * @private + */ + getAddonManifest(addonId) { + if (_generated_addon_manifests__WEBPACK_IMPORTED_MODULE_0__["default"][addonId]) { + return _generated_addon_manifests__WEBPACK_IMPORTED_MODULE_0__["default"][addonId]; + } + throw new Error("Unknown addon: ".concat(addonId)); + } + + /** + * @private + */ + getAddonSettingObject(manifest, settingId) { + if (!manifest.settings) { + return null; + } + for (const setting of manifest.settings) { + if (setting.id === settingId) { + return setting; + } + } + return null; + } + getAddonEnabled(addonId) { + const manifest = this.getAddonManifest(addonId); + if (manifest.unsupported) { + return false; + } + const storage = this.getAddonStorage(addonId); + if (storage.hasOwnProperty('enabled')) { + return storage.enabled; + } + return !!manifest.enabledByDefault; + } + getAddonSetting(addonId, settingId) { + const storage = this.getAddonStorage(addonId); + const manifest = this.getAddonManifest(addonId); + const settingObject = this.getAddonSettingObject(manifest, settingId); + if (!settingObject) { + throw new Error("Unknown setting: ".concat(settingId)); + } + if (storage.hasOwnProperty(settingId)) { + return storage[settingId]; + } + return settingObject.default; + } + + /** + * @private + */ + getDefaultSettings(addonId) { + const manifest = this.getAddonManifest(addonId); + const result = {}; + for (const { + id, + default: value + } of manifest.settings) { + result[id] = value; + } + return result; + } + setAddonEnabled(addonId, enabled) { + const storage = this.getAddonStorage(addonId); + const manifest = this.getAddonManifest(addonId); + const oldValue = this.getAddonEnabled(addonId); + if (enabled === null) { + enabled = !!manifest.enabledByDefault; + delete storage.enabled; + } else if (typeof enabled === 'boolean') { + storage.enabled = enabled; + } else { + throw new Error('Enabled value is invalid.'); + } + this.saveToLocalStorage(); + if (enabled !== oldValue) { + // Dynamic enable is always supported. + // Dynamic disable requires addon support. + const supportsDynamic = enabled ? true : !!manifest.dynamicDisable; + this.dispatchEvent(new CustomEvent('setting-changed', { + detail: { + addonId, + settingId: 'enabled', + reloadRequired: !supportsDynamic, + value: enabled + } + })); + } + } + setAddonSetting(addonId, settingId, value) { + const storage = this.getAddonStorage(addonId); + const manifest = this.getAddonManifest(addonId); + const settingObject = this.getAddonSettingObject(manifest, settingId); + const oldValue = this.getAddonSetting(addonId, settingId); + if (value === null) { + value = settingObject.default; + delete storage[settingId]; + } else { + if (settingObject.type === 'boolean') { + if (typeof value !== 'boolean') { + throw new Error('Setting value is invalid.'); + } + } else if (settingObject.type === 'integer') { + if (typeof value !== 'number') { + throw new Error('Setting value is invalid.'); + } + } else if (settingObject.type === 'color') { + if (typeof value !== 'string') { + throw new Error('Color value is not a string.'); + } + // Remove alpha channel from colors like #012345ff + // We don't support transparency yet, but settings imported from Scratch Addons + // might contain transparency. + if (value.length === 9) { + value = value.substring(0, 7); + } + if (!/^#[0-9a-f]{6}$/i.test(value)) { + throw new Error('Color value is invalid format.'); + } + } else if (settingObject.type === 'select') { + if (!settingObject.potentialValues.some(potentialValue => potentialValue.id === value)) { + throw new Error('Setting value is invalid.'); + } + } else { + throw new Error('Setting object is of unknown type'); + } + storage[settingId] = value; + } + this.saveToLocalStorage(); + if (value !== oldValue) { + this.dispatchEvent(new CustomEvent('setting-changed', { + detail: { + addonId, + settingId, + reloadRequired: !settingObject.dynamic, + value + } + })); + } + } + applyAddonPreset(addonId, presetId) { + const manifest = this.getAddonManifest(addonId); + for (const { + id, + values + } of manifest.presets) { + if (id !== presetId) { + continue; + } + const settings = _objectSpread(_objectSpread({}, this.getDefaultSettings(addonId)), values); + for (const key of Object.keys(settings)) { + this.setAddonSetting(addonId, key, settings[key]); + } + return; + } + throw new Error("Unknown preset: ".concat(presetId)); + } + resetAllAddons() { + for (const addon of Object.keys(_generated_addon_manifests__WEBPACK_IMPORTED_MODULE_0__["default"])) { + this.resetAddon(addon, true); + } + // In case resetAddon missed some properties, do a hard reset on storage. + this.store = this.createEmptyStore(); + this.saveToLocalStorage(); + } + resetAddon(addonId, resetEverything) { + const storage = this.getAddonStorage(addonId); + for (const setting of Object.keys(storage)) { + if (setting === 'enabled') { + if (resetEverything) { + this.setAddonEnabled(addonId, null); + } + continue; + } + try { + this.setAddonSetting(addonId, setting, null); + } catch (e) { + // ignore + } + } + } + parseUrlParameter(parameter) { + this.remote = true; + const enabled = parameter.split(','); + for (const id of Object.keys(_generated_addon_manifests__WEBPACK_IMPORTED_MODULE_0__["default"])) { + this.setAddonEnabled(id, enabled.includes(id)); + } + } + export(_ref) { + let { + theme + } = _ref; + const result = { + core: { + // Upstream property. We don't use this. + lightTheme: theme === 'light', + // Doesn't matter what we set this to + version: "v1.0.0-tw-".concat(_generated_upstream_meta_json__WEBPACK_IMPORTED_MODULE_1__.commit) + }, + addons: {} + }; + for (const [addonId, manifest] of Object.entries(_generated_addon_manifests__WEBPACK_IMPORTED_MODULE_0__["default"])) { + const enabled = this.getAddonEnabled(addonId); + const settings = {}; + if (manifest.settings) { + for (const { + id + } of manifest.settings) { + settings[id] = this.getAddonSetting(addonId, id); + } + } + result.addons[addonId] = { + enabled, + settings + }; + } + return result; + } + import(data) { + for (const [addonId, value] of Object.entries(data.addons)) { + if (!_generated_addon_manifests__WEBPACK_IMPORTED_MODULE_0__["default"].hasOwnProperty(addonId)) { + continue; + } + const { + enabled, + settings + } = value; + if (typeof enabled === 'boolean') { + this.setAddonEnabled(addonId, enabled); + } + for (const [settingId, settingValue] of Object.entries(settings)) { + try { + this.setAddonSetting(addonId, settingId, settingValue); + } catch (e) { + // ignore + } + } + } + } + setStoreWithVersionCheck(_ref2) { + let { + version, + store + } = _ref2; + if (version !== _generated_upstream_meta_json__WEBPACK_IMPORTED_MODULE_1__.commit) { + return; + } + this.setStore(store); + } + setStore(newStore) { + const oldStore = this.store; + for (const addonId of Object.keys(oldStore)) { + const oldSettings = oldStore[addonId]; + const newSettings = newStore[addonId]; + if (!newSettings || typeof newSettings !== 'object') { + continue; + } + if (JSON.stringify(oldSettings) !== JSON.stringify(newSettings)) { + const manifest = this.getAddonManifest(addonId); + // Dynamic enable is always supported. + const dynamicEnable = !oldSettings.enabled && newSettings.enabled; + // Dynamic disable requires addon support. + const dynamicDisable = !!manifest.dynamicDisable && oldSettings.enabled && !newSettings.enabled; + // Clone to avoid pass-by-reference issues + this.store[addonId] = JSON.parse(JSON.stringify(newSettings)); + this.dispatchEvent(new CustomEvent('addon-changed', { + detail: { + addonId, + dynamicEnable, + dynamicDisable + } + })); + } + } + } + + /** + * Evaluate an `if` value from addon.json. + * @param {string} addonId The ID of the addon. + * @param {unknown} condition Condition from addon.json + * @returns {boolean} True if the condition is met. + */ + evaluateCondition(addonId, condition) { + if (!condition) { + // No condition. Default to true. + return true; + } + if (condition.addonEnabled) { + // addonEnabled is an OR + const addonsToCheck = asArray(condition.addonEnabled); + if (addonsToCheck.every(id => !this.getAddonEnabled(id))) { + return false; + } + } + if (condition.settings) { + // settings is an AND + for (const [settingName, expectedValue] of Object.entries(condition.settings)) { + if (this.getAddonSetting(addonId, settingName) !== expectedValue) { + return false; + } + } + } + return true; + } +} +/* harmony default export */ __webpack_exports__["default"] = (SettingsStore); + +/***/ }) + +}]); +//# sourceMappingURL=addon-settings~addons~editor~fullscreen~player~playground.js.map \ No newline at end of file diff --git a/js/addon-settings~addons~editor~fullscreen~player~playground.js.map b/js/addon-settings~addons~editor~fullscreen~player~playground.js.map new file mode 100644 index 0000000000000000000000000000000000000000..495a8be3d7f123f9f0b9eddd09e52ba750e231f1 --- /dev/null +++ b/js/addon-settings~addons~editor~fullscreen~player~playground.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/addon-settings~addons~editor~fullscreen~player~playground.js","sources":["webpack://GUI/./src/addons/addons/2d-color-picker/_manifest_entry.js","webpack://GUI/./src/addons/addons/ScratchHighlightFullwidthNumber/_manifest_entry.js","webpack://GUI/./src/addons/addons/better-img-uploads/_manifest_entry.js","webpack://GUI/./src/addons/addons/bitmap-copy/_manifest_entry.js","webpack://GUI/./src/addons/addons/block-cherry-picking/_manifest_entry.js","webpack://GUI/./src/addons/addons/block-count/_manifest_entry.js","webpack://GUI/./src/addons/addons/block-duplicate/_manifest_entry.js","webpack://GUI/./src/addons/addons/block-palette-icons/_manifest_entry.js","webpack://GUI/./src/addons/addons/block-switching/_manifest_entry.js","webpack://GUI/./src/addons/addons/blocks2image/_manifest_entry.js","webpack://GUI/./src/addons/addons/cat-blocks/_manifest_entry.js","webpack://GUI/./src/addons/addons/clones/_manifest_entry.js","webpack://GUI/./src/addons/addons/color-picker/_manifest_entry.js","webpack://GUI/./src/addons/addons/columns/_manifest_entry.js","webpack://GUI/./src/addons/addons/custom-block-shape/_manifest_entry.js","webpack://GUI/./src/addons/addons/custom-block-text/_manifest_entry.js","webpack://GUI/./src/addons/addons/custom-zoom/_manifest_entry.js","webpack://GUI/./src/addons/addons/debug-console/_manifest_entry.js","webpack://GUI/./src/addons/addons/debugger/_manifest_entry.js","webpack://GUI/./src/addons/addons/default-costume-editor-color/_manifest_entry.js","webpack://GUI/./src/addons/addons/disable-paste-offset/_manifest_entry.js","webpack://GUI/./src/addons/addons/disable-stage-drag-select/_manifest_entry.js","webpack://GUI/./src/addons/addons/drag-drop/_manifest_entry.js","webpack://GUI/./src/addons/addons/editor-animations/_manifest_entry.js","webpack://GUI/./src/addons/addons/editor-block-chomping/_manifest_entry.js","webpack://GUI/./src/addons/addons/editor-buttons-reverse-order/_manifest_entry.js","webpack://GUI/./src/addons/addons/editor-colored-context-menus/_manifest_entry.js","webpack://GUI/./src/addons/addons/editor-comment-previews/_manifest_entry.js","webpack://GUI/./src/addons/addons/editor-extra-keys/_manifest_entry.js","webpack://GUI/./src/addons/addons/editor-searchable-dropdowns/_manifest_entry.js","webpack://GUI/./src/addons/addons/editor-sounds/_manifest_entry.js","webpack://GUI/./src/addons/addons/editor-stage-left/_manifest_entry.js","webpack://GUI/./src/addons/addons/editor-theme3/_manifest_entry.js","webpack://GUI/./src/addons/addons/find-bar/_manifest_entry.js","webpack://GUI/./src/addons/addons/folders/_manifest_entry.js","webpack://GUI/./src/addons/addons/fps/_manifest_entry.js","webpack://GUI/./src/addons/addons/fullscreen/_manifest_entry.js","webpack://GUI/./src/addons/addons/gamepad/_manifest_entry.js","webpack://GUI/./src/addons/addons/hide-delete-button/_manifest_entry.js","webpack://GUI/./src/addons/addons/hide-flyout/_manifest_entry.js","webpack://GUI/./src/addons/addons/hide-new-variables/_manifest_entry.js","webpack://GUI/./src/addons/addons/hide-stage/_manifest_entry.js","webpack://GUI/./src/addons/addons/initialise-sprite-position/_manifest_entry.js","webpack://GUI/./src/addons/addons/jump-to-def/_manifest_entry.js","webpack://GUI/./src/addons/addons/load-extensions/_manifest_entry.js","webpack://GUI/./src/addons/addons/mediarecorder/_manifest_entry.js","webpack://GUI/./src/addons/addons/middle-click-popup/_manifest_entry.js","webpack://GUI/./src/addons/addons/mouse-pos/_manifest_entry.js","webpack://GUI/./src/addons/addons/move-to-top-bottom/_manifest_entry.js","webpack://GUI/./src/addons/addons/multi-tab-code/_manifest_entry.js","webpack://GUI/./src/addons/addons/mute-project/_manifest_entry.js","webpack://GUI/./src/addons/addons/no-script-bumping/_manifest_entry.js","webpack://GUI/./src/addons/addons/number-pad/_manifest_entry.js","webpack://GUI/./src/addons/addons/onion-skinning/_manifest_entry.js","webpack://GUI/./src/addons/addons/paint-by-default/_manifest_entry.js","webpack://GUI/./src/addons/addons/paint-default-smoothing/_manifest_entry.js","webpack://GUI/./src/addons/addons/paint-gradient-maker/_manifest_entry.js","webpack://GUI/./src/addons/addons/paint-rounded-rect-seperate/_manifest_entry.js","webpack://GUI/./src/addons/addons/paint-snap/_manifest_entry.js","webpack://GUI/./src/addons/addons/paint-tool-panel/_manifest_entry.js","webpack://GUI/./src/addons/addons/pick-colors-from-stage/_manifest_entry.js","webpack://GUI/./src/addons/addons/remove-curved-stage-border/_manifest_entry.js","webpack://GUI/./src/addons/addons/remove-sprite-confirm/_manifest_entry.js","webpack://GUI/./src/addons/addons/reorder-custom-inputs/_manifest_entry.js","webpack://GUI/./src/addons/addons/script-snap/_manifest_entry.js","webpack://GUI/./src/addons/addons/search-sprites/_manifest_entry.js","webpack://GUI/./src/addons/addons/sprite-properties/_manifest_entry.js","webpack://GUI/./src/addons/addons/swap-local-global/_manifest_entry.js","webpack://GUI/./src/addons/addons/toolbox-category-drag/_manifest_entry.js","webpack://GUI/./src/addons/addons/toolbox-full-blocks-on-hover/_manifest_entry.js","webpack://GUI/./src/addons/addons/transparent-orphans/_manifest_entry.js","webpack://GUI/./src/addons/addons/tw-disable-cloud-variables/_manifest_entry.js","webpack://GUI/./src/addons/addons/tw-remove-backpack/_manifest_entry.js","webpack://GUI/./src/addons/addons/tw-remove-feedback/_manifest_entry.js","webpack://GUI/./src/addons/addons/tw-straighten-comments/_manifest_entry.js","webpack://GUI/./src/addons/addons/vol-slider/_manifest_entry.js","webpack://GUI/./src/addons/addons/waveform-chunk-size/_manifest_entry.js","webpack://GUI/./src/addons/addons/zebra-striping/_manifest_entry.js","webpack://GUI/./src/addons/environment.js","webpack://GUI/./src/addons/event-target.js","webpack://GUI/./src/addons/generated/addon-manifests.js","webpack://GUI/./src/addons/settings-store-singleton.js","webpack://GUI/./src/addons/settings-store.js"],"sourcesContent":["/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"2D color picker\",\n \"description\": \"Replaces saturation and brightness sliders in the costume editor with a 2D color picker. Hold Shift while dragging the cursor to change the values on a single axis.\",\n \"tags\": [],\n \"credits\": [\n {\n \"name\": \"Ucrash\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ],\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"全角数字をハイライト\",\n \"description\": \"エラーの原因となる「0」から「9」の全角数字をハイライトして警告します。\",\n \"credits\": [\n {\n \"name\": \"champierre\",\n \"link\": \"https://github.com/champierre\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"dynamicDisable\": true,\n \"tags\": [],\n \"enabledByDefault\": true\n};\nexport default manifest;","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"HD image uploads\",\n \"description\": \"Adds a new button above the \\\"upload costume\\\" button that automatically converts uploaded bitmap images into SVG (vector) images to avoid losing quality.\",\n \"tags\": [\n \"beta\"\n ],\n \"info\": [\n {\n \"type\": \"notice\",\n \"text\": \"Avoid using the HD upload button if you plan to edit the image after uploading.\",\n \"id\": \"notSuitableEdit\"\n }\n ],\n \"credits\": [\n {\n \"name\": \"ErrorGamer2000\",\n \"link\": \"https://scratch.mit.edu/users/ErrorGamer2000/\"\n },\n {\n \"name\": \"GarboMuffin\"\n },\n {\n \"name\": \"World_Languages\"\n },\n {\n \"name\": \"SheepTester\",\n \"link\": \"https://scratch.mit.edu/users/Sheep_maker/\"\n }\n ],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Image sizing\",\n \"id\": \"fitting\",\n \"type\": \"select\",\n \"potentialValues\": [\n {\n \"id\": \"full\",\n \"name\": \"Original size\"\n },\n {\n \"id\": \"fill\",\n \"name\": \"Stretch to fill stage\"\n },\n {\n \"id\": \"fit\",\n \"name\": \"Shrink to fit stage\"\n }\n ],\n \"default\": \"fit\"\n }\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Bitmap images copying\",\n \"description\": \"Allows you to copy a bitmap image from the costume editor into the system clipboard, so that you can paste it in other websites or software.\",\n \"info\": [\n {\n \"type\": \"notice\",\n \"text\": \"\\\"Right click → copy\\\" is not supported. You must press Ctrl+C while a bitmap image is selected.\",\n \"id\": \"norightclick\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"dynamicDisable\": true,\n \"tags\": [],\n \"enabledByDefault\": true\n};\nimport {clipboardSupported} from \"../../environment\";\nif (!clipboardSupported) manifest.unsupported = true;\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Grab single block with Ctrl key\",\n \"description\": \"Adds the ability to drag a single block out of the middle of a script (instead of the entire stack attached below it) while holding the Ctrl key.\",\n \"info\": [\n {\n \"text\": \"On macOS, use the Cmd key instead of the Ctrl key.\",\n \"id\": \"macContextDisabled\"\n },\n {\n \"text\": \"If \\\"flip controls\\\" is enabled, grabbing blocks individually will be the default behavior. Hold Ctrl to drag the entire stack.\",\n \"id\": \"flipControls\"\n }\n ],\n \"credits\": [\n {\n \"name\": \"lisa_wolfgang\",\n \"link\": \"https://scratch.mit.edu/users/lisa_wolfgang/\"\n },\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Flip controls\",\n \"id\": \"invertDrag\",\n \"type\": \"boolean\",\n \"default\": false\n }\n ],\n \"tags\": [],\n \"dynamicDisable\": true,\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"enabledByDefault\": true,\n \"editorOnly\": true,\n \"name\": \"Block count\",\n \"description\": \"Shows the total number of blocks in a project in the editor menu bar. Previously part of \\\"sprite and script count\\\".\",\n \"tags\": [],\n \"credits\": [\n {\n \"name\": \"TheColaber\",\n \"link\": \"https://scratch.mit.edu/users/TheColaber/\"\n }\n ],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"blockcount.js\"\n }\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Duplicate script with Alt key\",\n \"description\": \"Quickly duplicate a script by dragging it while holding the Alt key. Hold Ctrl as well to only duplicate a single block instead of the entire stack attached below it.\",\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"info\": [\n {\n \"text\": \"On macOS, use the Option key instead of the Alt key and Command key instead of the Control key.\",\n \"id\": \"mac\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"dynamicDisable\": true,\n \"tags\": [],\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Block palette category icons\",\n \"description\": \"Adds icons inside the colored circles that identify block categories.\",\n \"tags\": [\n \"theme\"\n ],\n \"enabledByDefault\": false,\n \"dynamicDisable\": true,\n \"userstyles\": [\n {\n \"url\": \"userstyle.css\"\n }\n ],\n \"credits\": [\n {\n \"name\": \"--Explosion--\",\n \"link\": \"https://scratch.mit.edu/users/--Explosion--/\"\n },\n {\n \"name\": \"RedGuy7\",\n \"link\": \"https://scratch.mit.edu/users/RedGuy7/\"\n }\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Block switching\",\n \"description\": \"Right click on a block to switch it to a related block.\",\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n },\n {\n \"name\": \"pufferfish101007\",\n \"link\": \"https://scratch.mit.edu/users/pufferfish101007/\"\n },\n {\n \"name\": \"JeremyGamer13\",\n \"link\": \"https://penguinmod.com/profile?user=JGamerTesting\"\n }\n ],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"tags\": [\n \"recommended\"\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Motion blocks\",\n \"id\": \"motion\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Looks blocks\",\n \"id\": \"looks\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Sound blocks\",\n \"id\": \"sound\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Event blocks\",\n \"id\": \"event\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Control blocks\",\n \"id\": \"control\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Operator blocks\",\n \"id\": \"operator\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Sensing blocks\",\n \"id\": \"sensing\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Data blocks\",\n \"id\": \"data\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Extension blocks\",\n \"id\": \"extension\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Addon blocks\",\n \"id\": \"sa\",\n \"type\": \"boolean\",\n \"default\": true,\n \"if\": {\n \"addonEnabled\": [\n \"debugger\"\n ]\n }\n },\n {\n \"dynamic\": true,\n \"name\": \"Custom block arguments\",\n \"id\": \"customargs\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Shown custom block arguments options\",\n \"id\": \"customargsmode\",\n \"type\": \"select\",\n \"default\": \"defOnly\",\n \"potentialValues\": [\n {\n \"id\": \"defOnly\",\n \"name\": \"Arguments in own custom block\"\n },\n {\n \"id\": \"all\",\n \"name\": \"Arguments in all custom blocks in sprite\"\n }\n ],\n \"if\": {\n \"settings\": {\n \"customargs\": true\n }\n }\n },\n {\n \"dynamic\": true,\n \"name\": \"Show option to change block to self\",\n \"id\": \"noop\",\n \"type\": \"boolean\",\n \"default\": true\n }\n ],\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Save blocks as image\",\n \"description\": \"Right click the code area to export blocks as SVG/PNG images.\",\n \"tags\": [],\n \"credits\": [\n {\n \"name\": \"summerscar\"\n }\n ],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Cat blocks\",\n \"description\": \"Brings back editor cat hat blocks from April Fools 2020.\",\n \"credits\": [\n {\n \"name\": \"TheColaber\",\n \"link\": \"https://scratch.mit.edu/users/TheColaber/\"\n },\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"info\": [\n {\n \"type\": \"notice\",\n \"text\": \"The \\\"watch mouse cursor\\\" setting may impact performance when the editor is open.\",\n \"id\": \"watch\"\n }\n ],\n \"settings\": [\n {\n \"id\": \"watch\",\n \"name\": \"Watch mouse cursor\",\n \"default\": false,\n \"type\": \"boolean\"\n }\n ],\n \"tags\": [\n \"theme\"\n ],\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Clone counter\",\n \"description\": \"Adds a counter above the stage in the editor which shows the total amount of clones.\",\n \"credits\": [\n {\n \"name\": \"Jeffalo\"\n },\n {\n \"name\": \"OregSam\",\n \"link\": \"https://scratch.mit.edu/users/simiagain/\"\n }\n ],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"id\": \"showicononly\",\n \"name\": \"Show icon only\",\n \"default\": false,\n \"type\": \"boolean\"\n }\n ],\n \"tags\": [\n \"recommended\"\n ],\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Hex color picker\",\n \"description\": \"Adds hex code inputs to color pickers.\",\n \"tags\": [\n \"recommended\"\n ],\n \"credits\": [\n {\n \"name\": \"Richie Bendall\"\n },\n {\n \"name\": \"apple502j\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ],\n \"dynamicDisable\": true,\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Two-column category menu\",\n \"description\": \"Splits the block category menu into two columns and moves it to the top of the block palette, like in Scratch 2.0.\",\n \"credits\": [\n {\n \"name\": \"TheColaber\",\n \"link\": \"https://scratch.mit.edu/TheColaber\"\n }\n ],\n \"tags\": [],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Customizable block shape\",\n \"description\": \"Adjust the padding, corner radius, and notch height of blocks.\",\n \"tags\": [\n \"theme\"\n ],\n \"credits\": [\n {\n \"name\": \"SheepTester\",\n \"link\": \"https://scratch.mit.edu/users/Sheep_maker/\"\n },\n {\n \"name\": \"lisa_wolfgang\",\n \"link\": \"https://scratch.mit.edu/users/lisa_wolfgang/\"\n },\n {\n \"name\": \"GarboMuffin\",\n \"link\": \"https://scratch.mit.edu/users/GarboMuffin/\"\n }\n ],\n \"enabledByDefault\": false,\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"info\": [\n {\n \"type\": \"notice\",\n \"text\": \"Decreasing the padding size is only visible to you, so when your projects are viewed by other users, your scripts may overlap.\",\n \"id\": \"paddingWarning\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Padding size (50-200%)\",\n \"id\": \"paddingSize\",\n \"type\": \"integer\",\n \"min\": 50,\n \"default\": 100,\n \"max\": 200\n },\n {\n \"dynamic\": true,\n \"name\": \"Corner size (0-300%)\",\n \"id\": \"cornerSize\",\n \"type\": \"integer\",\n \"min\": 0,\n \"default\": 100,\n \"max\": 300\n },\n {\n \"dynamic\": true,\n \"name\": \"Notch height (0-150%)\",\n \"id\": \"notchSize\",\n \"type\": \"integer\",\n \"min\": 0,\n \"default\": 100,\n \"max\": 150\n }\n ],\n \"presets\": [\n {\n \"name\": \"3.0 Blocks\",\n \"id\": \"default3\",\n \"description\": \"The regular appearance of Scratch 3.0 blocks\",\n \"values\": {\n \"paddingSize\": 100,\n \"cornerSize\": 100,\n \"notchSize\": 100\n }\n },\n {\n \"name\": \"2.0 Blocks\",\n \"id\": \"default2\",\n \"description\": \"An appearance similar to Scratch 2.0 blocks\",\n \"values\": {\n \"paddingSize\": 70,\n \"cornerSize\": 150,\n \"notchSize\": 75\n }\n },\n {\n \"name\": \"3.0 Flat\",\n \"id\": \"flat3\",\n \"description\": \"Scratch 3.0 blocks with notches and corners removed\",\n \"values\": {\n \"paddingSize\": 100,\n \"cornerSize\": 0,\n \"notchSize\": 0\n }\n },\n {\n \"name\": \"2.0 Flat\",\n \"id\": \"flat2\",\n \"description\": \"Scratch 2.0 blocks with notches and corners removed\",\n \"values\": {\n \"paddingSize\": 70,\n \"cornerSize\": 0,\n \"notchSize\": 0\n }\n }\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"name\": \"Customizable block text style\",\n \"description\": \"Changes the thickness of the text on blocks and optionally adds a text shadow.\",\n \"tags\": [],\n \"credits\": [\n {\n \"name\": \"Secret-chest\"\n },\n {\n \"name\": \"_nix\",\n \"link\": \"https://scratch.mit.edu/users/_nix\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"text-bold.css\",\n \"if\": {\n \"settings\": {\n \"bold\": true\n }\n }\n },\n {\n \"url\": \"text-shadow.css\",\n \"if\": {\n \"settings\": {\n \"shadow\": true\n }\n }\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Bold text\",\n \"id\": \"bold\",\n \"type\": \"boolean\",\n \"default\": false\n },\n {\n \"dynamic\": true,\n \"name\": \"Shadow under text\",\n \"id\": \"shadow\",\n \"type\": \"boolean\",\n \"default\": false\n }\n ],\n \"dynamicDisable\": true,\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Customizable code area zoom\",\n \"description\": \"Choose custom settings for the minimum, maximum, speed, and start size of the zoom of scripts in the code area, and autohide the controls.\",\n \"tags\": [],\n \"credits\": [\n {\n \"name\": \"ErrorGamer2000\",\n \"link\": \"https://scratch.mit.edu/users/ErrorGamer2000/\"\n }\n ],\n \"enabledByDefault\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Maximum Zoom (100-500%)\",\n \"id\": \"maxZoom\",\n \"type\": \"integer\",\n \"min\": 100,\n \"default\": 500,\n \"max\": 500\n },\n {\n \"dynamic\": true,\n \"name\": \"Minimum Zoom (1-100%)\",\n \"id\": \"minZoom\",\n \"type\": \"integer\",\n \"min\": 1,\n \"default\": 1,\n \"max\": 100\n },\n {\n \"dynamic\": true,\n \"name\": \"Start Zoom (50-500%)\",\n \"id\": \"startZoom\",\n \"type\": \"integer\",\n \"min\": 50,\n \"default\": 68,\n \"max\": 500\n },\n {\n \"dynamic\": true,\n \"name\": \"Zoom Speed (50-200%)\",\n \"id\": \"zoomSpeed\",\n \"type\": \"integer\",\n \"min\": 50,\n \"default\": 100,\n \"max\": 200\n },\n {\n \"name\": \"Autohide Zoom Controls\",\n \"id\": \"autohide\",\n \"type\": \"boolean\",\n \"default\": false\n },\n {\n \"dynamic\": true,\n \"name\": \"Autohide Animation Speed\",\n \"id\": \"speed\",\n \"type\": \"select\",\n \"potentialValues\": [\n {\n \"id\": \"none\",\n \"name\": \"Instant\"\n },\n {\n \"id\": \"short\",\n \"name\": \"Quick\"\n },\n {\n \"id\": \"default\",\n \"name\": \"Default\"\n },\n {\n \"id\": \"long\",\n \"name\": \"Slow\"\n }\n ],\n \"default\": \"default\",\n \"if\": {\n \"settings\": {\n \"autohide\": true\n }\n }\n }\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"name\": \"Developer JS Console\",\n \"description\": \"開発者用のJavascriptコンソール。これが何か分からない場合は無視してください。\",\n \"tags\": [\n \"recommended\"\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"enabledByDefault\": true\n};\nimport {mediaRecorderSupported} from \"../../environment\";\nif (!mediaRecorderSupported) manifest.unsupported = true;\nexport default manifest;","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Debugger\",\n \"description\": \"Adds a new \\\"debugger\\\" window to the editor. Allows for logging into the \\\"Logs\\\" tab of the debugger window using the \\\"log\\\", \\\"warn\\\" and \\\"error\\\" blocks.\",\n \"credits\": [\n {\n \"name\": \"Tacodiva\",\n \"link\": \"https://scratch.mit.edu/users/Tacodiva7729/\"\n },\n {\n \"name\": \"GarboMuffin\"\n },\n {\n \"name\": \"GrahamSH\"\n },\n {\n \"name\": \"TheColaber\"\n },\n {\n \"name\": \"retronbv\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Clear logs on green flag\",\n \"id\": \"log_clear_greenflag\",\n \"type\": \"boolean\",\n \"default\": false\n },\n {\n \"dynamic\": true,\n \"name\": \"Log green flag clicks\",\n \"id\": \"log_greenflag\",\n \"type\": \"boolean\",\n \"default\": false\n },\n {\n \"dynamic\": true,\n \"name\": \"Log clone creation\",\n \"id\": \"log_clone_create\",\n \"type\": \"boolean\",\n \"default\": false\n },\n {\n \"dynamic\": true,\n \"name\": \"Log when max clones exceeded\",\n \"id\": \"log_failed_clone_creation\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Log broadcasts\",\n \"id\": \"log_broadcasts\",\n \"type\": \"boolean\",\n \"default\": false\n }\n ],\n \"tags\": [\n \"beta\"\n ],\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Customizable default costume editor colors\",\n \"description\": \"Changes the default colors and outline size used by the costume editor.\",\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Default fill color\",\n \"id\": \"fill\",\n \"type\": \"color\",\n \"default\": \"#9966FF\"\n },\n {\n \"dynamic\": true,\n \"name\": \"Default outline color\",\n \"id\": \"stroke\",\n \"type\": \"color\",\n \"default\": \"#000000\"\n },\n {\n \"dynamic\": true,\n \"name\": \"Default outline size\",\n \"id\": \"strokeSize\",\n \"type\": \"integer\",\n \"min\": 0,\n \"max\": 100,\n \"default\": 4\n },\n {\n \"dynamic\": true,\n \"name\": \"Use previous color instead of resetting after switching tools\",\n \"id\": \"persistence\",\n \"type\": \"boolean\",\n \"default\": true\n }\n ],\n \"tags\": [],\n \"dynamicDisable\": true,\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Do not shift pasted items\",\n \"description\": \"Paste copied items at their original position instead of shifted slightly in the costume editor.\",\n \"info\": [\n {\n \"text\": \"This behavior can also be achieved without this addon by Alt+Clicking the item.\",\n \"id\": \"vanilla\"\n }\n ],\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"tags\": [],\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Non-draggable sprites in editor\",\n \"description\": \"Removes the ability to drag sprites around on the stage in the editor, except those explicitly set as draggable. Hold Shift while dragging a sprite to move it normally.\",\n \"credits\": [\n {\n \"name\": \"Chrome_Cat\",\n \"link\": \"https://scratch.mit.edu/users/Chrome_Cat/\"\n },\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"tags\": [],\n \"enabledByDefault\": false,\n \"dynamicDisable\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"noTranslations\": true,\n \"name\": \"File drag and drop\",\n \"description\": \"Lets you drag images and sounds from your file manager into the sprite pane or costume/sound list. You can also drag text files into lists or \\\"ask and wait\\\" question inputs.\",\n \"credits\": [\n {\n \"name\": \"Sheep_maker\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"id\": \"use-hd-upload\",\n \"name\": \"Use HD uploads\",\n \"type\": \"boolean\",\n \"default\": false,\n \"if\": {\n \"addonEnabled\": \"better-img-uploads\"\n }\n }\n ],\n \"dynamicDisable\": true,\n \"tags\": [\n \"recommended\"\n ],\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Editor Animations\",\n \"description\": \"Adds smooth animations to various aspects of the editor!\",\n \"credits\": [\n {\n \"name\": \"reflow\"\n },\n {\n \"name\": \"SharkPool\"\n }\n ],\n \"info\": [\n {\n \"type\": \"notice\",\n \"text\": \"This addon will not take effect if you have animations turned off on your system. See https://mgik.dev/turn-on-motion for how to turn it on.\",\n \"id\": \"reduced-motion-notice\"\n },\n {\n \"type\": \"notice\",\n \"text\": \"Some animation types don't support animation direction; therefore, the animation direction may be ignored.\",\n \"id\": \"animation-support\"\n }\n ],\n \"settings\": [\n {\n \"id\": \"animateButtons\",\n \"name\": \"Animate Buttons\",\n \"default\": true,\n \"dynamic\": true,\n \"type\": \"boolean\"\n },\n {\n \"id\": \"animateLibraries\",\n \"name\": \"Animate Libraries (costumes, sprites, sounds, etc)\",\n \"default\": true,\n \"dynamic\": true,\n \"type\": \"boolean\"\n },\n {\n \"id\": \"animateModals\",\n \"name\": \"Animate Modals (create variable/list, custom block, etc)\",\n \"default\": true,\n \"dynamic\": true,\n \"type\": \"boolean\"\n },\n {\n \"id\": \"animateSpeed\",\n \"name\": \"Animation Speed (1-500%)\",\n \"type\": \"integer\",\n \"dynamic\": true,\n \"min\": 1,\n \"default\": 100,\n \"max\": 500\n },\n {\n \"id\": \"animationType\",\n \"name\": \"Animation Type\",\n \"type\": \"select\",\n \"dynamic\": true,\n \"default\": \"default\",\n \"potentialValues\": [\n { \"id\": \"default\", \"name\": \"Default\" },\n { \"id\": \"ease\", \"name\": \"Ease\" },\n { \"id\": \"smoothStep\", \"name\": \"Smooth Step\" },\n { \"id\": \"fastInSlowOut\", \"name\": \"Fast In Slow Out\" },\n { \"id\": \"sine\", \"name\": \"Sine\" },\n { \"id\": \"quad\", \"name\": \"Quadratic\" },\n { \"id\": \"cubic\", \"name\": \"Cubic\" },\n { \"id\": \"quart\", \"name\": \"Quartic\" },\n { \"id\": \"quint\", \"name\": \"Quintic\" },\n { \"id\": \"back\", \"name\": \"Back\" },\n { \"id\": \"elastic\", \"name\": \"Elastic\" },\n { \"id\": \"bounce\", \"name\": \"Bounce\" },\n { \"id\": \"emphasis\", \"name\": \"Emphasis\" },\n ]\n },\n {\n \"id\": \"animationDir\",\n \"name\": \"Animation Direction\",\n \"type\": \"select\",\n \"dynamic\": true,\n \"default\": \"InOut\",\n \"potentialValues\": [\n { \"id\": \"In\", \"name\": \"In\" },\n { \"id\": \"Out\", \"name\": \"Out\" },\n { \"id\": \"InOut\", \"name\": \"Both\" },\n ]\n },\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"tags\": [\n \"new\", \"theme\"\n ],\n \"enabledByDefault\": true\n};\nexport default manifest;","/* generated by pull.js */\nconst manifest = {\n \"name\": \"Extend wrapped C blocks\",\n \"description\": \"Makes C blocks extend when wrapping them around blocks, like in Scratch 2.0.\",\n \"credits\": [\n {\n \"name\": \"CST1229\",\n \"link\": \"https://github.com/CST1229/\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"tags\": [\"editor\", \"codeEditor\", \"new\", \"beta\"],\n \"enabledByDefault\": false,\n \"dynamicEnable\": true,\n \"dynamicDisable\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"name\": \"Reverse order of project controls\",\n \"description\": \"Moves the green flag and stop buttons to the right and the full screen button to the left, like in Scratch 2.0.\",\n \"tags\": [\n \"theme\"\n ],\n \"dynamicDisable\": true,\n \"userstyles\": [\n {\n \"url\": \"userstyle.css\"\n }\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Colored context menus\",\n \"description\": \"Makes block right click context menus colorful.\",\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"userscript.css\"\n }\n ],\n \"tags\": [\n \"theme\"\n ],\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Editor comment previews\",\n \"description\": \"Allows you to preview the contents of comments by hovering over collapsed comments and blocks. You can use this to view comments that are off-screen, identify a loop block from the bottom by its preview, fit many long comments in a small space, and more.\",\n \"tags\": [],\n \"credits\": [\n {\n \"name\": \"lisa_wolfgang\",\n \"link\": \"https://scratch.mit.edu/users/lisa_wolfgang/\"\n },\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"userstyle.css\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Hover collapsed comments to preview\",\n \"id\": \"hover-view\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Hover blocks to preview attached comments\",\n \"id\": \"hover-view-block\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Hover custom blocks to preview definition comments\",\n \"id\": \"hover-view-procedure\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Delay duration\",\n \"id\": \"delay\",\n \"type\": \"select\",\n \"potentialValues\": [\n {\n \"name\": \"None\",\n \"id\": \"none\"\n },\n {\n \"name\": \"Short\",\n \"id\": \"short\"\n },\n {\n \"name\": \"Long\",\n \"id\": \"long\"\n }\n ],\n \"default\": \"short\"\n },\n {\n \"dynamic\": true,\n \"name\": \"Follow mouse\",\n \"id\": \"follow-mouse\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Reduce transparency\",\n \"id\": \"reduce-transparency\",\n \"type\": \"boolean\",\n \"default\": false\n },\n {\n \"dynamic\": true,\n \"name\": \"Reduce animation\",\n \"id\": \"reduce-animation\",\n \"type\": \"boolean\",\n \"default\": false\n }\n ],\n \"dynamicDisable\": true,\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Extra key options\",\n \"description\": \"Adds more keys to the \\\"key () pressed?\\\" and \\\"when () key pressed\\\" block dropdowns, such as enter, dot, comma, and more. These keys will work even for users who do not have this addon.\",\n \"tags\": [\n \"beta\"\n ],\n \"credits\": [\n {\n \"name\": \"Tacodiva\",\n \"link\": \"https://scratch.mit.edu/users/Tacodiva7729/\"\n }\n ],\n \"info\": [\n {\n \"type\": \"notice\",\n \"text\": \"The \\\"experimental keys\\\" include equals, slash, semicolon and more. They may not work on all operating systems or keyboard layouts.\",\n \"id\": \"experimentalKeysWarn\"\n },\n {\n \"type\": \"notice\",\n \"text\": \"The \\\"Shift keys\\\" include keys which typically require the Shift key and a number key, like hashtag, exclamation mark and more. These keys only work with the \\\"when () key pressed\\\" block and do not work on all operating systems or keyboard layouts.\",\n \"id\": \"shiftKeysWarn\"\n },\n {\n \"type\": \"warning\",\n \"text\": \"The \\\"TurboWarp keys\\\" will only work in TurboWarp, not in Scratch.\",\n \"id\": \"twKeysWarn\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Show experimental keys\",\n \"id\": \"experimentalKeys\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Show Shift keys\",\n \"id\": \"shiftKeys\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Show TurboWarp keys\",\n \"id\": \"twKeys\",\n \"type\": \"boolean\",\n \"default\": true\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"dynamicDisable\": true,\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Searchable dropdowns\",\n \"description\": \"Allows you to search block dropdowns.\",\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"userscript.css\"\n }\n ],\n \"tags\": [\n \"recommended\"\n ],\n \"enabledByDefault\": true\n};\nimport {isMobile} from \"../../environment\";\nif (isMobile) manifest.enabledByDefault = false;\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Editor sound effects\",\n \"description\": \"Plays sound effects when you connect or delete blocks.\",\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"tags\": [],\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"noTranslations\": true,\n \"name\": \"Display stage on left side\",\n \"description\": \"Moves the stage to the left side of the editor, like in Scratch 2.0.\",\n \"info\": [\n {\n \"id\": \"reverseOrder\",\n \"text\": \"To change the position of buttons above the stage, use the \\\"reverse order of project controls\\\" addon.\"\n }\n ],\n \"credits\": [\n {\n \"name\": \"NitroCipher/ZenithRogue\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"fix-share-the-love.js\"\n }\n ],\n \"dynamicDisable\": true,\n \"userstyles\": [\n {\n \"url\": \"stageleft.css\"\n }\n ],\n \"tags\": [\n \"theme\"\n ],\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Customizable block colors\",\n \"description\": \"Edit block colors for each category in the editor.\",\n \"credits\": [\n {\n \"name\": \"NitroCipher/ZenithRogue\"\n },\n {\n \"name\": \"TheColaber\",\n \"link\": \"https://scratch.mit.edu/users/TheColaber/\"\n }\n ],\n \"customCssVariables\": [\n {\n \"name\": \"inputColor-text\",\n \"value\": {\n \"type\": \"alphaThreshold\",\n \"source\": {\n \"type\": \"settingValue\",\n \"settingId\": \"input-color\"\n },\n \"opaque\": {\n \"type\": \"textColor\",\n \"source\": {\n \"type\": \"settingValue\",\n \"settingId\": \"input-color\"\n }\n },\n \"transparent\": {\n \"type\": \"map\",\n \"source\": {\n \"type\": \"settingValue\",\n \"settingId\": \"text\"\n },\n \"options\": {\n \"white\": \"#ffffff\",\n \"black\": \"#575e75\",\n \"colorOnWhite\": \"#575e75\",\n \"colorOnBlack\": \"#ffffff\"\n }\n }\n }\n },\n {\n \"name\": \"inputColor-blackText\",\n \"value\": {\n \"type\": \"alphaThreshold\",\n \"source\": {\n \"type\": \"settingValue\",\n \"settingId\": \"input-color\"\n },\n \"opaque\": {\n \"type\": \"textColor\",\n \"black\": \"#000000\",\n \"source\": {\n \"type\": \"settingValue\",\n \"settingId\": \"input-color\"\n }\n },\n \"transparent\": {\n \"type\": \"map\",\n \"source\": {\n \"type\": \"settingValue\",\n \"settingId\": \"text\"\n },\n \"options\": {\n \"white\": \"#ffffff\",\n \"black\": \"#000000\",\n \"colorOnWhite\": \"#000000\",\n \"colorOnBlack\": \"#ffffff\"\n }\n }\n }\n },\n {\n \"name\": \"commentText\",\n \"value\": {\n \"type\": \"textColor\",\n \"source\": {\n \"type\": \"settingValue\",\n \"settingId\": \"comment-color\"\n }\n }\n },\n {\n \"name\": \"commentTextTransparent\",\n \"value\": {\n \"type\": \"textColor\",\n \"black\": \"rgba(0, 0, 0, 0.50)\",\n \"white\": \"rgba(255, 255, 255, 0.50)\",\n \"source\": {\n \"type\": \"settingValue\",\n \"settingId\": \"comment-color\"\n }\n }\n },\n {\n \"name\": \"commentBorder\",\n \"value\": {\n \"type\": \"multiply\",\n \"source\": {\n \"type\": \"settingValue\",\n \"settingId\": \"comment-color\"\n },\n \"r\": 0.7,\n \"g\": 0.7,\n \"b\": 0.7\n }\n }\n ],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"theme3.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"theme3.css\"\n },\n {\n \"url\": \"black_text.css\",\n \"if\": {\n \"settings\": {\n \"text\": \"black\"\n }\n }\n },\n {\n \"url\": \"color_on_white.css\",\n \"if\": {\n \"settings\": {\n \"text\": \"colorOnWhite\"\n }\n }\n },\n {\n \"url\": \"color_on_black.css\",\n \"if\": {\n \"settings\": {\n \"text\": \"colorOnBlack\"\n }\n }\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"motion\",\n \"id\": \"motion-color\",\n \"type\": \"color\",\n \"default\": \"#4C97FF\",\n \"allowTransparency\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"looks\",\n \"id\": \"looks-color\",\n \"type\": \"color\",\n \"default\": \"#9966FF\",\n \"allowTransparency\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"sounds\",\n \"id\": \"sounds-color\",\n \"type\": \"color\",\n \"default\": \"#CF63CF\",\n \"allowTransparency\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"events\",\n \"id\": \"events-color\",\n \"type\": \"color\",\n \"default\": \"#FFBF00\",\n \"allowTransparency\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"control\",\n \"id\": \"control-color\",\n \"type\": \"color\",\n \"default\": \"#FFAB19\",\n \"allowTransparency\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"sensing\",\n \"id\": \"sensing-color\",\n \"type\": \"color\",\n \"default\": \"#5CB1D6\",\n \"allowTransparency\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"operators\",\n \"id\": \"operators-color\",\n \"type\": \"color\",\n \"default\": \"#59C059\",\n \"allowTransparency\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"variables\",\n \"id\": \"data-color\",\n \"type\": \"color\",\n \"default\": \"#FF8C1A\",\n \"allowTransparency\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"lists\",\n \"id\": \"data-lists-color\",\n \"type\": \"color\",\n \"default\": \"#FF661A\",\n \"allowTransparency\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"custom\",\n \"id\": \"custom-color\",\n \"type\": \"color\",\n \"default\": \"#FF6680\",\n \"allowTransparency\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"extensions\",\n \"id\": \"Pen-color\",\n \"type\": \"color\",\n \"default\": \"#0FBD8C\",\n \"allowTransparency\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"TurboWarp\",\n \"id\": \"tw-color\",\n \"type\": \"color\",\n \"default\": \"#ff4c4c\",\n \"allowTransparency\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Addon blocks\",\n \"id\": \"sa-color\",\n \"type\": \"color\",\n \"default\": \"#29BEB8\",\n \"allowTransparency\": true,\n \"if\": {\n \"addonEnabled\": [\n \"debugger\"\n ]\n }\n },\n {\n \"dynamic\": true,\n \"name\": \"Block inputs\",\n \"id\": \"input-color\",\n \"type\": \"color\",\n \"default\": \"#FFFFFF\",\n \"allowTransparency\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Comments\",\n \"id\": \"comment-color\",\n \"type\": \"color\",\n \"default\": \"#FEF49C\"\n },\n {\n \"dynamic\": true,\n \"name\": \"Text color\",\n \"id\": \"text\",\n \"type\": \"select\",\n \"default\": \"white\",\n \"potentialValues\": [\n {\n \"id\": \"white\",\n \"name\": \"White\"\n },\n {\n \"id\": \"black\",\n \"name\": \"Black\"\n },\n {\n \"id\": \"colorOnWhite\",\n \"name\": \"Colored on white background\"\n },\n {\n \"id\": \"colorOnBlack\",\n \"name\": \"Colored on black background\"\n }\n ]\n }\n ],\n \"tags\": [\n \"theme\"\n ],\n \"enabledByDefault\": false,\n \"presets\": [\n {\n \"name\": \"3.0 Tweaks\",\n \"id\": \"tweaks\",\n \"description\": \"Events, Control, and Custom blocks with 2.0 inspired colors\",\n \"values\": {\n \"motion-color\": \"#4C97FF\",\n \"looks-color\": \"#9966FF\",\n \"sounds-color\": \"#CF63CF\",\n \"events-color\": \"#DE9E2E\",\n \"control-color\": \"#FFBF00\",\n \"sensing-color\": \"#5CB1D6\",\n \"operators-color\": \"#59C059\",\n \"data-color\": \"#FF8C1A\",\n \"data-lists-color\": \"#FF661A\",\n \"custom-color\": \"#5f49d8\",\n \"Pen-color\": \"#0FBD8C\",\n \"sa-color\": \"#29BEB8\",\n \"comment-color\": \"#FEF49C\",\n \"input-color\": \"#FFFFFF\",\n \"text\": \"white\"\n }\n },\n {\n \"name\": \"2.0 Colors\",\n \"id\": \"original\",\n \"description\": \"The original block colors from Scratch 2.0\",\n \"values\": {\n \"motion-color\": \"#4a6cd4\",\n \"looks-color\": \"#8a55d7\",\n \"sounds-color\": \"#bb42c3\",\n \"events-color\": \"#c88330\",\n \"control-color\": \"#e1a91a\",\n \"sensing-color\": \"#2ca5e2\",\n \"operators-color\": \"#5cb712\",\n \"data-color\": \"#ee7d16\",\n \"data-lists-color\": \"#cc5b22\",\n \"custom-color\": \"#632d99\",\n \"Pen-color\": \"#0e9a6c\",\n \"sa-color\": \"#29beb8\",\n \"comment-color\": \"#FFFFD2\",\n \"input-color\": \"#ffffff\",\n \"text\": \"white\"\n }\n },\n {\n \"name\": \"Dark\",\n \"id\": \"dark\",\n \"description\": \"Dark versions of the default colors\",\n \"values\": {\n \"motion-color\": \"#004099\",\n \"looks-color\": \"#220066\",\n \"sounds-color\": \"#752475\",\n \"events-color\": \"#997300\",\n \"control-color\": \"#664100\",\n \"sensing-color\": \"#1f5f7a\",\n \"operators-color\": \"#235c23\",\n \"data-color\": \"#b35900\",\n \"data-lists-color\": \"#993300\",\n \"custom-color\": \"#99004d\",\n \"Pen-color\": \"#064734\",\n \"tw-color\": \"#660000\",\n \"sa-color\": \"#166966\",\n \"comment-color\": \"#423f24\",\n \"input-color\": \"#202020\",\n \"text\": \"white\"\n }\n },\n {\n \"name\": \"Black\",\n \"id\": \"black\",\n \"description\": \"Makes block backgrounds black\",\n \"values\": {\n \"motion-color\": \"#4C97FF\",\n \"looks-color\": \"#9966FF\",\n \"sounds-color\": \"#CF63CF\",\n \"events-color\": \"#FFBF00\",\n \"control-color\": \"#FFAB19\",\n \"sensing-color\": \"#5CB1D6\",\n \"operators-color\": \"#59C059\",\n \"data-color\": \"#FF8C1A\",\n \"data-lists-color\": \"#FF661A\",\n \"custom-color\": \"#FF6680\",\n \"Pen-color\": \"#0FBD8C\",\n \"sa-color\": \"#29BEB8\",\n \"comment-color\": \"#FEF49C\",\n \"input-color\": \"#202020\",\n \"text\": \"colorOnBlack\"\n }\n }\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Editor find bar\",\n \"description\": \"Adds a find bar to find and jump to scripts, costumes and sounds next to the sounds tab. Use Ctrl+Left and Ctrl+Right in the code area to navigate to previous or next visited position after using the find bar.\",\n \"info\": [\n {\n \"text\": \"This addon was previously part of the \\\"developer tools\\\" addon but has moved here.\",\n \"id\": \"developer-tools\"\n }\n ],\n \"credits\": [\n {\n \"name\": \"griffpatch\"\n },\n {\n \"name\": \"TheColaber\",\n \"link\": \"https://scratch.mit.edu/users/thecolaber/\"\n }\n ],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"userstyle.css\"\n }\n ],\n \"tags\": [\n \"recommended\"\n ],\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Sprite folders\",\n \"description\": \"Adds folders to the sprite pane, as well as costume and sound lists. To create a folder, right click any sprite and click \\\"create folder\\\". Click a folder to open or close it. Right click a sprite to see what folders you can move it to, or alternatively drag and drop it into an open folder. This feature works by adding \\\"[folderName]//\\\" at the beginning of the names for your sprites.\",\n \"info\": [\n {\n \"type\": \"notice\",\n \"text\": \"Users with this feature enabled will be able to see the folders in your project. Anyone else will see sprite lists normally (no folders).\",\n \"id\": \"notice-folders-are-public\"\n }\n ],\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ],\n \"tags\": [\n \"recommended\"\n ],\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"name\": \"FPS\",\n \"description\": \"FPS(処理速度)を常に表示します。\",\n \"tags\": [\n \"recommended\"\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"enabledByDefault\": true\n};\nimport {mediaRecorderSupported} from \"../../environment\";\nif (!mediaRecorderSupported) manifest.unsupported = true;\nexport default manifest;","/* generated by pull.js */\nconst manifest = {\n \"name\": \"Enhanced full screen\",\n \"description\": \"Fixes some undesired effects in the project player's full screen mode, opens it in your browser's full screen mode, and hides the green flag toolbar.\",\n \"credits\": [\n {\n \"name\": \"lisa_wolfgang\",\n \"link\": \"https://scratch.mit.edu/users/lisa_wolfgang/\"\n }\n ],\n \"info\": [\n {\n \"type\": \"notice\",\n \"text\": \"If you choose to hide the toolbar, remember that you can use the Esc key to exit the project player's full screen mode.\",\n \"id\": \"hideToolbarNotice\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Open full screen project player in full screen browser mode\",\n \"id\": \"browserFullscreen\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Hide toolbar in full screen\",\n \"id\": \"hideToolbar\",\n \"type\": \"boolean\",\n \"default\": false\n }\n ],\n \"dynamicDisable\": true,\n \"userstyles\": [\n {\n \"url\": \"hideOverflow.css\"\n },\n {\n \"url\": \"removeBorder.css\"\n },\n {\n \"url\": \"resizeWindow.css\",\n \"if\": {\n \"settings\": {\n \"hideToolbar\": false\n }\n }\n },\n {\n \"url\": \"resizeWindow_noToolbar.css\",\n \"if\": {\n \"settings\": {\n \"hideToolbar\": true\n }\n }\n },\n {\n \"url\": \"hideToolbar.css\",\n \"if\": {\n \"settings\": {\n \"hideToolbar\": true\n }\n }\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"tags\": [\n \"beta\"\n ],\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"name\": \"Gamepad support\",\n \"description\": \"Interact with projects using a USB or Bluetooth controller/gamepad.\",\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n },\n {\n \"url\": \"gamepadlib.css\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Hide settings button when no controllers detected\",\n \"type\": \"boolean\",\n \"default\": false,\n \"id\": \"hide\"\n }\n ],\n \"tags\": [],\n \"enabledByDefault\": false,\n \"dynamicDisable\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"name\": \"Hide delete button\",\n \"description\": \"Hides delete button (trash can icon) from sprites, costumes and sounds. They can still be deleted using the right click context menu.\",\n \"tags\": [],\n \"dynamicDisable\": true,\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Sprites\",\n \"id\": \"sprites\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Costumes and backdrops\",\n \"id\": \"costumes\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"name\": \"Sounds\",\n \"id\": \"sounds\",\n \"type\": \"boolean\",\n \"default\": true\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"sprites.css\",\n \"if\": {\n \"settings\": {\n \"sprites\": true\n }\n }\n },\n {\n \"url\": \"costumes.css\",\n \"if\": {\n \"settings\": {\n \"costumes\": true\n }\n }\n },\n {\n \"url\": \"sounds.css\",\n \"if\": {\n \"settings\": {\n \"sounds\": true\n }\n }\n }\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Auto-hiding block palette\",\n \"description\": \"Hides the block palette if not hovered. Click the lock icon to lock it in place temporarily. Alternatively, use \\\"category click\\\" mode.\",\n \"credits\": [\n {\n \"name\": \"TheColaber\",\n \"link\": \"https://scratch.mit.edu/users/TheColaber/\"\n },\n {\n \"name\": \"Maximouse\",\n \"link\": \"https://scratch.mit.edu/users/Maximouse/\"\n }\n ],\n \"info\": [\n {\n \"text\": \"\\\"Palette area hover\\\" mode only extends the viewing area. If you want to be able to drag blocks into that area without them getting trashed, use one of the other modes.\",\n \"id\": \"hoverExplanation\"\n }\n ],\n \"dynamicDisable\": true,\n \"customCssVariables\": [\n {\n \"name\": \"lockDisplay\",\n \"value\": {\n \"type\": \"map\",\n \"source\": {\n \"type\": \"settingValue\",\n \"settingId\": \"toggle\"\n },\n \"options\": {\n \"hover\": \"flex\",\n \"cathover\": \"flex\",\n \"category\": \"none\"\n }\n }\n },\n {\n \"name\": \"placeholderDisplay\",\n \"value\": {\n \"type\": \"map\",\n \"source\": {\n \"type\": \"settingValue\",\n \"settingId\": \"toggle\"\n },\n \"options\": {\n \"hover\": \"block\",\n \"cathover\": \"none\",\n \"category\": \"none\"\n }\n }\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Toggle on...\",\n \"id\": \"toggle\",\n \"type\": \"select\",\n \"potentialValues\": [\n {\n \"id\": \"hover\",\n \"name\": \"Palette area hover\"\n },\n {\n \"id\": \"cathover\",\n \"name\": \"Category hover\"\n },\n {\n \"id\": \"category\",\n \"name\": \"Category click\"\n }\n ],\n \"default\": \"cathover\"\n },\n {\n \"dynamic\": true,\n \"name\": \"Animation speed\",\n \"id\": \"speed\",\n \"type\": \"select\",\n \"potentialValues\": [\n {\n \"id\": \"none\",\n \"name\": \"Instant\"\n },\n {\n \"id\": \"short\",\n \"name\": \"Quick\"\n },\n {\n \"id\": \"default\",\n \"name\": \"Default\"\n },\n {\n \"id\": \"long\",\n \"name\": \"Slow\"\n }\n ],\n \"default\": \"default\"\n }\n ],\n \"tags\": [\n \"recommended\"\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Hide new variables\",\n \"description\": \"Do not automatically create monitors for newly created variables or lists.\",\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"tags\": [],\n \"dynamicDisable\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Hide stage and sprite pane\",\n \"description\": \"Adds a button next to the \\\"small stage\\\" and \\\"large stage\\\" buttons that hides the stage and the sprite pane, making the code area much larger.\",\n \"credits\": [\n {\n \"name\": \"Maximouse\",\n \"link\": \"https://scratch.mit.edu/users/Maximouse/\"\n }\n ],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ],\n \"tags\": []\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Customizable new sprite position\",\n \"description\": \"Change the default x/y position of new sprites.\",\n \"credits\": [\n {\n \"name\": \"pufferfish101007\",\n \"link\": \"https://scratch.mit.edu/users/pufferfish101007/\"\n }\n ],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"id\": \"x\",\n \"name\": \"X position\",\n \"type\": \"integer\",\n \"default\": 0,\n \"min\": -240,\n \"max\": 240\n },\n {\n \"dynamic\": true,\n \"id\": \"y\",\n \"name\": \"Y position\",\n \"type\": \"integer\",\n \"default\": 0,\n \"min\": -180,\n \"max\": 180\n },\n {\n \"dynamic\": true,\n \"id\": \"library\",\n \"name\": \"Randomize the position of library sprites\",\n \"type\": \"boolean\",\n \"default\": false\n },\n {\n \"dynamic\": true,\n \"id\": \"duplicate\",\n \"name\": \"Behavior when duplicating sprites\",\n \"type\": \"select\",\n \"default\": \"randomize\",\n \"potentialValues\": [\n {\n \"id\": \"custom\",\n \"name\": \"Send to specified x/y values\"\n },\n {\n \"id\": \"keep\",\n \"name\": \"Keep the same as the original sprite\"\n },\n {\n \"id\": \"randomize\",\n \"name\": \"Randomize\"\n }\n ]\n }\n ],\n \"tags\": [],\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"name\": \"Jump to custom block definition\",\n \"description\": \"Allows you to jump to a custom block's definition using the middle mouse button or Shift+Click on the block.\",\n \"info\": [\n {\n \"text\": \"This addon was previously part of the \\\"developer tools\\\" addon but has moved here.\",\n \"id\": \"developer-tools\"\n }\n ],\n \"credits\": [\n {\n \"name\": \"griffpatch\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"tags\": [\n \"recommended\"\n ],\n \"enabledByDefault\": true,\n \"dynamicDisable\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Automatically add extensions\",\n \"description\": \"Auto-shows music, pen, and other extensions in the block category menu in the editor.\",\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"settings\": [\n {\n \"name\": \"Music\",\n \"id\": \"music\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"name\": \"Pen\",\n \"id\": \"pen\",\n \"type\": \"boolean\",\n \"default\": true\n },\n {\n \"name\": \"Text to Speech\",\n \"id\": \"text2speech\",\n \"type\": \"boolean\",\n \"default\": false\n },\n {\n \"name\": \"Translate\",\n \"id\": \"translate\",\n \"type\": \"boolean\",\n \"default\": false\n }\n ],\n \"dynamicDisable\": true,\n \"tags\": []\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"name\": \"Project video recorder\",\n \"description\": \"Adds a \\\"start recording\\\" button to the editor menu bar that allows you to record the project's stage.\",\n \"tags\": [\n \"recommended\"\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ],\n \"enabledByDefault\": true\n};\nimport {mediaRecorderSupported} from \"../../environment\";\nif (!mediaRecorderSupported) manifest.unsupported = true;\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Insert blocks by name\",\n \"description\": \"Middle click on the code area, use Ctrl+Space or Shift+Click to bring up a floating input box where you can type the name of a block (or parts of it) and drag the block into the code area. Hold Shift while dragging to avoid closing the box when adding multiple blocks at once.\",\n \"credits\": [\n {\n \"name\": \"griffpatch\"\n },\n {\n \"name\": \"TheColaber\",\n \"link\": \"https://scratch.mit.edu/users/TheColaber/\"\n },\n {\n \"name\": \"JeremyGamer13\"\n },\n ],\n \"tags\": [\n \"recommended\"\n ],\n \"enabledByDefault\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"userstyle.css\"\n }\n ],\n \"settings\": [\n {\n \"name\": \"Popup Block Size\",\n \"id\": \"popup_scale\",\n \"type\": \"integer\",\n \"min\": 1,\n \"max\": 100,\n \"default\": 64\n },\n {\n \"name\": \"Popup Default Width\",\n \"id\": \"popup_width\",\n \"type\": \"integer\",\n \"min\": 1,\n \"max\": 100,\n \"default\": 16\n },\n {\n \"name\": \"Popup Max Search Height\",\n \"id\": \"popup_max_height\",\n \"type\": \"integer\",\n \"min\": 1,\n \"max\": 100,\n \"default\": 40\n },\n {\n \"name\": \"Max Search Results\",\n \"id\": \"popup_max_search\",\n \"type\": \"integer\",\n \"min\": 1,\n \"max\": 1000,\n \"default\": 100\n },\n {\n \"name\": \"Max Object Variants\",\n \"id\": \"popup_max_variants\",\n \"type\": \"integer\",\n \"min\": 1,\n \"max\": 1000,\n \"default\": 7\n }\n ],\n \"info\": [\n {\n \"text\": \"This addon was previously part of the \\\"developer tools\\\" addon but has moved here.\",\n \"id\": \"developer-tools\"\n },\n {\n \"text\": \"Changing the \\\"Max Object Variants\\\" will limit the amount of results that just use a different costume, sprite, sound or menu option selected in the block.\",\n \"id\": \"maxObjectVariants\"\n }\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Mouse position\",\n \"description\": \"Displays your mouse x/y position above the stage in the editor.\",\n \"credits\": [\n {\n \"name\": \"Jeffalo\"\n }\n ],\n \"dynamicDisable\": true,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ],\n \"tags\": [\n \"recommended\"\n ],\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"enabledByDefault\": true,\n \"editorOnly\": true,\n \"name\": \"Move costume to top or bottom\",\n \"description\": \"Adds options to the right click context menu for costumes and sounds to move them to the top or the bottom of the list.\",\n \"info\": [\n {\n \"text\": \"This addon was previously part of the \\\"developer tools\\\" addon but has moved here.\",\n \"id\": \"developer-tools\"\n }\n ],\n \"tags\": [],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"dynamicDisable\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Code Editor Tabbing\",\n \"description\": \"Adds tabs to the code editor, allowing you to divide many scripts from inside one sprite in to seperate parts.\",\n \"info\": [],\n \"credits\": [\n {\n \"name\": \"RedMan13\",\n \"link\": \"https://github.com/RedMan13\"\n }\n ],\n \"dynamicEnable\": false,\n \"dynamicDisable\": false,\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"userstyle.css\"\n }\n ],\n \"settings\": [\n {\n \"type\": \"boolean\",\n \"id\": \"shouldDelete\",\n \"name\": \"Merge tabs on delete\",\n \"default\": true,\n \"description\": \"If we should keep blocks from deleted tabs, moving them into the new selected tab, or if we should delete blocks inside a deleted tab.\"\n },\n {\n \"type\": \"boolean\",\n \"id\": \"moveOnDrag\",\n \"name\": \"Move blocks into tabs\",\n \"default\": false,\n \"description\": \"If, when blocks are dragged over a tab, we should copy blocks into the tab or move the selected blocks into the tab.\"\n }\n ],\n \"tags\": [],\n \"enabledByDefault\": false\n};\nexport default manifest;","/* generated by pull.js */\nconst manifest = {\n \"noTranslations\": true,\n \"name\": \"Muted project player mode\",\n \"description\": \"Ctrl+Click the green flag to mute/unmute the project.\",\n \"info\": [\n {\n \"text\": \"On macOS, use the Cmd key instead of the Ctrl key.\",\n \"id\": \"macOS\"\n }\n ],\n \"credits\": [\n {\n \"name\": \"TheColaber\",\n \"link\": \"https://scratch.mit.edu/users/TheColaber/\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"dynamicDisable\": true,\n \"enabledByDefault\": true,\n \"tags\": [\n \"recommended\"\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Do not automatically space overlapping scripts\",\n \"description\": \"Allows scripts to be moved and modified without causing overlapping scripts to move around.\",\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"dynamicDisable\": true,\n \"tags\": [],\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Always show number pad\",\n \"description\": \"Show Scratch's number pad input when editing number fields on all devices, instead of only touchscreen devices.\",\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"info\": [\n {\n \"text\": \"A number pad will show when editing number inputs from certain blocks, such as \\\"set x to\\\".\",\n \"id\": \"explanation\"\n }\n ],\n \"tags\": [\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"dynamicDisable\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Onion skinning\",\n \"description\": \"Shows transparent overlays of previous or next costumes when editing a costume. Controlled by buttons under the costume editor by the zoom buttons.\",\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ],\n \"settings\": [\n {\n \"id\": \"default\",\n \"name\": \"Enable by default\",\n \"type\": \"boolean\",\n \"default\": false\n },\n {\n \"id\": \"previous\",\n \"name\": \"Default previous costumes\",\n \"type\": \"integer\",\n \"default\": 1,\n \"min\": 0,\n \"max\": 100\n },\n {\n \"id\": \"next\",\n \"name\": \"Default next costumes\",\n \"type\": \"integer\",\n \"default\": 0,\n \"min\": 0,\n \"max\": 100\n },\n {\n \"id\": \"opacity\",\n \"name\": \"Opacity (%)\",\n \"type\": \"integer\",\n \"min\": 0,\n \"max\": 100,\n \"default\": 25\n },\n {\n \"id\": \"opacityStep\",\n \"name\": \"Opacity Step (%)\",\n \"type\": \"integer\",\n \"min\": 0,\n \"max\": 100,\n \"default\": 10\n },\n {\n \"id\": \"layering\",\n \"name\": \"Default layering\",\n \"type\": \"select\",\n \"default\": \"front\",\n \"potentialValues\": [\n {\n \"id\": \"front\",\n \"name\": \"Front\"\n },\n {\n \"id\": \"behind\",\n \"name\": \"Behind\"\n }\n ]\n },\n {\n \"id\": \"mode\",\n \"name\": \"Default mode\",\n \"type\": \"select\",\n \"default\": \"merge\",\n \"potentialValues\": [\n {\n \"id\": \"merge\",\n \"name\": \"Merge images\"\n },\n {\n \"id\": \"tint\",\n \"name\": \"Color tint\"\n }\n ]\n },\n {\n \"name\": \"Previous costume tint\",\n \"id\": \"beforeTint\",\n \"type\": \"color\",\n \"default\": \"#FF0000\"\n },\n {\n \"name\": \"Next costume tint\",\n \"id\": \"afterTint\",\n \"type\": \"color\",\n \"default\": \"#0000FF\"\n }\n ],\n \"tags\": [\n \"recommended\"\n ],\n \"dynamicDisable\": true,\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Paint costume by default\",\n \"description\": \"Changes the default action of \\\"Choose a Sprite/Costume/Backdrop/Sound\\\" buttons, which open the library by default.\",\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"id\": \"sprite\",\n \"name\": \"Add sprite\",\n \"type\": \"select\",\n \"potentialValues\": [\n {\n \"id\": \"library\",\n \"name\": \"Library\"\n },\n {\n \"id\": \"paint\",\n \"name\": \"Paint\"\n },\n {\n \"id\": \"surprise\",\n \"name\": \"Surprise\"\n },\n {\n \"id\": \"upload\",\n \"name\": \"Upload\"\n }\n ],\n \"default\": \"paint\"\n },\n {\n \"dynamic\": true,\n \"id\": \"costume\",\n \"name\": \"Add costume\",\n \"type\": \"select\",\n \"potentialValues\": [\n {\n \"id\": \"library\",\n \"name\": \"Library\"\n },\n {\n \"id\": \"paint\",\n \"name\": \"Paint\"\n },\n {\n \"id\": \"surprise\",\n \"name\": \"Surprise\"\n },\n {\n \"id\": \"upload\",\n \"name\": \"Upload\"\n }\n ],\n \"default\": \"paint\"\n },\n {\n \"dynamic\": true,\n \"id\": \"backdrop\",\n \"name\": \"Add backdrop\",\n \"type\": \"select\",\n \"potentialValues\": [\n {\n \"id\": \"library\",\n \"name\": \"Library\"\n },\n {\n \"id\": \"paint\",\n \"name\": \"Paint\"\n },\n {\n \"id\": \"surprise\",\n \"name\": \"Surprise\"\n },\n {\n \"id\": \"upload\",\n \"name\": \"Upload\"\n }\n ],\n \"default\": \"paint\"\n },\n {\n \"dynamic\": true,\n \"id\": \"sound\",\n \"name\": \"Add sound\",\n \"type\": \"select\",\n \"potentialValues\": [\n {\n \"id\": \"library\",\n \"name\": \"Library\"\n },\n {\n \"id\": \"record\",\n \"name\": \"Record\"\n },\n {\n \"id\": \"surprise\",\n \"name\": \"Surprise\"\n },\n {\n \"id\": \"upload\",\n \"name\": \"Upload\"\n }\n ],\n \"default\": \"library\"\n }\n ],\n \"dynamicDisable\": true,\n \"tags\": [\n \"recommended\"\n ],\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"noTranslations\": true,\n \"name\": \"Custom default Brush, Eraser and Pen smoothing\",\n \"description\": \"Makes the default values for Brush, Eraser and Pen smoothing configurable.\",\n \"credits\": [\n {\n \"name\": \"JeremyGamer13\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"settings\": [\n {\n \"name\": \"Brush Smoothing\",\n \"id\": \"brush\",\n \"type\": \"integer\",\n \"min\": 0,\n \"max\": 1000,\n \"default\": 10\n },\n {\n \"name\": \"Eraser Smoothing\",\n \"id\": \"eraser\",\n \"type\": \"integer\",\n \"min\": 0,\n \"max\": 1000,\n \"default\": 10\n },\n {\n \"name\": \"Pen Smoothing\",\n \"id\": \"pen\",\n \"type\": \"integer\",\n \"min\": 0,\n \"max\": 1000,\n \"default\": 2\n },\n ],\n \"dynamicEnable\": true,\n \"dynamicDisable\": true,\n \"enabledByDefault\": false,\n \"tags\": [\n \"new\"\n ]\n};\nexport default manifest;","/* generated by pull.js */\nconst manifest = {\n \"name\": \"Costume Gradient Editor\",\n \"description\": \"Adds a custom gradient maker to the costume editor, available next to the other gradient options.\",\n \"credits\": [\n {\n \"name\": \"SharkPool\",\n \"link\": \"https://github.com/SharkPool-SP/\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"tags\": [\"editor\", \"new\", \"recommended\"],\n \"enabledByDefault\": true,\n \"dynamicEnable\": true,\n \"dynamicDisable\": false\n};\nexport default manifest;","/* generated by pull.js */\nconst manifest = {\n \"noTranslations\": true,\n \"name\": \"Seperate Rectangle tool and Rounded Rectangle tool\",\n \"description\": \"Adds a seperate Rounded Rectangle tool like in earlier versions of PenguinMod. Does not remove the rounding option from the current rectangle tool.\",\n \"credits\": [\n {\n \"name\": \"JeremyGamer13\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"dynamicEnable\": true,\n \"dynamicDisable\": true,\n \"enabledByDefault\": false,\n \"tags\": [\n \"new\"\n ]\n};\nexport default manifest;","/* generated by pull.js */\nconst manifest = {\n \"name\": \"Costume editor snapping\",\n \"description\": \"Snap objects in the costume editor to bounding boxes and vector nodes.\",\n \"tags\": [\n \"recommended\"\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"userstyle.css\"\n }\n ],\n \"settings\": [\n {\n \"type\": \"boolean\",\n \"id\": \"enable-default\",\n \"name\": \"Enable by default\",\n \"default\": true\n },\n {\n \"dynamic\": true,\n \"type\": \"color\",\n \"id\": \"guide-color\",\n \"name\": \"Snapping guide color\",\n \"default\": \"#ff0000\",\n \"allowTransparency\": true\n },\n {\n \"type\": \"boolean\",\n \"id\": \"pageCenter\",\n \"name\": \"Snap to page center\",\n \"default\": true\n },\n {\n \"type\": \"boolean\",\n \"id\": \"pageAxes\",\n \"name\": \"Snap to page x and y axes\",\n \"default\": true\n },\n {\n \"type\": \"boolean\",\n \"id\": \"pageEdges\",\n \"name\": \"Snap to page edges\",\n \"default\": true\n },\n {\n \"type\": \"boolean\",\n \"id\": \"pageCorners\",\n \"name\": \"Snap to page corners\",\n \"default\": true\n },\n {\n \"type\": \"boolean\",\n \"id\": \"objectEdges\",\n \"name\": \"Snap to object edges\",\n \"default\": true\n },\n {\n \"type\": \"boolean\",\n \"id\": \"objectCenters\",\n \"name\": \"Snap to object centers\",\n \"default\": true\n },\n {\n \"type\": \"boolean\",\n \"id\": \"objectMidlines\",\n \"name\": \"Snap to object midlines\",\n \"default\": true\n },\n {\n \"type\": \"boolean\",\n \"id\": \"objectCorners\",\n \"name\": \"Snap to object corners\",\n \"default\": true\n },\n {\n \"type\": \"boolean\",\n \"id\": \"boxCenter\",\n \"name\": \"Snap from selection box center\",\n \"default\": true\n },\n {\n \"type\": \"boolean\",\n \"id\": \"boxCorners\",\n \"name\": \"Snap from selection box corners\",\n \"default\": true\n },\n {\n \"type\": \"boolean\",\n \"id\": \"boxEdgeMids\",\n \"name\": \"Snap from selection box edge midpoints\",\n \"default\": true\n },\n {\n \"type\": \"positive_integer\",\n \"id\": \"threshold\",\n \"name\": \"Snapping distance\",\n \"default\": 10,\n \"min\": 4,\n \"max\": 100\n }\n ],\n \"dynamicDisable\": true,\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"name\": \"Costume Tool Panel\",\n \"description\": \"Adds a tool menu to the costume editor, to manually edit object transforms and properties.\",\n \"credits\": [\n {\n \"name\": \"SharkPool\",\n \"link\": \"https://github.com/SharkPool-SP/\"\n },\n {\n \"name\": \"DogeisCut\",\n \"link\": \"https://github.com/DogeisCut/\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"tags\": [\"editor\", \"new\", \"recommended\"],\n \"enabledByDefault\": true,\n \"dynamicEnable\": true,\n \"dynamicDisable\": false\n};\nexport default manifest;","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"enabledByDefault\": true,\n \"name\": \"Select stage colors in the costume editor\",\n \"description\": \"Allows the costume editor's eye dropper to also pick colors from the stage.\",\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"tags\": [],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ],\n \"dynamicDisable\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"noTranslations\": true,\n \"name\": \"Remove curved stage border\",\n \"description\": \"Removes the curved border around the stage, allowing you to see the corners.\",\n \"tags\": [\n \"theme\"\n ],\n \"credits\": [\n {\n \"name\": \"Tacodiva\",\n \"link\": \"https://scratch.mit.edu/users/Tacodiva7729/\"\n }\n ],\n \"enabledByDefault\": true,\n \"dynamicDisable\": true,\n \"userstyles\": [\n {\n \"url\": \"remove-borders.css\"\n }\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Sprite deletion confirmation\",\n \"description\": \"Asks if you're sure when deleting a sprite inside a project.\",\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"dynamicDisable\": true,\n \"tags\": [\n \"recommended\"\n ],\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Rearrangeable custom block inputs\",\n \"description\": \"Allows rearranging custom block parameters on the \\\"Make a block\\\" screen.\",\n \"credits\": [\n {\n \"name\": \"Chrome_Cat\",\n \"link\": \"https://scratch.mit.edu/users/Chrome_Cat/\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"arrows.css\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Insert new inputs after selected input\",\n \"id\": \"InsertInputsAfter\",\n \"type\": \"boolean\",\n \"default\": false\n }\n ],\n \"tags\": [\n \"recommended\"\n ],\n \"enabledByDefault\": true,\n \"dynamicDisable\": true\n};\nexport default manifest;","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Snap scripts to grid\",\n \"description\": \"Drag a script to automatically align its position to the code area dots.\",\n \"tags\": [],\n \"credits\": [\n {\n \"name\": \"CST1229\",\n \"link\": \"https://scratch.mit.edu/users/CST1229/\"\n },\n {\n \"name\": \"TheColaber\",\n \"link\": \"https://scratch.mit.edu/users/TheColaber/\"\n },\n {\n \"name\": \"lisa_wolfgang\",\n \"link\": \"https://scratch.mit.edu/users/lisa_wolfgang/\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Grid size (px)\",\n \"id\": \"grid\",\n \"type\": \"integer\",\n \"min\": 1,\n \"default\": 40\n }\n ],\n \"presets\": [\n {\n \"name\": \"Whole-block\",\n \"id\": \"whole-block\",\n \"values\": {\n \"grid\": 48\n }\n },\n {\n \"name\": \"Half-block\",\n \"id\": \"half-block\",\n \"values\": {\n \"grid\": 24\n }\n },\n {\n \"name\": \"Default\",\n \"id\": \"default\",\n \"values\": {\n \"grid\": 40\n }\n }\n ],\n \"dynamicDisable\": true,\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Search sprites by name\",\n \"description\": \"Adds a search box to the sprite pane to search for sprites by name.\",\n \"credits\": [\n {\n \"name\": \"BarelySmooth\",\n \"link\": \"https://scratch.mit.edu/users/BarelySmooth/\"\n },\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"search-bar.css\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"dynamicDisable\": true,\n \"tags\": [],\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Collapsing sprite properties\",\n \"description\": \"Hides the sprite properties panel by default, like in Scratch 2.0. Use the info button on the currently selected sprite or double-click a sprite to show the properties panel again. To re-hide it, use the collapse button in the properties panel or double-click a sprite.\",\n \"tags\": [\n \"recommended\"\n ],\n \"credits\": [\n {\n \"name\": \"lisa_wolfgang\",\n \"link\": \"https://scratch.mit.edu/users/lisa_wolfgang/\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"userstyle.css\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"customCssVariables\": [\n {\n \"name\": \"transitionDuration\",\n \"value\": {\n \"type\": \"map\",\n \"source\": {\n \"type\": \"settingValue\",\n \"settingId\": \"transitionDuration\"\n },\n \"options\": {\n \"none\": \"0s\",\n \"short\": \"0.15s\",\n \"default\": \"0.25s\",\n \"long\": \"0.5s\"\n }\n }\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Automatically collapse when mouse leaves sprite panel\",\n \"id\": \"autoCollapse\",\n \"type\": \"boolean\",\n \"default\": false\n },\n {\n \"dynamic\": true,\n \"name\": \"Collapse panel by default\",\n \"id\": \"hideByDefault\",\n \"type\": \"boolean\",\n \"default\": true,\n \"if\": {\n \"settings\": {\n \"autoCollapse\": false\n }\n }\n },\n {\n \"dynamic\": true,\n \"name\": \"Animation speed\",\n \"id\": \"transitionDuration\",\n \"type\": \"select\",\n \"potentialValues\": [\n {\n \"id\": \"none\",\n \"name\": \"Instant\"\n },\n {\n \"id\": \"short\",\n \"name\": \"Quick\"\n },\n {\n \"id\": \"default\",\n \"name\": \"Default\"\n },\n {\n \"id\": \"long\",\n \"name\": \"Slow\"\n }\n ],\n \"default\": \"default\"\n }\n ],\n \"dynamicDisable\": true,\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"name\": \"Switch variables between \\\"For all sprites\\\" and \\\"For this sprite only\\\"\",\n \"description\": \"Adds more options when renaming an existing variable or list: allows changing between \\\"For all sprites\\\" and \\\"For this sprite only\\\" and whether variables are stored in the cloud. Also adds a new option when right clicking a variable/list to quickly change its scope.\",\n \"credits\": [\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"style.css\"\n }\n ],\n \"tags\": [],\n \"dynamicDisable\": true,\n \"enabledByDefault\": true\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"name\": \"Draggable Categories in Block Palette\",\n \"description\": \"Allows you to click-and-hold categories in the block palette to re-arrange them.\",\n \"credits\": [\n {\n \"name\": \"SharkPool\",\n \"link\": \"https://github.com/SharkPool-SP/\"\n }\n ],\n \"info\": [\n {\n \"type\": \"notice\",\n \"text\": \"This addon is currently somewhat buggy when enabled alongside the \\\"Two-column category menu\\\" addon.\",\n \"id\": \"draggable-incompatibility\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"userstyle.css\"\n }\n ],\n \"tags\": [\"editor\", \"new\", \"recommended\"],\n \"enabledByDefault\": true,\n \"dynamicEnable\": true,\n \"dynamicDisable\": false\n};\nexport default manifest;","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Show full blocks in block palette on hover\",\n \"description\": \"When hovering the mouse over a block in the block palette, all blocks in the palette will no longer be cut off at the edge.\",\n \"tags\": [\n \"new\",\n \"recommended\"\n ],\n \"enabledByDefault\": false,\n \"dynamicEnable\": true,\n \"dynamicDisable\": true,\n \"userstyles\": [\n {\n \"url\": \"userstyle.css\"\n }\n ],\n \"credits\": [\n {\n \"name\": \"Gandi-IDE\",\n \"link\": \"https://github.com/Gandi-IDE/\"\n }\n ]\n};\nexport default manifest;","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Block transparency\",\n \"description\": \"Adjust the transparency for blocks in the editor, with separate options for orphaned blocks (those without a hat block at the top) and blocks that are being dragged.\",\n \"tags\": [],\n \"dynamicDisable\": true,\n \"credits\": [\n {\n \"name\": \"ErrorGamer2000\",\n \"link\": \"https://scratch.mit.edu/users/ErrorGamer2000/\"\n },\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Block transparency (%)\",\n \"id\": \"block\",\n \"type\": \"integer\",\n \"min\": 0,\n \"max\": 100,\n \"default\": 0\n },\n {\n \"dynamic\": true,\n \"name\": \"Orphaned transparency (%)\",\n \"id\": \"orphan\",\n \"type\": \"integer\",\n \"min\": 0,\n \"max\": 100,\n \"default\": 25\n },\n {\n \"dynamic\": true,\n \"name\": \"Dragged transparency (%)\",\n \"id\": \"dragged\",\n \"type\": \"integer\",\n \"min\": 0,\n \"max\": 100,\n \"default\": 25\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"userstyle.css\"\n }\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"noTranslations\": true,\n \"name\": \"Disable cloud variables\",\n \"description\": \"Disable cloud variables by default. You can still re-enable them using the Edit > Enable cloud variables menu.\",\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"tags\": [\n \"danger\"\n ],\n \"enabledByDefault\": false\n};\nimport {isScratchDesktop} from \"../../../lib/isScratchDesktop\";\nif (isScratchDesktop()) manifest.unsupported = true;\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"noTranslations\": true,\n \"name\": \"Hide backpack\",\n \"description\": \"Removes the backpack feature from the editor.\",\n \"userscripts\": [\n {\n \"url\": \"remove-backpack.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"remove-backpack.css\"\n }\n ],\n \"tags\": [\n \"danger\"\n ],\n \"dynamicDisable\": true,\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"noTranslations\": true,\n \"name\": \"Remove Back to Home button\",\n \"description\": \"Removes the Back to Home button from the menu bar.\",\n \"userstyles\": [\n {\n \"url\": \"remove-feedback.css\"\n }\n ],\n \"tags\": [],\n \"dynamicDisable\": true,\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Keep block comment connections straight\",\n \"description\": \"Forces block comments to always be connected to their source block by a horizontal straight line, not at an angle.\",\n \"tags\": [],\n \"credits\": [\n {\n \"name\": \"lisa_wolfgang\",\n \"link\": \"https://scratch.mit.edu/users/lisa_wolfgang/\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"dynamicDisable\": true,\n \"enabledByDefault\": false\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"noTranslations\": true,\n \"name\": \"Project volume slider\",\n \"description\": \"Adds a volume slider next to the green flag controls.\",\n \"credits\": [\n {\n \"name\": \"samq64\",\n \"link\": \"https://scratch.mit.edu/users/samq64/\"\n },\n {\n \"name\": \"GarboMuffin\"\n }\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"userstyle.css\"\n }\n ],\n \"settings\": [\n {\n \"name\": \"Default volume\",\n \"id\": \"defVol\",\n \"type\": \"integer\",\n \"min\": 0,\n \"max\": 100,\n \"default\": 100\n }\n ],\n \"dynamicDisable\": true,\n \"enabledByDefault\": true,\n \"tags\": [\n \"recommended\"\n ]\n};\nexport default manifest;\n","/* generated by pull.js */\nconst manifest = {\n \"noTranslations\": true,\n \"name\": \"High-quality sound editor waveform\",\n \"description\": \"Makes the quality of the sound editor's waveform preview configurable, at the cost of performance.\",\n \"credits\": [\n {\n \"name\": \"JeremyGamer13\"\n },\n {\n \"name\": \"SharkPool-SP\",\n \"link\": \"https://github.com/SharkPool-SP\"\n },\n ],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"info\": [\n {\n \"text\": \"Lower numbers means more samples are used to make the waveform, which may impact performance to the point of crashing the editor.\",\n \"id\": \"qualityWarning\"\n }\n ],\n \"settings\": [\n {\n \"name\": \"Use every (n)th sample\",\n \"id\": \"quality\",\n \"type\": \"integer\",\n \"min\": 1,\n \"max\": Number.MAX_SAFE_INTEGER,\n \"default\": 64\n }\n ],\n \"dynamicEnable\": true,\n \"dynamicDisable\": true,\n \"enabledByDefault\": false,\n \"tags\": [\n \"new\"\n ]\n};\nexport default manifest;","/* generated by pull.js */\nconst manifest = {\n \"editorOnly\": true,\n \"noTranslations\": true,\n \"name\": \"Alternating nested block colors\",\n \"description\": \"Makes blocks of the same category alternate between lighter and darker shades when nested inside each other. This is also known as zebra striping.\",\n \"credits\": [\n {\n \"name\": \"CST1229\",\n \"link\": \"https://scratch.mit.edu/users/CST1229/\"\n },\n {\n \"name\": \"GarboMuffin\"\n },\n {\n \"name\": \"TheColaber\",\n \"link\": \"https://scratch.mit.edu/users/thecolaber\"\n }\n ],\n \"tags\": [],\n \"userscripts\": [\n {\n \"url\": \"userscript.js\"\n }\n ],\n \"userstyles\": [\n {\n \"url\": \"userstyle.css\"\n }\n ],\n \"settings\": [\n {\n \"dynamic\": true,\n \"name\": \"Shade\",\n \"id\": \"shade\",\n \"type\": \"select\",\n \"potentialValues\": [\n {\n \"name\": \"Lighter\",\n \"id\": \"lighter\"\n },\n {\n \"name\": \"Darker\",\n \"id\": \"darker\"\n }\n ],\n \"default\": \"lighter\"\n },\n {\n \"dynamic\": true,\n \"name\": \"Intensity (0-100%)\",\n \"id\": \"intensity\",\n \"type\": \"integer\",\n \"min\": 0,\n \"default\": 20,\n \"max\": 100\n }\n ],\n \"customCssVariables\": [\n {\n \"name\": \"shadeNumber\",\n \"value\": {\n \"type\": \"map\",\n \"source\": {\n \"type\": \"settingValue\",\n \"settingId\": \"shade\"\n },\n \"options\": {\n \"lighter\": \"1\",\n \"darker\": \"-1\"\n }\n }\n }\n ],\n \"dynamicDisable\": true\n};\nexport default manifest;\n","export const isMobile = typeof window !== 'undefined' && 'ontouchstart' in window;\nexport const clipboardSupported = typeof navigator !== 'undefined' && navigator.clipboard && navigator.clipboard.write;\nexport const mediaRecorderSupported = typeof MediaRecorder !== 'undefined' && MediaRecorder.isTypeSupported('video/webm');\n","// Some browsers have a non-functional EventTarget, so we write our own version that works everywhere.\n\nclass EventTargetShim {\n constructor () {\n this._events = {};\n }\n\n addEventListener (event, handler) {\n if (!this._events[event]) {\n this._events[event] = [];\n }\n this._events[event].push(handler);\n }\n\n removeEventListener (event, handler) {\n const handlers = this._events[event];\n if (handlers) {\n this._events[event] = handlers.filter(i => i !== handler);\n }\n }\n\n dispatchEvent (event) {\n const handlers = this._events[event.type];\n if (handlers) {\n for (const fn of handlers) {\n fn(event);\n }\n }\n }\n}\n\nexport default EventTargetShim;\n","/* generated by pull.js */\nimport _toolbox_category_drag from \"../addons/toolbox-category-drag/_manifest_entry.js\";\nimport _cat_blocks from \"../addons/cat-blocks/_manifest_entry.js\";\nimport _fps from \"../addons/fps/_manifest_entry.js\";\nimport _ScratchHighlightFullwidthNumber from \"../addons/cat-blocks/_manifest_entry.js\";\nimport _debug_console from \"../addons/debug-console/_manifest_entry.js\";\nimport _editor_devtools from \"../addons/ScratchHighlightFullwidthNumber/_manifest_entry.js\";\nimport _find_bar from \"../addons/find-bar/_manifest_entry.js\";\nimport _paint_tool_panel from \"../addons/paint-tool-panel/_manifest_entry.js\";\nimport _middle_click_popup from \"../addons/middle-click-popup/_manifest_entry.js\";\nimport _editor_block_chomping from \"../addons/editor-block-chomping/_manifest_entry.js\";\nimport _jump_to_def from \"../addons/jump-to-def/_manifest_entry.js\";\nimport _editor_searchable_dropdowns from \"../addons/editor-searchable-dropdowns/_manifest_entry.js\";\nimport _block_palette_icons from \"../addons/block-palette-icons/_manifest_entry.js\";\nimport _hide_flyout from \"../addons/hide-flyout/_manifest_entry.js\";\nimport _mediarecorder from \"../addons/mediarecorder/_manifest_entry.js\";\nimport _drag_drop from \"../addons/drag-drop/_manifest_entry.js\";\nimport _debugger from \"../addons/debugger/_manifest_entry.js\";\nimport _mute_project from \"../addons/mute-project/_manifest_entry.js\";\nimport _vol_slider from \"../addons/vol-slider/_manifest_entry.js\";\nimport _clones from \"../addons/clones/_manifest_entry.js\";\nimport _mouse_pos from \"../addons/mouse-pos/_manifest_entry.js\";\nimport _color_picker from \"../addons/color-picker/_manifest_entry.js\";\nimport _remove_sprite_confirm from \"../addons/remove-sprite-confirm/_manifest_entry.js\";\nimport _block_count from \"../addons/block-count/_manifest_entry.js\";\nimport _onion_skinning from \"../addons/onion-skinning/_manifest_entry.js\";\nimport _paint_snap from \"../addons/paint-snap/_manifest_entry.js\";\nimport _default_costume_editor_color from \"../addons/default-costume-editor-color/_manifest_entry.js\";\nimport _bitmap_copy from \"../addons/bitmap-copy/_manifest_entry.js\";\nimport _2d_color_picker from \"../addons/2d-color-picker/_manifest_entry.js\";\nimport _better_img_uploads from \"../addons/better-img-uploads/_manifest_entry.js\";\nimport _pick_colors_from_stage from \"../addons/pick-colors-from-stage/_manifest_entry.js\";\nimport _custom_block_shape from \"../addons/custom-block-shape/_manifest_entry.js\";\nimport _zebra_striping from \"../addons/zebra-striping/_manifest_entry.js\";\nimport _editor_theme3 from \"../addons/editor-theme3/_manifest_entry.js\";\nimport _custom_block_text from \"../addons/custom-block-text/_manifest_entry.js\";\nimport _editor_colored_context_menus from \"../addons/editor-colored-context-menus/_manifest_entry.js\";\nimport _editor_stage_left from \"../addons/editor-stage-left/_manifest_entry.js\";\nimport _editor_buttons_reverse_order from \"../addons/editor-buttons-reverse-order/_manifest_entry.js\";\nimport _search_sprites from \"../addons/search-sprites/_manifest_entry.js\";\nimport _sprite_properties from \"../addons/sprite-properties/_manifest_entry.js\";\nimport _gamepad from \"../addons/gamepad/_manifest_entry.js\";\nimport _editor_sounds from \"../addons/editor-sounds/_manifest_entry.js\";\nimport _folders from \"../addons/folders/_manifest_entry.js\";\nimport _block_switching from \"../addons/block-switching/_manifest_entry.js\";\nimport _load_extensions from \"../addons/load-extensions/_manifest_entry.js\";\nimport _custom_zoom from \"../addons/custom-zoom/_manifest_entry.js\";\nimport _initialise_sprite_position from \"../addons/initialise-sprite-position/_manifest_entry.js\";\nimport _blocks2image from \"../addons/blocks2image/_manifest_entry.js\";\nimport _remove_curved_stage_border from \"../addons/remove-curved-stage-border/_manifest_entry.js\";\nimport _transparent_orphans from \"../addons/transparent-orphans/_manifest_entry.js\";\nimport _paint_by_default from \"../addons/paint-by-default/_manifest_entry.js\";\nimport _block_cherry_picking from \"../addons/block-cherry-picking/_manifest_entry.js\";\nimport _hide_new_variables from \"../addons/hide-new-variables/_manifest_entry.js\";\nimport _editor_extra_keys from \"../addons/editor-extra-keys/_manifest_entry.js\";\nimport _hide_delete_button from \"../addons/hide-delete-button/_manifest_entry.js\";\nimport _no_script_bumping from \"../addons/no-script-bumping/_manifest_entry.js\";\nimport _paint_gradient_maker from \"../addons/paint-gradient-maker/_manifest_entry.js\";\nimport _paint_rounded_rect_seperate from \"../addons/paint-rounded-rect-seperate/_manifest_entry.js\";\nimport _paint_default_smoothing from \"../addons/paint-default-smoothing/_manifest_entry.js\";\nimport _waveform_chunk_size from \"../addons/waveform-chunk-size/_manifest_entry.js\";\nimport _toolbox_full_blocks_on_hover from \"../addons/toolbox-full-blocks-on-hover/_manifest_entry.js\";\nimport _disable_stage_drag_select from \"../addons/disable-stage-drag-select/_manifest_entry.js\";\nimport _move_to_top_bottom from \"../addons/move-to-top-bottom/_manifest_entry.js\";\nimport _multi_tab_code from \"../addons/multi-tab-code/_manifest_entry.js\";\nimport _editor_animations from \"../addons/editor-animations/_manifest_entry.js\";\nimport _reorder_custom_inputs from \"../addons/reorder-custom-inputs/_manifest_entry.js\";\nimport _disable_paste_offset from \"../addons/disable-paste-offset/_manifest_entry.js\";\nimport _block_duplicate from \"../addons/block-duplicate/_manifest_entry.js\";\nimport _swap_local_global from \"../addons/swap-local-global/_manifest_entry.js\";\nimport _editor_comment_previews from \"../addons/editor-comment-previews/_manifest_entry.js\";\nimport _columns from \"../addons/columns/_manifest_entry.js\";\nimport _number_pad from \"../addons/number-pad/_manifest_entry.js\";\nimport _script_snap from \"../addons/script-snap/_manifest_entry.js\";\nimport _fullscreen from \"../addons/fullscreen/_manifest_entry.js\";\nimport _hide_stage from \"../addons/hide-stage/_manifest_entry.js\";\nimport _tw_straighten_comments from \"../addons/tw-straighten-comments/_manifest_entry.js\";\nimport _tw_remove_feedback from \"../addons/tw-remove-feedback/_manifest_entry.js\";\nimport _tw_remove_backpack from \"../addons/tw-remove-backpack/_manifest_entry.js\";\nimport _tw_disable_cloud_variables from \"../addons/tw-disable-cloud-variables/_manifest_entry.js\";\n\nexport default {\n \"paint-gradient-maker\": _paint_gradient_maker,\n \"paint-rounded-rect-seperate\": _paint_rounded_rect_seperate,\n \"paint-tool-panel\": _paint_tool_panel,\n \"paint-default-smoothing\": _paint_default_smoothing,\n \"toolbox-full-blocks-on-hover\": _toolbox_full_blocks_on_hover,\n \"waveform-chunk-size\": _waveform_chunk_size,\n \"fps\": _fps,\n \"debug-console\": _debug_console,\n \"ScratchHighlightFullwidthNumber\": _ScratchHighlightFullwidthNumber,\n \"cat-blocks\": _cat_blocks,\n \"editor-devtools\": _editor_devtools,\n \"find-bar\": _find_bar,\n \"middle-click-popup\": _middle_click_popup,\n \"editor-block-chomping\": _editor_block_chomping,\n \"jump-to-def\": _jump_to_def,\n \"editor-searchable-dropdowns\": _editor_searchable_dropdowns,\n \"block-palette-icons\": _block_palette_icons,\n \"hide-flyout\": _hide_flyout,\n \"mediarecorder\": _mediarecorder,\n \"drag-drop\": _drag_drop,\n \"debugger\": _debugger,\n \"mute-project\": _mute_project,\n \"vol-slider\": _vol_slider,\n \"clones\": _clones,\n \"mouse-pos\": _mouse_pos,\n \"color-picker\": _color_picker,\n \"remove-sprite-confirm\": _remove_sprite_confirm,\n \"block-count\": _block_count,\n \"onion-skinning\": _onion_skinning,\n \"paint-snap\": _paint_snap,\n \"default-costume-editor-color\": _default_costume_editor_color,\n \"bitmap-copy\": _bitmap_copy,\n \"2d-color-picker\": _2d_color_picker,\n \"better-img-uploads\": _better_img_uploads,\n \"pick-colors-from-stage\": _pick_colors_from_stage,\n \"custom-block-shape\": _custom_block_shape,\n \"zebra-striping\": _zebra_striping,\n \"editor-theme3\": _editor_theme3,\n \"custom-block-text\": _custom_block_text,\n \"editor-colored-context-menus\": _editor_colored_context_menus,\n \"editor-stage-left\": _editor_stage_left,\n \"editor-buttons-reverse-order\": _editor_buttons_reverse_order,\n \"search-sprites\": _search_sprites,\n \"sprite-properties\": _sprite_properties,\n \"gamepad\": _gamepad,\n \"editor-sounds\": _editor_sounds,\n \"folders\": _folders,\n \"block-switching\": _block_switching,\n \"load-extensions\": _load_extensions,\n \"custom-zoom\": _custom_zoom,\n \"initialise-sprite-position\": _initialise_sprite_position,\n \"blocks2image\": _blocks2image,\n \"remove-curved-stage-border\": _remove_curved_stage_border,\n \"transparent-orphans\": _transparent_orphans,\n \"paint-by-default\": _paint_by_default,\n \"block-cherry-picking\": _block_cherry_picking,\n \"hide-new-variables\": _hide_new_variables,\n \"editor-extra-keys\": _editor_extra_keys,\n \"toolbox-category-drag\": _toolbox_category_drag,\n \"hide-delete-button\": _hide_delete_button,\n \"no-script-bumping\": _no_script_bumping,\n \"disable-stage-drag-select\": _disable_stage_drag_select,\n \"move-to-top-bottom\": _move_to_top_bottom,\n \"disable-paste-offset\": _disable_paste_offset,\n \"block-duplicate\": _block_duplicate,\n \"swap-local-global\": _swap_local_global,\n \"editor-comment-previews\": _editor_comment_previews,\n \"columns\": _columns,\n \"number-pad\": _number_pad,\n \"script-snap\": _script_snap,\n \"fullscreen\": _fullscreen,\n \"hide-stage\": _hide_stage,\n \"tw-straighten-comments\": _tw_straighten_comments,\n \"tw-remove-feedback\": _tw_remove_feedback,\n \"tw-remove-backpack\": _tw_remove_backpack,\n \"tw-disable-cloud-variables\": _tw_disable_cloud_variables,\n \"vol-slider\": _vol_slider,\n \"multi-tab-code\": _multi_tab_code,\n \"editor-animations\": _editor_animations,\n \"reorder-custom-inputs\": _reorder_custom_inputs,\n};\n","import SettingsStore from './settings-store';\n\nconst settingStore = new SettingsStore();\nconst urlParameters = new URLSearchParams(location.search);\nif (urlParameters.has('addons')) {\n settingStore.parseUrlParameter(urlParameters.get('addons'));\n} else {\n settingStore.readLocalStorage();\n}\n\nexport default settingStore;\n","/**\n * Copyright (C) 2021 Thomas Weber\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License version 3 as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nimport addons from './generated/addon-manifests';\nimport upstreamMeta from './generated/upstream-meta.json';\nimport EventTargetShim from './event-target';\n\nconst SETTINGS_KEY = 'tw:addons';\nconst VERSION = 4;\n\nconst migrateSettings = settings => {\n const oldVersion = settings._;\n if (oldVersion === VERSION || !oldVersion) {\n return settings;\n }\n\n // Migrate 1 -> 2\n // tw-project-info is now block-count\n // tw-interface-customization split into tw-remove-backpack and tw-remove-feedback\n if (oldVersion < 2) {\n const projectInfo = settings['tw-project-info'];\n if (projectInfo && projectInfo.enabled) {\n settings['block-count'] = {\n enabled: true\n };\n }\n const interfaceCustomization = settings['tw-interface-customization'];\n if (interfaceCustomization && interfaceCustomization.enabled) {\n if (interfaceCustomization.removeBackpack) {\n settings['tw-remove-backpack'] = {\n enabled: true\n };\n }\n if (interfaceCustomization.removeFeedback) {\n settings['tw-remove-feedback'] = {\n enabled: true\n };\n }\n }\n }\n\n // Migrate 2 -> 3\n // The default value of hide-flyout's toggle setting changed from \"hover\" to \"cathover\"\n // We want to keep the old default value for existing users.\n if (oldVersion < 3) {\n const hideFlyout = settings['hide-flyout'];\n if (hideFlyout && hideFlyout.enabled && typeof hideFlyout.toggled === 'undefined') {\n hideFlyout.toggle = 'hover';\n }\n }\n\n // Migrate 3 -> 4\n // editor-devtools was broken up into find-bar and middle-click-popup.\n // If someone disabled editor-devtools, we want to keep these disabled.\n if (oldVersion < 4) {\n const editorDevtools = settings['editor-devtools'];\n if (editorDevtools && editorDevtools.enabled === false) {\n settings['find-bar'] = {\n enabled: false\n };\n settings['middle-click-popup'] = {\n enabled: false\n };\n }\n }\n\n return settings;\n};\n\n/**\n * @template T\n * @param {T|T[]} v A value\n * @returns {T[]} The value if it is a list, otherwise a 1 item list\n */\nconst asArray = v => {\n if (Array.isArray(v)) {\n return v;\n }\n return [v];\n};\n\nclass SettingsStore extends EventTargetShim {\n constructor () {\n super();\n this.store = this.createEmptyStore();\n this.remote = false;\n }\n\n /**\n * @private\n */\n createEmptyStore () {\n const result = {};\n for (const addonId of Object.keys(addons)) {\n result[addonId] = {};\n }\n return result;\n }\n\n readLocalStorage () {\n const base = this.store;\n try {\n const local = localStorage.getItem(SETTINGS_KEY);\n if (local) {\n let result = JSON.parse(local);\n if (result && typeof result === 'object') {\n result = migrateSettings(result);\n for (const key of Object.keys(result)) {\n if (base.hasOwnProperty(key)) {\n const value = result[key];\n if (value && typeof value === 'object') {\n base[key] = value;\n }\n }\n }\n }\n }\n } catch (e) {\n // ignore\n }\n this.store = base;\n }\n\n /**\n * @private\n */\n saveToLocalStorage () {\n if (this.remote) {\n return;\n }\n try {\n const result = {\n _: VERSION\n };\n for (const addonId of Object.keys(addons)) {\n const data = this.getAddonStorage(addonId);\n if (Object.keys(data).length > 0) {\n result[addonId] = data;\n }\n }\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(result));\n } catch (e) {\n // ignore\n }\n }\n\n /**\n * @private\n */\n getAddonStorage (addonId) {\n if (this.store[addonId]) {\n return this.store[addonId];\n }\n throw new Error(`Unknown addon store: ${addonId}`);\n }\n\n /**\n * @private\n */\n getAddonManifest (addonId) {\n if (addons[addonId]) {\n return addons[addonId];\n }\n throw new Error(`Unknown addon: ${addonId}`);\n }\n\n /**\n * @private\n */\n getAddonSettingObject (manifest, settingId) {\n if (!manifest.settings) {\n return null;\n }\n for (const setting of manifest.settings) {\n if (setting.id === settingId) {\n return setting;\n }\n }\n return null;\n }\n\n getAddonEnabled (addonId) {\n const manifest = this.getAddonManifest(addonId);\n if (manifest.unsupported) {\n return false;\n }\n const storage = this.getAddonStorage(addonId);\n if (storage.hasOwnProperty('enabled')) {\n return storage.enabled;\n }\n return !!manifest.enabledByDefault;\n }\n\n getAddonSetting (addonId, settingId) {\n const storage = this.getAddonStorage(addonId);\n const manifest = this.getAddonManifest(addonId);\n const settingObject = this.getAddonSettingObject(manifest, settingId);\n if (!settingObject) {\n throw new Error(`Unknown setting: ${settingId}`);\n }\n if (storage.hasOwnProperty(settingId)) {\n return storage[settingId];\n }\n return settingObject.default;\n }\n\n /**\n * @private\n */\n getDefaultSettings (addonId) {\n const manifest = this.getAddonManifest(addonId);\n const result = {};\n for (const {id, default: value} of manifest.settings) {\n result[id] = value;\n }\n return result;\n }\n\n setAddonEnabled (addonId, enabled) {\n const storage = this.getAddonStorage(addonId);\n const manifest = this.getAddonManifest(addonId);\n const oldValue = this.getAddonEnabled(addonId);\n if (enabled === null) {\n enabled = !!manifest.enabledByDefault;\n delete storage.enabled;\n } else if (typeof enabled === 'boolean') {\n storage.enabled = enabled;\n } else {\n throw new Error('Enabled value is invalid.');\n }\n this.saveToLocalStorage();\n if (enabled !== oldValue) {\n // Dynamic enable is always supported.\n // Dynamic disable requires addon support.\n const supportsDynamic = enabled ? true : !!manifest.dynamicDisable;\n this.dispatchEvent(new CustomEvent('setting-changed', {\n detail: {\n addonId,\n settingId: 'enabled',\n reloadRequired: !supportsDynamic,\n value: enabled\n }\n }));\n }\n }\n\n setAddonSetting (addonId, settingId, value) {\n const storage = this.getAddonStorage(addonId);\n const manifest = this.getAddonManifest(addonId);\n const settingObject = this.getAddonSettingObject(manifest, settingId);\n const oldValue = this.getAddonSetting(addonId, settingId);\n if (value === null) {\n value = settingObject.default;\n delete storage[settingId];\n } else {\n if (settingObject.type === 'boolean') {\n if (typeof value !== 'boolean') {\n throw new Error('Setting value is invalid.');\n }\n } else if (settingObject.type === 'integer') {\n if (typeof value !== 'number') {\n throw new Error('Setting value is invalid.');\n }\n } else if (settingObject.type === 'color') {\n if (typeof value !== 'string') {\n throw new Error('Color value is not a string.');\n }\n // Remove alpha channel from colors like #012345ff\n // We don't support transparency yet, but settings imported from Scratch Addons\n // might contain transparency.\n if (value.length === 9) {\n value = value.substring(0, 7);\n }\n if (!/^#[0-9a-f]{6}$/i.test(value)) {\n throw new Error('Color value is invalid format.');\n }\n } else if (settingObject.type === 'select') {\n if (!settingObject.potentialValues.some(potentialValue => potentialValue.id === value)) {\n throw new Error('Setting value is invalid.');\n }\n } else {\n throw new Error('Setting object is of unknown type');\n }\n storage[settingId] = value;\n }\n this.saveToLocalStorage();\n if (value !== oldValue) {\n this.dispatchEvent(new CustomEvent('setting-changed', {\n detail: {\n addonId,\n settingId,\n reloadRequired: !settingObject.dynamic,\n value\n }\n }));\n }\n }\n\n applyAddonPreset (addonId, presetId) {\n const manifest = this.getAddonManifest(addonId);\n for (const {id, values} of manifest.presets) {\n if (id !== presetId) {\n continue;\n }\n const settings = {\n ...this.getDefaultSettings(addonId),\n ...values\n };\n for (const key of Object.keys(settings)) {\n this.setAddonSetting(addonId, key, settings[key]);\n }\n return;\n }\n throw new Error(`Unknown preset: ${presetId}`);\n }\n\n resetAllAddons () {\n for (const addon of Object.keys(addons)) {\n this.resetAddon(addon, true);\n }\n // In case resetAddon missed some properties, do a hard reset on storage.\n this.store = this.createEmptyStore();\n this.saveToLocalStorage();\n }\n\n resetAddon (addonId, resetEverything) {\n const storage = this.getAddonStorage(addonId);\n for (const setting of Object.keys(storage)) {\n if (setting === 'enabled') {\n if (resetEverything) {\n this.setAddonEnabled(addonId, null);\n }\n continue;\n }\n try {\n this.setAddonSetting(addonId, setting, null);\n } catch (e) {\n // ignore\n }\n }\n }\n\n parseUrlParameter (parameter) {\n this.remote = true;\n const enabled = parameter.split(',');\n for (const id of Object.keys(addons)) {\n this.setAddonEnabled(id, enabled.includes(id));\n }\n }\n\n export ({theme}) {\n const result = {\n core: {\n // Upstream property. We don't use this.\n lightTheme: theme === 'light',\n // Doesn't matter what we set this to\n version: `v1.0.0-tw-${upstreamMeta.commit}`\n },\n addons: {}\n };\n for (const [addonId, manifest] of Object.entries(addons)) {\n const enabled = this.getAddonEnabled(addonId);\n const settings = {};\n if (manifest.settings) {\n for (const {id} of manifest.settings) {\n settings[id] = this.getAddonSetting(addonId, id);\n }\n }\n result.addons[addonId] = {\n enabled,\n settings\n };\n }\n return result;\n }\n\n import (data) {\n for (const [addonId, value] of Object.entries(data.addons)) {\n if (!addons.hasOwnProperty(addonId)) {\n continue;\n }\n const {enabled, settings} = value;\n if (typeof enabled === 'boolean') {\n this.setAddonEnabled(addonId, enabled);\n }\n for (const [settingId, settingValue] of Object.entries(settings)) {\n try {\n this.setAddonSetting(addonId, settingId, settingValue);\n } catch (e) {\n // ignore\n }\n }\n }\n }\n\n setStoreWithVersionCheck ({version, store}) {\n if (version !== upstreamMeta.commit) {\n return;\n }\n this.setStore(store);\n }\n\n setStore (newStore) {\n const oldStore = this.store;\n for (const addonId of Object.keys(oldStore)) {\n const oldSettings = oldStore[addonId];\n const newSettings = newStore[addonId];\n if (!newSettings || typeof newSettings !== 'object') {\n continue;\n }\n if (JSON.stringify(oldSettings) !== JSON.stringify(newSettings)) {\n const manifest = this.getAddonManifest(addonId);\n // Dynamic enable is always supported.\n const dynamicEnable = !oldSettings.enabled && newSettings.enabled;\n // Dynamic disable requires addon support.\n const dynamicDisable = !!manifest.dynamicDisable && oldSettings.enabled && !newSettings.enabled;\n // Clone to avoid pass-by-reference issues\n this.store[addonId] = JSON.parse(JSON.stringify(newSettings));\n this.dispatchEvent(new CustomEvent('addon-changed', {\n detail: {\n addonId,\n dynamicEnable,\n dynamicDisable\n }\n }));\n }\n }\n }\n\n /**\n * Evaluate an `if` value from addon.json.\n * @param {string} addonId The ID of the addon.\n * @param {unknown} condition Condition from addon.json\n * @returns {boolean} True if the condition is met.\n */\n evaluateCondition (addonId, condition) {\n if (!condition) {\n // No condition. Default to true.\n return true;\n }\n\n if (condition.addonEnabled) {\n // addonEnabled is an OR\n const addonsToCheck = asArray(condition.addonEnabled);\n if (addonsToCheck.every(id => !this.getAddonEnabled(id))) {\n return false;\n }\n }\n\n if (condition.settings) {\n // settings is an AND\n for (const [settingName, expectedValue] of Object.entries(condition.settings)) {\n if (this.getAddonSetting(addonId, settingName) !== expectedValue) {\n return false;\n }\n }\n }\n\n return true;\n }\n}\n\nexport default SettingsStore;\n"],"mappings":";;;;;;;;;;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;;;;;;;;;;;;ACvBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACpBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;;;;;;;;;;;;AClEA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACxBA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC3CA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;;;;;;;;;;;;ACpBA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC1BA;AAAA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;;;;;;;;;;;;AC1BA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;;;;;;;;;;;AC9IA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;;;;;;;;;;;;ACnBA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;;;;;;;;;;;;ACxCA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;;;;;;;;;;;;ACvCA;AAAA;AACA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC7BA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;;;;;;;;;;;;ACzBA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;;;;;;;;;;;AC7GA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACnDA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;;;;;;;;;;;ACnGA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AChBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;;;;;;;;;;;;AC3EA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACpDA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC1BA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACxBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAGA;AACA;AACA;;;;;;;;;;;;ACjCA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AAEA;AAEA;AACA;AAEA;AAGA;AACA;AACA;;;;;;;;;;;;ACtGA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACpBA;AAAA;AACA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AAEA;AACA;;;;;;;;;;;;ACdA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAGA;AACA;AACA;;;;;;;;;;;;AC3BA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC9FA;AAAA;AACA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC9DA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAGA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC5BA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACpBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAGA;AACA;AACA;;;;;;;;;;;;AChCA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;;;;;;;;;;;AC3YA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAGA;AACA;AACA;;;;;;;;;;;;ACpCA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAGA;AACA;AACA;;;;;;;;;;;;AChCA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AChBA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAGA;AACA;AACA;;;;;;;;;;;;AC5EA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACnCA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;;;;;;;;;;;ACxDA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAGA;AACA;;;;;;;;;;;;ACrHA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACnBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;;;;;;;;;;;;ACxBA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACrEA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAGA;AACA;AACA;AACA;;;;;;;;;;;;AC1BA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACxCA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACrBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAGA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;;;;;;;;;;;;ACpFA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAGA;AACA;AACA;;;;;;;;;;;;AC3BA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;;;;;;;;;;;;ACpBA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC3CA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AAGA;AACA;;;;;;;;;;;;AC5BA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACpBA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AAEA;AACA;AACA;;;;;;;;;;;;AC1BA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;AACA;;;;;;;;;;;;AC9GA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAGA;AACA;AACA;;;;;;;;;;;;AC5HA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAGA;AACA;;;;;;;;;;;;AChDA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACpBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAGA;AACA;;;;;;;;;;;;ACtBA;AAAA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC9GA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACxBA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;;;;;;;;;;;;ACzBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;;;;;;;;;;;;ACtBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAGA;AACA;AACA;;;;;;;;;;;;AChBA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;AACA;;;;;;;;;;;;ACrCA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC9DA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC5BA;AAAA;AACA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC3FA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACxBA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AChCA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;;;;;;;;;;;;ACzBA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;;;;;;;;;;;;ACpDA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAGA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACjBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAGA;AACA;AACA;AACA;;;;;;;;;;;;ACrBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACdA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACrBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;;;;;;;;;;;;ACxCA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAGA;AACA;;;;;;;;;;;;AC1CA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;;;;;;;;;;;AC5EA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;;;;;;;;;;;;ACFA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;;AC/BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;AClKA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/js/addons.js b/js/addons.js new file mode 100644 index 0000000000000000000000000000000000000000..801dab2bda59d0a7f0e57cda5c940a62a82ac932 --- /dev/null +++ b/js/addons.js @@ -0,0 +1,2645 @@ +(window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addons"],{ + +/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./src/addons/modal.css": +/*!*************************************************************************************************************!*\ + !*** ./node_modules/css-loader??ref--5-1!./node_modules/postcss-loader/src??postcss!./src/addons/modal.css ***! + \*************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, ".modal_modal-content_fN1pD {\n background-color: white;\n color: #575e75;\n}\n[theme=\"dark\"] .modal_modal-content_fN1pD {\n background-color: var(--ui-primary);\n color: var(--text-primary);\n}\n", ""]); + +// exports +exports.locals = { + "modal-content": "modal_modal-content_fN1pD", + "modalContent": "modal_modal-content_fN1pD" +}; + +/***/ }), + +/***/ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/mute-project/mute.svg": +/*!***************************************************************************************!*\ + !*** ./node_modules/url-loader/dist/cjs.js!./src/addons/addons/mute-project/mute.svg ***! + \***************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = ("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU1LjIgKDc4MTgxKSAtIGh0dHBzOi8vc2tldGNoYXBwLmNvbSAtLT4KICAgIDx0aXRsZT5Tb3VuZC9FZmZlY3RzL011dGU8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iU291bmQvRWZmZWN0cy9NdXRlIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBmaWxsPSIjQ0Y2M0NGIiBkPSJNMTMuNDU0MTc0OSw1LjA0ODE1MjQzIEwxNS42MjgxMTY4LDIuODc0MjEwNTQgQzE1LjkyMTAxLDIuNTgxMzE3MzIgMTYuMzk1ODgzNywyLjU4MTMxNzMyIDE2LjY4ODc3NywyLjg3NDIxMDU0IEMxNi45ODE2NzAyLDMuMTY3MTAzNzYgMTYuOTgxNjcwMiwzLjY0MTk3NzQ5IDE2LjY4ODc3NywzLjkzNDg3MDcxIEw0LjUzMDMzMDA5LDE2LjA5MzMxNzYgQzQuMjM3NDM2ODcsMTYuMzg2MjEwOCAzLjc2MjU2MzEzLDE2LjM4NjIxMDggMy40Njk2Njk5MSwxNi4wOTMzMTc2IEMzLjE3Njc3NjcsMTUuODAwNDI0NCAzLjE3Njc3NjcsMTUuMzI1NTUwNiAzLjQ2OTY2OTkxLDE1LjAzMjY1NzQgTDYuMzEyMTQ5MzIsMTIuMTkwMTc4IEM2LjEyNDExOTEsMTIuMDYyMTM3OSA2LDExLjg0NjMzMzEgNiwxMS42MDI5ODc1IEw2LDguNjM3NDg3NSBDNiw4LjI0NzExMjUgNi4zMTk0MTUyNyw3LjkyNzYxMjUgNi43MDk2ODY3NSw3LjkyNzYxMjUgTDcuMDI0NjAzMjIsNy45Mjc2MTI1IEM4Ljc1Nzc2ODQ4LDcuOTI3NjEyNSAxMC4yOTQxMTEsNi44MTM4NjI1IDEwLjgzMzk2NzgsNS4xNjY4NjI1IEMxMC45Mjk1Njc0LDQuODc0MzYyNSAxMS4yMDE3NDUyLDQuNjc3NDg3NSAxMS41MDc2NjQxLDQuNjc3NDg3NSBMMTIuODMxNDM3OSw0LjY3NzQ4NzUgQzEzLjEwMDI4NDQsNC42Nzc0ODc1IDEzLjMzNDEwNzUsNC44MjcxNzIwOCAxMy40NTQxNzQ5LDUuMDQ4MTUyNDMgWiBNMTMuNTQsOS4wODM2NDc3MSBMMTMuNTQsMTQuODUzMTEyNSBDMTMuNTQsMTUuMjQ1NzM3NSAxMy4yMjI4MzQxLDE1LjU2Mjk4NzUgMTIuODMxNDM3OSwxNS41NjI5ODc1IEwxMS41MDc2NjQxLDE1LjU2Mjk4NzUgQzExLjIwMTc0NTIsMTUuNTYyOTg3NSAxMC45Mjk1Njc0LDE1LjM2NjExMjUgMTAuODMzOTY3OCwxNS4wNzM2MTI1IEMxMC41NzczNzg1LDE0LjI5MDgwNzcgMTAuMDk1NjgxMywxMy42Mjg0NjUgOS40NzQ3MzUzMSwxMy4xNDg5MTI0IEwxMy41NCw5LjA4MzY0NzcxIFoiIGlkPSJwYXRoLTEiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+Cg=="); + +/***/ }), + +/***/ "./src/addons/addon-precedence.js": +/*!****************************************!*\ + !*** ./src/addons/addon-precedence.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +// This list is a subset of `addons` and defines the order by which addon CSS should +// applied in. Items later in this list are given higher precedence. Addons not listed +// here are implied to have the lowest possible precedence. +const addonPrecedence = ['columns', 'editor-stage-left', 'editor-theme3']; + +/** + * @param {string} addonId The addon ID + * @returns {number} An integer >= 0 + */ +const getPrecedence = addonId => addonPrecedence.indexOf(addonId) + 1; +/* harmony default export */ __webpack_exports__["default"] = (getPrecedence); + +/***/ }), + +/***/ "./src/addons/addons-l10n/en.json": +/*!****************************************!*\ + !*** ./src/addons/addons-l10n/en.json ***! + \****************************************/ +/*! exports provided: editor-devtools/clean-plus, editor-devtools/copy-all, editor-devtools/copy-block, editor-devtools/cut-block, editor-devtools/lists, editor-devtools/make-space, editor-devtools/orphaned, editor-devtools/paste, editor-devtools/replace, editor-devtools/swap, editor-devtools/unused-list, editor-devtools/unused-var, editor-devtools/var-not-exist, editor-devtools/variables, find-bar/complex-broadcast, find-bar/find-placeholder, middle-click-popup/start-typing, editor-searchable-dropdowns/createBroadcast, editor-searchable-dropdowns/createGlobalList, editor-searchable-dropdowns/createGlobalVariable, editor-searchable-dropdowns/createLocalList, editor-searchable-dropdowns/createLocalVariable, data-category-tweaks-v2/for-all-sprites, data-category-tweaks-v2/for-this-sprite-only, data-category-tweaks-v2/list-category, hide-flyout/lock, hide-flyout/unlock, mediarecorder/cancel, mediarecorder/click-flag, mediarecorder/click-flag-description, mediarecorder/option-title, mediarecorder/record, mediarecorder/record-after-flag, mediarecorder/record-audio, mediarecorder/record-audio-description, mediarecorder/record-description, mediarecorder/record-duration, mediarecorder/record-mic, mediarecorder/record-until-stop, mediarecorder/record-until-stop-disabled, mediarecorder/start, mediarecorder/start-delay, mediarecorder/starting-in, mediarecorder/stop, debugger/block-breakpoint, debugger/block-error, debugger/block-log, debugger/block-warn, debugger/cannot-pause-player, debugger/clear, debugger/clone-of, debugger/close, debugger/console, debugger/debug, debugger/empty-string, debugger/enter-format, debugger/export, debugger/export-desc, debugger/icon-error, debugger/icon-warn, debugger/log-msg-broadcasted, debugger/log-msg-clone-cap, debugger/log-msg-clone-created, debugger/log-msg-flag-clicked, debugger/no-logs, debugger/no-threads-running, debugger/step, debugger/step-desc, debugger/tab-logs, debugger/tab-threads, debugger/thread, debugger/unknown-sprite, debugger/unpause, pause/pause, clones/clones, color-picker/hex, remove-sprite-confirm/confirm, block-count/blocks, onion-skinning/behind, onion-skinning/front, onion-skinning/layering, onion-skinning/merge, onion-skinning/mode, onion-skinning/next, onion-skinning/opacity, onion-skinning/opacityStep, onion-skinning/previous, onion-skinning/settings, onion-skinning/tint, onion-skinning/toggle, paint-snap/boxCenter, paint-snap/boxCorners, paint-snap/boxEdgeMids, paint-snap/objectCenters, paint-snap/objectCorners, paint-snap/objectEdges, paint-snap/objectMidlines, paint-snap/off, paint-snap/on, paint-snap/pageAxes, paint-snap/pageCenter, paint-snap/pageCorners, paint-snap/pageEdges, paint-snap/settings, paint-snap/snapFrom, paint-snap/snapTo, paint-snap/threshold, paint-snap/toggle, 2d-color-picker/shade, better-img-uploads/upload, variable-manager/for-all-sprites, variable-manager/for-this-sprite, variable-manager/search, variable-manager/too-big, variable-manager/variables, search-sprites/placeholder, sprite-properties/close-properties-panel-tooltip, sprite-properties/open-properties-panel-tooltip, gamepad/axes-a-b, gamepad/axis-arrows, gamepad/axis-cursor, gamepad/axis-custom, gamepad/axis-none, gamepad/browser-support, gamepad/button-n, gamepad/clear, gamepad/config-header, gamepad/key-click, gamepad/key-down, gamepad/key-enter, gamepad/key-left, gamepad/key-none, gamepad/key-right, gamepad/key-space, gamepad/key-up, gamepad/keyinput-title, gamepad/no-controllers, gamepad/reset, gamepad/settings, gamepad/store-in-project, folders/add-to-folder, folders/closed-folder, folders/confirm-backpack-folder, folders/create-folder, folders/name-not-allowed, folders/name-prompt, folders/name-prompt-title, folders/open-folder, folders/remove-folder, folders/remove-from-folder, folders/rename-folder, folders/rename-folder-prompt, folders/rename-folder-prompt-title, block-switching/control_forever, block-switching/control_if, block-switching/control_if_else, block-switching/control_repeat_until, block-switching/control_while, block-switching/control_wait_until, block-switching/data_changevariableby, block-switching/data_deletealloflist, block-switching/data_deleteoflist, block-switching/data_hidelist, block-switching/data_hidevariable, block-switching/data_insertatlist, block-switching/data_replaceitemoflist, block-switching/data_setvariableto, block-switching/data_showlist, block-switching/data_showvariable, block-switching/debugger_error, block-switching/debugger_log, block-switching/debugger_warn, block-switching/event_broadcast, block-switching/event_broadcastandwait, block-switching/looks_backdropnumbername, block-switching/looks_changeeffectby, block-switching/looks_changesizeby, block-switching/looks_costumenumbername, block-switching/looks_goforwardbackwardlayers, block-switching/looks_gotofrontback, block-switching/looks_hide, block-switching/looks_nextbackdrop, block-switching/looks_nextcostume, block-switching/looks_say, block-switching/looks_sayforsecs, block-switching/looks_seteffectto, block-switching/looks_setsizeto, block-switching/looks_show, block-switching/looks_switchbackdropto, block-switching/looks_switchbackdroptoandwait, block-switching/looks_think, block-switching/looks_thinkforsecs, block-switching/motion_changexby, block-switching/motion_changeyby, block-switching/motion_setx, block-switching/motion_sety, block-switching/motion_changebyxy, block-switching/motion_gotoxy, block-switching/motion_turnleft, block-switching/motion_turnright, block-switching/motion_xposition, block-switching/motion_yposition, block-switching/music_changeTempo, block-switching/music_setTempo, block-switching/operator_add, block-switching/operator_and, block-switching/operator_divide, block-switching/operator_equals, block-switching/operator_notequal, block-switching/operator_gt, block-switching/operator_lt, block-switching/operator_gtorequal, block-switching/operator_ltorequal, block-switching/operator_mod, block-switching/operator_multiply, block-switching/operator_or, block-switching/operator_subtract, block-switching/operator_trueBoolean, block-switching/operator_falseBoolean, block-switching/operator_power, block-switching/pen_changePenColorParamBy, block-switching/pen_changePenHueBy, block-switching/pen_changePenShadeBy, block-switching/pen_changePenSizeBy, block-switching/pen_penDown, block-switching/pen_penUp, block-switching/pen_setPenColorParamTo, block-switching/pen_setPenHueToNumber, block-switching/pen_setPenShadeToNumber, block-switching/pen_setPenSizeTo, block-switching/sensing_coloristouchingcolor, block-switching/sensing_mousex, block-switching/sensing_mousey, block-switching/sensing_touchingcolor, block-switching/sound_changeeffectby, block-switching/sound_changevolumeby, block-switching/sound_play, block-switching/sound_playuntildone, block-switching/sound_seteffectto, block-switching/sound_setvolumeto, blocks2image/error_blocks_not_added, blocks2image/export_all_to_PNG, blocks2image/export_all_to_SVG, blocks2image/export_selected_to_PNG, blocks2image/export_selected_to_SVG, editor-extra-keys/enter-key, move-to-top-bottom/bottom, move-to-top-bottom/top, swap-local-global/cant-convert-cloud, swap-local-global/cant-convert-conflict, swap-local-global/cant-convert-stage, swap-local-global/cant-convert-to-local, swap-local-global/cant-convert-used-elsewhere, swap-local-global/edit, swap-local-global/edit-list-header, swap-local-global/edit-list-option, swap-local-global/edit-variable-header, swap-local-global/edit-variable-option, swap-local-global/to-global, swap-local-global/to-local, hide-stage/hide-stage, default */ +/***/ (function(module) { + +module.exports = JSON.parse("{\"editor-devtools/clean-plus\":\"Clean up Blocks +\",\"editor-devtools/copy-all\":\"Copy All\",\"editor-devtools/copy-block\":\"Copy Block\",\"editor-devtools/cut-block\":\"Cut Block\",\"editor-devtools/lists\":\"lists\",\"editor-devtools/make-space\":\"Make Space\",\"editor-devtools/orphaned\":\"{count, plural, one {Developer tools: Delete 1 orphaned reporter block?} other {Developer tools: Delete # orphaned reporter blocks?} }\",\"editor-devtools/paste\":\"Paste\",\"editor-devtools/replace\":\"Developer tools: Switch all {name} in this sprite for the variable named:\",\"editor-devtools/swap\":\"Swap {var} in Sprite\",\"editor-devtools/unused-list\":\"{count, plural, one {Developer tools: Delete 1 unused local list? Here it is:\\n} other {Developer tools: Delete # unused local lists? Here they are:\\n} }\",\"editor-devtools/unused-var\":\"{count, plural, one {Developer tools: Delete 1 unused local variable? Here it is:\\n} other {Developer tools: Delete # unused local variables? Here they are:\\n} }\",\"editor-devtools/var-not-exist\":\"That variable does not exist...\",\"editor-devtools/variables\":\"variables\",\"find-bar/complex-broadcast\":\"(expression)\",\"find-bar/find-placeholder\":\"Find (Ctrl+F)\",\"middle-click-popup/start-typing\":\"Start Typing...\",\"editor-searchable-dropdowns/createBroadcast\":\"Create message \\\"{name}\\\"\",\"editor-searchable-dropdowns/createGlobalList\":\"Create list \\\"{name}\\\" for all sprites\",\"editor-searchable-dropdowns/createGlobalVariable\":\"Create variable \\\"{name}\\\" for all sprites\",\"editor-searchable-dropdowns/createLocalList\":\"Create list \\\"{name}\\\" for this sprite only\",\"editor-searchable-dropdowns/createLocalVariable\":\"Create variable \\\"{name}\\\" for this sprite only\",\"data-category-tweaks-v2/for-all-sprites\":\"For all sprites:\",\"data-category-tweaks-v2/for-this-sprite-only\":\"For this sprite only:\",\"data-category-tweaks-v2/list-category\":\"Lists\",\"hide-flyout/lock\":\"Lock Palette\",\"hide-flyout/unlock\":\"Unlock Palette\",\"mediarecorder/cancel\":\"Cancel\",\"mediarecorder/click-flag\":\"Waiting...\",\"mediarecorder/click-flag-description\":\"Click the green flag to start recording. Click this button to stop.\",\"mediarecorder/option-title\":\"Record Options\",\"mediarecorder/record\":\"Record\",\"mediarecorder/record-after-flag\":\"Do not start recording until the Green Flag is clicked\",\"mediarecorder/record-audio\":\"Include project sounds\",\"mediarecorder/record-audio-description\":\"This does not include Text-to-Speech.\",\"mediarecorder/record-description\":\"Record the stage as an MP4 or WebM file. You can save it to your computer after the recording is finished.\\nNote: variable and list monitors will not be visible.\",\"mediarecorder/record-duration\":\"Record Duration (in seconds)\",\"mediarecorder/record-mic\":\"Include sounds from microphone\",\"mediarecorder/record-until-stop\":\"Stop recording after the project has stopped\",\"mediarecorder/record-until-stop-disabled\":\"You need to enable \\\"{afterFlagOption}\\\" to use this option.\",\"mediarecorder/start\":\"Start\",\"mediarecorder/start-delay\":\"Start Delay (in seconds)\",\"mediarecorder/starting-in\":\"Starting in {secs}...\",\"mediarecorder/stop\":\"Stop Recording\",\"debugger/block-breakpoint\":\"breakpoint\",\"debugger/block-error\":\"error %s\",\"debugger/block-log\":\"log %s\",\"debugger/block-warn\":\"warn %s\",\"debugger/cannot-pause-player\":\"Breakpoint block can only be used while on the editor.\",\"debugger/clear\":\"Clear\",\"debugger/clone-of\":\"Clone of {sprite}\",\"debugger/close\":\"Close\",\"debugger/console\":\"Logs\",\"debugger/debug\":\"Debug\",\"debugger/empty-string\":\"(empty string)\",\"debugger/enter-format\":\"Enter export format:\",\"debugger/export\":\"Export\",\"debugger/export-desc\":\"Click while holding Shift to customize export format.\",\"debugger/icon-error\":\"Error\",\"debugger/icon-warn\":\"Warning\",\"debugger/log-msg-broadcasted\":\"Broadcasted '{broadcast}'.\",\"debugger/log-msg-clone-cap\":\"Failed to create clone of '{sprite}', cannot create over 300 clones.\",\"debugger/log-msg-clone-created\":\"Created clone of '{sprite}'.\",\"debugger/log-msg-flag-clicked\":\"Green flag clicked.\",\"debugger/no-logs\":\"There are no logs to display.\",\"debugger/no-threads-running\":\"No threads running.\",\"debugger/step\":\"Step\",\"debugger/step-desc\":\"Executes one block.\",\"debugger/tab-logs\":\"Logs\",\"debugger/tab-threads\":\"Threads\",\"debugger/thread\":\"Thread {id}\",\"debugger/unknown-sprite\":\"(unknown sprite)\",\"debugger/unpause\":\"Resume\",\"pause/pause\":\"Pause\",\"clones/clones\":\"clones: {cloneCount}\",\"color-picker/hex\":\"hex color\",\"remove-sprite-confirm/confirm\":\"Do you want to delete the sprite?\",\"block-count/blocks\":\"{num, plural, one {1 block} other {# blocks}}\",\"onion-skinning/behind\":\"Behind\",\"onion-skinning/front\":\"Front\",\"onion-skinning/layering\":\"Layering\",\"onion-skinning/merge\":\"Merge\",\"onion-skinning/mode\":\"Mode\",\"onion-skinning/next\":\"Next costumes\",\"onion-skinning/opacity\":\"Opacity (%)\",\"onion-skinning/opacityStep\":\"Opacity step (%)\",\"onion-skinning/previous\":\"Previous costumes\",\"onion-skinning/settings\":\"Onion Skinning Settings\",\"onion-skinning/tint\":\"Tint\",\"onion-skinning/toggle\":\"Toggle Onion Skinning\",\"paint-snap/boxCenter\":\"Center of selection\",\"paint-snap/boxCorners\":\"Corners of selection\",\"paint-snap/boxEdgeMids\":\"Selection edge midpoints\",\"paint-snap/objectCenters\":\"Centers of objects\",\"paint-snap/objectCorners\":\"Corners of objects\",\"paint-snap/objectEdges\":\"Edges of objects\",\"paint-snap/objectMidlines\":\"Midlines of objects\",\"paint-snap/off\":\"Off\",\"paint-snap/on\":\"On\",\"paint-snap/pageAxes\":\"Page x and y axes\",\"paint-snap/pageCenter\":\"Center of the page\",\"paint-snap/pageCorners\":\"Corners of the page\",\"paint-snap/pageEdges\":\"Edges of the page\",\"paint-snap/settings\":\"Snap Settings\",\"paint-snap/snapFrom\":\"Snap from:\",\"paint-snap/snapTo\":\"Snap to:\",\"paint-snap/threshold\":\"Snapping distance\",\"paint-snap/toggle\":\"Toggle Snapping\",\"2d-color-picker/shade\":\"Shade\",\"better-img-uploads/upload\":\"HD Upload\",\"variable-manager/for-all-sprites\":\"Variables for all sprites\",\"variable-manager/for-this-sprite\":\"Variables for this sprite\",\"variable-manager/search\":\"Search\",\"variable-manager/too-big\":\"Click to display very large value.\",\"variable-manager/variables\":\"Variables\",\"search-sprites/placeholder\":\"Search sprites...\",\"sprite-properties/close-properties-panel-tooltip\":\"Collapse properties panel\",\"sprite-properties/open-properties-panel-tooltip\":\"Open properties panel\",\"gamepad/axes-a-b\":\"Axes {a} & {b}\",\"gamepad/axis-arrows\":\"Arrow Keys\",\"gamepad/axis-cursor\":\"Cursor\",\"gamepad/axis-custom\":\"Custom\",\"gamepad/axis-none\":\"None\",\"gamepad/browser-support\":\"This browser and operating system have known bugs that may make this addon difficult to use. Try another browser if you encounter problems.\",\"gamepad/button-n\":\"Button {n}\",\"gamepad/clear\":\"Clear all controls\",\"gamepad/config-header\":\"This comment contains configuration for gamepad support in third-party tools or websites such as https://turbowarp.org/\\nDo not edit by hand\",\"gamepad/key-click\":\"Click\",\"gamepad/key-down\":\"Down\",\"gamepad/key-enter\":\"Enter\",\"gamepad/key-left\":\"Left\",\"gamepad/key-none\":\"(none)\",\"gamepad/key-right\":\"Right\",\"gamepad/key-space\":\"Space\",\"gamepad/key-up\":\"Up\",\"gamepad/keyinput-title\":\"Click and press a key or click to change button. Escape to cancel. Backspace or delete to clear.\",\"gamepad/no-controllers\":\"No controllers detected. Try plugging one in and pressing a button on it.\",\"gamepad/reset\":\"Reset all controls to project defaults\",\"gamepad/settings\":\"Gamepad Settings\",\"gamepad/store-in-project\":\"Store these settings in the project to override the default configuration (Experimental tool for project creators)\",\"folders/add-to-folder\":\"add to folder: {folder}\",\"folders/closed-folder\":\"Folder\",\"folders/confirm-backpack-folder\":\"Save entire folder to backpack?\",\"folders/create-folder\":\"create folder\",\"folders/name-not-allowed\":\"Invalid folder name\",\"folders/name-prompt\":\"Name of folder:\",\"folders/name-prompt-title\":\"Create Folder\",\"folders/open-folder\":\"Opened\",\"folders/remove-folder\":\"remove folder\",\"folders/remove-from-folder\":\"remove from folder\",\"folders/rename-folder\":\"rename folder\",\"folders/rename-folder-prompt\":\"Rename folder to:\",\"folders/rename-folder-prompt-title\":\"Rename Folder\",\"block-switching/control_forever\":\"forever\",\"block-switching/control_if\":\"if\",\"block-switching/control_if_else\":\"if... else\",\"block-switching/control_repeat_until\":\"repeat until\",\"block-switching/control_while\":\"while\",\"block-switching/control_wait_until\":\"wait until\",\"block-switching/data_changevariableby\":\"change variable\",\"block-switching/data_deletealloflist\":\"delete all\",\"block-switching/data_deleteoflist\":\"delete item\",\"block-switching/data_hidelist\":\"hide list\",\"block-switching/data_hidevariable\":\"hide variable\",\"block-switching/data_insertatlist\":\"insert item\",\"block-switching/data_replaceitemoflist\":\"replace item\",\"block-switching/data_setvariableto\":\"set variable\",\"block-switching/data_showlist\":\"show list\",\"block-switching/data_showvariable\":\"show variable\",\"block-switching/debugger_error\":\"error\",\"block-switching/debugger_log\":\"log\",\"block-switching/debugger_warn\":\"warn\",\"block-switching/event_broadcast\":\"broadcast\",\"block-switching/event_broadcastandwait\":\"broadcast and wait\",\"block-switching/looks_backdropnumbername\":\"backdrop number or name\",\"block-switching/looks_changeeffectby\":\"change effect\",\"block-switching/looks_changesizeby\":\"change size\",\"block-switching/looks_costumenumbername\":\"costume number or name\",\"block-switching/looks_goforwardbackwardlayers\":\"go forward or backward layers\",\"block-switching/looks_gotofrontback\":\"go to front or back layer\",\"block-switching/looks_hide\":\"hide\",\"block-switching/looks_nextbackdrop\":\"next backdrop\",\"block-switching/looks_nextcostume\":\"next costume\",\"block-switching/looks_say\":\"say\",\"block-switching/looks_sayforsecs\":\"say for seconds\",\"block-switching/looks_seteffectto\":\"set effect\",\"block-switching/looks_setsizeto\":\"set size\",\"block-switching/looks_show\":\"show\",\"block-switching/looks_switchbackdropto\":\"switch backdrop\",\"block-switching/looks_switchbackdroptoandwait\":\"switch backdrop and wait\",\"block-switching/looks_think\":\"think\",\"block-switching/looks_thinkforsecs\":\"think for seconds\",\"block-switching/motion_changexby\":\"change x\",\"block-switching/motion_changeyby\":\"change y\",\"block-switching/motion_setx\":\"set x\",\"block-switching/motion_sety\":\"set y\",\"block-switching/motion_changebyxy\":\"change by x y\",\"block-switching/motion_gotoxy\":\"goto x y\",\"block-switching/motion_turnleft\":\"turn left\",\"block-switching/motion_turnright\":\"turn right\",\"block-switching/motion_xposition\":\"x position\",\"block-switching/motion_yposition\":\"y position\",\"block-switching/music_changeTempo\":\"change tempo\",\"block-switching/music_setTempo\":\"set tempo\",\"block-switching/operator_add\":\"+\",\"block-switching/operator_and\":\"and\",\"block-switching/operator_divide\":\"/\",\"block-switching/operator_equals\":\"=\",\"block-switching/operator_notequal\":\"≠\",\"block-switching/operator_gt\":\">\",\"block-switching/operator_lt\":\"<\",\"block-switching/operator_gtorequal\":\"≥\",\"block-switching/operator_ltorequal\":\"≤\",\"block-switching/operator_mod\":\"mod\",\"block-switching/operator_multiply\":\"*\",\"block-switching/operator_or\":\"or\",\"block-switching/operator_subtract\":\"-\",\"block-switching/operator_trueBoolean\":\"true\",\"block-switching/operator_falseBoolean\":\"false\",\"block-switching/operator_power\":\"^\",\"block-switching/pen_changePenColorParamBy\":\"change parameter\",\"block-switching/pen_changePenHueBy\":\"change hue\",\"block-switching/pen_changePenShadeBy\":\"change shade\",\"block-switching/pen_changePenSizeBy\":\"change size\",\"block-switching/pen_penDown\":\"pen down\",\"block-switching/pen_penUp\":\"pen up\",\"block-switching/pen_setPenColorParamTo\":\"set parameter\",\"block-switching/pen_setPenHueToNumber\":\"set hue\",\"block-switching/pen_setPenShadeToNumber\":\"set shade\",\"block-switching/pen_setPenSizeTo\":\"set size\",\"block-switching/sensing_coloristouchingcolor\":\"color touching color\",\"block-switching/sensing_mousex\":\"mouse x\",\"block-switching/sensing_mousey\":\"mouse y\",\"block-switching/sensing_touchingcolor\":\"touching color\",\"block-switching/sound_changeeffectby\":\"change effect\",\"block-switching/sound_changevolumeby\":\"change volume\",\"block-switching/sound_play\":\"start\",\"block-switching/sound_playuntildone\":\"play until done\",\"block-switching/sound_seteffectto\":\"set effect\",\"block-switching/sound_setvolumeto\":\"set volume\",\"blocks2image/error_blocks_not_added\":\"Add blocks to workspace!\",\"blocks2image/export_all_to_PNG\":\"Export all as PNG\",\"blocks2image/export_all_to_SVG\":\"Export all as SVG\",\"blocks2image/export_selected_to_PNG\":\"Export block as PNG\",\"blocks2image/export_selected_to_SVG\":\"Export block as SVG\",\"editor-extra-keys/enter-key\":\"enter\",\"move-to-top-bottom/bottom\":\"move to bottom\",\"move-to-top-bottom/top\":\"move to top\",\"swap-local-global/cant-convert-cloud\":\"Cloud variables can't be converted to this sprite only.\",\"swap-local-global/cant-convert-conflict\":\"Can't convert because it would conflict with variables in another sprite: {sprites}\",\"swap-local-global/cant-convert-stage\":\"The stage can't have variables for this sprite only.\",\"swap-local-global/cant-convert-to-local\":\"Can't convert because it's used by multiple sprites: {sprites}\",\"swap-local-global/cant-convert-used-elsewhere\":\"Can't convert because it's used by another sprite: {sprite}\",\"swap-local-global/edit\":\"Edit properties:\",\"swap-local-global/edit-list-header\":\"Edit List\",\"swap-local-global/edit-list-option\":\"Rename or edit list\",\"swap-local-global/edit-variable-header\":\"Edit Variable\",\"swap-local-global/edit-variable-option\":\"Rename or edit variable\",\"swap-local-global/to-global\":\"Convert to \\\"For all sprites\\\"\",\"swap-local-global/to-local\":\"Convert to \\\"For this sprite only\\\"\",\"hide-stage/hide-stage\":\"Hide stage\"}"); + +/***/ }), + +/***/ "./src/addons/addons/drag-drop/_runtime_entry.js": +/*!*******************************************************!*\ + !*** ./src/addons/addons/drag-drop/_runtime_entry.js ***! + \*******************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/drag-drop/userscript.js"); +/* generated by pull.js */ + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"] +}; + +/***/ }), + +/***/ "./src/addons/addons/drag-drop/userscript.js": +/*!***************************************************!*\ + !*** ./src/addons/addons/drag-drop/userscript.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (async function (_ref) { + let { + addon, + console + } = _ref; + /** @type {HTMLElement|null} */ + let currentDraggingElement = null; + + /** @type {WeakMap} */ + const allAnimations = new WeakMap(); + const FORWARD = 1; + const REVERSE = -1; + + /** + * @param {HTMLElement} element + * @param {number} direction + * @returns {Animation} + */ + const animateElement = (element, direction) => { + /** @type {Animation} */ + let animation; + if (allAnimations.has(element)) { + animation = allAnimations.get(element); + } else { + animation = element.animate([{ + // this object intentionally empty so the element animates from whatever its default value + // is in CSS. + }, { + backgroundColor: "#60E1FF" + }], { + duration: 250, + fill: "forwards", + easing: "ease" + }); + allAnimations.set(element, animation); + } + animation.playbackRate = direction; + }; + const nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set; + const reactAwareSetValue = (el, value) => { + nativeInputValueSetter.call(el, value); + el.dispatchEvent(new Event("change", { + bubbles: true + })); + }; + const globalHandleDragOver = e => { + if (addon.self.disabled) return; + if (!e.dataTransfer.types.includes("Files")) { + return; + } + let el; + let callback; + if ((el = e.target.closest('div[class*="sprite-selector_sprite-selector"]')) || (el = e.target.closest('div[class*="stage-selector_stage-selector"]')) || (el = e.target.closest('div[class*="selector_wrapper"]'))) { + callback = files => { + const hdFilter = addon.settings.get("use-hd-upload") ? "" : ":not(.sa-better-img-uploads-input)"; + const fileInput = el.querySelector('input[class*="action-menu_file-input"]' + hdFilter); + fileInput.files = files; + fileInput.dispatchEvent(new Event("change", { + bubbles: true + })); + }; + } else if (el = e.target.closest('div[class*="monitor_list-monitor"]')) { + callback = files => { + const contextMenuBefore = document.querySelector("body > .react-contextmenu.react-contextmenu--visible"); + // Simulate a right click on the list monitor + el.dispatchEvent(new MouseEvent("contextmenu", { + bubbles: true + })); + // Get the right click menu that opened (monitor context menus are + // children of ) + const contextMenuAfter = document.querySelector("body > .react-contextmenu.react-contextmenu--visible"); + // `contextMenuAfter` is only null if the context menu was already open + // for the list monitor, in which case we can use the context menu from + // before the simulated right click + const contextMenu = contextMenuAfter === null ? contextMenuBefore : contextMenuAfter; + // Sometimes the menu flashes open, so force hide it. + contextMenu.style.display = "none"; + // Override DOM methods to import the text file directly + // See: https://github.com/LLK/scratch-gui/blob/develop/src/lib/import-csv.js#L21-L22 + const appendChild = document.body.appendChild; + document.body.appendChild = fileInput => { + // Restore appendChild to + document.body.appendChild = appendChild; + if (fileInput instanceof HTMLInputElement) { + document.body.appendChild(fileInput); + // Prevent Scratch from opening the file input dialog + fileInput.click = () => {}; + // Insert files from the drop event into the file input + fileInput.files = files; + fileInput.dispatchEvent(new Event("change")); + window.requestAnimationFrame(() => { + window.requestAnimationFrame(() => { + contextMenu.style.display = null; + contextMenu.style.opacity = 0; + contextMenu.style.pointerEvents = "none"; + }); + }); + } else { + // The next call for `appendChild` SHOULD be the file input, but if + // it's not, then make `appendChild` behave as normal. + console.error('File input was not immediately given to appendChild upon clicking "Import"!'); + return appendChild(fileInput); + } + }; + // Simulate clicking on the "Import" option + contextMenu.children[0].click(); + }; + } else if (el = e.target.closest('div[class*="question_question-input"] > input[class*="input_input-form_l9eYg"]')) { + callback = async files => { + const text = (await Promise.all(Array.from(files, file => file.text()))).join("") + // Match pasting behavior: remove all newline characters at the end + .replace(/[\r\n]+$/, "").replace(/\r?\n|\r/g, " "); + const selectionStart = el.selectionStart; + reactAwareSetValue(el, el.value.slice(0, selectionStart) + text + el.value.slice(el.selectionEnd)); + el.setSelectionRange(selectionStart, selectionStart + text.length); + }; + } + if (!el) { + return; + } + e.preventDefault(); + if (el === currentDraggingElement) { + return; + } + currentDraggingElement = el; + + /** @type {HTMLElement[]} */ + const elementsToAnimate = [el, el.querySelector('div[class*="stage-selector_header_"]'), el.querySelector('div[class*="sprite-info_sprite-info"]'), el.querySelector('div[class*="monitor_list-body"]')].filter(i => i); + for (const el of elementsToAnimate) { + animateElement(el, FORWARD); + } + const handleDrop = e => { + e.preventDefault(); + cleanup(); + if (e.dataTransfer.types.includes("Files") && e.dataTransfer.files.length > 0) { + callback(e.dataTransfer.files); + } + }; + const handleDragOver = e => { + e.preventDefault(); + e.dataTransfer.dropEffect = "copy"; + }; + e.dataTransfer.dropEffect = "copy"; + const handleDragLeave = e => { + e.preventDefault(); + cleanup(); + }; + const cleanup = () => { + currentDraggingElement = null; + el.removeEventListener("dragover", handleDragOver); + el.removeEventListener("dragleave", handleDragLeave); + el.removeEventListener("drop", handleDrop); + for (const el of elementsToAnimate) { + animateElement(el, REVERSE); + } + }; + el.addEventListener("dragover", handleDragOver); + el.addEventListener("dragleave", handleDragLeave); + el.addEventListener("drop", handleDrop); + }; + document.addEventListener("dragover", globalHandleDragOver, { + useCapture: true + }); +}); + +/***/ }), + +/***/ "./src/addons/addons/find-bar/blockly/BlockFlasher.js": +/*!************************************************************!*\ + !*** ./src/addons/addons/find-bar/blockly/BlockFlasher.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BlockFlasher; }); +/** + * Helper class to flash a Blockly scratch block in the users workspace + */ +class BlockFlasher { + /** + * FLash a block 3 times + * @param block the block to flash + */ + static flash(block) { + if (myFlash.timerID > 0) { + clearTimeout(myFlash.timerID); + if (myFlash.block.svgPath_) { + myFlash.block.svgPath_.style.fill = ""; + } + } + let count = 4; + let flashOn = true; + myFlash.block = block; + + /** + * Internal method to switch the colour of a block between light yellow and it's original colour + * @private + */ + function _flash() { + if (myFlash.block.svgPath_) { + myFlash.block.svgPath_.style.fill = flashOn ? "#ffff80" : ""; + } + flashOn = !flashOn; + count--; + if (count > 0) { + myFlash.timerID = setTimeout(_flash, 200); + } else { + myFlash.timerID = 0; + myFlash.block = null; + } + } + _flash(); + } +} +const myFlash = { + block: null, + timerID: null +}; + +/***/ }), + +/***/ "./src/addons/addons/find-bar/blockly/BlockInstance.js": +/*!*************************************************************!*\ + !*** ./src/addons/addons/find-bar/blockly/BlockInstance.js ***! + \*************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BlockInstance; }); +/** + * Encapsulates a block (either in this sprite or another / Blockly, or native JSON block + */ +class BlockInstance { + constructor(target, block) { + this.targetId = target.id; + this.id = block.id; + } +} + +/***/ }), + +/***/ "./src/addons/addons/find-bar/blockly/Utils.js": +/*!*****************************************************!*\ + !*** ./src/addons/addons/find-bar/blockly/Utils.js ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Utils; }); +/* harmony import */ var _BlockInstance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BlockInstance.js */ "./src/addons/addons/find-bar/blockly/BlockInstance.js"); +/* harmony import */ var _BlockFlasher_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./BlockFlasher.js */ "./src/addons/addons/find-bar/blockly/BlockFlasher.js"); + + + +// Make these global so that every addon uses the same arrays. +let views = []; +let forward = []; +class Utils { + constructor(addon) { + this.addon = addon; + this.addon.tab.traps.getBlockly().then(blockly => { + this.blockly = blockly; + }); + /** + * Scratch Virtual Machine + * @type {null|*} + */ + this.vm = this.addon.tab.traps.vm; + // this._myFlash = { block: null, timerID: null, colour: null }; + this.offsetX = 32; + this.offsetY = 32; + this.navigationHistory = new NavigationHistory(); + /** + * The workspace + */ + this._workspace = null; + } + + /** + * Get the Scratch Editing Target + * @returns {?Target} the scratch editing target + */ + getEditingTarget() { + return this.vm.runtime.getEditingTarget(); + } + + /** + * Set the current workspace (switches sprites) + * @param targetID {string} + */ + setEditingTarget(targetID) { + if (this.getEditingTarget().id !== targetID) { + this.vm.setEditingTarget(targetID); + } + } + + /** + * Returns the main workspace + * @returns !Blockly.Workspace + */ + getWorkspace() { + const currentWorkspace = Blockly.getMainWorkspace(); + if (currentWorkspace.getToolbox()) { + // Sadly get get workspace does not always return the 'real' workspace... Not sure how to get that at the moment, + // but we can work out whether it's the right one by whether it has a toolbox. + this._workspace = currentWorkspace; + } + return this._workspace; + } + + /** + * Based on wksp.centerOnBlock(li.data.labelID); + * @param blockOrId {Blockly.Block|{id}|BlockInstance} A Blockly Block, a block id, or a BlockInstance + */ + scrollBlockIntoView(blockOrId) { + var _this$blockly; + let workspace = this.getWorkspace(); + /** @type {Blockly.Block} */ + let block; // or is it really a Blockly.BlockSvg? + + if (blockOrId instanceof _BlockInstance_js__WEBPACK_IMPORTED_MODULE_0__["default"]) { + // Switch to sprite + this.setEditingTarget(blockOrId.targetId); + // Highlight the block! + block = workspace.getBlockById(blockOrId.id); + } else { + block = blockOrId && blockOrId.id ? blockOrId : workspace.getBlockById(blockOrId); + } + if (!block) { + return; + } + + /** + * !Blockly.Block + */ + let root = block.getRootBlock(); + let base = this.getTopOfStackFor(block); + let ePos = base.getRelativeToSurfaceXY(), + // Align with the top of the block + rPos = root.getRelativeToSurfaceXY(), + // Align with the left of the block 'stack' + scale = workspace.scale, + x = rPos.x * scale, + y = ePos.y * scale, + xx = block.width + x, + // Turns out they have their x & y stored locally, and they are the actual size rather than scaled or including children... + yy = block.height + y, + s = workspace.getMetrics(); + if (x < s.viewLeft + this.offsetX - 4 || xx > s.viewLeft + s.viewWidth || y < s.viewTop + this.offsetY - 4 || yy > s.viewTop + s.viewHeight) { + // sx = s.contentLeft + s.viewWidth / 2 - x, + let sx = x - s.contentLeft - this.offsetX, + // sy = s.contentTop - y + Math.max(Math.min(32, 32 * scale), (s.viewHeight - yh) / 2); + sy = y - s.contentTop - this.offsetY; + this.navigationHistory.storeView(this.navigationHistory.peek(), 64); + + // workspace.hideChaff(), + workspace.scrollbar.set(sx, sy); + this.navigationHistory.storeView({ + left: sx, + top: sy + }, 64); + } + (_this$blockly = this.blockly) === null || _this$blockly === void 0 ? void 0 : _this$blockly.hideChaff(); + _BlockFlasher_js__WEBPACK_IMPORTED_MODULE_1__["default"].flash(block); + } + + /** + * Find the top stack block of a stack + * @param block a block in a stack + * @returns {*} a block that is the top of the stack of blocks + */ + getTopOfStackFor(block) { + let base = block; + while (base.getOutputShape() && base.getSurroundParent()) { + base = base.getSurroundParent(); + } + return base; + } +} +class NavigationHistory { + /** + * Keep a record of the scroll and zoom position + */ + storeView(next, dist) { + forward = []; + let workspace = Blockly.getMainWorkspace(), + s = workspace.getMetrics(); + let pos = { + left: s.viewLeft, + top: s.viewTop + }; + if (!next || distance(pos, next) > dist) { + views.push(pos); + } + } + peek() { + return views.length > 0 ? views[views.length - 1] : null; + } + goBack() { + const workspace = Blockly.getMainWorkspace(), + s = workspace.getMetrics(); + let pos = { + left: s.viewLeft, + top: s.viewTop + }; + let view = this.peek(); + if (!view) { + return; + } + if (distance(pos, view) < 64) { + // Go back to current if we are already far away from it + if (views.length > 1) { + views.pop(); + forward.push(view); + } + } + view = this.peek(); + if (!view) { + return; + } + let sx = view.left - s.contentLeft, + sy = view.top - s.contentTop; + + // transform.setTranslate(-600,0); + + workspace.scrollbar.set(sx, sy); + + /* + let blocklySvg = document.getElementsByClassName('blocklySvg')[0]; + let blocklyBlockCanvas = blocklySvg.getElementsByClassName('blocklyBlockCanvas')[0]; + let transform = blocklyBlockCanvas.transform.baseVal.getItem(0); + let scale = blocklyBlockCanvas.transform.baseVal.getItem(1); + let transformMatrix = transform.matrix; + let scaleMatrix = scale.matrix; + console.log('Transform - getMetrics', s); + console.log('sx, sy: ', sx, sy); + console.log('left, top: ', view.left, view.top); + console.log('contentLeft, right:', s.contentLeft, s.contentTop); + console.log('transform, scale matrix: ', transformMatrix, scaleMatrix); + */ + } + goForward() { + let view = forward.pop(); + if (!view) { + return; + } + views.push(view); + let workspace = Blockly.getMainWorkspace(), + s = workspace.getMetrics(); + let sx = view.left - s.contentLeft, + sy = view.top - s.contentTop; + workspace.scrollbar.set(sx, sy); + } +} +function distance(pos, next) { + return Math.sqrt(Math.pow(pos.left - next.left, 2) + Math.pow(pos.top - next.top, 2)); +} + +/***/ }), + +/***/ "./src/addons/addons/jump-to-def/_runtime_entry.js": +/*!*********************************************************!*\ + !*** ./src/addons/addons/jump-to-def/_runtime_entry.js ***! + \*********************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/jump-to-def/userscript.js"); +/* generated by pull.js */ + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"] +}; + +/***/ }), + +/***/ "./src/addons/addons/jump-to-def/userscript.js": +/*!*****************************************************!*\ + !*** ./src/addons/addons/jump-to-def/userscript.js ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _find_bar_blockly_Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../find-bar/blockly/Utils.js */ "./src/addons/addons/find-bar/blockly/Utils.js"); + +/* harmony default export */ __webpack_exports__["default"] = (async function (_ref) { + let { + addon, + msg, + console + } = _ref; + const utils = new _find_bar_blockly_Utils_js__WEBPACK_IMPORTED_MODULE_0__["default"](addon); + const Blockly = await addon.tab.traps.getBlockly(); + Object.defineProperty(Blockly.Gesture.prototype, "jumpToDef", { + get() { + return !addon.self.disabled; + } + }); + const _doBlockClick_ = Blockly.Gesture.prototype.doBlockClick_; + Blockly.Gesture.prototype.doBlockClick_ = function () { + if (!addon.self.disabled && (this.mostRecentEvent_.button === 1 || this.mostRecentEvent_.shiftKey)) { + // Wheel button... + // Intercept clicks to allow jump to...? + let block = this.startBlock_; + for (; block; block = block.getSurroundParent()) { + if (block.type === "procedures_call") { + let findProcCode = block.getProcCode(); + let topBlocks = utils.getWorkspace().getTopBlocks(); + for (const root of topBlocks) { + if (root.type === "procedures_definition") { + let label = root.getChildren()[0]; + let procCode = label.getProcCode(); + if (procCode && procCode === findProcCode) { + // Found... navigate to it! + utils.scrollBlockIntoView(root); + return; + } + } + } + } + } + } + _doBlockClick_.call(this); + }; +}); + +/***/ }), + +/***/ "./src/addons/addons/mute-project/_runtime_entry.js": +/*!**********************************************************!*\ + !*** ./src/addons/addons/mute-project/_runtime_entry.js ***! + \**********************************************************/ +/*! exports provided: resources */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); +/* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/mute-project/userscript.js"); +/* harmony import */ var _url_loader_mute_svg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! url-loader!./mute.svg */ "./node_modules/url-loader/dist/cjs.js!./src/addons/addons/mute-project/mute.svg"); +/* generated by pull.js */ + + +const resources = { + "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"], + "mute.svg": _url_loader_mute_svg__WEBPACK_IMPORTED_MODULE_1__["default"] +}; + +/***/ }), + +/***/ "./src/addons/addons/mute-project/userscript.js": +/*!******************************************************!*\ + !*** ./src/addons/addons/mute-project/userscript.js ***! + \******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _vol_slider_module_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../vol-slider/module.js */ "./src/addons/addons/vol-slider/module.js"); + +/* harmony default export */ __webpack_exports__["default"] = (async function (_ref) { + let { + addon, + console + } = _ref; + const vm = addon.tab.traps.vm; + Object(_vol_slider_module_js__WEBPACK_IMPORTED_MODULE_0__["setup"])(vm); + const icon = document.createElement("img"); + icon.loading = "lazy"; + icon.src = addon.self.getResource("/mute.svg") /* rewritten by pull.js */; + icon.className = "sa-mute-project-icon"; + icon.style.userSelect = "none"; + addon.tab.displayNoneWhileDisabled(icon); + const updateIcon = () => { + icon.style.display = addon.self.disabled || !Object(_vol_slider_module_js__WEBPACK_IMPORTED_MODULE_0__["isMuted"])() ? "none" : ""; + }; + Object(_vol_slider_module_js__WEBPACK_IMPORTED_MODULE_0__["onVolumeChanged"])(updateIcon); + updateIcon(); + const clickMuteButton = e => { + if (!addon.self.disabled && (e.ctrlKey || e.metaKey)) { + e.cancelBubble = true; + e.preventDefault(); + Object(_vol_slider_module_js__WEBPACK_IMPORTED_MODULE_0__["setMuted"])(!Object(_vol_slider_module_js__WEBPACK_IMPORTED_MODULE_0__["isMuted"])()); + } + }; + addon.self.addEventListener("disabled", () => { + if (Object(_vol_slider_module_js__WEBPACK_IMPORTED_MODULE_0__["isMuted"])()) { + Object(_vol_slider_module_js__WEBPACK_IMPORTED_MODULE_0__["setMuted"])(false); + } + }); + while (true) { + let button = await addon.tab.waitForElement("[class^='green-flag_green-flag']", { + markAsSeen: true, + reduxEvents: ["scratch-gui/mode/SET_PLAYER", "fontsLoaded/SET_FONTS_LOADED", "scratch-gui/locales/SELECT_LOCALE"] + }); + addon.tab.appendToSharedSpace({ + space: "afterStopButton", + element: icon, + order: 0 + }); + button.addEventListener("click", clickMuteButton); + button.addEventListener("contextmenu", clickMuteButton); + } +}); + +/***/ }), + +/***/ "./src/addons/addons/vol-slider/module.js": +/*!************************************************!*\ + !*** ./src/addons/addons/vol-slider/module.js ***! + \************************************************/ +/*! exports provided: setVolume, getVolume, isMuted, setUnmutedVolume, setMuted, onVolumeChanged, setup */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setVolume", function() { return setVolume; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getVolume", function() { return getVolume; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isMuted", function() { return isMuted; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setUnmutedVolume", function() { return setUnmutedVolume; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setMuted", function() { return setMuted; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onVolumeChanged", function() { return onVolumeChanged; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setup", function() { return setup; }); +// Volumes in this file are always in 0-1. + +let hasSetup = false; +/** @type {AudioParam|null} */ +let gainNode = null; +let unmuteVolume = 1; +let volumeBeforeFinishSetup = 1; +let globalVm; +const callbacks = []; +const setVolume = newVolume => { + if (gainNode) { + gainNode.value = newVolume; + // literally any other extension + for (const audioData of globalVm.runtime._extensionAudioObjects.values()) { + if (audioData.gainNode) { + audioData.gainNode.gain.value = gainNode.value; + } + } + } else { + volumeBeforeFinishSetup = newVolume; + } + callbacks.forEach(i => i()); +}; +const getVolume = () => { + if (gainNode) { + return gainNode.value; + } + return volumeBeforeFinishSetup; +}; +const isMuted = () => { + return getVolume() === 0; +}; +const setUnmutedVolume = newUnmuteVolume => { + unmuteVolume = newUnmuteVolume; +}; +const setMuted = newMuted => { + if (newMuted) { + setUnmutedVolume(getVolume()); + setVolume(0); + } else { + setVolume(unmuteVolume); + } +}; +const onVolumeChanged = callback => { + callbacks.push(callback); +}; +const gotAudioEngine = audioEngine => { + if (!audioEngine) { + console.error('could not get audio engine; sound-related addons will not work'); + return; + } + gainNode = audioEngine.inputNode.gain; + gainNode.value = volumeBeforeFinishSetup; + // literally any other extension + for (const audioData of globalVm.runtime._extensionAudioObjects.values()) { + if (audioData.gainNode) { + audioData.gainNode.gain.value = gainNode.value; + } + } +}; +const setup = vm => { + if (hasSetup) { + return; + } + hasSetup = true; + globalVm = vm; + const audioEngine = vm.runtime.audioEngine; + if (audioEngine) { + gotAudioEngine(audioEngine); + } else { + vm.runtime.once("PROJECT_LOADED", () => { + gotAudioEngine(vm.runtime.audioEngine); + }); + } +}; + +/***/ }), + +/***/ "./src/addons/api.js": +/*!***************************!*\ + !*** ./src/addons/api.js ***! + \***************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var intl_messageformat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! intl-messageformat */ "./node_modules/intl-messageformat/index.js"); +/* harmony import */ var intl_messageformat__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(intl_messageformat__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _settings_store_singleton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settings-store-singleton */ "./src/addons/settings-store-singleton.js"); +/* harmony import */ var _lib_data_uri_to_blob__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/data-uri-to-blob */ "./src/lib/data-uri-to-blob.js"); +/* harmony import */ var _event_target__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./event-target */ "./src/addons/event-target.js"); +/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./hooks */ "./src/addons/hooks.js"); +/* harmony import */ var _generated_addon_manifests__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./generated/addon-manifests */ "./src/addons/generated/addon-manifests.js"); +/* harmony import */ var _addons_l10n_en_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./addons-l10n/en.json */ "./src/addons/addons-l10n/en.json"); +var _addons_l10n_en_json__WEBPACK_IMPORTED_MODULE_6___namespace = /*#__PURE__*/__webpack_require__.t(/*! ./addons-l10n/en.json */ "./src/addons/addons-l10n/en.json", 1); +/* harmony import */ var _generated_l10n_entries__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./generated/l10n-entries */ "./src/addons/generated/l10n-entries.js"); +/* harmony import */ var _generated_addon_entries__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./generated/addon-entries */ "./src/addons/generated/addon-entries.js"); +/* harmony import */ var _contextmenu__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./contextmenu */ "./src/addons/contextmenu.js"); +/* harmony import */ var _modal__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./modal */ "./src/addons/modal.js"); +/* harmony import */ var _libraries_common_cs_text_color_esm_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./libraries/common/cs/text-color.esm.js */ "./src/addons/libraries/common/cs/text-color.esm.js"); +/* harmony import */ var _polyfill__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./polyfill */ "./src/addons/polyfill.js"); +/* harmony import */ var _polyfill__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_polyfill__WEBPACK_IMPORTED_MODULE_12__); +/* harmony import */ var _conditional_style__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./conditional-style */ "./src/addons/conditional-style.js"); +/* harmony import */ var _addon_precedence__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./addon-precedence */ "./src/addons/addon-precedence.js"); +/** + * Copyright (C) 2021 Thomas Weber + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + + + + + + + + + + + + + + + + +/* eslint-disable no-console */ + +const escapeHTML = str => str.replace(/([<>'"&])/g, (_, l) => "&#".concat(l.charCodeAt(0), ";")); +const kebabCaseToCamelCase = str => str.replace(/-([a-z])/g, g => g[1].toUpperCase()); +let _scratchClassNames = null; +const getScratchClassNames = () => { + if (_scratchClassNames) { + return _scratchClassNames; + } + const cssRules = Array.from(document.styleSheets) + // Ignore some scratch-paint stylesheets + .filter(styleSheet => !(styleSheet.ownerNode.textContent.startsWith('/* DO NOT EDIT\n@todo This file is copied from GUI and should be pulled out into a shared library.') && (styleSheet.ownerNode.textContent.includes('input_input-form') || styleSheet.ownerNode.textContent.includes('label_input-group_')))).map(e => { + try { + return [...e.cssRules]; + } catch (_e) { + return []; + } + }).flat(); + const classes = cssRules.map(e => e.selectorText).filter(e => e).map(e => e.match(/(([\w-]+?)_([\w-]+)_([\w\d-]+))/g)).filter(e => e).flat(); + _scratchClassNames = [...new Set(classes)]; + const observer = new MutationObserver(mutationList => { + for (const mutation of mutationList) { + for (const node of mutation.addedNodes) { + if (node.tagName === 'STYLE') { + _scratchClassNames = null; + observer.disconnect(); + return; + } + } + } + }); + observer.observe(document.head, { + childList: true + }); + return _scratchClassNames; +}; +let _mutationObserver; +let _mutationObserverCallbacks = []; +const addMutationObserverCallback = newCallback => { + if (!_mutationObserver) { + _mutationObserver = new MutationObserver(() => { + for (const cb of _mutationObserverCallbacks) { + cb(); + } + }); + _mutationObserver.observe(document.documentElement, { + attributes: false, + childList: true, + subtree: true + }); + } + _mutationObserverCallbacks.push(newCallback); +}; +const removeMutationObserverCallback = callback => { + _mutationObserverCallbacks = _mutationObserverCallbacks.filter(i => i !== callback); +}; +class Redux extends _event_target__WEBPACK_IMPORTED_MODULE_3__["default"] { + constructor() { + super(); + this._isInReducer = false; + this._initialized = false; + this._nextState = null; + } + initialize() { + if (!this._initialized) { + _hooks__WEBPACK_IMPORTED_MODULE_4__["default"].appStateReducer = (action, prev, next) => { + this._isInReducer = true; + this._nextState = next; + this.dispatchEvent(new CustomEvent('statechanged', { + detail: { + action, + prev, + next + } + })); + this._nextState = null; + this._isInReducer = false; + }; + this._initialized = true; + } + } + dispatch(m) { + if (this._isInReducer) { + queueMicrotask(() => _hooks__WEBPACK_IMPORTED_MODULE_4__["default"].appStateStore.dispatch(m)); + } else { + _hooks__WEBPACK_IMPORTED_MODULE_4__["default"].appStateStore.dispatch(m); + } + } + get state() { + if (this._nextState) return this._nextState; + return _hooks__WEBPACK_IMPORTED_MODULE_4__["default"].appStateStore.getState(); + } +} +const getEditorMode = () => { + // eslint-disable-next-line no-use-before-define + const mode = tabReduxInstance.state.scratchGui.mode; + if (mode.isEmbedded) return 'embed'; + if (mode.isFullScreen) return 'fullscreen'; + if (mode.isPlayerOnly) return 'projectpage'; + return 'editor'; +}; +const tabReduxInstance = new Redux(); +const language = tabReduxInstance.state.locales.locale.split('-')[0]; +const getTranslations = async () => { + if (_generated_l10n_entries__WEBPACK_IMPORTED_MODULE_7__["default"][language]) { + const localeMessages = await _generated_l10n_entries__WEBPACK_IMPORTED_MODULE_7__["default"][language](); + Object.assign(_addons_l10n_en_json__WEBPACK_IMPORTED_MODULE_6__, localeMessages); + } +}; +const addonMessagesPromise = getTranslations(); +const untilInEditor = () => { + if (!tabReduxInstance.state.scratchGui.mode.isPlayerOnly || tabReduxInstance.state.scratchGui.mode.isEmbedded) { + return; + } + return new Promise(resolve => { + const handler = () => { + if (!tabReduxInstance.state.scratchGui.mode.isPlayerOnly) { + resolve(); + tabReduxInstance.removeEventListener('statechanged', handler); + } + }; + tabReduxInstance.initialize(); + tabReduxInstance.addEventListener('statechanged', handler); + }); +}; +const getDisplayNoneWhileDisabledClass = id => "addons-display-none-".concat(id); +const parseArguments = code => code.split(/(?=[^\\]%[nbs])/g).map(i => i.trim()).filter(i => i.charAt(0) === '%').map(i => i.substring(0, 2)); +const fixDisplayName = displayName => displayName.replace(/([^\s])(%[nbs])/g, (_, before, arg) => "".concat(before, " ").concat(arg)); +const compareArrays = (a, b) => JSON.stringify(a) === JSON.stringify(b); +let _firstAddBlockRan = false; +const addonBlockColor = { + color: '#29beb8', + secondaryColor: '#3aa8a4', + tertiaryColor: '#3aa8a4' +}; +const contextMenuCallbacks = []; +const CONTEXT_MENU_ORDER = ['editor-devtools', 'block-switching', 'blocks2image', 'swap-local-global']; +let createdAnyBlockContextMenus = false; +const getInternalKey = element => Object.keys(element).find(key => key.startsWith('__reactInternalInstance$')); +class Tab extends _event_target__WEBPACK_IMPORTED_MODULE_3__["default"] { + constructor(id) { + super(); + this._id = id; + this._seenElements = new WeakSet(); + // traps is public API + this.traps = { + get vm() { + return tabReduxInstance.state.scratchGui.vm; + }, + getBlockly: () => { + if (_hooks__WEBPACK_IMPORTED_MODULE_4__["default"].blockly) { + return Promise.resolve(_hooks__WEBPACK_IMPORTED_MODULE_4__["default"].blockly); + } + return new Promise(resolve => { + _hooks__WEBPACK_IMPORTED_MODULE_4__["default"].blocklyCallbacks.push(() => resolve(_hooks__WEBPACK_IMPORTED_MODULE_4__["default"].blockly)); + }); + }, + getPaper: async () => { + const modeSelector = await this.waitForElement("[class*='paint-editor_mode-selector']", { + reduxCondition: state => state.scratchGui.editorTab.activeTabIndex === 1 && !state.scratchGui.mode.isPlayerOnly + }); + const reactInternalKey = Object.keys(modeSelector).find(key => key.startsWith('__reactInternalInstance$')); + const internalState = modeSelector[reactInternalKey].child; + // .tool or .blob.tool only exists on the selected tool + let toolState = internalState; + let tool; + while (toolState) { + const toolInstance = toolState.child.stateNode; + if (toolInstance.tool) { + tool = toolInstance.tool; + break; + } + if (toolInstance.blob && toolInstance.blob.tool) { + tool = toolInstance.blob.tool; + break; + } + toolState = toolState.sibling; + } + if (tool) { + const paperScope = tool._scope; + return paperScope; + } + throw new Error('cannot find paper :('); + }, + getInternalKey + }; + } + get redux() { + return tabReduxInstance; + } + waitForElement(selector) { + let { + markAsSeen = false, + condition, + reduxCondition, + reduxEvents + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let externalEventSatisfied = true; + const evaluateCondition = () => { + if (!externalEventSatisfied) return false; + if (condition && !condition()) return false; + if (reduxCondition && !reduxCondition(tabReduxInstance.state)) return false; + return true; + }; + if (evaluateCondition()) { + const firstQuery = document.querySelectorAll(selector); + for (const element of firstQuery) { + if (this._seenElements.has(element)) continue; + if (markAsSeen) this._seenElements.add(element); + return Promise.resolve(element); + } + } + let reduxListener; + if (reduxEvents) { + externalEventSatisfied = false; + reduxListener = _ref => { + let { + detail + } = _ref; + const type = detail.action.type; + // As addons can't run before DOM exists here, ignore fontsLoaded/SET_FONTS_LOADED + // Otherwise, as our font loading is very async, we could activate more often than required. + if (reduxEvents.includes(type) && type !== 'fontsLoaded/SET_FONTS_LOADED') { + externalEventSatisfied = true; + } + }; + this.redux.initialize(); + this.redux.addEventListener('statechanged', reduxListener); + } + return new Promise(resolve => { + const callback = () => { + if (!evaluateCondition()) { + return; + } + const elements = document.querySelectorAll(selector); + for (const element of elements) { + if (this._seenElements.has(element)) continue; + resolve(element); + removeMutationObserverCallback(callback); + if (markAsSeen) this._seenElements.add(element); + if (reduxListener) { + this.redux.removeEventListener('statechanged', reduxListener); + } + break; + } + }; + addMutationObserverCallback(callback); + }); + } + appendToSharedSpace(_ref2) { + let { + space, + element, + order, + scope + } = _ref2; + const SHARED_SPACES = { + stageHeader: { + element: () => document.querySelector("[class^='stage-header_stage-size-row']"), + from: () => [], + until: () => [document.querySelector("[class^='stage-header_stage-size-toggle-group']"), document.querySelector("[class^='stage-header_stage-size-row']").lastChild] + }, + fullscreenStageHeader: { + element: () => document.querySelector("[class^='stage-header_stage-menu-wrapper']"), + from: function from() { + let emptyDiv = this.element().querySelector('.addon-spacer'); + if (!emptyDiv) { + emptyDiv = document.createElement('div'); + emptyDiv.style.marginLeft = 'auto'; + emptyDiv.className = 'addon-spacer'; + this.element().insertBefore(emptyDiv, this.element().lastChild); + } + return [emptyDiv]; + }, + until: () => [document.querySelector("[class^='stage-header_stage-menu-wrapper']").lastChild] + }, + afterGreenFlag: { + element: () => document.querySelector("[class^='controls_controls-container']"), + from: () => [], + until: () => [document.querySelector("[class^='stop-all_stop-all']")] + }, + afterStopButton: { + element: () => document.querySelector("[class^='controls_controls-container']"), + from: () => [document.querySelector("[class^='stop-all_stop-all']")], + until: () => [] + }, + afterSoundTab: { + element: () => document.querySelector("[class^='react-tabs_react-tabs__tab-list']"), + from: () => [document.querySelector("[class^='react-tabs_react-tabs__tab-list']").children[2]], + until: () => [document.querySelector('.sa-find-bar')] + }, + assetContextMenuAfterExport: { + element: () => scope, + from: () => Array.prototype.filter.call(scope.children, c => c.textContent === this.scratchMessage('gui.spriteSelectorItem.contextMenuExport')), + until: () => Array.prototype.filter.call(scope.children, c => c.textContent === this.scratchMessage('gui.spriteSelectorItem.contextMenuDelete')) + }, + assetContextMenuAfterDelete: { + element: () => scope, + from: () => Array.prototype.filter.call(scope.children, c => c.textContent === this.scratchMessage('gui.spriteSelectorItem.contextMenuDelete')), + until: () => [] + }, + paintEditorZoomControls: { + element: () => document.querySelector('.sa-paintEditorZoomControls-wrapper') || (() => { + const wrapper = Object.assign(document.createElement('div'), { + className: 'sa-paintEditorZoomControls-wrapper' + }); + wrapper.style.display = 'flex'; + wrapper.style.flexDirection = 'row-reverse'; + wrapper.style.height = 'calc(1.95rem + 2px)'; + const zoomControls = document.querySelector("[class^='paint-editor_zoom-controls']"); + zoomControls.replaceWith(wrapper); + wrapper.appendChild(zoomControls); + return wrapper; + })(), + from: () => [], + until: () => [] + } + }; + const spaceInfo = SHARED_SPACES[space]; + const spaceElement = spaceInfo.element(); + if (!spaceElement) return false; + const from = spaceInfo.from(); + const until = spaceInfo.until(); + element.dataset.saSharedSpaceOrder = order; + let foundFrom = false; + if (from.length === 0) foundFrom = true; + + // insertAfter = element whose nextSibling will be the new element + // -1 means append at beginning of space (prepend) + // This will stay null if we need to append at the end of space + let insertAfter = null; + const children = Array.from(spaceElement.children); + for (const indexString of children.keys()) { + const child = children[indexString]; + const i = Number(indexString); + + // Find either element from "from" before doing anything + if (!foundFrom) { + if (from.includes(child)) { + foundFrom = true; + // If this is the last child, insertAfter will stay null + // and the element will be appended at the end of space + } + continue; + } + if (until.includes(child)) { + // This is the first SA element appended to this space + // If from = [] then prepend, otherwise append after + // previous child (likely a "from" element) + if (i === 0) insertAfter = -1;else insertAfter = children[i - 1]; + break; + } + if (child.dataset.addonSharedSpaceOrder) { + if (Number(child.dataset.addonSharedSpaceOrder) > order) { + // We found another SA element with higher order number + // If from = [] and this is the first child, prepend. + // Otherwise, append before this child. + if (i === 0) insertAfter = -1;else insertAfter = children[i - 1]; + break; + } + } + } + if (!foundFrom) return false; + // It doesn't matter if we didn't find an "until" + + if (insertAfter === null) { + // This might happen with until = [] + spaceElement.appendChild(element); + } else if (insertAfter === -1) { + // This might happen with from = [] + spaceElement.prepend(element); + } else { + // Works like insertAfter but using insertBefore API. + // nextSibling cannot be null because insertAfter + // is always set to children[i-1], so it must exist + spaceElement.insertBefore(element, insertAfter.nextSibling); + } + return true; + } + addBlock(procedureCode, _ref3) { + let { + args, + displayName, + callback + } = _ref3; + const procCodeArguments = parseArguments(procedureCode); + if (args.length !== procCodeArguments.length) { + throw new Error('Procedure code and argument list do not match'); + } + if (displayName) { + displayName = fixDisplayName(displayName); + const displayNameArguments = parseArguments(displayName); + if (!compareArrays(procCodeArguments, displayNameArguments)) { + console.warn("displayName ".concat(displayName, " for ").concat(procedureCode, " has invalid arguments, ignoring it.")); + displayName = procedureCode; + } + } else { + displayName = procedureCode; + } + const vm = this.traps.vm; + vm.addAddonBlock({ + procedureCode, + arguments: args, + callback, + color: '#29beb8', + secondaryColor: '#3aa8a4', + displayName + }); + if (!_firstAddBlockRan) { + _firstAddBlockRan = true; + this.traps.getBlockly().then(ScratchBlocks => { + const BlockSvg = ScratchBlocks.BlockSvg; + const oldUpdateColour = BlockSvg.prototype.updateColour; + BlockSvg.prototype.updateColour = function () { + // procedures_prototype also has a procedure code but we do not want to color them. + if (!this.isInsertionMarker() && this.type === 'procedures_call') { + const block = this.procCode_ && vm.runtime.getAddonBlock(this.procCode_); + if (block) { + this.colour_ = addonBlockColor.color; + this.colourSecondary_ = addonBlockColor.secondaryColor; + this.colourTertiary_ = addonBlockColor.tertiaryColor; + this.customContextMenu = null; + } + } + for (var _len = arguments.length, args2 = new Array(_len), _key = 0; _key < _len; _key++) { + args2[_key] = arguments[_key]; + } + return oldUpdateColour.call(this, ...args2); + }; + const originalCreateAllInputs = ScratchBlocks.Blocks.procedures_call.createAllInputs_; + ScratchBlocks.Blocks.procedures_call.createAllInputs_ = function () { + const block = this.procCode_ && vm.runtime.getAddonBlock(this.procCode_); + for (var _len2 = arguments.length, args2 = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args2[_key2] = arguments[_key2]; + } + if (block && block.displayName) { + const originalProcCode = this.procCode_; + this.procCode_ = block.displayName; + const ret = originalCreateAllInputs.call(this, ...args2); + this.procCode_ = originalProcCode; + return ret; + } + return originalCreateAllInputs.call(this, ...args2); + }; + if (vm.editingTarget) { + vm.emitWorkspaceUpdate(); + } + }); + } + } + getCustomBlock(procedureCode) { + const vm = this.traps.vm; + return vm.getAddonBlock(procedureCode); + } + getCustomBlockColor() { + return addonBlockColor; + } + setCustomBlockColor(newColor) { + Object.assign(addonBlockColor, newColor); + } + createBlockContextMenu(callback) { + let { + workspace = false, + blocks = false, + flyout = false, + comments = false + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + contextMenuCallbacks.push({ + addonId: this._id, + callback, + workspace, + blocks, + flyout, + comments + }); + contextMenuCallbacks.sort((b, a) => CONTEXT_MENU_ORDER.indexOf(b.addonId) - CONTEXT_MENU_ORDER.indexOf(a.addonId)); + if (createdAnyBlockContextMenus) return; + createdAnyBlockContextMenus = true; + this.traps.getBlockly().then(ScratchBlocks => { + const oldShow = ScratchBlocks.ContextMenu.show; + ScratchBlocks.ContextMenu.show = function (event, items, rtl) { + const gesture = ScratchBlocks.mainWorkspace.currentGesture_; + // abbort the injection as we have no clue wtf this is + if (!gesture) { + oldShow.call(this, event, items, rtl); + return; + } + const block = gesture.targetBlock_; + + // eslint-disable-next-line no-shadow + for (const { + callback, + workspace, + blocks, + flyout, + comments + } of contextMenuCallbacks) { + const injectMenu = + // Workspace + workspace && !block && !gesture.flyout_ && !gesture.startBubble_ || + // Block in workspace + blocks && block && !gesture.flyout_ || + // Block in flyout + flyout && gesture.flyout_ || + // Comments + comments && gesture.startBubble_; + if (injectMenu) { + try { + items = callback(items, block); + } catch (e) { + console.error('Error while calling context menu callback: ', e); + } + } + } + oldShow.call(this, event, items, rtl); + const blocklyContextMenu = ScratchBlocks.WidgetDiv.DIV.firstChild; + items.forEach((item, i) => { + if (i !== 0 && item.separator) { + const itemElt = blocklyContextMenu.children[i]; + itemElt.style.paddingTop = '2px'; + itemElt.classList.add('sa-blockly-menu-item-border'); + itemElt.style.borderTop = '1px solid hsla(0, 0%, 0%, 0.15)'; + } + }); + }; + }); + } + createEditorContextMenu(callback, options) { + Object(_contextmenu__WEBPACK_IMPORTED_MODULE_9__["addContextMenu"])(this, callback, options); + } + copyImage(dataURL) { + if (!navigator.clipboard.write) { + return Promise.reject(new Error('Clipboard API not supported')); + } + const items = [ + // eslint-disable-next-line no-undef + new ClipboardItem({ + 'image/png': Object(_lib_data_uri_to_blob__WEBPACK_IMPORTED_MODULE_2__["default"])(dataURL) + })]; + return navigator.clipboard.write(items); + } + scratchMessage(id) { + return tabReduxInstance.state.locales.messages[id]; + } + scratchClass() { + const scratchClasses = getScratchClassNames(); + const classes = []; + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + for (const arg of args) { + if (typeof arg === 'string') { + for (const scratchClass of scratchClasses) { + if (scratchClass.startsWith("".concat(arg, "_")) && scratchClass.length === arg.length + 6) { + classes.push(scratchClass); + break; + } + } + } + } + const options = args[args.length - 1]; + if (typeof options === 'object') { + const others = Array.isArray(options.others) ? options.others : [options.others]; + for (const className of others) { + classes.push(className); + } + } + return classes.join(' '); + } + get editorMode() { + return getEditorMode(); + } + displayNoneWhileDisabled(el) { + el.classList.add(getDisplayNoneWhileDisabledClass(this._id)); + } + get direction() { + return this.redux.state.locales.isRtl ? 'rtl' : 'ltr'; + } + createModal(title) { + let { + isOpen = false + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + return _modal__WEBPACK_IMPORTED_MODULE_10__["createEditorModal"](this, title, { + isOpen + }); + } + confirm() { + for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + args[_key4] = arguments[_key4]; + } + return _modal__WEBPACK_IMPORTED_MODULE_10__["confirm"](this, ...args); + } + prompt() { + for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { + args[_key5] = arguments[_key5]; + } + return _modal__WEBPACK_IMPORTED_MODULE_10__["prompt"](this, ...args); + } +} +class Settings extends _event_target__WEBPACK_IMPORTED_MODULE_3__["default"] { + constructor(addonId, manifest) { + super(); + this._addonId = addonId; + this._manifest = manifest; + } + get(id) { + return _settings_store_singleton__WEBPACK_IMPORTED_MODULE_1__["default"].getAddonSetting(this._addonId, id); + } +} +class Self extends _event_target__WEBPACK_IMPORTED_MODULE_3__["default"] { + constructor(id, getResource) { + super(); + this.id = id; + this.disabled = false; + this.getResource = getResource; + } +} +class AddonRunner { + constructor(id) { + AddonRunner.instances.push(this); + const manifest = _generated_addon_manifests__WEBPACK_IMPORTED_MODULE_5__["default"][id]; + this.id = id; + this.manifest = manifest; + this.messageCache = {}; + this.loading = true; + + /** + * @type {Record} + */ + this.resources = null; + this.publicAPI = { + global, + console, + addon: { + tab: new Tab(id), + settings: new Settings(id, manifest), + self: new Self(id, this.getResource.bind(this)) + }, + msg: this.msg.bind(this), + safeMsg: this.safeMsg.bind(this) + }; + } + _msg(key, vars, handler) { + const namespacedKey = "".concat(this.id, "/").concat(key); + if (this.messageCache[namespacedKey]) { + return this.messageCache[namespacedKey].format(vars); + } + let translation = _addons_l10n_en_json__WEBPACK_IMPORTED_MODULE_6__[namespacedKey]; + if (!translation) { + return namespacedKey; + } + if (handler) { + translation = handler(translation); + } + const messageFormat = new intl_messageformat__WEBPACK_IMPORTED_MODULE_0___default.a(translation, language); + this.messageCache[namespacedKey] = messageFormat; + return messageFormat.format(vars); + } + msg(key, vars) { + return this._msg(key, vars, null); + } + safeMsg(key, vars) { + return this._msg(key, vars, escapeHTML); + } + getResource(path) { + const withoutSlash = path.substring(1); + const url = this.resources[withoutSlash]; + if (typeof url !== 'string') { + throw new Error("Unknown asset: ".concat(path)); + } + return url; + } + updateAllStyles() { + _conditional_style__WEBPACK_IMPORTED_MODULE_13__["updateAll"](); + this.updateCssVariables(); + } + updateCssVariables() { + const addonId = kebabCaseToCamelCase(this.id); + if (this.manifest.settings) { + for (const setting of this.manifest.settings) { + const settingId = setting.id; + const cssProperty = "--".concat(addonId, "-").concat(kebabCaseToCamelCase(settingId)); + const value = this.publicAPI.addon.settings.get(settingId); + document.documentElement.style.setProperty(cssProperty, value); + } + } + if (this.manifest.customCssVariables) { + for (const variable of this.manifest.customCssVariables) { + const name = variable.name; + const cssProperty = "--".concat(addonId, "-").concat(name); + const value = variable.value; + const evaluated = this.evaluateCustomCssVariable(value); + document.documentElement.style.setProperty(cssProperty, evaluated); + } + } + } + evaluateCustomCssVariable(variable) { + if (typeof variable !== 'object' || variable === null) { + return variable; + } + switch (variable.type) { + case 'alphaBlend': + { + const opaqueSource = this.evaluateCustomCssVariable(variable.opaqueSource); + const transparentSource = this.evaluateCustomCssVariable(variable.transparentSource); + return _libraries_common_cs_text_color_esm_js__WEBPACK_IMPORTED_MODULE_11__["alphaBlend"](opaqueSource, transparentSource); + } + case 'alphaThreshold': + { + const source = this.evaluateCustomCssVariable(variable.source); + const alpha = _libraries_common_cs_text_color_esm_js__WEBPACK_IMPORTED_MODULE_11__["parseHex"](source).a; + const threshold = this.evaluateCustomCssVariable(variable.threshold) || 0.5; + if (alpha >= threshold) { + return this.evaluateCustomCssVariable(variable.opaque); + } + return this.evaluateCustomCssVariable(variable.transparent); + } + case 'brighten': + { + const source = this.evaluateCustomCssVariable(variable.source); + return _libraries_common_cs_text_color_esm_js__WEBPACK_IMPORTED_MODULE_11__["brighten"](source, variable); + } + case 'makeHsv': + { + const h = this.evaluateCustomCssVariable(variable.h); + const s = this.evaluateCustomCssVariable(variable.s); + const v = this.evaluateCustomCssVariable(variable.v); + return _libraries_common_cs_text_color_esm_js__WEBPACK_IMPORTED_MODULE_11__["makeHsv"](h, s, v); + } + case 'map': + { + return variable.options[this.evaluateCustomCssVariable(variable.source)]; + } + case 'multiply': + { + const hex = this.evaluateCustomCssVariable(variable.source); + return _libraries_common_cs_text_color_esm_js__WEBPACK_IMPORTED_MODULE_11__["multiply"](hex, variable); + } + case 'recolorFilter': + { + const source = this.evaluateCustomCssVariable(variable.source); + return _libraries_common_cs_text_color_esm_js__WEBPACK_IMPORTED_MODULE_11__["recolorFilter"](source); + } + case 'settingValue': + { + return this.publicAPI.addon.settings.get(variable.settingId); + } + case 'textColor': + { + const hex = this.evaluateCustomCssVariable(variable.source); + const black = this.evaluateCustomCssVariable(variable.black); + const white = this.evaluateCustomCssVariable(variable.white); + const threshold = this.evaluateCustomCssVariable(variable.threshold); + return _libraries_common_cs_text_color_esm_js__WEBPACK_IMPORTED_MODULE_11__["textColor"](hex, black, white, threshold); + } + } + console.warn("Unknown customCssVariable", variable); + return '#000000'; + } + settingsChanged() { + this.updateAllStyles(); + this.publicAPI.addon.settings.dispatchEvent(new CustomEvent('change')); + } + dynamicEnable() { + if (this.loading) { + return; + } + + // This order is important. We need to update styles before calling the addon's dynamic + // toggle event. We also need to update `disabled` before we can update styles because + // the ConditionalStyle callbacks are implemented using the API. + this.publicAPI.addon.self.disabled = false; + this.updateAllStyles(); + this.publicAPI.addon.self.dispatchEvent(new CustomEvent('reenabled')); + } + dynamicDisable() { + if (this.loading) { + return; + } + + // See comment in dynamicEnable(). + this.publicAPI.addon.self.disabled = true; + this.updateAllStyles(); + this.publicAPI.addon.self.dispatchEvent(new CustomEvent('disabled')); + } + async run() { + if (this.manifest.editorOnly) { + await untilInEditor(); + } + const mod = await _generated_addon_entries__WEBPACK_IMPORTED_MODULE_8__["default"][this.id](); + this.resources = mod.resources; + if (!this.manifest.noTranslations) { + await addonMessagesPromise; + } + + // Multiply by big number because the first userstyle is + 0, second is + 1, third is + 2, etc. + // This number just has to be larger than the maximum number of userstyles in a single addon. + const baseStylePrecedence = Object(_addon_precedence__WEBPACK_IMPORTED_MODULE_14__["default"])(this.id) * 100; + if (this.manifest.userstyles) { + for (let i = 0; i < this.manifest.userstyles.length; i++) { + const userstyle = this.manifest.userstyles[i]; + const userstylePrecedence = baseStylePrecedence + i; + const userstyleCondition = () => !this.publicAPI.addon.self.disabled && _settings_store_singleton__WEBPACK_IMPORTED_MODULE_1__["default"].evaluateCondition(this.id, userstyle.if); + for (const [moduleId, cssText] of this.resources[userstyle.url]) { + const sheet = _conditional_style__WEBPACK_IMPORTED_MODULE_13__["create"](moduleId, cssText); + sheet.addDependent(this.id, userstylePrecedence, userstyleCondition); + } + } + } + const disabledCSS = ".".concat(getDisplayNoneWhileDisabledClass(this.id), "{display:none !important;}"); + const disabledStylesheet = _conditional_style__WEBPACK_IMPORTED_MODULE_13__["create"]("_disabled/".concat(this.id), disabledCSS); + disabledStylesheet.addDependent(this.id, baseStylePrecedence, () => this.publicAPI.addon.self.disabled); + this.updateCssVariables(); + if (this.manifest.userscripts) { + for (const userscript of this.manifest.userscripts) { + if (!_settings_store_singleton__WEBPACK_IMPORTED_MODULE_1__["default"].evaluateCondition(userscript.if)) { + continue; + } + const fn = this.resources[userscript.url]; + fn(this.publicAPI); + } + } + this.loading = false; + } +} +AddonRunner.instances = []; +const runAddon = addonId => { + const runner = new AddonRunner(addonId); + runner.run(); +}; +let oldMode = getEditorMode(); +const emitUrlChange = () => { + // In Scratch, URL changes usually mean someone went from editor to fullscreen or something like that. + // This is not the case in TW -- the URL can change for many other reasons that addons probably aren't prepared + // to handle. + const newMode = getEditorMode(); + if (newMode !== oldMode) { + oldMode = newMode; + setTimeout(() => { + for (const addon of AddonRunner.instances) { + addon.publicAPI.addon.tab.dispatchEvent(new CustomEvent('urlChange')); + } + }); + } +}; +const originalReplaceState = history.replaceState; +history.replaceState = function () { + for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { + args[_key6] = arguments[_key6]; + } + originalReplaceState.apply(this, args); + emitUrlChange(); +}; +const originalPushState = history.pushState; +history.pushState = function () { + for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { + args[_key7] = arguments[_key7]; + } + originalPushState.apply(this, args); + emitUrlChange(); +}; +_settings_store_singleton__WEBPACK_IMPORTED_MODULE_1__["default"].addEventListener('addon-changed', e => { + const addonId = e.detail.addonId; + const runner = AddonRunner.instances.find(i => i.id === addonId); + if (runner) { + runner.settingsChanged(); + } + if (e.detail.dynamicEnable) { + if (runner) { + runner.dynamicEnable(); + } else { + runAddon(addonId); + } + } else if (e.detail.dynamicDisable) { + if (runner) { + runner.dynamicDisable(); + } + } +}); +for (const id of Object.keys(_generated_addon_manifests__WEBPACK_IMPORTED_MODULE_5__["default"])) { + if (!_settings_store_singleton__WEBPACK_IMPORTED_MODULE_1__["default"].getAddonEnabled(id)) { + continue; + } + runAddon(id); +} +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) + +/***/ }), + +/***/ "./src/addons/conditional-style.js": +/*!*****************************************!*\ + !*** ./src/addons/conditional-style.js ***! + \*****************************************/ +/*! exports provided: create, updateAll */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "create", function() { return create; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAll", function() { return updateAll; }); +// Stylesheets are added at the end of so that they have higher precedence +// than those in and above dark mode which is appended at the start of +const stylesheetContainer = document.createElement('div'); +stylesheetContainer.style.display = 'none'; +document.body.appendChild(stylesheetContainer); + +/** + * Maps opaque module IDs to its ConditionalStyle. + * @type {Map} + */ +const allSheets = new Map(); + +/** + * Determine if the contents of a list are equal (===) to each other. + * @param {unknown[]} a The first list + * @param {unknown[]} b The second list + * @returns {boolean} true if the lists are identical + */ +const areArraysEqual = (a, b) => { + if (a.length !== b.length) { + return false; + } + for (let i = 0; i < a.length; a++) { + if (a[i] !== b[i]) { + return false; + } + } + return true; +}; +const updateAll = () => { + for (const sheet of allSheets.values()) { + sheet.update(); + } +}; +class ConditionalStyle { + /** + * @param {string} styleText CSS text + */ + constructor(styleText) { + /** + * Lazily created + + + + +
+ + diff --git a/privacy.html b/privacy.html new file mode 100644 index 0000000000000000000000000000000000000000..f8a26ac07e9114dc8d084973ddf2cabf868565c3 --- /dev/null +++ b/privacy.html @@ -0,0 +1,39 @@ + + + + PenguinMod - Privacy Policy + + + + + + +
+

Privacy Policy

+
+ +
+

We've moved pages

+ Click here to see the new page. +
+ + diff --git a/rating/e.png b/rating/e.png new file mode 100644 index 0000000000000000000000000000000000000000..12b27d6e1a1197849fd417f60bb1d72bfa617d48 Binary files /dev/null and b/rating/e.png differ diff --git a/rating/e10.png b/rating/e10.png new file mode 100644 index 0000000000000000000000000000000000000000..e8973fb68622648a60acfecd2f4a0ef11ea1d7b4 Binary files /dev/null and b/rating/e10.png differ diff --git a/rating/none.png b/rating/none.png new file mode 100644 index 0000000000000000000000000000000000000000..1c7340ecc2cb9b55bf5724a751518ae66c2119b7 Binary files /dev/null and b/rating/none.png differ diff --git a/rating/t.png b/rating/t.png new file mode 100644 index 0000000000000000000000000000000000000000..4754da5b4fb02d1a83bcea07aebf6e95e34624d1 Binary files /dev/null and b/rating/t.png differ diff --git a/report_flag.png b/report_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..f71c19bb68481d60f4547eff08dfd7edb6324415 Binary files /dev/null and b/report_flag.png differ diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000000000000000000000000000000000000..dc6fe34d505f6316659de9209cda87659db6ca10 --- /dev/null +++ b/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Disallow: /*/embed +Disallow: /embed diff --git a/scratchAuthExt.html b/scratchAuthExt.html new file mode 100644 index 0000000000000000000000000000000000000000..73ad90ac8149e0b90b2eb67664f858fc4e091192 --- /dev/null +++ b/scratchAuthExt.html @@ -0,0 +1,38 @@ + + + + + + Authenticating + + +

Please wait...

+ + + \ No newline at end of file diff --git a/share_project.png b/share_project.png new file mode 100644 index 0000000000000000000000000000000000000000..761fe3baee989cb1ab2439c774d84da73f0fbd5e Binary files /dev/null and b/share_project.png differ diff --git a/static/assets/00091c06e9ea001f51bb7303be96b739.svg b/static/assets/00091c06e9ea001f51bb7303be96b739.svg new file mode 100644 index 0000000000000000000000000000000000000000..a1e5eae91ce910723b821d951ff7b137cc57ee1e --- /dev/null +++ b/static/assets/00091c06e9ea001f51bb7303be96b739.svg @@ -0,0 +1,17 @@ + + + + copy v2 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/0043f23189fb3cbf2021a88959961ece.mp3 b/static/assets/0043f23189fb3cbf2021a88959961ece.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d967d830ef56e0a9450a3032a47e1d9970f2f0e1 Binary files /dev/null and b/static/assets/0043f23189fb3cbf2021a88959961ece.mp3 differ diff --git a/static/assets/00505ca954aec95aac898ee7d5a7ee6c.svg b/static/assets/00505ca954aec95aac898ee7d5a7ee6c.svg new file mode 100644 index 0000000000000000000000000000000000000000..761c1bcfbd1c95bec0332f548920f297b0814c48 --- /dev/null +++ b/static/assets/00505ca954aec95aac898ee7d5a7ee6c.svg @@ -0,0 +1,9 @@ + + + + Sound/General/Copy to New + Created with Sketch. + + + + \ No newline at end of file diff --git a/static/assets/00d2dff9d5ece15a67074374b2027590.mp3 b/static/assets/00d2dff9d5ece15a67074374b2027590.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c7d46dbd66ac141f3ce3c6f5e204c67ae9eb5433 Binary files /dev/null and b/static/assets/00d2dff9d5ece15a67074374b2027590.mp3 differ diff --git a/static/assets/01011831acb632804df035321ff68afe.svg b/static/assets/01011831acb632804df035321ff68afe.svg new file mode 100644 index 0000000000000000000000000000000000000000..61604982c075afbc147fa4dea03ed543314ee233 --- /dev/null +++ b/static/assets/01011831acb632804df035321ff68afe.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/01fc0da0b4f9dfcf62ee83e1505e14f2.png b/static/assets/01fc0da0b4f9dfcf62ee83e1505e14f2.png new file mode 100644 index 0000000000000000000000000000000000000000..df5ec25a3ad31aad4081e776e8effca9ce3469ea Binary files /dev/null and b/static/assets/01fc0da0b4f9dfcf62ee83e1505e14f2.png differ diff --git a/static/assets/02470ceceed9235b943e6b5a9edc8efb.png b/static/assets/02470ceceed9235b943e6b5a9edc8efb.png new file mode 100644 index 0000000000000000000000000000000000000000..93163bfbf173a2e742e61517dd99c9534b3b389e Binary files /dev/null and b/static/assets/02470ceceed9235b943e6b5a9edc8efb.png differ diff --git a/static/assets/02996322134b61a0344527cddc61f9bd.png b/static/assets/02996322134b61a0344527cddc61f9bd.png new file mode 100644 index 0000000000000000000000000000000000000000..4efed32f76855b89616f17318176880a146fe504 Binary files /dev/null and b/static/assets/02996322134b61a0344527cddc61f9bd.png differ diff --git a/static/assets/02d927ce93445be737c7ff43fb98b135.svg b/static/assets/02d927ce93445be737c7ff43fb98b135.svg new file mode 100644 index 0000000000000000000000000000000000000000..73ceb17a30901765af681b7216fe0a751b75524d --- /dev/null +++ b/static/assets/02d927ce93445be737c7ff43fb98b135.svg @@ -0,0 +1,10 @@ + + + + fill + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/03562df738acb5b29670d58970eb432f.svg b/static/assets/03562df738acb5b29670d58970eb432f.svg new file mode 100644 index 0000000000000000000000000000000000000000..f6b15d914741920135a3a40034b86140de4381e4 --- /dev/null +++ b/static/assets/03562df738acb5b29670d58970eb432f.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/04e10c82d2a75d397ca963c1a9f9e1e7.svg b/static/assets/04e10c82d2a75d397ca963c1a9f9e1e7.svg new file mode 100644 index 0000000000000000000000000000000000000000..836bd6c997bade7f45a77417a92e918ce1d7c3ab --- /dev/null +++ b/static/assets/04e10c82d2a75d397ca963c1a9f9e1e7.svg @@ -0,0 +1,12 @@ + + + + line + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/04e28ba12fe914cf4f131dcb85ae82d6.svg b/static/assets/04e28ba12fe914cf4f131dcb85ae82d6.svg new file mode 100644 index 0000000000000000000000000000000000000000..d8a01734ffdc6760648ac85acf5ad38073508858 --- /dev/null +++ b/static/assets/04e28ba12fe914cf4f131dcb85ae82d6.svg @@ -0,0 +1,18 @@ + + + + Tutorials/Expand + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/05e05756b592740a3670417b4df19ca9.svg b/static/assets/05e05756b592740a3670417b4df19ca9.svg new file mode 100644 index 0000000000000000000000000000000000000000..704180653f5915b80d8a0f72f364872f624279f7 --- /dev/null +++ b/static/assets/05e05756b592740a3670417b4df19ca9.svg @@ -0,0 +1,41 @@ + + + + +Scratch Link +Created with Sketch. + + + + + + + + + + diff --git a/static/assets/05e9c069d478b9e056e35f04e7dedf64.svg b/static/assets/05e9c069d478b9e056e35f04e7dedf64.svg new file mode 100644 index 0000000000000000000000000000000000000000..17f1cfde1158ef3ddddae716370fd2a28c3f28f7 --- /dev/null +++ b/static/assets/05e9c069d478b9e056e35f04e7dedf64.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/06785171617ea882557cf5afed61f364.svg b/static/assets/06785171617ea882557cf5afed61f364.svg new file mode 100644 index 0000000000000000000000000000000000000000..67e298b1e104e7389e690cd23038e51709861786 --- /dev/null +++ b/static/assets/06785171617ea882557cf5afed61f364.svg @@ -0,0 +1,18 @@ + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/06b8b81e4596f360738c678f6a840dc2.svg b/static/assets/06b8b81e4596f360738c678f6a840dc2.svg new file mode 100644 index 0000000000000000000000000000000000000000..442084882bee3dcbf7146b2370215af8a4897377 --- /dev/null +++ b/static/assets/06b8b81e4596f360738c678f6a840dc2.svg @@ -0,0 +1,10 @@ + + + + Paint Editor V1 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/06e9863f95061349f2ba2e0fb0b58ddc.png b/static/assets/06e9863f95061349f2ba2e0fb0b58ddc.png new file mode 100644 index 0000000000000000000000000000000000000000..ac152e0c3fbd8f1fed89f60bac0109af58e92942 Binary files /dev/null and b/static/assets/06e9863f95061349f2ba2e0fb0b58ddc.png differ diff --git a/static/assets/0896da795cd8d2199e8cfb968229d04a.svg b/static/assets/0896da795cd8d2199e8cfb968229d04a.svg new file mode 100644 index 0000000000000000000000000000000000000000..8a5007c60f44f9257d0a5ec8f161a17da78daa88 --- /dev/null +++ b/static/assets/0896da795cd8d2199e8cfb968229d04a.svg @@ -0,0 +1,10 @@ + + + + Code V2 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/08cb40364031026f31772bcfa94d6993.svg b/static/assets/08cb40364031026f31772bcfa94d6993.svg new file mode 100644 index 0000000000000000000000000000000000000000..c71fb6a33fc6b968ec099ed34697ee9887028d26 --- /dev/null +++ b/static/assets/08cb40364031026f31772bcfa94d6993.svg @@ -0,0 +1,12 @@ + + + + rectangle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/09469790f10bcd5ed51fe8f85f8bdc1e.svg b/static/assets/09469790f10bcd5ed51fe8f85f8bdc1e.svg new file mode 100644 index 0000000000000000000000000000000000000000..c62801c38c986b636bd5eb78b73d996675539972 --- /dev/null +++ b/static/assets/09469790f10bcd5ed51fe8f85f8bdc1e.svg @@ -0,0 +1,10 @@ + + + + rectange + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/0966e5defb1ae50e569fbbc7ebe7f22a.png b/static/assets/0966e5defb1ae50e569fbbc7ebe7f22a.png new file mode 100644 index 0000000000000000000000000000000000000000..b680b5d6a64375cea8a7bd7ffcc20cb25468a930 Binary files /dev/null and b/static/assets/0966e5defb1ae50e569fbbc7ebe7f22a.png differ diff --git a/static/assets/09995475180591a6c64c8744fbfdf4d8.mp3 b/static/assets/09995475180591a6c64c8744fbfdf4d8.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..12460dfca0bf3deb48bd90fef953d3e277f20378 Binary files /dev/null and b/static/assets/09995475180591a6c64c8744fbfdf4d8.mp3 differ diff --git a/static/assets/0a0eb1af384d2f241aab5631440b2a33.svg b/static/assets/0a0eb1af384d2f241aab5631440b2a33.svg new file mode 100644 index 0000000000000000000000000000000000000000..2371f5dafbb06277b2eebf3ed36a749ca4efaafa --- /dev/null +++ b/static/assets/0a0eb1af384d2f241aab5631440b2a33.svg @@ -0,0 +1 @@ + diff --git a/static/assets/0b18f02669375ad2ee80bef8d07ea7ec.mp3 b/static/assets/0b18f02669375ad2ee80bef8d07ea7ec.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..489247955c62bb7a57bc82f3f47269cdb9e3c3b4 Binary files /dev/null and b/static/assets/0b18f02669375ad2ee80bef8d07ea7ec.mp3 differ diff --git a/static/assets/0c19152025f432ddd7d67c039d328f26.svg b/static/assets/0c19152025f432ddd7d67c039d328f26.svg new file mode 100644 index 0000000000000000000000000000000000000000..932ae7cf25b95c4ee7332085cdf8e5c940b37af6 --- /dev/null +++ b/static/assets/0c19152025f432ddd7d67c039d328f26.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/assets/0dcd27b60c185811b19f59d56eaa12f6.mp3 b/static/assets/0dcd27b60c185811b19f59d56eaa12f6.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..e7b8585bb63251141ca3784131ed5a5e594762fd Binary files /dev/null and b/static/assets/0dcd27b60c185811b19f59d56eaa12f6.mp3 differ diff --git a/static/assets/0e009d6e684951615b31a267baa37636.svg b/static/assets/0e009d6e684951615b31a267baa37636.svg new file mode 100644 index 0000000000000000000000000000000000000000..eeaba83fdfbf1c553c1ecd4fc3081582fa8deb92 --- /dev/null +++ b/static/assets/0e009d6e684951615b31a267baa37636.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/0e8ed599d9875c77d52db36de2b2b33f.mp3 b/static/assets/0e8ed599d9875c77d52db36de2b2b33f.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c4b556da2f46e54069966a7737bb23b9c9c1a664 Binary files /dev/null and b/static/assets/0e8ed599d9875c77d52db36de2b2b33f.mp3 differ diff --git a/static/assets/0f9efe3bd6e80747dfa3aeb9e19997b5.svg b/static/assets/0f9efe3bd6e80747dfa3aeb9e19997b5.svg new file mode 100644 index 0000000000000000000000000000000000000000..70db707eb8a2d7d533c5b0ae5e05ad38f4003ec4 --- /dev/null +++ b/static/assets/0f9efe3bd6e80747dfa3aeb9e19997b5.svg @@ -0,0 +1,58 @@ + + + + wedo2-block-icon + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/0fd9fd69a38ab79358df5a77b29702c8.svg b/static/assets/0fd9fd69a38ab79358df5a77b29702c8.svg new file mode 100644 index 0000000000000000000000000000000000000000..df2ae141ebce92e1af1ad8f3f6e90b57c8248225 --- /dev/null +++ b/static/assets/0fd9fd69a38ab79358df5a77b29702c8.svg @@ -0,0 +1,10 @@ + + + + bluetooth-white + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/10299cfdb7aae4ef46933f78b4366d6f.png b/static/assets/10299cfdb7aae4ef46933f78b4366d6f.png new file mode 100644 index 0000000000000000000000000000000000000000..7147fb7c1b374d8ffa8fe38b605bc282c0f7bfe6 Binary files /dev/null and b/static/assets/10299cfdb7aae4ef46933f78b4366d6f.png differ diff --git a/static/assets/103fe904046c35630c600cb122492d78.mp3 b/static/assets/103fe904046c35630c600cb122492d78.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..93ff1d94eb4cfd6a8f4d39b93be281f0524235f1 Binary files /dev/null and b/static/assets/103fe904046c35630c600cb122492d78.mp3 differ diff --git a/static/assets/10811a978de201353d564df7ba1ddb58.svg b/static/assets/10811a978de201353d564df7ba1ddb58.svg new file mode 100644 index 0000000000000000000000000000000000000000..49a4d919fb321786383d313d6b529c64a9033ca9 --- /dev/null +++ b/static/assets/10811a978de201353d564df7ba1ddb58.svg @@ -0,0 +1 @@ +R1_ C.Procedure Editble Inputs \ No newline at end of file diff --git a/static/assets/10af80546707afae5507edb828dd35a0.mp3 b/static/assets/10af80546707afae5507edb828dd35a0.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a7c0507397443cc7ac9f94457f83917042def883 Binary files /dev/null and b/static/assets/10af80546707afae5507edb828dd35a0.mp3 differ diff --git a/static/assets/11c35683a60415bf62ee1a7324a25848.png b/static/assets/11c35683a60415bf62ee1a7324a25848.png new file mode 100644 index 0000000000000000000000000000000000000000..f38fbc9abaedcc9710f976bff6e257afcdec79a6 Binary files /dev/null and b/static/assets/11c35683a60415bf62ee1a7324a25848.png differ diff --git a/static/assets/129b99ac19024c35228d855f42fb852b.mp3 b/static/assets/129b99ac19024c35228d855f42fb852b.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f32a1da73c948532fa102b80ff65ffb4dee668be Binary files /dev/null and b/static/assets/129b99ac19024c35228d855f42fb852b.mp3 differ diff --git a/static/assets/12e69a59db0f0c697eaaf1abbcad902f.svg b/static/assets/12e69a59db0f0c697eaaf1abbcad902f.svg new file mode 100644 index 0000000000000000000000000000000000000000..589318a2d3a33a181b9e3f5a69f8e25c76c67c99 --- /dev/null +++ b/static/assets/12e69a59db0f0c697eaaf1abbcad902f.svg @@ -0,0 +1,10 @@ + + + + oval + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/1319094a51748798730f01d1dc0972ac.svg b/static/assets/1319094a51748798730f01d1dc0972ac.svg new file mode 100644 index 0000000000000000000000000000000000000000..e3a712ffb3d7cf6cab15c7ea03751733a6852082 --- /dev/null +++ b/static/assets/1319094a51748798730f01d1dc0972ac.svg @@ -0,0 +1,18 @@ + + + + Language + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/13fca624022cc8f762e1da20450c8f03.svg b/static/assets/13fca624022cc8f762e1da20450c8f03.svg new file mode 100644 index 0000000000000000000000000000000000000000..63a16f6c00b6a4b65fd202d95e1451d41044caa2 --- /dev/null +++ b/static/assets/13fca624022cc8f762e1da20450c8f03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/1640b6d968e0a0e13bc3c309a616deaa.svg b/static/assets/1640b6d968e0a0e13bc3c309a616deaa.svg new file mode 100644 index 0000000000000000000000000000000000000000..20439b783770b1d9a0e65add8f91d214670cb16c --- /dev/null +++ b/static/assets/1640b6d968e0a0e13bc3c309a616deaa.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/171fbf8ebb9d7127d4c59a04568e2af4.svg b/static/assets/171fbf8ebb9d7127d4c59a04568e2af4.svg new file mode 100644 index 0000000000000000000000000000000000000000..612d22b5be13aefa278b8d486e1b2095c9d3b22f --- /dev/null +++ b/static/assets/171fbf8ebb9d7127d4c59a04568e2af4.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/174cbb7cc72418e5f095e0b734ceed1d.svg b/static/assets/174cbb7cc72418e5f095e0b734ceed1d.svg new file mode 100644 index 0000000000000000000000000000000000000000..2d401c021ccdbd03967d1eaa5e8511aeb9ccc1f2 --- /dev/null +++ b/static/assets/174cbb7cc72418e5f095e0b734ceed1d.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/18dada8a9aabcfc157e051d2e33aa7fd.png b/static/assets/18dada8a9aabcfc157e051d2e33aa7fd.png new file mode 100644 index 0000000000000000000000000000000000000000..59d7f0979d84df4ca779a4e6d0bc4a17230245f2 Binary files /dev/null and b/static/assets/18dada8a9aabcfc157e051d2e33aa7fd.png differ diff --git a/static/assets/195b65444703293e0624ff4e09c13c81.png b/static/assets/195b65444703293e0624ff4e09c13c81.png new file mode 100644 index 0000000000000000000000000000000000000000..c81bff821d30c1ea42c138a328dd60fa96172685 Binary files /dev/null and b/static/assets/195b65444703293e0624ff4e09c13c81.png differ diff --git a/static/assets/1980303ffc6f5c17c601a9e5992aea77.mp3 b/static/assets/1980303ffc6f5c17c601a9e5992aea77.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0e3074f4328c3144c5868aa8946cf4ceb720e823 Binary files /dev/null and b/static/assets/1980303ffc6f5c17c601a9e5992aea77.mp3 differ diff --git a/static/assets/199f58b4a80fa56c5d8e032d6da5e9c2.svg b/static/assets/199f58b4a80fa56c5d8e032d6da5e9c2.svg new file mode 100644 index 0000000000000000000000000000000000000000..60fe3204474f6caa3fdddcfbdbfa87f70f592898 --- /dev/null +++ b/static/assets/199f58b4a80fa56c5d8e032d6da5e9c2.svg @@ -0,0 +1,22 @@ + + + + robot + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/1a064f9a752824e781ccf79ab66850ed.mp3 b/static/assets/1a064f9a752824e781ccf79ab66850ed.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..54b7df80b9c086bd58b919b98001cb1ca22d1485 Binary files /dev/null and b/static/assets/1a064f9a752824e781ccf79ab66850ed.mp3 differ diff --git a/static/assets/1a086f192347214d507e8373d05481bd.svg b/static/assets/1a086f192347214d507e8373d05481bd.svg new file mode 100644 index 0000000000000000000000000000000000000000..6988600a25af35afe84bd21103709bfef4dfa086 --- /dev/null +++ b/static/assets/1a086f192347214d507e8373d05481bd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/1a87a73db1ba0193283680e37b35754e.mp3 b/static/assets/1a87a73db1ba0193283680e37b35754e.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..640f3de262fcb50e2c4ffe4b4a301c654de39052 Binary files /dev/null and b/static/assets/1a87a73db1ba0193283680e37b35754e.mp3 differ diff --git a/static/assets/1aa0695f67909940855aad4cc774f906.svg b/static/assets/1aa0695f67909940855aad4cc774f906.svg new file mode 100644 index 0000000000000000000000000000000000000000..05486e94ded5f8b7971baddc75384d97c18c116a --- /dev/null +++ b/static/assets/1aa0695f67909940855aad4cc774f906.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/1b769802c531b5a04faf429c1ec27632.svg b/static/assets/1b769802c531b5a04faf429c1ec27632.svg new file mode 100644 index 0000000000000000000000000000000000000000..0692758a63311e899b8501362f3fe8b2e58b34d9 --- /dev/null +++ b/static/assets/1b769802c531b5a04faf429c1ec27632.svg @@ -0,0 +1,16 @@ + + + + mixed-fill + Created with Sketch. + + + + + + + + + + + diff --git a/static/assets/1bb0adb555e07593962e9fc28ec7566d.svg b/static/assets/1bb0adb555e07593962e9fc28ec7566d.svg new file mode 100644 index 0000000000000000000000000000000000000000..c4abdda3ff6c80fc5d5aeb0ba3c04f9b0fd7cddf --- /dev/null +++ b/static/assets/1bb0adb555e07593962e9fc28ec7566d.svg @@ -0,0 +1,22 @@ + + + + Extensions/Connection/Wifi + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/1c8f54c61adf1cee25299833093395f3.png b/static/assets/1c8f54c61adf1cee25299833093395f3.png new file mode 100644 index 0000000000000000000000000000000000000000..b60b8de67d84a60d914e63ed9525159f62bdddf4 Binary files /dev/null and b/static/assets/1c8f54c61adf1cee25299833093395f3.png differ diff --git a/static/assets/1c9630b745711a0b829841e8555d76e4.mp3 b/static/assets/1c9630b745711a0b829841e8555d76e4.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..bc25332748272a81fdaa8f751d4bf6a53a50f09b Binary files /dev/null and b/static/assets/1c9630b745711a0b829841e8555d76e4.mp3 differ diff --git a/static/assets/1d1e22600289d252ebda0b9924bf7d3a.png b/static/assets/1d1e22600289d252ebda0b9924bf7d3a.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b19a9ddaaf5988b9d50e9648e986db7ce558a0 Binary files /dev/null and b/static/assets/1d1e22600289d252ebda0b9924bf7d3a.png differ diff --git a/static/assets/1e348b2e8899c618822c76299803903e.svg b/static/assets/1e348b2e8899c618822c76299803903e.svg new file mode 100644 index 0000000000000000000000000000000000000000..11a16dc3cbb38ed43e67de37da4e71a48a6439d8 --- /dev/null +++ b/static/assets/1e348b2e8899c618822c76299803903e.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/1e391038e9bc3c5bcadf50902980089d.png b/static/assets/1e391038e9bc3c5bcadf50902980089d.png new file mode 100644 index 0000000000000000000000000000000000000000..7966749194c54c14d424d0fea57f6c741b898c2a Binary files /dev/null and b/static/assets/1e391038e9bc3c5bcadf50902980089d.png differ diff --git a/static/assets/1e7ed7b14b056ebd80f434143846fb4e.mp3 b/static/assets/1e7ed7b14b056ebd80f434143846fb4e.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c898b844e6e3383ade3ab42b5ec33e298a03a4fb Binary files /dev/null and b/static/assets/1e7ed7b14b056ebd80f434143846fb4e.mp3 differ diff --git a/static/assets/1fa6345d57ffc67eccd9f44cf6a383dd.svg b/static/assets/1fa6345d57ffc67eccd9f44cf6a383dd.svg new file mode 100644 index 0000000000000000000000000000000000000000..168466281463be19586205071e2eda1ebc1f0544 --- /dev/null +++ b/static/assets/1fa6345d57ffc67eccd9f44cf6a383dd.svg @@ -0,0 +1,14 @@ + + + + + +zoom-out + + + + + + diff --git a/static/assets/208f28114c3654417aae9f71542d1670.png b/static/assets/208f28114c3654417aae9f71542d1670.png new file mode 100644 index 0000000000000000000000000000000000000000..39a7534e3bf21ddcdf74bba6ccd71230d33bbd3e Binary files /dev/null and b/static/assets/208f28114c3654417aae9f71542d1670.png differ diff --git a/static/assets/21739a7b303ece303b023791813412cb.svg b/static/assets/21739a7b303ece303b023791813412cb.svg new file mode 100644 index 0000000000000000000000000000000000000000..99d261addc22ea5b47546b77f2cb7baf4cc9a283 --- /dev/null +++ b/static/assets/21739a7b303ece303b023791813412cb.svg @@ -0,0 +1,10 @@ + + + + line + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/21988681fa28c8ce37982ca26463a6f5.svg b/static/assets/21988681fa28c8ce37982ca26463a6f5.svg new file mode 100644 index 0000000000000000000000000000000000000000..47d09bc7fad766b50da3ed1cffec190b1e94878c --- /dev/null +++ b/static/assets/21988681fa28c8ce37982ca26463a6f5.svg @@ -0,0 +1,16 @@ + + + + re-record + Created with Sketch. + + + + + + + + + + + diff --git a/static/assets/21a46a49b55befa73d6b8352e2795d6f.svg b/static/assets/21a46a49b55befa73d6b8352e2795d6f.svg new file mode 100644 index 0000000000000000000000000000000000000000..ffa31547cf3fbd35b6009affbcb4b95f937eb43d --- /dev/null +++ b/static/assets/21a46a49b55befa73d6b8352e2795d6f.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/238a12e6d066c100697e7b28c87913d0.svg b/static/assets/238a12e6d066c100697e7b28c87913d0.svg new file mode 100644 index 0000000000000000000000000000000000000000..026dee619fc1d446f23ed4cba3950f433859c198 --- /dev/null +++ b/static/assets/238a12e6d066c100697e7b28c87913d0.svg @@ -0,0 +1,20 @@ + + + + icon--modify + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/26255153f92ea41df149a58d3c3fe2cf.svg b/static/assets/26255153f92ea41df149a58d3c3fe2cf.svg new file mode 100644 index 0000000000000000000000000000000000000000..bf7bb64be2c056f2cf6ebcd535437d91c13e01c5 --- /dev/null +++ b/static/assets/26255153f92ea41df149a58d3c3fe2cf.svg @@ -0,0 +1,28 @@ + + + + stop-playback + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/27557abca597bafded7f45adede9a6bf.svg b/static/assets/27557abca597bafded7f45adede9a6bf.svg new file mode 100644 index 0000000000000000000000000000000000000000..e12966421d8cc3676507f70f8112bb0341569a9e --- /dev/null +++ b/static/assets/27557abca597bafded7f45adede9a6bf.svg @@ -0,0 +1,16 @@ + + + + lounder + Created with Sketch. + + + Layer 1 + + + + + + + + \ No newline at end of file diff --git a/static/assets/27802141bca7404b477168369bf3475d.svg b/static/assets/27802141bca7404b477168369bf3475d.svg new file mode 100644 index 0000000000000000000000000000000000000000..5bba68830881e5294d73c065c4f817bc56e678b9 --- /dev/null +++ b/static/assets/27802141bca7404b477168369bf3475d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/27f90bfa982840e56c3ad207561193fa.svg b/static/assets/27f90bfa982840e56c3ad207561193fa.svg new file mode 100644 index 0000000000000000000000000000000000000000..03b7c08627d980f0e45ad989d39eae3e602f9e19 --- /dev/null +++ b/static/assets/27f90bfa982840e56c3ad207561193fa.svg @@ -0,0 +1,18 @@ + + + + General/Check + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/29c0aa6c826f3dc4710823f345eae288.svg b/static/assets/29c0aa6c826f3dc4710823f345eae288.svg new file mode 100644 index 0000000000000000000000000000000000000000..8c4ad26ab79344519e0fefb1fee5dc528ff0a3b5 --- /dev/null +++ b/static/assets/29c0aa6c826f3dc4710823f345eae288.svg @@ -0,0 +1,17 @@ + + + + curved-point + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/2a044a86dce4eb8bc149bb0db93dd352.svg b/static/assets/2a044a86dce4eb8bc149bb0db93dd352.svg new file mode 100644 index 0000000000000000000000000000000000000000..63a33fb2f4814e6025924e63f360d0dc50f8d4c6 --- /dev/null +++ b/static/assets/2a044a86dce4eb8bc149bb0db93dd352.svg @@ -0,0 +1,20 @@ + + + + flip-vertical + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/2a70b21aaaed0619bdfcdec91db1ebe8.svg b/static/assets/2a70b21aaaed0619bdfcdec91db1ebe8.svg new file mode 100644 index 0000000000000000000000000000000000000000..a6dfbe5ebb8bed01a8cc9482e69f50c14fef62be --- /dev/null +++ b/static/assets/2a70b21aaaed0619bdfcdec91db1ebe8.svg @@ -0,0 +1 @@ +R1_ C.Procedure Editble Inputs \ No newline at end of file diff --git a/static/assets/2b0cfb89b2c8d1badb03136fcf911c3b.mp3 b/static/assets/2b0cfb89b2c8d1badb03136fcf911c3b.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..92da76ce0b37ab6a00fdcf53b8aa1185640c685b Binary files /dev/null and b/static/assets/2b0cfb89b2c8d1badb03136fcf911c3b.mp3 differ diff --git a/static/assets/2b48b1ca1e69f653cfdc7c80eb657f56.svg b/static/assets/2b48b1ca1e69f653cfdc7c80eb657f56.svg new file mode 100644 index 0000000000000000000000000000000000000000..b8e436abe3222c907774c97546a2ae230fbc5cdf --- /dev/null +++ b/static/assets/2b48b1ca1e69f653cfdc7c80eb657f56.svg @@ -0,0 +1,16 @@ + + + + align + Created with Sketch. + Created with lul. + Created with Doo Doo + Created with your mom. + + + + + + + + \ No newline at end of file diff --git a/static/assets/2b7b80de8884cc3cf584aa0deb86a59b.mp3 b/static/assets/2b7b80de8884cc3cf584aa0deb86a59b.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0987759cae7299681033cb17d65b48169c5029eb Binary files /dev/null and b/static/assets/2b7b80de8884cc3cf584aa0deb86a59b.mp3 differ diff --git a/static/assets/2be1a9bef13cda38a249cfa6de0dc461.svg b/static/assets/2be1a9bef13cda38a249cfa6de0dc461.svg new file mode 100644 index 0000000000000000000000000000000000000000..0beaa519248c4ded5afc43ee3a6982ebbadf4779 --- /dev/null +++ b/static/assets/2be1a9bef13cda38a249cfa6de0dc461.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/2d24a289beac8fe221ce132aac88a320.svg b/static/assets/2d24a289beac8fe221ce132aac88a320.svg new file mode 100644 index 0000000000000000000000000000000000000000..3f3d9d799728da83ccf06085f522ba6df68430bb --- /dev/null +++ b/static/assets/2d24a289beac8fe221ce132aac88a320.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/2d4c184e3846a60d2ba3b21fbd792f77.svg b/static/assets/2d4c184e3846a60d2ba3b21fbd792f77.svg new file mode 100644 index 0000000000000000000000000000000000000000..f1e24faeb84f8c31e800fceb5813a4a003f0f550 --- /dev/null +++ b/static/assets/2d4c184e3846a60d2ba3b21fbd792f77.svg @@ -0,0 +1,16 @@ + + + + send-backward + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/2e0c4790f8f9cf28e3c346b9cef0fcb6.svg b/static/assets/2e0c4790f8f9cf28e3c346b9cef0fcb6.svg new file mode 100644 index 0000000000000000000000000000000000000000..a853b1cb8594f6451d664708e3ca9b7f33337c8d --- /dev/null +++ b/static/assets/2e0c4790f8f9cf28e3c346b9cef0fcb6.svg @@ -0,0 +1 @@ +icon--green-flag \ No newline at end of file diff --git a/static/assets/2e52d021419ed131bf294fbfb166dad0.svg b/static/assets/2e52d021419ed131bf294fbfb166dad0.svg new file mode 100644 index 0000000000000000000000000000000000000000..76f7bf8ec308a4844aab5f83018326cbe0ca1913 --- /dev/null +++ b/static/assets/2e52d021419ed131bf294fbfb166dad0.svg @@ -0,0 +1,45 @@ + + + + mask + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/2f9cda00a530ac237fc24063067377c3.svg b/static/assets/2f9cda00a530ac237fc24063067377c3.svg new file mode 100644 index 0000000000000000000000000000000000000000..1f5b6ee6e58a29ba0ddf03372fff213c0e2948b5 --- /dev/null +++ b/static/assets/2f9cda00a530ac237fc24063067377c3.svg @@ -0,0 +1,12 @@ + + + + See Community + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/301439e2e5ab88b658368ee525e6752b.svg b/static/assets/301439e2e5ab88b658368ee525e6752b.svg new file mode 100644 index 0000000000000000000000000000000000000000..41655999f677de3fa14becbce299cd3bc517dba8 --- /dev/null +++ b/static/assets/301439e2e5ab88b658368ee525e6752b.svg @@ -0,0 +1,12 @@ + + + + surprise + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/30314175f450b6007dca6a532e5f7919.svg b/static/assets/30314175f450b6007dca6a532e5f7919.svg new file mode 100644 index 0000000000000000000000000000000000000000..d6f031f46c5c63ff875b828c311ff6ce7a753ef6 --- /dev/null +++ b/static/assets/30314175f450b6007dca6a532e5f7919.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/assets/30369b87eed36dd399a127ae7c0ea1a4.png b/static/assets/30369b87eed36dd399a127ae7c0ea1a4.png new file mode 100644 index 0000000000000000000000000000000000000000..1e4f2dddd481438cbbe9155fa25c86152771e95e Binary files /dev/null and b/static/assets/30369b87eed36dd399a127ae7c0ea1a4.png differ diff --git a/static/assets/306abcf3a285c1d279e1fed22bd74a5c.svg b/static/assets/306abcf3a285c1d279e1fed22bd74a5c.svg new file mode 100644 index 0000000000000000000000000000000000000000..35d4cf68b91d49e240b63863bc8fffd29626aae2 --- /dev/null +++ b/static/assets/306abcf3a285c1d279e1fed22bd74a5c.svg @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/31446edc97ac1eb0c3d2af65c0d8432a.svg b/static/assets/31446edc97ac1eb0c3d2af65c0d8432a.svg new file mode 100644 index 0000000000000000000000000000000000000000..ac4299ce1e815e3991d7776b4d0bfad3f021790c --- /dev/null +++ b/static/assets/31446edc97ac1eb0c3d2af65c0d8432a.svg @@ -0,0 +1,10 @@ + + + + eraser + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/318e019bdee5ed02903aa5f22a9903f2.svg b/static/assets/318e019bdee5ed02903aa5f22a9903f2.svg new file mode 100644 index 0000000000000000000000000000000000000000..9be550cfa8c938d32b8fc35a179eb35b03350476 --- /dev/null +++ b/static/assets/318e019bdee5ed02903aa5f22a9903f2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/31c459a6fc47e3d9ff83a2a95e25ae76.svg b/static/assets/31c459a6fc47e3d9ff83a2a95e25ae76.svg new file mode 100644 index 0000000000000000000000000000000000000000..c956a865d91d3cc0ea37f3a3be166cc5ebc98dc4 --- /dev/null +++ b/static/assets/31c459a6fc47e3d9ff83a2a95e25ae76.svg @@ -0,0 +1,12 @@ + + + + undo + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/325cb39cb89c3ff39ca5585585d838f5.svg b/static/assets/325cb39cb89c3ff39ca5585585d838f5.svg new file mode 100644 index 0000000000000000000000000000000000000000..ec6e1dff0db52778265d90f4b04eab6ac29cd2e4 --- /dev/null +++ b/static/assets/325cb39cb89c3ff39ca5585585d838f5.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/assets/3286e2838658ebdb82f62d062b14e951.svg b/static/assets/3286e2838658ebdb82f62d062b14e951.svg new file mode 100644 index 0000000000000000000000000000000000000000..260e2fd26c1197626e40e69c9d60acb691f7f264 --- /dev/null +++ b/static/assets/3286e2838658ebdb82f62d062b14e951.svg @@ -0,0 +1,23 @@ + + + + ev3-block-icon + Created with Sketch. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/33152e09f092ce18fe776f1d670ac99f.svg b/static/assets/33152e09f092ce18fe776f1d670ac99f.svg new file mode 100644 index 0000000000000000000000000000000000000000..4c515905d00d4ec9c84deae38463b574e909bc19 --- /dev/null +++ b/static/assets/33152e09f092ce18fe776f1d670ac99f.svg @@ -0,0 +1,10 @@ + + + + search-sprite-library + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/33592a76d0d0fdaa4a32b2ea41db5e16.svg b/static/assets/33592a76d0d0fdaa4a32b2ea41db5e16.svg new file mode 100644 index 0000000000000000000000000000000000000000..82d4e886e115c47e1bec804e5c4dac60f7ae1171 --- /dev/null +++ b/static/assets/33592a76d0d0fdaa4a32b2ea41db5e16.svg @@ -0,0 +1,10 @@ + + + + Previous + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/33b2c770e12dd94797701e92ae37a820.svg b/static/assets/33b2c770e12dd94797701e92ae37a820.svg new file mode 100644 index 0000000000000000000000000000000000000000..3ac78f74d31cb6452f3744c250df000646f73a28 --- /dev/null +++ b/static/assets/33b2c770e12dd94797701e92ae37a820.svg @@ -0,0 +1,16 @@ + + + + Bottom Left Handle + Created with Sketch. + + + + + + + + + + + diff --git a/static/assets/33b737193edfe1730f38112ad35a84b4.svg b/static/assets/33b737193edfe1730f38112ad35a84b4.svg new file mode 100644 index 0000000000000000000000000000000000000000..96c00ddbbe462c1f241750889c9976b329276931 --- /dev/null +++ b/static/assets/33b737193edfe1730f38112ad35a84b4.svg @@ -0,0 +1,9 @@ + + + + Extensions/Software/Cloud-Data-Block + Created with Sketch. + + + + \ No newline at end of file diff --git a/static/assets/3547fa1f2678a483a19f46852f36b426.svg b/static/assets/3547fa1f2678a483a19f46852f36b426.svg new file mode 100644 index 0000000000000000000000000000000000000000..f67dd091e7c663d51fe5f6e8f9f7103f90b1f4ef --- /dev/null +++ b/static/assets/3547fa1f2678a483a19f46852f36b426.svg @@ -0,0 +1,15 @@ + + + + icon--softer + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/35c6867250ec4f430624bc9e2e7072d7.svg b/static/assets/35c6867250ec4f430624bc9e2e7072d7.svg new file mode 100644 index 0000000000000000000000000000000000000000..9feb24cfd506a570258d234261223fc54e81c1ec --- /dev/null +++ b/static/assets/35c6867250ec4f430624bc9e2e7072d7.svg @@ -0,0 +1,12 @@ + + + + record + Created with Sketch. + + + + + + + diff --git a/static/assets/3682b35e452a7f4a5a61167d1632e24a.ttf b/static/assets/3682b35e452a7f4a5a61167d1632e24a.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7d1545bfcbf7207ed0e8e99d74898e9563215b2f Binary files /dev/null and b/static/assets/3682b35e452a7f4a5a61167d1632e24a.ttf differ diff --git a/static/assets/368c582b289e75a3c5299e954c2ad735.ttf b/static/assets/368c582b289e75a3c5299e954c2ad735.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f1e38c964d53a25789a6f44c5e45e2e9c3a19317 Binary files /dev/null and b/static/assets/368c582b289e75a3c5299e954c2ad735.ttf differ diff --git a/static/assets/369019214d73953a85fb0eec22bcce7c.svg b/static/assets/369019214d73953a85fb0eec22bcce7c.svg new file mode 100644 index 0000000000000000000000000000000000000000..5f0231f1eb09df0cca75f5952a5ae93249eea962 --- /dev/null +++ b/static/assets/369019214d73953a85fb0eec22bcce7c.svg @@ -0,0 +1,16 @@ + + + + align + Created with Sketch. + Created with lul. + Created with Doo Doo + Created with your mom. + + + + + + + + \ No newline at end of file diff --git a/static/assets/36b59d3087103cc7573145332ec64745.svg b/static/assets/36b59d3087103cc7573145332ec64745.svg new file mode 100644 index 0000000000000000000000000000000000000000..889d27bca7802a23add79a751699d69c88d7173a --- /dev/null +++ b/static/assets/36b59d3087103cc7573145332ec64745.svg @@ -0,0 +1,230 @@ + + +Dubugging ThumbnailCreated with Inkscape. Bug icon by CoreUI. <https://github.com/coreui/coreui-icons>debuggerthumbnailscratchpenguinmod2025 May 12Dubugging ThumbnailSteve0Greatness(C) 2025 Steve0Greatness diff --git a/static/assets/36fcc7dbca20720abcab01e49d4955f9.svg b/static/assets/36fcc7dbca20720abcab01e49d4955f9.svg new file mode 100644 index 0000000000000000000000000000000000000000..d18947cc2d7470e466b110d1e90c8c871cb4b5aa --- /dev/null +++ b/static/assets/36fcc7dbca20720abcab01e49d4955f9.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/static/assets/382a52221b13870cd56d51ac719a5d8b.svg b/static/assets/382a52221b13870cd56d51ac719a5d8b.svg new file mode 100644 index 0000000000000000000000000000000000000000..de95665e886d8ba180b3b8a4cc9c99fb1898b2e0 --- /dev/null +++ b/static/assets/382a52221b13870cd56d51ac719a5d8b.svg @@ -0,0 +1,20 @@ + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/385aa4b73a425883b4f9e91501a52299.svg b/static/assets/385aa4b73a425883b4f9e91501a52299.svg new file mode 100644 index 0000000000000000000000000000000000000000..12fa6c7aba4cc4d6ef90a441dbf7f5155ff34921 --- /dev/null +++ b/static/assets/385aa4b73a425883b4f9e91501a52299.svg @@ -0,0 +1,21 @@ + + + + backdrop-library + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/38864948713b3bea4c8f3a77c85003bd.svg b/static/assets/38864948713b3bea4c8f3a77c85003bd.svg new file mode 100644 index 0000000000000000000000000000000000000000..8510b7ad615fa37a18b73616a0c330933429204e --- /dev/null +++ b/static/assets/38864948713b3bea4c8f3a77c85003bd.svg @@ -0,0 +1,18 @@ + + + + merge + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/38a70367a21e2f1fb15aa59b7d367450.svg b/static/assets/38a70367a21e2f1fb15aa59b7d367450.svg new file mode 100644 index 0000000000000000000000000000000000000000..9c367def0b1be58021b827fe332ee977aa5a23c7 --- /dev/null +++ b/static/assets/38a70367a21e2f1fb15aa59b7d367450.svg @@ -0,0 +1,14 @@ + + + + x-icon_V2 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/static/assets/39563f3b38b1fdb805323b1f69dace54.mp3 b/static/assets/39563f3b38b1fdb805323b1f69dace54.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c337dedf2cda849ed2ab020ed1d17db09789411b Binary files /dev/null and b/static/assets/39563f3b38b1fdb805323b1f69dace54.mp3 differ diff --git a/static/assets/39f37f1b00fbf96926276701d8de4c89.png b/static/assets/39f37f1b00fbf96926276701d8de4c89.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b4bf3c4039a92d936151d6de1782121da1f058 Binary files /dev/null and b/static/assets/39f37f1b00fbf96926276701d8de4c89.png differ diff --git a/static/assets/3a2d63269c47aa8244b0d613cf50eb6c.svg b/static/assets/3a2d63269c47aa8244b0d613cf50eb6c.svg new file mode 100644 index 0000000000000000000000000000000000000000..4a26c3527a3dcf44621a1f0ace40723904f016f8 --- /dev/null +++ b/static/assets/3a2d63269c47aa8244b0d613cf50eb6c.svg @@ -0,0 +1,12 @@ + + + + rectangle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/3a9f7312dd51198c123804f87fa78bc9.png b/static/assets/3a9f7312dd51198c123804f87fa78bc9.png new file mode 100644 index 0000000000000000000000000000000000000000..72d7f8521f232de16beda3d06211acb7d7fb680e Binary files /dev/null and b/static/assets/3a9f7312dd51198c123804f87fa78bc9.png differ diff --git a/static/assets/3adc1e3e705ec30e961125d7c136db09.png b/static/assets/3adc1e3e705ec30e961125d7c136db09.png new file mode 100644 index 0000000000000000000000000000000000000000..72c22f1bc7a428fa421c923256d8931f9af814f0 Binary files /dev/null and b/static/assets/3adc1e3e705ec30e961125d7c136db09.png differ diff --git a/static/assets/3b0c388c2cf1462401585224ffe2f077.svg b/static/assets/3b0c388c2cf1462401585224ffe2f077.svg new file mode 100644 index 0000000000000000000000000000000000000000..24fbcb6149166ac2c192c6173f229a3c639f86ab --- /dev/null +++ b/static/assets/3b0c388c2cf1462401585224ffe2f077.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/static/assets/3c3142e814ff1652338af92a410d3d70.svg b/static/assets/3c3142e814ff1652338af92a410d3d70.svg new file mode 100644 index 0000000000000000000000000000000000000000..e669b9828e01d5b4e6bf2e6761a2ab6771d2ebf4 --- /dev/null +++ b/static/assets/3c3142e814ff1652338af92a410d3d70.svg @@ -0,0 +1,20 @@ + + + + Artboard + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/3cfc9b39a0d002246119d47f6756d77e.svg b/static/assets/3cfc9b39a0d002246119d47f6756d77e.svg new file mode 100644 index 0000000000000000000000000000000000000000..4b804c1f4fb5618baa593c04c13710d729cf257b --- /dev/null +++ b/static/assets/3cfc9b39a0d002246119d47f6756d77e.svg @@ -0,0 +1,15 @@ + + + + + +zoom-in + + + + + + + diff --git a/static/assets/3d9e2585d6ed12b9fb994438e0c4c42a.svg b/static/assets/3d9e2585d6ed12b9fb994438e0c4c42a.svg new file mode 100644 index 0000000000000000000000000000000000000000..df39e8e0be19e26e8358b41c3a63b1d72e7d7ef4 --- /dev/null +++ b/static/assets/3d9e2585d6ed12b9fb994438e0c4c42a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/3dd8f573267d99448c62fd87bf0e3591.svg b/static/assets/3dd8f573267d99448c62fd87bf0e3591.svg new file mode 100644 index 0000000000000000000000000000000000000000..ec30528f282d4309c10e0a7dd7589b42a7dc21d8 --- /dev/null +++ b/static/assets/3dd8f573267d99448c62fd87bf0e3591.svg @@ -0,0 +1,16 @@ + + + + lounder + Created with Sketch. + + + Layer 1 + + + + + + + + \ No newline at end of file diff --git a/static/assets/3e83d9d800459175308f0b45b117af16.png b/static/assets/3e83d9d800459175308f0b45b117af16.png new file mode 100644 index 0000000000000000000000000000000000000000..15b2151e35bd84cfa154e6af8fd20607ca4d5e9e Binary files /dev/null and b/static/assets/3e83d9d800459175308f0b45b117af16.png differ diff --git a/static/assets/3fbd690bdae84637e34b8b933a164e3d.mp3 b/static/assets/3fbd690bdae84637e34b8b933a164e3d.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..842228e334b1231bc476ecd7f6885b3e255b8ed3 Binary files /dev/null and b/static/assets/3fbd690bdae84637e34b8b933a164e3d.mp3 differ diff --git a/static/assets/3fc5bb5bf0381947df17be6225e1cb26.png b/static/assets/3fc5bb5bf0381947df17be6225e1cb26.png new file mode 100644 index 0000000000000000000000000000000000000000..0946c0dafee73d831f54725a933109a65586027c Binary files /dev/null and b/static/assets/3fc5bb5bf0381947df17be6225e1cb26.png differ diff --git a/static/assets/40948f8d98c39a96fbba5cf02ec6c8c9.svg b/static/assets/40948f8d98c39a96fbba5cf02ec6c8c9.svg new file mode 100644 index 0000000000000000000000000000000000000000..c3820175262b4c0e2d2a08a1b787046f15fc6f1e --- /dev/null +++ b/static/assets/40948f8d98c39a96fbba5cf02ec6c8c9.svg @@ -0,0 +1,16 @@ + + + + send-forward + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/414ef5f96bd00df3c7b4e175244ddaf3.png b/static/assets/414ef5f96bd00df3c7b4e175244ddaf3.png new file mode 100644 index 0000000000000000000000000000000000000000..6c0aa9d5196dfa5cb7ba5e4a2891397fe0a1e50b Binary files /dev/null and b/static/assets/414ef5f96bd00df3c7b4e175244ddaf3.png differ diff --git a/static/assets/41835a2c99bdd753b68472735b2bd611.svg b/static/assets/41835a2c99bdd753b68472735b2bd611.svg new file mode 100644 index 0000000000000000000000000000000000000000..b6bd302cff9095a953ee72e04be53025964d55ca --- /dev/null +++ b/static/assets/41835a2c99bdd753b68472735b2bd611.svg @@ -0,0 +1,11 @@ + + + delete + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/42157e6edddc19588c3c2ff188703799.svg b/static/assets/42157e6edddc19588c3c2ff188703799.svg new file mode 100644 index 0000000000000000000000000000000000000000..42f7508f279eaeee36aac930e3f343d2bfc7c518 --- /dev/null +++ b/static/assets/42157e6edddc19588c3c2ff188703799.svg @@ -0,0 +1,10 @@ + + + + back + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/422b48c2206d5240a6717c92496ba21a.svg b/static/assets/422b48c2206d5240a6717c92496ba21a.svg new file mode 100644 index 0000000000000000000000000000000000000000..9d26e43918902d57eaa8c1719ee4c133877d85f9 --- /dev/null +++ b/static/assets/422b48c2206d5240a6717c92496ba21a.svg @@ -0,0 +1,17 @@ + + + + Fullscreen + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/4240a79d13ecf2792f825457194c96d9.mp3 b/static/assets/4240a79d13ecf2792f825457194c96d9.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9c551b3661873ca96cc76af6df131f648c0e8e4b Binary files /dev/null and b/static/assets/4240a79d13ecf2792f825457194c96d9.mp3 differ diff --git a/static/assets/42428924171999cebe3efd5e70b7bc53.svg b/static/assets/42428924171999cebe3efd5e70b7bc53.svg new file mode 100644 index 0000000000000000000000000000000000000000..351f5915a26371581918630b4fe85f596880cf1a --- /dev/null +++ b/static/assets/42428924171999cebe3efd5e70b7bc53.svg @@ -0,0 +1,9 @@ + + + + Sound/Effects/Fade-in + Created with Sketch. + + + + \ No newline at end of file diff --git a/static/assets/424371873bc8df88d6a305d8727157ab.svg b/static/assets/424371873bc8df88d6a305d8727157ab.svg new file mode 100644 index 0000000000000000000000000000000000000000..cb2a7c3ce7598feade65c587657821deee7cccbb --- /dev/null +++ b/static/assets/424371873bc8df88d6a305d8727157ab.svg @@ -0,0 +1,12 @@ + + + + icon--slower + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/42d9642b78a0d9f0a1f4065fc74e7bc0.svg b/static/assets/42d9642b78a0d9f0a1f4065fc74e7bc0.svg new file mode 100644 index 0000000000000000000000000000000000000000..af7e9017df52d337c8c45b091e318003339c2ee8 --- /dev/null +++ b/static/assets/42d9642b78a0d9f0a1f4065fc74e7bc0.svg @@ -0,0 +1,12 @@ + + + + undo + Created with Sketch. + + + + + + + diff --git a/static/assets/44c364962f4cb85aef2cdec4f0e01fd4.png b/static/assets/44c364962f4cb85aef2cdec4f0e01fd4.png new file mode 100644 index 0000000000000000000000000000000000000000..8e5f06842a7727b3b025c90712778c1c10bacc0e Binary files /dev/null and b/static/assets/44c364962f4cb85aef2cdec4f0e01fd4.png differ diff --git a/static/assets/44e4859e354c81d66c73f741df2e5ec7.svg b/static/assets/44e4859e354c81d66c73f741df2e5ec7.svg new file mode 100644 index 0000000000000000000000000000000000000000..2294afd72b63d0db142d656a4a4f850d4ce30fd2 --- /dev/null +++ b/static/assets/44e4859e354c81d66c73f741df2e5ec7.svg @@ -0,0 +1,21 @@ + + + + backdrop-library + Created with Sketch. + + + + + + + + + + + + + + + + diff --git a/static/assets/45c47a95ac3bd35713d6a96dd906ebc2.svg b/static/assets/45c47a95ac3bd35713d6a96dd906ebc2.svg new file mode 100644 index 0000000000000000000000000000000000000000..61284801b2114dcaf4bf9ffc1183a1687dd26b18 --- /dev/null +++ b/static/assets/45c47a95ac3bd35713d6a96dd906ebc2.svg @@ -0,0 +1,22 @@ + + + + ungroup + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/46857e786bc7e3b6b81fb2e99c7b74e9.svg b/static/assets/46857e786bc7e3b6b81fb2e99c7b74e9.svg new file mode 100644 index 0000000000000000000000000000000000000000..124174a0a7c447701f1ab6c6eeb1a7423265646b --- /dev/null +++ b/static/assets/46857e786bc7e3b6b81fb2e99c7b74e9.svg @@ -0,0 +1,15 @@ + + + + fill-horz-gradient-enabled + Created with Sketch. + + + + + + + + + + diff --git a/static/assets/481fbac64b59203d7ddffa564a7537d8.svg b/static/assets/481fbac64b59203d7ddffa564a7537d8.svg new file mode 100644 index 0000000000000000000000000000000000000000..c960e66c3c5a34f58549ee46be0193246c0a8678 --- /dev/null +++ b/static/assets/481fbac64b59203d7ddffa564a7537d8.svg @@ -0,0 +1,21 @@ + + + + stop-playback + Created with Sketch. + + + + + + + + + + + + + + + + diff --git a/static/assets/482dc5011057fe26e9542e9476601bf2.png b/static/assets/482dc5011057fe26e9542e9476601bf2.png new file mode 100644 index 0000000000000000000000000000000000000000..b9cd0d28b525b7a5b193ba8ffef4bb99e14e0684 Binary files /dev/null and b/static/assets/482dc5011057fe26e9542e9476601bf2.png differ diff --git a/static/assets/48d03d1d2794e30b221465fc07da79f7.png b/static/assets/48d03d1d2794e30b221465fc07da79f7.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf906ffd5dc78aaad9dd544f3c4799cd8e3f08c Binary files /dev/null and b/static/assets/48d03d1d2794e30b221465fc07da79f7.png differ diff --git a/static/assets/48d66af328a669a1c84c5dc87a4e9a3b.ttf b/static/assets/48d66af328a669a1c84c5dc87a4e9a3b.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c6cfb8e3cdfc54da193067501ca4efd88524daef --- /dev/null +++ b/static/assets/48d66af328a669a1c84c5dc87a4e9a3b.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cd3abd326c2bb204e91399fc190ca4034db4e1f7a78cbed37f5a8b5f2a9a081 +size 119372 diff --git a/static/assets/49a8736bf7fbb79e2469272f127e06d3.svg b/static/assets/49a8736bf7fbb79e2469272f127e06d3.svg new file mode 100644 index 0000000000000000000000000000000000000000..1d70b05dc4c5a3f212ee1fb17b91722cccd3c1b3 --- /dev/null +++ b/static/assets/49a8736bf7fbb79e2469272f127e06d3.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/4b52903ed5677ad3e0b820668ddb37c9.svg b/static/assets/4b52903ed5677ad3e0b820668ddb37c9.svg new file mode 100644 index 0000000000000000000000000000000000000000..2bca2c9c91cfa7eee8a382f0b91c25f9a3f86c0d --- /dev/null +++ b/static/assets/4b52903ed5677ad3e0b820668ddb37c9.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/4b6100c9f591be6470cdfd4697de0b54.svg b/static/assets/4b6100c9f591be6470cdfd4697de0b54.svg new file mode 100644 index 0000000000000000000000000000000000000000..2938e8340ebb54dd699f80eaf48794bd383a96a4 --- /dev/null +++ b/static/assets/4b6100c9f591be6470cdfd4697de0b54.svg @@ -0,0 +1,10 @@ + + + + help + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/4b6ca5259f1271d510f081867e746847.png b/static/assets/4b6ca5259f1271d510f081867e746847.png new file mode 100644 index 0000000000000000000000000000000000000000..09cf8f7791cd21df6209cd2491b08c22326cb7ad Binary files /dev/null and b/static/assets/4b6ca5259f1271d510f081867e746847.png differ diff --git a/static/assets/4bfaa15915bc5fb88b40b3e1a537c3ea.svg b/static/assets/4bfaa15915bc5fb88b40b3e1a537c3ea.svg new file mode 100644 index 0000000000000000000000000000000000000000..025a3de0a5f63555a590a320b1ba139ce76990aa --- /dev/null +++ b/static/assets/4bfaa15915bc5fb88b40b3e1a537c3ea.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/4c5757837d14e9fca439064c62617ba1.png b/static/assets/4c5757837d14e9fca439064c62617ba1.png new file mode 100644 index 0000000000000000000000000000000000000000..3b411622d8721a1130c5eb7edd921caab9f80a3c Binary files /dev/null and b/static/assets/4c5757837d14e9fca439064c62617ba1.png differ diff --git a/static/assets/4c768843c9fa6593074231cd762b83f8.ttf b/static/assets/4c768843c9fa6593074231cd762b83f8.ttf new file mode 100644 index 0000000000000000000000000000000000000000..beeae3fddaea5c8b19a19fbd0f2cb7e86fae7508 --- /dev/null +++ b/static/assets/4c768843c9fa6593074231cd762b83f8.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4b41acf432452ec10d4f7007cf2c89f966607e77573a3d47e7c0a32eeb955ba +size 120140 diff --git a/static/assets/4d250151a07cfc8b54b34e1df68d265c.svg b/static/assets/4d250151a07cfc8b54b34e1df68d265c.svg new file mode 100644 index 0000000000000000000000000000000000000000..1b8fd238fadfc3ddbc70b45e908c86ca4cd5b6d8 --- /dev/null +++ b/static/assets/4d250151a07cfc8b54b34e1df68d265c.svg @@ -0,0 +1,16 @@ + + + + Small Stage (inactive) + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/4da38973d5ffd15c54e80894d430288c.svg b/static/assets/4da38973d5ffd15c54e80894d430288c.svg new file mode 100644 index 0000000000000000000000000000000000000000..78726389d13b811a8b7f31bbfa32a98df118a932 --- /dev/null +++ b/static/assets/4da38973d5ffd15c54e80894d430288c.svg @@ -0,0 +1,40 @@ + + + + mic-indicator + Created with Sketch. + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/4e14eca3d0328a2d2fe39428c6127b2a.svg b/static/assets/4e14eca3d0328a2d2fe39428c6127b2a.svg new file mode 100644 index 0000000000000000000000000000000000000000..8be1de2e2d8162ca14191ffb58e891419441375b --- /dev/null +++ b/static/assets/4e14eca3d0328a2d2fe39428c6127b2a.svg @@ -0,0 +1,25 @@ + + + + group + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/4ec6148233578e86736548eb8b9952e7.png b/static/assets/4ec6148233578e86736548eb8b9952e7.png new file mode 100644 index 0000000000000000000000000000000000000000..3cd4804d941ab9ea743eb24c3cbb9e653104de9a Binary files /dev/null and b/static/assets/4ec6148233578e86736548eb8b9952e7.png differ diff --git a/static/assets/4ec70230d5b7f1ab12560b4619f2dbf9.svg b/static/assets/4ec70230d5b7f1ab12560b4619f2dbf9.svg new file mode 100644 index 0000000000000000000000000000000000000000..1c7975e2c02485bf67da02434cb2e67fcb03b003 --- /dev/null +++ b/static/assets/4ec70230d5b7f1ab12560b4619f2dbf9.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/500c8018b36d12bcde6ef92e20e5ed5d.png b/static/assets/500c8018b36d12bcde6ef92e20e5ed5d.png new file mode 100644 index 0000000000000000000000000000000000000000..ee7f02a1fb1f1e8719a6e9124845122487adb7c0 Binary files /dev/null and b/static/assets/500c8018b36d12bcde6ef92e20e5ed5d.png differ diff --git a/static/assets/504d73be1b361b4b9ca7f655ce085dc6.svg b/static/assets/504d73be1b361b4b9ca7f655ce085dc6.svg new file mode 100644 index 0000000000000000000000000000000000000000..7ffde85e890aaf428f8b97c0797f90f503dc2842 --- /dev/null +++ b/static/assets/504d73be1b361b4b9ca7f655ce085dc6.svg @@ -0,0 +1 @@ +music-block-icon \ No newline at end of file diff --git a/static/assets/51a75dd50afd0bc6022dfc86455be19c.mp3 b/static/assets/51a75dd50afd0bc6022dfc86455be19c.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..882feaaafc039b527572a7d627076e5357dea5d8 Binary files /dev/null and b/static/assets/51a75dd50afd0bc6022dfc86455be19c.mp3 differ diff --git a/static/assets/51a878842a231ebe2fa7cc331e65e89d.svg b/static/assets/51a878842a231ebe2fa7cc331e65e89d.svg new file mode 100644 index 0000000000000000000000000000000000000000..a4049718bc168102aae4c62c13ad7f09090f07a9 --- /dev/null +++ b/static/assets/51a878842a231ebe2fa7cc331e65e89d.svg @@ -0,0 +1,16 @@ + + + + align + Created with Sketch. + Created with lul. + Created with Doo Doo + Created with your mom. + + + + + + + + \ No newline at end of file diff --git a/static/assets/51adf4a45cbacf743c3ee538e432fed2.png b/static/assets/51adf4a45cbacf743c3ee538e432fed2.png new file mode 100644 index 0000000000000000000000000000000000000000..57362156bcbe933046b5aecf213c59d4f8616709 Binary files /dev/null and b/static/assets/51adf4a45cbacf743c3ee538e432fed2.png differ diff --git a/static/assets/51e22c71c1668188b5a3ddd9dc391ff6.svg b/static/assets/51e22c71c1668188b5a3ddd9dc391ff6.svg new file mode 100644 index 0000000000000000000000000000000000000000..00ef5169cfffc22cdb6d9d8cf27496b6179b3040 --- /dev/null +++ b/static/assets/51e22c71c1668188b5a3ddd9dc391ff6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/551aae506dfa65ce3b45713b5300a678.svg b/static/assets/551aae506dfa65ce3b45713b5300a678.svg new file mode 100644 index 0000000000000000000000000000000000000000..fbd17b46c4c9169624eb95f08eb0d2b0cea6bc71 --- /dev/null +++ b/static/assets/551aae506dfa65ce3b45713b5300a678.svg @@ -0,0 +1,10 @@ + + + + search-sprite-library + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/5566fa235cca306584cdda4d4bbd6640.svg b/static/assets/5566fa235cca306584cdda4d4bbd6640.svg new file mode 100644 index 0000000000000000000000000000000000000000..026c19ba82cf5bfd7345ba7dc78bd6766c3a995e --- /dev/null +++ b/static/assets/5566fa235cca306584cdda4d4bbd6640.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/static/assets/55fbbef2dfcc37fb22658e968cda0a67.png b/static/assets/55fbbef2dfcc37fb22658e968cda0a67.png new file mode 100644 index 0000000000000000000000000000000000000000..49166710f48a053fa1a1cfea117a673ec5dbc4a3 Binary files /dev/null and b/static/assets/55fbbef2dfcc37fb22658e968cda0a67.png differ diff --git a/static/assets/5679cd29c517886712116060d3360592.svg b/static/assets/5679cd29c517886712116060d3360592.svg new file mode 100644 index 0000000000000000000000000000000000000000..a0b219d279df6adabb65f32c22abe0519a3f4ade --- /dev/null +++ b/static/assets/5679cd29c517886712116060d3360592.svg @@ -0,0 +1,12 @@ + + + + select + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/572a212c2e777e3a9061c97453497009.png b/static/assets/572a212c2e777e3a9061c97453497009.png new file mode 100644 index 0000000000000000000000000000000000000000..7a72005a102f57ecaa70a4b74f6d6b538ee19499 Binary files /dev/null and b/static/assets/572a212c2e777e3a9061c97453497009.png differ diff --git a/static/assets/57f0f65052d9dac78ee66b11cc696b6a.mp3 b/static/assets/57f0f65052d9dac78ee66b11cc696b6a.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..988f8231875907b06f7e5d0e8896d779675fdca1 Binary files /dev/null and b/static/assets/57f0f65052d9dac78ee66b11cc696b6a.mp3 differ diff --git a/static/assets/57f5c040b2ec7c6f269042b4e1c32a03.png b/static/assets/57f5c040b2ec7c6f269042b4e1c32a03.png new file mode 100644 index 0000000000000000000000000000000000000000..54e3e6dd987d0c618ae03e126defb22d5013db29 --- /dev/null +++ b/static/assets/57f5c040b2ec7c6f269042b4e1c32a03.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d47d384d3263e1cae374aa1b79760963e57c47eaf931e1ee291fc92b02270033 +size 115893 diff --git a/static/assets/5888c4ba6b8a0767f8be5bbc81994397.mp3 b/static/assets/5888c4ba6b8a0767f8be5bbc81994397.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..585feca6a17a5bff3dcf5f085270ed371c87c333 Binary files /dev/null and b/static/assets/5888c4ba6b8a0767f8be5bbc81994397.mp3 differ diff --git a/static/assets/58d1104d0922e424a0b0d4a27e6ed826.svg b/static/assets/58d1104d0922e424a0b0d4a27e6ed826.svg new file mode 100644 index 0000000000000000000000000000000000000000..6f24f2feb5e9f5156fd771d76bb3ce9afd209988 --- /dev/null +++ b/static/assets/58d1104d0922e424a0b0d4a27e6ed826.svg @@ -0,0 +1,29 @@ + + + + + + + diff --git a/static/assets/58d62765bbaa69620eb5bcd2c1cbbebb.png b/static/assets/58d62765bbaa69620eb5bcd2c1cbbebb.png new file mode 100644 index 0000000000000000000000000000000000000000..355f22e4d3a457e89618413cd177bdbe826872ab Binary files /dev/null and b/static/assets/58d62765bbaa69620eb5bcd2c1cbbebb.png differ diff --git a/static/assets/59c79fa681b1421547664294a259b2d8.svg b/static/assets/59c79fa681b1421547664294a259b2d8.svg new file mode 100644 index 0000000000000000000000000000000000000000..47832b0ce52b8b6221957359998cf57ca1cac959 --- /dev/null +++ b/static/assets/59c79fa681b1421547664294a259b2d8.svg @@ -0,0 +1,12 @@ + + + + bitmap + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/5a70df361bb00fa62b9338d89c92f377.png b/static/assets/5a70df361bb00fa62b9338d89c92f377.png new file mode 100644 index 0000000000000000000000000000000000000000..91c9752980aeec60bda11ac6a5393e5e760285bf Binary files /dev/null and b/static/assets/5a70df361bb00fa62b9338d89c92f377.png differ diff --git a/static/assets/5b82df2c2b7bc7783cdcfd1c58f9aa92.svg b/static/assets/5b82df2c2b7bc7783cdcfd1c58f9aa92.svg new file mode 100644 index 0000000000000000000000000000000000000000..9ae5e509d6f22ae7d3c12459d95af0155dbd2bc5 --- /dev/null +++ b/static/assets/5b82df2c2b7bc7783cdcfd1c58f9aa92.svg @@ -0,0 +1,20 @@ + + + + send-front + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/5c6533a34175f61a9cab627f671111e1.mp3 b/static/assets/5c6533a34175f61a9cab627f671111e1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5faf07936131df26ee82ad31e6da9558060c278e Binary files /dev/null and b/static/assets/5c6533a34175f61a9cab627f671111e1.mp3 differ diff --git a/static/assets/5d308ce375ea6edae5abf4e33eda07f3.svg b/static/assets/5d308ce375ea6edae5abf4e33eda07f3.svg new file mode 100644 index 0000000000000000000000000000000000000000..ed3a490fc709659ad2fc5ce2071059a85b75b823 --- /dev/null +++ b/static/assets/5d308ce375ea6edae5abf4e33eda07f3.svg @@ -0,0 +1 @@ +01_Dial Elements \ No newline at end of file diff --git a/static/assets/5dbf111a76a93a93613ec81c16dfc6d3.svg b/static/assets/5dbf111a76a93a93613ec81c16dfc6d3.svg new file mode 100644 index 0000000000000000000000000000000000000000..0b69a9b465a82d5f0e754f64b6846be2e77160a4 --- /dev/null +++ b/static/assets/5dbf111a76a93a93613ec81c16dfc6d3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/5e0704b815761d38242f1b961ce9ef69.mp3 b/static/assets/5e0704b815761d38242f1b961ce9ef69.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5592bc64979f40a098c71e19c7be4acdf0e16ea3 Binary files /dev/null and b/static/assets/5e0704b815761d38242f1b961ce9ef69.mp3 differ diff --git a/static/assets/5e7725764b0a01350ea36166d722c370.svg b/static/assets/5e7725764b0a01350ea36166d722c370.svg new file mode 100644 index 0000000000000000000000000000000000000000..8c77698541b952cd91ff5133a71e6243d55f3e7e --- /dev/null +++ b/static/assets/5e7725764b0a01350ea36166d722c370.svg @@ -0,0 +1,17 @@ + + + + copy v2 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/5e80f6caeb6323606a203fbb248fe18a.png b/static/assets/5e80f6caeb6323606a203fbb248fe18a.png new file mode 100644 index 0000000000000000000000000000000000000000..67cfafa92af67853a0c087cb1201f2b0d3617b43 Binary files /dev/null and b/static/assets/5e80f6caeb6323606a203fbb248fe18a.png differ diff --git a/static/assets/5e8eccd5a576638f029a1ed2deb4784b.svg b/static/assets/5e8eccd5a576638f029a1ed2deb4784b.svg new file mode 100644 index 0000000000000000000000000000000000000000..6837da1af49299ca2ebf863b81737f15eed0d021 --- /dev/null +++ b/static/assets/5e8eccd5a576638f029a1ed2deb4784b.svg @@ -0,0 +1,15 @@ + + + + Extensions/Software/Video-Sensing-Block + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/5f09200519a8b4130cf1b09a35c01a10.png b/static/assets/5f09200519a8b4130cf1b09a35c01a10.png new file mode 100644 index 0000000000000000000000000000000000000000..7920e3a896e09337c7cda8b3300dc10e2e80a4be Binary files /dev/null and b/static/assets/5f09200519a8b4130cf1b09a35c01a10.png differ diff --git a/static/assets/5f4208a6b7257c456c018d57efc8a7e9.svg b/static/assets/5f4208a6b7257c456c018d57efc8a7e9.svg new file mode 100644 index 0000000000000000000000000000000000000000..5d50761c067c83be1444a4fa3f099a43988e17e4 --- /dev/null +++ b/static/assets/5f4208a6b7257c456c018d57efc8a7e9.svg @@ -0,0 +1,18 @@ + + + + add extension + Created with Sketch. + + + + + + + + + + + + + diff --git a/static/assets/5f46c8dc3b8cc2296eb73f013dfce3db.ttf b/static/assets/5f46c8dc3b8cc2296eb73f013dfce3db.ttf new file mode 100644 index 0000000000000000000000000000000000000000..228b3e64bf335eea808cf0d7352841d49fa9ff5b --- /dev/null +++ b/static/assets/5f46c8dc3b8cc2296eb73f013dfce3db.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ad5551f3c641a87c455f836ee579cea8025904ad6bf47440c24cab87daedeec +size 317628 diff --git a/static/assets/5f7a79af3db62e0f5b7306ac0bd5ebf9.svg b/static/assets/5f7a79af3db62e0f5b7306ac0bd5ebf9.svg new file mode 100644 index 0000000000000000000000000000000000000000..e82660009ea12826e648a8e538a0e88e320abb32 --- /dev/null +++ b/static/assets/5f7a79af3db62e0f5b7306ac0bd5ebf9.svg @@ -0,0 +1,64 @@ + + + + wedo-illustration + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/5fe2f38d9b66e0a55b49e717fcd5c001.png b/static/assets/5fe2f38d9b66e0a55b49e717fcd5c001.png new file mode 100644 index 0000000000000000000000000000000000000000..2f9eea93920f6b4057aa2fc02dadc7e5b19867d4 Binary files /dev/null and b/static/assets/5fe2f38d9b66e0a55b49e717fcd5c001.png differ diff --git a/static/assets/60fb267c5ab0c6f4ed9ab4a891ca7dd5.svg b/static/assets/60fb267c5ab0c6f4ed9ab4a891ca7dd5.svg new file mode 100644 index 0000000000000000000000000000000000000000..a056692a3b3973973258b043d5d403aca0704bfe --- /dev/null +++ b/static/assets/60fb267c5ab0c6f4ed9ab4a891ca7dd5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/60fc7acc624571cfa9d250d7d5cff041.svg b/static/assets/60fc7acc624571cfa9d250d7d5cff041.svg new file mode 100644 index 0000000000000000000000000000000000000000..8da57eea8fc5c231a8bf80b18271aee1872892d7 --- /dev/null +++ b/static/assets/60fc7acc624571cfa9d250d7d5cff041.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/617dd0f2b2f2be576184b4283a3c917f.svg b/static/assets/617dd0f2b2f2be576184b4283a3c917f.svg new file mode 100644 index 0000000000000000000000000000000000000000..c5d53300b3d1a0987790018c672a8cf4f989940a --- /dev/null +++ b/static/assets/617dd0f2b2f2be576184b4283a3c917f.svg @@ -0,0 +1,14 @@ + + + + hide-icon-active + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/static/assets/61edf73198617b2326d37f232b8abd6f.otf b/static/assets/61edf73198617b2326d37f232b8abd6f.otf new file mode 100644 index 0000000000000000000000000000000000000000..b95216eaba1903ab8a3879dff68afc84dda9bae4 Binary files /dev/null and b/static/assets/61edf73198617b2326d37f232b8abd6f.otf differ diff --git a/static/assets/620f707d6d9dcd512ec6604b0eda2cb3.svg b/static/assets/620f707d6d9dcd512ec6604b0eda2cb3.svg new file mode 100644 index 0000000000000000000000000000000000000000..d2f65187a36e2d2f152df4fdd0a7ce744f774c2e --- /dev/null +++ b/static/assets/620f707d6d9dcd512ec6604b0eda2cb3.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/622321b437cc79dd9ed885540a94505a.svg b/static/assets/622321b437cc79dd9ed885540a94505a.svg new file mode 100644 index 0000000000000000000000000000000000000000..785164a1faaac9e268ca3b05b3a71042063691a9 --- /dev/null +++ b/static/assets/622321b437cc79dd9ed885540a94505a.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/assets/638bc6bde253241454993ae12273970b.png b/static/assets/638bc6bde253241454993ae12273970b.png new file mode 100644 index 0000000000000000000000000000000000000000..26e4f7e071b0b4b8a35da3043f449bfebd7d40ed Binary files /dev/null and b/static/assets/638bc6bde253241454993ae12273970b.png differ diff --git a/static/assets/6395fd31325176c1d0779dc0ff139c72.svg b/static/assets/6395fd31325176c1d0779dc0ff139c72.svg new file mode 100644 index 0000000000000000000000000000000000000000..cc64a0d5eb67dabc41b0978901e8189f76f3b761 --- /dev/null +++ b/static/assets/6395fd31325176c1d0779dc0ff139c72.svg @@ -0,0 +1 @@ + diff --git a/static/assets/63e5827c1506216bd7c9927a4e5eb558.svg b/static/assets/63e5827c1506216bd7c9927a4e5eb558.svg new file mode 100644 index 0000000000000000000000000000000000000000..152272535f732e16f1bdb88d458563481f7daf09 --- /dev/null +++ b/static/assets/63e5827c1506216bd7c9927a4e5eb558.svg @@ -0,0 +1,10 @@ + + + + Sound + Created with Sketch. + + + + + diff --git a/static/assets/64bcfe1f13fce38e2ea26280157ff2ce.ttf b/static/assets/64bcfe1f13fce38e2ea26280157ff2ce.ttf new file mode 100644 index 0000000000000000000000000000000000000000..02a94e14f721c60f0c4fd309eedfe4a4d8dbbf60 Binary files /dev/null and b/static/assets/64bcfe1f13fce38e2ea26280157ff2ce.ttf differ diff --git a/static/assets/64faeccd0a42a3548ec41b7471ff5ef6.svg b/static/assets/64faeccd0a42a3548ec41b7471ff5ef6.svg new file mode 100644 index 0000000000000000000000000000000000000000..8f0d8473e4050dffa11ffca7f12293c97369f276 --- /dev/null +++ b/static/assets/64faeccd0a42a3548ec41b7471ff5ef6.svg @@ -0,0 +1,26 @@ + + + + + diff --git a/static/assets/6608d56b3dce2738b2b137569d305d3b.png b/static/assets/6608d56b3dce2738b2b137569d305d3b.png new file mode 100644 index 0000000000000000000000000000000000000000..98e65a7650a5a8d592ed2c499d057215f62d90d3 Binary files /dev/null and b/static/assets/6608d56b3dce2738b2b137569d305d3b.png differ diff --git a/static/assets/663892634c556da228c1d09301a54e63.svg b/static/assets/663892634c556da228c1d09301a54e63.svg new file mode 100644 index 0000000000000000000000000000000000000000..1eb61d2d8444454422af23319a1f4f2839a76c01 --- /dev/null +++ b/static/assets/663892634c556da228c1d09301a54e63.svg @@ -0,0 +1,11 @@ + + + file-upload + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/664d94e5cb8676c780c74c695f2e972c.svg b/static/assets/664d94e5cb8676c780c74c695f2e972c.svg new file mode 100644 index 0000000000000000000000000000000000000000..9ed9f8a5499f221d2ec0a7999fc3b4f6305d5243 --- /dev/null +++ b/static/assets/664d94e5cb8676c780c74c695f2e972c.svg @@ -0,0 +1,12 @@ + + + + dropdown-caret + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/66617b2996691804289777645e751c0e.svg b/static/assets/66617b2996691804289777645e751c0e.svg new file mode 100644 index 0000000000000000000000000000000000000000..d5915431d7136bb3c115c1af414376fc6d71af5d --- /dev/null +++ b/static/assets/66617b2996691804289777645e751c0e.svg @@ -0,0 +1,12 @@ + + + + rounded-rectangle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/680b3ff6a51d8fc77fbaf8695c8de929.svg b/static/assets/680b3ff6a51d8fc77fbaf8695c8de929.svg new file mode 100644 index 0000000000000000000000000000000000000000..ed3608f054580a14ccafdd1e02c67189a4b69a69 --- /dev/null +++ b/static/assets/680b3ff6a51d8fc77fbaf8695c8de929.svg @@ -0,0 +1,12 @@ + + + + fill + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/6a8cb419123dfa9fe427b191f7b561ad.png b/static/assets/6a8cb419123dfa9fe427b191f7b561ad.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c01026fcdbf5c0edf2026025c64490651c427f Binary files /dev/null and b/static/assets/6a8cb419123dfa9fe427b191f7b561ad.png differ diff --git a/static/assets/6af0d9a73807fa35410cc50cb6f5e3c7.svg b/static/assets/6af0d9a73807fa35410cc50cb6f5e3c7.svg new file mode 100644 index 0000000000000000000000000000000000000000..f2d34e76061ed01e34d94fcb539235c55e2cbe6b --- /dev/null +++ b/static/assets/6af0d9a73807fa35410cc50cb6f5e3c7.svg @@ -0,0 +1,17 @@ + + + + paste v2 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/6b8350e1c4fcb14dddb1c4bac60690fc.png b/static/assets/6b8350e1c4fcb14dddb1c4bac60690fc.png new file mode 100644 index 0000000000000000000000000000000000000000..6c7ab84e7bd6681d82afbd2e8628b7d7889b94ca Binary files /dev/null and b/static/assets/6b8350e1c4fcb14dddb1c4bac60690fc.png differ diff --git a/static/assets/6be143c7cb9d23c787f7f20674a76f72.svg b/static/assets/6be143c7cb9d23c787f7f20674a76f72.svg new file mode 100644 index 0000000000000000000000000000000000000000..ead401aba1045eba027ae09168f845a7811c9cec --- /dev/null +++ b/static/assets/6be143c7cb9d23c787f7f20674a76f72.svg @@ -0,0 +1,259 @@ + + + + microbit-block-icon + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/6c037268777f4b85658c4fdc1f55b4f9.svg b/static/assets/6c037268777f4b85658c4fdc1f55b4f9.svg new file mode 100644 index 0000000000000000000000000000000000000000..d2e48ac6854382a90799fbb3cdf730b7f0ec4843 --- /dev/null +++ b/static/assets/6c037268777f4b85658c4fdc1f55b4f9.svg @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/static/assets/6f52bcc0310181641bac6fec51c69e13.svg b/static/assets/6f52bcc0310181641bac6fec51c69e13.svg new file mode 100644 index 0000000000000000000000000000000000000000..f8b87c71e70d1e2daae35842642da41ea719e183 --- /dev/null +++ b/static/assets/6f52bcc0310181641bac6fec51c69e13.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/6fb602003b4d9e845e84f77129346396.svg b/static/assets/6fb602003b4d9e845e84f77129346396.svg new file mode 100644 index 0000000000000000000000000000000000000000..e1caec6e3375640a6133653a8e4e5bf7c0d83775 --- /dev/null +++ b/static/assets/6fb602003b4d9e845e84f77129346396.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/70f8bee49a78f131d8dc87658809a684.svg b/static/assets/70f8bee49a78f131d8dc87658809a684.svg new file mode 100644 index 0000000000000000000000000000000000000000..19393efcd3f497e199f7ebc14014ad2756492784 --- /dev/null +++ b/static/assets/70f8bee49a78f131d8dc87658809a684.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/7130491bf33852e50503dcb4024c0279.svg b/static/assets/7130491bf33852e50503dcb4024c0279.svg new file mode 100644 index 0000000000000000000000000000000000000000..d874b966961b1109fd34847a6dab1aa078703f2e --- /dev/null +++ b/static/assets/7130491bf33852e50503dcb4024c0279.svg @@ -0,0 +1,74 @@ + + + + wedo-button-illustration + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/71655cde34ae75f48cb8820abf4b31e7.svg b/static/assets/71655cde34ae75f48cb8820abf4b31e7.svg new file mode 100644 index 0000000000000000000000000000000000000000..3d4aebb47071a08f9214c5e4c5eafb035e2b86ea --- /dev/null +++ b/static/assets/71655cde34ae75f48cb8820abf4b31e7.svg @@ -0,0 +1,10 @@ + + + + refresh + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/73077ae1577fa8af2e8544e19e447491.png b/static/assets/73077ae1577fa8af2e8544e19e447491.png new file mode 100644 index 0000000000000000000000000000000000000000..585c94834d38b00f791889ea00c6924a59a3300e Binary files /dev/null and b/static/assets/73077ae1577fa8af2e8544e19e447491.png differ diff --git a/static/assets/7337f194b0a727f4be98902487dfb615.mp3 b/static/assets/7337f194b0a727f4be98902487dfb615.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..28aeded5178f46ed8b2e7883ab172ae9902ace24 Binary files /dev/null and b/static/assets/7337f194b0a727f4be98902487dfb615.mp3 differ diff --git a/static/assets/73773f78bf2bfc449218fbaee1922964.svg b/static/assets/73773f78bf2bfc449218fbaee1922964.svg new file mode 100644 index 0000000000000000000000000000000000000000..e86b62bba175afb15a19a5be9dc876d5856ba5ce --- /dev/null +++ b/static/assets/73773f78bf2bfc449218fbaee1922964.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/74496d9086d97aaeeafb3085e9957668.ttf b/static/assets/74496d9086d97aaeeafb3085e9957668.ttf new file mode 100644 index 0000000000000000000000000000000000000000..98044e935e515b6b7c5eb562ea880a7b7dc5179c Binary files /dev/null and b/static/assets/74496d9086d97aaeeafb3085e9957668.ttf differ diff --git a/static/assets/74546102be38f592d24b4330a16a8639.svg b/static/assets/74546102be38f592d24b4330a16a8639.svg new file mode 100644 index 0000000000000000000000000000000000000000..821b986a8b2374b1109dc78b862814e814d61e65 --- /dev/null +++ b/static/assets/74546102be38f592d24b4330a16a8639.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/7455bbbfec01551f145bced3f729f105.png b/static/assets/7455bbbfec01551f145bced3f729f105.png new file mode 100644 index 0000000000000000000000000000000000000000..63a8d3fdfe37c65f8efd31bc9a29e7109bd99dab Binary files /dev/null and b/static/assets/7455bbbfec01551f145bced3f729f105.png differ diff --git a/static/assets/751f2b7681471a8020a47cb3d456a8d2.svg b/static/assets/751f2b7681471a8020a47cb3d456a8d2.svg new file mode 100644 index 0000000000000000000000000000000000000000..44ba40ac5fb4e3a920821bd7e142943f40a0374a --- /dev/null +++ b/static/assets/751f2b7681471a8020a47cb3d456a8d2.svg @@ -0,0 +1,15 @@ + + + + fill-radial-enabled + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/7569623cd83d4ceab6b37c1541d656af.svg b/static/assets/7569623cd83d4ceab6b37c1541d656af.svg new file mode 100644 index 0000000000000000000000000000000000000000..d308c08e3a3acb18224e371d5e47c6f475a4729b --- /dev/null +++ b/static/assets/7569623cd83d4ceab6b37c1541d656af.svg @@ -0,0 +1,10 @@ + + + + dont-rotate-active + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/7601fa61034e5d7d542538e1e4338a4e.svg b/static/assets/7601fa61034e5d7d542538e1e4338a4e.svg new file mode 100644 index 0000000000000000000000000000000000000000..de698463dd9b69668377a681438e3d49443e33d3 --- /dev/null +++ b/static/assets/7601fa61034e5d7d542538e1e4338a4e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/76121b7f4eff7d7ca0d49a45479d3f3f.svg b/static/assets/76121b7f4eff7d7ca0d49a45479d3f3f.svg new file mode 100644 index 0000000000000000000000000000000000000000..2d630d4eed237a6b05be25026c8a0b716e855fa2 --- /dev/null +++ b/static/assets/76121b7f4eff7d7ca0d49a45479d3f3f.svg @@ -0,0 +1,18 @@ + + + + Tutorials/Shink + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/7679e8aa3b5a6b745823e00a7b950065.png b/static/assets/7679e8aa3b5a6b745823e00a7b950065.png new file mode 100644 index 0000000000000000000000000000000000000000..f02064c425e89cbac6962b36ee0b90e50d145e03 Binary files /dev/null and b/static/assets/7679e8aa3b5a6b745823e00a7b950065.png differ diff --git a/static/assets/768bcbb6656593c4d4a48e4c7f98f1d6.svg b/static/assets/768bcbb6656593c4d4a48e4c7f98f1d6.svg new file mode 100644 index 0000000000000000000000000000000000000000..268efa63ffbbd1ba477a3afa96c6f1459cbcbf95 --- /dev/null +++ b/static/assets/768bcbb6656593c4d4a48e4c7f98f1d6.svg @@ -0,0 +1,19 @@ + + + + subtract + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/76b6cb627b95d79705c0b41664064f0e.svg b/static/assets/76b6cb627b95d79705c0b41664064f0e.svg new file mode 100644 index 0000000000000000000000000000000000000000..dee8193aad53bc63d7a377e4f3002dd936b024b0 --- /dev/null +++ b/static/assets/76b6cb627b95d79705c0b41664064f0e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/76e8f03f3f2ac00ab16dd4f2afee63c4.png b/static/assets/76e8f03f3f2ac00ab16dd4f2afee63c4.png new file mode 100644 index 0000000000000000000000000000000000000000..1be68ee7a5afed3807ba64352167eb095b71c4ce Binary files /dev/null and b/static/assets/76e8f03f3f2ac00ab16dd4f2afee63c4.png differ diff --git a/static/assets/770c1f3eca5a0d7c327c275865dad3f0.svg b/static/assets/770c1f3eca5a0d7c327c275865dad3f0.svg new file mode 100644 index 0000000000000000000000000000000000000000..5b8fece6696ad9d3be762ddcc7840f098617c601 --- /dev/null +++ b/static/assets/770c1f3eca5a0d7c327c275865dad3f0.svg @@ -0,0 +1,12 @@ + + + + brush + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/78a74345ee778afbd6abe637b4f69efc.mp3 b/static/assets/78a74345ee778afbd6abe637b4f69efc.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5c8ce5664ef7da7d3eb1c002d4496edb1e6c5df5 Binary files /dev/null and b/static/assets/78a74345ee778afbd6abe637b4f69efc.mp3 differ diff --git a/static/assets/78d464ee4e15000ce44b841ff2f4c518.png b/static/assets/78d464ee4e15000ce44b841ff2f4c518.png new file mode 100644 index 0000000000000000000000000000000000000000..65744399256dd76fd20d23911839e296c9a96905 Binary files /dev/null and b/static/assets/78d464ee4e15000ce44b841ff2f4c518.png differ diff --git a/static/assets/78d48375d26960c3ac4fe82387055621.svg b/static/assets/78d48375d26960c3ac4fe82387055621.svg new file mode 100644 index 0000000000000000000000000000000000000000..c60b269a27b49683d0566e66d3b85de7d0ffdaea --- /dev/null +++ b/static/assets/78d48375d26960c3ac4fe82387055621.svg @@ -0,0 +1,14 @@ + + + + left-right-active + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/static/assets/79d588614c7827f6ac6620014b0eb078.svg b/static/assets/79d588614c7827f6ac6620014b0eb078.svg new file mode 100644 index 0000000000000000000000000000000000000000..a345bb37bd828350db279985124b7078823a06bb --- /dev/null +++ b/static/assets/79d588614c7827f6ac6620014b0eb078.svg @@ -0,0 +1,14 @@ + + + + left-right-active + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/static/assets/7a4510ab192e5a0bd0b1186db1396bce.svg b/static/assets/7a4510ab192e5a0bd0b1186db1396bce.svg new file mode 100644 index 0000000000000000000000000000000000000000..805cda13a48d2f5eb09d5107537f3a04d96c4e28 --- /dev/null +++ b/static/assets/7a4510ab192e5a0bd0b1186db1396bce.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/7a7fdb40997804d4778e2a12bd7599f7.mp3 b/static/assets/7a7fdb40997804d4778e2a12bd7599f7.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..3ee19ed18f6d99ca4feb5e3938c21bb84639f9ce Binary files /dev/null and b/static/assets/7a7fdb40997804d4778e2a12bd7599f7.mp3 differ diff --git a/static/assets/7b6399d516d5921bb199f57cdd8bbbbe.svg b/static/assets/7b6399d516d5921bb199f57cdd8bbbbe.svg new file mode 100644 index 0000000000000000000000000000000000000000..0512fad55b1df414551afcbf75ed619b6e30663d --- /dev/null +++ b/static/assets/7b6399d516d5921bb199f57cdd8bbbbe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/7b7fd92f837f3b1368bb7cd709b24ebd.svg b/static/assets/7b7fd92f837f3b1368bb7cd709b24ebd.svg new file mode 100644 index 0000000000000000000000000000000000000000..aa610ae5070c4a0e9e10ae381a3dcce67c15754e --- /dev/null +++ b/static/assets/7b7fd92f837f3b1368bb7cd709b24ebd.svg @@ -0,0 +1,14 @@ + + + + text icon 2-final + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/static/assets/7b98085c05bdcd97dd0c6d4b34317793.svg b/static/assets/7b98085c05bdcd97dd0c6d4b34317793.svg new file mode 100644 index 0000000000000000000000000000000000000000..68ff3ae2a4282f796a7fbeabfbaec219a73609cd --- /dev/null +++ b/static/assets/7b98085c05bdcd97dd0c6d4b34317793.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/7bf301e0e47ee990a3572e0aea2f850e.svg b/static/assets/7bf301e0e47ee990a3572e0aea2f850e.svg new file mode 100644 index 0000000000000000000000000000000000000000..e188e55fbd0f7c15b54c1df94adca088180729a4 --- /dev/null +++ b/static/assets/7bf301e0e47ee990a3572e0aea2f850e.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/static/assets/7c5a16e0627c64fd62ec597bb72b879d.mp3 b/static/assets/7c5a16e0627c64fd62ec597bb72b879d.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..2eee89d3b83ffed8bf2728599e867c69bc0e9fc5 Binary files /dev/null and b/static/assets/7c5a16e0627c64fd62ec597bb72b879d.mp3 differ diff --git a/static/assets/7c9434c4f1f44e3d198db3bc77305fff.svg b/static/assets/7c9434c4f1f44e3d198db3bc77305fff.svg new file mode 100644 index 0000000000000000000000000000000000000000..aeb4651823b6f03341884607b4fcbbb71dc95106 --- /dev/null +++ b/static/assets/7c9434c4f1f44e3d198db3bc77305fff.svg @@ -0,0 +1 @@ + diff --git a/static/assets/7cde88cd98adaaf1e911f68bacdbe719.svg b/static/assets/7cde88cd98adaaf1e911f68bacdbe719.svg new file mode 100644 index 0000000000000000000000000000000000000000..51e77f3e3e325ea43168810396bd1aec57770e16 --- /dev/null +++ b/static/assets/7cde88cd98adaaf1e911f68bacdbe719.svg @@ -0,0 +1,15 @@ + + + +]> + + + + + + + diff --git a/static/assets/7d6f0362fc2114f39b4f6651ebeda312.svg b/static/assets/7d6f0362fc2114f39b4f6651ebeda312.svg new file mode 100644 index 0000000000000000000000000000000000000000..d955dda1d2704e938f5ac74952490eaa42c9b977 --- /dev/null +++ b/static/assets/7d6f0362fc2114f39b4f6651ebeda312.svg @@ -0,0 +1,12 @@ + + + + no-fill + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/7eea42371f5ccb84b4fc7d0ba7331ea3.png b/static/assets/7eea42371f5ccb84b4fc7d0ba7331ea3.png new file mode 100644 index 0000000000000000000000000000000000000000..f8fa9aa3ed134903ea8ef4e155a2e8699bc4d97a Binary files /dev/null and b/static/assets/7eea42371f5ccb84b4fc7d0ba7331ea3.png differ diff --git a/static/assets/7f41449e898401168112236180fcf9d6.svg b/static/assets/7f41449e898401168112236180fcf9d6.svg new file mode 100644 index 0000000000000000000000000000000000000000..bb794f1443c9f5049091a4ef0cdca2648edf82ee --- /dev/null +++ b/static/assets/7f41449e898401168112236180fcf9d6.svg @@ -0,0 +1,18 @@ + + + + icon--format + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/7fa47f4c0e905e7a3eae32fe6347ad8e.svg b/static/assets/7fa47f4c0e905e7a3eae32fe6347ad8e.svg new file mode 100644 index 0000000000000000000000000000000000000000..7d13ab4a11ecaa862a865a70aaf54f459cf6d64c --- /dev/null +++ b/static/assets/7fa47f4c0e905e7a3eae32fe6347ad8e.svg @@ -0,0 +1 @@ + diff --git a/static/assets/800f6f1573677d59954e8d3164602287.svg b/static/assets/800f6f1573677d59954e8d3164602287.svg new file mode 100644 index 0000000000000000000000000000000000000000..452451e2ab77f32be77f9cd766dedbc578c6ea28 --- /dev/null +++ b/static/assets/800f6f1573677d59954e8d3164602287.svg @@ -0,0 +1 @@ +pen-icon \ No newline at end of file diff --git a/static/assets/80ad76114d0b3f2fc54a3756dd283a53.svg b/static/assets/80ad76114d0b3f2fc54a3756dd283a53.svg new file mode 100644 index 0000000000000000000000000000000000000000..3622854609e36979bee634adcad3a5e6a11a4656 --- /dev/null +++ b/static/assets/80ad76114d0b3f2fc54a3756dd283a53.svg @@ -0,0 +1,10 @@ + + + + rectange-outlined + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/81503641d782aa3a3f88df14b58bc3e6.png b/static/assets/81503641d782aa3a3f88df14b58bc3e6.png new file mode 100644 index 0000000000000000000000000000000000000000..5c2937cc45c741596fda83cf3cef208260960928 Binary files /dev/null and b/static/assets/81503641d782aa3a3f88df14b58bc3e6.png differ diff --git a/static/assets/81d5d1258558641e78d425193753207c.svg b/static/assets/81d5d1258558641e78d425193753207c.svg new file mode 100644 index 0000000000000000000000000000000000000000..ff7d2e2c685b19dda140955afbd713076c33a238 --- /dev/null +++ b/static/assets/81d5d1258558641e78d425193753207c.svg @@ -0,0 +1,10 @@ + + + + marquee + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/8279ce395d0333b880b8be6d243fd111.svg b/static/assets/8279ce395d0333b880b8be6d243fd111.svg new file mode 100644 index 0000000000000000000000000000000000000000..db35f3de3ed46c1c7203d4ba0d7c108ff67c9a86 --- /dev/null +++ b/static/assets/8279ce395d0333b880b8be6d243fd111.svg @@ -0,0 +1,12 @@ + + + + icon--faster + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/827c57667d965940792a82d82345e075.png b/static/assets/827c57667d965940792a82d82345e075.png new file mode 100644 index 0000000000000000000000000000000000000000..251eb3a05c15490d96e484aae010fdfaac429963 Binary files /dev/null and b/static/assets/827c57667d965940792a82d82345e075.png differ diff --git a/static/assets/837d221121f5f6dc06f1ae42a7f5e071.svg b/static/assets/837d221121f5f6dc06f1ae42a7f5e071.svg new file mode 100644 index 0000000000000000000000000000000000000000..30649483ba69a85db504335ca83915b2a84b341e --- /dev/null +++ b/static/assets/837d221121f5f6dc06f1ae42a7f5e071.svg @@ -0,0 +1,16 @@ + + + + Large Stage (active) + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/83857346b7c2e6a351c69377e82a3606.mp3 b/static/assets/83857346b7c2e6a351c69377e82a3606.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..064672bb625a5c030d7f572f028128a4a5fc8a18 Binary files /dev/null and b/static/assets/83857346b7c2e6a351c69377e82a3606.mp3 differ diff --git a/static/assets/83b16872b1684580c2e0a1ee1e57506e.svg b/static/assets/83b16872b1684580c2e0a1ee1e57506e.svg new file mode 100644 index 0000000000000000000000000000000000000000..14b1944d8e592a52a88eb411dd9b39172672540a --- /dev/null +++ b/static/assets/83b16872b1684580c2e0a1ee1e57506e.svg @@ -0,0 +1,14 @@ + + + + Sound/General/Copy + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/static/assets/83f2d48d0c7d1e6be8a509d4d2c6d0e5.mp3 b/static/assets/83f2d48d0c7d1e6be8a509d4d2c6d0e5.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..bf9c664793615bcb5f5422b770b02d70e3793802 Binary files /dev/null and b/static/assets/83f2d48d0c7d1e6be8a509d4d2c6d0e5.mp3 differ diff --git a/static/assets/84a9455c54ab68ad8dcf8b6f6465ae71.svg b/static/assets/84a9455c54ab68ad8dcf8b6f6465ae71.svg new file mode 100644 index 0000000000000000000000000000000000000000..3ef892bcc456fd9196e72356742391fd74b67a93 --- /dev/null +++ b/static/assets/84a9455c54ab68ad8dcf8b6f6465ae71.svg @@ -0,0 +1,368 @@ + + + + microbit-illustration + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/84ad46536cb4de7a9e82347461b375a1.svg b/static/assets/84ad46536cb4de7a9e82347461b375a1.svg new file mode 100644 index 0000000000000000000000000000000000000000..d4089cc143194800845d509b61ece744b0197532 --- /dev/null +++ b/static/assets/84ad46536cb4de7a9e82347461b375a1.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/8631e81b32644527d0d056b213faddc8.svg b/static/assets/8631e81b32644527d0d056b213faddc8.svg new file mode 100644 index 0000000000000000000000000000000000000000..a5062a88bc8d54dc16b95e246360a8c00f96b1b1 --- /dev/null +++ b/static/assets/8631e81b32644527d0d056b213faddc8.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/870d942b2502550f58b9eab7561f42ec.svg b/static/assets/870d942b2502550f58b9eab7561f42ec.svg new file mode 100644 index 0000000000000000000000000000000000000000..168898c29ce9e64c7ca59c2cee26ed93f1639d4b --- /dev/null +++ b/static/assets/870d942b2502550f58b9eab7561f42ec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/87a3a62c0627e925b92d3ede2f62b04f.ttf b/static/assets/87a3a62c0627e925b92d3ede2f62b04f.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cf6fdf44e2ec74a0ebe28b4bbb21f89b66bf8420 Binary files /dev/null and b/static/assets/87a3a62c0627e925b92d3ede2f62b04f.ttf differ diff --git a/static/assets/88a3bec89367b65d176c22eef8c6ddcd.svg b/static/assets/88a3bec89367b65d176c22eef8c6ddcd.svg new file mode 100644 index 0000000000000000000000000000000000000000..7100b140869285fd89f5282f2ab729e0aca16814 --- /dev/null +++ b/static/assets/88a3bec89367b65d176c22eef8c6ddcd.svg @@ -0,0 +1,29 @@ + + + + + + + diff --git a/static/assets/88a77444f0bb453209bf1c62becbd37c.svg b/static/assets/88a77444f0bb453209bf1c62becbd37c.svg new file mode 100644 index 0000000000000000000000000000000000000000..5592465f2dd0cd0ed6a4fa997ccf5e8952bdd800 --- /dev/null +++ b/static/assets/88a77444f0bb453209bf1c62becbd37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/88ab038784badd192df6bd931d7c2e40.svg b/static/assets/88ab038784badd192df6bd931d7c2e40.svg new file mode 100644 index 0000000000000000000000000000000000000000..c963fd8615aec1fa935a7f60ee7527642e61f086 --- /dev/null +++ b/static/assets/88ab038784badd192df6bd931d7c2e40.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/8996930d8e83f63cc3341172205df460.otf b/static/assets/8996930d8e83f63cc3341172205df460.otf new file mode 100644 index 0000000000000000000000000000000000000000..85ea852e650171601ea322527eec42e8421c10e5 --- /dev/null +++ b/static/assets/8996930d8e83f63cc3341172205df460.otf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22892edbfe310d39952b37c7ef1f1b9a1053a01b5ee528b81296eec23cb94c7d +size 222380 diff --git a/static/assets/89a5687599f173f2b910aa5fcd862b42.svg b/static/assets/89a5687599f173f2b910aa5fcd862b42.svg new file mode 100644 index 0000000000000000000000000000000000000000..7749f7539b3680b035148266abb04517cf876c59 --- /dev/null +++ b/static/assets/89a5687599f173f2b910aa5fcd862b42.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/89b0a98b82e2fcad7e4563b348a1caf7.png b/static/assets/89b0a98b82e2fcad7e4563b348a1caf7.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a04c623555b9711903a8c2e8682da5324dfd39 Binary files /dev/null and b/static/assets/89b0a98b82e2fcad7e4563b348a1caf7.png differ diff --git a/static/assets/89c89d8cb19c183635c7e00f2ff5a63c.svg b/static/assets/89c89d8cb19c183635c7e00f2ff5a63c.svg new file mode 100644 index 0000000000000000000000000000000000000000..563e495515109b48871743dbec3e3f36123565f4 --- /dev/null +++ b/static/assets/89c89d8cb19c183635c7e00f2ff5a63c.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/8a30520407ffdf5b0e7e06e490db9c1d.svg b/static/assets/8a30520407ffdf5b0e7e06e490db9c1d.svg new file mode 100644 index 0000000000000000000000000000000000000000..6f3340943e29a662e95f645c8a94b4d3cf206247 --- /dev/null +++ b/static/assets/8a30520407ffdf5b0e7e06e490db9c1d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/8b8f2d052b4092ec47ad66c30c8b1642.svg b/static/assets/8b8f2d052b4092ec47ad66c30c8b1642.svg new file mode 100644 index 0000000000000000000000000000000000000000..ebec155b4398ed010a30ab4d10ecb4597c52ad8c --- /dev/null +++ b/static/assets/8b8f2d052b4092ec47ad66c30c8b1642.svg @@ -0,0 +1,31 @@ + + + + Bluetooth + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/8bad9bd9d9a0d53b4a0f4e69bf02764a.png b/static/assets/8bad9bd9d9a0d53b4a0f4e69bf02764a.png new file mode 100644 index 0000000000000000000000000000000000000000..53a85f1f6e46ca2d32e3412307a141dffe8a2dfe Binary files /dev/null and b/static/assets/8bad9bd9d9a0d53b4a0f4e69bf02764a.png differ diff --git a/static/assets/8bcd9c00e30a0af9d832735651fd9643.svg b/static/assets/8bcd9c00e30a0af9d832735651fd9643.svg new file mode 100644 index 0000000000000000000000000000000000000000..56e80fb38135884c1d30b4842a5576b37bfa4bff --- /dev/null +++ b/static/assets/8bcd9c00e30a0af9d832735651fd9643.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/assets/8beb9da10f72d02b48baf0b24ac72449.svg b/static/assets/8beb9da10f72d02b48baf0b24ac72449.svg new file mode 100644 index 0000000000000000000000000000000000000000..c46c2f00cc8c247ff412ecfa41d0af0e4298465d --- /dev/null +++ b/static/assets/8beb9da10f72d02b48baf0b24ac72449.svg @@ -0,0 +1 @@ +R1_ C.Procedure Editble Inputstext diff --git a/static/assets/8c0c02f16572b730d422f96a3ce53e7f.mp3 b/static/assets/8c0c02f16572b730d422f96a3ce53e7f.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4efc40bf0c536e7dee1ffd4ba085ead6a3c2664d Binary files /dev/null and b/static/assets/8c0c02f16572b730d422f96a3ce53e7f.mp3 differ diff --git a/static/assets/8ca9997e9ed7534a8d0f349a6125bd24.mp3 b/static/assets/8ca9997e9ed7534a8d0f349a6125bd24.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a329b732cec12fdf74629d6562b2a398a8f50c93 Binary files /dev/null and b/static/assets/8ca9997e9ed7534a8d0f349a6125bd24.mp3 differ diff --git a/static/assets/8d83d454d2c42614a203322393c23a5b.ttf b/static/assets/8d83d454d2c42614a203322393c23a5b.ttf new file mode 100644 index 0000000000000000000000000000000000000000..57edc5d069d0cf8d420db0d93fb911501e0e26bf --- /dev/null +++ b/static/assets/8d83d454d2c42614a203322393c23a5b.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9f4359da4fed1b9efa43985d67c7e6e9d18cf9cd162782684046cc403decea4 +size 116936 diff --git a/static/assets/8e5e28b23ba596614a60d319d9c64165.svg b/static/assets/8e5e28b23ba596614a60d319d9c64165.svg new file mode 100644 index 0000000000000000000000000000000000000000..7f8c8c395969e202e01d4e18c0225b5ab98c49b0 --- /dev/null +++ b/static/assets/8e5e28b23ba596614a60d319d9c64165.svg @@ -0,0 +1,41 @@ + + + + ev3-hub-illustration + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/8f160ba31754d0e965eaeb54b60d6240.svg b/static/assets/8f160ba31754d0e965eaeb54b60d6240.svg new file mode 100644 index 0000000000000000000000000000000000000000..b35222f2d2ef0074915021ccd2af483a89e40560 --- /dev/null +++ b/static/assets/8f160ba31754d0e965eaeb54b60d6240.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/8f3259bb74d811177e8e65dcbea39ed4.png b/static/assets/8f3259bb74d811177e8e65dcbea39ed4.png new file mode 100644 index 0000000000000000000000000000000000000000..46a8804af22584bd2642fb1b46f3681cbc7bfadc Binary files /dev/null and b/static/assets/8f3259bb74d811177e8e65dcbea39ed4.png differ diff --git a/static/assets/8f531cd80e1aa712fdff13a69c9c62e2.svg b/static/assets/8f531cd80e1aa712fdff13a69c9c62e2.svg new file mode 100644 index 0000000000000000000000000000000000000000..fc727da8e3dc587010c3c2c665d7dc6f3f2f0a30 --- /dev/null +++ b/static/assets/8f531cd80e1aa712fdff13a69c9c62e2.svg @@ -0,0 +1,17 @@ + + + + idk icon + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/8fb27bc07c64def488d712e06906c7a4.svg b/static/assets/8fb27bc07c64def488d712e06906c7a4.svg new file mode 100644 index 0000000000000000000000000000000000000000..0489c30fc5e06026382be0fa1c160f9ff4cb03ce --- /dev/null +++ b/static/assets/8fb27bc07c64def488d712e06906c7a4.svg @@ -0,0 +1,12 @@ + + + + eye-dropper + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/8fdeee6df0b53509b7f9d623cab482b3.svg b/static/assets/8fdeee6df0b53509b7f9d623cab482b3.svg new file mode 100644 index 0000000000000000000000000000000000000000..0b1c7f29b4d485033dff056516c72a1df81df669 --- /dev/null +++ b/static/assets/8fdeee6df0b53509b7f9d623cab482b3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/90e939d170002c61a50116ed55763b19.svg b/static/assets/90e939d170002c61a50116ed55763b19.svg new file mode 100644 index 0000000000000000000000000000000000000000..391ba91231952330a5850ca101f9346b7a1f6cab --- /dev/null +++ b/static/assets/90e939d170002c61a50116ed55763b19.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/90eaf6469dbf3a808a3d9739cc77358d.mp3 b/static/assets/90eaf6469dbf3a808a3d9739cc77358d.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6cbd0c8c1a961347794a5ca3410b3b4d7a2f4afd Binary files /dev/null and b/static/assets/90eaf6469dbf3a808a3d9739cc77358d.mp3 differ diff --git a/static/assets/930323f74179aa022fd87939b3b2999c.svg b/static/assets/930323f74179aa022fd87939b3b2999c.svg new file mode 100644 index 0000000000000000000000000000000000000000..7d56b679d9c48c65d83447e501f31473b86142e6 --- /dev/null +++ b/static/assets/930323f74179aa022fd87939b3b2999c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/93259f95026260bc06f83d29d3b89115.svg b/static/assets/93259f95026260bc06f83d29d3b89115.svg new file mode 100644 index 0000000000000000000000000000000000000000..6582f2ce93afe45ee13c8b5a2c6d77a671282e4d --- /dev/null +++ b/static/assets/93259f95026260bc06f83d29d3b89115.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/942d5ca1a892e7dc5156d0ae7b438c1b.png b/static/assets/942d5ca1a892e7dc5156d0ae7b438c1b.png new file mode 100644 index 0000000000000000000000000000000000000000..57cb44cbe7c3114b9ddc717839b8db8e7b77d202 Binary files /dev/null and b/static/assets/942d5ca1a892e7dc5156d0ae7b438c1b.png differ diff --git a/static/assets/94b06fb716871f81bec601724e29a457.svg b/static/assets/94b06fb716871f81bec601724e29a457.svg new file mode 100644 index 0000000000000000000000000000000000000000..f79d562c350a71f602003d8e8add687a90a01cde --- /dev/null +++ b/static/assets/94b06fb716871f81bec601724e29a457.svg @@ -0,0 +1,12 @@ + + + + paint + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/94b3a496d095dd3b3cfbaabb84a190fd.png b/static/assets/94b3a496d095dd3b3cfbaabb84a190fd.png new file mode 100644 index 0000000000000000000000000000000000000000..c70ad7268b03e690576fc3b49787066b8abd2108 Binary files /dev/null and b/static/assets/94b3a496d095dd3b3cfbaabb84a190fd.png differ diff --git a/static/assets/961bfad11616b6f5c951c58499cf267a.mp3 b/static/assets/961bfad11616b6f5c951c58499cf267a.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..472afa8f99cec1ea3835c92c391bca6010ec6e7a Binary files /dev/null and b/static/assets/961bfad11616b6f5c951c58499cf267a.mp3 differ diff --git a/static/assets/969aaca3d7c0ff67b664b24c2652fb12.svg b/static/assets/969aaca3d7c0ff67b664b24c2652fb12.svg new file mode 100644 index 0000000000000000000000000000000000000000..acc2ef21a093badb5760adef892dc3784e6c6963 --- /dev/null +++ b/static/assets/969aaca3d7c0ff67b664b24c2652fb12.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/97926439955086f8ee4aabbd81580f17.png b/static/assets/97926439955086f8ee4aabbd81580f17.png new file mode 100644 index 0000000000000000000000000000000000000000..bddfb8de9ee95ccef600bcb6a67ce5ed3c5ed4d5 Binary files /dev/null and b/static/assets/97926439955086f8ee4aabbd81580f17.png differ diff --git a/static/assets/97aa37df83e2c5c2effa09d6622cd3a7.png b/static/assets/97aa37df83e2c5c2effa09d6622cd3a7.png new file mode 100644 index 0000000000000000000000000000000000000000..23c5ff620c6441b0c4ce7b93b6c400b25dd6dd6b Binary files /dev/null and b/static/assets/97aa37df83e2c5c2effa09d6622cd3a7.png differ diff --git a/static/assets/989d99155bdb2720680a8c09fb7c454e.svg b/static/assets/989d99155bdb2720680a8c09fb7c454e.svg new file mode 100644 index 0000000000000000000000000000000000000000..b0076f4ea2491efecc3c31b752d2fc3fe65589be --- /dev/null +++ b/static/assets/989d99155bdb2720680a8c09fb7c454e.svg @@ -0,0 +1,10 @@ + + + + text + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/98cd4769145ea580a7d6fef9fdb62aab.png b/static/assets/98cd4769145ea580a7d6fef9fdb62aab.png new file mode 100644 index 0000000000000000000000000000000000000000..2b10d8bef30471f3ef75fd4b979953812dd69372 Binary files /dev/null and b/static/assets/98cd4769145ea580a7d6fef9fdb62aab.png differ diff --git a/static/assets/992fc2de9ef0319e29b6d3c8ff5d8ca0.svg b/static/assets/992fc2de9ef0319e29b6d3c8ff5d8ca0.svg new file mode 100644 index 0000000000000000000000000000000000000000..9de841b4f142d182dff9c75814846f527112f3eb --- /dev/null +++ b/static/assets/992fc2de9ef0319e29b6d3c8ff5d8ca0.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/assets/993a0700d8a0972d309307b0a4688ed7.svg b/static/assets/993a0700d8a0972d309307b0a4688ed7.svg new file mode 100644 index 0000000000000000000000000000000000000000..4bf61fb506dcad6e699ef1c1ae8539da77a08220 --- /dev/null +++ b/static/assets/993a0700d8a0972d309307b0a4688ed7.svg @@ -0,0 +1,28 @@ + + + + stop-recording + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/999649b8d77ea4f04e0dca31326090c1.svg b/static/assets/999649b8d77ea4f04e0dca31326090c1.svg new file mode 100644 index 0000000000000000000000000000000000000000..7c0e6a4fdf903858d4092d6cb5f49d083a75d72e --- /dev/null +++ b/static/assets/999649b8d77ea4f04e0dca31326090c1.svg @@ -0,0 +1,28 @@ + + + + + + + diff --git a/static/assets/99de7c4b260353d52ca40624a6dfe112.svg b/static/assets/99de7c4b260353d52ca40624a6dfe112.svg new file mode 100644 index 0000000000000000000000000000000000000000..4cddfe65c7f072b8d9f8a950aa473bd526403829 --- /dev/null +++ b/static/assets/99de7c4b260353d52ca40624a6dfe112.svg @@ -0,0 +1,12 @@ + + + + pen + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/9ad12a9de73f49fb645902987027eb2b.mp3 b/static/assets/9ad12a9de73f49fb645902987027eb2b.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4f623cd120b464012c57cd8579877bcf7db001c0 Binary files /dev/null and b/static/assets/9ad12a9de73f49fb645902987027eb2b.mp3 differ diff --git a/static/assets/9c2e381fb6da323e4ab7948c353a629b.svg b/static/assets/9c2e381fb6da323e4ab7948c353a629b.svg new file mode 100644 index 0000000000000000000000000000000000000000..a90ee949cabd4dadff687ba70422ed11af0fdfd4 --- /dev/null +++ b/static/assets/9c2e381fb6da323e4ab7948c353a629b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/9cfdd378e4cc977fe663ca932e530ec6.svg b/static/assets/9cfdd378e4cc977fe663ca932e530ec6.svg new file mode 100644 index 0000000000000000000000000000000000000000..b279dc52cf22c77bd7eb7115913d80081202604c --- /dev/null +++ b/static/assets/9cfdd378e4cc977fe663ca932e530ec6.svg @@ -0,0 +1,12 @@ + + + + sound-library + Created with Sketch. + + + + + + + diff --git a/static/assets/9d7acb2e5784a9a1d52e564af3d8469b.svg b/static/assets/9d7acb2e5784a9a1d52e564af3d8469b.svg new file mode 100644 index 0000000000000000000000000000000000000000..b148a7cfebde18de7005fa48903c75d8013daa46 --- /dev/null +++ b/static/assets/9d7acb2e5784a9a1d52e564af3d8469b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/9ddae4f6c1aeaf0784007203d9d4ac9c.svg b/static/assets/9ddae4f6c1aeaf0784007203d9d4ac9c.svg new file mode 100644 index 0000000000000000000000000000000000000000..259430f217145c084e5970e9244e2c73a7a31ad5 --- /dev/null +++ b/static/assets/9ddae4f6c1aeaf0784007203d9d4ac9c.svg @@ -0,0 +1,16 @@ + + + + y icon V2 + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/9e32994e371028645656c0bce61be484.png b/static/assets/9e32994e371028645656c0bce61be484.png new file mode 100644 index 0000000000000000000000000000000000000000..f4a61ea1897297c518ebb1a8ec1a007fe09e19a3 Binary files /dev/null and b/static/assets/9e32994e371028645656c0bce61be484.png differ diff --git a/static/assets/9ec3449723269a806ec6eaba0f8f6cef.ttf b/static/assets/9ec3449723269a806ec6eaba0f8f6cef.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f47ce864769ff03ab008912fc46f9e8d74a9cdf2 --- /dev/null +++ b/static/assets/9ec3449723269a806ec6eaba0f8f6cef.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c801b8d2522fb554678f17f4597158b1af3f9be3abd6ce35d5a3112a81e2bf39 +size 452608 diff --git a/static/assets/9ecfc22bb2fae434d72acfa182df6927.png b/static/assets/9ecfc22bb2fae434d72acfa182df6927.png new file mode 100644 index 0000000000000000000000000000000000000000..e4df972b29540f5b486481edc203a0640ec16597 Binary files /dev/null and b/static/assets/9ecfc22bb2fae434d72acfa182df6927.png differ diff --git a/static/assets/9f8e3a1db63c7a8fd976beca7e3546c3.mp3 b/static/assets/9f8e3a1db63c7a8fd976beca7e3546c3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..faf7315ae3db40ed431b40120a9feaff4ff3b6bd Binary files /dev/null and b/static/assets/9f8e3a1db63c7a8fd976beca7e3546c3.mp3 differ diff --git a/static/assets/a02821bc5d19d616d43d55ac10779101.png b/static/assets/a02821bc5d19d616d43d55ac10779101.png new file mode 100644 index 0000000000000000000000000000000000000000..c63cdd0af8518895ce50d77231a991a99a05b6f1 Binary files /dev/null and b/static/assets/a02821bc5d19d616d43d55ac10779101.png differ diff --git a/static/assets/a03436c2c26c934fc0a7997065971874.png b/static/assets/a03436c2c26c934fc0a7997065971874.png new file mode 100644 index 0000000000000000000000000000000000000000..e147343a5f43e1b991ccb5f6b9e0f01c72c67499 Binary files /dev/null and b/static/assets/a03436c2c26c934fc0a7997065971874.png differ diff --git a/static/assets/a05bbf6359407ad7950e115edab178d9.mp3 b/static/assets/a05bbf6359407ad7950e115edab178d9.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d8d1abc1d61f58bd70d3690b7c92b795cdef1c66 Binary files /dev/null and b/static/assets/a05bbf6359407ad7950e115edab178d9.mp3 differ diff --git a/static/assets/a0b130dbafdc7958b73d162239053173.mp3 b/static/assets/a0b130dbafdc7958b73d162239053173.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..cf099153036ab4eb5abb3db299d8bc97f5495adc Binary files /dev/null and b/static/assets/a0b130dbafdc7958b73d162239053173.mp3 differ diff --git a/static/assets/a0d194f44b13fbeaf843e784cc8b03fb.svg b/static/assets/a0d194f44b13fbeaf843e784cc8b03fb.svg new file mode 100644 index 0000000000000000000000000000000000000000..b247aa743b265c5a71e02cba8af8a8801a412e86 --- /dev/null +++ b/static/assets/a0d194f44b13fbeaf843e784cc8b03fb.svg @@ -0,0 +1,10 @@ + + + + fill-solid-enabled + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/a2ed866eb2db31b7583e7b52ee598246.svg b/static/assets/a2ed866eb2db31b7583e7b52ee598246.svg new file mode 100644 index 0000000000000000000000000000000000000000..6d3ca3633aab8cc0f008051b0922931b6abeb598 --- /dev/null +++ b/static/assets/a2ed866eb2db31b7583e7b52ee598246.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/a3e689235188ba10c5cfd75730cb88a7.svg b/static/assets/a3e689235188ba10c5cfd75730cb88a7.svg new file mode 100644 index 0000000000000000000000000000000000000000..73c7b929f4173397eef78d6ec29af65f8fba718b --- /dev/null +++ b/static/assets/a3e689235188ba10c5cfd75730cb88a7.svg @@ -0,0 +1,18 @@ + + + + Extensions/Connection/Close + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/a4d91e3b83e7cbccaf4a4e2322b873f5.svg b/static/assets/a4d91e3b83e7cbccaf4a4e2322b873f5.svg new file mode 100644 index 0000000000000000000000000000000000000000..53837e30c9f0e93279855f364db975e17ae9386f --- /dev/null +++ b/static/assets/a4d91e3b83e7cbccaf4a4e2322b873f5.svg @@ -0,0 +1,28 @@ + + + + stop-playback + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/a51b949b03d40faa62ef202a787f76ec.png b/static/assets/a51b949b03d40faa62ef202a787f76ec.png new file mode 100644 index 0000000000000000000000000000000000000000..d4293f2494ae647db9326a564766988af151af2c Binary files /dev/null and b/static/assets/a51b949b03d40faa62ef202a787f76ec.png differ diff --git a/static/assets/a5787bb7364d8131ed49a8f53037d7f4.svg b/static/assets/a5787bb7364d8131ed49a8f53037d7f4.svg new file mode 100644 index 0000000000000000000000000000000000000000..3edd347dd6a7af3e0121fa09578ec3deed95f8cc --- /dev/null +++ b/static/assets/a5787bb7364d8131ed49a8f53037d7f4.svg @@ -0,0 +1,18 @@ + + + + Sound/General/Delete + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/a61fc8393abec3c0d1e813fc01f252ee.mp3 b/static/assets/a61fc8393abec3c0d1e813fc01f252ee.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b680da226e2798e7f98b2d558773095e1bdee7eb Binary files /dev/null and b/static/assets/a61fc8393abec3c0d1e813fc01f252ee.mp3 differ diff --git a/static/assets/a6cebfe99bad7b01f59b85998cbc4628.svg b/static/assets/a6cebfe99bad7b01f59b85998cbc4628.svg new file mode 100644 index 0000000000000000000000000000000000000000..18149bcf5d7fb6687f6d01de42c1fc224b89cd46 --- /dev/null +++ b/static/assets/a6cebfe99bad7b01f59b85998cbc4628.svg @@ -0,0 +1,10 @@ + + + + brush + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/a746db3baa99760ac6d9093990a95bba.svg b/static/assets/a746db3baa99760ac6d9093990a95bba.svg new file mode 100644 index 0000000000000000000000000000000000000000..fe3e4145689e5e0af535bd8e42d6d24e7f87ff38 --- /dev/null +++ b/static/assets/a746db3baa99760ac6d9093990a95bba.svg @@ -0,0 +1,12 @@ + + + + redo + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/a77d7ed07c4715b2b580438d46a567b9.svg b/static/assets/a77d7ed07c4715b2b580438d46a567b9.svg new file mode 100644 index 0000000000000000000000000000000000000000..09d9b260fbbba7e2962d600d58b9b9d29255e27c --- /dev/null +++ b/static/assets/a77d7ed07c4715b2b580438d46a567b9.svg @@ -0,0 +1 @@ +ABCABCABC diff --git a/static/assets/a7c08a472cc8b1c4e0c45ae9b030b414.mp3 b/static/assets/a7c08a472cc8b1c4e0c45ae9b030b414.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f0ea66a585ec62f281219a156336a9fb193fd8e0 Binary files /dev/null and b/static/assets/a7c08a472cc8b1c4e0c45ae9b030b414.mp3 differ diff --git a/static/assets/a80790c977586cc0595b5fe2f0bcb39a.svg b/static/assets/a80790c977586cc0595b5fe2f0bcb39a.svg new file mode 100644 index 0000000000000000000000000000000000000000..0c991f7c6e4cb2e6ce3b85a13e2a84eff50f03f2 --- /dev/null +++ b/static/assets/a80790c977586cc0595b5fe2f0bcb39a.svg @@ -0,0 +1,10 @@ + + + + Next + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/a8c1fa685a05ebc7d9ced4a1fabce2ec.png b/static/assets/a8c1fa685a05ebc7d9ced4a1fabce2ec.png new file mode 100644 index 0000000000000000000000000000000000000000..595e3044ad6db4f32a1fc97c37f41cbc51b69b36 Binary files /dev/null and b/static/assets/a8c1fa685a05ebc7d9ced4a1fabce2ec.png differ diff --git a/static/assets/aaa4a3575852fe11d04f44c4a972ae73.svg b/static/assets/aaa4a3575852fe11d04f44c4a972ae73.svg new file mode 100644 index 0000000000000000000000000000000000000000..e3f82a6fdb679c27301413397fc8838f74bbb9ae --- /dev/null +++ b/static/assets/aaa4a3575852fe11d04f44c4a972ae73.svg @@ -0,0 +1,12 @@ + + + + back-icon + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/ab2c140af0ffba6b515eebc2156742e2.svg b/static/assets/ab2c140af0ffba6b515eebc2156742e2.svg new file mode 100644 index 0000000000000000000000000000000000000000..d8316cdc4bf63b3b5c4f8fe2a062356cea5c14e5 --- /dev/null +++ b/static/assets/ab2c140af0ffba6b515eebc2156742e2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/ac1b57b4a9b09160349eb2d7882ca15f.svg b/static/assets/ac1b57b4a9b09160349eb2d7882ca15f.svg new file mode 100644 index 0000000000000000000000000000000000000000..fac84b5fe52eb5be67089bd6c9c8c95e1b46f05b --- /dev/null +++ b/static/assets/ac1b57b4a9b09160349eb2d7882ca15f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/ac62d5285bf0943dcad9391fa0986fb4.svg b/static/assets/ac62d5285bf0943dcad9391fa0986fb4.svg new file mode 100644 index 0000000000000000000000000000000000000000..c518596f0edba4e80d1c1afc69b3c136ab9f6b32 --- /dev/null +++ b/static/assets/ac62d5285bf0943dcad9391fa0986fb4.svg @@ -0,0 +1,12 @@ + + + + rectangle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/ac6d4216d424b165ba317fe4e997d6da.svg b/static/assets/ac6d4216d424b165ba317fe4e997d6da.svg new file mode 100644 index 0000000000000000000000000000000000000000..42cbf0ef8134c1a9b8337b669a17b64ec9283b86 --- /dev/null +++ b/static/assets/ac6d4216d424b165ba317fe4e997d6da.svg @@ -0,0 +1,10 @@ + + + + all-around-active + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/ac92bfcb2fc35687d1ba5ab6bb733671.svg b/static/assets/ac92bfcb2fc35687d1ba5ab6bb733671.svg new file mode 100644 index 0000000000000000000000000000000000000000..95bf8a1d96aa5b37f3623e2fa5e5219b65532dcc --- /dev/null +++ b/static/assets/ac92bfcb2fc35687d1ba5ab6bb733671.svg @@ -0,0 +1,12 @@ + + + + oval + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/acf8e02623682856899b55f10f66e212.svg b/static/assets/acf8e02623682856899b55f10f66e212.svg new file mode 100644 index 0000000000000000000000000000000000000000..a725b4514ac9594118ca3c76f96f10f97ea0f242 --- /dev/null +++ b/static/assets/acf8e02623682856899b55f10f66e212.svg @@ -0,0 +1,28 @@ + + + + + + + diff --git a/static/assets/ad2841e0f0228e47e911a5b571480f7c.svg b/static/assets/ad2841e0f0228e47e911a5b571480f7c.svg new file mode 100644 index 0000000000000000000000000000000000000000..5e3d9de960a2d0af26803121e2404aca8719fb0b --- /dev/null +++ b/static/assets/ad2841e0f0228e47e911a5b571480f7c.svg @@ -0,0 +1 @@ + diff --git a/static/assets/adaeb8876e88eba49f66fe82f5aed731.svg b/static/assets/adaeb8876e88eba49f66fe82f5aed731.svg new file mode 100644 index 0000000000000000000000000000000000000000..16a4b9ba434296ed5088c433bfce5406ba34dd6b --- /dev/null +++ b/static/assets/adaeb8876e88eba49f66fe82f5aed731.svg @@ -0,0 +1,14 @@ + + + + straight-point + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/static/assets/ae1b9be9ac5a0793b990a0ba5231c662.png b/static/assets/ae1b9be9ac5a0793b990a0ba5231c662.png new file mode 100644 index 0000000000000000000000000000000000000000..7f975d83d1ed4315d1c1d88272301db82390c892 Binary files /dev/null and b/static/assets/ae1b9be9ac5a0793b990a0ba5231c662.png differ diff --git a/static/assets/b14d70e45d588be5106be4ee696dfa3f.png b/static/assets/b14d70e45d588be5106be4ee696dfa3f.png new file mode 100644 index 0000000000000000000000000000000000000000..04d4185c28f4e04271977fe597d7e1096c44bdda Binary files /dev/null and b/static/assets/b14d70e45d588be5106be4ee696dfa3f.png differ diff --git a/static/assets/b2c44c738c9cbc1a99cd6edfd0c2b85b.svg b/static/assets/b2c44c738c9cbc1a99cd6edfd0c2b85b.svg new file mode 100644 index 0000000000000000000000000000000000000000..5afdbef12f8c97329db3896d627c790277d3a141 --- /dev/null +++ b/static/assets/b2c44c738c9cbc1a99cd6edfd0c2b85b.svg @@ -0,0 +1,17 @@ + + + + lounder + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/b370449e927fbc501686cf597511f7fc.svg b/static/assets/b370449e927fbc501686cf597511f7fc.svg new file mode 100644 index 0000000000000000000000000000000000000000..9b872849d62e4a31ca4a383d9ebaf687546d6d68 --- /dev/null +++ b/static/assets/b370449e927fbc501686cf597511f7fc.svg @@ -0,0 +1,15 @@ + + + + fill-vert-gradient-enabled + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/b433ee02a13fa2a12f7f7059f1f6729a.svg b/static/assets/b433ee02a13fa2a12f7f7059f1f6729a.svg new file mode 100644 index 0000000000000000000000000000000000000000..fea09e781b3f88a43750b69f25e6e522846a4466 --- /dev/null +++ b/static/assets/b433ee02a13fa2a12f7f7059f1f6729a.svg @@ -0,0 +1,10 @@ + + + + Tutorials + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/b4c3606f4126d3226d96d31e36fff84d.svg b/static/assets/b4c3606f4126d3226d96d31e36fff84d.svg new file mode 100644 index 0000000000000000000000000000000000000000..b8b5737ba97a4d3b506d08dbed7e85e99bb8c395 --- /dev/null +++ b/static/assets/b4c3606f4126d3226d96d31e36fff84d.svg @@ -0,0 +1,9 @@ + + + + Sound/General/Paste + Created with Sketch. + + + + \ No newline at end of file diff --git a/static/assets/b5257afbe4bcf7953029ddb8f18b24fe.svg b/static/assets/b5257afbe4bcf7953029ddb8f18b24fe.svg new file mode 100644 index 0000000000000000000000000000000000000000..817a2cab9f74df0adfa01c78be6882b9d983d8bc --- /dev/null +++ b/static/assets/b5257afbe4bcf7953029ddb8f18b24fe.svg @@ -0,0 +1,20 @@ + + + + play + Created with Sketch. + + + + + + + + + + + + + + + diff --git a/static/assets/b526c1fdbbcf5e07a2ed065d5bcb7a15.svg b/static/assets/b526c1fdbbcf5e07a2ed065d5bcb7a15.svg new file mode 100644 index 0000000000000000000000000000000000000000..dff5a40af4c08b39dbdb41d347d05a9393afe975 --- /dev/null +++ b/static/assets/b526c1fdbbcf5e07a2ed065d5bcb7a15.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/assets/b52b83f63e8482255d46f40ea454fa01.mp3 b/static/assets/b52b83f63e8482255d46f40ea454fa01.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7b57139bf7fff48e0396e3853d73b6451d624357 Binary files /dev/null and b/static/assets/b52b83f63e8482255d46f40ea454fa01.mp3 differ diff --git a/static/assets/b592c8b4b02de3c7d367ce10efa9d7a6.svg b/static/assets/b592c8b4b02de3c7d367ce10efa9d7a6.svg new file mode 100644 index 0000000000000000000000000000000000000000..847a903e90c0232ff04c93f518505b19fe158048 --- /dev/null +++ b/static/assets/b592c8b4b02de3c7d367ce10efa9d7a6.svg @@ -0,0 +1,12 @@ + + + + text + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/b6162ffbfe48d4b6c67f0b469f1615ae.png b/static/assets/b6162ffbfe48d4b6c67f0b469f1615ae.png new file mode 100644 index 0000000000000000000000000000000000000000..8f63ade37587318aa72e0ccf8eb822ee273dd130 Binary files /dev/null and b/static/assets/b6162ffbfe48d4b6c67f0b469f1615ae.png differ diff --git a/static/assets/b6a8e4a96ffcd83154ad2c5cbcb52751.mp3 b/static/assets/b6a8e4a96ffcd83154ad2c5cbcb52751.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1970b60cbff5ad8106e16bf69d814f1c683b43c0 Binary files /dev/null and b/static/assets/b6a8e4a96ffcd83154ad2c5cbcb52751.mp3 differ diff --git a/static/assets/b700cf6f9c368ce49851d287ddd3b63c.mp3 b/static/assets/b700cf6f9c368ce49851d287ddd3b63c.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9e9e62b5599986b2005b0595bb8c56d0c2748994 Binary files /dev/null and b/static/assets/b700cf6f9c368ce49851d287ddd3b63c.mp3 differ diff --git a/static/assets/b987c9e2c37b17bd7c97f1fa47257d7e.svg b/static/assets/b987c9e2c37b17bd7c97f1fa47257d7e.svg new file mode 100644 index 0000000000000000000000000000000000000000..551f412861dc959f0278605544302781b7ac306b --- /dev/null +++ b/static/assets/b987c9e2c37b17bd7c97f1fa47257d7e.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/bacc13779ca01580b89f39dd2118c22a.mp3 b/static/assets/bacc13779ca01580b89f39dd2118c22a.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..169df684f790953e2d7e7cd80c508f72793efbc5 Binary files /dev/null and b/static/assets/bacc13779ca01580b89f39dd2118c22a.mp3 differ diff --git a/static/assets/bb0b18c664cbbb05be54c26055908e95.svg b/static/assets/bb0b18c664cbbb05be54c26055908e95.svg new file mode 100644 index 0000000000000000000000000000000000000000..98bb36cd166c284e36ad7694efa7d361e3f953a5 --- /dev/null +++ b/static/assets/bb0b18c664cbbb05be54c26055908e95.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/bb59f04e7f0aabe8e142ac1607a03dd6.otf b/static/assets/bb59f04e7f0aabe8e142ac1607a03dd6.otf new file mode 100644 index 0000000000000000000000000000000000000000..6257fcede9ec250fb7f88b7ab66b48f4d35ffe63 Binary files /dev/null and b/static/assets/bb59f04e7f0aabe8e142ac1607a03dd6.otf differ diff --git a/static/assets/bbbd98ae6a34eac772e34a57aaa5f977.svg b/static/assets/bbbd98ae6a34eac772e34a57aaa5f977.svg new file mode 100644 index 0000000000000000000000000000000000000000..2b52a0d5d09684056643fb04aec7c80967569c95 --- /dev/null +++ b/static/assets/bbbd98ae6a34eac772e34a57aaa5f977.svg @@ -0,0 +1,17 @@ + + + + top-block + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/bc45b073cd2fc0c2265374bdb4e05d67.svg b/static/assets/bc45b073cd2fc0c2265374bdb4e05d67.svg new file mode 100644 index 0000000000000000000000000000000000000000..d506e13b00c9539064609ecc74bec1c7b05f34f4 --- /dev/null +++ b/static/assets/bc45b073cd2fc0c2265374bdb4e05d67.svg @@ -0,0 +1,9 @@ + + + + Alerts/Check + Created with Sketch. + + + + \ No newline at end of file diff --git a/static/assets/bd055c3853854218f060871e694b16f7.svg b/static/assets/bd055c3853854218f060871e694b16f7.svg new file mode 100644 index 0000000000000000000000000000000000000000..0f64c426f86c92acd873d7ee47ca51facf8c3c1c --- /dev/null +++ b/static/assets/bd055c3853854218f060871e694b16f7.svg @@ -0,0 +1 @@ + diff --git a/static/assets/bd16b79cacee7f23835efba88ed4aa67.png b/static/assets/bd16b79cacee7f23835efba88ed4aa67.png new file mode 100644 index 0000000000000000000000000000000000000000..ae6f63f10ed4ee89d9c8f8f5640e24f97c3921b6 Binary files /dev/null and b/static/assets/bd16b79cacee7f23835efba88ed4aa67.png differ diff --git a/static/assets/bd6d382729ecbd23c5181cf2b327072f.svg b/static/assets/bd6d382729ecbd23c5181cf2b327072f.svg new file mode 100644 index 0000000000000000000000000000000000000000..5285be47e645fb7be15819ad68f200bae6a94dd6 --- /dev/null +++ b/static/assets/bd6d382729ecbd23c5181cf2b327072f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/bf2e5bd090012d68560b888d44678efc.svg b/static/assets/bf2e5bd090012d68560b888d44678efc.svg new file mode 100644 index 0000000000000000000000000000000000000000..97a9467d9b8e00f8be702706fc988c6fd5a84e88 --- /dev/null +++ b/static/assets/bf2e5bd090012d68560b888d44678efc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/bf3ee9d7d91a231cde773f88f6799425.png b/static/assets/bf3ee9d7d91a231cde773f88f6799425.png new file mode 100644 index 0000000000000000000000000000000000000000..0546b015c615fcb41bbd9f14770c1ba913b2562a Binary files /dev/null and b/static/assets/bf3ee9d7d91a231cde773f88f6799425.png differ diff --git a/static/assets/c088896fb05dc466b45ecaa1d5c4d007.svg b/static/assets/c088896fb05dc466b45ecaa1d5c4d007.svg new file mode 100644 index 0000000000000000000000000000000000000000..97fb2c6362510904afe3a1dd9fecc0b73bc6760f --- /dev/null +++ b/static/assets/c088896fb05dc466b45ecaa1d5c4d007.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/c296552f9440b25b8225da38a14d9488.png b/static/assets/c296552f9440b25b8225da38a14d9488.png new file mode 100644 index 0000000000000000000000000000000000000000..44eb81c209b4fc245e2653beff88e786059da351 Binary files /dev/null and b/static/assets/c296552f9440b25b8225da38a14d9488.png differ diff --git a/static/assets/c304e6cc2ad622167b6ef46e30cc9423.png b/static/assets/c304e6cc2ad622167b6ef46e30cc9423.png new file mode 100644 index 0000000000000000000000000000000000000000..a0b653b4b54d4d73e15463ecde654cd026b427a7 Binary files /dev/null and b/static/assets/c304e6cc2ad622167b6ef46e30cc9423.png differ diff --git a/static/assets/c30d6a0e73cf38ad6ea7f5e4fe0428a3.png b/static/assets/c30d6a0e73cf38ad6ea7f5e4fe0428a3.png new file mode 100644 index 0000000000000000000000000000000000000000..8acd35bc13e7f9a59ce0697c758cdc8abf7d305e Binary files /dev/null and b/static/assets/c30d6a0e73cf38ad6ea7f5e4fe0428a3.png differ diff --git a/static/assets/c36dd943607003a3229aca77b49d32de.mp3 b/static/assets/c36dd943607003a3229aca77b49d32de.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6a7a9e99e9826955cdd38633defd14888cd2b479 Binary files /dev/null and b/static/assets/c36dd943607003a3229aca77b49d32de.mp3 differ diff --git a/static/assets/c44ce3bfa465281e765f197d6c3ee7ea.mp3 b/static/assets/c44ce3bfa465281e765f197d6c3ee7ea.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7a961d0dfe2c257ca55ee7f1ca63a869a10e5c14 Binary files /dev/null and b/static/assets/c44ce3bfa465281e765f197d6c3ee7ea.mp3 differ diff --git a/static/assets/c4c75827d7f30081f493963fadec60a1.svg b/static/assets/c4c75827d7f30081f493963fadec60a1.svg new file mode 100644 index 0000000000000000000000000000000000000000..923ff17d1a7759dc649ca7727b2438a6a7ecee9d --- /dev/null +++ b/static/assets/c4c75827d7f30081f493963fadec60a1.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/c51f86f9bcf8f37fc49331cbb5630c94.png b/static/assets/c51f86f9bcf8f37fc49331cbb5630c94.png new file mode 100644 index 0000000000000000000000000000000000000000..66f2e56d11a0c611c261f51a7e95803342a32baa Binary files /dev/null and b/static/assets/c51f86f9bcf8f37fc49331cbb5630c94.png differ diff --git a/static/assets/c60f3f06c5fb4d49df7236aeb2f31a9d.png b/static/assets/c60f3f06c5fb4d49df7236aeb2f31a9d.png new file mode 100644 index 0000000000000000000000000000000000000000..2c3b1a12bffe091171ebdf3053f1bb1e148e11ab Binary files /dev/null and b/static/assets/c60f3f06c5fb4d49df7236aeb2f31a9d.png differ diff --git a/static/assets/c64657eab9e2899098a8e0d04f560d1f.svg b/static/assets/c64657eab9e2899098a8e0d04f560d1f.svg new file mode 100644 index 0000000000000000000000000000000000000000..16c43788e5b83f7925b244f816337843490ef598 --- /dev/null +++ b/static/assets/c64657eab9e2899098a8e0d04f560d1f.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/c6778106d615504de22e9254f1729577.svg b/static/assets/c6778106d615504de22e9254f1729577.svg new file mode 100644 index 0000000000000000000000000000000000000000..1562ddfb95807ccab0883bbc2ed7591b86b3d86f --- /dev/null +++ b/static/assets/c6778106d615504de22e9254f1729577.svg @@ -0,0 +1,15 @@ + + + + show-icon-active + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/c79988bb17fdba37fe2d1ee3eacf9f5f.png b/static/assets/c79988bb17fdba37fe2d1ee3eacf9f5f.png new file mode 100644 index 0000000000000000000000000000000000000000..aac9513c1cc3a282abf09810f0602c15392ee63a Binary files /dev/null and b/static/assets/c79988bb17fdba37fe2d1ee3eacf9f5f.png differ diff --git a/static/assets/c7ffd288176b935f835311512a224d4b.svg b/static/assets/c7ffd288176b935f835311512a224d4b.svg new file mode 100644 index 0000000000000000000000000000000000000000..1ce14e3fcf45cf560e46741ba6357204716d99c6 --- /dev/null +++ b/static/assets/c7ffd288176b935f835311512a224d4b.svg @@ -0,0 +1,12 @@ + + + + Extensions/Software/Text-to-Speech-Block + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/c8215bcfbb4dc9000bb0da3947cdb523.png b/static/assets/c8215bcfbb4dc9000bb0da3947cdb523.png new file mode 100644 index 0000000000000000000000000000000000000000..d8768cad22a79af6c46ea77ef50cbc9c9da8c87d Binary files /dev/null and b/static/assets/c8215bcfbb4dc9000bb0da3947cdb523.png differ diff --git a/static/assets/c8455deb7c37c2d4c88e94147d12afb2.svg b/static/assets/c8455deb7c37c2d4c88e94147d12afb2.svg new file mode 100644 index 0000000000000000000000000000000000000000..808f4645318fa5faacaaa2065838c2bdb1de7970 --- /dev/null +++ b/static/assets/c8455deb7c37c2d4c88e94147d12afb2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/assets/c846a442121113b1d04f6b9d50912038.svg b/static/assets/c846a442121113b1d04f6b9d50912038.svg new file mode 100644 index 0000000000000000000000000000000000000000..784e1d1cf71da6b178a62bc37e50ab8cb6341cf2 --- /dev/null +++ b/static/assets/c846a442121113b1d04f6b9d50912038.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/c90f59f422ddd73d2d58569f872b36d0.svg b/static/assets/c90f59f422ddd73d2d58569f872b36d0.svg new file mode 100644 index 0000000000000000000000000000000000000000..76aa17ef3579e720869dd0da8b3b7810859aae2e --- /dev/null +++ b/static/assets/c90f59f422ddd73d2d58569f872b36d0.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/assets/c9f4f655230d224c33ead125216199db.svg b/static/assets/c9f4f655230d224c33ead125216199db.svg new file mode 100644 index 0000000000000000000000000000000000000000..f7bb50499d56db727afeba125cdb9cb91780a560 --- /dev/null +++ b/static/assets/c9f4f655230d224c33ead125216199db.svg @@ -0,0 +1,14 @@ + + + + swap + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/static/assets/cb666b99d3528f91b52f985dfb102afa.svg b/static/assets/cb666b99d3528f91b52f985dfb102afa.svg new file mode 100644 index 0000000000000000000000000000000000000000..9e5509e76a2296c93988ef8138eb61be814fb21a --- /dev/null +++ b/static/assets/cb666b99d3528f91b52f985dfb102afa.svg @@ -0,0 +1 @@ +icon--add \ No newline at end of file diff --git a/static/assets/cc4d68fe9d6a77c7f35f9d5461b60967.png b/static/assets/cc4d68fe9d6a77c7f35f9d5461b60967.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c34cff1b6c89cc0d21a9b20a993fa0ea9e081f Binary files /dev/null and b/static/assets/cc4d68fe9d6a77c7f35f9d5461b60967.png differ diff --git a/static/assets/ccf5cd43b7f5661f8141f879e4a015bb.png b/static/assets/ccf5cd43b7f5661f8141f879e4a015bb.png new file mode 100644 index 0000000000000000000000000000000000000000..782f1bbb4340ff9be9e6e3ae05942f058cf4894d Binary files /dev/null and b/static/assets/ccf5cd43b7f5661f8141f879e4a015bb.png differ diff --git a/static/assets/cd2fa6465953012247b14e89f4931cf9.svg b/static/assets/cd2fa6465953012247b14e89f4931cf9.svg new file mode 100644 index 0000000000000000000000000000000000000000..66905114d8f24ca8b36355e2bfe17631694222bc --- /dev/null +++ b/static/assets/cd2fa6465953012247b14e89f4931cf9.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/ce5820b006d753e4133f46ae776f4d96.svg b/static/assets/ce5820b006d753e4133f46ae776f4d96.svg new file mode 100644 index 0000000000000000000000000000000000000000..b397068c448eeabc04d4245e1f5cdd210b72df5c --- /dev/null +++ b/static/assets/ce5820b006d753e4133f46ae776f4d96.svg @@ -0,0 +1,17 @@ + + + + bottom-block + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/cf21e9b36c0dfd5debc399d6fbf5d2c9.svg b/static/assets/cf21e9b36c0dfd5debc399d6fbf5d2c9.svg new file mode 100644 index 0000000000000000000000000000000000000000..ce214bb6e8cb90f164a858a6932c3b61dcc98c7d --- /dev/null +++ b/static/assets/cf21e9b36c0dfd5debc399d6fbf5d2c9.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/d0285f1906636f21d1149a4797b978dc.svg b/static/assets/d0285f1906636f21d1149a4797b978dc.svg new file mode 100644 index 0000000000000000000000000000000000000000..23450463087d4fb0813b700f7e1538b9ddad1089 --- /dev/null +++ b/static/assets/d0285f1906636f21d1149a4797b978dc.svg @@ -0,0 +1,10 @@ + + + + Sounds V1 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/d37e41b89c301f1ee2c0e911b5c1d4d2.svg b/static/assets/d37e41b89c301f1ee2c0e911b5c1d4d2.svg new file mode 100644 index 0000000000000000000000000000000000000000..11e623f8fd8905435c7d78a93d3eed4475dc7e1e --- /dev/null +++ b/static/assets/d37e41b89c301f1ee2c0e911b5c1d4d2.svg @@ -0,0 +1,20 @@ + + + + flip-horizontal + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/d434438e5d193118e4aad3a846e1c7ba.mp3 b/static/assets/d434438e5d193118e4aad3a846e1c7ba.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..589c65786785ba934243cb6d3008597ac8f88fa6 Binary files /dev/null and b/static/assets/d434438e5d193118e4aad3a846e1c7ba.mp3 differ diff --git a/static/assets/d4b3ce804680eb7d58f6accc7436e807.mp3 b/static/assets/d4b3ce804680eb7d58f6accc7436e807.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..27451fc6a1914cb91939644c065d0c098a54e4af Binary files /dev/null and b/static/assets/d4b3ce804680eb7d58f6accc7436e807.mp3 differ diff --git a/static/assets/d61429ad96a25ec2917ebc77d900aae0.svg b/static/assets/d61429ad96a25ec2917ebc77d900aae0.svg new file mode 100644 index 0000000000000000000000000000000000000000..a8062f30ef0859313a11c5586455e33439158dc0 --- /dev/null +++ b/static/assets/d61429ad96a25ec2917ebc77d900aae0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/d6214ab9abf22f5d5dee060cb72f637f.png b/static/assets/d6214ab9abf22f5d5dee060cb72f637f.png new file mode 100644 index 0000000000000000000000000000000000000000..8017a7a14b4abe2092c4f1aa45b31f28060565a8 Binary files /dev/null and b/static/assets/d6214ab9abf22f5d5dee060cb72f637f.png differ diff --git a/static/assets/d6f130fb79e78e4dd351fd930e742bcc.png b/static/assets/d6f130fb79e78e4dd351fd930e742bcc.png new file mode 100644 index 0000000000000000000000000000000000000000..3ef3646a876f1900f774111f4c632f2d026e21bc Binary files /dev/null and b/static/assets/d6f130fb79e78e4dd351fd930e742bcc.png differ diff --git a/static/assets/d71c0379472f709318ef81ff0dccf7d5.svg b/static/assets/d71c0379472f709318ef81ff0dccf7d5.svg new file mode 100644 index 0000000000000000000000000000000000000000..b3a1e5974b0be36149033356d258304ae35d27d2 --- /dev/null +++ b/static/assets/d71c0379472f709318ef81ff0dccf7d5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/d72b98474fc83d6268886779339e242e.mp3 b/static/assets/d72b98474fc83d6268886779339e242e.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..adb7052b715745b0f68533236af0d804b127ed74 Binary files /dev/null and b/static/assets/d72b98474fc83d6268886779339e242e.mp3 differ diff --git a/static/assets/d79bf4bbb8df5542ffef65d9e61b37ed.svg b/static/assets/d79bf4bbb8df5542ffef65d9e61b37ed.svg new file mode 100644 index 0000000000000000000000000000000000000000..a4fcdc2e52f9739784da4255a4db7bfbd9adf4d6 --- /dev/null +++ b/static/assets/d79bf4bbb8df5542ffef65d9e61b37ed.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/d84cdb7f4b9567882511ab47f63e342b.svg b/static/assets/d84cdb7f4b9567882511ab47f63e342b.svg new file mode 100644 index 0000000000000000000000000000000000000000..9a6cd489cc401080acc7138accf5d2043bd455d7 --- /dev/null +++ b/static/assets/d84cdb7f4b9567882511ab47f63e342b.svg @@ -0,0 +1,19 @@ + + + + oval-outlined + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/d889a872f3b0985b28fa872764172ef1.svg b/static/assets/d889a872f3b0985b28fa872764172ef1.svg new file mode 100644 index 0000000000000000000000000000000000000000..9494fccb88bd08afcba8f7d0d7cb6c1f8eba7ac0 --- /dev/null +++ b/static/assets/d889a872f3b0985b28fa872764172ef1.svg @@ -0,0 +1,27 @@ + + + + play + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/d8cbb86bdb5ce2ba9f2ed0975f51231e.svg b/static/assets/d8cbb86bdb5ce2ba9f2ed0975f51231e.svg new file mode 100644 index 0000000000000000000000000000000000000000..fc28108641bd57cb1068f9603d6e0c10639aca88 --- /dev/null +++ b/static/assets/d8cbb86bdb5ce2ba9f2ed0975f51231e.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/assets/d92e74438d72c2223692825df66e026e.svg b/static/assets/d92e74438d72c2223692825df66e026e.svg new file mode 100644 index 0000000000000000000000000000000000000000..6b0f5d68f2b0d8bb6abe98968994dde03604ec86 --- /dev/null +++ b/static/assets/d92e74438d72c2223692825df66e026e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/d93fb1224d372792aadc4706e9b45858.svg b/static/assets/d93fb1224d372792aadc4706e9b45858.svg new file mode 100644 index 0000000000000000000000000000000000000000..31b62841122b48428b8764ec8b18c7f817b8c0f5 --- /dev/null +++ b/static/assets/d93fb1224d372792aadc4706e9b45858.svg @@ -0,0 +1,12 @@ + + + + redo + Created with Sketch. + + + + + + + diff --git a/static/assets/da1a6ebcd442e9d867b31fb21ce6a289.mp3 b/static/assets/da1a6ebcd442e9d867b31fb21ce6a289.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..ebdd5e0e6730e38209519074f3d9decdc05b70cf Binary files /dev/null and b/static/assets/da1a6ebcd442e9d867b31fb21ce6a289.mp3 differ diff --git a/static/assets/da3126c6a70c4ef84192c33f99996354.mp3 b/static/assets/da3126c6a70c4ef84192c33f99996354.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0c90c3e32e8ff2bbbe59c150b0ab055c2f2e841c Binary files /dev/null and b/static/assets/da3126c6a70c4ef84192c33f99996354.mp3 differ diff --git a/static/assets/db445f7d7b15b698deb8a08c31697f87.svg b/static/assets/db445f7d7b15b698deb8a08c31697f87.svg new file mode 100644 index 0000000000000000000000000000000000000000..d3d1824916ca5f9f9c32c6f4eb1189feae7a6eb2 --- /dev/null +++ b/static/assets/db445f7d7b15b698deb8a08c31697f87.svg @@ -0,0 +1,12 @@ + + + + dropdown-caret + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/dba629c24296756d68a135988fe96011.svg b/static/assets/dba629c24296756d68a135988fe96011.svg new file mode 100644 index 0000000000000000000000000000000000000000..66d8040c7e4f768b5b3a6e5e4185a5508a1143e7 --- /dev/null +++ b/static/assets/dba629c24296756d68a135988fe96011.svg @@ -0,0 +1,13 @@ + + + + + +zoom-reset + + + + + diff --git a/static/assets/dc97849515ceed1012a3b89210a950fa.png b/static/assets/dc97849515ceed1012a3b89210a950fa.png new file mode 100644 index 0000000000000000000000000000000000000000..c344523ee2bc38e00f5da84ed1f49f2702e4f55b Binary files /dev/null and b/static/assets/dc97849515ceed1012a3b89210a950fa.png differ diff --git a/static/assets/dd55f4c6c20f5d25e520b6f5bfb090c5.svg b/static/assets/dd55f4c6c20f5d25e520b6f5bfb090c5.svg new file mode 100644 index 0000000000000000000000000000000000000000..bf4a3e450de8aa70b034203d69824860d568f1c0 --- /dev/null +++ b/static/assets/dd55f4c6c20f5d25e520b6f5bfb090c5.svg @@ -0,0 +1,17 @@ + + + + un-fullscreen + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/dd70a6d9adb5f52d0cbd0115887691eb.png b/static/assets/dd70a6d9adb5f52d0cbd0115887691eb.png new file mode 100644 index 0000000000000000000000000000000000000000..6457001bfd75439b6ecefd1def8f45c01091fbff Binary files /dev/null and b/static/assets/dd70a6d9adb5f52d0cbd0115887691eb.png differ diff --git a/static/assets/dd98971c2c185caf86144b6b5234d0fa.svg b/static/assets/dd98971c2c185caf86144b6b5234d0fa.svg new file mode 100644 index 0000000000000000000000000000000000000000..b74601fac9d4aaaaf53b50a26411b86949c2e5f3 --- /dev/null +++ b/static/assets/dd98971c2c185caf86144b6b5234d0fa.svg @@ -0,0 +1,14 @@ + + + + Reload + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/static/assets/df6a71244d4727d19c5a78d71677d2a6.svg b/static/assets/df6a71244d4727d19c5a78d71677d2a6.svg new file mode 100644 index 0000000000000000000000000000000000000000..7c4f45df771c93f5487fb64479c751600fd001ba --- /dev/null +++ b/static/assets/df6a71244d4727d19c5a78d71677d2a6.svg @@ -0,0 +1,27 @@ + + + + play + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/dfe35552790fb5ff38c78a43f5e62f30.svg b/static/assets/dfe35552790fb5ff38c78a43f5e62f30.svg new file mode 100644 index 0000000000000000000000000000000000000000..47f317dcf3175f45f263101fb50bf6e60c4c6406 --- /dev/null +++ b/static/assets/dfe35552790fb5ff38c78a43f5e62f30.svg @@ -0,0 +1,22 @@ + + + + Extensions/Connection/Bluetooth + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/e008ee0cb1202de1137823150da1644a.svg b/static/assets/e008ee0cb1202de1137823150da1644a.svg new file mode 100644 index 0000000000000000000000000000000000000000..91a3241fcaf7effc84fcd439184a8e2bdb42455d --- /dev/null +++ b/static/assets/e008ee0cb1202de1137823150da1644a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/e1249124e702a974df36355af6aa2385.svg b/static/assets/e1249124e702a974df36355af6aa2385.svg new file mode 100644 index 0000000000000000000000000000000000000000..4fb2fa1876a977c0df285e7fc8f656097592f9a1 --- /dev/null +++ b/static/assets/e1249124e702a974df36355af6aa2385.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/e21225ab4b675bc61eed30cfb510c288.svg b/static/assets/e21225ab4b675bc61eed30cfb510c288.svg new file mode 100644 index 0000000000000000000000000000000000000000..6cdd71d4d7703e05efd0dcda3c1f366173b5fb2d --- /dev/null +++ b/static/assets/e21225ab4b675bc61eed30cfb510c288.svg @@ -0,0 +1,9 @@ + + + + Sound/Effects/Mute + Created with Sketch. + + + + diff --git a/static/assets/e27f7cdf42df8b768345ae83fecffe4b.mp3 b/static/assets/e27f7cdf42df8b768345ae83fecffe4b.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4f00cf119d12e454bf113d17d30f8a6e354eea1c Binary files /dev/null and b/static/assets/e27f7cdf42df8b768345ae83fecffe4b.mp3 differ diff --git a/static/assets/e28b110fa5eef35531fa271a3a7b6314.svg b/static/assets/e28b110fa5eef35531fa271a3a7b6314.svg new file mode 100644 index 0000000000000000000000000000000000000000..ad97d149f2c297a17e9121206513bd02bb17716b --- /dev/null +++ b/static/assets/e28b110fa5eef35531fa271a3a7b6314.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/e45e0626c5e444a55bb3b6380041a879.svg b/static/assets/e45e0626c5e444a55bb3b6380041a879.svg new file mode 100644 index 0000000000000000000000000000000000000000..8a20f4ca244cc990a11b0635eb8d0076cdaf69eb --- /dev/null +++ b/static/assets/e45e0626c5e444a55bb3b6380041a879.svg @@ -0,0 +1,20 @@ + + + + send-back + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/e48e8bc4ca2913e19da20f085e9adbe9.svg b/static/assets/e48e8bc4ca2913e19da20f085e9adbe9.svg new file mode 100644 index 0000000000000000000000000000000000000000..b16bb6e4b2842119616ae946eb4497a72ebac672 --- /dev/null +++ b/static/assets/e48e8bc4ca2913e19da20f085e9adbe9.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/assets/e53ff4a140871927b2d5be4f5cdb2c79.svg b/static/assets/e53ff4a140871927b2d5be4f5cdb2c79.svg new file mode 100644 index 0000000000000000000000000000000000000000..56ab603e6b8c378cf50d94403d07ebd0406e8a14 --- /dev/null +++ b/static/assets/e53ff4a140871927b2d5be4f5cdb2c79.svg @@ -0,0 +1,12 @@ + + + + eraser + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/e587d9d7e9a2f1f28041ba5c15db7a40.svg b/static/assets/e587d9d7e9a2f1f28041ba5c15db7a40.svg new file mode 100644 index 0000000000000000000000000000000000000000..57337d959c121a7763f12ce8f80798d2f2527e04 --- /dev/null +++ b/static/assets/e587d9d7e9a2f1f28041ba5c15db7a40.svg @@ -0,0 +1,12 @@ + + + + file-upload + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/e6180253665b8248f685c6d96881f75b.mp3 b/static/assets/e6180253665b8248f685c6d96881f75b.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0189b3effe290f8e5e4ff5a068796407859e66c2 Binary files /dev/null and b/static/assets/e6180253665b8248f685c6d96881f75b.mp3 differ diff --git a/static/assets/e6f716edc49c30d8e46444093f2c113a.svg b/static/assets/e6f716edc49c30d8e46444093f2c113a.svg new file mode 100644 index 0000000000000000000000000000000000000000..acf27689cdb0a13275df45caed9d6fb841eefdcb --- /dev/null +++ b/static/assets/e6f716edc49c30d8e46444093f2c113a.svg @@ -0,0 +1,17 @@ + + + + reshape + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/e8cd6294973f94c475ed746e4899fa33.svg b/static/assets/e8cd6294973f94c475ed746e4899fa33.svg new file mode 100644 index 0000000000000000000000000000000000000000..e37534e01bfe2067ee4ae7a6f313c722238c73dd --- /dev/null +++ b/static/assets/e8cd6294973f94c475ed746e4899fa33.svg @@ -0,0 +1 @@ + diff --git a/static/assets/e997e36ade408c75ef4424b928e10846.svg b/static/assets/e997e36ade408c75ef4424b928e10846.svg new file mode 100644 index 0000000000000000000000000000000000000000..41538348acafaa6ea95f010666d42b8ac9d95e6c --- /dev/null +++ b/static/assets/e997e36ade408c75ef4424b928e10846.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/eb64e706eb7a3b324ba50d3279a980b1.ttf b/static/assets/eb64e706eb7a3b324ba50d3279a980b1.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3673847d33c108bd15189a9a62ca94235b156ce6 --- /dev/null +++ b/static/assets/eb64e706eb7a3b324ba50d3279a980b1.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c889c3f8d169631386a297eae8b5bdefbf8d06aa9f4f325faec31b9b5f38eeb5 +size 208776 diff --git a/static/assets/ecb1cbda3b9c4f29ab971734d97e3faf.mp3 b/static/assets/ecb1cbda3b9c4f29ab971734d97e3faf.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f8558dee44d1dee57e26275ff68b8524d610b91a Binary files /dev/null and b/static/assets/ecb1cbda3b9c4f29ab971734d97e3faf.mp3 differ diff --git a/static/assets/ed2a96fbdb476efe419246982e357121.mp3 b/static/assets/ed2a96fbdb476efe419246982e357121.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..95c289ba3e421e368ec8ec03551b282771eb52c5 Binary files /dev/null and b/static/assets/ed2a96fbdb476efe419246982e357121.mp3 differ diff --git a/static/assets/ed523e83c862293741568a89219e5dcf.svg b/static/assets/ed523e83c862293741568a89219e5dcf.svg new file mode 100644 index 0000000000000000000000000000000000000000..044e91a8a9aa7434b3cbe6b0161b73b6ac6da267 --- /dev/null +++ b/static/assets/ed523e83c862293741568a89219e5dcf.svg @@ -0,0 +1,18 @@ + + + + Sound/General/Trim + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/edd84717633475a8d3db34087123314a.png b/static/assets/edd84717633475a8d3db34087123314a.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa950316d54063b5082f0ffc491efd4cdd80328 Binary files /dev/null and b/static/assets/edd84717633475a8d3db34087123314a.png differ diff --git a/static/assets/ee54d776d2cda9a3c537ac7e8f144037.svg b/static/assets/ee54d776d2cda9a3c537ac7e8f144037.svg new file mode 100644 index 0000000000000000000000000000000000000000..7bd66335514915b21fae3572429fb779d530254a --- /dev/null +++ b/static/assets/ee54d776d2cda9a3c537ac7e8f144037.svg @@ -0,0 +1,20 @@ + + + + Icon + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/f011f09e649e804c4c0c8275a7d1ba5b.png b/static/assets/f011f09e649e804c4c0c8275a7d1ba5b.png new file mode 100644 index 0000000000000000000000000000000000000000..f512fb9ccfc8940deae783d5cd0f1e833907ea55 Binary files /dev/null and b/static/assets/f011f09e649e804c4c0c8275a7d1ba5b.png differ diff --git a/static/assets/f04f7b0f673ced51710157ce16e49276.png b/static/assets/f04f7b0f673ced51710157ce16e49276.png new file mode 100644 index 0000000000000000000000000000000000000000..f9060c9cd46899466b8f9930560af80278ec0fee Binary files /dev/null and b/static/assets/f04f7b0f673ced51710157ce16e49276.png differ diff --git a/static/assets/f0fc12e672912247cc20d34ea452b517.svg b/static/assets/f0fc12e672912247cc20d34ea452b517.svg new file mode 100644 index 0000000000000000000000000000000000000000..61392fe37dc54c7f81964f9f19f73d3a433d384d --- /dev/null +++ b/static/assets/f0fc12e672912247cc20d34ea452b517.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/assets/f1207802424428612503584b5258902c.png b/static/assets/f1207802424428612503584b5258902c.png new file mode 100644 index 0000000000000000000000000000000000000000..e7dd1263cb2ea5a7b8612a26b13180b826917efa Binary files /dev/null and b/static/assets/f1207802424428612503584b5258902c.png differ diff --git a/static/assets/f22d5ea0ef6a46b2a4a174fed722c396.svg b/static/assets/f22d5ea0ef6a46b2a4a174fed722c396.svg new file mode 100644 index 0000000000000000000000000000000000000000..08f3da05676d35e350ab8c190d3f4beed1072061 --- /dev/null +++ b/static/assets/f22d5ea0ef6a46b2a4a174fed722c396.svg @@ -0,0 +1,9 @@ + + + + Sound/Effects/Fade-out + Created with Sketch. + + + + \ No newline at end of file diff --git a/static/assets/f2457825850317e66ef2128504613c30.svg b/static/assets/f2457825850317e66ef2128504613c30.svg new file mode 100644 index 0000000000000000000000000000000000000000..64fd1665fc03cb694262fc1a67b1adc958e29f4b --- /dev/null +++ b/static/assets/f2457825850317e66ef2128504613c30.svg @@ -0,0 +1,12 @@ + + + + turbo-bolt-icon + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/f28b1ecd6fccd6218a837c14b1109da7.mp3 b/static/assets/f28b1ecd6fccd6218a837c14b1109da7.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a5b55f522f628c09360473ca0429a1a41b3331c4 Binary files /dev/null and b/static/assets/f28b1ecd6fccd6218a837c14b1109da7.mp3 differ diff --git a/static/assets/f2b55dc8ec1ae9e4a5c72088a185dad2.svg b/static/assets/f2b55dc8ec1ae9e4a5c72088a185dad2.svg new file mode 100644 index 0000000000000000000000000000000000000000..4900230d9de45b9aad34903e0ebef80c0d940550 --- /dev/null +++ b/static/assets/f2b55dc8ec1ae9e4a5c72088a185dad2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/f33541f52553e00993de696ed1233229.png b/static/assets/f33541f52553e00993de696ed1233229.png new file mode 100644 index 0000000000000000000000000000000000000000..dab45ea3563b6988d0c933f80308e5ffb28afd57 Binary files /dev/null and b/static/assets/f33541f52553e00993de696ed1233229.png differ diff --git a/static/assets/f382f43d667b784d1bcd8cfe7aa6fff0.mp3 b/static/assets/f382f43d667b784d1bcd8cfe7aa6fff0.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d8ff9f5ce0544eb931146252567ae17b7911a390 Binary files /dev/null and b/static/assets/f382f43d667b784d1bcd8cfe7aa6fff0.mp3 differ diff --git a/static/assets/f3d2cc01ffb4aaea4b4e3b50e35fdf73.png b/static/assets/f3d2cc01ffb4aaea4b4e3b50e35fdf73.png new file mode 100644 index 0000000000000000000000000000000000000000..0e9dbac9395f944bbef065486f01bfb2359571a5 Binary files /dev/null and b/static/assets/f3d2cc01ffb4aaea4b4e3b50e35fdf73.png differ diff --git a/static/assets/f40501ed87782097b1a4eec8747eb84a.png b/static/assets/f40501ed87782097b1a4eec8747eb84a.png new file mode 100644 index 0000000000000000000000000000000000000000..f18565023f59248c45c321cc7d3b9f13ea600799 Binary files /dev/null and b/static/assets/f40501ed87782097b1a4eec8747eb84a.png differ diff --git a/static/assets/f6c7e603df1d93a09e434cd34256361b.png b/static/assets/f6c7e603df1d93a09e434cd34256361b.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2447c7c4d2535fe3e0196c780552111750ea38 Binary files /dev/null and b/static/assets/f6c7e603df1d93a09e434cd34256361b.png differ diff --git a/static/assets/f87904843f21a05464c4acc3ec4d368d.png b/static/assets/f87904843f21a05464c4acc3ec4d368d.png new file mode 100644 index 0000000000000000000000000000000000000000..fbfc5c9d6623ea7aef040d9fe52e96f64333b215 Binary files /dev/null and b/static/assets/f87904843f21a05464c4acc3ec4d368d.png differ diff --git a/static/assets/f8d8b9d9f1aa45900b786980418219b1.mp3 b/static/assets/f8d8b9d9f1aa45900b786980418219b1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c7757c932b951d636278aac249344ac5d4b609d8 Binary files /dev/null and b/static/assets/f8d8b9d9f1aa45900b786980418219b1.mp3 differ diff --git a/static/assets/f8ff5dbef05bc3337cd3660fb956cffa.svg b/static/assets/f8ff5dbef05bc3337cd3660fb956cffa.svg new file mode 100644 index 0000000000000000000000000000000000000000..a82c1bf6d5b93362bb8b06f88aac1e66a6fcfe1f --- /dev/null +++ b/static/assets/f8ff5dbef05bc3337cd3660fb956cffa.svg @@ -0,0 +1,10 @@ + + + + remix-white + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/assets/f974293a11768662b53444715e3439ed.png b/static/assets/f974293a11768662b53444715e3439ed.png new file mode 100644 index 0000000000000000000000000000000000000000..ab21ac4a40be9b5e326e3b26d7906a9d22a5869d Binary files /dev/null and b/static/assets/f974293a11768662b53444715e3439ed.png differ diff --git a/static/assets/f9868658d8483a6dbcd600e0226dfeef.mp3 b/static/assets/f9868658d8483a6dbcd600e0226dfeef.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..75b76533dec423cece275edae9d2887073ed78ae Binary files /dev/null and b/static/assets/f9868658d8483a6dbcd600e0226dfeef.mp3 differ diff --git a/static/assets/f9dce53613d5f85b311ce9f84423c08b.svg b/static/assets/f9dce53613d5f85b311ce9f84423c08b.svg new file mode 100644 index 0000000000000000000000000000000000000000..6e52d4213a9e8bfff2c8a0289fa324cfcbd60c27 --- /dev/null +++ b/static/assets/f9dce53613d5f85b311ce9f84423c08b.svg @@ -0,0 +1,17 @@ + + + + middle-block + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/fa121178a0dc748c56257f39987f0540.svg b/static/assets/fa121178a0dc748c56257f39987f0540.svg new file mode 100644 index 0000000000000000000000000000000000000000..8003d3339526c642892fe09ede0fd1adf3b6a723 --- /dev/null +++ b/static/assets/fa121178a0dc748c56257f39987f0540.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/fa945ee6723e936790970b40e6d3fe1f.svg b/static/assets/fa945ee6723e936790970b40e6d3fe1f.svg new file mode 100644 index 0000000000000000000000000000000000000000..5c36f3bb25378eb44f0996777ea03db9bb82cd26 --- /dev/null +++ b/static/assets/fa945ee6723e936790970b40e6d3fe1f.svg @@ -0,0 +1 @@ +dial-face \ No newline at end of file diff --git a/static/assets/fad59dd220562492e6722aa8a97f9369.mp3 b/static/assets/fad59dd220562492e6722aa8a97f9369.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4fce061764374f78508d50cbc6e8e34c33a864b2 Binary files /dev/null and b/static/assets/fad59dd220562492e6722aa8a97f9369.mp3 differ diff --git a/static/assets/fb356e819d8ab210a241ce81b9bac33c.png b/static/assets/fb356e819d8ab210a241ce81b9bac33c.png new file mode 100644 index 0000000000000000000000000000000000000000..01faec7298dc22c0d8abadc22f3969cecabfecf9 Binary files /dev/null and b/static/assets/fb356e819d8ab210a241ce81b9bac33c.png differ diff --git a/static/assets/fb3f9fa9be421f5153cd0223c3b0cb87.svg b/static/assets/fb3f9fa9be421f5153cd0223c3b0cb87.svg new file mode 100644 index 0000000000000000000000000000000000000000..d024f819fbe0a179befe76417affeecd721e2e09 --- /dev/null +++ b/static/assets/fb3f9fa9be421f5153cd0223c3b0cb87.svg @@ -0,0 +1,17 @@ + + + + icon--echo + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/fb7214f085f0444816f6d8a8b623b89e.svg b/static/assets/fb7214f085f0444816f6d8a8b623b89e.svg new file mode 100644 index 0000000000000000000000000000000000000000..e5e866411c18f07e6e7b566179e98634659243d6 --- /dev/null +++ b/static/assets/fb7214f085f0444816f6d8a8b623b89e.svg @@ -0,0 +1 @@ +blocknamemyselfdefineblocknamecolortextsetcolortovalue diff --git a/static/assets/fc383956e315b7ee2bd8dd09de311701.mp3 b/static/assets/fc383956e315b7ee2bd8dd09de311701.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0b87ef6e0bbd2a031aeca227ed974f66270560a2 Binary files /dev/null and b/static/assets/fc383956e315b7ee2bd8dd09de311701.mp3 differ diff --git a/static/assets/fcbe21fb0b0dfda0887771aa849f0200.svg b/static/assets/fcbe21fb0b0dfda0887771aa849f0200.svg new file mode 100644 index 0000000000000000000000000000000000000000..6d6e3187bf7f23ed3fa64ee8d24752bbb722c55e --- /dev/null +++ b/static/assets/fcbe21fb0b0dfda0887771aa849f0200.svg @@ -0,0 +1,12 @@ + + + + delete + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/fdd055b7cf23dbaccb433b35f76cdb49.svg b/static/assets/fdd055b7cf23dbaccb433b35f76cdb49.svg new file mode 100644 index 0000000000000000000000000000000000000000..c77d084551d12ce657f4045d10f0143b121d977a --- /dev/null +++ b/static/assets/fdd055b7cf23dbaccb433b35f76cdb49.svg @@ -0,0 +1,31 @@ + + + + mask + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/assets/fe5afd6776eac0f7724b132a9ff5057d.svg b/static/assets/fe5afd6776eac0f7724b132a9ff5057d.svg new file mode 100644 index 0000000000000000000000000000000000000000..951a31283f73c99d4c53813636993f0176b4b359 --- /dev/null +++ b/static/assets/fe5afd6776eac0f7724b132a9ff5057d.svg @@ -0,0 +1,12 @@ + + + + reverse + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/assets/ff2dc3c9ffca9e8097e82e3ff64b5955.png b/static/assets/ff2dc3c9ffca9e8097e82e3ff64b5955.png new file mode 100644 index 0000000000000000000000000000000000000000..a20dff985950b7d5d0d8ce914d45723420b0d603 Binary files /dev/null and b/static/assets/ff2dc3c9ffca9e8097e82e3ff64b5955.png differ diff --git a/static/blocks-media/arrow-down.svg b/static/blocks-media/arrow-down.svg new file mode 100644 index 0000000000000000000000000000000000000000..cf05eae691798301fa131762176a3f897821d94a --- /dev/null +++ b/static/blocks-media/arrow-down.svg @@ -0,0 +1,11 @@ + + arrow-down + + + + + \ No newline at end of file diff --git a/static/blocks-media/async.svg b/static/blocks-media/async.svg new file mode 100644 index 0000000000000000000000000000000000000000..061fb0c0784a9f8a1428ae92a91a7913c3420223 --- /dev/null +++ b/static/blocks-media/async.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/blocks-media/blue-flag.svg b/static/blocks-media/blue-flag.svg new file mode 100644 index 0000000000000000000000000000000000000000..0a5bf56a1a63fff787664ffb18a5c7adbfaa51d3 --- /dev/null +++ b/static/blocks-media/blue-flag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/blocks-media/checkmark-dark.svg b/static/blocks-media/checkmark-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..e841d5a3e427de0fdfeba6a8cedf91565a89fdd9 --- /dev/null +++ b/static/blocks-media/checkmark-dark.svg @@ -0,0 +1,12 @@ + + + + connected + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/blocks-media/checkmark.svg b/static/blocks-media/checkmark.svg new file mode 100644 index 0000000000000000000000000000000000000000..da9e8bfe797c3805ac620d17d0a59c7e81d2d4cb --- /dev/null +++ b/static/blocks-media/checkmark.svg @@ -0,0 +1,12 @@ + + + + connected + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/blocks-media/click.mp3 b/static/blocks-media/click.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0c1b05cd27c4615141da66ad736743146b13cdd3 Binary files /dev/null and b/static/blocks-media/click.mp3 differ diff --git a/static/blocks-media/click.ogg b/static/blocks-media/click.ogg new file mode 100644 index 0000000000000000000000000000000000000000..37535b862ca1722b2a3cd4c1a2b08577007a76c3 Binary files /dev/null and b/static/blocks-media/click.ogg differ diff --git a/static/blocks-media/click.wav b/static/blocks-media/click.wav new file mode 100644 index 0000000000000000000000000000000000000000..17f71aeeff48d34802151db1ca87a197699fcb75 Binary files /dev/null and b/static/blocks-media/click.wav differ diff --git a/static/blocks-media/comment-arrow-down.svg b/static/blocks-media/comment-arrow-down.svg new file mode 100644 index 0000000000000000000000000000000000000000..31dfa1dbac524795d14b700b92c5f97453b0005b --- /dev/null +++ b/static/blocks-media/comment-arrow-down.svg @@ -0,0 +1,10 @@ + + + + dropdown-caret-up + Created with Sketch. + + + + + diff --git a/static/blocks-media/comment-arrow-up.svg b/static/blocks-media/comment-arrow-up.svg new file mode 100644 index 0000000000000000000000000000000000000000..a951282c75b5184558b225047d2a1c3df19ee6ab --- /dev/null +++ b/static/blocks-media/comment-arrow-up.svg @@ -0,0 +1,10 @@ + + + + dropdown-caret-down + Created with Sketch. + + + + + diff --git a/static/blocks-media/delete-x.svg b/static/blocks-media/delete-x.svg new file mode 100644 index 0000000000000000000000000000000000000000..ed1f71edff194ec5feeb8367e29278d3f8bc7dc0 --- /dev/null +++ b/static/blocks-media/delete-x.svg @@ -0,0 +1,10 @@ + + + + delete-x + Created with Sketch. + + + + + diff --git a/static/blocks-media/delete.mp3 b/static/blocks-media/delete.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a937a3815d8fe805982308ab2f0fbd4e93f0e0a7 Binary files /dev/null and b/static/blocks-media/delete.mp3 differ diff --git a/static/blocks-media/delete.ogg b/static/blocks-media/delete.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e123af6b05f5671bcafa0744b9495c60d016c865 Binary files /dev/null and b/static/blocks-media/delete.ogg differ diff --git a/static/blocks-media/delete.wav b/static/blocks-media/delete.wav new file mode 100644 index 0000000000000000000000000000000000000000..8e8026e11075d7c45130ad0b89c4766751cc5162 Binary files /dev/null and b/static/blocks-media/delete.wav differ diff --git a/static/blocks-media/dropdown-arrow-dark.svg b/static/blocks-media/dropdown-arrow-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..50df28793fc12b674cb4ac030fce735a5a6fad4d --- /dev/null +++ b/static/blocks-media/dropdown-arrow-dark.svg @@ -0,0 +1 @@ +dropdown-arrow diff --git a/static/blocks-media/dropdown-arrow.svg b/static/blocks-media/dropdown-arrow.svg new file mode 100644 index 0000000000000000000000000000000000000000..4e6ce19ec0fca4e66e07dcc753184ebd8a9704c3 --- /dev/null +++ b/static/blocks-media/dropdown-arrow.svg @@ -0,0 +1 @@ +dropdown-arrow \ No newline at end of file diff --git a/static/blocks-media/extensions/microbit-block-icon.svg b/static/blocks-media/extensions/microbit-block-icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..95437962c02d987bf4748f991c6e1c8e1a4c7cf0 --- /dev/null +++ b/static/blocks-media/extensions/microbit-block-icon.svg @@ -0,0 +1,130 @@ + + + + + + image/svg+xml + + wedo-add-button + + + + + + wedo-add-button + Created with Sketch. + + + + + + + + + + + + + + diff --git a/static/blocks-media/extensions/music-block-icon.svg b/static/blocks-media/extensions/music-block-icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..f13ebe292d3fdce4f38f3ee13e1665c5817a991e --- /dev/null +++ b/static/blocks-media/extensions/music-block-icon.svg @@ -0,0 +1,17 @@ + + + + music-block-icon + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/blocks-media/extensions/pen-block-icon.svg b/static/blocks-media/extensions/pen-block-icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..148affa3310083ceb46a42299ec88a6eefa7ebdf --- /dev/null +++ b/static/blocks-media/extensions/pen-block-icon.svg @@ -0,0 +1,19 @@ + + + + pen-icon + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/blocks-media/extensions/wedo2-block-icon.svg b/static/blocks-media/extensions/wedo2-block-icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..51cb7710db55e920a1b593c7e68cf93ba8268197 --- /dev/null +++ b/static/blocks-media/extensions/wedo2-block-icon.svg @@ -0,0 +1,36 @@ + + + + wedo2-block-icon + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/blocks-media/eyedropper.svg b/static/blocks-media/eyedropper.svg new file mode 100644 index 0000000000000000000000000000000000000000..37ff80942795b425f279a84ac1994052fe06dbd2 --- /dev/null +++ b/static/blocks-media/eyedropper.svg @@ -0,0 +1,22 @@ + + + + Artboard + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/blocks-media/green-flag.svg b/static/blocks-media/green-flag.svg new file mode 100644 index 0000000000000000000000000000000000000000..976233ab71ffff935bae5e3c50351b81fcb8c5db --- /dev/null +++ b/static/blocks-media/green-flag.svg @@ -0,0 +1,19 @@ + + + + +greenflag + + + diff --git a/static/blocks-media/handclosed.cur b/static/blocks-media/handclosed.cur new file mode 100644 index 0000000000000000000000000000000000000000..4851755a1690d6631be7c32dcc7e001e6372aafb Binary files /dev/null and b/static/blocks-media/handclosed.cur differ diff --git a/static/blocks-media/handdelete.cur b/static/blocks-media/handdelete.cur new file mode 100644 index 0000000000000000000000000000000000000000..170320fc281ab02ded109f0310aa180b77e465f0 Binary files /dev/null and b/static/blocks-media/handdelete.cur differ diff --git a/static/blocks-media/handopen.cur b/static/blocks-media/handopen.cur new file mode 100644 index 0000000000000000000000000000000000000000..da44588b2fa68ee115deb843e1ce6802e58b3e30 Binary files /dev/null and b/static/blocks-media/handopen.cur differ diff --git a/static/blocks-media/icons/arrow.svg b/static/blocks-media/icons/arrow.svg new file mode 100644 index 0000000000000000000000000000000000000000..6debbf3776e49ba9988b853b78a8e308e6b90e8e --- /dev/null +++ b/static/blocks-media/icons/arrow.svg @@ -0,0 +1,12 @@ + + + + arrow + Created with Sketch. + + + + + + + diff --git a/static/blocks-media/icons/arrow_button.svg b/static/blocks-media/icons/arrow_button.svg new file mode 100644 index 0000000000000000000000000000000000000000..17d6eeb8c403ad33c1e33da89e946db11ef84abd --- /dev/null +++ b/static/blocks-media/icons/arrow_button.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/blocks-media/icons/control_forever.svg b/static/blocks-media/icons/control_forever.svg new file mode 100644 index 0000000000000000000000000000000000000000..eb095010d3cb21969f7f39ba162c1e4927bcc619 --- /dev/null +++ b/static/blocks-media/icons/control_forever.svg @@ -0,0 +1 @@ +control_forever \ No newline at end of file diff --git a/static/blocks-media/icons/control_repeat.svg b/static/blocks-media/icons/control_repeat.svg new file mode 100644 index 0000000000000000000000000000000000000000..05e9fa8db8ab2364476d73def797fca99fa64690 --- /dev/null +++ b/static/blocks-media/icons/control_repeat.svg @@ -0,0 +1 @@ +control_repeat \ No newline at end of file diff --git a/static/blocks-media/icons/control_stop.svg b/static/blocks-media/icons/control_stop.svg new file mode 100644 index 0000000000000000000000000000000000000000..7b36240f80f5af711f1f76de8d5297cd991bbaeb --- /dev/null +++ b/static/blocks-media/icons/control_stop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/blocks-media/icons/control_wait.svg b/static/blocks-media/icons/control_wait.svg new file mode 100644 index 0000000000000000000000000000000000000000..5291735408aac0b8f2ad385a14f7465496b27c45 --- /dev/null +++ b/static/blocks-media/icons/control_wait.svg @@ -0,0 +1 @@ +wait \ No newline at end of file diff --git a/static/blocks-media/icons/event_broadcast_blue.svg b/static/blocks-media/icons/event_broadcast_blue.svg new file mode 100644 index 0000000000000000000000000000000000000000..3ed7b5b7cf9c6ad7e1d03b70af8e9604567274cc --- /dev/null +++ b/static/blocks-media/icons/event_broadcast_blue.svg @@ -0,0 +1 @@ +event_broadcast_blue \ No newline at end of file diff --git a/static/blocks-media/icons/event_broadcast_coral.svg b/static/blocks-media/icons/event_broadcast_coral.svg new file mode 100644 index 0000000000000000000000000000000000000000..241f34e4657ed20fa00ab47b1deb26335d66cab2 --- /dev/null +++ b/static/blocks-media/icons/event_broadcast_coral.svg @@ -0,0 +1 @@ +event_broadcast_coral \ No newline at end of file diff --git a/static/blocks-media/icons/event_broadcast_green.svg b/static/blocks-media/icons/event_broadcast_green.svg new file mode 100644 index 0000000000000000000000000000000000000000..e61e35a362d00c910cf536d35a7dd34ccde342f1 --- /dev/null +++ b/static/blocks-media/icons/event_broadcast_green.svg @@ -0,0 +1 @@ +event_broadcast_green \ No newline at end of file diff --git a/static/blocks-media/icons/event_broadcast_magenta.svg b/static/blocks-media/icons/event_broadcast_magenta.svg new file mode 100644 index 0000000000000000000000000000000000000000..4207ff72c66934b6ca22cb1903691584b4e56416 --- /dev/null +++ b/static/blocks-media/icons/event_broadcast_magenta.svg @@ -0,0 +1 @@ +event_broadcast_magenta \ No newline at end of file diff --git a/static/blocks-media/icons/event_broadcast_orange.svg b/static/blocks-media/icons/event_broadcast_orange.svg new file mode 100644 index 0000000000000000000000000000000000000000..653ce7c76aedb2e4aab10e23b327a65c80fa6acd --- /dev/null +++ b/static/blocks-media/icons/event_broadcast_orange.svg @@ -0,0 +1 @@ +event_broadcast_orange \ No newline at end of file diff --git a/static/blocks-media/icons/event_broadcast_purple.svg b/static/blocks-media/icons/event_broadcast_purple.svg new file mode 100644 index 0000000000000000000000000000000000000000..547368c51b08711ecf3304221b2cb04ab5c5457f --- /dev/null +++ b/static/blocks-media/icons/event_broadcast_purple.svg @@ -0,0 +1 @@ +send-message-purple \ No newline at end of file diff --git a/static/blocks-media/icons/event_when-broadcast-received_blue.svg b/static/blocks-media/icons/event_when-broadcast-received_blue.svg new file mode 100644 index 0000000000000000000000000000000000000000..ed1f580d4a0ffa0fa4cc0c2a350afbdce1595007 --- /dev/null +++ b/static/blocks-media/icons/event_when-broadcast-received_blue.svg @@ -0,0 +1 @@ +LetterGet_Blue \ No newline at end of file diff --git a/static/blocks-media/icons/event_when-broadcast-received_coral.svg b/static/blocks-media/icons/event_when-broadcast-received_coral.svg new file mode 100644 index 0000000000000000000000000000000000000000..05f92a40ed4e90b2d6e0ff4e7127eb3a9afdf224 --- /dev/null +++ b/static/blocks-media/icons/event_when-broadcast-received_coral.svg @@ -0,0 +1 @@ +LetterGet_Coral \ No newline at end of file diff --git a/static/blocks-media/icons/event_when-broadcast-received_green.svg b/static/blocks-media/icons/event_when-broadcast-received_green.svg new file mode 100644 index 0000000000000000000000000000000000000000..e43e8a90b54970fb7ba096ba05f7177e297f3461 --- /dev/null +++ b/static/blocks-media/icons/event_when-broadcast-received_green.svg @@ -0,0 +1 @@ +LetterGet_Green \ No newline at end of file diff --git a/static/blocks-media/icons/event_when-broadcast-received_magenta.svg b/static/blocks-media/icons/event_when-broadcast-received_magenta.svg new file mode 100644 index 0000000000000000000000000000000000000000..c01191b65e130da09e7246aa047a3f40143e4fd0 --- /dev/null +++ b/static/blocks-media/icons/event_when-broadcast-received_magenta.svg @@ -0,0 +1 @@ +LetterGet_Magenta \ No newline at end of file diff --git a/static/blocks-media/icons/event_when-broadcast-received_orange.svg b/static/blocks-media/icons/event_when-broadcast-received_orange.svg new file mode 100644 index 0000000000000000000000000000000000000000..fa99c847b6f7b9a4d200c42867e4a9705f62ca63 --- /dev/null +++ b/static/blocks-media/icons/event_when-broadcast-received_orange.svg @@ -0,0 +1 @@ +LetterGet_Orange \ No newline at end of file diff --git a/static/blocks-media/icons/event_when-broadcast-received_purple.svg b/static/blocks-media/icons/event_when-broadcast-received_purple.svg new file mode 100644 index 0000000000000000000000000000000000000000..12b163fc4a3dd31164988f6b99937671b17ed01f --- /dev/null +++ b/static/blocks-media/icons/event_when-broadcast-received_purple.svg @@ -0,0 +1 @@ +LetterGet_Purple \ No newline at end of file diff --git a/static/blocks-media/icons/event_whenflagclicked.svg b/static/blocks-media/icons/event_whenflagclicked.svg new file mode 100644 index 0000000000000000000000000000000000000000..0a5bf56a1a63fff787664ffb18a5c7adbfaa51d3 --- /dev/null +++ b/static/blocks-media/icons/event_whenflagclicked.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/blocks-media/icons/remove.svg b/static/blocks-media/icons/remove.svg new file mode 100644 index 0000000000000000000000000000000000000000..9f50efc1974c10406653e31f830e0d6032df026d --- /dev/null +++ b/static/blocks-media/icons/remove.svg @@ -0,0 +1,19 @@ + + + + delete-argument v2 + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/blocks-media/icons/set-led_blue.svg b/static/blocks-media/icons/set-led_blue.svg new file mode 100644 index 0000000000000000000000000000000000000000..7bb73f980a545b84b90056361650f1bafc5cb5f6 --- /dev/null +++ b/static/blocks-media/icons/set-led_blue.svg @@ -0,0 +1 @@ +set-led_blue \ No newline at end of file diff --git a/static/blocks-media/icons/set-led_coral.svg b/static/blocks-media/icons/set-led_coral.svg new file mode 100644 index 0000000000000000000000000000000000000000..26487a30d68b9e9f5b86d64dc47268d256018663 --- /dev/null +++ b/static/blocks-media/icons/set-led_coral.svg @@ -0,0 +1 @@ +set-led_coral \ No newline at end of file diff --git a/static/blocks-media/icons/set-led_green.svg b/static/blocks-media/icons/set-led_green.svg new file mode 100644 index 0000000000000000000000000000000000000000..3c9cd170f5e9c14bd918ccff3c1a691947f107a9 --- /dev/null +++ b/static/blocks-media/icons/set-led_green.svg @@ -0,0 +1 @@ +set-led_green \ No newline at end of file diff --git a/static/blocks-media/icons/set-led_magenta.svg b/static/blocks-media/icons/set-led_magenta.svg new file mode 100644 index 0000000000000000000000000000000000000000..a13b8f1a0a9e707fb89cab06a612cbd8250602d6 --- /dev/null +++ b/static/blocks-media/icons/set-led_magenta.svg @@ -0,0 +1 @@ +set-led-magenta \ No newline at end of file diff --git a/static/blocks-media/icons/set-led_mystery.svg b/static/blocks-media/icons/set-led_mystery.svg new file mode 100644 index 0000000000000000000000000000000000000000..4b0a2e337739355a3ce08de0f1479f76e6427d87 --- /dev/null +++ b/static/blocks-media/icons/set-led_mystery.svg @@ -0,0 +1 @@ +set-led-mystery \ No newline at end of file diff --git a/static/blocks-media/icons/set-led_orange.svg b/static/blocks-media/icons/set-led_orange.svg new file mode 100644 index 0000000000000000000000000000000000000000..9821c79988ab14b9884f82d7f94f332219826770 --- /dev/null +++ b/static/blocks-media/icons/set-led_orange.svg @@ -0,0 +1 @@ +set-led-orange \ No newline at end of file diff --git a/static/blocks-media/icons/set-led_purple.svg b/static/blocks-media/icons/set-led_purple.svg new file mode 100644 index 0000000000000000000000000000000000000000..efb7132f1094f20fcb49ca803c641338d7b22fab --- /dev/null +++ b/static/blocks-media/icons/set-led_purple.svg @@ -0,0 +1 @@ +set-led-purple \ No newline at end of file diff --git a/static/blocks-media/icons/set-led_white.svg b/static/blocks-media/icons/set-led_white.svg new file mode 100644 index 0000000000000000000000000000000000000000..5ae43ab75082c4025bd18ef218e9eae5210ef291 --- /dev/null +++ b/static/blocks-media/icons/set-led_white.svg @@ -0,0 +1 @@ +set-led-white \ No newline at end of file diff --git a/static/blocks-media/icons/set-led_yellow.svg b/static/blocks-media/icons/set-led_yellow.svg new file mode 100644 index 0000000000000000000000000000000000000000..7dba71f714372b29b601711f0e8bb458e295f1e8 --- /dev/null +++ b/static/blocks-media/icons/set-led_yellow.svg @@ -0,0 +1 @@ +set-led-yellow \ No newline at end of file diff --git a/static/blocks-media/icons/wedo_motor-clockwise.svg b/static/blocks-media/icons/wedo_motor-clockwise.svg new file mode 100644 index 0000000000000000000000000000000000000000..29bdf2ab8d304f6e4ad93f4f3ca4256b97b48dc3 --- /dev/null +++ b/static/blocks-media/icons/wedo_motor-clockwise.svg @@ -0,0 +1 @@ +wedo_motorclockwise \ No newline at end of file diff --git a/static/blocks-media/icons/wedo_motor-counterclockwise.svg b/static/blocks-media/icons/wedo_motor-counterclockwise.svg new file mode 100644 index 0000000000000000000000000000000000000000..3631e8bb1653c62f17509b6e6a02daafe98bfc44 --- /dev/null +++ b/static/blocks-media/icons/wedo_motor-counterclockwise.svg @@ -0,0 +1 @@ +wedo_motorclockwise \ No newline at end of file diff --git a/static/blocks-media/icons/wedo_motor-speed_fast.svg b/static/blocks-media/icons/wedo_motor-speed_fast.svg new file mode 100644 index 0000000000000000000000000000000000000000..0e9308fbd6052293b628a8dc3654551f81741160 --- /dev/null +++ b/static/blocks-media/icons/wedo_motor-speed_fast.svg @@ -0,0 +1 @@ +set-motor-speed_fast \ No newline at end of file diff --git a/static/blocks-media/icons/wedo_motor-speed_med.svg b/static/blocks-media/icons/wedo_motor-speed_med.svg new file mode 100644 index 0000000000000000000000000000000000000000..49bc2b432c2d25c3aeb85e934901793ee347e799 --- /dev/null +++ b/static/blocks-media/icons/wedo_motor-speed_med.svg @@ -0,0 +1 @@ +set-motor-speed_med \ No newline at end of file diff --git a/static/blocks-media/icons/wedo_motor-speed_slow.svg b/static/blocks-media/icons/wedo_motor-speed_slow.svg new file mode 100644 index 0000000000000000000000000000000000000000..b9232edc1f21a4c82d260745f7738b01ddb680cc --- /dev/null +++ b/static/blocks-media/icons/wedo_motor-speed_slow.svg @@ -0,0 +1 @@ +set-motor-speed_slow \ No newline at end of file diff --git a/static/blocks-media/icons/wedo_when-distance_close.svg b/static/blocks-media/icons/wedo_when-distance_close.svg new file mode 100644 index 0000000000000000000000000000000000000000..fa735776dc741bb0d87eace8246e3d4fee0d4cea --- /dev/null +++ b/static/blocks-media/icons/wedo_when-distance_close.svg @@ -0,0 +1 @@ +wedo_whendistanceclose \ No newline at end of file diff --git a/static/blocks-media/icons/wedo_when-tilt-backward.svg b/static/blocks-media/icons/wedo_when-tilt-backward.svg new file mode 100644 index 0000000000000000000000000000000000000000..e7a41042c2c56d511439150358504cae50e7a922 --- /dev/null +++ b/static/blocks-media/icons/wedo_when-tilt-backward.svg @@ -0,0 +1 @@ +wedo_whentiltbackward \ No newline at end of file diff --git a/static/blocks-media/icons/wedo_when-tilt-forward.svg b/static/blocks-media/icons/wedo_when-tilt-forward.svg new file mode 100644 index 0000000000000000000000000000000000000000..00ef173ba0e73fa693817cda860f315583c8805f --- /dev/null +++ b/static/blocks-media/icons/wedo_when-tilt-forward.svg @@ -0,0 +1 @@ +start-when-tilted-forward \ No newline at end of file diff --git a/static/blocks-media/icons/wedo_when-tilt-left.svg b/static/blocks-media/icons/wedo_when-tilt-left.svg new file mode 100644 index 0000000000000000000000000000000000000000..35beebc0cd14f90f4dcedcea2598964d1d1dc9ba --- /dev/null +++ b/static/blocks-media/icons/wedo_when-tilt-left.svg @@ -0,0 +1 @@ +start-when-tilted-left \ No newline at end of file diff --git a/static/blocks-media/icons/wedo_when-tilt-right.svg b/static/blocks-media/icons/wedo_when-tilt-right.svg new file mode 100644 index 0000000000000000000000000000000000000000..a05dbf0b0ccfd46dc16a174d70b5e1aba4e227e3 --- /dev/null +++ b/static/blocks-media/icons/wedo_when-tilt-right.svg @@ -0,0 +1 @@ +start-when-tilted-right \ No newline at end of file diff --git a/static/blocks-media/icons/wedo_when-tilt.svg b/static/blocks-media/icons/wedo_when-tilt.svg new file mode 100644 index 0000000000000000000000000000000000000000..a4c10c39bc35716dc6095056462d97f07a5b02dd --- /dev/null +++ b/static/blocks-media/icons/wedo_when-tilt.svg @@ -0,0 +1 @@ +start-when-tilted-any \ No newline at end of file diff --git a/static/blocks-media/polygon-colapse.svg b/static/blocks-media/polygon-colapse.svg new file mode 100644 index 0000000000000000000000000000000000000000..7afdcaf62b88cf3fa907fc596fcba8727cd55bc4 --- /dev/null +++ b/static/blocks-media/polygon-colapse.svg @@ -0,0 +1 @@ + diff --git a/static/blocks-media/polygon-expand.svg b/static/blocks-media/polygon-expand.svg new file mode 100644 index 0000000000000000000000000000000000000000..1619cfc4e3050041f36ca92ea7a220892bfda419 --- /dev/null +++ b/static/blocks-media/polygon-expand.svg @@ -0,0 +1,2 @@ + + diff --git a/static/blocks-media/repeat.svg b/static/blocks-media/repeat.svg new file mode 100644 index 0000000000000000000000000000000000000000..dc3544368c1dddae0f31b6ce30ee187136724322 --- /dev/null +++ b/static/blocks-media/repeat.svg @@ -0,0 +1,18 @@ + + + + +repeat + + + diff --git a/static/blocks-media/rotate-left.svg b/static/blocks-media/rotate-left.svg new file mode 100644 index 0000000000000000000000000000000000000000..42f59191ac51d275a68d9a8307f187369138d777 --- /dev/null +++ b/static/blocks-media/rotate-left.svg @@ -0,0 +1 @@ +rotate-clockwise \ No newline at end of file diff --git a/static/blocks-media/rotate-right.svg b/static/blocks-media/rotate-right.svg new file mode 100644 index 0000000000000000000000000000000000000000..c3f46470452a56c5cbdd9eaf024309c646c4274c --- /dev/null +++ b/static/blocks-media/rotate-right.svg @@ -0,0 +1 @@ +rotate-counter-clockwise \ No newline at end of file diff --git a/static/blocks-media/sprites.png b/static/blocks-media/sprites.png new file mode 100644 index 0000000000000000000000000000000000000000..7f704a5f1ff6b99c6877e40d4d87729bd58bf42f Binary files /dev/null and b/static/blocks-media/sprites.png differ diff --git a/static/blocks-media/status-not-ready.svg b/static/blocks-media/status-not-ready.svg new file mode 100644 index 0000000000000000000000000000000000000000..27747447c7ecf364eef6857767fa352e030136ca --- /dev/null +++ b/static/blocks-media/status-not-ready.svg @@ -0,0 +1,13 @@ + + + + not-connected + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/static/blocks-media/status-ready.svg b/static/blocks-media/status-ready.svg new file mode 100644 index 0000000000000000000000000000000000000000..6116d5ae9b129e7f1a6de1b1aa319d2aa47e24d7 --- /dev/null +++ b/static/blocks-media/status-ready.svg @@ -0,0 +1,13 @@ + + + + connected + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/static/blocks-media/zoom-in.svg b/static/blocks-media/zoom-in.svg new file mode 100644 index 0000000000000000000000000000000000000000..a3bed5c2683e95e68b7facc797032238d979904e --- /dev/null +++ b/static/blocks-media/zoom-in.svg @@ -0,0 +1 @@ +zoom-in \ No newline at end of file diff --git a/static/blocks-media/zoom-out.svg b/static/blocks-media/zoom-out.svg new file mode 100644 index 0000000000000000000000000000000000000000..637973fb981f75fc9ac5377bead57f1b506e7f00 --- /dev/null +++ b/static/blocks-media/zoom-out.svg @@ -0,0 +1 @@ +zoom-out \ No newline at end of file diff --git a/static/blocks-media/zoom-reset.svg b/static/blocks-media/zoom-reset.svg new file mode 100644 index 0000000000000000000000000000000000000000..8089bf9f4c6b54466ab9208936d0aa572500017a --- /dev/null +++ b/static/blocks-media/zoom-reset.svg @@ -0,0 +1 @@ +zoom-reset \ No newline at end of file diff --git a/static/extensions/example-extension.js b/static/extensions/example-extension.js new file mode 100644 index 0000000000000000000000000000000000000000..804faccaab89bb5c8ade2d97cb1d74e7a901524b --- /dev/null +++ b/static/extensions/example-extension.js @@ -0,0 +1,230 @@ +var ExampleExtension = function () { +}; + +/** + * @return {object} This extension's metadata. + */ +ExampleExtension.prototype.getInfo = function () { + return { + // Required: the machine-readable name of this extension. + // Will be used as the extension's namespace. Must not contain a '.' character. + id: 'someBlocks', + + // Optional: the human-readable name of this extension as string. + // This and any other string to be displayed in the Scratch UI may either be + // a string or a call to `intlDefineMessage`; a plain string will not be + // translated whereas a call to `intlDefineMessage` will connect the string + // to the translation map (see below). The `intlDefineMessage` call is + // similar to `defineMessages` from `react-intl` in form, but will actually + // call some extension support code to do its magic. For example, we will + // internally namespace the messages such that two extensions could have + // messages with the same ID without colliding. + // See also: https://github.com/yahoo/react-intl/wiki/API#definemessages + name: 'Some Blocks', + + // Optional: URI for an icon for this extension. Data URI OK. + // If not present, use a generic icon. + // TODO: what file types are OK? All web images? Just PNG? + iconURI: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAFCAAAAACyOJm3AAAAFklEQVQYV2P4DwMMEMgAI/+DE' + + 'UIMBgAEWB7i7uidhAAAAABJRU5ErkJggg==', + + // Optional: Link to documentation content for this extension. + // If not present, offer no link. + docsURI: 'https://....', + + // Required: the list of blocks implemented by this extension, + // in the order intended for display. + blocks: [ + { + opcode: 'example-noop', + blockType: Scratch.BlockType.COMMAND, + blockAllThreads: false, + text: 'do nothing', + func: 'noop' + }, + { + opcode: 'example-conditional', + blockType: Scratch.BlockType.CONDITIONAL, + branchCount: 4, + isTerminal: true, + blockAllThreads: false, + text: 'choose [BRANCH]', + arguments: { + BRANCH: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 1 + } + }, + func: 'noop' + }, + { + // Required: the machine-readable name of this operation. + // This will appear in project JSON. Must not contain a '.' character. + opcode: 'myReporter', // becomes 'someBlocks.myReporter' + + // Required: the kind of block we're defining, from a predefined list: + // 'command' - a normal command block, like "move {} steps" + // 'reporter' - returns a value, like "direction" + // 'Boolean' - same as 'reporter' but returns a Boolean value + // 'hat' - starts a stack if its value is truthy + // 'conditional' - control flow, like "if {}" or "repeat {}" + // A 'conditional' block may return the one-based index of a branch + // to run, or it may return zero/falsy to run no branch. Each time a + // child branch finishes, the block is called again. This is only a + // slight change to the current model for control flow blocks, and is + // also compatible with returning true/false for an "if" or "repeat" + // block. + // TODO: Consider Blockly-like nextStatement, previousStatement, and + // output attributes as an alternative. Those are more flexible, but + // allow bad combinations. + blockType: Scratch.BlockType.REPORTER, + + // Required for conditional blocks, ignored for others: the number of + // child branches this block controls. An "if" or "repeat" block would + // specify a branch count of 1; an "if-else" block would specify a + // branch count of 2. + // TODO: should we support dynamic branch count for "switch"-likes? + branchCount: 0, + + // Optional, default false: whether or not this block ends a stack. + // The "forever" and "stop all" blocks would specify true here. + isTerminal: true, + + // Optional, default false: whether or not to block all threads while + // this block is busy. This is for things like the "touching color" + // block in compatibility mode, and is only needed if the VM runs in a + // worker. We might even consider omitting it from extension docs... + blockAllThreads: false, + + // Required: the human-readable text on this block, including argument + // placeholders. Argument placeholders should be in [MACRO_CASE] and + // must be [ENCLOSED_WITHIN_SQUARE_BRACKETS]. + text: 'letter [LETTER_NUM] of [TEXT]', + + // Required: describe each argument. + // Note that this is an array: the order of arguments will be used + arguments: { + // Required: the ID of the argument, which will be the name in the + // args object passed to the implementation function. + LETTER_NUM: { + // Required: type of the argument / shape of the block input + type: Scratch.ArgumentType.NUMBER, + + // Optional: the default value of the argument + defaultValue: 1 + }, + + // Required: the ID of the argument, which will be the name in the + // args object passed to the implementation function. + TEXT: { + // Required: type of the argument / shape of the block input + type: Scratch.ArgumentType.STRING, + + // Optional: the default value of the argument + defaultValue: 'text' + } + }, + + // Optional: a string naming the function implementing this block. + // If this is omitted, use the opcode string. + func: 'myReporter', + + // Optional: list of target types for which this block should appear. + // If absent, assume it applies to all builtin targets -- that is: + // ['sprite', 'stage'] + filter: ['someBlocks.wedo2', 'sprite', 'stage'] + }, + { + opcode: 'example-Boolean', + blockType: Scratch.BlockType.BOOLEAN, + text: 'return true', + func: 'returnTrue' + }, + { + opcode: 'example-hat', + blockType: Scratch.BlockType.HAT, + text: 'after forever', + func: 'returnFalse' + }, + { + // Another block... + } + ], + + // Optional: define extension-specific menus here. + menus: { + // Required: an identifier for this menu, unique within this extension. + menuA: [ + // Static menu: list items which should appear in the menu. + { + // Required: the value of the menu item when it is chosen. + value: 'itemId1', + + // Optional: the human-readable label for this item. + // Use `value` as the text if this is absent. + text: 'Item One' + }, + + // The simplest form of a list item is a string which will be used as + // both value and text. + 'itemId2' + ], + + // Dynamic menu: a string naming a function which returns an array as above. + // Called each time the menu is opened. + menuB: 'getItemsForMenuB' + }, + + // Optional: translations + translation_map: { + de: { + 'extensionName': 'Einige Blöcke', + 'myReporter': 'Buchstabe [LETTER_NUM] von [TEXT]', + 'myReporter.TEXT_default': 'Text', + 'menuA_item1': 'Artikel eins', + + // Dynamic menus can be translated too + 'menuB_example': 'Beispiel', + + // This message contains ICU placeholders (see `myReporter()` below) + 'myReporter.result': 'Buchstabe {LETTER_NUM} von {TEXT} ist {LETTER}.' + }, + it: { + // ... + } + }, + + // Optional: list new target type(s) provided by this extension. + targetTypes: [ + 'wedo2', // automatically transformed to 'someBlocks.wedo2' + 'speech' // automatically transformed to 'someBlocks.speech' + ] + }; +}; + +/** + * Implement myReporter. + * @param {object} args - the block's arguments. + * @property {number} LETTER_NUM - the string value of the argument. + * @property {string} TEXT - the string value of the argument. + * @returns {string} a string which includes the block argument value. + */ +ExampleExtension.prototype.myReporter = function (args) { + // Note: this implementation is not Unicode-clean; it's just here as an example. + const result = args.TEXT.charAt(args.LETTER_NUM); + + return ['Letter ', args.LETTER_NUM, ' of ', args.TEXT, ' is ', result, '.'].join(''); +}; + +ExampleExtension.prototype.noop = function () { +}; + +ExampleExtension.prototype.returnTrue = function () { + return true; +}; + +ExampleExtension.prototype.returnFalse = function () { + return false; +}; + +Scratch.extensions.register(new ExampleExtension()); diff --git a/sw.js b/sw.js new file mode 100644 index 0000000000000000000000000000000000000000..63d8ea327693fb2da43f0e5f61749c1a35734aee --- /dev/null +++ b/sw.js @@ -0,0 +1,54 @@ +// These will be replaced at build-time by generate-service-worker-plugin.js +const HTML_ASSETS = ["editor.html","playground.html","index.html","fullscreen.html","addons.html"]; +const LAZY_ASSETS = ["static/assets/5566fa235cca306584cdda4d4bbd6640.svg","static/assets/a6cebfe99bad7b01f59b85998cbc4628.svg","static/assets/31446edc97ac1eb0c3d2af65c0d8432a.svg","static/assets/02d927ce93445be737c7ff43fb98b135.svg","static/assets/21739a7b303ece303b023791813412cb.svg","static/assets/d84cdb7f4b9567882511ab47f63e342b.svg","static/assets/12e69a59db0f0c697eaaf1abbcad902f.svg","static/assets/80ad76114d0b3f2fc54a3756dd283a53.svg","static/assets/09469790f10bcd5ed51fe8f85f8bdc1e.svg","static/assets/81d5d1258558641e78d425193753207c.svg","static/assets/989d99155bdb2720680a8c09fb7c454e.svg","static/assets/770c1f3eca5a0d7c327c275865dad3f0.svg","static/assets/1b769802c531b5a04faf429c1ec27632.svg","static/assets/7d6f0362fc2114f39b4f6651ebeda312.svg","static/assets/482dc5011057fe26e9542e9476601bf2.png","static/assets/8fb27bc07c64def488d712e06906c7a4.svg","static/assets/46857e786bc7e3b6b81fb2e99c7b74e9.svg","static/assets/751f2b7681471a8020a47cb3d456a8d2.svg","static/assets/a0d194f44b13fbeaf843e784cc8b03fb.svg","static/assets/b370449e927fbc501686cf597511f7fc.svg","static/assets/c9f4f655230d224c33ead125216199db.svg","static/assets/db445f7d7b15b698deb8a08c31697f87.svg","static/assets/e53ff4a140871927b2d5be4f5cdb2c79.svg","static/assets/680b3ff6a51d8fc77fbaf8695c8de929.svg","static/assets/4e14eca3d0328a2d2fe39428c6127b2a.svg","static/assets/a746db3baa99760ac6d9093990a95bba.svg","static/assets/e45e0626c5e444a55bb3b6380041a879.svg","static/assets/2d4c184e3846a60d2ba3b21fbd792f77.svg","static/assets/40948f8d98c39a96fbba5cf02ec6c8c9.svg","static/assets/5b82df2c2b7bc7783cdcfd1c58f9aa92.svg","static/assets/31c459a6fc47e3d9ff83a2a95e25ae76.svg","static/assets/45c47a95ac3bd35713d6a96dd906ebc2.svg","static/assets/04e10c82d2a75d397ca963c1a9f9e1e7.svg","static/assets/369019214d73953a85fb0eec22bcce7c.svg","static/assets/51a878842a231ebe2fa7cc331e65e89d.svg","static/assets/2b48b1ca1e69f653cfdc7c80eb657f56.svg","static/assets/325cb39cb89c3ff39ca5585585d838f5.svg","static/assets/c64657eab9e2899098a8e0d04f560d1f.svg","static/assets/5e7725764b0a01350ea36166d722c370.svg","static/assets/29c0aa6c826f3dc4710823f345eae288.svg","static/assets/00091c06e9ea001f51bb7303be96b739.svg","static/assets/fcbe21fb0b0dfda0887771aa849f0200.svg","static/assets/2e52d021419ed131bf294fbfb166dad0.svg","static/assets/d37e41b89c301f1ee2c0e911b5c1d4d2.svg","static/assets/2a044a86dce4eb8bc149bb0db93dd352.svg","static/assets/fdd055b7cf23dbaccb433b35f76cdb49.svg","static/assets/38864948713b3bea4c8f3a77c85003bd.svg","static/assets/c90f59f422ddd73d2d58569f872b36d0.svg","static/assets/6af0d9a73807fa35410cc50cb6f5e3c7.svg","static/assets/992fc2de9ef0319e29b6d3c8ff5d8ca0.svg","static/assets/c8455deb7c37c2d4c88e94147d12afb2.svg","static/assets/30314175f450b6007dca6a532e5f7919.svg","static/assets/adaeb8876e88eba49f66fe82f5aed731.svg","static/assets/768bcbb6656593c4d4a48e4c7f98f1d6.svg","static/assets/08cb40364031026f31772bcfa94d6993.svg","static/assets/ac92bfcb2fc35687d1ba5ab6bb733671.svg","static/assets/59c79fa681b1421547664294a259b2d8.svg","static/assets/b526c1fdbbcf5e07a2ed065d5bcb7a15.svg","static/assets/3cfc9b39a0d002246119d47f6756d77e.svg","static/assets/1fa6345d57ffc67eccd9f44cf6a383dd.svg","static/assets/dba629c24296756d68a135988fe96011.svg","static/assets/99de7c4b260353d52ca40624a6dfe112.svg","static/assets/3a2d63269c47aa8244b0d613cf50eb6c.svg","static/assets/e6f716edc49c30d8e46444093f2c113a.svg","static/assets/66617b2996691804289777645e751c0e.svg","static/assets/5679cd29c517886712116060d3360592.svg","static/assets/382a52221b13870cd56d51ac719a5d8b.svg","static/assets/b592c8b4b02de3c7d367ce10efa9d7a6.svg","static/assets/ac62d5285bf0943dcad9391fa0986fb4.svg","static/assets/a02821bc5d19d616d43d55ac10779101.png","static/assets/f04f7b0f673ced51710157ce16e49276.png","static/assets/94b3a496d095dd3b3cfbaabb84a190fd.png","static/assets/942d5ca1a892e7dc5156d0ae7b438c1b.png","static/assets/d6214ab9abf22f5d5dee060cb72f637f.png","static/assets/4c5757837d14e9fca439064c62617ba1.png","static/assets/44c364962f4cb85aef2cdec4f0e01fd4.png","static/assets/0966e5defb1ae50e569fbbc7ebe7f22a.png","static/assets/11c35683a60415bf62ee1a7324a25848.png","static/assets/1c8f54c61adf1cee25299833093395f3.png","static/assets/1d1e22600289d252ebda0b9924bf7d3a.png","static/assets/58d62765bbaa69620eb5bcd2c1cbbebb.png","static/assets/f974293a11768662b53444715e3439ed.png","static/assets/8bad9bd9d9a0d53b4a0f4e69bf02764a.png","static/assets/76e8f03f3f2ac00ab16dd4f2afee63c4.png","static/assets/5fe2f38d9b66e0a55b49e717fcd5c001.png","static/assets/06e9863f95061349f2ba2e0fb0b58ddc.png","static/assets/827c57667d965940792a82d82345e075.png","static/assets/bd16b79cacee7f23835efba88ed4aa67.png","static/assets/c60f3f06c5fb4d49df7236aeb2f31a9d.png","static/assets/02996322134b61a0344527cddc61f9bd.png","static/assets/5e80f6caeb6323606a203fbb248fe18a.png","static/assets/97aa37df83e2c5c2effa09d6622cd3a7.png","static/assets/638bc6bde253241454993ae12273970b.png","static/assets/4ec6148233578e86736548eb8b9952e7.png","static/assets/edd84717633475a8d3db34087123314a.png","static/assets/8f3259bb74d811177e8e65dcbea39ed4.png","static/assets/06785171617ea882557cf5afed61f364.svg","static/assets/8fdeee6df0b53509b7f9d623cab482b3.svg","static/assets/1e348b2e8899c618822c76299803903e.svg","static/assets/90eaf6469dbf3a808a3d9739cc77358d.mp3","static/assets/4240a79d13ecf2792f825457194c96d9.mp3","static/assets/9ad12a9de73f49fb645902987027eb2b.mp3","static/assets/2b7b80de8884cc3cf584aa0deb86a59b.mp3","static/assets/5c6533a34175f61a9cab627f671111e1.mp3","static/assets/5888c4ba6b8a0767f8be5bbc81994397.mp3","static/assets/fad59dd220562492e6722aa8a97f9369.mp3","static/assets/51a75dd50afd0bc6022dfc86455be19c.mp3","static/assets/9f8e3a1db63c7a8fd976beca7e3546c3.mp3","static/assets/b6a8e4a96ffcd83154ad2c5cbcb52751.mp3","static/assets/1c9630b745711a0b829841e8555d76e4.mp3","static/assets/f8d8b9d9f1aa45900b786980418219b1.mp3","static/assets/83f2d48d0c7d1e6be8a509d4d2c6d0e5.mp3","static/assets/b700cf6f9c368ce49851d287ddd3b63c.mp3","static/assets/3fbd690bdae84637e34b8b933a164e3d.mp3","static/assets/a7c08a472cc8b1c4e0c45ae9b030b414.mp3","static/assets/f28b1ecd6fccd6218a837c14b1109da7.mp3","static/assets/f9868658d8483a6dbcd600e0226dfeef.mp3","static/assets/10af80546707afae5507edb828dd35a0.mp3","static/assets/7a7fdb40997804d4778e2a12bd7599f7.mp3","static/assets/a61fc8393abec3c0d1e813fc01f252ee.mp3","static/assets/a0b130dbafdc7958b73d162239053173.mp3","static/assets/d72b98474fc83d6268886779339e242e.mp3","static/assets/d4b3ce804680eb7d58f6accc7436e807.mp3","static/assets/129b99ac19024c35228d855f42fb852b.mp3","static/assets/8c0c02f16572b730d422f96a3ce53e7f.mp3","static/assets/00d2dff9d5ece15a67074374b2027590.mp3","static/assets/09995475180591a6c64c8744fbfdf4d8.mp3","static/assets/961bfad11616b6f5c951c58499cf267a.mp3","static/assets/2b0cfb89b2c8d1badb03136fcf911c3b.mp3","static/assets/c44ce3bfa465281e765f197d6c3ee7ea.mp3","static/assets/e6180253665b8248f685c6d96881f75b.mp3","static/assets/b52b83f63e8482255d46f40ea454fa01.mp3","static/assets/1e7ed7b14b056ebd80f434143846fb4e.mp3","static/assets/c36dd943607003a3229aca77b49d32de.mp3","static/assets/f382f43d667b784d1bcd8cfe7aa6fff0.mp3","static/assets/5e0704b815761d38242f1b961ce9ef69.mp3","static/assets/1a87a73db1ba0193283680e37b35754e.mp3","static/assets/fc383956e315b7ee2bd8dd09de311701.mp3","static/assets/0b18f02669375ad2ee80bef8d07ea7ec.mp3","static/assets/1980303ffc6f5c17c601a9e5992aea77.mp3","static/assets/57f0f65052d9dac78ee66b11cc696b6a.mp3","static/assets/da1a6ebcd442e9d867b31fb21ce6a289.mp3","static/assets/bacc13779ca01580b89f39dd2118c22a.mp3","static/assets/0dcd27b60c185811b19f59d56eaa12f6.mp3","static/assets/1a064f9a752824e781ccf79ab66850ed.mp3","static/assets/a05bbf6359407ad7950e115edab178d9.mp3","static/assets/da3126c6a70c4ef84192c33f99996354.mp3","static/assets/103fe904046c35630c600cb122492d78.mp3","static/assets/8ca9997e9ed7534a8d0f349a6125bd24.mp3","static/assets/83857346b7c2e6a351c69377e82a3606.mp3","static/assets/ecb1cbda3b9c4f29ab971734d97e3faf.mp3","static/assets/0043f23189fb3cbf2021a88959961ece.mp3","static/assets/78a74345ee778afbd6abe637b4f69efc.mp3","static/assets/d434438e5d193118e4aad3a846e1c7ba.mp3","static/assets/39563f3b38b1fdb805323b1f69dace54.mp3","static/assets/0e8ed599d9875c77d52db36de2b2b33f.mp3","static/assets/7337f194b0a727f4be98902487dfb615.mp3","static/assets/ed2a96fbdb476efe419246982e357121.mp3","static/assets/7c5a16e0627c64fd62ec597bb72b879d.mp3","static/assets/e27f7cdf42df8b768345ae83fecffe4b.mp3","static/assets/318e019bdee5ed02903aa5f22a9903f2.svg","static/assets/e1249124e702a974df36355af6aa2385.svg","static/assets/9d7acb2e5784a9a1d52e564af3d8469b.svg","static/assets/bd6d382729ecbd23c5181cf2b327072f.svg","static/assets/e008ee0cb1202de1137823150da1644a.svg","static/assets/c088896fb05dc466b45ecaa1d5c4d007.svg","static/assets/ab2c140af0ffba6b515eebc2156742e2.svg","static/assets/7601fa61034e5d7d542538e1e4338a4e.svg","static/assets/7b98085c05bdcd97dd0c6d4b34317793.svg","static/assets/4bfaa15915bc5fb88b40b3e1a537c3ea.svg","static/assets/60fb267c5ab0c6f4ed9ab4a891ca7dd5.svg","static/assets/8a30520407ffdf5b0e7e06e490db9c1d.svg","static/assets/76b6cb627b95d79705c0b41664064f0e.svg","static/assets/c846a442121113b1d04f6b9d50912038.svg","static/assets/0e009d6e684951615b31a267baa37636.svg","static/assets/88a77444f0bb453209bf1c62becbd37c.svg","static/assets/b2c44c738c9cbc1a99cd6edfd0c2b85b.svg","static/assets/e21225ab4b675bc61eed30cfb510c288.svg","static/assets/3547fa1f2678a483a19f46852f36b426.svg","static/assets/969aaca3d7c0ff67b664b24c2652fb12.svg","static/assets/70f8bee49a78f131d8dc87658809a684.svg","static/assets/e997e36ade408c75ef4424b928e10846.svg","static/assets/7c9434c4f1f44e3d198db3bc77305fff.svg","static/assets/6f52bcc0310181641bac6fec51c69e13.svg","static/assets/b987c9e2c37b17bd7c97f1fa47257d7e.svg","static/assets/6fb602003b4d9e845e84f77129346396.svg","static/assets/1640b6d968e0a0e13bc3c309a616deaa.svg","static/assets/385aa4b73a425883b4f9e91501a52299.svg","static/assets/e587d9d7e9a2f1f28041ba5c15db7a40.svg","static/assets/94b06fb716871f81bec601724e29a457.svg","static/assets/551aae506dfa65ce3b45713b5300a678.svg","static/assets/7fa47f4c0e905e7a3eae32fe6347ad8e.svg","static/assets/301439e2e5ab88b658368ee525e6752b.svg","static/assets/44e4859e354c81d66c73f741df2e5ec7.svg","static/assets/9cfdd378e4cc977fe663ca932e530ec6.svg","static/assets/35c6867250ec4f430624bc9e2e7072d7.svg","static/assets/3c3142e814ff1652338af92a410d3d70.svg","static/assets/63e5827c1506216bd7c9927a4e5eb558.svg","static/assets/18dada8a9aabcfc157e051d2e33aa7fd.png","static/assets/33b2c770e12dd94797701e92ae37a820.svg","static/assets/89a5687599f173f2b910aa5fcd862b42.svg","static/assets/a3e689235188ba10c5cfd75730cb88a7.svg","static/assets/04e28ba12fe914cf4f131dcb85ae82d6.svg","static/assets/a80790c977586cc0595b5fe2f0bcb39a.svg","static/assets/33592a76d0d0fdaa4a32b2ea41db5e16.svg","static/assets/76121b7f4eff7d7ca0d49a45479d3f3f.svg","static/assets/ee54d776d2cda9a3c537ac7e8f144037.svg","static/assets/cb666b99d3528f91b52f985dfb102afa.svg","static/assets/97926439955086f8ee4aabbd81580f17.png","static/assets/3e83d9d800459175308f0b45b117af16.png","static/assets/42157e6edddc19588c3c2ff188703799.svg","static/assets/0fd9fd69a38ab79358df5a77b29702c8.svg","static/assets/8b8f2d052b4092ec47ad66c30c8b1642.svg","static/assets/4b6100c9f591be6470cdfd4697de0b54.svg","static/assets/71655cde34ae75f48cb8820abf4b31e7.svg","static/assets/05e05756b592740a3670417b4df19ca9.svg","static/assets/572a212c2e777e3a9061c97453497009.png","static/assets/dd98971c2c185caf86144b6b5234d0fa.svg","static/assets/88a3bec89367b65d176c22eef8c6ddcd.svg","static/assets/10811a978de201353d564df7ba1ddb58.svg","static/assets/7bf301e0e47ee990a3572e0aea2f850e.svg","static/assets/8beb9da10f72d02b48baf0b24ac72449.svg","static/assets/58d1104d0922e424a0b0d4a27e6ed826.svg","static/assets/999649b8d77ea4f04e0dca31326090c1.svg","static/assets/acf8e02623682856899b55f10f66e212.svg","static/assets/2a70b21aaaed0619bdfcdec91db1ebe8.svg","static/assets/a5787bb7364d8131ed49a8f53037d7f4.svg","static/assets/ac6d4216d424b165ba317fe4e997d6da.svg","static/assets/fa945ee6723e936790970b40e6d3fe1f.svg","static/assets/7569623cd83d4ceab6b37c1541d656af.svg","static/assets/5d308ce375ea6edae5abf4e33eda07f3.svg","static/assets/79d588614c7827f6ac6620014b0eb078.svg","static/assets/d79bf4bbb8df5542ffef65d9e61b37ed.svg","static/assets/78d48375d26960c3ac4fe82387055621.svg","static/assets/d8cbb86bdb5ce2ba9f2ed0975f51231e.svg","static/assets/0c19152025f432ddd7d67c039d328f26.svg","static/assets/622321b437cc79dd9ed885540a94505a.svg","static/assets/0896da795cd8d2199e8cfb968229d04a.svg","static/assets/06b8b81e4596f360738c678f6a840dc2.svg","static/assets/5f4208a6b7257c456c018d57efc8a7e9.svg","static/assets/6c037268777f4b85658c4fdc1f55b4f9.svg","static/assets/d0285f1906636f21d1149a4797b978dc.svg","static/assets/2d24a289beac8fe221ce132aac88a320.svg","static/assets/1319094a51748798730f01d1dc0972ac.svg","static/assets/dfe35552790fb5ff38c78a43f5e62f30.svg","static/assets/41835a2c99bdd753b68472735b2bd611.svg","static/assets/663892634c556da228c1d09301a54e63.svg","static/assets/27802141bca7404b477168369bf3475d.svg","static/assets/e28b110fa5eef35531fa271a3a7b6314.svg","static/assets/1bb0adb555e07593962e9fc28ec7566d.svg","static/assets/ce5820b006d753e4133f46ae776f4d96.svg","static/assets/f9dce53613d5f85b311ce9f84423c08b.svg","static/assets/bbbd98ae6a34eac772e34a57aaa5f977.svg","static/assets/664d94e5cb8676c780c74c695f2e972c.svg","static/assets/500c8018b36d12bcde6ef92e20e5ed5d.png","static/assets/5dbf111a76a93a93613ec81c16dfc6d3.svg","static/assets/f8ff5dbef05bc3337cd3660fb956cffa.svg","static/assets/2f9cda00a530ac237fc24063067377c3.svg","static/assets/8bcd9c00e30a0af9d832735651fd9643.svg","static/assets/8f531cd80e1aa712fdff13a69c9c62e2.svg","static/assets/74546102be38f592d24b4330a16a8639.svg","static/assets/90e939d170002c61a50116ed55763b19.svg","static/assets/4da38973d5ffd15c54e80894d430288c.svg","static/assets/df6a71244d4727d19c5a78d71677d2a6.svg","static/assets/a4d91e3b83e7cbccaf4a4e2322b873f5.svg","static/assets/27f90bfa982840e56c3ad207561193fa.svg","static/assets/21988681fa28c8ce37982ca26463a6f5.svg","static/assets/d889a872f3b0985b28fa872764172ef1.svg","static/assets/26255153f92ea41df149a58d3c3fe2cf.svg","static/assets/993a0700d8a0972d309307b0a4688ed7.svg","static/assets/00505ca954aec95aac898ee7d5a7ee6c.svg","static/assets/83b16872b1684580c2e0a1ee1e57506e.svg","static/assets/ed523e83c862293741568a89219e5dcf.svg","static/assets/fb3f9fa9be421f5153cd0223c3b0cb87.svg","static/assets/42428924171999cebe3efd5e70b7bc53.svg","static/assets/f22d5ea0ef6a46b2a4a174fed722c396.svg","static/assets/8279ce395d0333b880b8be6d243fd111.svg","static/assets/7f41449e898401168112236180fcf9d6.svg","static/assets/3dd8f573267d99448c62fd87bf0e3591.svg","static/assets/27557abca597bafded7f45adede9a6bf.svg","static/assets/238a12e6d066c100697e7b28c87913d0.svg","static/assets/b4c3606f4126d3226d96d31e36fff84d.svg","static/assets/b5257afbe4bcf7953029ddb8f18b24fe.svg","static/assets/d93fb1224d372792aadc4706e9b45858.svg","static/assets/fe5afd6776eac0f7724b132a9ff5057d.svg","static/assets/199f58b4a80fa56c5d8e032d6da5e9c2.svg","static/assets/424371873bc8df88d6a305d8727157ab.svg","static/assets/481fbac64b59203d7ddffa564a7537d8.svg","static/assets/42d9642b78a0d9f0a1f4065fc74e7bc0.svg","static/assets/617dd0f2b2f2be576184b4283a3c917f.svg","static/assets/c6778106d615504de22e9254f1729577.svg","static/assets/38a70367a21e2f1fb15aa59b7d367450.svg","static/assets/9ddae4f6c1aeaf0784007203d9d4ac9c.svg","static/assets/422b48c2206d5240a6717c92496ba21a.svg","static/assets/837d221121f5f6dc06f1ae42a7f5e071.svg","static/assets/05e9c069d478b9e056e35f04e7dedf64.svg","static/assets/4d250151a07cfc8b54b34e1df68d265c.svg","static/assets/dd55f4c6c20f5d25e520b6f5bfb090c5.svg","static/assets/2e0c4790f8f9cf28e3c346b9cef0fcb6.svg","static/assets/a2ed866eb2db31b7583e7b52ee598246.svg","static/assets/8f160ba31754d0e965eaeb54b60d6240.svg","static/assets/36fcc7dbca20720abcab01e49d4955f9.svg","static/assets/fb356e819d8ab210a241ce81b9bac33c.png","static/assets/f2457825850317e66ef2128504613c30.svg","static/assets/33b737193edfe1730f38112ad35a84b4.svg","static/assets/620f707d6d9dcd512ec6604b0eda2cb3.svg","static/assets/f0fc12e672912247cc20d34ea452b517.svg","static/assets/d71c0379472f709318ef81ff0dccf7d5.svg","static/assets/01011831acb632804df035321ff68afe.svg","static/assets/89c89d8cb19c183635c7e00f2ff5a63c.svg","static/assets/870d942b2502550f58b9eab7561f42ec.svg","static/assets/c4c75827d7f30081f493963fadec60a1.svg","static/assets/171fbf8ebb9d7127d4c59a04568e2af4.svg","static/assets/33152e09f092ce18fe776f1d670ac99f.svg","static/assets/aaa4a3575852fe11d04f44c4a972ae73.svg","static/assets/bc45b073cd2fc0c2265374bdb4e05d67.svg","static/assets/b433ee02a13fa2a12f7f7059f1f6729a.svg","static/assets/d92e74438d72c2223692825df66e026e.svg","static/assets/73773f78bf2bfc449218fbaee1922964.svg","static/assets/3d9e2585d6ed12b9fb994438e0c4c42a.svg","static/assets/bf3ee9d7d91a231cde773f88f6799425.png","static/assets/1aa0695f67909940855aad4cc774f906.svg","static/assets/8e5e28b23ba596614a60d319d9c64165.svg","static/assets/3286e2838658ebdb82f62d062b14e951.svg","static/assets/6608d56b3dce2738b2b137569d305d3b.png","static/assets/fa121178a0dc748c56257f39987f0540.svg","static/assets/60fc7acc624571cfa9d250d7d5cff041.svg","static/assets/7b6399d516d5921bb199f57cdd8bbbbe.svg","static/assets/5a70df361bb00fa62b9338d89c92f377.png","static/assets/02470ceceed9235b943e6b5a9edc8efb.png","static/assets/cc4d68fe9d6a77c7f35f9d5461b60967.png","static/assets/d61429ad96a25ec2917ebc77d900aae0.svg","static/assets/c30d6a0e73cf38ad6ea7f5e4fe0428a3.png","static/assets/84a9455c54ab68ad8dcf8b6f6465ae71.svg","static/assets/6be143c7cb9d23c787f7f20674a76f72.svg","static/assets/4b6ca5259f1271d510f081867e746847.png","static/assets/504d73be1b361b4b9ca7f655ce085dc6.svg","static/assets/7eea42371f5ccb84b4fc7d0ba7331ea3.png","static/assets/48d03d1d2794e30b221465fc07da79f7.png","static/assets/4ec70230d5b7f1ab12560b4619f2dbf9.svg","static/assets/800f6f1573677d59954e8d3164602287.svg","static/assets/7679e8aa3b5a6b745823e00a7b950065.png","static/assets/c79988bb17fdba37fe2d1ee3eacf9f5f.png","static/assets/ae1b9be9ac5a0793b990a0ba5231c662.png","static/assets/98cd4769145ea580a7d6fef9fdb62aab.png","static/assets/10299cfdb7aae4ef46933f78b4366d6f.png","static/assets/a51b949b03d40faa62ef202a787f76ec.png","static/assets/ccf5cd43b7f5661f8141f879e4a015bb.png","static/assets/a77d7ed07c4715b2b580438d46a567b9.svg","static/assets/9ecfc22bb2fae434d72acfa182df6927.png","static/assets/3adc1e3e705ec30e961125d7c136db09.png","static/assets/195b65444703293e0624ff4e09c13c81.png","static/assets/c8215bcfbb4dc9000bb0da3947cdb523.png","static/assets/c304e6cc2ad622167b6ef46e30cc9423.png","static/assets/bb0b18c664cbbb05be54c26055908e95.svg","static/assets/cd2fa6465953012247b14e89f4931cf9.svg","static/assets/89b0a98b82e2fcad7e4563b348a1caf7.png","static/assets/930323f74179aa022fd87939b3b2999c.svg","static/assets/6a8cb419123dfa9fe427b191f7b561ad.png","static/assets/81503641d782aa3a3f88df14b58bc3e6.png","static/assets/9c2e381fb6da323e4ab7948c353a629b.svg","static/assets/36b59d3087103cc7573145332ec64745.svg","static/assets/f33541f52553e00993de696ed1233229.png","static/assets/c51f86f9bcf8f37fc49331cbb5630c94.png","static/assets/6395fd31325176c1d0779dc0ff139c72.svg","static/assets/0a0eb1af384d2f241aab5631440b2a33.svg","static/assets/f87904843f21a05464c4acc3ec4d368d.png","static/assets/7cde88cd98adaaf1e911f68bacdbe719.svg","static/assets/9e32994e371028645656c0bce61be484.png","static/assets/30369b87eed36dd399a127ae7c0ea1a4.png","static/assets/51adf4a45cbacf743c3ee538e432fed2.png","static/assets/dc97849515ceed1012a3b89210a950fa.png","static/assets/3a9f7312dd51198c123804f87fa78bc9.png","static/assets/21a46a49b55befa73d6b8352e2795d6f.svg","static/assets/88ab038784badd192df6bd931d7c2e40.svg","static/assets/03562df738acb5b29670d58970eb432f.svg","static/assets/174cbb7cc72418e5f095e0b734ceed1d.svg","static/assets/3b0c388c2cf1462401585224ffe2f077.svg","static/assets/84ad46536cb4de7a9e82347461b375a1.svg","static/assets/f1207802424428612503584b5258902c.png","static/assets/f6c7e603df1d93a09e434cd34256361b.png","static/assets/fb7214f085f0444816f6d8a8b623b89e.svg","static/assets/64faeccd0a42a3548ec41b7471ff5ef6.svg","static/assets/c296552f9440b25b8225da38a14d9488.png","static/assets/5f09200519a8b4130cf1b09a35c01a10.png","static/assets/f3d2cc01ffb4aaea4b4e3b50e35fdf73.png","static/assets/b14d70e45d588be5106be4ee696dfa3f.png","static/assets/bd055c3853854218f060871e694b16f7.svg","static/assets/1e391038e9bc3c5bcadf50902980089d.png","static/assets/39f37f1b00fbf96926276701d8de4c89.png","static/assets/01fc0da0b4f9dfcf62ee83e1505e14f2.png","static/assets/208f28114c3654417aae9f71542d1670.png","static/assets/6b8350e1c4fcb14dddb1c4bac60690fc.png","static/assets/dd70a6d9adb5f52d0cbd0115887691eb.png","static/assets/1a086f192347214d507e8373d05481bd.svg","static/assets/55fbbef2dfcc37fb22658e968cda0a67.png","static/assets/51e22c71c1668188b5a3ddd9dc391ff6.svg","static/assets/4b52903ed5677ad3e0b820668ddb37c9.svg","static/assets/f2b55dc8ec1ae9e4a5c72088a185dad2.svg","static/assets/e8cd6294973f94c475ed746e4899fa33.svg","static/assets/414ef5f96bd00df3c7b4e175244ddaf3.png","static/assets/e48e8bc4ca2913e19da20f085e9adbe9.svg","static/assets/a8c1fa685a05ebc7d9ced4a1fabce2ec.png","static/assets/ff2dc3c9ffca9e8097e82e3ff64b5955.png","static/assets/ac1b57b4a9b09160349eb2d7882ca15f.svg","static/assets/7b7fd92f837f3b1368bb7cd709b24ebd.svg","static/assets/57f5c040b2ec7c6f269042b4e1c32a03.png","static/assets/ad2841e0f0228e47e911a5b571480f7c.svg","static/assets/bf2e5bd090012d68560b888d44678efc.svg","static/assets/7455bbbfec01551f145bced3f729f105.png","static/assets/73077ae1577fa8af2e8544e19e447491.png","static/assets/49a8736bf7fbb79e2469272f127e06d3.svg","static/assets/7a4510ab192e5a0bd0b1186db1396bce.svg","static/assets/2be1a9bef13cda38a249cfa6de0dc461.svg","static/assets/13fca624022cc8f762e1da20450c8f03.svg","static/assets/cf21e9b36c0dfd5debc399d6fbf5d2c9.svg","static/assets/306abcf3a285c1d279e1fed22bd74a5c.svg","static/assets/93259f95026260bc06f83d29d3b89115.svg","static/assets/78d464ee4e15000ce44b841ff2f4c518.png","static/assets/3fc5bb5bf0381947df17be6225e1cb26.png","static/assets/c7ffd288176b935f835311512a224d4b.svg","static/assets/d6f130fb79e78e4dd351fd930e742bcc.png","static/assets/f40501ed87782097b1a4eec8747eb84a.png","static/assets/b6162ffbfe48d4b6c67f0b469f1615ae.png","static/assets/8631e81b32644527d0d056b213faddc8.svg","static/assets/5e8eccd5a576638f029a1ed2deb4784b.svg","static/assets/a03436c2c26c934fc0a7997065971874.png","static/assets/7130491bf33852e50503dcb4024c0279.svg","static/assets/5f7a79af3db62e0f5b7306ac0bd5ebf9.svg","static/assets/0f9efe3bd6e80747dfa3aeb9e19997b5.svg","static/assets/f011f09e649e804c4c0c8275a7d1ba5b.png","static/assets/48d66af328a669a1c84c5dc87a4e9a3b.ttf","static/assets/4c768843c9fa6593074231cd762b83f8.ttf","static/assets/5f46c8dc3b8cc2296eb73f013dfce3db.ttf","static/assets/87a3a62c0627e925b92d3ede2f62b04f.ttf","static/assets/eb64e706eb7a3b324ba50d3279a980b1.ttf","static/assets/3682b35e452a7f4a5a61167d1632e24a.ttf","static/assets/8d83d454d2c42614a203322393c23a5b.ttf","static/assets/9ec3449723269a806ec6eaba0f8f6cef.ttf","static/assets/74496d9086d97aaeeafb3085e9957668.ttf","static/assets/61edf73198617b2326d37f232b8abd6f.otf","static/assets/8996930d8e83f63cc3341172205df460.otf","static/assets/bb59f04e7f0aabe8e142ac1607a03dd6.otf","static/assets/368c582b289e75a3c5299e954c2ad735.ttf","static/assets/64bcfe1f13fce38e2ea26280157ff2ce.ttf","js/0.js","js/1.js","js/2.js","js/addon-default-entry.js","js/addon-entry-2d-color-picker.js","js/addon-entry-better-img-uploads.js","js/addon-entry-block-count.js","js/addon-entry-block-palette-icons.js","js/addon-entry-blocks2image.js","js/addon-entry-cat-blocks.js","js/addon-entry-clones.js","js/addon-entry-columns.js","js/addon-entry-custom-block-shape.js","js/addon-entry-custom-block-text.js","js/addon-entry-custom-zoom.js","js/addon-entry-debugger.js","js/addon-entry-default-costume-editor-color.js","js/addon-entry-disable-paste-offset.js","js/addon-entry-disable-stage-drag-select.js","js/addon-entry-editor-buttons-reverse-order.js","js/addon-entry-editor-colored-context-menus.js","js/addon-entry-editor-extra-keys.js","js/addon-entry-editor-sounds.js","js/addon-entry-editor-stage-left.js","js/addon-entry-editor-theme3.js","js/addon-entry-fullscreen.js","js/addon-entry-gamepad.js","js/addon-entry-hide-delete-button.js","js/addon-entry-hide-flyout.js","js/addon-entry-hide-new-variables.js","js/addon-entry-hide-stage.js","js/addon-entry-initialise-sprite-position.js","js/addon-entry-load-extensions.js","js/addon-entry-mediarecorder.js","js/addon-entry-mouse-pos.js","js/addon-entry-no-script-bumping.js","js/addon-entry-number-pad.js","js/addon-entry-paint-by-default.js","js/addon-entry-paint-snap.js","js/addon-entry-remove-curved-stage-border.js","js/addon-entry-remove-sprite-confirm.js","js/addon-entry-script-snap.js","js/addon-entry-search-sprites.js","js/addon-entry-sprite-properties.js","js/addon-entry-swap-local-global.js","js/addon-entry-transparent-orphans.js","js/addon-entry-tw-disable-cloud-variables.js","js/addon-entry-tw-remove-backpack.js","js/addon-entry-tw-remove-feedback.js","js/addon-entry-tw-straighten-comments.js","js/addon-entry-vol-slider.js","js/addon-entry-zebra-striping.js","js/addon-l10n-de.js","js/addon-l10n-es.js","js/addon-l10n-fr.js","js/addon-l10n-hu.js","js/addon-l10n-it.js","js/addon-l10n-ja.js","js/addon-l10n-ko.js","js/addon-l10n-nl.js","js/addon-l10n-pl.js","js/addon-l10n-pt.js","js/addon-l10n-ro.js","js/addon-l10n-ru.js","js/addon-l10n-sl.js","js/addon-l10n-tr.js","js/addon-settings.js","js/addon-settings~addons~editor~fullscreen~player~playground.js","js/addons.js","js/editor.js","js/fullscreen.js","js/player.js","js/playground.js","js/sb.js","js/vendors~addon-settings~credits~editor~embed~fullscreen~player~playground.js","js/vendors~addon-settings~credits~editor~embed~fullscreen~playground.js","js/vendors~editor~embed~fullscreen~player~playground.js","static/blocks-media/arrow-down.svg","static/blocks-media/async.svg","static/blocks-media/blue-flag.svg","static/blocks-media/checkmark-dark.svg","static/blocks-media/checkmark.svg","static/blocks-media/click.mp3","static/blocks-media/click.ogg","static/blocks-media/click.wav","static/blocks-media/comment-arrow-down.svg","static/blocks-media/comment-arrow-up.svg","static/blocks-media/delete-x.svg","static/blocks-media/delete.mp3","static/blocks-media/delete.ogg","static/blocks-media/delete.wav","static/blocks-media/dropdown-arrow-dark.svg","static/blocks-media/dropdown-arrow.svg","static/blocks-media/eyedropper.svg","static/blocks-media/green-flag.svg","static/blocks-media/handclosed.cur","static/blocks-media/handdelete.cur","static/blocks-media/handopen.cur","static/blocks-media/polygon-colapse.svg","static/blocks-media/polygon-expand.svg","static/blocks-media/repeat.svg","static/blocks-media/rotate-left.svg","static/blocks-media/rotate-right.svg","static/blocks-media/sprites.png","static/blocks-media/status-not-ready.svg","static/blocks-media/status-ready.svg","static/blocks-media/zoom-in.svg","static/blocks-media/zoom-out.svg","static/blocks-media/zoom-reset.svg","static/blocks-media/extensions/music-block-icon.svg","static/blocks-media/extensions/pen-block-icon.svg","static/blocks-media/icons/arrow.svg","static/blocks-media/icons/arrow_button.svg","static/blocks-media/icons/control_forever.svg","static/blocks-media/icons/control_repeat.svg","static/blocks-media/icons/control_stop.svg","static/blocks-media/icons/control_wait.svg","static/blocks-media/icons/remove.svg"]; +const LAZY_ASSETS_NAME = "tw-lazy-bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f"; + +const knownCaches = [ + LAZY_ASSETS_NAME +]; +const base = location.pathname.substr(0, location.pathname.indexOf('sw.js')); + +self.addEventListener('install', event => { + self.skipWaiting(); + event.waitUntil(caches.open(LAZY_ASSETS_NAME).then(cache => cache.addAll(HTML_ASSETS))); +}); + +self.addEventListener('activate', event => { + event.waitUntil( + caches.keys().then(keys => Promise.all(keys.filter(i => !knownCaches.includes(i)).map(i => caches.delete(i)))) + ); +}); + +self.addEventListener('fetch', event => { + const url = new URL(event.request.url); + if (url.origin !== location.origin) return; + if (event.request.method !== 'GET') return; + + let relativePathname = url.pathname.substr(base.length); + if (/^(\d+\/?)?$/.test(relativePathname)) { + relativePathname = 'index.html'; + } else if (/^(\d+\/)?editor\/?$/i.test(relativePathname)) { + relativePathname = 'editor.html'; + } else if (/^(\d+\/)?playground\/?$/i.test(relativePathname)) { + relativePathname = 'playground.html'; + } else if (/^(\d+\/)?fullscreen\/?$/i.test(relativePathname)) { + relativePathname = 'fullscreen.html'; + } else if (/^addons\/?$/i.test(relativePathname)) { + relativePathname = 'addons.html'; + } + + if (HTML_ASSETS.includes(relativePathname)) { + event.respondWith( + fetch(event.request).catch(() => caches.match(new Request(relativePathname))) + ); + } else if (LAZY_ASSETS.includes(relativePathname)) { + event.respondWith( + caches.open(LAZY_ASSETS_NAME).then(cache => cache.match(new Request(relativePathname)).then(response => ( + response || fetch(event.request).then(networkResponse => { + cache.put(event.request, networkResponse.clone()); + return networkResponse; + }) + ))) + ); + } +}); diff --git a/terms.html b/terms.html new file mode 100644 index 0000000000000000000000000000000000000000..a877064abdc7db67c70385015ab887072bfdb4ac --- /dev/null +++ b/terms.html @@ -0,0 +1,39 @@ + + + + PenguinMod - Terms of Service + + + + + + +
+

Terms of Service

+
+ +
+

We've moved pages

+ Click here to see the new page. +
+ + diff --git a/wait.html b/wait.html new file mode 100644 index 0000000000000000000000000000000000000000..b73eb5c8d6ebeaf70b633fc3a95f9ff579bc6d91 --- /dev/null +++ b/wait.html @@ -0,0 +1,11 @@ + + + + + + Please Wait + + +

Please wait...

+ + \ No newline at end of file