From 5e885bc892383fc92096a0c4b7af61821099b0cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Spriggs?= Date: Mon, 22 Jun 2026 16:35:33 -0400 Subject: [PATCH 1/8] docs: remove old codelab and start new getting-started codelab --- .../add-blockly-libraries.mdx | 46 + .../OLD-getting-started/codelab-overview.mdx | 46 + .../complete-code/index.html | 63 + .../complete-code/scripts/main.js | 102 + .../complete-code}/scripts/music_maker.js | 0 .../complete-code/scripts/sound_blocks.js | 34 + .../complete-code}/sounds/c4.m4a | Bin .../complete-code}/sounds/c5.m4a | Bin .../complete-code}/sounds/d4.m4a | Bin .../complete-code}/sounds/e4.m4a | Bin .../complete-code}/sounds/f4.m4a | Bin .../complete-code}/sounds/g4.m4a | Bin .../complete-code}/styles/index.css | 0 .../create-a-blockly-workspace.mdx | 107 + .../create-a-custom-block.mdx | 112 + .../OLD-getting-started/explore-the-app.mdx | 33 + .../generate-javaScript-code.mdx | 50 + .../run-generated-code.mdx | 73 + .../save-load-workspace.mdx | 53 + .../codelabs/OLD-getting-started/setup.mdx | 35 + .../starter-code/index.html | 0 .../starter-code/scripts/main.js | 0 .../starter-code/scripts/music_maker.js | 21 + .../starter-code/sounds/c4.m4a | Bin 0 -> 8833 bytes .../starter-code/sounds/c5.m4a | Bin 0 -> 8635 bytes .../starter-code/sounds/d4.m4a | Bin 0 -> 8509 bytes .../starter-code/sounds/e4.m4a | Bin 0 -> 8454 bytes .../starter-code/sounds/f4.m4a | Bin 0 -> 8530 bytes .../starter-code/sounds/g4.m4a | Bin 0 -> 8306 bytes .../starter-code/styles/index.css | 75 + .../codelabs/OLD-getting-started/the-end.mdx | 14 + .../getting-started/add-blockly-libraries.mdx | 44 +- .../getting-started/codelab-overview.mdx | 15 +- .../getting-started/explore-the-app.mdx | 28 +- .../docs/codelabs/getting-started/setup.mdx | 12 +- .../starter-code/dist/bundle.js | 2 + .../starter-code/dist/bundle.js.LICENSE.txt | 11 + .../starter-code/dist/index.html | 1 + .../starter-code/package-lock.json | 5638 +++++++++++++++++ .../getting-started/starter-code/package.json | 29 + .../starter-code/src/blocks/text.js | 35 + .../starter-code/src/generators/javascript.js | 30 + .../starter-code/src/index.css | 40 + .../starter-code/src/index.html | 16 + .../getting-started/starter-code/src/index.js | 62 + .../starter-code/src/serialization.js | 32 + .../starter-code/src/toolbox.js | 629 ++ .../starter-code/webpack.config.js | 59 + 48 files changed, 7490 insertions(+), 57 deletions(-) create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/add-blockly-libraries.mdx create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/codelab-overview.mdx create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/complete-code/index.html create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/main.js rename packages/docs/docs/codelabs/{getting-started/starter-code => OLD-getting-started/complete-code}/scripts/music_maker.js (100%) create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/sound_blocks.js rename packages/docs/docs/codelabs/{getting-started/starter-code => OLD-getting-started/complete-code}/sounds/c4.m4a (100%) rename packages/docs/docs/codelabs/{getting-started/starter-code => OLD-getting-started/complete-code}/sounds/c5.m4a (100%) rename packages/docs/docs/codelabs/{getting-started/starter-code => OLD-getting-started/complete-code}/sounds/d4.m4a (100%) rename packages/docs/docs/codelabs/{getting-started/starter-code => OLD-getting-started/complete-code}/sounds/e4.m4a (100%) rename packages/docs/docs/codelabs/{getting-started/starter-code => OLD-getting-started/complete-code}/sounds/f4.m4a (100%) rename packages/docs/docs/codelabs/{getting-started/starter-code => OLD-getting-started/complete-code}/sounds/g4.m4a (100%) rename packages/docs/docs/codelabs/{getting-started/starter-code => OLD-getting-started/complete-code}/styles/index.css (100%) create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/create-a-blockly-workspace.mdx create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/create-a-custom-block.mdx create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/explore-the-app.mdx create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/generate-javaScript-code.mdx create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/run-generated-code.mdx create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/save-load-workspace.mdx create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/setup.mdx rename packages/docs/docs/codelabs/{getting-started => OLD-getting-started}/starter-code/index.html (100%) rename packages/docs/docs/codelabs/{getting-started => OLD-getting-started}/starter-code/scripts/main.js (100%) create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/scripts/music_maker.js create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/c4.m4a create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/c5.m4a create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/d4.m4a create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/e4.m4a create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/f4.m4a create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/g4.m4a create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/styles/index.css create mode 100644 packages/docs/docs/codelabs/OLD-getting-started/the-end.mdx create mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js create mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js.LICENSE.txt create mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/dist/index.html create mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/package-lock.json create mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/package.json create mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/src/blocks/text.js create mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/src/generators/javascript.js create mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/src/index.css create mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/src/index.html create mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/src/index.js create mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/src/serialization.js create mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js create mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/webpack.config.js diff --git a/packages/docs/docs/codelabs/OLD-getting-started/add-blockly-libraries.mdx b/packages/docs/docs/codelabs/OLD-getting-started/add-blockly-libraries.mdx new file mode 100644 index 00000000000..6603041dbee --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/add-blockly-libraries.mdx @@ -0,0 +1,46 @@ +--- +description: How to add Blockly libraries to an app. +--- + +# Getting started with Blockly + +## 4. Add Blockly libraries + +Now that you know what you'll be building, you need to add Blockly dependencies to your app. + +Blockly releases are [published on npm](https://www.npmjs.com/package/blockly) on a quarterly basis. For this codelab you will import blockly using [unpkg](https://unpkg.com), which lets you import all of the files you need with a single script tag. + +### Add the script tag + +Open `starter-code/index.html` in a text editor and scroll to the end. You can see two script tags: + +```html + + +``` + +Add Blockly just before these two scripts. The order is important, because you will use Blockly objects later in `main.js`. Your imports should now look like this: + +```html + + + + + + +``` + +### Default imports + +Importing Blockly this way loads four default modules. + +- Blockly core: The main Blockly library, which defines the basic Blockly UI and logic. +- Built-in block definitions: Common blocks such as loops, logic, math, and string manipulation. +- The JavaScript generator: Converts blocks into JavaScript, and contains block generators for all built-in blocks. +- English language files: String tables for all messages on built-in blocks and the Blockly UI, in English. + +### Alternate imports + +There are many ways to import a library in JavaScript, and this tutorial does not cover all of them. For samples that show how to integrate Blockly in your project, look at the `examples` folder in [blockly-samples](https://github.com/RaspberryPiFoundation/blockly-samples). + +You can also define your imports more carefully to get [different generators](https://www.npmjs.com/package/blockly#blockly-generators) and [locales](https://www.npmjs.com/package/blockly#blockly-languages). diff --git a/packages/docs/docs/codelabs/OLD-getting-started/codelab-overview.mdx b/packages/docs/docs/codelabs/OLD-getting-started/codelab-overview.mdx new file mode 100644 index 00000000000..72d6ea81606 --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/codelab-overview.mdx @@ -0,0 +1,46 @@ +--- +pagination_prev: null +description: Overview of the "Getting started with Blockly" codelab. +--- + +import Image from '@site/src/components/Image'; + +# Getting started with Blockly + +## 1. Codelab overview + +### What you'll learn + +This codelab will teach you how to modify a simple web app to include the [Blockly](/blockly) visual programming library. + +### What is Blockly? + +Blockly is a library for building block programming apps. + +Block programming allows users to create scripts and programs by using visual blocks, even if they do not know any programming language. + +Blockly includes everything you need for defining and rendering blocks in a drag-n-drop editor. Each block represents a chunk of code that can be easily stacked and translated into code. + +### What you'll build + +MusicMaker, a web app where you can program buttons to play different sounds, using Blockly. + +image + +image + +### What you'll need + +- A browser +- A text editor +- Basic knowledge of HTML, CSS and JavaScript + +This codelab is focused on Blockly. The app structure, non-relevant concepts and code are glossed over and are provided for you to simply copy and paste. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/index.html b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/index.html new file mode 100644 index 00000000000..a6c95524da4 --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/index.html @@ -0,0 +1,63 @@ + + + + + + + + Blockly for the Web Codelab + + + + + + +
+

Music Maker

+

Music Maker Configuration

+
+ +
+ + + +

+ Tap any button to edit its code.
When complete, press Done. +

+ +
+
+
1
+
2
+
3
+
+
+
4
+
5
+
6
+
+
+
7
+
8
+
9
+
+
+ +
+
+
+
+ + + + + + + + + + diff --git a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/main.js b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/main.js new file mode 100644 index 00000000000..e1a54cd71d2 --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/main.js @@ -0,0 +1,102 @@ +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +(function () { + let currentButton; + + function handlePlay(event) { + loadWorkspace(event.target); + let code = javascript.javascriptGenerator.workspaceToCode( + Blockly.getMainWorkspace(), + ); + code += 'MusicMaker.play();'; + // Eval can be dangerous. For more controlled execution, check + // https://github.com/NeilFraser/JS-Interpreter. + try { + eval(code); + } catch (error) { + console.log(error); + } + } + + function loadWorkspace(button) { + const workspace = Blockly.getMainWorkspace(); + if (button.blocklySave) { + Blockly.serialization.workspaces.load(button.blocklySave, workspace); + } else { + workspace.clear(); + } + } + + function save(button) { + button.blocklySave = Blockly.serialization.workspaces.save( + Blockly.getMainWorkspace(), + ); + } + + function handleSave() { + document.body.setAttribute('mode', 'edit'); + save(currentButton); + } + + function enableEditMode() { + document.body.setAttribute('mode', 'edit'); + document.querySelectorAll('.button').forEach((btn) => { + btn.removeEventListener('click', handlePlay); + btn.addEventListener('click', enableBlocklyMode); + }); + } + + function enableMakerMode() { + document.body.setAttribute('mode', 'maker'); + document.querySelectorAll('.button').forEach((btn) => { + btn.addEventListener('click', handlePlay); + btn.removeEventListener('click', enableBlocklyMode); + }); + } + + function enableBlocklyMode(e) { + document.body.setAttribute('mode', 'blockly'); + currentButton = e.target; + loadWorkspace(currentButton); + } + + document.querySelector('#edit').addEventListener('click', enableEditMode); + document.querySelector('#done').addEventListener('click', enableMakerMode); + document.querySelector('#save').addEventListener('click', handleSave); + + enableMakerMode(); + + const toolbox = { + kind: 'flyoutToolbox', + contents: [ + { + kind: 'block', + type: 'controls_repeat_ext', + inputs: { + TIMES: { + shadow: { + type: 'math_number', + fields: { + NUM: 5, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'play_sound', + }, + ], + }; + + Blockly.inject('blocklyDiv', { + toolbox: toolbox, + scrollbars: false, + horizontalLayout: true, + toolboxPosition: 'end', + }); +})(); diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/scripts/music_maker.js b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/music_maker.js similarity index 100% rename from packages/docs/docs/codelabs/getting-started/starter-code/scripts/music_maker.js rename to packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/music_maker.js diff --git a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/sound_blocks.js b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/sound_blocks.js new file mode 100644 index 00000000000..81101c1051f --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/sound_blocks.js @@ -0,0 +1,34 @@ +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +Blockly.defineBlocksWithJsonArray([ + // Block for colour picker. + { + type: 'play_sound', + message0: 'Play %1', + args0: [ + { + type: 'field_dropdown', + name: 'VALUE', + options: [ + ['C4', 'sounds/c4.m4a'], + ['D4', 'sounds/d4.m4a'], + ['E4', 'sounds/e4.m4a'], + ['F4', 'sounds/f4.m4a'], + ['G4', 'sounds/g4.m4a'], + ], + }, + ], + previousStatement: null, + nextStatement: null, + colour: 355, + }, +]); + +javascript.javascriptGenerator.forBlock['play_sound'] = function (block) { + const value = "'" + block.getFieldValue('VALUE') + "'"; + return 'MusicMaker.queueSound(' + value + ');\n'; +}; diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/sounds/c4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/c4.m4a similarity index 100% rename from packages/docs/docs/codelabs/getting-started/starter-code/sounds/c4.m4a rename to packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/c4.m4a diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/sounds/c5.m4a b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/c5.m4a similarity index 100% rename from packages/docs/docs/codelabs/getting-started/starter-code/sounds/c5.m4a rename to packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/c5.m4a diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/sounds/d4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/d4.m4a similarity index 100% rename from packages/docs/docs/codelabs/getting-started/starter-code/sounds/d4.m4a rename to packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/d4.m4a diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/sounds/e4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/e4.m4a similarity index 100% rename from packages/docs/docs/codelabs/getting-started/starter-code/sounds/e4.m4a rename to packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/e4.m4a diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/sounds/f4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/f4.m4a similarity index 100% rename from packages/docs/docs/codelabs/getting-started/starter-code/sounds/f4.m4a rename to packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/f4.m4a diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/sounds/g4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/g4.m4a similarity index 100% rename from packages/docs/docs/codelabs/getting-started/starter-code/sounds/g4.m4a rename to packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/g4.m4a diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/styles/index.css b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/styles/index.css similarity index 100% rename from packages/docs/docs/codelabs/getting-started/starter-code/styles/index.css rename to packages/docs/docs/codelabs/OLD-getting-started/complete-code/styles/index.css diff --git a/packages/docs/docs/codelabs/OLD-getting-started/create-a-blockly-workspace.mdx b/packages/docs/docs/codelabs/OLD-getting-started/create-a-blockly-workspace.mdx new file mode 100644 index 00000000000..8bb02afa643 --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/create-a-blockly-workspace.mdx @@ -0,0 +1,107 @@ +--- +description: How to add a workspace to your app. +--- + +import Image from '@site/src/components/Image'; + +# Getting started with Blockly + +## 5. Create a Blockly workspace + +In this section you will learn how to add a workspace to your app, including how to define a toolbox. + +### Parts of Blockly + +A Blockly workspace has two main components: + +- The area where the user assembles their blocks (the white area). +- A toolbox that contains all blocks that are available to the user (the grey area). + +image + +The toolbox may be organized into categories, and may contain both single blocks and groups of blocks. A well-organized toolbox helps the user to explore the available blocks and understand the capabilities of the underlying system. + +A toolbox is defined as a JavaScript object and passed into the workspace constructor through an options struct. + +For more information on this JSON format and toolbox configuration, including category creation, please see our toolbox documentation. + +### Define the toolbox + +Open up `scripts/main.js` and scroll down to the end of the file. Then add the code for your `toolbox` definition just after the call to `enableMakerMode()`: + +```js +const toolbox = { + kind: 'flyoutToolbox', + contents: [ + { + kind: 'block', + type: 'controls_repeat_ext', + inputs: { + TIMES: { + shadow: { + type: 'math_number', + fields: { + NUM: 5, + }, + }, + }, + }, + }, + ], +}; +``` + +This JavaScript object defines a toolbox with a single "repeat loop" block. + +### Injection + +Adding a Blockly workspace to a page is called _injection_, because the workspace is injected into a `div` that already exists on the page. + +To do this you call the function `Blockly.inject(container, options)`, which takes two arguments: + +- `container` is where the Blockly workspace should be placed on the page. It can be an `Element`, an ID string, or a CSS selector. +- `options` is a dictionary of configuration options. + +For this codelab we will inject into a div with the id `"blocklyDiv"`, which you can find in `index.html`: + +```html +
+``` + +### Create the workspace + +Now add code to inject the Blockly editor just after the code you used to define your toolbox: + +```js +Blockly.inject('blocklyDiv', { + toolbox: toolbox, + scrollbars: false, + horizontalLayout: true, + toolboxPosition: 'end', +}); +``` + +Let's look at the options we used to initialize your blockly editor: + +- `toolbox`: A JavaScript object which defines the toolbox for the editor. +- `scrollbars`: Whether to show scrollbars in the workspace. +- `horizontalLayout`: Whether to display the toolbox horizontally or vertically in the workspace. +- `toolboxPosition`: Whether to show the toolbox at the top or bottom of the workspace. + +The `options` struct gives you significant control over your Blockly instance. You can pass options to set Blockly's theme, modify scrolling behaviour, set the renderer, and more. For more information, head over to Blockly's developer site and check out the [configuration](/guides/configure/configuration_struct#the-options-dictionary) section. + +### Check your work + +Now refresh the page. Select the EDIT mode, then tap on one of the buttons. You should see a Blockly editor: + +image + +Drag and drop the available loop block to the workspace to test it out. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/create-a-custom-block.mdx b/packages/docs/docs/codelabs/OLD-getting-started/create-a-custom-block.mdx new file mode 100644 index 00000000000..3b1787d33cb --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/create-a-custom-block.mdx @@ -0,0 +1,112 @@ +--- +description: How to create a custom block. +--- + +import Image from '@site/src/components/Image'; + +# Getting started with Blockly + +## 6. Create a custom block + +Since this is a music maker app, we want a block that plays sounds. We could create one block per sound, but instead we will create a single block with a dropdown to select which note to play: + +image + +In Blockly, a _block definition_ describes how a block looks and behaves. This includes its text, colour, and shape. It may also include which other blocks it can connect to. + +Blocks can be defined in either JavaScript or JSON. The developer site has a full article on [how to define a block](/guides/create-custom-blocks/define/block-definitions#how-to-create-block-definitions). + +In this codelab we will simply provide the block definition for you to copy and use. + +### Define the sound block + +Create a JS file to define a new "play sound" block: + +1. Add `sound_blocks.js` file in the `scripts` directory. +1. Add the following code to `sound_blocks.js`: + +```js +Blockly.common.defineBlocksWithJsonArray([ + { + type: 'play_sound', + message0: 'Play %1', + args0: [ + { + type: 'field_dropdown', + name: 'VALUE', + options: [ + ['C4', 'sounds/c4.m4a'], + ['D4', 'sounds/d4.m4a'], + ['E4', 'sounds/e4.m4a'], + ['F4', 'sounds/f4.m4a'], + ['G4', 'sounds/g4.m4a'], + ], + }, + ], + previousStatement: null, + nextStatement: null, + colour: 355, + }, +]); +``` + +Add a script tag to `index.html` to include your new block definition: + +```html + +``` + +Your sound block definitions must come after importing Blockly and before the other imports, since you will use Blockly functions in this file, and you will be using functions from this file in later files. Your imports should now look like this: + +```html + + + + +``` + +### Add the sound block to the toolbox + +Now we can update the toolbox to include the new sound block, by adding `{'kind': 'block', 'type': 'play_sound'}` to our `toolbox` definition: + +```js +const toolbox = { + kind: 'flyoutToolbox', + contents: [ + { + kind: 'block', + type: 'controls_repeat_ext', + inputs: { + TIMES: { + shadow: { + type: 'math_number', + fields: { + NUM: 5, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'play_sound', + }, + ], +}; +``` + +Run the app one more time, and play around with the new `Play (sound)` block. It should look like this: + +image + +### The block factory + +This step discussed how to manually define custom blocks in Blockly. Once you've completed the entire codelab, we recommend that you check out our [block factory tool](/guides/create-custom-blocks/blockly-developer-tools), which helps automate part of this process. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/explore-the-app.mdx b/packages/docs/docs/codelabs/OLD-getting-started/explore-the-app.mdx new file mode 100644 index 00000000000..ef864e56e69 --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/explore-the-app.mdx @@ -0,0 +1,33 @@ +--- +description: Explore Blockly's getting started app. +--- + +import Image from '@site/src/components/Image'; + +# Getting started with Blockly + +## 3. Explore the app + +To run the app, simply open `starter-code/index.html` in a browser. + +### Play Mode + +By default, the app launches in "**Play Mode**". In this mode, you can see 9 buttons. None of them can do anything yet. The idea is to let the user define custom behaviors for each button, using Blockly. + +image + +### Edit mode + +By tapping the **EDIT** button, you can switch to edit mode. In this mode, tapping a button will display an editor, which is where you can program how sounds should play for that button. For now, the editor screen is empty. + +image + +You can go back to the play mode by tapping **SAVE** and then **DONE** buttons. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/generate-javaScript-code.mdx b/packages/docs/docs/codelabs/OLD-getting-started/generate-javaScript-code.mdx new file mode 100644 index 00000000000..ad874d7a640 --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/generate-javaScript-code.mdx @@ -0,0 +1,50 @@ +--- +description: How to generate JavaScript code. +--- + +import Image from '@site/src/components/Image'; + +# Getting started with Blockly + +## 8. Generate JavaScript code + +Now that each button can be configured with its own Blockly workspace, the next thing we want to do is to generate JavaScript code from each workspace. + +This generated code will be run by the browser, effectively executing the blocks set up in the Blockly workspace. + +### The language generator + +Blockly can generate code from blocks for different languages, e.g. JavaScript, Python, or PHP. + +A _language generator_ defines the rules for generating a specific language (such as indentation). Because we are using the default imports, we don't need to add any new code to get the JavaScript generator. + +As previously mentioned, you can define your imports more carefully to get a [different generator](https://www.npmjs.com/package/blockly#blockly-generators). + +### Add a block generator + +When Blockly generates JavaScript code for blocks in a workspace, it translates each block into code. By default, it knows how to translate all library-provided default blocks into JavaScript code. However, for any custom blocks, we need to specify our own translation functions. These are called _block generators_. + +Add the following code to the bottom of `scripts/sound_blocks.js`: + +```js +javascript.javascriptGenerator.forBlock['play_sound'] = function (block) { + let value = "'" + block.getFieldValue('VALUE') + "'"; + return 'MusicMaker.queueSound(' + value + ');\n'; +}; +``` + +With this translation function, the following `play_sound` block: + +image + +translates into the JavaScript code: + +```javascript +MusicMaker.queueSound('Sounds/c4.m4a'); +``` + +For more information on block generators, read the [generating code](/guides/create-custom-blocks/code-generation/overview#block-code-generators) page on the developer site. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/run-generated-code.mdx b/packages/docs/docs/codelabs/OLD-getting-started/run-generated-code.mdx new file mode 100644 index 00000000000..52a6986dd3a --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/run-generated-code.mdx @@ -0,0 +1,73 @@ +--- +description: How to run generated code. +--- + +import Image from '@site/src/components/Image'; + +# Getting started with Blockly + +## 9. Run generated code + +Most of your work so far has been in the **Edit** mode. Now you will update the **Play** mode to actually execute the custom code associated with each block. + +The function `handlePlay` is already defined in `scripts/main.js`, but it's empty. Load the workspace content associated with the pressed button: + +```js +loadWorkspace(event.target); +``` + +Next, you need to generate the code out of that workspace, which you can do with a call to `javascript.javascriptGenerator.workspaceToCode`. + +The user's code will consist of many `MusicMaker.queueSound` calls. At the end of our generated script, add a call to `MusicMaker.play` to play all the sounds added to the queue: + +```js +let code = javascript.javascriptGenerator.workspaceToCode( + Blockly.getMainWorkspace(), +); +code += 'MusicMaker.play();'; +``` + +Finally, execute the script with the `eval` function. Wrap it in a `try/catch` so that any runtime errors are logged to the console, instead of failing quietly: + +```js +try { + eval(code); +} catch (error) { + console.log(error); +} +``` + +### The full code + +The end result should look like this: + +```js +function handlePlay(event) { + loadWorkspace(event.target); + let code = javascript.javascriptGenerator.workspaceToCode( + Blockly.getMainWorkspace(), + ); + code += 'MusicMaker.play();'; + try { + eval(code); + } catch (error) { + console.log(error); + } +} +``` + +### A note on eval + +Executing scripts with eval is not always the safest option - we use it here for simplicity. If you intend to run the user's blocks in production, check out the JS Interpreter project. This project is separate from Blockly, but was specifically written for Blockly. + +### Test it + +Run the app and try it out! Edit one of the buttons to play a D4 sound 3 times: + +image + +Save and exit the edit mode. Now if you tap this button, you should hear the D4 sound played 3 times. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/save-load-workspace.mdx b/packages/docs/docs/codelabs/OLD-getting-started/save-load-workspace.mdx new file mode 100644 index 00000000000..039ea389558 --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/save-load-workspace.mdx @@ -0,0 +1,53 @@ +--- +description: How to save and load your workspace. +--- + +# Getting started with Blockly + +## 7. Save/load workspace + +You now have a Blockly workspace that appears when editing a button. The user can use this to write code, but there's no link between the code the user has written and an individual button on the page. + +Once the button behavior is defined by the user, it needs to be saved for later use. The saved code must be per button, since buttons can be programmed to play different sounds. + +### Add the save method + +Open `scripts/main.js`. Add the following code to the `save()` method: + +```js +button.blocklySave = Blockly.serialization.workspaces.save( + Blockly.getMainWorkspace(), +); +``` + +`workspaces.save` takes the Blockly workspace, exports its state to a JavaScript object and stores it in a `blocklySave` property on the button. This way the exported state for the block sequence gets associated with a particular button. + +### Add the load method + +Similarly, when a user opens the editor, the blocks previously associated with this button should get loaded into the workspace. + +In the `scripts/main.js `file, add `loadWorkspace` function: + +``` +function loadWorkspace(button) { + const workspace = Blockly.getMainWorkspace(); + if (button.blocklySave) { + Blockly.serialization.workspaces.load(button.blocklySave, workspace); + } else { + workspace.clear(); + } +} +``` + +This loads the blocks stored on the button that was clicked back into the workspace. + +Call this function from the end of the function `enableBlocklyMode`: + +``` +function enableBlocklyMode(e) { + ... + loadWorkspace(currentButton); +} +``` + +Now, test the code. Edit the workspace for one of the buttons, add some blocks, save it, and reopen it. The workspace should still contain the blocks you added. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/setup.mdx b/packages/docs/docs/codelabs/OLD-getting-started/setup.mdx new file mode 100644 index 00000000000..bb1b653ee7d --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/setup.mdx @@ -0,0 +1,35 @@ +--- +description: Setting up the "Getting started with Blockly" codelab. +--- + +# Getting started with Blockly + +## 2. Setup + +### Download the sample code + +You can get the sample code for this code by either downloading the zip here: + +[Download zip](https://github.com/RaspberryPiFoundation/blockly/archive/main.zip) + +or by cloning this git repo: + +```bash +git clone https://github.com/RaspberryPiFoundation/blockly.git +``` + +If you downloaded the source as a zip, unpacking it should give you a root folder named `blockly-main`. + +The relevant files are in `docs/docs/codelabs/getting-started`. There are two versions of the app: + +- `starter-code/`: The starter code that you'll build upon in this codelab. +- `complete-code/`: The code after completing the codelab, in case you get lost or want to compare to your version. + +Each folder contains: + +- `scripts/` + - `main.js` - The main logic for the app. In the starter project it has all the code needed to navigate and switch between views in the basic app. + - `music_maker.js` - A small library to play sounds. We will use it to actually play sounds in the browser. +- `sounds/` - Sound files for various notes +- `styles/` - The app's CSS +- `index.html` - The app's index page. diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/index.html b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/index.html similarity index 100% rename from packages/docs/docs/codelabs/getting-started/starter-code/index.html rename to packages/docs/docs/codelabs/OLD-getting-started/starter-code/index.html diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/scripts/main.js b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/scripts/main.js similarity index 100% rename from packages/docs/docs/codelabs/getting-started/starter-code/scripts/main.js rename to packages/docs/docs/codelabs/OLD-getting-started/starter-code/scripts/main.js diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/scripts/music_maker.js b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/scripts/music_maker.js new file mode 100644 index 00000000000..7959de10a83 --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/scripts/music_maker.js @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +const MusicMaker = { + queue_: [], + player_: new Audio(), + queueSound: function (soundUrl) { + this.queue_.push(soundUrl); + }, + play: function () { + const next = this.queue_.shift(); + if (next) { + this.player_.src = next; + this.player_.play(); + } + }, +}; + +MusicMaker.player_.addEventListener('ended', MusicMaker.play.bind(MusicMaker)); diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/c4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/c4.m4a new file mode 100644 index 0000000000000000000000000000000000000000..33941cfae1550c1971a1713664e5f41cbd74531c GIT binary patch literal 8833 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 C(LC1x literal 0 HcmV?d00001 diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/c5.m4a b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/c5.m4a new file mode 100644 index 0000000000000000000000000000000000000000..49721cd31dfcb6154563e05a4ddfb4c3c7c03fa3 GIT binary patch literal 8635 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

xg=QnTcLx$HKyyHsf>6T3T9C?@=D(8NpNtf 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 J68=Ax{|DjmhLr#S literal 0 HcmV?d00001 diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/e4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/e4.m4a new file mode 100644 index 0000000000000000000000000000000000000000..d910052ef9fe9dbededf8bb949e813d2491c608e GIT binary patch literal 8454 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⪚9^ zJv{zq0qon$G6R_a1)>6qx4bm~x%K}O_g6OpalU_J?tXwgAWQ%y0Ga^Q0_Xrx3?Lss z6@XjcZMYRc+dt?A^sT=gz}tWD4$!ypJpe`lbOGoEFb-fEzyN?T0CNB){;?MTy$awq z{S<&%080RF(@z5M0RVCLu)H0cTe)ouJAf-B!owWUXO32XHDH2Z|8uMXe*E{i-$wqG zeme(u55Vf+00hufj#lP>8DZ({$Z784;$X#T_XO!=b=#{DCv!*O9|a)Ltw&o`Lkcj% ofIk=9mU>$Y5H0sVa%TwhbN}Pv=l}1h+Y}-~Lel^3`2RHi3zKjz?*IS* literal 0 HcmV?d00001 diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/f4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/f4.m4a new file mode 100644 index 0000000000000000000000000000000000000000..c80a0bfd3b28a1cfe18f5eaab27a7829b78b48c7 GIT binary patch literal 8530 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 BFa`hs literal 0 HcmV?d00001 diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/g4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/g4.m4a new file mode 100644 index 0000000000000000000000000000000000000000..45ea4483021bdee6827f4f2cdaea22e5983979d6 GIT binary patch literal 8306 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 BLdyUE literal 0 HcmV?d00001 diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/styles/index.css b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/styles/index.css new file mode 100644 index 00000000000..988bb49ecb8 --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/styles/index.css @@ -0,0 +1,75 @@ +main { + width: 400px; + position: relative; + margin: 0 auto; + overflow: hidden; + height: 600px; +} + +header { + background-color: green; + width: 100%; +} + +h1 { + width: 400px; + position: relative; + margin: 0 auto; + color: #fff; + font-size: 1.8em; + line-height: 2.4em; +} + +.mode-edit, +.mode-maker, +.mode-blockly { + display: none; +} + +[mode='maker'] .mode-maker, +[mode='edit'] .mode-edit, +[mode='blockly'] .mode-blockly { + display: block; +} + +.blockly-editor { + position: absolute; + top: 64px; + left: -400px; + transition: left 0.4s; + height: 460px; + width: 400px; + background-color: #eee; +} + +[mode='blockly'] .blockly-editor { + left: 0; +} + +.maker { + display: flex; + flex-flow: column; + justify-content: space-between; + height: 460px; + width: 400px; +} + +.maker > div { + display: flex; + justify-content: space-between; +} + +.button { + width: 120px; + height: 140px; + color: #fff; + font-size: 3em; + text-align: center; + vertical-align: middle; + line-height: 140px; +} + +.mdl-button { + margin: 1em 0; + float: right; +} diff --git a/packages/docs/docs/codelabs/OLD-getting-started/the-end.mdx b/packages/docs/docs/codelabs/OLD-getting-started/the-end.mdx new file mode 100644 index 00000000000..3ef945ecccc --- /dev/null +++ b/packages/docs/docs/codelabs/OLD-getting-started/the-end.mdx @@ -0,0 +1,14 @@ +--- +pagination_next: null +description: Summary of the "Getting started with Blockly" codelab. +--- + +# Getting started with Blockly + +## 10. The End + +And with that, you're done with the Blockly codelab! If you'd like to continue playing with the app, we suggest adding or changing the available blocks. There are sample sound files in the `sounds` folder - try hooking them up to a new block! + +For more documentation, visit the [Blockly developer site](/guides/get-started/what-is-blockly). + +Additionally, Blockly has an active [developer forum](https://groups.google.com/g/blockly). Please drop by and say hello. We're happy to answer any questions or give advice on best practices for building an app with Blockly. Feel free to show us your prototypes early; collectively we have a lot of experience and can offer hints which will save you time. diff --git a/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx b/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx index 6603041dbee..e39b3734713 100644 --- a/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx +++ b/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx @@ -6,31 +6,41 @@ description: How to add Blockly libraries to an app. ## 4. Add Blockly libraries -Now that you know what you'll be building, you need to add Blockly dependencies to your app. +To start, you'll need to add Blockly dependencies to your app. -Blockly releases are [published on npm](https://www.npmjs.com/package/blockly) on a quarterly basis. For this codelab you will import blockly using [unpkg](https://unpkg.com), which lets you import all of the files you need with a single script tag. +Blockly releases are [published on npm](https://www.npmjs.com/package/blockly) on a quarterly basis. +There are multiple ways to import Blockly into your project, but for this codelab you will be using *injection*. +TODO: explain injection -### Add the script tag +### Create index.html +Open `starter-code/src` and create a new file called `index.html`. +In this file, you'll specify some basic structure for your webpage. +You'll also make a div (here called `blocklyDiv`) to inject Blockly into. -Open `starter-code/index.html` in a text editor and scroll to the end. You can see two script tags: +Copy and paste the following HTML into your `index.html` file. ```html - - -``` - -Add Blockly just before these two scripts. The order is important, because you will use Blockly objects later in `main.js`. Your imports should now look like this: - -```html - - - - - - + + + + + Blockly Sample App + + +

+
+
+
+
+
+
+ + ``` ### Default imports + +TODO: this is true for when you use unpckg, but not necessarily in this case right? Importing Blockly this way loads four default modules. diff --git a/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx b/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx index 28d502b73f7..c04fc80ec47 100644 --- a/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx +++ b/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx @@ -23,24 +23,13 @@ Blockly includes everything you need for defining and rendering blocks in a drag ### What you'll build -MusicMaker, a web app where you can program buttons to play different sounds, using Blockly. - -image - -image +TODO ### What you'll need - A browser - A text editor +- npm installed ([instructions](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)). - Basic knowledge of HTML, CSS and JavaScript This codelab is focused on Blockly. The app structure, non-relevant concepts and code are glossed over and are provided for you to simply copy and paste. diff --git a/packages/docs/docs/codelabs/getting-started/explore-the-app.mdx b/packages/docs/docs/codelabs/getting-started/explore-the-app.mdx index ef864e56e69..b4d58993de3 100644 --- a/packages/docs/docs/codelabs/getting-started/explore-the-app.mdx +++ b/packages/docs/docs/codelabs/getting-started/explore-the-app.mdx @@ -6,28 +6,14 @@ import Image from '@site/src/components/Image'; # Getting started with Blockly -## 3. Explore the app +## 3. Run the app -To run the app, simply open `starter-code/index.html` in a browser. +TODO: Save this for later I think +1. Install [node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) if you haven't already. +2. Navigate to the starter code folder `packages/docs/docs/codelabs/getting-started/starter-code` +in your terminal. +3. Run `npm install` in your terminal. +4. Run `npm start` -### Play Mode -By default, the app launches in "**Play Mode**". In this mode, you can see 9 buttons. None of them can do anything yet. The idea is to let the user define custom behaviors for each button, using Blockly. -image - -### Edit mode - -By tapping the **EDIT** button, you can switch to edit mode. In this mode, tapping a button will display an editor, which is where you can program how sounds should play for that button. For now, the editor screen is empty. - -image - -You can go back to the play mode by tapping **SAVE** and then **DONE** buttons. diff --git a/packages/docs/docs/codelabs/getting-started/setup.mdx b/packages/docs/docs/codelabs/getting-started/setup.mdx index 2f46ec0c102..f29315973f2 100644 --- a/packages/docs/docs/codelabs/getting-started/setup.mdx +++ b/packages/docs/docs/codelabs/getting-started/setup.mdx @@ -27,9 +27,9 @@ The relevant files are in `packages/docs/docs/codelabs/getting-started`. There a Each folder contains: -- `scripts/` - - `main.js` - The main logic for the app. In the starter project it has all the code needed to navigate and switch between views in the basic app. - - `music_maker.js` - A small library to play sounds. We will use it to actually play sounds in the browser. -- `sounds/` - Sound files for various notes -- `styles/` - The app's CSS -- `index.html` - The app's index page. +- `dist/`: TODO +- `src/`: Where you'll put your code. +- `package-lock.json`: TODO +- `package.json`: TODO +- `webpack.config.js`: TODO + diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js b/packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js new file mode 100644 index 00000000000..564794ffc49 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see bundle.js.LICENSE.txt */ +(()=>{var __webpack_modules__={523(t,e,s){"use strict";s.d(e,{A:()=>l});var i=s(601),o=s.n(i),n=s(314),r=s.n(n)()(o());r.push([t.id,"body {\n margin: 0;\n max-width: 100vw;\n}\n\npre,\ncode {\n overflow: auto;\n}\n\n#pageContainer {\n display: flex;\n width: 100%;\n max-width: 100vw;\n height: 100vh;\n}\n\n#blocklyDiv {\n flex-basis: 100%;\n height: 100%;\n min-width: 600px;\n}\n\n#outputPane {\n display: flex;\n flex-direction: column;\n width: 400px;\n flex: 0 0 400px;\n overflow: auto;\n margin: 1rem;\n}\n\n#generatedCode {\n height: 50%;\n background-color: rgb(247, 240, 228);\n}\n\n#output {\n height: 50%;\n}\n",""]);const l=r},314(t){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var s="",i=void 0!==e[5];return e[4]&&(s+="@supports (".concat(e[4],") {")),e[2]&&(s+="@media ".concat(e[2]," {")),i&&(s+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),s+=t(e),i&&(s+="}"),e[2]&&(s+="}"),e[4]&&(s+="}"),s}).join("")},e.i=function(t,s,i,o,n){"string"==typeof t&&(t=[[null,t,void 0]]);var r={};if(i)for(var l=0;l0?" ".concat(h[5]):""," {").concat(h[1],"}")),h[5]=n),s&&(h[2]?(h[1]="@media ".concat(h[2]," {").concat(h[1],"}"),h[2]=s):h[2]=s),o&&(h[4]?(h[1]="@supports (".concat(h[4],") {").concat(h[1],"}"),h[4]=o):h[4]="".concat(o)),e.push(h))}},e}},601(t){"use strict";t.exports=function(t){return t[1]}},216(t,e,s){"use strict";var i=s(72),o=s.n(i),n=s(825),r=s.n(n),l=s(659),a=s.n(l),c=s(56),h=s.n(c),u=s(540),d=s.n(u),p=s(113),g=s.n(p),_=s(523),T={};T.styleTagTransform=g(),T.setAttributes=h(),T.insert=a().bind(null,"head"),T.domAPI=r(),T.insertStyleElement=d(),o()(_.A,T),_.A&&_.A.locals&&_.A.locals},72(t){"use strict";var e=[];function s(t){for(var s=-1,i=0;i0?" ".concat(s.layer):""," {")),i+=s.css,o&&(i+="}"),s.media&&(i+="}"),s.supports&&(i+="}");var n=s.sourceMap;n&&"undefined"!=typeof btoa&&(i+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(n))))," */")),e.styleTagTransform(i,t,e.options)}(e,t,s)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}},113(t){"use strict";t.exports=function(t,e){if(e.styleSheet)e.styleSheet.cssText=t;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(t))}}},780(t,e,s){"use strict";s.d(e,{B:()=>i});const i=s(671).sh.createBlockDefinitionsFromJsonArray([{type:"add_text",message0:"Add text %1",args0:[{type:"input_value",name:"TEXT",check:"String"}],previousStatement:null,nextStatement:null,colour:160,tooltip:"",helpUrl:""}])},352(t,e,s){"use strict";s.d(e,{J:()=>o});var i=s(290);const o=Object.create(null);o.add_text=function(t,e){const s=e.valueToCode(t,"TEXT",i.pH.NONE)||"''";return`${e.provideFunction_("addText",`function ${e.FUNCTION_NAME_PLACEHOLDER_}(text) {\n\n // Add text to the output area.\n const outputDiv = document.getElementById('output');\n const textEl = document.createElement('p');\n textEl.innerText = text;\n outputDiv.appendChild(textEl);\n}`)}(${s});\n`}},952(t,e,s){"use strict";s.d(e,{H:()=>r,U:()=>n});var i=s(671);const o="mainWorkspace",n=function(t){const e=i.JF.workspaces.save(t);window.localStorage?.setItem(o,JSON.stringify(e))},r=function(t){const e=window.localStorage?.getItem(o);e&&(i.sV.disable(),i.JF.workspaces.load(JSON.parse(e),t,!1),i.sV.enable())}},336(t,e,s){"use strict";s.d(e,{M:()=>i});const i={kind:"categoryToolbox",contents:[{kind:"category",name:"Logic",categorystyle:"logic_category",contents:[{kind:"block",type:"controls_if"},{kind:"block",type:"logic_compare"},{kind:"block",type:"logic_operation"},{kind:"block",type:"logic_negate"},{kind:"block",type:"logic_boolean"},{kind:"block",type:"logic_null"},{kind:"block",type:"logic_ternary"}]},{kind:"category",name:"Loops",categorystyle:"loop_category",contents:[{kind:"block",type:"controls_repeat_ext",inputs:{TIMES:{shadow:{type:"math_number",fields:{NUM:10}}}}},{kind:"block",type:"controls_whileUntil"},{kind:"block",type:"controls_for",inputs:{FROM:{shadow:{type:"math_number",fields:{NUM:1}}},TO:{shadow:{type:"math_number",fields:{NUM:10}}},BY:{shadow:{type:"math_number",fields:{NUM:1}}}}},{kind:"block",type:"controls_forEach"},{kind:"block",type:"controls_flow_statements"}]},{kind:"category",name:"Math",categorystyle:"math_category",contents:[{kind:"block",type:"math_number",fields:{NUM:123}},{kind:"block",type:"math_arithmetic",inputs:{A:{shadow:{type:"math_number",fields:{NUM:1}}},B:{shadow:{type:"math_number",fields:{NUM:1}}}}},{kind:"block",type:"math_single",inputs:{NUM:{shadow:{type:"math_number",fields:{NUM:9}}}}},{kind:"block",type:"math_trig",inputs:{NUM:{shadow:{type:"math_number",fields:{NUM:45}}}}},{kind:"block",type:"math_constant"},{kind:"block",type:"math_number_property",inputs:{NUMBER_TO_CHECK:{shadow:{type:"math_number",fields:{NUM:0}}}}},{kind:"block",type:"math_round",fields:{OP:"ROUND"},inputs:{NUM:{shadow:{type:"math_number",fields:{NUM:3.1}}}}},{kind:"block",type:"math_on_list",fields:{OP:"SUM"}},{kind:"block",type:"math_modulo",inputs:{DIVIDEND:{shadow:{type:"math_number",fields:{NUM:64}}},DIVISOR:{shadow:{type:"math_number",fields:{NUM:10}}}}},{kind:"block",type:"math_constrain",inputs:{VALUE:{shadow:{type:"math_number",fields:{NUM:50}}},LOW:{shadow:{type:"math_number",fields:{NUM:1}}},HIGH:{shadow:{type:"math_number",fields:{NUM:100}}}}},{kind:"block",type:"math_random_int",inputs:{FROM:{shadow:{type:"math_number",fields:{NUM:1}}},TO:{shadow:{type:"math_number",fields:{NUM:100}}}}},{kind:"block",type:"math_random_float"},{kind:"block",type:"math_atan2",inputs:{X:{shadow:{type:"math_number",fields:{NUM:1}}},Y:{shadow:{type:"math_number",fields:{NUM:1}}}}}]},{kind:"category",name:"Text",categorystyle:"text_category",contents:[{kind:"block",type:"text"},{kind:"block",type:"text_join"},{kind:"block",type:"text_append",inputs:{TEXT:{shadow:{type:"text",fields:{TEXT:""}}}}},{kind:"block",type:"text_length",inputs:{VALUE:{shadow:{type:"text",fields:{TEXT:"abc"}}}}},{kind:"block",type:"text_isEmpty",inputs:{VALUE:{shadow:{type:"text",fields:{TEXT:""}}}}},{kind:"block",type:"text_indexOf",inputs:{VALUE:{block:{type:"variables_get"}},FIND:{shadow:{type:"text",fields:{TEXT:"abc"}}}}},{kind:"block",type:"text_charAt",inputs:{VALUE:{block:{type:"variables_get"}}}},{kind:"block",type:"text_getSubstring",inputs:{STRING:{block:{type:"variables_get"}}}},{kind:"block",type:"text_changeCase",inputs:{TEXT:{shadow:{type:"text",fields:{TEXT:"abc"}}}}},{kind:"block",type:"text_trim",inputs:{TEXT:{shadow:{type:"text",fields:{TEXT:"abc"}}}}},{kind:"block",type:"text_count",inputs:{SUB:{shadow:{type:"text"}},TEXT:{shadow:{type:"text"}}}},{kind:"block",type:"text_replace",inputs:{FROM:{shadow:{type:"text"}},TO:{shadow:{type:"text"}},TEXT:{shadow:{type:"text"}}}},{kind:"block",type:"text_reverse",inputs:{TEXT:{shadow:{type:"text"}}}},{kind:"block",type:"add_text",inputs:{TEXT:{shadow:{type:"text",fields:{TEXT:"abc"}}}}}]},{kind:"category",name:"Lists",categorystyle:"list_category",contents:[{kind:"block",type:"lists_create_with"},{kind:"block",type:"lists_create_with"},{kind:"block",type:"lists_repeat",inputs:{NUM:{shadow:{type:"math_number",fields:{NUM:5}}}}},{kind:"block",type:"lists_length"},{kind:"block",type:"lists_isEmpty"},{kind:"block",type:"lists_indexOf",inputs:{VALUE:{block:{type:"variables_get"}}}},{kind:"block",type:"lists_getIndex",inputs:{VALUE:{block:{type:"variables_get"}}}},{kind:"block",type:"lists_setIndex",inputs:{LIST:{block:{type:"variables_get"}}}},{kind:"block",type:"lists_getSublist",inputs:{LIST:{block:{type:"variables_get"}}}},{kind:"block",type:"lists_split",inputs:{DELIM:{shadow:{type:"text",fields:{TEXT:","}}}}},{kind:"block",type:"lists_sort"},{kind:"block",type:"lists_reverse"}]},{kind:"sep"},{kind:"category",name:"Variables",categorystyle:"variable_category",custom:"VARIABLE"},{kind:"category",name:"Functions",categorystyle:"procedure_category",custom:"PROCEDURE"}]}},500(t,e,s){var i,o;void 0===(o="function"==typeof(i=function(){var t,e,i,o,n,r,l,a,c,h,u,d,p,g,_,T,m,E,b,f,$,I,C,S,R,y,O,k,A,v,N,w,L,M,D,x,P,B,F,U,H,G,V,W,X,z,Y,K,j,J,q,Z,Q,tt,et,st,it,ot,nt,rt,lt,at,ct,ht,ut,dt,pt,gt,_t,Tt,mt,Et,bt,ft,$t,It,Ct,St,Rt,yt,Ot,kt,At,vt,Nt,wt,Lt,Mt,Dt,xt,Pt,Bt,Ft,Ut,Ht,Gt,Vt,Wt,Xt,zt,Yt,Kt,jt,Jt,qt,Zt,Qt,te,ee,se,ie,oe,ne,re,le,ae,ce,he,ue,de,pe,ge,_e,Te,me,Ee,be,fe,$e,Ie,Ce,Se,Re,ye,Oe,ke,Ae,ve,Ne,we,Le,Me,De,xe,Pe,Be,Fe,Ue,He,Ge,Ve,We,Xe,ze,Ye,Ke,je,Je,qe,Ze,Qe,ts,es,ss,is,os,ns,rs,ls,as,cs,hs,us,ds,ps,gs,_s,Ts,ms,Es,bs,fs,$s,Is,Cs,Ss,Rs,ys,Os,ks,As,vs,Ns,ws,Ls,Ms,Ds,xs,Ps,Bs,Fs,Us,Hs,Gs,Vs,Ws,Xs,zs,Ys,Ks,js,Js,qs,Zs,Qs,ti,ei,si,ii,oi,ni,ri,li,ai,ci,hi,ui,di,pi,gi,_i,Ti,mi,Ei,bi,fi,$i,Ii,Ci,Si,Ri,yi,Oi,ki,Ai,vi,Ni,wi,Li,Mi,Di,xi,Pi,Bi,Fi,Ui,Hi,Gi,Vi,Wi,Xi,zi,Yi,Ki,ji,Ji,qi,Zi,Qi,to,eo,so,io,oo,no,ro,lo,ao,co,ho,uo,po,go,_o,To,mo,Eo,bo,fo,$o,Io,Co,So,Ro,yo,Oo,ko,Ao,vo,No,wo,Lo,Mo,Do,xo,Po,Bo,Fo,Uo,Ho,Go,Vo,Wo,Xo,zo,Yo,Ko,jo,Jo,qo,Zo,Qo,tn,en,sn,on,nn,rn,ln,an,cn,hn,un,dn,pn,gn,_n,Tn,mn,En,bn,fn,$n,In,Cn,Sn,Rn,yn,On,kn,An,vn,Nn,wn,Ln,Mn,Dn,xn,Pn,Bn,Fn,Un,Hn,Gn,Vn,Wn,Xn,zn,Yn,Kn,jn,Jn,qn,Zn,Qn,tr,er,sr,ir,or,nr,rr,lr,ar,cr,hr,ur,dr,pr,gr,_r,Tr,mr,Er,br,fr,$r,Ir,Cr,Sr,Rr,yr,Or,kr,Ar,vr,Nr,wr,Lr,Mr,Dr,xr,Pr,Br,Fr,Ur,Hr,Gr,Vr,Wr,Xr,zr,Yr,Kr,jr,Jr,qr,Zr,Qr,tl,el,sl,il,ol,nl,rl,ll,al,cl,hl,ul,dl,pl,gl,_l,Tl,ml,El,bl,fl,$l,Il,Cl,Sl,Rl,yl,Ol,kl,Al,vl,Nl,wl,Ll,Ml,Dl,xl,Pl,Bl,Fl,Ul,Hl={};t=function(t,s,i,o){if(!(t instanceof zl)&&"string"!=typeof t||""===`${t}`.trim())throw Error('Invalid type "'+t+'". The type must be a non-empty string or a Blockly.registry.Type.');if(t=`${t}`.toLowerCase(),"string"!=typeof s||""===s.trim())throw Error('Invalid name "'+s+'". The name must be a non-empty string.');const n=s.toLowerCase();if(!i)throw Error("Can not register a null value");let r=Gl[t],l=Wl[t];if(r||(r=Gl[t]=Object.create(null),l=Wl[t]=Object.create(null)),e(t,i),!o&&r[n]&&r[n]!==i)throw Error('Name "'+n+'" with type "'+t+'" already registered.');r[n]=i,l[n]=s},e=function(t,e){if(t===String(zl.FIELD)&&"function"!=typeof e.fromJson)throw Error('Type "'+t+'" must have a fromJson function')},i=function(t,e){t=`${t}`.toLowerCase(),e=e.toLowerCase();const s=Gl[t];s&&s[e]?(delete Gl[t][e],delete Wl[t][e]):console.warn("Unable to unregister ["+e+"]["+t+"] from the registry.")},o=function(t,e,s){t=`${t}`.toLowerCase(),e=e.toLowerCase();const i=Gl[t];if(!i||!i[e]){if(e="Unable to find ["+e+"]["+t+"] in the registry.",s)throw Error(e+" You must require or register a "+t+" plugin.");return console.warn(e),null}return i[e]},n=function(t,e){return t=`${t}`.toLowerCase(),e=e.toLowerCase(),!!(t=Gl[t])&&!!t[e]},r=function(t,e,s){return o(t,e,s)},l=function(t,e,s){return o(t,e,s)},a=function(t,e,s){t=`${t}`.toLowerCase();var i=Gl[t];if(!i){if(i=`Unable to find [${t}] in the registry.`,s)throw Error(`${i} You must require or register a ${t} plugin.`);return console.warn(i),null}if(!e)return i;t=Wl[t],s=Object.create(null);for(const e of Object.keys(i))s[t[e]]=i[e];return s},c=function(t,e,s){return"function"==typeof(e=e.plugins[String(t)]||Xl)?e:r(t,e,s)},h=function(t,e){u(),ca=setTimeout(function(){e&&e.handleRightClick(t)},na)},u=function(){ca&&(clearTimeout(ca),ca=0)},d=function(){la=null},p=function(t){return!t.type.startsWith("pointer")||t instanceof PointerEvent&&_(t)},g=function(t){return`${t.pointerId}`},_=function(t){const e=g(t);return la?la===e:"pointerdown"===t.type&&(la=e,!0)},T=function(t,e,s,i,o,n){function r(t){(o||p(t))&&(s?i.call(s,t):i(t))}const l=[];if(e in aa)for(let s=0;s{setTimeout(Z,0)})}catch(t){setTimeout(Z,0)}Q(t)}},Z=function(){const t=tt(La);La.length=0;for(const e of t){if(!e.workspaceId)continue;let t;null==(t=Rt(e.workspaceId))||t.fireChangeListener(e)}},Q=function(t){if(O(t)&&"mutation"===t.element){let e;for(e=La.length;e>0;e--){const s=La[e-1];if(s.group!==t.group||s.workspaceId!==t.workspaceId||!A(s)||s.newParentId!==t.blockId)break}La.splice(e,0,t)}else La.push(t)},tt=function(t){const e=[];for(const s of t)if(t=e[e.length-1],!s.isNull())if(t&&t.workspaceId===s.workspaceId&&t.group===s.group)if(A(s)&&A(t)&&s.blockId===t.blockId){if(t.newParentId=s.newParentId,t.newInputName=s.newInputName,t.newCoordinate=s.newCoordinate,t.reason||s.reason){let e,i;t.reason=Array.from(new Set((null!=(e=t.reason)?e:[]).concat(null!=(i=s.reason)?i:[])))}}else O(s)&&O(t)&&s.blockId===t.blockId&&s.element===t.element&&s.name===t.name?t.newValue=s.newValue:U(s)&&U(t)?(t.viewTop=s.viewTop,t.viewLeft=s.viewLeft,t.scale=s.scale,t.oldScale=s.oldScale):D(s)&&x(t)||e.push(s);else e.push(s);return e.filter(t=>!t.isNull())},et=function(){for(let t,e=0;t=La[e];e++)t.recordUndo=!1},Hl.disable$$module$build$src$core$events$utils=function(){Na++},Hl.enable$$module$build$src$core$events$utils=function(){Na--},st=function(){return 0===Na},Hl.getGroup$$module$build$src$core$events$utils=function(){return Aa},Hl.setGroup$$module$build$src$core$events$utils=function(t){Ma.setGroupInternal(t)},it=function(t){Aa="boolean"==typeof t?t?S():"":t},ot=function(t){const e=[];t=t.getDescendants(!1);for(let s,i=0;s=t[i];i++)e[i]=s.id;return e},nt=function(t,e){const s=rt(t.type);if(!s)throw Error("Unknown event type.");return s.fromJson(t,e)},rt=function(t){const e=r(zl.EVENT,t);if(!e)throw Error(`Event type ${t} not found in registry.`);return e},lt=function(t){if((A(t)||R(t))&&t.workspaceId){var e=Rt(t.workspaceId);if(!t.blockId)throw Error("Encountered a blockEvent without a proper blockId");if(t=e.getBlockById(t.blockId)){const s=va;try{va=!1;const s=t.getParent();if(s&&!s.hasDisabledReason(wa)){const e=t.getDescendants(!1);for(let t,s=0;t=e[s];s++)t.setDisabledReason(!1,wa)}else if((t.outputConnection||t.previousConnection)&&!e.isDragging())do{t.setDisabledReason(!0,wa),t=t.getNextBlock()}while(t)}finally{va=s}}}},at=function(t,e,s){t=document.createElementNS(Pa,`${t}`);for(const s in e)t.setAttribute(s,`${e[s]}`);return s&&s.appendChild(t),t},ct=function(t,e){return!(e=e.split(" ")).every(e=>t.classList.contains(e))&&(t.classList.add(...e),!0)},ht=function(t,e){t.classList.remove(...e.split(" "))},ut=function(t,e){return!(e=e.split(" ")).every(e=>!t.classList.contains(e))&&(t.classList.remove(...e),!0)},dt=function(t,e){return t.classList.contains(e)},pt=function(t){return t&&t.parentNode?t.parentNode.removeChild(t):null},gt=function(t,e){const s=e.nextSibling;if(!(e=e.parentNode))throw Error("Reference node has no parent.");s?e.insertBefore(t,s):e.appendChild(t)},_t=function(t,e){t.style.transform=e,t.style["-webkit-transform"]=e},Tt=function(){Ha++,Ua||(Ua=Object.create(null))},mt=function(){--Ha||(Ua=null)},Et=function(t){const e=t.textContent+"\n"+t.className.baseVal;var s;return Ua&&(s=Ua[e])||(s=window.getComputedStyle(t),s=ft(t,s.fontSize,s.fontWeight,s.fontFamily),Ua&&(Ua[e]=s)),s},bt=function(t,e,s,i){return ft(t,e+"pt",s,i)},ft=function(t,e,s,i){const o=t.textContent;var n;return t=o+"\n"+t.className.baseVal,Ua&&(n=Ua[t])||(Ga||((n=document.createElement("canvas")).className="blocklyComputeCanvas",document.body.appendChild(n),Ga=n.getContext("2d")),o&&Ga?(Ga.font=s+" "+e+" "+i,n=Ga.measureText(o).width):n=0,Ua&&(Ua[t]=n)),n},$t=function(t,e,s,i){const o=document.createElement("span");o.style.font=s+" "+e+" "+i,o.textContent=t,(t=document.createElement("div")).style.width="1px",t.style.height="0",(e=document.createElement("div")).style.display="flex",e.style.position="fixed",e.style.top="0",e.style.left="0",e.appendChild(o),e.appendChild(t),document.body.appendChild(e),s={height:0,baseline:0};try{e.style.alignItems="baseline",s.baseline=t.offsetTop-o.offsetTop,e.style.alignItems="flex-end",s.height=t.offsetTop-o.offsetTop}finally{document.body.removeChild(e)}return s},Hl.getFocusManager$$module$build$src$core$focus_manager=function(){return za.getFocusManager()},It=function(t){return t&&"function"==typeof t.getFocusableElement&&"function"==typeof t.getFocusableTree&&"function"==typeof t.onNodeFocus&&"function"==typeof t.onNodeBlur&&"function"==typeof t.canBeFocused},Ct=function(t){return It(t)&&"string"==typeof t.id&&"object"==typeof t.workspace&&"function"==typeof t.select&&"function"==typeof t.unselect},St=function(t,e){for(const s in e)null!==e[s]&&Array.isArray(e[s])?t[s]=St(t[s]||[],e[s]):t[s]=null!==e[s]&&"object"==typeof e[s]?St(t[s]||Object.create(null),e[s]):e[s];return t},Rt=function(t){return Za[t]||null},yt=function(){const t=[];for(const e in Za)t.push(Za[e]);return t},Ot=function(t){Za[t.id]=t},kt=function(t){delete Za[t.id]},At=function(){return Ja},vt=function(t){Ja=t},Nt=function(){const t=Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode();return t&&Ct(t)?t:null},wt=function(t){Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(t)},Lt=function(t){const e=Nt();let s,i,o,n;const r=new(rt(ua.SELECTED))(null!=(s=null==e?void 0:e.id)?s:null,null!=(i=null==t?void 0:t.id)?i:null,null!=(n=null!=(o=null==t?void 0:t.workspace.id)?o:null==e?void 0:e.workspace.id)?n:"");J(r)},Mt=function(){return qa},Dt=function(t){qa=t},xt=function(t){for(;t.options.parentWorkspace;)t=t.options.parentWorkspace;const e=t.getParentSvg(),s=t.getCachedParentSvgSize();var i=e.parentElement;if(i instanceof HTMLElement){var o=i.offsetWidth;i=i.offsetHeight,s.width!==o&&(e.setAttribute("width",o+"px"),t.setCachedParentSvgSize(o,null)),s.height!==i&&(e.setAttribute("height",i+"px"),t.setCachedParentSvgSize(null,i)),t.resize()}},Pt=function(t,e){const s=Object.create(null),i=t.getDescendants(!0);e&&(t=t.getNextBlock())&&(t=i.indexOf(t),i.splice(t,i.length-t));for(let t,e=0;t=i[e];e++)s[t.type]?s[t.type]++:s[t.type]=1;return s},Bt=function(t){return function(){this.jsonInit(t)}},Ft=function(t){tc.defineBlocksWithJsonArrayInternal(t)},Ut=function(t){Hl.defineBlocks$$module$build$src$core$common(Hl.createBlockDefinitionsFromJsonArray$$module$build$src$core$common(t))},Hl.createBlockDefinitionsFromJsonArray$$module$build$src$core$common=function(t){const e={};for(let s=0;s>>/g,t),pc="",(t=document.createElement("style")).id="blockly-common-style",e=document.createTextNode(e),t.appendChild(e),document.head.insertBefore(t,document.head.firstChild)))},Xt=function(t){return bc.getSizeInternal(t)},zt=function(t){if("none"!==Kt(t,"display"))return Yt(t);const e=t.style,s=e.display,i=e.visibility,o=e.position;e.visibility="hidden",e.position="absolute",e.display="inline";const n=t.offsetWidth;return t=t.offsetHeight,e.display=s,e.position=o,e.visibility=i,new Ec(n,t)},Yt=function(t){return new Ec(t.offsetWidth,t.offsetHeight)},Kt=function(t,e){return(t=window.getComputedStyle(t))[e]||t.getPropertyValue(e)},jt=function(t){const e=new _c(0,0);t=t.getBoundingClientRect();var s=document.documentElement;return s=new _c(window.pageXOffset||s.scrollLeft,window.pageYOffset||s.scrollTop),e.x=t.left+s.x,e.y=t.top+s.y,e},Jt=function(){const t=document.body,e=document.documentElement;return new _c(t.scrollLeft||e.scrollLeft,t.scrollTop||e.scrollTop)},qt=function(t){const e=parseFloat(Kt(t,"borderLeftWidth")),s=parseFloat(Kt(t,"borderRightWidth")),i=parseFloat(Kt(t,"borderTopWidth"));return t=parseFloat(Kt(t,"borderBottomWidth")),new mc(i,t,e,s)},Zt=function(t,e,s){t=Qt(t,e,s),e.scrollLeft=t.x,e.scrollTop=t.y},Qt=function(t,e,s){var i=jt(t),o=jt(e),n=qt(e);const r=i.x-o.x-n.left;return i=i.y-o.y-n.top,o=Yt(t),t=e.clientWidth-o.width,o=e.clientHeight-o.height,n=e.scrollLeft,e=e.scrollTop,s?(n+=r-t/2,e+=i-o/2):(n+=Math.min(r,Math.max(r-t,0)),e+=Math.min(i,Math.max(i-o,0))),new _c(n,e)},te=function(t){const e=new _c(0,0);var s=t.x&&t.getAttribute("x");const i=t.y&&t.getAttribute("y");return s&&(e.x=parseInt(s)),i&&(e.y=parseInt(i)),(s=(s=t.getAttribute("transform"))&&s.match($c))&&(e.x+=Number(s[1]),s[3]&&(e.y+=Number(s[3]))),(t=t.getAttribute("style"))&&t.includes("translate")&&(t=t.match(Ic))&&(e.x+=Number(t[1]),t[3]&&(e.y+=Number(t[3]))),e},ee=function(t){let e=0,s=0;for(;t;){const i=te(t);if(e+=i.x,s+=i.y,(" "+(t.getAttribute("class")||"")+" ").includes(" injectionDiv "))break;t=t.parentNode}return new _c(e,s)},se=function(){const t=Jt();return new mc(t.y,document.documentElement.clientHeight+t.y,t.x,document.documentElement.clientWidth+t.x)},ie=function(){const t=document.documentElement,e=window;return new _c(e.pageXOffset||t.scrollLeft,e.pageYOffset||t.scrollTop)},oe=function(t,e){var s=e.x;e=e.y;const i=t.getInjectionDiv().getBoundingClientRect();return s=new _c(s-i.left,e-i.top),e=t.getOriginOffsetInPixels(),_c.difference(s,e).scale(1/t.scale)},ne=function(t,e){var s=e.scale(t.scale);e=s.x,s=s.y;const i=t.getInjectionDiv().getBoundingClientRect();return t=t.getOriginOffsetInPixels(),new _c(e+i.left+t.x,s+i.top+t.y)},re=function(t){({document:Oc=Oc,DOMParser:kc=kc,XMLSerializer:Ac=Ac}=t),Rc=new kc,yc=new Ac},Hl.createElement$$module$build$src$core$utils$xml=function(t){return Oc.createElementNS(vc,t)},Hl.createTextNode$$module$build$src$core$utils$xml=function(t){return Oc.createTextNode(t)},Hl.textToDom$$module$build$src$core$utils$xml=function(t){let e=Rc.parseFromString(t,"text/xml");if(e&&e.documentElement&&!e.getElementsByTagName("parsererror").length)return e.documentElement;if((e=Rc.parseFromString(t,"text/html"))&&e.body.firstChild&&"xml"===e.body.firstChild.nodeName.toLowerCase())return e.body.firstChild;throw Error(`DOMParser was unable to parse: ${t}`)},le=function(t){return ae(yc.serializeToString(t))},ae=function(t){return t.replace(Nc,t=>`&#${t.charCodeAt(0)};`)},ce=function(t){return t?((t instanceof Element||"string"==typeof t)&&(t=Ee(t),t=_e(t)),he(t),t):null},he=function(t){const e=t.kind;if(t=t.contents,e&&e!==Dc&&e!==Mc)throw Error("Invalid toolbox kind "+e+". Please supply either "+Dc+" or "+Mc);if(!t)throw Error("Toolbox must have a contents attribute.")},ue=function(t){return t?t.contents?t.contents:Array.isArray(t)&&t.length>0&&!t[0].nodeType?t:Te(t):[]},de=function(t){return Fc.hasCategoriesInternal(t)},pe=function(t){if(!t)return!1;const e=t.kind;return e?e===Mc:!!t.contents.filter(t=>"CATEGORY"===t.kind.toUpperCase()).length},ge=function(t){return!(!t||!t.contents||!t.contents.filter(function(t){return"CATEGORY"===t.kind.toUpperCase()}).length)},_e=function(t){const e={contents:Te(t)};return t instanceof Node&&me(t,e),e},Te=function(t){const e=[];let s=t.childNodes;s||(s=t);for(let i,o=0;i=s[o];o++){if(!i.tagName)continue;t={};const s=i.tagName.toUpperCase();t.kind=s,"BLOCK"===s?t.blockxml=i:i.childNodes&&i.childNodes.length>0&&(t.contents=Te(i)),me(i,t),e.push(t)}return e},me=function(t,e){for(let s=0;s document.")}else t instanceof Element&&(e=t);return e},be=function(t,e,s,i,o,n){const r=n.scrollbar&&n.scrollbar.canScrollVertically();return t.horizontal===Pc.LEFT?(s=o.absoluteMetrics.left+s,r&&n.RTL&&(s+=Sc.scrollbarThickness)):(s=o.absoluteMetrics.left+o.viewMetrics.width-e.width-s,r&&!n.RTL&&(s-=Sc.scrollbarThickness)),t.vertical===xc.TOP?t=o.absoluteMetrics.top+i:(t=o.absoluteMetrics.top+o.viewMetrics.height-e.height-i,n.scrollbar&&n.scrollbar.canScrollHorizontally()&&(t-=Sc.scrollbarThickness)),new mc(t,t+e.height,s,s+e.width)},fe=function(t,e){return{horizontal:e.toolboxMetrics.position===Lc.LEFT||t.horizontalLayout&&!t.RTL?Pc.RIGHT:Pc.LEFT,vertical:e.toolboxMetrics.position===Lc.BOTTOM?xc.TOP:xc.BOTTOM}},$e=function(t,e,s,i){const o=t.left,n=t.right-t.left,r=t.bottom-t.top;for(let l=0;le.id!==t.id).map(t=>t.getRelativeToSurfaceXY());for(;Ae(_c.sum(s,i),o);)i.translate(e.RTL?-30:30,30);t.moveTo(_c.sum(s,i))},Ae=function(t,e){return e.some(e=>Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1)},ve=function(t,e){t.setAttribute(eh,e)},Ne=function(t,e,s){Array.isArray(s)&&(s=s.join(" ")),t.setAttribute(th+e,`${s}`)},we=function(t){return t&&"function"==typeof t.saveState&&"function"==typeof t.loadState},Le=function(t){return Pe(t),xe()?(Be(),Promise.resolve()):(_h||(_h=new Promise(t=>{Th=t,mh=window.requestAnimationFrame(()=>{Be(),t()})})),_h)},Me=function(){return _h||Promise.resolve()},De=function(t){t||window.cancelAnimationFrame(mh),Be(t),!t&&Th&&Th()},xe=function(){return da},Pe=function(t){ph.add(t),gh.set(t,Hl.getGroup$$module$build$src$core$events$utils());const e=t.getParent();e?Pe(e):dh.add(t)},Be=function(t){const e=t?new Set([t]):new Set([...dh].map(t=>t.workspace)),s=[...dh].filter(Ue).filter(t=>e.has(t.workspace));for(var i of s)He(i);for(const t of e)t.resizeContents();for(var o of s)i=o.getRelativeToSurfaceXY(),o.updateComponentLocations(i);for(const t of s)o=Hl.getGroup$$module$build$src$core$events$utils(),(i=gh.get(t))&&Hl.setGroup$$module$build$src$core$events$utils(i),t.bumpNeighbours(),Hl.setGroup$$module$build$src$core$events$utils(o);for(const t of s)Fe(t);t||(_h=null)},Fe=function(t){dh.delete(t),ph.delete(t),gh.delete(t);for(const e of t.getChildren(!1))Fe(e)},Ue=function(t){return!t.isDisposed()&&!t.getParent()},He=function(t){if(ph.has(t)&&t.initialized){for(const e of t.getChildren(!1))He(e);t.renderEfficiently()}},Ge=function(t,e){Sh(t,e)},Ve=function(t=Ch){Sh=t},We=function(t,e){yh(t,e)},Xe=function(t=Rh){yh=t},ze=function(t,e,s){kh(t,e,s)},Ye=function(t=Oh){kh=t},Ke=function(t,e){vh(t,e)},je=function(t=Ah){vh=t},Je=function(t){return t&&"function"==typeof t.getProcedureDef},qe=function(t){return t&&"function"==typeof t.getProcedureCall&&"function"==typeof t.renameProcedure},Ze=function(t){return void 0!==t.getVariableModel},Qe=function(t,e,s,i){t=t+" was deprecated in "+e+" and will be deleted in "+s+".",i&&(t+="\nUse "+i+" instead."),Lh.has(t)||(Lh.add(t),console.warn(t))},Hl.allUsedVarModels$$module$build$src$core$variables=function(t){t=t.getAllBlocks(!1);const e=new Set;for(let s=0;s({kind:"block",type:i,gap:8,fields:ss(t)}))),t},os=function(t){let e=[];const s=document.createElement("button");return s.setAttribute("text","%{BKY_NEW_VARIABLE}"),s.setAttribute("callbackKey","CREATE_VARIABLE"),t.registerButtonCallback("CREATE_VARIABLE",function(t){cs(t.getTargetWorkspace())}),e.push(s),t=ns(t),e.concat(t)},ns=function(t){const e=[];if((t=t.getVariableMap().getVariablesOfType("")).length>0){var s=t[t.length-1];if(oa.variables_set){var i=Hl.createElement$$module$build$src$core$utils$xml("block");i.setAttribute("type","variables_set"),i.setAttribute("gap",oa.math_change?"8":"24"),i.appendChild(Ts(s)),e.push(i)}if(oa.math_change&&((i=Hl.createElement$$module$build$src$core$utils$xml("block")).setAttribute("type","math_change"),i.setAttribute("gap",oa.variables_get?"20":"8"),i.appendChild(Ts(s)),s=Hl.textToDom$$module$build$src$core$utils$xml('1'),i.appendChild(s),e.push(i)),oa.variables_get){t.sort(bs);for(let i,o=0;i=t[o];o++)(s=Hl.createElement$$module$build$src$core$utils$xml("block")).setAttribute("type","variables_get"),s.setAttribute("gap","8"),s.appendChild(Ts(i)),e.push(s)}}return e},rs=function(t){return Ph.generateUniqueNameInternal(t)},ls=function(t){return as(xh.charAt(0),t.getVariableMap().getAllVariables().map(t=>t.getName()))},as=function(t,e){if(!e.length)return t;const s=xh;let i="",o=s.indexOf(t);for(;;){let n=!1;for(let s=0;st.getVariableModel().getName());if(i&&(s=i.some(e=>e.toLowerCase()===t),i=i.some(t=>t.toLowerCase()===e),s&&i))return o.getName()}return null},_s=function(t,e,s){t=t.toLowerCase(),e=e.toLowerCase(),s=s.getAllBlocks(!1);for(const o of s){if(!Je(o))continue;var i=(s=o.getProcedureDef())[1];const n=i.some(e=>e.toLowerCase()===t);if(i=i.some(t=>t.toLowerCase()===e),n&&i)return s[0]}return null},Ts=function(t){const e=Hl.createElement$$module$build$src$core$utils$xml("field");return e.setAttribute("name","VAR"),e.setAttribute("id",t.getId()),e.setAttribute("variabletype",t.getType()),t=Hl.createTextNode$$module$build$src$core$utils$xml(t.getName()),e.appendChild(t),e},Hl.getOrCreateVariablePackage$$module$build$src$core$variables=function(t,e,s,i){let o=Hl.getVariable$$module$build$src$core$variables(t,e,s,i);return o||(o=ms(t,e,s,i)),o},Hl.getVariable$$module$build$src$core$variables=function(t,e,s,i){const o=t.getPotentialVariableMap();let n=null;if(e&&(n=t.getVariableMap().getVariableById(e),!n&&o&&(n=o.getVariableById(e)),n))return n;if(s){if(void 0===i)throw Error("Tried to look up a variable by name without a type");n=t.getVariableMap().getVariable(s,i),!n&&o&&(n=o.getVariable(s,i))}return n},ms=function(t,e,s,i){const o=t.getVariableMap(),n=t.getPotentialVariableMap();return s||(s=rs(t.isFlyout?t.targetWorkspace:t)),n?n.createVariable(s,i,null!=e?e:void 0):o.createVariable(s,i,e)},Es=function(t,e){t=t.getVariableMap().getAllVariables();const s=[];if(e.length!==t.length)for(let i=0;i=0;t--){const e=o[t];if("procedures_defnoreturn"===e.type||"procedures_defreturn"===e.type)return s=String(e.getFieldValue("NAME")),i=Hl.Msg$$module$build$src$core$msg.CANNOT_DELETE_VARIABLE_PROCEDURE.replace("%1",i).replace("%2",s),void Ge(i);e===s&&o.splice(t,1)}s&&o.length||o.length>1?(i=Hl.Msg$$module$build$src$core$msg.DELETE_VARIABLE_CONFIRMATION.replace("%1",String(o.length+(s&&!s.workspace.isFlyout?1:0))).replace("%2",i),We(i,s=>{s&&e&&t.getVariableMap().deleteVariable(e)})):t.getVariableMap().deleteVariable(e)},$s=function(t,{addCoordinates:e=!1,addInputBlocks:s=!0,addNextBlocks:i=!0,doFullSerialization:o=!0,saveIds:n=!0}={}){if(t.isInsertionMarker())return null;const r={type:t.type,id:n?t.id:void 0};return e&&Cs(t,r),Is(t,r),Ss(t,r,o),Rs(t,r,o),ys(t,r,o),s&&Os(t,r,o,n),i&&ks(t,r,o,n),r},Is=function(t,e){t.isCollapsed()&&(e.collapsed=!0),t.isEnabled()||(e.disabledReasons=Array.from(t.getDisabledReasons())),t.isOwnDeletable()||(e.deletable=!1),t.isOwnMovable()||(e.movable=!1),t.isOwnEditable()||(e.editable=!1),void 0!==t.inputsInline&&t.inputsInline!==t.inputsInlineDefault&&(e.inline=t.inputsInline),t.data&&(e.data=t.data)},Cs=function(t,e){const s=t.workspace;t=t.getRelativeToSurfaceXY(),e.x=Math.round(s.RTL?s.getWidth()-t.x:t.x),e.y=Math.round(t.y)},Ss=function(t,e,s){t.saveExtraState?null!==(t=t.saveExtraState(s))&&(e.extraState=t):t.mutationToDom&&null!==(t=t.mutationToDom())&&(e.extraState=Uo(t).replace(' xmlns="https://developers.google.com/blockly/xml"',""))},Rs=function(t,e,s){const i=Object.create(null);for(const e of t.getIcons())we(e)&&(t=e.saveState(s))&&(i[e.getType().toString()]=t);Object.keys(i).length&&(e.icons=i)},ys=function(t,e,s){const i=Object.create(null);for(const e of t.getFields())e.isSerializable()&&(i[e.name]=e.saveState(s));Object.keys(i).length&&(e.fields=i)},Os=function(t,e,s,i){const o=Object.create(null);for(let e=0;e{t.disposed||t.setConnectionTracking(!0)},1)}return l},ws=function(t,e,{parentConnection:s,isShadow:i=!1}={}){if(!t.type)throw new Uh(t);const o=e.newBlock(t.type,t.id);return o.setShadow(i),Ms(o,t),Ds(o,t),xs(o,t),Ps(s,o,t),Bs(o,t),Fs(o,t),Us(o,t),Hs(o,t),Vs(o,e.rendered),o},Ls=function(t,e){if(st())for(t=Es(t,e),e=0;ee&&(e=s[i].length);var o=-1/0;let n,r=1;do{i=o,n=t,t=[],o=s.length/r;let l=1;for(let e=0;ei);return n},fi=function(t,e,s){const i=[0],o=[];for(var n=0;n1&&i[i.length-1]<=i[i.length-2]&&(e+=.5),e},$i=function(t,e,s){let i,o=fi(t,e,s);for(let n=0;no&&(o=l,i=r)}return i?$i(t,i,s):e},Ii=function(t,e){const s=[];for(let i=0;ivu&&xi()}else Ou!==yu&&(clearTimeout(Cu),Su=t.pageX,Ru=t.pageY,Cu=setTimeout(Gi,Nu))},Di=function(){Ou=yu=null,xi()},xi=function(){bu&&(bu=!1,Lu&&(Lu.style.display="none")),Cu&&(clearTimeout(Cu),Cu=0)},Pi=function(){xi(),fu=!0},Bi=function(){fu=!1},Fi=function(){Lu&&yu&&("function"==typeof Eu?Eu(Lu,yu):Ui())},Ui=function(){var t=Oi(yu);t=(t=Hl.wrap$$module$build$src$core$utils$string(t,$u)).split("\n");for(let e=0;es+window.scrollY&&(o-=Lu.offsetHeight+2*Au),t?i=Math.max(wu-window.scrollX,i):i+Lu.offsetWidth>e+window.scrollX-2*wu&&(i=e-Lu.offsetWidth-2*wu),{x:i,y:o}},Gi=function(){if(!fu&&(Ou=yu,Lu)){Lu.textContent="",Fi();var t=yu.RTL;Lu.style.direction=t?"rtl":"ltr",Lu.style.display="block",bu=!0;var{x:e,y:s}=Hi(t);Lu.style.left=e+"px",Lu.style.top=s+"px"}},Vi=function(){return Du},Wi=function(t){Du=t},Xi=function(){return xu},zi=function(t){xu=t},Yi=function(t){t=`${t}`.toLowerCase().trim();var e=Pu[t];if(e)return e;if(e="#"===(e="0x"===t.substring(0,2)?"#"+t.substring(2):t)[0]?e:"#"+e,/^#[0-9a-f]{6}$/.test(e))return e;if(/^#[0-9a-f]{3}$/.test(e))return["#",e[1],e[1],e[2],e[2],e[3],e[3]].join("");var s=t.match(/^(?:rgb)?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/);return s&&(t=Number(s[1]),e=Number(s[2]),s=Number(s[3]),t>=0&&t<256&&e>=0&&e<256&&s>=0&&s<256)?Ki(t,e,s):null},Ki=function(t,e,s){return e=t<<16|e<<8|s,t<16?"#"+(16777216|e).toString(16).substr(1):"#"+e.toString(16)},ji=function(t){return(t=Yi(t))?[(t=parseInt(t.substr(1),16))>>16,t>>8&255,255&t]:[0,0,0]},Ji=function(t,e,s){let i=0,o=0,n=0;if(0===e)n=o=i=s;else{const r=Math.floor(t/60),l=t/60-r;t=s*(1-e);const a=s*(1-e*l);switch(e=s*(1-e*(1-l)),r){case 1:i=a,o=s,n=t;break;case 2:i=t,o=s,n=e;break;case 3:i=t,o=a,n=s;break;case 4:i=e,o=t,n=s;break;case 5:i=s,o=t,n=a;break;case 6:case 0:i=s,o=e,n=t}}return Ki(Math.floor(i),Math.floor(o),Math.floor(n))},qi=function(t,e,s){return(t=Yi(t))&&(e=Yi(e))?(t=ji(t),e=ji(e),Ki(Math.round(e[0]+s*(t[0]-e[0])),Math.round(e[1]+s*(t[1]-e[1])),Math.round(e[2]+s*(t[2]-e[2])))):null},Zi=function(t){return Ji(t,Du,255*xu)},Qi=function(t,e,s){const i=[];var o=t.split("");o.push("");var n=0;t=[];let r=null;for(let c=0;c=t.bottom?e.top-s.height:e.bottom},mo=function(t){return!(null==t||!t.repositionForWindowResize)},Eo=function(){mo(Wu)&&Wu.repositionForWindowResize()||ao()},bo=function(){return Zu},fo=function(t){Zu=t},$o=function(t,e,s,i,o){if(lo(Qu,s,Oo,i),e.length){o||(t instanceof PointerEvent?o=new _c(t.clientX,t.clientY):(console.warn("Context menu opened with keyboard but no location given"),o=new _c(0,0)));var n=Io(e,s,t,o);td=n,Co(n,s,o),setTimeout(function(){n.focus()},1),Zu=null}else yo()},Io=function(t,e,s,i){const o=new oh;o.setRole(Zc.MENU);for(let n=0;n{setTimeout(()=>{r.callback(r.scope,s,e,i)},0)})},{})}return o},Co=function(t,e,s){const i=se();s=new mc(s.y+i.top,s.y+i.top,s.x+i.left,s.x+i.left),So(t);const o=t.getSize();e&&(s.left+=o.width,s.right+=o.width,i.left+=o.width,i.right+=o.width),go(i,s,o,e),t.focus()},So=function(t){var e=oo();if(!e)throw Error("Attempting to create a context menu when widget div is null");e=t.render(e),ct(e,"blocklyContextMenu"),T(e,"contextmenu",null,Ro),t.focus()},Ro=function(t){t.preventDefault(),t.stopPropagation()},yo=function(){let t;ho(Qu),Zu=null,null==(t=td)||t.dispose(),td=null},Oo=function(){td&&(td.dispose(),td=null)},Hl.callbackFactory$$module$build$src$core$contextmenu=function(t,e){return()=>{let s;Hl.disable$$module$build$src$core$events$utils();try{s=e instanceof Element?Xo(e,t.workspace):Ns(e,t.workspace);const i=t.getRelativeToSurfaceXY();i.x=t.RTL?i.x-Hl.config$$module$build$src$core$config.snapRadius:i.x+Hl.config$$module$build$src$core$config.snapRadius,i.y+=2*Hl.config$$module$build$src$core$config.snapRadius,s.moveBy(i.x,i.y)}finally{Hl.enable$$module$build$src$core$events$utils()}return st()&&!s.isShadow()&&J(new(rt(ua.BLOCK_CREATE))(s)),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(s),s}},ko=function(){return td},Ao=function(t,e){return(e=$(e,t.getParentSvg(),t.getInverseScreenCTM())).x/=t.scale,e.y/=t.scale,e},vo=function(t,e,s){e=Ao(t,e),cd.set(t,_c.difference(s,e))},No=function(t,e){if(e=Ao(t,e),!(t=cd.get(t)))throw Error("Drag not initialized");return _c.sum(t,e)},wo=function(t,e=!1){const s=Hl.createElement$$module$build$src$core$utils$xml("xml");var i=Mo(Hl.allUsedVarModels$$module$build$src$core$variables(t));i.hasChildNodes()&&s.appendChild(i);for(const i of t.getTopComments())s.appendChild(Lo(i,e));for(t=t.getTopBlocks(!0),i=0;i/g,"<$1$2>")},Ho=function(t){t=Uo(t).split("<");let e="";for(let s=1;s"!==i.slice(-2)&&(e+=" ")}return(t=(t=t.join("\n")).replace(/(<(\w+)\b[^>]*>[^\n]*)\n *<\/\2>/g,"$1")).replace(/^\n/,"")},Go=function(t,e){return e.setResizesEnabled(!1),e.clear(),t=Hl.domToWorkspace$$module$build$src$core$xml(t,e),e.setResizesEnabled(!0),t},Hl.domToWorkspace$$module$build$src$core$xml=function(t,e){let s=0;e.RTL&&(s=e.getWidth());const i=[];Tt();const o=Hl.getGroup$$module$build$src$core$events$utils();o||Hl.setGroup$$module$build$src$core$events$utils(!0),e.setResizesEnabled&&e.setResizesEnabled(!1);let n=!0;try{for(let o,r=0;o=t.childNodes[r];r++){const t=o.nodeName.toLowerCase(),r=o;if("block"===t||"shadow"===t&&!j()){const t=Xo(r,e);let o;i.push(t.id);const l=parseInt(null!=(o=r.getAttribute("x"))?o:"10",10);let a;const c=parseInt(null!=(a=r.getAttribute("y"))?a:"10",10);isNaN(l)||isNaN(c)||t.moveBy(e.RTL?s-l:l,c,["create"]),n=!1}else{if("shadow"===t)throw TypeError("Shadow block cannot be a top-level block.");if("comment"===t)Vo(r,e);else if("variables"===t){if(!n)throw Error("'variables' tag must exist once before block and shadow tag elements in the workspace XML, but it was found in another location.");zo(r,e),n=!1}}}}finally{Hl.setGroup$$module$build$src$core$events$utils(o),e.setResizesEnabled&&e.setResizesEnabled(!0),e.rendered&&De(),mt()}return J(new(rt(ua.FINISHED_LOADING))(e)),i},Vo=function(t,e){var s;const i=null!=(s=t.getAttribute("id"))?s:void 0;var o,n;let r;var l;let a;return(s=e.rendered?new fd(e,i):new bd(e,i)).setText(null!=(o=t.textContent)?o:""),o=parseInt(null!=(n=t.getAttribute("x"))?n:"",10),n=parseInt(null!=(r=t.getAttribute("y"))?r:"",10),isNaN(o)||isNaN(n)||(o=e.RTL?e.getWidth()-o:o,s.moveTo(new _c(o,n))),e=parseInt(null!=(l=t.getAttribute("w"))?l:"",10),l=parseInt(null!=(a=t.getAttribute("h"))?a:"",10),isNaN(e)||isNaN(l)||s.setSize(new Ec(e,l)),"true"===t.getAttribute("collapsed")&&s.setCollapsed(!0),"false"===t.getAttribute("editable")&&s.setEditable(!1),"false"===t.getAttribute("movable")&&s.setMovable(!1),"false"===t.getAttribute("deletable")&&s.setDeletable(!1),s},Wo=function(t,e){if(!e.getBlocksBoundingBox)return Hl.domToWorkspace$$module$build$src$core$xml(t,e);var s=e.getBlocksBoundingBox();if(t=Hl.domToWorkspace$$module$build$src$core$xml(t,e),s&&s.top!==s.bottom){var i=s.bottom;s=e.RTL?s.right:s.left;var o=1/0;let n=-1/0,r=1/0;for(let s=0;sn&&(n=i.x)}for(i=i-r+10,s=e.RTL?s-n:s-o,o=0;o=0;t--)s[t].initSvg();for(let t=s.length-1;t>=0;t--)s[t].queueRender();setTimeout(function(){t.disposed||t.setConnectionTracking(!0)},1),e.resizeContents()}else{const t=i.getDescendants(!1);for(let e=t.length-1;e>=0;e--)t[e].initModel()}}finally{Hl.enable$$module$build$src$core$events$utils()}if(st()){for(t=Es(e,s),e=0;e{isNaN(d)||isNaN(p)||(d=e.workspace.RTL?e.workspace.getWidth()-(d+l):d,g.setBubbleLocation(new _c(d,p))),g.setBubbleVisible(n)},1)}},Jo=function(t,e){for(let s=0;s100)){var e=t.workspace,s=t.getSvgRoot();e.getAudioManager().play("delete");var i,o=t.getRelativeToSurfaceXY(),n=s.cloneNode(!0);n.setAttribute("transform","translate("+o.x+","+o.y+")"),null==(i=e.getLayerManager())||i.appendToAnimationLayer({getSvgRoot:()=>n}),Bn(n,{x:o.x,y:o.y,width:t.width,height:t.height},e.RTL,new Date)}},Bn=function(t,e,s,i){const o=((new Date).getTime()-i.getTime())/150;o>1?pt(t):(t.setAttribute("transform","translate("+(e.x+(s?-1:1)*e.width/2*o)+","+(e.y+e.height/2*o)+") scale("+(1-o)+")"),setTimeout(Bn,10,t,e,s,i))},Fn=function(t){var e=t.workspace;const s=e.scale;if(e.getAudioManager().play("click"),!(s<1)){var i=e.getSvgXY(t.getSvgRoot());t.outputConnection?(i.x+=(t.RTL?3:-3)*s,i.y+=13*s):t.previousConnection&&(i.x+=(t.RTL?-23:23)*s,i.y+=3*s);var o=at(Tc.CIRCLE,{cx:i.x,cy:i.y,r:0,fill:"none",stroke:"#888","stroke-width":10},e.getParentSvg());t=at(Tc.ANIMATE,{id:"animationCircle",begin:"indefinite",attributeName:"r",dur:"150ms",from:0,to:25*s},o),e=at(Tc.ANIMATE,{id:"animationOpacity",begin:"indefinite",attributeName:"opacity",dur:"150ms",from:1,to:0},o),t.beginElement(),e.beginElement(),setTimeout(()=>{pt(o)},150)}},Un=function(t){if(Gn(),t.workspace.getAudioManager().play("disconnect"),!(t.workspace.scale<1)){var e=t.getHeightWidth().height;e=Math.atan(10/e)/Math.PI*180,t.RTL||(e*=-1),hp=t,Hn(t,e,new Date,0)}},Hn=function(t,e,s,i){const o=[.66,1,.66,0,-.66,-1,-.66,0];let n="";s.getTime()+200>(new Date).getTime()&&(n=`skewX(${Math.round(o[i%o.length]*e)})`,cp=setTimeout(Hn,15,t,e,s,i+1)),t.getSvgRoot().setAttribute("transform",`${t.getTranslation()} ${n}`)},Gn=function(){hp&&(cp&&(clearTimeout(cp),cp=null),hp.getSvgRoot().setAttribute("transform",hp.getTranslation()),hp=null)},Vn=function(t,e){t.workspace.RTL&&(e.x=t.workspace.getWidth()-e.x);const s=t.workspace,i=Hl.config$$module$build$src$core$config.snapRadius,o=_c.difference(e,t.getRelativeToSurfaceXY()),n=new _c(0,0),r=s.getAllBlocks(!1).filter(e=>e.id!=t.id).map(t=>t.getRelativeToSurfaceXY());for(;Wn(_c.sum(e,n),r)||Xn(t,_c.sum(o,n),i);)s.RTL?n.translate(-i,2*i):n.translate(i,2*i);t.moveTo(_c.sum(e,n))},Wn=function(t,e){return e.some(e=>Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1)},Xn=function(t,e,s){return t.getConnections_(!1).some(t=>!!t.closest(s,e).connection)},zn=function(t,e,s){const i=s.getBoundingRectangle(),o=i.right-i.left,n=Ys(e.top,i.top,e.top+e.height-(i.bottom-i.top))-i.top;let r=e.left;return e=e.left+e.width-o,t.RTL?r=Math.min(e,r):e=Math.max(r,e),!(!(t=Ys(r,i.left,e)-i.left)&&!n||(s.moveBy(t,n,["inbounds"]),0))},Yn=function(t){return e=>{var s,i=t.getMetricsManager();if(i.hasFixedEdges()&&!t.isDragging())if(Ca.includes(null!=(s=e.type)?s:"")){s=i.getScrollMetrics(!0);const o=Kn(t,e);o&&(i=Hl.getGroup$$module$build$src$core$events$utils()||!1,Hl.setGroup$$module$build$src$core$events$utils(e.group),zn(t,s,o)&&!e.group&&console.warn("Moved object in bounds but there was no event group. This may break undo."),Hl.setGroup$$module$build$src$core$events$utils(i))}else U(e)&&e.scale&&e.oldScale&&e.scale>e.oldScale&&jn(t)}},Kn=function(t,e){let s=null;switch(e.type){case ua.BLOCK_CREATE:case ua.BLOCK_MOVE:(s=t.getBlockById(e.blockId))&&(s=s.getRootBlock());break;case ua.COMMENT_CREATE:case ua.COMMENT_MOVE:case ua.COMMENT_RESIZE:s=t.getCommentById(e.commentId)}return s},jn=function(t){var e=t.getMetricsManager();if(e.hasFixedEdges()&&!t.isDragging()){e=e.getScrollMetrics(!0);var s=t.getTopBoundedElements();for(let i,o=0;i=s[o];o++)zn(t,e,i)}},Jn=function(t){return t&&"function"==typeof t.isDeletable&&"function"==typeof t.dispose&&"function"==typeof t.setDeleteStyle},qn=function(t,e){const s=t.getIcons();for(const i of t.inputList){if(!i.isVisible())continue;let o;if(s.push(...i.fieldRow),null!=(o=i.connection)&&o.targetBlock())if(t=i.connection.targetBlock(),i.connection.type!==Vd.NEXT_STATEMENT||e)s.push(t);else{let e;(t=null==(e=t.lastConnectionInStack(!1))?void 0:e.getSourceBlock())&&s.push(t)}else{let t;(null==(t=i.connection)?void 0:t.type)===Vd.INPUT_VALUE&&s.push(i.connection)}}return s},Zn=function(t,e){const s=t.workspace.getTopBoundedElements(!0).filter(t=>It(t));let i=null;if((t=s.indexOf(t instanceof Ep?t.getRootBlock():t)+e)>=0&&t=s.length&&(i=s[0]),e<0&&i instanceof Ep){let t,e;return null!=(e=null==(t=i.lastConnectionInStack(!1))?void 0:t.getSourceBlock())?e:i}return i},Qn=function(t,e){var s;let i;const o=t instanceof Ep?null!=(i=null==(s=t.outputConnection)?void 0:s.targetBlock())?i:t.getSurroundParent():t.getSourceBlock();return o instanceof Ep?-1===(t=(s=qn(o,e>0)).indexOf(t))?null:(e=t+e)>=0&&e!t.getReturnTypes()).map(t=>[t.getName(),t.getParameters().map(t=>t.getName()),!1]);t.getBlocksByType("procedures_defnoreturn",!1).forEach(t=>{!nr(t)&&Je(t)&&e.push(t.getProcedureDef())});const s=t.getProcedureMap().getProcedures().filter(t=>!!t.getReturnTypes()).map(t=>[t.getName(),t.getParameters().map(t=>t.getName()),!0]);return t.getBlocksByType("procedures_defreturn",!1).forEach(t=>{!nr(t)&&Je(t)&&s.push(t.getProcedureDef())}),e.sort(ar),s.sort(ar),[e,s]},ar=function(t,e){return t[0].localeCompare(e[0],void 0,{sensitivity:"base"})},Hl.findLegalName$$module$build$src$core$procedures=function(t,e){if(e.isInFlyout)return t;for(t=t||Hl.Msg$$module$build$src$core$msg.UNNAMED_KEY||"unnamed";!cr(t,e.workspace,e);){const e=t.match(/^(.*?)(\d+)$/);t=e?e[1]+(parseInt(e[2])+1):t+"2"}return t},cr=function(t,e,s){return!hr(t,e,s)},hr=function(t,e,s){for(const i of e.getAllBlocks(!1))if(i!==s&&Je(i)&&Hl.Names$$module$build$src$core$names.equals(i.getProcedureDef()[0],t))return!0;s=s&&nr(s)?null==s?void 0:s.getProcedureModel():void 0;for(const i of e.getProcedureMap().getProcedures())if(i!==s&&Hl.Names$$module$build$src$core$names.equals(i.getName(),t))return!0;return!1},Hl.rename$$module$build$src$core$procedures=function(t){var e=this.getSourceBlock();if(!e)throw new Hu;t=t.trim();const s=Hl.findLegalName$$module$build$src$core$procedures(t,e);nr(e)&&!e.isInsertionMarker()&&e.getProcedureModel().setName(s);const i=this.getValue();if(i!==t&&i!==s)for(t=e.workspace.getAllBlocks(!1),e=0;eEr(e,t)||qe(e)&&Hl.Names$$module$build$src$core$names.equals(e.getProcedureCall(),t))},Er=function(t,e){return nr(t)&&!t.isProcedureDef()&&t.getProcedureModel()&&Hl.Names$$module$build$src$core$names.equals(t.getProcedureModel().getName(),e)},Hl.mutateCallers$$module$build$src$core$procedures=function(t){const e=j();var s=t.getProcedureDef()[0];const i=t.mutationToDom(!0);t=mr(s,t.workspace);for(let n,r=0;n=t[r];r++){s=(s=n.mutationToDom())&&le(s),n.domToMutation&&n.domToMutation(i);var o=n.mutationToDom();s!==(o=o&&le(o))&&(Hl.setRecordUndo$$module$build$src$core$events$utils(!1),J(new(rt(ua.BLOCK_CHANGE))(n,"mutation",null,s,o)),Hl.setRecordUndo$$module$build$src$core$events$utils(e))}},Hl.getDefinition$$module$build$src$core$procedures=function(t,e){for(const s of e.getAllBlocks(!1))if(nr(s)&&s.isProcedureDef()&&Hl.Names$$module$build$src$core$names.equals(s.getProcedureModel().getName(),t)||Je(s)&&Hl.Names$$module$build$src$core$names.equals(s.getProcedureDef()[0],t))return s;return null},br=function(t){return t.isDynamic},fr=function(t){return void 0!==t.pathDown&&void 0!==t.pathUp},$r=function(t){return void 0!==t.pathLeft&&void 0!==t.pathRight},Ir=function(e,s){t(zl.RENDERER,e,s)},Cr=function(t){i(zl.RENDERER,t)},Sr=function(t,e,s){return(t=new(r(zl.RENDERER,t))(t)).init(e,s),t},Rr=function(t){cs(t.getTargetWorkspace(),void 0,"String")},yr=function(t){cs(t.getTargetWorkspace(),void 0,"Number")},Or=function(t){cs(t.getTargetWorkspace(),void 0,"Colour")},kr=function(t){return Ar(t,!1)},Ar=function(t,e=!0){return oa.variables_set_dynamic||oa.variables_get_dynamic||console.warn("There are no dynamic variable blocks, but there is a dynamic variable category."),e?(Qe("The XML return value of Blockly.VariablesDynamic.flyoutCategory()","v12","v13","the same method, but handle a return type of FlyoutItemInfo[] (JSON) instead."),vr(t)):(t.registerButtonCallback("CREATE_VARIABLE_STRING",Rr),t.registerButtonCallback("CREATE_VARIABLE_NUMBER",yr),t.registerButtonCallback("CREATE_VARIABLE_COLOUR",Or),[{kind:"button",text:Hl.Msg$$module$build$src$core$msg.NEW_STRING_VARIABLE,callbackkey:"CREATE_VARIABLE_STRING"},{kind:"button",text:Hl.Msg$$module$build$src$core$msg.NEW_NUMBER_VARIABLE,callbackkey:"CREATE_VARIABLE_NUMBER"},{kind:"button",text:Hl.Msg$$module$build$src$core$msg.NEW_COLOUR_VARIABLE,callbackkey:"CREATE_VARIABLE_COLOUR"},...is(t,t.getVariableMap().getAllVariables(),!1,"variables_get_dynamic","variables_set_dynamic")])},vr=function(t){let e=[],s=document.createElement("button");return s.setAttribute("text",Hl.Msg$$module$build$src$core$msg.NEW_STRING_VARIABLE),s.setAttribute("callbackKey","CREATE_VARIABLE_STRING"),e.push(s),s=document.createElement("button"),s.setAttribute("text",Hl.Msg$$module$build$src$core$msg.NEW_NUMBER_VARIABLE),s.setAttribute("callbackKey","CREATE_VARIABLE_NUMBER"),e.push(s),s=document.createElement("button"),s.setAttribute("text",Hl.Msg$$module$build$src$core$msg.NEW_COLOUR_VARIABLE),s.setAttribute("callbackKey","CREATE_VARIABLE_COLOUR"),e.push(s),t.registerButtonCallback("CREATE_VARIABLE_STRING",Rr),t.registerButtonCallback("CREATE_VARIABLE_NUMBER",yr),t.registerButtonCallback("CREATE_VARIABLE_COLOUR",Or),t=Nr(t),e.concat(t)},Nr=function(t){const e=[];if((t=t.getVariableMap().getAllVariables()).length>0){if(oa.variables_set_dynamic){var s=t[t.length-1];const i=Hl.createElement$$module$build$src$core$utils$xml("block");i.setAttribute("type","variables_set_dynamic"),i.setAttribute("gap","24"),i.appendChild(Ts(s)),e.push(i)}if(oa.variables_get_dynamic){t.sort(bs);for(let i,o=0;i=t[o];o++)(s=Hl.createElement$$module$build$src$core$utils$xml("block")).setAttribute("type","variables_get_dynamic"),s.setAttribute("gap","8"),s.appendChild(Ts(i)),e.push(s)}}return e},wr=function(t){t.resizeContents()},Lr=function(t,e){const s=t.toCopyData();return d_=s,p_=Ct(t)&&t.workspace instanceof Gg?t.workspace:null,g_=e,s},Mr=function(){return d_},Dr=function(t){d_=t},xr=function(){return p_},Pr=function(t){p_=t},Br=function(){return g_},Fr=function(t){g_=t},Ur=function(t,e,s){return t&&e?Hr(t,e,s):d_&&p_?Hr(d_,p_,g_):null},Hr=function(t,e,s){let i,o,n;return e=e.isMutator?e:null!=(i=e.options.parentWorkspace)?i:e,null!=(n=null==(o=l(zl.PASTER,t.paster,!1))?void 0:o.paste(t,e,s))?n:null},Gr=function(t){return t&&"function"==typeof t.toCopyData},Vr=function(){ja.registry.register({name:T_.ESCAPE,preconditionFn:t=>!t.isReadOnly(),callback:t=>(t.hideChaff(),!0),keyCodes:[Fd.ESC]})},Wr=function(){ja.registry.register({name:T_.DELETE,preconditionFn:(t,e)=>(e=e.focusedNode,!t.isReadOnly()&&null!=e&&Jn(e)&&e.isDeletable()&&!t.isDragging()&&!Hl.getFocusManager$$module$build$src$core$focus_manager().ephemeralFocusTaken()),callback:(t,e,s,i)=>(e.preventDefault(),(t=i.focusedNode)instanceof Ep?t.checkAndDelete():Jn(t)&&t.isDeletable()&&(Hl.setGroup$$module$build$src$core$events$utils(!0),t.dispose(),Hl.setGroup$$module$build$src$core$events$utils(!1)),!0),keyCodes:[Fd.DELETE,Fd.BACKSPACE]})},Xr=function(t){return!!(Gr(t)&&Jn(t)&&ir(t))&&(t.isCopyable?t.isCopyable():t instanceof Ep||t instanceof fd?t.isOwnDeletable()&&t.isOwnMovable():t.isDeletable()&&t.isMovable())},zr=function(t){return Xr(t)&&Jn(t)&&t.isDeletable()},Yr=function(){const t=ja.registry.createSerializedKey(Fd.C,[Fd.CTRL_CMD]);ja.registry.register({name:T_.COPY,preconditionFn:(t,e)=>(e=e.focusedNode,t=t.isFlyout?t.targetWorkspace:t,!!e&&!!t&&!t.isDragging()&&!Hl.getFocusManager$$module$build$src$core$focus_manager().ephemeralFocusTaken()&&Xr(e)),callback:(t,e,s,i)=>(e.preventDefault(),!!((e=i.focusedNode)&&Gr(e)&&Xr(e))&&!!(t=t.isFlyout?t.targetWorkspace:t)&&(e.workspace.isFlyout||t.hideChaff(),t=ir(e)&&e.workspace==t?e.getRelativeToSurfaceXY():void 0,!!Lr(e,t))),keyCodes:[t]})},Kr=function(){const t=ja.registry.createSerializedKey(Fd.X,[Fd.CTRL_CMD]);ja.registry.register({name:T_.CUT,preconditionFn:(t,e)=>!!(e=e.focusedNode)&&!t.isReadOnly()&&!t.isDragging()&&!Hl.getFocusManager$$module$build$src$core$focus_manager().ephemeralFocusTaken()&&zr(e),callback:(t,e,s,i)=>!!((t=i.focusedNode)&&zr(t)&&Gr(t))&&(e=ir(t)?t.getRelativeToSurfaceXY():void 0,e=Lr(t,e),t instanceof Ep?t.checkAndDelete():Jn(t)&&t.dispose(),!!e),keyCodes:[t]})},jr=function(){const t=ja.registry.createSerializedKey(Fd.V,[Fd.CTRL_CMD]);ja.registry.register({name:T_.PASTE,preconditionFn(){var t=xr();return!(!t||!t.rendered||(t=t.isFlyout?t.targetWorkspace:t,!Mr()||!t||t.isReadOnly()||t.isDragging()||Hl.getFocusManager$$module$build$src$core$focus_manager().ephemeralFocusTaken()))},callback(t,e){if(!(t=Mr()))return!1;var s=xr();if(!s)return!1;if(!(s=s.isFlyout?s.targetWorkspace:s)||s.isReadOnly())return!1;if(e instanceof PointerEvent)return e=oe(s,new _c(e.clientX,e.clientY)),!!Ur(t,s,e);if(!(e=Br()))return!!Ur(t,s);const{left:i,top:o,width:n,height:r}=s.getMetricsManager().getViewMetrics(!0);return new mc(o,o+r,i,i+n).contains(e.x,e.y)?!!Ur(t,s):(e=new _c(i+n/2,o+r/2),!!Ur(t,s,e))},keyCodes:[t]})},Jr=function(){const t=ja.registry.createSerializedKey(Fd.Z,[Fd.CTRL_CMD]);ja.registry.register({name:T_.UNDO,preconditionFn:t=>!t.isReadOnly()&&!t.isDragging()&&!Hl.getFocusManager$$module$build$src$core$focus_manager().ephemeralFocusTaken(),callback:(t,e)=>(t.hideChaff(),t.undo(!1),e.preventDefault(),!0),keyCodes:[t]})},qr=function(){const t=ja.registry.createSerializedKey(Fd.Z,[Fd.CTRL_CMD,Fd.SHIFT]),e=ja.registry.createSerializedKey(Fd.Y,[Fd.CTRL]);ja.registry.register({name:T_.REDO,preconditionFn:t=>!t.isDragging()&&!t.isReadOnly()&&!Hl.getFocusManager$$module$build$src$core$focus_manager().ephemeralFocusTaken(),callback:(t,e)=>(t.hideChaff(),t.undo(!0),e.preventDefault(),!0),keyCodes:[t,e]})},Zr=function(){const t=ja.registry.createSerializedKey(Fd.ENTER,[Fd.CTRL_CMD]);ja.registry.register({name:T_.MENU,preconditionFn:t=>!t.isDragging(),callback:(t,e)=>{if(t=Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode(),sr(t)){let s;return t.showContextMenu(e),null==(s=ko())||s.highlightNext(),!0}return!1},keyCodes:[t]})},Qr=function(){Vr(),Wr(),Yr(),Kr(),jr(),Jr(),qr(),Zr()},tl=function(t){const e=t.saveState();return t.getParameters().length?(e.parameters=t.getParameters().map(t=>t.saveState()),e):e},el=function(t,e,s,i){if(t=t.loadState(s,i),!s.parameters)return t;for(const[o,n]of s.parameters.entries())t.insertParameter(e.loadState(n,i),o);return t},sl=function(t){const e=Object.create(null),s=a(zl.SERIALIZER,!0);for(const i in s){let o;const n=null==(o=s[i])?void 0:o.save(t);n&&(e[i]=n)}return e},il=function(t,e,{recordUndo:s=!1}={}){var i=a(zl.SERIALIZER,!0);if(i){i=Object.entries(i).sort((t,e)=>e[1].priority-t[1].priority);var o=j();Hl.setRecordUndo$$module$build$src$core$events$utils(s),(s=Hl.getGroup$$module$build$src$core$events$utils())||Hl.setGroup$$module$build$src$core$events$utils(!0),Tt(),e instanceof Gg&&e.setResizesEnabled(!1);for(const[,t]of i.reverse()){let s;null==(s=t)||s.clear(e)}for(const[s,o]of i.reverse())if(t[s]){let i;null==(i=o)||i.load(t[s],e)}e instanceof Gg&&e.setResizesEnabled(!0),mt(),J(new(rt(ua.FINISHED_LOADING))(e)),Hl.setGroup$$module$build$src$core$events$utils(s),Hl.setRecordUndo$$module$build$src$core$events$utils(o)}},ol=function(t,e){let s=null;var i;if(s="string"==typeof t?document.getElementById(t)||document.querySelector(t):t,!document.contains(s)&&document!==(null==(i=s)?void 0:i.ownerDocument))throw Error("Error: container is not in current document");t=new wd(e||{}),i=document.createElement("div"),ct(i,"injectionDiv"),null!=e&&e.rtl&&ct(i,"blocklyRTL"),s.appendChild(i),e=nl(i,t);const o=rl(i,e,t);return ll(o),vt(o),xt(o),i.addEventListener("focusin",function(){vt(o)}),T(i,"keydown",null,Ht),o},nl=function(t,e){t.setAttribute("dir","LTR"),Wt(e.hasCss,e.pathToMedia);const s=at(Tc.SVG,{xmlns:Pa,"xmlns:html":Ba,"xmlns:xlink":Fa,version:"1.1",class:"blocklySvg"},t),i=at(Tc.DEFS,{},s),o=String(Math.random()).substring(2);return e.gridPattern=Zp.createDom(o,e.gridOptions,i,t),s},rl=function(t,e,s){s.parentWorkspace=null;const i=(s=new Gg(s)).options;s.scale=i.zoomOptions.startScale,e.appendChild(s.createDom("blocklyMainBackground",t));var o=s.getRenderer().getClassName();return o&&ct(t,o),(o=s.getTheme().getClassName())&&ct(t,o),!i.hasCategories&&i.languageTree&&(t=s.addFlyout(Tc.SVG),gt(t,e)),i.hasTrashcan&&s.addTrashcan(),i.zoomOptions&&i.zoomOptions.controls&&s.addZoomControls(),s.getThemeManager().subscribe(e,"workspaceBackgroundColour","background-color"),s.translate(0,0),s.addChangeListener(Yn(s)),xt(s),ro(),Ks(),Ai(),s},ll=function(t){const e=t.options;var s=t.getParentSvg();if(T(s.parentNode,"contextmenu",null,function(t){b(t)||t.preventDefault()}),s=T(window,"resize",null,function(){xi(),t.hideComponents(!0),_i(),Eo(),xt(t),jn(t)}),t.setResizeHandlerWrapper(s),al(),e.languageTree){s=t.getToolbox();const i=t.getFlyout(!0);s?s.init():i&&(i.init(t),i.show(e.languageTree),"function"==typeof i.scrollToStart&&i.scrollToStart())}e.hasTrashcan&&t.trashcan.init(),e.zoomOptions&&e.zoomOptions.controls&&t.zoomControls_.init(),e.moveOptions&&e.moveOptions.scrollbars?(t.scrollbar=new Vp(t,!0===e.moveOptions.scrollbars||!!e.moveOptions.scrollbars.horizontal,!0===e.moveOptions.scrollbars||!!e.moveOptions.scrollbars.vertical,"blocklyMainWorkspaceScrollbar"),t.scrollbar.resize()):t.setMetrics({x:.5,y:.5}),e.hasSounds&&cl(e.pathToMedia,t)},al=function(){F_||(T(document,"scroll",null,function(){const t=yt();for(let e,s=0;e=t[s];s++)e instanceof Gg&&e.updateInverseScreenCTM()}),m(document,"touchend",null,u),m(document,"touchcancel",null,u)),F_=!0},cl=function(t,e){(e=e.getAudioManager()).load([`${t}click.mp3`],"click"),e.load([`${t}disconnect.mp3`],"disconnect"),e.load([`${t}delete.mp3`],"delete")},hl=function(t){if(!t||!t.isSimpleReporter())return!1;let e;return null==(e=t.getFields().next().value)?void 0:e.isFullBlockField()},ul=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.UNDO,preconditionFn:t=>t.workspace.getUndoStack().length>0?"enabled":"disabled",callback(t){t.workspace.undo(!1)},scopeType:sd.ScopeType.WORKSPACE,id:"undoWorkspace",weight:1})},dl=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.REDO,preconditionFn:t=>t.workspace.getRedoStack().length>0?"enabled":"disabled",callback(t){t.workspace.undo(!0)},scopeType:sd.ScopeType.WORKSPACE,id:"redoWorkspace",weight:2})},pl=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.CLEAN_UP,preconditionFn:t=>t.workspace.isMovable()?t.workspace.getTopBlocks(!1).length>1?"enabled":"disabled":"hidden",callback(t){t.workspace.cleanUp()},scopeType:sd.ScopeType.WORKSPACE,id:"cleanWorkspace",weight:3})},gl=function(t,e){function s(e){o--,e.setCollapsed(t),0===o&&Hl.setGroup$$module$build$src$core$events$utils(!1)}let i=0,o=0;Hl.setGroup$$module$build$src$core$events$utils(!0);for(let t=0;tHl.Msg$$module$build$src$core$msg.COLLAPSE_ALL,preconditionFn(t){if(t.workspace.options.collapse){t=t.workspace.getTopBlocks(!1);for(let e=0;eHl.Msg$$module$build$src$core$msg.EXPAND_ALL,preconditionFn(t){if(t.workspace.options.collapse){t=t.workspace.getTopBlocks(!1);for(let e=0;et.workspace?1===(t=El(t.workspace).length)?Hl.Msg$$module$build$src$core$msg.DELETE_BLOCK:Hl.Msg$$module$build$src$core$msg.DELETE_X_BLOCKS.replace("%1",`${t}`):"",preconditionFn:t=>t.workspace&&El(t.workspace).length>0?"enabled":"disabled",callback(t){if(t.workspace){t.workspace.cancelCurrentGesture();var e=El(t.workspace);e.length<2?bl(e):We(Hl.Msg$$module$build$src$core$msg.DELETE_ALL_BLOCKS.replace("%1",String(e.length)),function(t){t&&bl(e)})}},scopeType:sd.ScopeType.WORKSPACE,id:"workspaceDelete",weight:6})},$l=function(){ul(),dl(),pl(),_l(),Tl(),fl()},Il=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.DUPLICATE_BLOCK,preconditionFn:t=>!(t=t.block).isInFlyout&&t.isDeletable()&&t.isMovable()?t.isDuplicatable()?"enabled":"disabled":"hidden",callback(t){if(t.block){var e=t.block.toCopyData();e&&Ur(e,t.block.workspace)}},scopeType:sd.ScopeType.BLOCK,id:"blockDuplicate",weight:1})},Cl=function(){sd.registry.register({displayText:t=>t.block.hasIcon(Pp.TYPE)?Hl.Msg$$module$build$src$core$msg.REMOVE_COMMENT:Hl.Msg$$module$build$src$core$msg.ADD_COMMENT,preconditionFn:t=>!(t=t.block)||t.isInFlyout||!t.workspace.options.comments||t.isCollapsed()||!t.isEditable()||!t.hasIcon(Pp.TYPE)&&hl(t)?"hidden":"enabled",callback(t){(t=t.block)&&t.hasIcon(Pp.TYPE)?t.setCommentText(null):t.setCommentText("")},scopeType:sd.ScopeType.BLOCK,id:"blockComment",weight:2})},Sl=function(){sd.registry.register({displayText:t=>t.block.getInputsInline()?Hl.Msg$$module$build$src$core$msg.EXTERNAL_INPUTS:Hl.Msg$$module$build$src$core$msg.INLINE_INPUTS,preconditionFn(t){if(!(t=t.block).isInFlyout&&t.isMovable()&&!t.isCollapsed())for(let e=1;et.block.isCollapsed()?Hl.Msg$$module$build$src$core$msg.EXPAND_BLOCK:Hl.Msg$$module$build$src$core$msg.COLLAPSE_BLOCK,preconditionFn:t=>!(t=t.block).isInFlyout&&t.isMovable()&&t.workspace.options.collapse?"enabled":"hidden",callback(t){t.block.setCollapsed(!t.block.isCollapsed())},scopeType:sd.ScopeType.BLOCK,id:"blockCollapseExpand",weight:4})},yl=function(){sd.registry.register({displayText:t=>t.block.hasDisabledReason(ah)?Hl.Msg$$module$build$src$core$msg.ENABLE_BLOCK:Hl.Msg$$module$build$src$core$msg.DISABLE_BLOCK,preconditionFn(t){if(!(t=t.block).isInFlyout&&t.workspace.options.disable&&t.isEditable()){var e=t.getDisabledReasons();return e=e.size>(e.has(ah)?1:0),t.getInheritedDisabled()||e?"disabled":"enabled"}return"hidden"},callback(t){t=t.block;const e=Hl.getGroup$$module$build$src$core$events$utils();e||Hl.setGroup$$module$build$src$core$events$utils(!0),t.setDisabledReason(!t.hasDisabledReason(ah),ah),Hl.setGroup$$module$build$src$core$events$utils(e)},scopeType:sd.ScopeType.BLOCK,id:"blockDisable",weight:5})},Ol=function(){sd.registry.register({displayText(t){var e=t.block;return t=e.getDescendants(!1).length,(e=e.getNextBlock())&&(t-=e.getDescendants(!1).length),1===t?Hl.Msg$$module$build$src$core$msg.DELETE_BLOCK:Hl.Msg$$module$build$src$core$msg.DELETE_X_BLOCKS.replace("%1",`${t}`)},preconditionFn:t=>!t.block.isInFlyout&&t.block.isDeletable()?"enabled":"hidden",callback(t){t.block&&t.block.checkAndDelete()},scopeType:sd.ScopeType.BLOCK,id:"blockDelete",weight:6})},kl=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.HELP,preconditionFn:t=>("function"==typeof(t=t.block).helpUrl?t.helpUrl():t.helpUrl)?"enabled":"hidden",callback(t){t.block.showHelp()},scopeType:sd.ScopeType.BLOCK,id:"blockHelp",weight:7})},Al=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.REMOVE_COMMENT,preconditionFn(t){let e;return null!=(e=t.comment)&&e.isDeletable()?"enabled":"hidden"},callback(t){let e;Hl.setGroup$$module$build$src$core$events$utils(!0),null==(e=t.comment)||e.dispose(),Hl.setGroup$$module$build$src$core$events$utils(!1)},scopeType:sd.ScopeType.COMMENT,id:"commentDelete",weight:6})},vl=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.DUPLICATE_COMMENT,preconditionFn(t){let e;return null!=(e=t.comment)&&e.isMovable()?"enabled":"hidden"},callback(t){if(t.comment){var e=t.comment.toCopyData();e&&Ur(e,t.comment.workspace)}},scopeType:sd.ScopeType.COMMENT,id:"commentDuplicate",weight:1})},Nl=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.ADD_COMMENT,preconditionFn:t=>{let e;return null!=(e=t.workspace)&&e.isMutator?"hidden":"enabled"},callback:(t,e,s,i)=>{(t=t.workspace)&&(Hl.setGroup$$module$build$src$core$events$utils(!0),(e=new fd(t)).moveTo(oe(t,new _c(i.x,i.y))),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(e),Hl.setGroup$$module$build$src$core$events$utils(!1))},scopeType:sd.ScopeType.WORKSPACE,id:"commentCreate",weight:8})},wl=function(){Il(),Cl(),Sl(),Rl(),yl(),Ol(),kl()},Ll=function(){vl(),Al(),Nl()},Ml=function(){$l(),wl()},Dl=function(t){return t&&"function"==typeof t.paste},xl=function(t){return t&&"function"==typeof t.getSvgRoot},Pl=function(t){return t.isSelectable()},Bl=function(t){At().hideChaff(t)},(Fl=Fl||{}).scope={},Fl.ASSUME_ES5=!1,Fl.ASSUME_ES6=!1,Fl.ASSUME_ES2020=!1,Fl.ASSUME_NO_NATIVE_MAP=!1,Fl.ASSUME_NO_NATIVE_SET=!1,Fl.ISOLATE_POLYFILLS=!1,Fl.FORCE_POLYFILL_PROMISE=!1,Fl.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION=!1,Fl.INSTRUMENT_ASYNC_CONTEXT=!0,Fl.objectCreate=Fl.ASSUME_ES5||"function"==typeof Object.create?Object.create:function(t){var e=function(){};return e.prototype=t,new e},Fl.defineProperty=Fl.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(t,e,s){return t==Array.prototype||t==Object.prototype||(t[e]=s.value),t},Fl.getGlobal=function(t){t=["object"==typeof globalThis&&globalThis,t,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof s.g&&s.g];for(var e=0;e>>0,Fl.propertyToPolyfillSymbol[o]=Fl.IS_SYMBOL_NATIVE?Fl.global.Symbol(o):Fl.POLYFILL_PREFIX+s+"$"+o),Fl.defineProperty(i,Fl.propertyToPolyfillSymbol[o],{configurable:!0,writable:!0,value:e})))},Fl.getConstructImplementation=function(){if(Fl.TRUST_ES6_POLYFILLS&&"undefined"!=typeof Reflect&&Reflect.construct){if(function(){function t(){}return new t,Reflect.construct(t,[],function(){}),new t instanceof t}())return Reflect.construct;var t=Reflect.construct;return function(e,s,i){return e=t(e,s),i&&Reflect.setPrototypeOf(e,i.prototype),e}}return function(t,e,s){return void 0===s&&(s=t),s=Fl.objectCreate(s.prototype||Object.prototype),Function.prototype.apply.call(t,s,e)||s}},Fl.construct=Fl.getConstructImplementation(),Fl.underscoreProtoCanBeSet=function(){var t={};try{return t.__proto__={a:!0},t.a}catch(t){}return!1},Fl.setPrototypeOf=Fl.ASSUME_ES6||Fl.TRUST_ES6_POLYFILLS&&"function"==typeof Object.setPrototypeOf?Object.setPrototypeOf:Fl.underscoreProtoCanBeSet()?function(t,e){if(t.__proto__=e,t.__proto__!==e)throw new TypeError(t+" is not extensible");return t}:null,Fl.inherits=function(t,e){if(t.prototype=Fl.objectCreate(e.prototype),t.prototype.constructor=t,Fl.ASSUME_ES6||Fl.setPrototypeOf){var s=Fl.setPrototypeOf;s(t,e)}else for(s in e)if("prototype"!=s)if(Object.defineProperties){var i=Object.getOwnPropertyDescriptor(e,s);i&&Object.defineProperty(t,s,i)}else t[s]=e[s];t.superClass_=e.prototype},Fl.arrayIteratorImpl=function(t){var e=0;return function(){return e0;){var t=this.properties_.pop();if(t in this.object_)return t}return null},Fl.generator.Context.PropertyIterator.prototype.getNext=Fl.generator.Context.PropertyIterator.prototype.getNext,Fl.generator.Engine_=function(t){this.context_=new Fl.generator.Context,this.program_=t},Fl.generator.Engine_.prototype.next_=function(t){return this.context_.start_(),this.context_.yieldAllIterator_?this.yieldAllStep_(this.context_.yieldAllIterator_.next,t,this.context_.next_):(this.context_.next_(t),this.nextStep_())},Fl.generator.Engine_.prototype.return_=function(t){this.context_.start_();var e=this.context_.yieldAllIterator_;return e?this.yieldAllStep_("return"in e?e.return:function(t){return{value:t,done:!0}},t,this.context_.return):(this.context_.return(t),this.nextStep_())},Fl.generator.Engine_.prototype.throw_=function(t){return this.context_.start_(),this.context_.yieldAllIterator_?this.yieldAllStep_(this.context_.yieldAllIterator_.throw,t,this.context_.next_):(this.context_.throw_(t),this.nextStep_())},Fl.generator.Engine_.prototype.yieldAllStep_=function(t,e,s){try{var i=t.call(this.context_.yieldAllIterator_,e);if(Fl.generator.ensureIteratorResultIsObject_(i),!i.done)return this.context_.stop_(),i;var o=i.value}catch(t){return this.context_.yieldAllIterator_=null,this.context_.throw_(t),this.nextStep_()}return this.context_.yieldAllIterator_=null,s.call(this.context_,o),this.nextStep_()},Fl.generator.Engine_.prototype.nextStep_=function(){for(;this.context_.nextAddress;)try{var t=this.program_(this.context_);if(t)return this.context_.stop_(),{value:t.value,done:!1}}catch(t){this.context_.yieldResult=void 0,this.context_.throw_(t)}if(this.context_.stop_(),this.context_.abruptCompletion_){if(t=this.context_.abruptCompletion_,this.context_.abruptCompletion_=null,t.isException)throw t.exception;return{value:t.return,done:!0}}return{value:void 0,done:!0}},Fl.generator.Generator_=function(t){this.next=function(e){return t.next_(e)},this.throw=function(e){return t.throw_(e)},this.return=function(e){return t.return_(e)},this[Symbol.iterator]=function(){return this}},Fl.generator.createGenerator=function(t,e){return e=new Fl.generator.Generator_(new Fl.generator.Engine_(e)),Fl.setPrototypeOf&&t.prototype&&Fl.setPrototypeOf(e,t.prototype),e},Fl.asyncExecutePromiseGenerator=function(t){function e(e){return t.next(e)}function s(e){return t.throw(e)}return new Promise(function(i,o){!function t(n){n.done?i(n.value):Promise.resolve(n.value).then(e,s).then(t,o)}(t.next())})},Fl.asyncExecutePromiseGeneratorFunction=function(t){return Fl.asyncExecutePromiseGenerator(t())},Fl.asyncExecutePromiseGeneratorProgram=function(t){return Fl.asyncExecutePromiseGenerator(new Fl.generator.Generator_(new Fl.generator.Engine_(t)))},Fl.polyfill("globalThis",function(t){return t||Fl.global},"es_2020","es3"),Fl.polyfill("Array.prototype.includes",function(t){return t||function(t,e){var s=this;s instanceof String&&(s=String(s));var i=s.length;for((e=e||0)<0&&(e=Math.max(e+i,0));e0?(s=Array.prototype.flat.call(s,t-1),e.push.apply(e,s)):e.push(s)}),e}},"es9","es5"),Fl.polyfill("Object.entries",function(t){return t||function(t){var e,s=[];for(e in t)Fl.owns(t,e)&&s.push([e,t[e]]);return s}},"es8","es3"),Fl.polyfill("Object.values",function(t){return t||function(t){var e,s=[];for(e in t)Fl.owns(t,e)&&s.push(t[e]);return s}},"es8","es3");var Gl=Object.create(null),Vl={typeMap:Gl},Wl=Object.create(null),Xl="default",zl=class{constructor(t){this.name=t}toString(){return this.name}};zl.CONNECTION_CHECKER=new zl("connectionChecker"),zl.CONNECTION_PREVIEWER=new zl("connectionPreviewer"),zl.CURSOR=new zl("cursor"),zl.EVENT=new zl("event"),zl.FIELD=new zl("field"),zl.INPUT=new zl("input"),zl.RENDERER=new zl("renderer"),zl.TOOLBOX=new zl("toolbox"),zl.THEME=new zl("theme"),zl.TOOLBOX_ITEM=new zl("toolboxItem"),zl.FLYOUTS_VERTICAL_TOOLBOX=new zl("flyoutsVerticalToolbox"),zl.FLYOUTS_HORIZONTAL_TOOLBOX=new zl("flyoutsHorizontalToolbox"),zl.FLYOUT_INFLATER=new zl("flyoutInflater"),zl.METRICS_MANAGER=new zl("metricsManager"),zl.BLOCK_DRAGGER=new zl("blockDragger"),zl.SERIALIZER=new zl("serializer"),zl.ICON=new zl("icon"),zl.PASTER=new zl("paster"),zl.VARIABLE_MODEL=new zl("variableModel"),zl.VARIABLE_MAP=new zl("variableMap");var Yl={DEFAULT:Xl,TEST_ONLY:Vl};Yl.Type=zl,Yl.getAllItems=a,Yl.getClass=r,Yl.getClassFromOptions=c,Yl.getObject=l,Yl.hasItem=n,Yl.register=t,Yl.unregister=i;var Kl,jl,Jl,ql,Zl,Ql,ta,ea,sa,ia,oa=Object.create(null),na=750,ra="ontouchstart"in globalThis||!!(globalThis.document&&document.documentElement&&"ontouchstart"in document.documentElement)||!(!globalThis.navigator||!globalThis.navigator.maxTouchPoints&&!globalThis.navigator.msMaxTouchPoints),la=null,aa={mousedown:["pointerdown"],mouseenter:["pointerenter"],mouseleave:["pointerleave"],mousemove:["pointermove"],mouseout:["pointerout"],mouseover:["pointerover"],mouseup:["pointerup","pointercancel"],touchend:["pointerup"],touchcancel:["pointercancel"]},ca=0,ha={TOUCH_ENABLED:ra,TOUCH_MAP:aa};ha.checkTouchIdentifier=_,ha.clearTouchIdentifier=d,ha.getTouchIdentifierFromEvent=g,ha.longStart=h,ha.longStop=u,ha.shouldHandleEvent=p,function(t){function e(t){return s.includes(t.toUpperCase())}const s=(Kl=t).toUpperCase();jl=e("JavaFX"),Jl=e("WebKit"),ql=e("Gecko")&&!Jl,Zl=e("Android"),t=globalThis.navigator&&globalThis.navigator.maxTouchPoints,Ql=e("iPad")||e("Macintosh")&&t>0,ta=e("iPhone")&&!Ql,ea=e("Macintosh"),sa=Ql||Zl&&!e("Mobile")||e("Silk"),ia=!sa&&(ta||Zl)}(globalThis.navigator&&globalThis.navigator.userAgent||"");var ua,da=jl,pa=ql,ga=Zl,_a=Ql,Ta=ta,ma=ea,Ea=ia,ba={ANDROID:ga,GECKO:pa,IPAD:_a,IPHONE:Ta,JavaFx:da,MAC:ma,MOBILE:Ea,raw:Kl},fa=40,$a=125,Ia={};Ia.bind=m,Ia.conditionalBind=T,Ia.getScrollDeltaPixels=I,Ia.isRightButton=f,Ia.isTargetInput=b,Ia.mouseToSvg=$,Ia.unbind=E,function(t){t.BLOCK_CREATE="create",t.BLOCK_DELETE="delete",t.BLOCK_CHANGE="change",t.BLOCK_FIELD_INTERMEDIATE_CHANGE="block_field_intermediate_change",t.BLOCK_MOVE="move",t.VAR_CREATE="var_create",t.VAR_DELETE="var_delete",t.VAR_RENAME="var_rename",t.VAR_TYPE_CHANGE="var_type_change",t.UI="ui",t.BLOCK_DRAG="drag",t.SELECTED="selected",t.CLICK="click",t.MARKER_MOVE="marker_move",t.BUBBLE_OPEN="bubble_open",t.TRASHCAN_OPEN="trashcan_open",t.TOOLBOX_ITEM_SELECT="toolbox_item_select",t.THEME_CHANGE="theme_change",t.VIEWPORT_CHANGE="viewport_change",t.COMMENT_CREATE="comment_create",t.COMMENT_DELETE="comment_delete",t.COMMENT_CHANGE="comment_change",t.COMMENT_MOVE="comment_move",t.COMMENT_RESIZE="comment_resize",t.COMMENT_DRAG="comment_drag",t.COMMENT_COLLAPSE="comment_collapse",t.FINISHED_LOADING="finished_loading"}(ua||(ua={}));var Ca=[ua.BLOCK_CREATE,ua.BLOCK_MOVE,ua.COMMENT_CREATE,ua.COMMENT_MOVE];({BUMP_EVENTS:Ca}).EventType=ua;var Sa="!#$%()*+,-./:;=?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",Ra={genUid:()=>{const t=[];for(let e=0;e<20;e++)t[e]=Sa.charAt(88*Math.random());return t.join("")}},ya=0,Oa={TEST_ONLY:Ra};Oa.genUid=S,Oa.getNextUniqueId=C;var ka={};ka.isBlockChange=O,ka.isBlockCreate=R,ka.isBlockDelete=y,ka.isBlockDrag=L,ka.isBlockFieldIntermediateChange=k,ka.isBlockMove=A,ka.isBubbleOpen=x,ka.isClick=D,ka.isCommentChange=V,ka.isCommentCollapse=Y,ka.isCommentCreate=H,ka.isCommentDelete=G,ka.isCommentDrag=z,ka.isCommentMove=W,ka.isCommentResize=X,ka.isFinishedLoading=K,ka.isSelected=M,ka.isThemeChange=F,ka.isToolboxItemSelect=B,ka.isTrashcanOpen=P,ka.isVarCreate=v,ka.isVarDelete=N,ka.isVarRename=w,ka.isViewportChange=U;var Aa="",va=!0,Na=0,wa="ORPHANED_BLOCK",La=[],Ma={FIRE_QUEUE:La,enqueueEvent:Q,fireNow:Z,fireInternal:q,setGroupInternal:it},Da={TEST_ONLY:Ma};Da.clearPendingUndo=et,Da.disable=Hl.disable$$module$build$src$core$events$utils,Da.disableOrphans=lt,Da.enable=Hl.enable$$module$build$src$core$events$utils,Da.filter=tt,Da.fire=J,Da.fromJson=nt,Da.get=rt,Da.getDescendantIds=ot,Da.getGroup=Hl.getGroup$$module$build$src$core$events$utils,Da.getRecordUndo=j,Da.isEnabled=st,Da.setGroup=Hl.setGroup$$module$build$src$core$events$utils,Da.setRecordUndo=Hl.setRecordUndo$$module$build$src$core$events$utils;var xa,Pa="http://www.w3.org/2000/svg",Ba="http://www.w3.org/1999/xhtml",Fa="http://www.w3.org/1999/xlink";!function(t){t[t.ELEMENT_NODE=1]="ELEMENT_NODE",t[t.TEXT_NODE=3]="TEXT_NODE",t[t.COMMENT_NODE=8]="COMMENT_NODE"}(xa||(xa={}));var Ua=null,Ha=0,Ga=null,Va={HTML_NS:Ba};Va.NodeType=xa,Va.SVG_NS=Pa,Va.XLINK_NS=Fa,Va.addClass=ct,Va.createSvgElement=at,Va.getFastTextWidth=bt,Va.getFastTextWidthWithSizeString=ft,Va.getTextWidth=Et,Va.hasClass=dt,Va.insertAfter=gt,Va.measureFontMetrics=$t,Va.removeClass=ut,Va.removeClasses=ht,Va.removeNode=pt,Va.setCssTransform=_t,Va.startTextWidthCache=Tt,Va.stopTextWidthCache=mt;var Wa=class{static findFocusedNode(t){var e=t.getRootFocusableNode();if(!e.canBeFocused())return null;var s=e.getFocusableElement();return dt(s,Wa.ACTIVE_CLASS_NAME)||dt(s,Wa.PASSIVE_CSS_CLASS_NAME)||((e=s.querySelector(this.ACTIVE_FOCUS_NODE_CSS_SELECTOR))instanceof HTMLElement||e instanceof SVGElement)&&(e=Wa.findFocusableNodeFor(e,t))?e:((s=s.querySelector(this.PASSIVE_FOCUS_NODE_CSS_SELECTOR))instanceof HTMLElement||s instanceof SVGElement)&&(t=Wa.findFocusableNodeFor(s,t))?t:null}static findFocusableNodeFor(t,e){if(!t.id||"null"===t.id||-1!==e.getNestedTrees().map(e=>Wa.findFocusableNodeFor(t,e)).findIndex(t=>!!t))return null;var s,i=e.getRootFocusableNode();return i.canBeFocused()&&t===i.getFocusableElement()||(i=null!=(s=e.lookUpFocusableNode(t.id))?s:null)?i:(s=t.parentElement,!i&&s?Wa.findFocusableNodeFor(s,e):null)}};Wa.ACTIVE_CLASS_NAME="blocklyActiveFocus",Wa.PASSIVE_CSS_CLASS_NAME="blocklyPassiveFocus",Wa.ACTIVE_FOCUS_NODE_CSS_SELECTOR=`.${Wa.ACTIVE_CLASS_NAME}`,Wa.PASSIVE_FOCUS_NODE_CSS_SELECTOR=`.${Wa.PASSIVE_CSS_CLASS_NAME}`;var Xa=class{constructor(t,e){this.tree=t,this.rootShouldBeAutoTabbable=e}},za=class{constructor(t){this.previouslyFocusedNode=this.focusedNode=null,this.registeredTrees=[],this.isUpdatingFocusedNode=this.recentlyLostAllFocus=this.lockFocusStateChanges=this.currentlyHoldsEphemeralFocus=!1;const e=t=>{if(!this.isUpdatingFocusedNode){this.recentlyLostAllFocus=!t;var e=null;if(t instanceof HTMLElement||t instanceof SVGElement)for(var s of this.registeredTrees)if(e=Wa.findFocusableNodeFor(t,s.tree))break;if(e&&e.canBeFocused()){let i;t=e.getFocusableTree(),s=null==(i=this.focusedNode)?void 0:i.getFocusableTree(),e===t.getRootFocusableNode()&&t!==s?this.focusTree(t):this.focusNode(e)}else this.defocusCurrentFocusedNode()}};t("focusin",t=>{t instanceof FocusEvent&&e(document.activeElement)}),t("focusout",t=>{t instanceof FocusEvent&&e(t.relatedTarget)})}registerTree(t,e=!1){if(this.ensureManagerIsUnlocked(),this.isRegistered(t))throw Error(`Attempted to re-register already registered tree: ${t}.`);this.registeredTrees.push(new Xa(t,e));const s=t.getRootFocusableNode().getFocusableElement();if(!s.id||"null"===s.id)throw Error(`Attempting to register a tree with a root element that has an invalid ID: ${t}.`);e&&(s.tabIndex=0)}isRegistered(t){return!!this.lookUpRegistration(t)}lookUpRegistration(t){let e;return null!=(e=this.registeredTrees.find(e=>e.tree===t))?e:null}unregisterTree(t){if(this.ensureManagerIsUnlocked(),!this.isRegistered(t))throw Error(`Attempted to unregister not registered tree: ${t}.`);var e=this.registeredTrees.findIndex(e=>e.tree===t);const s=this.registeredTrees[e];this.registeredTrees.splice(e,1),e=Wa.findFocusedNode(t);const i=t.getRootFocusableNode();e&&this.removeHighlight(e),this.focusedNode!==e&&this.focusedNode!==i||this.updateFocusedNode(null),this.removeHighlight(i),s.rootShouldBeAutoTabbable&&t.getRootFocusableNode().getFocusableElement().removeAttribute("tabindex")}getFocusedTree(){let t,e;return null!=(e=null==(t=this.focusedNode)?void 0:t.getFocusableTree())?e:null}getFocusedNode(){return this.focusedNode}focusTree(t){if(this.ensureManagerIsUnlocked(),!this.isRegistered(t))throw Error(`Attempted to focus unregistered tree: ${t}.`);const e=Wa.findFocusedNode(t),s=t.getRestoredFocusableNode(e);let i;t=t.getRootFocusableNode(),this.focusNode(null!=(i=null!=s?s:e)?i:t)}focusNode(t){this.ensureManagerIsUnlocked();const e=!this.currentlyHoldsEphemeralFocus;e&&(this.isUpdatingFocusedNode=!0);var s,i=(null==(s=this.focusedNode)?void 0:s.getFocusableElement())!==document.activeElement;if(this.focusedNode!==t||i)if(t.canBeFocused()){if(s=t.getFocusableTree(),!this.isRegistered(s))throw Error(`Attempted to focus unregistered node: ${t}.`);(i=t.getFocusableElement()).id&&"null"!==i.id||console.warn("Trying to focus a node that has an invalid ID.");var o=Wa.findFocusableNodeFor(i,s);i=Wa.findFocusedNode(s);var n,r=t;o!==t&&(r=s.getRestoredFocusableNode(i),t=s.getRootFocusableNode(),r=null!=(n=null!=r?r:i)?n:t),n=null==(t=this.focusedNode)?void 0:t.getFocusableTree(),t&&this.passivelyFocusNode(t,s),s=s.getRootFocusableNode(),i&&this.removeHighlight(i),s!==r&&this.removeHighlight(s),this.currentlyHoldsEphemeralFocus||this.activelyFocusNode(r,null!=n?n:null),this.updateFocusedNode(r)}else console.warn("Trying to focus a node that can't be focused.");e&&(this.isUpdatingFocusedNode=!1)}takeEphemeralFocus(t){if(this.ensureManagerIsUnlocked(),this.currentlyHoldsEphemeralFocus)throw Error(`Attempted to take ephemeral focus when it's already held, with new element: ${t}.`);this.currentlyHoldsEphemeralFocus=!0,this.focusedNode&&this.passivelyFocusNode(this.focusedNode,null),t.focus({preventScroll:!0});let e=!1;return()=>{if(e)throw Error(`Attempted to finish ephemeral focus twice for element: ${t}.`);if(e=!0,this.currentlyHoldsEphemeralFocus=!1,this.focusedNode){this.activelyFocusNode(this.focusedNode,null);const t=this.focusedNode;setTimeout(()=>{!this.focusedNode&&this.previouslyFocusedNode===t&&this.recentlyLostAllFocus&&this.focusNode(t)},0)}}}ephemeralFocusTaken(){return this.currentlyHoldsEphemeralFocus}ensureManagerIsUnlocked(){if(this.lockFocusStateChanges)throw Error("FocusManager state changes cannot happen in a tree/node focus/blur callback.")}updateFocusedNode(t){this.previouslyFocusedNode=this.focusedNode,this.focusedNode=t}defocusCurrentFocusedNode(){this.focusedNode&&!this.currentlyHoldsEphemeralFocus&&(this.passivelyFocusNode(this.focusedNode,null),this.updateFocusedNode(null))}activelyFocusNode(t,e){this.lockFocusStateChanges=!0;const s=t.getFocusableTree(),i=t.getFocusableElement();let o;const n=null==(o=this.lookUpRegistration(s))?void 0:o.rootShouldBeAutoTabbable;s!==e&&(s.onTreeFocus(t,e),n&&(s.getRootFocusableNode().getFocusableElement().tabIndex=-1)),t.onNodeFocus(),this.lockFocusStateChanges=!1,n&&t===s.getRootFocusableNode()||i.hasAttribute("tabindex")||(i.tabIndex=-1),this.setNodeToVisualActiveFocus(t),i.focus({preventScroll:!0})}passivelyFocusNode(t,e){this.lockFocusStateChanges=!0;const s=t.getFocusableTree();if(s!==e){let t;s.onTreeBlur(e),null!=(t=this.lookUpRegistration(s))&&t.rootShouldBeAutoTabbable&&(s.getRootFocusableNode().getFocusableElement().tabIndex=0)}t.onNodeBlur(),this.lockFocusStateChanges=!1,s!==e&&this.setNodeToVisualPassiveFocus(t)}setNodeToVisualActiveFocus(t){t=t.getFocusableElement(),ct(t,za.ACTIVE_FOCUS_NODE_CSS_CLASS_NAME),ut(t,za.PASSIVE_FOCUS_NODE_CSS_CLASS_NAME)}setNodeToVisualPassiveFocus(t){t=t.getFocusableElement(),ut(t,za.ACTIVE_FOCUS_NODE_CSS_CLASS_NAME),ct(t,za.PASSIVE_FOCUS_NODE_CSS_CLASS_NAME)}removeHighlight(t){t=t.getFocusableElement(),ut(t,za.ACTIVE_FOCUS_NODE_CSS_CLASS_NAME),ut(t,za.PASSIVE_FOCUS_NODE_CSS_CLASS_NAME)}static getFocusManager(){return za.focusManager||(za.focusManager=new za(document.addEventListener)),za.focusManager}};za.ACTIVE_FOCUS_NODE_CSS_CLASS_NAME="blocklyActiveFocus",za.PASSIVE_FOCUS_NODE_CSS_CLASS_NAME="blocklyPassiveFocus",za.focusManager=null;var Ya={};Ya.FocusManager=za,Ya.getFocusManager=Hl.getFocusManager$$module$build$src$core$focus_manager;var Ka={};Ka.deepMerge=St;var ja=class{constructor(){this.shortcuts=new Map,this.keyMap=new Map,this.reset()}reset(){this.shortcuts.clear(),this.keyMap.clear()}register(t,e){if(this.shortcuts.get(t.name)&&!e)throw Error(`Shortcut named "${t.name}" already exists.`);if(this.shortcuts.set(t.name,t),null!=(e=t.keyCodes)&&e.length)for(const s of e)this.addKeyMapping(s,t.name,!!t.allowCollision)}unregister(t){return this.shortcuts.get(t)?(this.removeAllKeyMappings(t),this.shortcuts.delete(t),!0):(console.warn(`Keyboard shortcut named "${t}" not found.`),!1)}addKeyMapping(t,e,s){t=`${t}`;const i=this.keyMap.get(t);if(i&&!s)throw Error(`Shortcut named "${e}" collides with shortcuts "${i}"`);i&&s?i.unshift(e):this.keyMap.set(t,[e])}removeKeyMapping(t,e,s){const i=this.keyMap.get(t);if(!i)return s||console.warn(`No keyboard shortcut named "${e}" registered with key code "${t}"`),!1;const o=i.indexOf(e);return o>-1?(i.splice(o,1),0===i.length&&this.keyMap.delete(t),!0):(s||console.warn(`No keyboard shortcut named "${e}" registered with key code "${t}"`),!1)}removeAllKeyMappings(t){for(const e of this.keyMap.keys())this.removeKeyMapping(e,t,!0)}setKeyMap(t){this.keyMap.clear();for(const e in t)this.keyMap.set(e,t[e])}getKeyMap(){const t=Object.create(null);for(const[e,s]of this.keyMap)t[e]=s;return t}getRegistry(){const t=Object.create(null);for(const[e,s]of this.shortcuts)t[e]=s;return St(Object.create(null),t)}onKeyDown(t,e){var s=this.serializeKeyEvent(e);if(!(s=this.getShortcutNamesByKeyCode(s)))return!1;for(const i of s){let o,n,r,l;if((s=this.shortcuts.get(i))&&(!s.preconditionFn||s.preconditionFn(t,{focusedNode:null!=(o=Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode())?o:void 0}))&&null!=(r=(n=s).callback)&&r.call(n,t,e,s,{focusedNode:null!=(l=Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode())?l:void 0}))return!0}return!1}getShortcutNamesByKeyCode(t){let e;return(null==(e=this.keyMap.get(t))?void 0:e.slice())||[]}getKeyCodesByShortcutName(t){const e=[];for(const[s,i]of this.keyMap)i.indexOf(t)>-1&&e.push(s);return e}serializeKeyEvent(t){let e="";for(const s in ja.modifierKeys)t.getModifierState(s)&&(""!==e&&(e+="+"),e+=s);return""!==e&&t.keyCode?e+="+"+t.keyCode:t.keyCode&&(e=String(t.keyCode)),e}checkModifiers(t){for(const e of t)if(!(e in ja.modifierKeys))throw Error(e+" is not a valid modifier key.")}createSerializedKey(t,e){let s="";if(e){this.checkModifiers(e);for(const t in ja.modifierKeys)e.includes(ja.modifierKeys[t])&&(""!==s&&(s+="+"),s+=t)}return""!==s&&t?s+="+"+t:t&&(s=`${t}`),s}};ja.registry=new ja,function(t){(t=t.modifierKeys||(t.modifierKeys={}))[t.Shift=16]="Shift",t[t.Control=17]="Control",t[t.Alt=18]="Alt",t[t.Meta=91]="Meta"}(ja||(ja={}));var Ja,qa,Za=Object.create(null),Qa=[],tc={defineBlocksWithJsonArrayInternal:Ut},ec={TEST_ONLY:tc};ec.createBlockDefinitionsFromJsonArray=Hl.createBlockDefinitionsFromJsonArray$$module$build$src$core$common,ec.defineBlocks=Hl.defineBlocks$$module$build$src$core$common,ec.defineBlocksWithJsonArray=Ft,ec.draggingConnections=Qa,ec.fireSelectedEvent=Lt,ec.getAllWorkspaces=yt,ec.getBlockTypeCounts=Pt,ec.getMainWorkspace=At,ec.getParentContainer=Mt,ec.getSelected=Nt,ec.getWorkspaceById=Rt,ec.globalShortcutHandler=Ht,ec.registerWorkspace=Ot,ec.setMainWorkspace=vt,ec.setParentContainer=Dt,ec.setSelected=wt,ec.svgResize=xt,ec.unregisterWorkpace=kt;var sc,ic=class{constructor(){this.workspaceId=void 0,this.isUiEvent=!1,this.type="",this.group=Hl.getGroup$$module$build$src$core$events$utils(),this.recordUndo=j()}toJson(){return{type:this.type,group:this.group}}static fromJson(t,e,s){return s.isBlank=!1,s.group=t.group||"",s.workspaceId=e.id,s}isNull(){return!1}run(t){}getEventWorkspace_(){let t;if(this.workspaceId&&(t=Rt(this.workspaceId)),!t)throw Error("Workspace is null. Event must have been generated from real Blockly events.");return t}},oc=class extends ic{constructor(t){super(),this.isBlank=!0,this.recordUndo=!1,this.isUiEvent=!0,this.isBlank=void 0===t,this.workspaceId=t||""}},nc=class extends oc{constructor(t,e,s){null===(e=t?t.workspace.id:e)&&(e=void 0),super(e),this.type=ua.CLICK,this.blockId=t?t.id:void 0,this.targetType=s}toJson(){const t=super.toJson();if(!this.targetType)throw Error("The click target type is undefined. Either pass a block to the constructor, or call fromJson");return t.targetType=this.targetType,t.blockId=this.blockId,t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new nc)).targetType=t.targetType,e.blockId=t.blockId,e}};(function(t){t.BLOCK="block",t.WORKSPACE="workspace",t.ZOOM_CONTROLS="zoom_controls"})(sc||(sc={})),t(zl.EVENT,ua.CLICK,nc);var rc={};rc.Click=nc,rc.ClickTarget=sc;var lc={};lc.removeElem=Gt;var ac=class{constructor(t){this.name=t}toString(){return this.name}};ac.POSITIONABLE=new ac("positionable"),ac.DRAG_TARGET=new ac("drag_target"),ac.DELETE_AREA=new ac("delete_area"),ac.AUTOHIDEABLE=new ac("autohideable");var cc=class{constructor(){this.componentData=new Map,this.capabilityToComponentIds=new Map}addComponent(t,e){const s=t.component.id;var i;if(!e&&this.componentData.has(s))throw Error('Plugin "'+s+'" with capabilities "'+(null==(i=this.componentData.get(s))?void 0:i.capabilities)+'" already added.');for(this.componentData.set(s,t),e=[],i=0;i{e.push(this.componentData.get(t))}),e.sort(function(t,e){return t.weight-e.weight}),e.forEach(function(t){s.push(t.component)})}else t.forEach(t=>{s.push(this.componentData.get(t).component)});return s}};cc.Capability=ac,function(t){(t=t.ComponentWeight||(t.ComponentWeight={}))[t.TOOLBOX_WEIGHT=0]="TOOLBOX_WEIGHT",t[t.FLYOUT_WEIGHT=1]="FLYOUT_WEIGHT",t[t.TRASHCAN_WEIGHT=2]="TRASHCAN_WEIGHT",t[t.ZOOM_CONTROLS_WEIGHT=3]="ZOOM_CONTROLS_WEIGHT"}(cc||(cc={}));var hc=cc.ComponentWeight,uc={};uc.ComponentManager=cc,uc.ComponentWeight=hc;var dc=!1,pc='\n.blocklySvg {\n background-color: #fff;\n outline: none;\n overflow: hidden; /* IE overflows by default. */\n position: absolute;\n display: block;\n}\n\n.blocklyWidgetDiv {\n display: none;\n position: absolute;\n z-index: 99999; /* big value for bootstrap3 compatibility */\n}\n\n.injectionDiv {\n height: 100%;\n position: relative;\n overflow: hidden; /* So blocks in drag surface disappear at edges */\n touch-action: none;\n user-select: none;\n -webkit-user-select: none;\n}\n\n.blocklyBlockCanvas.blocklyCanvasTransitioning,\n.blocklyBubbleCanvas.blocklyCanvasTransitioning {\n transition: transform .5s;\n}\n\n.blocklyEmboss {\n filter: var(--blocklyEmbossFilter);\n}\n\n.blocklyTooltipDiv {\n background-color: #ffffc7;\n border: 1px solid #ddc;\n box-shadow: 4px 4px 20px 1px rgba(0,0,0,.15);\n color: #000;\n display: none;\n font: 9pt sans-serif;\n opacity: .9;\n padding: 2px;\n position: absolute;\n z-index: 100000; /* big value for bootstrap3 compatibility */\n}\n\n.blocklyDropDownDiv {\n position: absolute;\n left: 0;\n top: 0;\n z-index: 1000;\n display: none;\n border: 1px solid;\n border-color: #dadce0;\n background-color: #fff;\n border-radius: 2px;\n padding: 4px;\n box-shadow: 0 0 3px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownDiv:focus {\n box-shadow: 0 0 6px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownContent {\n max-height: 300px; /* @todo: spec for maximum height. */\n}\n\n.blocklyDropDownArrow {\n position: absolute;\n left: 0;\n top: 0;\n width: 16px;\n height: 16px;\n z-index: -1;\n background-color: inherit;\n border-color: inherit;\n border-top: 1px solid;\n border-left: 1px solid;\n border-top-left-radius: 4px;\n border-color: inherit;\n}\n\n.blocklyHighlighted>.blocklyPath {\n filter: var(--blocklyEmbossFilter);\n}\n\n.blocklyHighlightedConnectionPath {\n fill: none;\n stroke: #fc3;\n stroke-width: 4px;\n}\n\n.blocklyPathLight {\n fill: none;\n stroke-linecap: round;\n stroke-width: 1;\n}\n\n.blocklySelected>.blocklyPathLight {\n display: none;\n}\n\n.blocklyDraggable {\n cursor: grab;\n cursor: -webkit-grab;\n}\n\n.blocklyDragging {\n cursor: grabbing;\n cursor: -webkit-grabbing;\n /* Drag surface disables events to not block the toolbox, so we have to\n * reenable them here for the cursor values to work. */\n pointer-events: auto;\n}\n\n /* Changes cursor on mouse down. Not effective in Firefox because of\n https://bugzilla.mozilla.org/show_bug.cgi?id=771241 */\n.blocklyDraggable:active {\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n.blocklyDragging.blocklyDraggingDelete,\n.blocklyDragging.blocklyDraggingDelete .blocklyField {\n cursor: url("<<>>/handdelete.cur"), auto;\n}\n\n.blocklyDragging>.blocklyPath,\n.blocklyDragging>.blocklyPathLight {\n fill-opacity: .8;\n stroke-opacity: .8;\n}\n\n.blocklyDragging>.blocklyPathDark {\n display: none;\n}\n\n.blocklyDisabledPattern>.blocklyPath {\n fill: var(--blocklyDisabledPattern);\n fill-opacity: .5;\n stroke-opacity: .5;\n}\n\n.blocklyDisabled>.blocklyPathLight,\n.blocklyDisabled>.blocklyPathDark {\n display: none;\n}\n\n.blocklyInsertionMarker>.blocklyPath,\n.blocklyInsertionMarker>.blocklyPathLight,\n.blocklyInsertionMarker>.blocklyPathDark {\n fill-opacity: .2;\n stroke: none;\n}\n\n.blocklyNonEditableField>text {\n pointer-events: none;\n}\n\n.blocklyFlyout {\n position: absolute;\n z-index: 20;\n}\n\n.blocklyText text {\n cursor: default;\n}\n\n/*\n Don\'t allow users to select text. It gets annoying when trying to\n drag a block and selected text moves instead.\n*/\n.blocklySvg text {\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n cursor: inherit;\n}\n\n.blocklyIconGroup {\n cursor: default;\n}\n\n.blocklyIconGroup:not(:hover):not(:focus),\n.blocklyIconGroupReadonly {\n opacity: .6;\n}\n\n.blocklyIconShape {\n fill: #00f;\n stroke: #fff;\n stroke-width: 1px;\n}\n\n.blocklyIconSymbol {\n fill: #fff;\n}\n\n.blocklyMinimalBody {\n margin: 0;\n padding: 0;\n height: 100%;\n}\n\n.blocklyHtmlInput {\n border: none;\n border-radius: 4px;\n height: 100%;\n margin: 0;\n outline: none;\n padding: 0;\n width: 100%;\n text-align: center;\n display: block;\n box-sizing: border-box;\n}\n\n/* Remove the increase and decrease arrows on the field number editor */\ninput.blocklyHtmlInput[type=number]::-webkit-inner-spin-button,\ninput.blocklyHtmlInput[type=number]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\ninput[type=number] {\n -moz-appearance: textfield;\n}\n\n.blocklyMainBackground {\n stroke-width: 1;\n stroke: #c6c6c6; /* Equates to #ddd due to border being off-pixel. */\n}\n\n.blocklyMutatorBackground {\n fill: #fff;\n stroke: #ddd;\n stroke-width: 1;\n}\n\n.blocklyFlyoutBackground {\n fill: #ddd;\n fill-opacity: .8;\n}\n\n.blocklyMainWorkspaceScrollbar {\n z-index: 20;\n}\n\n.blocklyFlyoutScrollbar {\n z-index: 30;\n}\n\n.blocklyScrollbarHorizontal,\n.blocklyScrollbarVertical {\n position: absolute;\n outline: none;\n}\n\n.blocklyScrollbarBackground {\n opacity: 0;\n pointer-events: none;\n}\n\n.blocklyScrollbarHandle {\n fill: #ccc;\n}\n\n.blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,\n.blocklyScrollbarHandle:hover {\n fill: #bbb;\n}\n\n/* Darken flyout scrollbars due to being on a grey background. */\n/* By contrast, workspace scrollbars are on a white background. */\n.blocklyFlyout .blocklyScrollbarHandle {\n fill: #bbb;\n}\n\n.blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,\n.blocklyFlyout .blocklyScrollbarHandle:hover {\n fill: #aaa;\n}\n\n.blocklyInvalidInput {\n background: #faa;\n}\n\n.blocklyVerticalMarker {\n stroke-width: 3px;\n fill: rgba(255,255,255,.5);\n pointer-events: none;\n}\n\n.blocklyComputeCanvas {\n position: absolute;\n width: 0;\n height: 0;\n}\n\n.blocklyNoPointerEvents {\n pointer-events: none;\n}\n\n.blocklyContextMenu {\n border-radius: 4px;\n max-height: 100%;\n}\n\n.blocklyDropdownMenu {\n border-radius: 2px;\n padding: 0 !important;\n}\n\n.blocklyDropdownMenu .blocklyMenuItem {\n /* 28px on the left for icon or checkbox. */\n padding-left: 28px;\n}\n\n/* BiDi override for the resting state. */\n.blocklyDropdownMenu .blocklyMenuItemRtl {\n /* Flip left/right padding for BiDi. */\n padding-left: 5px;\n padding-right: 28px;\n}\n\n.blocklyWidgetDiv .blocklyMenu {\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n background: #fff;\n border: 1px solid transparent;\n box-shadow: 0 0 3px 1px rgba(0,0,0,.3);\n font: normal 13px Arial, sans-serif;\n margin: 0;\n outline: none;\n padding: 4px 0;\n position: absolute;\n overflow-y: auto;\n overflow-x: hidden;\n max-height: 100%;\n z-index: 20000; /* Arbitrary, but some apps depend on it... */\n}\n\n.blocklyWidgetDiv .blocklyMenu:focus {\n box-shadow: 0 0 6px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownDiv .blocklyMenu {\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n background: inherit; /* Compatibility with gapi, reset from goog-menu */\n border: inherit; /* Compatibility with gapi, reset from goog-menu */\n font: normal 13px "Helvetica Neue", Helvetica, sans-serif;\n outline: none;\n overflow-y: auto;\n overflow-x: hidden;\n max-height: 100%;\n z-index: 20000; /* Arbitrary, but some apps depend on it... */\n}\n\n/* State: resting. */\n.blocklyMenuItem {\n border: none;\n color: #000;\n cursor: pointer;\n list-style: none;\n margin: 0;\n /* 7em on the right for shortcut. */\n min-width: 7em;\n padding: 6px 15px;\n white-space: nowrap;\n}\n\n/* State: disabled. */\n.blocklyMenuItemDisabled {\n color: #ccc;\n cursor: inherit;\n}\n\n/* State: hover. */\n.blocklyMenuItemHighlight {\n background-color: rgba(0,0,0,.1);\n}\n\n/* State: selected/checked. */\n.blocklyMenuItemSelected .blocklyMenuItemCheckbox {\n background: url(<<>>/sprites.png) no-repeat -48px -16px;\n float: left;\n margin-left: -24px;\n width: 16px;\n height: 16px;\n position: static; /* Scroll with the menu. */\n display: block;\n}\n\n.blocklyMenuItemRtl .blocklyMenuItemCheckbox {\n float: right;\n margin-right: -24px;\n}\n\n.blocklyMenuSeparator {\n background-color: #ccc;\n height: 1px;\n border: 0;\n margin-left: 4px;\n margin-right: 4px;\n}\n\n.blocklyBlockDragSurface, .blocklyAnimationLayer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n overflow: visible !important;\n z-index: 80;\n pointer-events: none;\n}\n\n.blocklyField {\n cursor: default;\n}\n\n.blocklyInputField {\n cursor: text;\n}\n\n.blocklyDragging .blocklyField,\n.blocklyDragging .blocklyIconGroup {\n cursor: grabbing;\n}\n\n.blocklyActiveFocus:is(\n .blocklyFlyout,\n .blocklyWorkspace,\n .blocklyField,\n .blocklyPath,\n .blocklyHighlightedConnectionPath,\n .blocklyComment,\n .blocklyBubble,\n .blocklyIconGroup,\n .blocklyTextarea\n) {\n outline: none;\n}\n',gc={};gc.inject=Wt,gc.register=Vt;var _c=class{constructor(t,e){this.x=t,this.y=e}clone(){return new _c(this.x,this.y)}scale(t){return this.x*=t,this.y*=t,this}translate(t,e){return this.x+=t,this.y+=e,this}static equals(t,e){return t===e||!(!t||!e)&&t.x===e.x&&t.y===e.y}static distance(t,e){const s=t.x-e.x;return t=t.y-e.y,Math.sqrt(s*s+t*t)}static magnitude(t){return Math.sqrt(t.x*t.x+t.y*t.y)}static difference(t,e){return new _c(t.x-e.x,t.y-e.y)}static sum(t,e){return new _c(t.x+e.x,t.y+e.y)}},Tc=class{constructor(t){this.tagName=t}toString(){return this.tagName}};Tc.ANIMATE=new Tc("animate"),Tc.CIRCLE=new Tc("circle"),Tc.CLIPPATH=new Tc("clipPath"),Tc.DEFS=new Tc("defs"),Tc.FECOMPOSITE=new Tc("feComposite"),Tc.FECOMPONENTTRANSFER=new Tc("feComponentTransfer"),Tc.FEFLOOD=new Tc("feFlood"),Tc.FEFUNCA=new Tc("feFuncA"),Tc.FEGAUSSIANBLUR=new Tc("feGaussianBlur"),Tc.FEPOINTLIGHT=new Tc("fePointLight"),Tc.FESPECULARLIGHTING=new Tc("feSpecularLighting"),Tc.FILTER=new Tc("filter"),Tc.FOREIGNOBJECT=new Tc("foreignObject"),Tc.G=new Tc("g"),Tc.IMAGE=new Tc("image"),Tc.LINE=new Tc("line"),Tc.PATH=new Tc("path"),Tc.PATTERN=new Tc("pattern"),Tc.POLYGON=new Tc("polygon"),Tc.RECT=new Tc("rect"),Tc.SVG=new Tc("svg"),Tc.TEXT=new Tc("text"),Tc.TSPAN=new Tc("tspan");var mc=class{constructor(t,e,s,i){this.top=t,this.bottom=e,this.left=s,this.right=i}static from(t){return new mc(t.y,t.y+t.height,t.x,t.x+t.width)}clone(){return new mc(this.top,this.bottom,this.left,this.right)}getHeight(){return this.bottom-this.top}getWidth(){return this.right-this.left}getOrigin(){return new _c(this.left,this.top)}contains(t,e){return t>=this.left&&t<=this.right&&e>=this.top&&e<=this.bottom}intersects(t){return this.left<=t.right&&this.right>=t.left&&this.bottom>=t.top&&this.top<=t.bottom}static equals(t,e){return t===e||!(!t||!e)&&t.top===e.top&&t.bottom===e.bottom&&t.left===e.left&&t.right===e.right}static createFromPoint(t,e,s){const i=t.x;return t=t.y,new mc(t,t+s,i,i+e)}},Ec=class{constructor(t,e){this.width=t,this.height=e}static equals(t,e){return t===e||!(!t||!e)&&t.width===e.width&&t.height===e.height}static max(t,e){return new Ec(Math.max(t.width,e.width),Math.max(t.height,e.height))}static min(t,e){return new Ec(Math.min(t.width,e.width),Math.min(t.height,e.height))}},bc={getSizeInternal:zt},fc={TEST_ONLY:bc};fc.getBorderBox=qt,fc.getComputedStyle=Kt,fc.getContainerOffsetToScrollInto=Qt,fc.getPageOffset=jt,fc.getSize=Xt,fc.getViewportPageOffset=Jt,fc.scrollIntoContainerView=Zt;var $c=/translate\(\s*([-+\d.e]+)([ ,]\s*([-+\d.e]+)\s*)?/,Ic=/transform:\s*translate(?:3d)?\(\s*([-+\d.e]+)\s*px([ ,]\s*([-+\d.e]+)\s*px)?/,Cc={TEST_ONLY:{XY_REGEX:$c,XY_STYLE_REGEX:Ic}};Cc.getDocumentScroll=ie,Cc.getInjectionDivXY=ee,Cc.getRelativeXY=te,Cc.getViewportBBox=se,Cc.screenToWsCoordinates=oe,Cc.wsToScreenCoordinates=ne;var Sc=class{constructor(t,e,s,i,o){this.workspace=t,this.horizontal=e,this.oldHostMetrics=null,this.ratio=1,this.origin=new _c(0,0),this.startDragHandle=this.handlePosition=this.handleLength=this.scrollbarLength=this.startDragMouse=0,this.containerVisible=this.isHandleVisible=!0,this.position=new _c(0,0),this.onMouseMoveWrapper_=this.onMouseUpWrapper_=null,this.pair=s||!1,this.margin=void 0!==o?o:Sc.DEFAULT_SCROLLBAR_MARGIN,t="blocklyScrollbar"+(this.horizontal?"Horizontal":"Vertical"),i&&(t+=" "+i),this.outerSvg=at(Tc.SVG,{class:t}),i=at(Tc.G,{},this.outerSvg),this.svgBackground=at(Tc.RECT,{class:"blocklyScrollbarBackground"},i),t=Math.floor((Sc.scrollbarThickness-5)/2),this.svgHandle=at(Tc.RECT,{class:"blocklyScrollbarHandle",rx:t,ry:t},i),this.workspace.getThemeManager().subscribe(this.svgHandle,"scrollbarColour","fill"),this.workspace.getThemeManager().subscribe(this.svgHandle,"scrollbarOpacity","fill-opacity"),gt(this.outerSvg,this.workspace.getParentSvg()),this.setInitialThickness(),e?(this.lengthAttribute_="width",this.positionAttribute_="x"):(this.lengthAttribute_="height",this.positionAttribute_="y"),this.onMouseDownBarWrapper_=T(this.svgBackground,"pointerdown",this,this.onMouseDownBar),this.onMouseDownHandleWrapper_=T(this.svgHandle,"pointerdown",this,this.onMouseDownHandle)}setInitialThickness(){const t=Sc.scrollbarThickness;this.horizontal?(this.svgBackground.setAttribute("height",String(t)),this.outerSvg.setAttribute("height",String(t)),this.svgHandle.setAttribute("height",String(t-5)),this.svgHandle.setAttribute("y","2.5")):(this.svgBackground.setAttribute("width",String(t)),this.outerSvg.setAttribute("width",String(t)),this.svgHandle.setAttribute("width",String(t-5)),this.svgHandle.setAttribute("x","2.5"))}dispose(){this.cleanUp(),E(this.onMouseDownBarWrapper_),E(this.onMouseDownHandleWrapper_),pt(this.outerSvg),this.workspace.getThemeManager().unsubscribe(this.svgHandle)}constrainHandleLength(t){return t<=0||isNaN(t)?0:Math.min(t,this.scrollbarLength)}setHandleLength(t){this.handleLength=t,this.svgHandle.setAttribute(this.lengthAttribute_,String(this.handleLength))}constrainHandlePosition(t){return t<=0||isNaN(t)?0:Math.min(t,this.scrollbarLength-this.handleLength)}setHandlePosition(t){this.handlePosition=t,this.svgHandle.setAttribute(this.positionAttribute_,String(this.handlePosition))}setScrollbarLength(t){this.scrollbarLength=t,this.outerSvg.setAttribute(this.lengthAttribute_,String(this.scrollbarLength)),this.svgBackground.setAttribute(this.lengthAttribute_,String(this.scrollbarLength))}setPosition(t,e){this.position.x=t,this.position.y=e,_t(this.outerSvg,"translate("+(this.position.x+this.origin.x)+"px,"+(this.position.y+this.origin.y)+"px)")}resize(t){(t||(t=this.workspace.getMetrics()))&&(this.oldHostMetrics&&Sc.metricsAreEquivalent(t,this.oldHostMetrics)||(this.horizontal?this.resizeHorizontal(t):this.resizeVertical(t),this.oldHostMetrics=t,this.updateMetrics()))}requiresViewResize(t){return!this.oldHostMetrics||this.oldHostMetrics.viewWidth!==t.viewWidth||this.oldHostMetrics.viewHeight!==t.viewHeight||this.oldHostMetrics.absoluteLeft!==t.absoluteLeft||this.oldHostMetrics.absoluteTop!==t.absoluteTop}resizeHorizontal(t){this.requiresViewResize(t)?this.resizeViewHorizontal(t):this.resizeContentHorizontal(t)}resizeViewHorizontal(t){var e=t.viewWidth-2*this.margin;this.pair&&(e-=Sc.scrollbarThickness),this.setScrollbarLength(Math.max(0,e)),e=t.absoluteLeft+this.margin,this.pair&&this.workspace.RTL&&(e+=Sc.scrollbarThickness),this.setPosition(e,t.absoluteTop+t.viewHeight-Sc.scrollbarThickness-this.margin),this.resizeContentHorizontal(t)}resizeContentHorizontal(t){if(t.viewWidth>=t.scrollWidth)this.setHandleLength(this.scrollbarLength),this.setHandlePosition(0),this.pair||this.setVisible(!1);else{this.pair||this.setVisible(!0);var e=this.scrollbarLength*t.viewWidth/t.scrollWidth;e=this.constrainHandleLength(e),this.setHandleLength(e),e=t.scrollWidth-t.viewWidth;var s=this.scrollbarLength-this.handleLength;t=(t.viewLeft-t.scrollLeft)/e*s,t=this.constrainHandlePosition(t),this.setHandlePosition(t),this.ratio=s/e}}resizeVertical(t){this.requiresViewResize(t)?this.resizeViewVertical(t):this.resizeContentVertical(t)}resizeViewVertical(t){let e=t.viewHeight-2*this.margin;this.pair&&(e-=Sc.scrollbarThickness),this.setScrollbarLength(Math.max(0,e)),this.setPosition(this.workspace.RTL?t.absoluteLeft+this.margin:t.absoluteLeft+t.viewWidth-Sc.scrollbarThickness-this.margin,t.absoluteTop+this.margin),this.resizeContentVertical(t)}resizeContentVertical(t){if(t.viewHeight>=t.scrollHeight)this.setHandleLength(this.scrollbarLength),this.setHandlePosition(0),this.pair||this.setVisible(!1);else{this.pair||this.setVisible(!0);var e=this.scrollbarLength*t.viewHeight/t.scrollHeight;e=this.constrainHandleLength(e),this.setHandleLength(e),e=t.scrollHeight-t.viewHeight;var s=this.scrollbarLength-this.handleLength;t=(t.viewTop-t.scrollTop)/e*s,t=this.constrainHandlePosition(t),this.setHandlePosition(t),this.ratio=s/e}}isVisible(){return this.isHandleVisible}setContainerVisible(t){const e=t!==this.containerVisible;this.containerVisible=t,e&&this.updateDisplay_()}setVisible(t){if(this.pair)throw Error("Unable to toggle visibility of paired scrollbars.");this.setVisibleInternal(t)}setVisibleInternal(t){const e=t!==this.isVisible();this.isHandleVisible=t,e&&this.updateDisplay_()}updateDisplay_(){this.containerVisible&&this.isVisible()?this.outerSvg.setAttribute("display","block"):this.outerSvg.setAttribute("display","none")}onMouseDownBar(t){if(this.workspace.markFocused(),d(),this.cleanUp(),f(t))t.stopPropagation();else{var e=$(t,this.workspace.getParentSvg(),this.workspace.getInverseScreenCTM());e=this.horizontal?e.x:e.y;var s=ee(this.svgHandle);s=this.horizontal?s.x:s.y;var i=this.handlePosition,o=.95*this.handleLength;e<=s?i-=o:e>=s+this.handleLength&&(i+=o),this.setHandlePosition(this.constrainHandlePosition(i)),this.updateMetrics(),t.stopPropagation(),t.preventDefault()}}onMouseDownHandle(t){this.workspace.markFocused(),this.cleanUp(),f(t)?t.stopPropagation():(this.startDragHandle=this.handlePosition,this.startDragMouse=this.horizontal?t.clientX:t.clientY,this.onMouseUpWrapper_=T(document,"pointerup",this,this.onMouseUpHandle),this.onMouseMoveWrapper_=T(document,"pointermove",this,this.onMouseMoveHandle),t.stopPropagation(),t.preventDefault())}onMouseMoveHandle(t){this.setHandlePosition(this.constrainHandlePosition(this.startDragHandle+((this.horizontal?t.clientX:t.clientY)-this.startDragMouse))),this.updateMetrics()}onMouseUpHandle(){d(),this.cleanUp()}cleanUp(){this.workspace.hideChaff(!0),this.onMouseUpWrapper_&&(E(this.onMouseUpWrapper_),this.onMouseUpWrapper_=null),this.onMouseMoveWrapper_&&(E(this.onMouseMoveWrapper_),this.onMouseMoveWrapper_=null)}getRatio_(){let t=this.handlePosition/(this.scrollbarLength-this.handleLength);return isNaN(t)&&(t=0),t}updateMetrics(){const t=this.getRatio_();this.horizontal?this.workspace.setMetrics({x:t}):this.workspace.setMetrics({y:t})}set(t,e){this.setHandlePosition(this.constrainHandlePosition(t*this.ratio)),(e||void 0===e)&&this.updateMetrics()}setOrigin(t,e){this.origin=new _c(t,e)}static metricsAreEquivalent(t,e){return t.viewWidth===e.viewWidth&&t.viewHeight===e.viewHeight&&t.viewLeft===e.viewLeft&&t.viewTop===e.viewTop&&t.absoluteTop===e.absoluteTop&&t.absoluteLeft===e.absoluteLeft&&t.scrollWidth===e.scrollWidth&&t.scrollHeight===e.scrollHeight&&t.scrollLeft===e.scrollLeft&&t.scrollTop===e.scrollTop}};Sc.scrollbarThickness=ra?25:15,Sc.DEFAULT_SCROLLBAR_MARGIN=.5;var Rc={parseFromString:function(){throw Error("DOMParser was not found in the global scope and was not properly injected using injectDependencies")}},yc={serializeToString:function(){throw Error("XMLSerializer was not foundin the global scope and was not properly injected using injectDependencies")}},{document:Oc,DOMParser:kc,XMLSerializer:Ac}=globalThis;kc&&(Rc=new kc),Ac&&(yc=new Ac);var vc="https://developers.google.com/blockly/xml",Nc=/[\x00-\x09\x0B\x0C\x0E-\x1F]/g,wc={NAME_SPACE:vc};wc.createElement=Hl.createElement$$module$build$src$core$utils$xml,wc.createTextNode=Hl.createTextNode$$module$build$src$core$utils$xml,wc.domToText=le,wc.injectDependencies=re,wc.textToDom=Hl.textToDom$$module$build$src$core$utils$xml;var Lc,Mc="categoryToolbox",Dc="flyoutToolbox";!function(t){t[t.TOP=0]="TOP",t[t.BOTTOM=1]="BOTTOM",t[t.LEFT=2]="LEFT",t[t.RIGHT=3]="RIGHT"}(Lc||(Lc={}));var xc,Pc,Bc,Fc={hasCategoriesInternal:pe},Uc={};Uc.Position=Lc,Uc.TEST_ONLY=Fc,Uc.convertFlyoutDefToJsonArray=ue,Uc.convertToolboxDefToJson=ce,Uc.hasCategories=de,Uc.isCategoryCollapsible=ge,Uc.parseToolboxTree=Ee,function(t){t[t.TOP=0]="TOP",t[t.BOTTOM=1]="BOTTOM"}(xc||(xc={})),function(t){t[t.LEFT=0]="LEFT",t[t.RIGHT=1]="RIGHT"}(Pc||(Pc={})),function(t){t[t.UP=0]="UP",t[t.DOWN=1]="DOWN"}(Bc||(Bc={}));var Hc={};Hc.bumpDirection=Bc,Hc.bumpPositionRect=$e,Hc.getCornerOppositeToolbox=fe,Hc.getStartPositionRect=be,Hc.horizontalPosition=Pc,Hc.verticalPosition=xc;var Gc=96,Vc=124,Wc="sprites.png",Xc=class{constructor(t){this.workspace=t,this.id="zoomControls",this.boundEvents=[],this.zoomResetGroup=this.zoomOutGroup=this.zoomInGroup=null,this.HEIGHT=this.WIDTH=32,this.SMALL_SPACING=2,this.LARGE_SPACING=11,this.MARGIN_HORIZONTAL=this.MARGIN_VERTICAL=20,this.svgGroup=null,this.top=this.left=0,this.initialized=!1}createDom(){this.svgGroup=at(Tc.G,{});const t=String(Math.random()).substring(2);return this.createZoomOutSvg(t),this.createZoomInSvg(t),this.workspace.isMovable()&&this.createZoomResetSvg(t),this.svgGroup}init(){this.workspace.getComponentManager().addComponent({component:this,weight:cc.ComponentWeight.ZOOM_CONTROLS_WEIGHT,capabilities:[cc.Capability.POSITIONABLE]}),this.initialized=!0}dispose(){this.workspace.getComponentManager().removeComponent("zoomControls"),this.svgGroup&&pt(this.svgGroup);for(const t of this.boundEvents)E(t);this.boundEvents.length=0}getBoundingRectangle(){let t=this.SMALL_SPACING+2*this.HEIGHT;return this.zoomResetGroup&&(t+=this.LARGE_SPACING+this.HEIGHT),new mc(this.top,this.top+t,this.left,this.left+this.WIDTH)}position(t,e){if(this.initialized){var s,i=fe(this.workspace,t),o=this.SMALL_SPACING+2*this.HEIGHT;if(this.zoomResetGroup&&(o+=this.LARGE_SPACING+this.HEIGHT),t=be(i,new Ec(this.WIDTH,o),this.MARGIN_HORIZONTAL,this.MARGIN_VERTICAL,t,this.workspace),i=i.vertical,e=$e(t,this.MARGIN_VERTICAL,i===xc.TOP?Bc.DOWN:Bc.UP,e),i===xc.TOP){var n,r=this.SMALL_SPACING+this.HEIGHT;null==(n=this.zoomInGroup)||n.setAttribute("transform","translate(0, "+r+")"),this.zoomResetGroup&&this.zoomResetGroup.setAttribute("transform","translate(0, "+(r+this.LARGE_SPACING+this.HEIGHT)+")")}else{let t;n=this.zoomResetGroup?this.LARGE_SPACING+this.HEIGHT:0,null==(t=this.zoomInGroup)||t.setAttribute("transform","translate(0, "+n+")"),n=n+this.SMALL_SPACING+this.HEIGHT,null==(r=this.zoomOutGroup)||r.setAttribute("transform","translate(0, "+n+")")}this.top=e.top,this.left=e.left,null==(s=this.svgGroup)||s.setAttribute("transform","translate("+this.left+","+this.top+")")}}createZoomOutSvg(t){this.zoomOutGroup=at(Tc.G,{class:"blocklyZoom blocklyZoomOut"},this.svgGroup);const e=at(Tc.CLIPPATH,{id:"blocklyZoomoutClipPath"+t},this.zoomOutGroup);at(Tc.RECT,{width:32,height:32},e),at(Tc.IMAGE,{width:Gc,height:Vc,x:-64,y:-92,"clip-path":"url(#blocklyZoomoutClipPath"+t+")"},this.zoomOutGroup).setAttributeNS(Fa,"xlink:href",this.workspace.options.pathToMedia+Wc),this.boundEvents.push(T(this.zoomOutGroup,"pointerdown",null,this.zoom.bind(this,-1)))}createZoomInSvg(t){this.zoomInGroup=at(Tc.G,{class:"blocklyZoom blocklyZoomIn"},this.svgGroup);const e=at(Tc.CLIPPATH,{id:"blocklyZoominClipPath"+t},this.zoomInGroup);at(Tc.RECT,{width:32,height:32},e),at(Tc.IMAGE,{width:Gc,height:Vc,x:-32,y:-92,"clip-path":"url(#blocklyZoominClipPath"+t+")"},this.zoomInGroup).setAttributeNS(Fa,"xlink:href",this.workspace.options.pathToMedia+Wc),this.boundEvents.push(T(this.zoomInGroup,"pointerdown",null,this.zoom.bind(this,1)))}zoom(t,e){this.workspace.markFocused(),this.workspace.zoomCenter(t),this.fireZoomEvent(),d(),e.stopPropagation(),e.preventDefault()}createZoomResetSvg(t){this.zoomResetGroup=at(Tc.G,{class:"blocklyZoom blocklyZoomReset"},this.svgGroup);const e=at(Tc.CLIPPATH,{id:"blocklyZoomresetClipPath"+t},this.zoomResetGroup);at(Tc.RECT,{width:32,height:32},e),at(Tc.IMAGE,{width:Gc,height:Vc,y:-92,"clip-path":"url(#blocklyZoomresetClipPath"+t+")"},this.zoomResetGroup).setAttributeNS(Fa,"xlink:href",this.workspace.options.pathToMedia+Wc),this.boundEvents.push(T(this.zoomResetGroup,"pointerdown",null,this.resetZoom.bind(this)))}resetZoom(t){this.workspace.markFocused();const e=Math.log(this.workspace.options.zoomOptions.startScale/this.workspace.scale)/Math.log(this.workspace.options.zoomOptions.scaleSpeed);this.workspace.beginCanvasTransition(),this.workspace.zoomCenter(e),this.workspace.scrollCenter(),setTimeout(this.workspace.endCanvasTransition.bind(this.workspace),500),this.fireZoomEvent(),d(),t.stopPropagation(),t.preventDefault()}fireZoomEvent(){const t=new(rt(ua.CLICK))(null,this.workspace.id,"zoom_controls");J(t)}};Vt("\n.blocklyZoom>image, .blocklyZoom>svg>image {\n opacity: .4;\n}\n\n.blocklyZoom>image:hover, .blocklyZoom>svg>image:hover {\n opacity: .6;\n}\n\n.blocklyZoom>image:active, .blocklyZoom>svg>image:active {\n opacity: .8;\n}\n");var zc={BLOCKS:50,PROCEDURES:75,VARIABLES:100,WORKSPACE_COMMENTS:25},Yc={};Yc.register=Ie,Yc.unregister=Ce;var Kc=class{constructor(){this.priority=25}save(t){const e=[];for(const s of t.getTopComments())(t=Se(s,{addCoordinates:!0,saveIds:!0}))&&e.push(t);return e.length?e:null}load(t,e){for(const s of t)Re(s,e,{recordUndo:j()})}clear(t){for(const e of t.getTopComments())e.dispose()}};Ie("workspaceComments",new Kc);var jc={};jc.WorkspaceCommentSerializer=Kc,jc.append=Re,jc.save=Se;var Jc={};Jc.register=ye,Jc.unregister=Oe;var qc=class{paste(t,e,s){let i;t=t.commentState,s&&(t.x=s.x,t.y=s.y),Hl.disable$$module$build$src$core$events$utils();try{i=Re(t,e),ke(i)}finally{Hl.enable$$module$build$src$core$events$utils()}return i?(st()&&J(new(rt(ua.COMMENT_CREATE))(i)),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(i),i):null}};qc.TYPE="workspace-comment",ye(qc.TYPE,new qc),Hl.config$$module$build$src$core$config={dragRadius:5,flyoutDragRadius:10,snapRadius:28,connectingSnapRadius:28,currentConnectionPreference:8,bumpDelay:250},Hl.config$$module$build$src$core$config;var Zc,Qc,th="aria-",eh="role";(function(t){t.GRID="grid",t.GRIDCELL="gridcell",t.GROUP="group",t.LISTBOX="listbox",t.MENU="menu",t.MENUITEM="menuitem",t.MENUITEMCHECKBOX="menuitemcheckbox",t.OPTION="option",t.PRESENTATION="presentation",t.ROW="row",t.TREE="tree",t.TREEITEM="treeitem",t.SEPARATOR="separator",t.STATUS="status"})(Zc||(Zc={})),function(t){t.ACTIVEDESCENDANT="activedescendant",t.COLCOUNT="colcount",t.DISABLED="disabled",t.EXPANDED="expanded",t.INVALID="invalid",t.LABEL="label",t.LABELLEDBY="labelledby",t.LEVEL="level",t.ORIENTATION="orientation",t.POSINSET="posinset",t.ROWCOUNT="rowcount",t.SELECTED="selected",t.SETSIZE="setsize",t.VALUEMAX="valuemax",t.VALUEMIN="valuemin",t.LIVE="live",t.HIDDEN="hidden"}(Qc||(Qc={}));var sh={};sh.Role=Zc,sh.State=Qc,sh.setRole=ve,sh.setState=Ne;var ih=class{constructor(t,e){this.content=t,this.opt_value=e,this.enabled=!0,this.element=null,this.rightToLeft=!1,this.roleName=null,this.highlight=this.checked=this.checkable=!1,this.actionHandler=null}createDom(){const t=document.createElement("div");t.id=C(),this.element=t,t.className="blocklyMenuItem "+(this.enabled?"":"blocklyMenuItemDisabled ")+(this.checked?"blocklyMenuItemSelected ":"")+(this.highlight?"blocklyMenuItemHighlight ":"")+(this.rightToLeft?"blocklyMenuItemRtl ":"");const e=document.createElement("div");e.className="blocklyMenuItemContent";let s=this.content;return"string"==typeof this.content&&(s=document.createTextNode(this.content)),e.appendChild(s),t.appendChild(e),this.checkable&&this.toggleHasCheckbox(!0),this.roleName&&ve(t,this.roleName),Ne(t,Qc.SELECTED,this.checkable&&this.checked||!1),Ne(t,Qc.DISABLED,!this.enabled),t}dispose(){this.element=null}getElement(){return this.element}getId(){return this.element.id}getValue(){let t;return null!=(t=this.opt_value)?t:null}setRightToLeft(t){let e;this.rightToLeft=t,null==(e=this.getElement())||e.classList.toggle("blocklyMenuItemRtl",this.rightToLeft)}setRole(t){this.roleName=t}setCheckable(t){(this.checkable=t)||this.setChecked(!1),this.toggleHasCheckbox(t)}setChecked(t){t&&!this.checkable||(this.checked=t,(t=this.getElement())&&(t.classList.toggle("blocklyMenuItemSelected",this.checked),Ne(t,Qc.SELECTED,this.checked)))}setHighlighted(t){if(this.highlight=t,this.isEnabled()){let t;null==(t=this.getElement())||t.classList.toggle("blocklyMenuItemHighlight",this.highlight)}}isEnabled(){return this.enabled}setEnabled(t){this.enabled=t,(t=this.getElement())&&(t.classList.toggle("blocklyMenuItemDisabled",!this.enabled),Ne(t,Qc.DISABLED,!this.enabled))}performAction(t){this.isEnabled()&&this.actionHandler&&this.actionHandler(this,t)}onAction(t,e){this.actionHandler=t.bind(e)}toggleHasCheckbox(t){if(t){let i;var e,s;null!=(i=this.getElement())&&i.querySelector(".blocklyMenuItemContent .blocklyMenuItemCheckbox")||((t=document.createElement("div")).className="blocklyMenuItemCheckbox ",null==(e=this.getElement())||null==(s=e.querySelector(".blocklyMenuItemContent"))||s.prepend(t))}else{let t,e;null==(t=this.getElement())||null==(e=t.querySelector(".blocklyMenuItemContent .blocklyMenuItemCheckbox"))||e.remove()}}},oh=class{constructor(){this.menuItems=[],this.roleName=this.element=this.onKeyDownHandler=this.pointerLeaveHandler=this.pointerEnterHandler=this.clickHandler=this.pointerMoveHandler=this.highlightedItem=this.openingCoords=null}addChild(t){this.menuItems.push(t)}render(t){const e=document.createElement("div");e.className="blocklyMenu",e.tabIndex=0,this.roleName&&ve(e,this.roleName),this.element=e;for(let t,s=0;t=this.menuItems[s];s++)e.appendChild(t.createDom());return this.pointerMoveHandler=T(e,"pointermove",this,this.handlePointerMove,!0),this.clickHandler=T(e,"pointerup",this,this.handleClick,!0),this.pointerEnterHandler=T(e,"pointerenter",this,this.handlePointerEnter,!0),this.pointerLeaveHandler=T(e,"pointerleave",this,this.handlePointerLeave,!0),this.onKeyDownHandler=T(e,"keydown",this,this.handleKeyEvent),t.appendChild(e),e}getElement(){return this.element}focus(){const t=this.getElement();t&&t.focus({preventScroll:!0})}blur(){const t=this.getElement();t&&t.blur()}setRole(t){this.roleName=t}dispose(){this.pointerMoveHandler&&(E(this.pointerMoveHandler),this.pointerMoveHandler=null),this.clickHandler&&(E(this.clickHandler),this.clickHandler=null),this.pointerEnterHandler&&(E(this.pointerEnterHandler),this.pointerEnterHandler=null),this.pointerLeaveHandler&&(E(this.pointerLeaveHandler),this.pointerLeaveHandler=null),this.onKeyDownHandler&&(E(this.onKeyDownHandler),this.onKeyDownHandler=null);for(let t,e=0;t=this.menuItems[e];e++)t.dispose();this.element=null}getMenuItem(t){const e=this.getElement();for(;t&&t!==e;){if(t.classList.contains("blocklyMenuItem")){const e=this.getMenuItems();for(let s,i=0;s=e[i];i++)if(s.getElement()===t)return s}t=t.parentElement}return null}setHighlighted(t){var e=this.highlightedItem;if(e&&(e.setHighlighted(!1),this.highlightedItem=null),t){t.setHighlighted(!0),this.highlightedItem=t,e=this.getElement();const s=t.getElement();e&&s&&(Zt(s,e),Ne(e,Qc.ACTIVEDESCENDANT,t.getId()))}}highlightNext(){const t=this.highlightedItem?this.getMenuItems().indexOf(this.highlightedItem):-1;this.highlightHelper(t,1)}highlightPrevious(){const t=this.highlightedItem?this.getMenuItems().indexOf(this.highlightedItem):-1;this.highlightHelper(t<0?this.menuItems.length:t,-1)}highlightFirst(){this.highlightHelper(-1,1)}highlightLast(){this.highlightHelper(this.menuItems.length,-1)}highlightHelper(t,e){let s;t+=e;const i=this.getMenuItems();for(;s=i[t];){if(s.isEnabled()){this.setHighlighted(s);break}t+=e}}handlePointerMove(t){0!==Math.max(Math.abs(t.movementX),Math.abs(t.movementY))&&(t=this.getMenuItem(t.target))&&(t.isEnabled()?this.highlightedItem!==t&&this.setHighlighted(t):this.setHighlighted(null))}handleClick(t){var e=this.openingCoords;if(this.openingCoords=null,e&&"number"==typeof t.clientX){const s=new _c(t.clientX,t.clientY);if(_c.distance(e,s)<1)return}(e=this.getMenuItem(t.target))&&e.performAction(t)}handlePointerEnter(t){this.focus()}handlePointerLeave(t){this.getElement()&&this.setHighlighted(null)}handleKeyEvent(t){if(this.menuItems.length&&!(t.shiftKey||t.ctrlKey||t.metaKey||t.altKey)){var e=this.highlightedItem;switch(t.key){case"Enter":case" ":e&&e.performAction(t);break;case"ArrowUp":this.highlightPrevious();break;case"ArrowDown":this.highlightNext();break;case"PageUp":case"Home":this.highlightFirst();break;case"PageDown":case"End":this.highlightLast();break;default:return}t.preventDefault(),t.stopPropagation()}}getSize(){const t=this.getElement(),e=Xt(t);return e.height=t.scrollHeight,e}getMenuItems(){return this.menuItems.filter(t=>t instanceof ih)}},nh=class{constructor(){this.element=null}createDom(){return this.element=document.createElement("hr"),this.element.className="blocklyMenuSeparator",ve(this.element,Zc.SEPARATOR),this.element}dispose(){let t;null==(t=this.element)||t.remove(),this.element=null}},rh="_TEMP_COLLAPSED_INPUT",lh="_TEMP_COLLAPSED_FIELD",ah="MANUALLY_DISABLED",ch={COLLAPSED_FIELD_NAME:lh,COLLAPSED_INPUT_NAME:rh,MANUALLY_DISABLED:ah};(function(t){t[t.VALUE=1]="VALUE",t[t.STATEMENT=3]="STATEMENT",t[t.DUMMY=5]="DUMMY",t[t.CUSTOM=6]="CUSTOM",t[t.END_ROW=7]="END_ROW"})(Hl.inputTypes$$module$build$src$core$inputs$input_types||(Hl.inputTypes$$module$build$src$core$inputs$input_types={})),Hl.inputTypes$$module$build$src$core$inputs$input_types;var hh,uh,dh=new Set,ph=new WeakSet,gh=new WeakMap,_h=null,Th=null,mh=0,Eh={};Eh.finishQueuedRenders=Me,Eh.queueRender=Le,Eh.triggerQueuedRenders=De,Hl.Msg$$module$build$src$core$msg=Object.create(null),hh=function(t){Object.keys(t).forEach(function(e){Hl.Msg$$module$build$src$core$msg[e]=t[e]})},uh={Msg:Hl.Msg$$module$build$src$core$msg,setLocale:hh};var bh="blocklyToast",fh="blocklyToastMessage",$h="blocklyToastCloseButton",Ih=class{static show(t,e){if(e.oncePerSession&&e.id){if(this.shownIds.has(e.id))return;this.shownIds.add(e.id)}this.hide(t);const s=this.createDom(t,e);requestAnimationFrame(()=>{s.style.bottom="2rem"})}static createDom(t,e){const{message:s,duration:i=5,assertiveness:o=Ih.Assertiveness.POLITE}=e,n=document.createElement("div");t.getInjectionDiv().appendChild(n),n.dataset.toastId=e.id,n.className=bh,ve(n,Zc.STATUS),Ne(n,Qc.LIVE,o),(e=n.appendChild(document.createElement("div"))).className=fh,e.innerText=s,(e=n.appendChild(document.createElement("button"))).className=$h,Ne(e,Qc.LABEL,Hl.Msg$$module$build$src$core$msg.CLOSE);var r=at(Tc.SVG,{width:24,height:24,viewBox:"0 0 24 24",fill:"none"},e);let l;return Ne(r,Qc.HIDDEN,!0),at(Tc.RECT,{x:19.7782,y:2.80762,width:2,height:24,transform:"rotate(45, 19.7782, 2.80762)",fill:"black"},r),at(Tc.RECT,{x:2.80762,y:4.22183,width:2,height:24,transform:"rotate(-45, 2.80762, 4.22183)",fill:"black"},r),e.addEventListener("click",()=>{n.remove(),t.markFocused()}),e=()=>{l=setTimeout(()=>n.remove(),1e3*i)},r=()=>clearTimeout(l),n.addEventListener("focusin",r),n.addEventListener("focusout",e),n.addEventListener("mouseenter",r),n.addEventListener("mousemove",r),n.addEventListener("mouseleave",e),e(),n}static hide(t,e){(t=t.getInjectionDiv().querySelector(`.${bh}`))instanceof HTMLElement&&(!e||e===t.dataset.toastId)&&t.remove()}};Ih.shownIds=new Set,function(t){(t=t.Assertiveness||(t.Assertiveness={})).ASSERTIVE="assertive",t.POLITE="polite"}(Ih||(Ih={})),Vt(`\n.${bh} {\n font-size: 1.2rem;\n position: absolute;\n bottom: -10rem;\n right: 2rem;\n padding: 1rem;\n color: black;\n background-color: white;\n border: 2px solid black;\n border-radius: 0.4rem;\n z-index: 999;\n display: flex;\n align-items: center;\n gap: 0.8rem;\n line-height: 1.5;\n transition: bottom 0.3s ease-out;\n}\n\n.${bh} .${fh} {\n maxWidth: 18rem;\n}\n\n.${bh} .${$h} {\n margin: 0;\n padding: 0.2rem;\n background-color: transparent;\n color: black;\n border: none;\n cursor: pointer;\n}\n`);var Ch=function(t,e){window.alert(t),e&&e()},Sh=Ch,Rh=function(t,e){e(window.confirm(t))},yh=Rh,Oh=function(t,e,s){s(window.prompt(t,e))},kh=Oh,Ah=Ih.show.bind(Ih),vh=Ah,Nh={};Nh.alert=Ge,Nh.confirm=We,Nh.prompt=ze,Nh.setAlert=Ve,Nh.setConfirm=Xe,Nh.setPrompt=Ye,Nh.setToast=je,Nh.toast=Ke;var wh={};wh.isLegacyProcedureCallBlock=qe,wh.isLegacyProcedureDefBlock=Je;var Lh=new Set,Mh={};Mh.warn=Qe;var Dh="VARIABLE",xh="ijkmnopqrstuvwxyzabcdefgh",Ph={generateUniqueNameInternal:ls},Bh={CATEGORY_NAME:Dh,TEST_ONLY:Ph,VAR_LETTER_OPTIONS:xh};Bh.allDeveloperVariables=Hl.allDeveloperVariables$$module$build$src$core$variables,Bh.allUsedVarModels=Hl.allUsedVarModels$$module$build$src$core$variables,Bh.compareByName=bs,Bh.createVariableButtonHandler=cs,Bh.deleteVariable=Hl.deleteVariable$$module$build$src$core$variables,Bh.flyoutCategory=es,Bh.flyoutCategoryBlocks=ns,Bh.generateUniqueName=rs,Bh.generateUniqueNameFromOptions=as,Bh.generateVariableFieldDom=Ts,Bh.getAddedVariables=Es,Bh.getOrCreateVariablePackage=Hl.getOrCreateVariablePackage$$module$build$src$core$variables,Bh.getVariable=Hl.getVariable$$module$build$src$core$variables,Bh.getVariableUsesById=fs,Bh.internalFlyoutCategory=ts,Bh.jsonFlyoutCategoryBlocks=is,Bh.nameUsedWithAnyType=ds,Bh.nameUsedWithConflictingParam=ps,Bh.promptName=hs,Bh.renameVariable=Hl.renameVariable$$module$build$src$core$variables;var Fh=class extends Error{},Uh=class extends Fh{constructor(t){super("Expected to find a 'type' property, defining the block type"),this.state=t}},Hh=class extends Fh{constructor(t,e,s){super(`The block ${e.toDevString()} is missing a(n) ${t}\nconnection`),this.block=e,this.state=s}},Gh=class extends Fh{constructor(t,e,s,i){super(`The block ${s.toDevString()} could not connect its\n${e} to its parent, because: ${t}`),this.childBlock=s,this.childState=i}},Vh=class extends Fh{constructor(t){super("Encountered a real block which is defined as a child of a shadow\nblock. It is an invariant of Blockly that shadow blocks only have shadow\nchildren"),this.state=t}},Wh=class extends Fh{constructor(t,e,s){super(`Cannot add an icon of type '${t}' to the block ${e.toDevString()}, because there is no icon registered with type '${t}'. Make sure that all of your icons have been registered.`),this.block=e,this.state=s}},Xh={};Xh.BadConnectionCheck=Gh,Xh.DeserializationError=Fh,Xh.MissingBlockType=Uh,Xh.MissingConnection=Hh,Xh.RealChildOfShadow=Vh,Xh.UnregisteredIcon=Wh;var zh=class{constructor(){this.priority=50}save(t){const e=[];for(const s of t.getTopBlocks(!1))(t=$s(s,{addCoordinates:!0,doFullSerialization:!1}))&&e.push(t);return e.length?{languageVersion:0,blocks:e}:null}load(t,e){t=t.blocks;for(const s of t)vs(s,e,{recordUndo:j()})}clear(t){for(const e of t.getTopBlocks(!1))e.dispose(!1)}};Ie("blocks",new zh);var Yh={};Yh.BlockSerializer=zh,Yh.append=vs,Yh.appendInternal=Ns,Yh.save=$s;var Kh=class{constructor(t){this.name=t}toString(){return this.name}equals(t){return this.name===t.toString()}};Kh.MUTATOR=new Kh("mutator"),Kh.WARNING=new Kh("warning"),Kh.COMMENT=new Kh("comment");var jh=class extends ic{constructor(t){super(),this.isBlank=!0,this.isBlank=!t,t&&(this.blockId=t.id,this.workspaceId=t.workspace.id)}toJson(){const t=super.toJson();if(!this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");return t.blockId=this.blockId,t}static fromJson(t,e,s){return(e=ic.fromJson(t,e,null!=s?s:new jh)).blockId=t.blockId,e}},Jh=class extends jh{constructor(t,e,s,i,o){super(t),this.type=ua.BLOCK_CHANGE,t&&(this.element=e,this.name=s||void 0,this.oldValue=i,this.newValue=o)}toJson(){const t=super.toJson();if(!this.element)throw Error("The changed element is undefined. Either pass an element to the constructor, or call fromJson");return t.element=this.element,t.name=this.name,t.oldValue=this.oldValue,t.newValue=this.newValue,this.disabledReason&&(t.disabledReason=this.disabledReason),t}static fromJson(t,e,s){return(e=jh.fromJson(t,e,null!=s?s:new Jh)).element=t.element,e.name=t.name,e.oldValue=t.oldValue,e.newValue=t.newValue,void 0!==t.disabledReason&&(e.disabledReason=t.disabledReason),e}setDisabledReason(t){if("disabled"!==this.element)throw Error('Cannot set the disabled reason for a BlockChange event if the element is not "disabled".');this.disabledReason=t}isNull(){return this.oldValue===this.newValue}run(t){var e=this.getEventWorkspace_();if(!this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");if(!(e=e.getBlockById(this.blockId)))throw Error("The associated block is undefined. Either pass a block to the constructor, or call fromJson");const s=e.getIcon(Kh.MUTATOR);switch(s&&Ws(s)&&s.bubbleIsVisible()&&s.setBubbleVisible(!1),t=t?this.newValue:this.oldValue,this.element){case"field":(e=e.getField(this.name))?e.setValue(t):console.warn("Can't set non-existent field: "+this.name);break;case"comment":e.setCommentText(null!=t?t:null);break;case"collapsed":e.setCollapsed(!!t);break;case"disabled":var i;e.setDisabledReason(!!t,null!=(i=this.disabledReason)?i:ah);break;case"inline":e.setInputsInline(!!t);break;case"mutation":i=Jh.getExtraBlockState_(e),e.loadExtraState?e.loadExtraState(JSON.parse(t||"{}")):e.domToMutation&&e.domToMutation(Hl.textToDom$$module$build$src$core$utils$xml(t||"")),J(new Jh(e,"mutation",null,i,t));break;default:console.warn("Unknown change type: "+this.element)}}static getExtraBlockState_(t){return t.saveExtraState?(t=t.saveExtraState(!0))?JSON.stringify(t):"":t.mutationToDom&&(t=t.mutationToDom())?Uo(t):""}};t(zl.EVENT,ua.BLOCK_CHANGE,Jh);var qh={};qh.clamp=Ys,qh.toDegrees=zs,qh.toRadians=Xs;var Zh,Qh,tu,eu=16,su=1,iu=12,ou=16,nu=.25,ru=null,lu=null,au="",cu="",hu=null,uu=null,du=null,pu=null,gu=null,_u={getBoundsInfo:function(){const t=jt(hu),e=Xt(hu);return{left:t.x,right:t.x+e.width,top:t.y,bottom:t.y+e.height,width:e.width,height:e.height}},getPositionMetrics:function(t,e,s,i){const o=_u.getBoundsInfo(),n=Xt(Zh);return e+n.heighto.top?li(s,i,o,n):e+n.heightdocument.documentElement.clientTop?li(s,i,o,n):ai(t,o,n)}},Tu={ANIMATION_TIME:nu,ARROW_HORIZONTAL_PADDING:iu,ARROW_SIZE:eu,BORDER_SIZE:su,PADDING_Y:ou,TEST_ONLY:_u};Tu.clearContent=Zs,Tu.createDom=Ks,Tu.getContentDiv=qs,Tu.getOwner=Js,Tu.getPositionX=ci,Tu.hide=di,Tu.hideIfOwner=ui,Tu.hideWithoutAnimation=pi,Tu.isVisible=hi,Tu.repositionForWindowResize=_i,Tu.setBoundsElement=js,Tu.setColour=Qs,Tu.show=ni,Tu.showPositionedByBlock=ti,Tu.showPositionedByField=ei;var mu={};mu.commonWordPrefix=mi,mu.commonWordSuffix=Ei,mu.isNumber=Hl.isNumber$$module$build$src$core$utils$string,mu.shortestStringLength=Ti,mu.wrap=Hl.wrap$$module$build$src$core$utils$string;var Eu=void 0,bu=!1,fu=!1,$u=50,Iu=0,Cu=0,Su=0,Ru=0,yu=null,Ou=null,ku=0,Au=10,vu=10,Nu=750,wu=5,Lu=null,Mu={HOVER_MS:Nu,LIMIT:$u,MARGINS:wu,OFFSET_X:ku,OFFSET_Y:Au,RADIUS_OK:vu};Mu.bindMouseEvents=vi,Mu.block=Pi,Mu.createDom=Ai,Mu.dispose=Di,Mu.getCustomTooltip=Si,Mu.getDiv=yi,Mu.getTooltipOfObject=Oi,Mu.hide=xi,Mu.isVisible=Ri,Mu.setCustomTooltip=Ci,Mu.unbindMouseEvents=Ni,Mu.unblock=Bi;var Du=.45,xu=.65,Pu={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00"},Bu={};Bu.blend=qi,Bu.getHsvSaturation=Vi,Bu.getHsvValue=Xi,Bu.hexToRgb=ji,Bu.hsvToHex=Ji,Bu.hueToHex=Zi,Bu.names=Pu,Bu.parse=Yi,Bu.rgbToHex=Ki,Bu.setHsvSaturation=Wi,Bu.setHsvValue=zi;var Fu={};Fu.checkMessageReferences=so,Fu.parseBlockColour=io,Fu.replaceMessageReferences=eo,Fu.tokenizeInterpolation=to;var Uu=class{get size_(){return this.size}set size_(t){this.size=t}constructor(t,e,s){this.DEFAULT_VALUE=null,this.name=void 0,this.tooltip=this.validator_=null,this.size=new Ec(0,0),this.constants_=this.mouseDownWrapper=this.textContent_=this.textElement_=this.borderRect_=this.fieldGroup_=null,this.disposed=!1,this.maxDisplayLength=50,this.sourceBlock_=null,this.enabled_=this.visible_=this.isDirty_=!0,this.suffixField=this.prefixField=this.clickTarget_=null,this.EDITABLE=!0,this.SERIALIZABLE=!1,this.id_=null,this.value_="DEFAULT_VALUE"in new.target.prototype?new.target.prototype.DEFAULT_VALUE:this.DEFAULT_VALUE,this.size_=new Ec(0,0),t!==Uu.SKIP_SETUP&&(s&&this.configure_(s),this.setValue(t),e&&this.setValidator(e))}configure_(t){t.tooltip&&this.setTooltip(eo(t.tooltip))}setSourceBlock(t){if(this.sourceBlock_)throw Error("Field already bound to a block");if(this.sourceBlock_=t,t.id.includes("_field"))throw Error(`Field ID indicator is contained in block ID. This may cause problems with focus: ${t.id}.`);this.id_=`${t.id}_field_${C()}`}getConstants(){return!this.constants_&&this.sourceBlock_&&!this.sourceBlock_.isDeadOrDying()&&this.sourceBlock_.workspace.rendered&&(this.constants_=this.sourceBlock_.workspace.getRenderer().getConstants()),this.constants_}getSourceBlock(){return this.sourceBlock_}init(){if(!this.fieldGroup_){var t=this.id_;if(!t)throw Error("Expected ID to be defined prior to init.");this.fieldGroup_=at(Tc.G,{id:t}),this.isVisible()||(this.fieldGroup_.style.display="none"),this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_),this.initView(),this.updateEditable(),this.setTooltip(this.tooltip),this.bindEvents_(),this.initModel(),this.applyColour()}}initView(){this.createBorderRect_(),this.createTextElement_(),this.fieldGroup_&&ct(this.fieldGroup_,"blocklyField")}initModel(){}isFullBlockField(){return!this.borderRect_}createBorderRect_(){this.borderRect_=at(Tc.RECT,{rx:this.getConstants().FIELD_BORDER_RECT_RADIUS,ry:this.getConstants().FIELD_BORDER_RECT_RADIUS,x:0,y:0,height:this.size_.height,width:this.size_.width,class:"blocklyFieldRect"},this.fieldGroup_)}createTextElement_(){this.textElement_=at(Tc.TEXT,{class:"blocklyText blocklyFieldText"},this.fieldGroup_),this.getConstants().FIELD_TEXT_BASELINE_CENTER&&this.textElement_.setAttribute("dominant-baseline","central"),this.textContent_=document.createTextNode(""),this.textElement_.appendChild(this.textContent_)}bindEvents_(){const t=this.getClickTarget_();if(!t)throw Error("A click target has not been set.");vi(t),this.mouseDownWrapper=T(t,"pointerdown",this,this.onMouseDown_)}fromXml(t){this.setValue(t.textContent)}toXml(t){return t.textContent=this.getValue(),t}saveState(t){return null!==(t=this.saveLegacyState(Uu))?t:this.getValue()}loadState(t){this.loadLegacyState(Uu,t)||this.setValue(t)}saveLegacyState(t){return t.prototype.saveState===this.saveState&&t.prototype.toXml!==this.toXml?((t=Hl.createElement$$module$build$src$core$utils$xml("field")).setAttribute("name",this.name||""),le(this.toXml(t)).replace(' xmlns="https://developers.google.com/blockly/xml"',"")):null}loadLegacyState(t,e){return t.prototype.loadState===this.loadState&&t.prototype.fromXml!==this.fromXml&&(this.fromXml(Hl.textToDom$$module$build$src$core$utils$xml(e)),!0)}dispose(){let t;ui(this),ho(this),null!=(t=this.getSourceBlock())&&t.isDeadOrDying()||pt(this.fieldGroup_),this.disposed=!0}updateEditable(){const t=this.fieldGroup_,e=this.getSourceBlock();this.EDITABLE&&t&&e&&(this.enabled_&&e.isEditable()?(ct(t,"blocklyEditableField"),ut(t,"blocklyNonEditableField")):(ct(t,"blocklyNonEditableField"),ut(t,"blocklyEditableField")))}setEnabled(t){this.enabled_=t,this.updateEditable()}isEnabled(){return this.enabled_}isClickable(){return this.enabled_&&!!this.sourceBlock_&&this.sourceBlock_.isEditable()&&this.showEditor_!==Uu.prototype.showEditor_}isClickableInFlyout(t){return!t}isCurrentlyEditable(){return this.enabled_&&this.EDITABLE&&!!this.sourceBlock_&&this.sourceBlock_.isEditable()}isSerializable(){let t=!1;return this.name&&(this.SERIALIZABLE?t=!0:this.EDITABLE&&(console.warn("Detected an editable field that was not serializable. Please define SERIALIZABLE property as true on all editable custom fields. Proceeding with serialization."),t=!0)),t}isVisible(){return this.visible_}setVisible(t){if(this.visible_!==t){this.visible_=t;var e=this.fieldGroup_;e&&(e.style.display=t?"block":"none")}}setValidator(t){this.validator_=t}getValidator(){return this.validator_}getSvgRoot(){return this.fieldGroup_}getBorderRect(){if(!this.borderRect_)throw Error(`The border rectangle is ${this.borderRect_}.`);return this.borderRect_}getTextElement(){if(!this.textElement_)throw Error(`The text element is ${this.textElement_}.`);return this.textElement_}getTextContent(){if(!this.textContent_)throw Error(`The text content is ${this.textContent_}.`);return this.textContent_}applyColour(){}render_(){this.textContent_&&(this.textContent_.nodeValue=this.getDisplayText_()),this.updateSize_()}showEditor(t){this.isClickable()&&this.showEditor_(t)}showEditor_(t){}repositionForWindowResize(){return!1}updateSize_(t){const e=this.getConstants();let s=2*(t=void 0!==t?t:this.isFullBlockField()?0:this.getConstants().FIELD_BORDER_RECT_X_PADDING),i=e.FIELD_TEXT_HEIGHT,o=0;this.textElement_&&(o=Et(this.textElement_),s+=o),this.isFullBlockField()||(i=Math.max(i,e.FIELD_BORDER_RECT_HEIGHT)),this.size_=new Ec(s,i),this.positionTextElement_(t,o),this.positionBorderRect_()}positionTextElement_(t,e){if(this.textElement_){var s,i=this.getConstants(),o=this.size_.height/2;this.textElement_.setAttribute("x",String(null!=(s=this.getSourceBlock())&&s.RTL?this.size_.width-e-t:t)),this.textElement_.setAttribute("y",String(i.FIELD_TEXT_BASELINE_CENTER?o:o-i.FIELD_TEXT_HEIGHT/2+i.FIELD_TEXT_BASELINE))}}positionBorderRect_(){this.borderRect_&&(this.borderRect_.setAttribute("width",String(this.size_.width)),this.borderRect_.setAttribute("height",String(this.size_.height)),this.borderRect_.setAttribute("rx",String(this.getConstants().FIELD_BORDER_RECT_RADIUS)),this.borderRect_.setAttribute("ry",String(this.getConstants().FIELD_BORDER_RECT_RADIUS)))}getSize(){return this.isVisible()?(this.isDirty_&&(this.render_(),this.isDirty_=!1),this.size_):new Ec(0,0)}getScaledBBox(){let t;var e=this.getSourceBlock();if(!e)throw new Hu;if(this.isFullBlockField()){var s=this.sourceBlock_.getHeightWidth();const i=e.workspace.scale;t=this.getAbsoluteXY_(),e=(s.width+1)*i,s=(s.height+1)*i,pa?(t.x+=1.5*i,t.y+=1.5*i):(t.x-=.5*i,t.y-=.5*i)}else s=this.borderRect_.getBoundingClientRect(),t=jt(this.borderRect_),e=s.width,s=s.height;return new mc(t.y,t.y+s,t.x,t.x+e)}onLocationChange(t){}getDisplayText_(){let t=this.getText();return t.length>this.maxDisplayLength&&(t=t.substring(0,this.maxDisplayLength-2)+"…"),t=t.replace(/\s/g,Uu.NBSP),this.sourceBlock_&&this.sourceBlock_.RTL&&(t+="‏"),t}getText(){const t=this.getText_();return String(null!==t?t:this.getValue())}getText_(){return null}markDirty(){this.isDirty_=!0,this.constants_=null}forceRerender(){this.isDirty_=!0,this.sourceBlock_&&this.sourceBlock_.rendered&&this.sourceBlock_.queueRender()}setValue(t,e=!0){if(null!==t){var s=Hl.getGroup$$module$build$src$core$events$utils();s||Hl.setGroup$$module$build$src$core$events$utils(!0);try{const s=this.doClassValidation_(t),a=this.processValidation(t,s,e);if(!(a instanceof Error)){var i,o=null==(i=this.getValidator())?void 0:i.call(this,a),n=this.processValidation(a,o,e);if(!(n instanceof Error)){var r=this.sourceBlock_;if(!r||!r.disposed){var l=this.getValue();l===n?this.doValueUpdate_(n):(this.doValueUpdate_(n),e&&r&&st()&&J(new(rt(ua.BLOCK_CHANGE))(r,"field",this.name||null,l,n)),this.isDirty_&&this.forceRerender())}}}}finally{Hl.setGroup$$module$build$src$core$events$utils(s)}}}processValidation(t,e,s){return null===e?(this.doValueInvalid_(t,s),this.isDirty_&&this.forceRerender(),Error()):void 0===e?t:e}getValue(){return this.value_}doClassValidation_(t){return t??null}doValueUpdate_(t){this.value_=t,this.isDirty_=!0}doValueInvalid_(t,e){}onMouseDown_(t){this.sourceBlock_&&!this.sourceBlock_.isDeadOrDying()&&(t=this.sourceBlock_.workspace.getGesture(t))&&t.setStartField(this)}setTooltip(t){t||""===t||(t=this.sourceBlock_);const e=this.getClickTarget_();e?e.tooltip=t:this.tooltip=t}getTooltip(){const t=this.getClickTarget_();return Oi(t||{tooltip:this.tooltip})}getClickTarget_(){return this.clickTarget_||this.getSvgRoot()}getAbsoluteXY_(){return jt(this.getClickTarget_())}referencesVariables(){return!1}refreshVariableName(){}getParentInput(){let t=null;const e=this.getSourceBlock();if(!e)throw new Hu;const s=e.inputList;for(let i=0;i{t.stopPropagation(),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this),d()}),T(this.textArea,"wheel",this,t=>{t.stopPropagation()},!1,{passive:!0}),T(this.textArea,"keydown",this,this.handleKeyDown)}getDom(){return this.foreignObject}getText(){return this.text}setText(t){this.textArea.value=t,this.onTextChange()}onTextChange(){const t=this.text;this.text=this.textArea.value;for(let e=this.textChangeListeners.length-1;e>=0;e--)this.textChangeListeners[e](t,this.text)}handleKeyDown(t){("Escape"===t.key||"Enter"===t.key&&(t.ctrlKey||t.metaKey))&&(this.onFinishEditing&&this.onFinishEditing(),t.stopPropagation())}addTextChangeListener(t){this.textChangeListeners.push(t)}removeTextChangeListener(t){this.textChangeListeners.splice(this.textChangeListeners.indexOf(t),1)}setPlaceholderText(t){this.textArea.placeholder=t}setEditable(t){t?this.textArea.removeAttribute("readonly"):this.textArea.setAttribute("readonly","true")}updateSize(t,e){this.foreignObject.setAttribute("height",""+(t.height-e.height)),this.foreignObject.setAttribute("width",`${t.width}`),this.foreignObject.setAttribute("y",`${e.height}`),this.workspace.RTL&&this.foreignObject.setAttribute("x",""+-t.width)}getFocusableElement(){return this.textArea}getFocusableTree(){return this.workspace}onNodeFocus(){const t=mc.from(this.foreignObject.getBoundingClientRect());this.workspace.scrollBoundsIntoView(mc.createFromPoint(oe(this.workspace,t.getOrigin()),t.getWidth(),t.getHeight()))}onNodeBlur(){}canBeFocused(){return!!this.id}};({COMMENT_EDITOR_FOCUS_IDENTIFIER:gd}).CommentEditor=_d;var Td="_delete_bar_button",md=class extends ud{constructor(t,e,s,i){super(t,e,s,i),this.id=t,this.workspace=e,this.container=s,this.commentView=i,this.icon=at(Tc.IMAGE,{class:"blocklyDeleteIcon",href:`${this.workspace.options.pathToMedia}delete-icon.svg`,id:`${this.id}${Td}`},s),this.bindId=T(this.icon,"pointerdown",this,this.performAction.bind(this))}dispose(){E(this.bindId)}reposition(){const t=this.getMargin();this.icon.setAttribute("x","0");const e=this.container.getBBox();this.icon.setAttribute("y",`${t}`),this.icon.setAttribute("x",""+(e.width-this.getSize(!0).getWidth()))}performAction(t){d(),t&&t instanceof PointerEvent&&f(t)?t.stopPropagation():(this.getCommentView().dispose(),null==t||t.stopPropagation(),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this.workspace))}};({COMMENT_DELETE_BAR_BUTTON_FOCUS_IDENTIFIER:Td}).DeleteCommentBarButton=md;var Ed=class{constructor(t,e){let s;this.workspace=t,this.commentId=e,this.collapsed=!1,this.editable=!0,this.location=new _c(0,0),this.sizeChangeListeners=[],this.disposeListeners=[],this.collapseChangeListeners=[],this.resizePointerMoveListener=this.resizePointerUpListener=null,this.disposed=this.disposing=!1,this.svgRoot=at(Tc.G,{class:"blocklyComment blocklyEditable blocklyDraggable"}),this.highlightRect=this.createHighlightRect(this.svgRoot),({topBarGroup:this.topBarGroup,topBarBackground:this.topBarBackground,deleteButton:this.deleteButton,foldoutButton:this.foldoutButton,textPreview:this.textPreview,textPreviewNode:this.textPreviewNode}=this.createTopBar(this.svgRoot)),this.commentEditor=this.createTextArea(),this.resizeHandle=this.createResizeHandle(this.svgRoot,t),null==(s=t.getLayerManager())||s.append(this,nd),this.size=Ed.defaultCommentSize,this.setSizeWithoutFiringEvents(this.size),this.moveTo(new _c(0,0))}createHighlightRect(t){return at(Tc.RECT,{class:"blocklyCommentHighlight"},t)}createTopBar(t){t=at(Tc.G,{class:"blocklyCommentTopbar"},t);const e=at(Tc.RECT,{class:"blocklyCommentTopbarBackground"},t),s=new md(this.commentId,this.workspace,t,this),i=new pd(this.commentId,this.workspace,t,this);this.addDisposeListener(()=>{s.dispose(),i.dispose()});const o=at(Tc.TEXT,{class:"blocklyCommentPreview blocklyCommentText blocklyText"},t),n=document.createTextNode("");return o.appendChild(n),{topBarGroup:t,topBarBackground:e,deleteButton:s,foldoutButton:i,textPreview:o,textPreviewNode:n}}createTextArea(){const t=new _d(this.workspace,this.commentId,()=>this.svgRoot.focus());return this.svgRoot.appendChild(t.getDom()),t.addTextChangeListener((t,e)=>{this.updateTextPreview(e),this.setSize(this.size)}),t}getEditorFocusableNode(){return this.commentEditor}createResizeHandle(t,e){return t=at(Tc.IMAGE,{class:"blocklyResizeHandle",href:`${e.options.pathToMedia}resize-handle.svg`},t),T(t,"pointerdown",this,this.onResizePointerDown),t}getSvgRoot(){return this.svgRoot}getSize(){return this.collapsed?this.topBarBackground.getBBox():this.size}setSizeWithoutFiringEvents(t){const e=this.topBarBackground.getBBox(),s=this.textPreview.getBBox(),i=this.resizeHandle.getBBox();this.size=t=Ec.max(t,this.calcMinSize(e)),this.svgRoot.setAttribute("height",`${t.height}`),this.svgRoot.setAttribute("width",`${t.width}`),this.updateHighlightRect(t),this.updateTopBarSize(t),this.commentEditor.updateSize(t,e),this.deleteButton.reposition(),this.foldoutButton.reposition(),this.updateTextPreviewSize(t,e,s),this.updateResizeHandlePosition(t,i)}setSize(t){const e=this.preResizeSize||this.size;this.setSizeWithoutFiringEvents(t),this.onSizeChange(e,this.size)}calcMinSize(t){var e;this.updateTextPreview(null!=(e=this.commentEditor.getText())?e:"");let s=e=Et(this.textPreview);return this.foldoutButton.isVisible()?s+=this.foldoutButton.getSize(!0).getWidth():e&&(s+=4),this.deleteButton.isVisible()?s+=this.deleteButton.getSize(!0).getWidth():e&&(s+=4),new Ec(s,t.height+20)}updateHighlightRect(t){this.highlightRect.setAttribute("height",`${t.height}`),this.highlightRect.setAttribute("width",`${t.width}`),this.workspace.RTL&&this.highlightRect.setAttribute("x",""+-t.width)}updateTopBarSize(t){this.topBarBackground.setAttribute("width",`${t.width}`)}updateTextPreviewSize(t,e,s){e=(e.height-s.height)/2;const i=this.foldoutButton.getSize(!0),o=this.deleteButton.getSize(!0);t=t.width-i.getWidth()-o.getWidth(),this.textPreview.setAttribute("x",""+(this.workspace.RTL?-1:1)*i.getWidth()),this.textPreview.setAttribute("y",`${e+s.height/2}`),this.textPreview.setAttribute("width",`${t}`)}updateResizeHandlePosition(t,e){this.resizeHandle.setAttribute("y",""+(t.height-e.height)),this.resizeHandle.setAttribute("x",""+(t.width-e.width))}onSizeChange(t,e){for(let s=this.sizeChangeListeners.length-1;s>=0;s--)this.sizeChangeListeners[s](t,e)}addSizeChangeListener(t){this.sizeChangeListeners.push(t)}removeSizeChangeListener(t){this.sizeChangeListeners.splice(this.sizeChangeListeners.indexOf(t),1)}onResizePointerDown(t){this.isEditable()&&(this.bringToFront(),f(t)||(this.preResizeSize=this.getSize(),vo(this.workspace,t,new _c(this.workspace.RTL?-this.getSize().width:this.getSize().width,this.getSize().height)),this.resizePointerUpListener=T(document,"pointerup",this,this.onResizePointerUp),this.resizePointerMoveListener=T(document,"pointermove",this,this.onResizePointerMove),this.workspace.hideChaff()),t.stopPropagation())}onResizePointerUp(t){d(),this.resizePointerUpListener&&(E(this.resizePointerUpListener),this.resizePointerUpListener=null),this.resizePointerMoveListener&&(E(this.resizePointerMoveListener),this.resizePointerMoveListener=null),this.setSize(this.size),this.preResizeSize=void 0}onResizePointerMove(t){t=No(this.workspace,t),this.setSizeWithoutFiringEvents(new Ec(this.workspace.RTL?-t.x:t.x,t.y))}isCollapsed(){return this.collapsed}setCollapsed(t){(this.collapsed=t)?ct(this.svgRoot,"blocklyCollapsed"):ut(this.svgRoot,"blocklyCollapsed"),this.setSizeWithoutFiringEvents(this.size),this.onCollapse()}onCollapse(){for(let t=this.collapseChangeListeners.length-1;t>=0;t--)this.collapseChangeListeners[t](this.collapsed)}addOnCollapseListener(t){this.collapseChangeListeners.push(t)}removeOnCollapseListener(t){this.collapseChangeListeners.splice(this.collapseChangeListeners.indexOf(t),1)}isEditable(){return this.editable}setEditable(t){(this.editable=t)?(ct(this.svgRoot,"blocklyEditable"),ut(this.svgRoot,"blocklyReadonly")):(ut(this.svgRoot,"blocklyEditable"),ct(this.svgRoot,"blocklyReadonly")),this.commentEditor.setEditable(t)}getRelativeToSurfaceXY(){return this.location}moveTo(t){this.location=t,this.svgRoot.setAttribute("transform",`translate(${t.x}, ${t.y})`)}getText(){return this.commentEditor.getText()}setText(t){this.commentEditor.setText(t)}setPlaceholderText(t){this.commentEditor.setPlaceholderText(t)}addTextChangeListener(t){this.commentEditor.addTextChangeListener(t)}removeTextChangeListener(t){this.commentEditor.removeTextChangeListener(t)}updateTextPreview(t){this.textPreviewNode.textContent=this.truncateText(t)}truncateText(t){return t.length>=12?`${t.substring(0,9)}...`:t}bringToFront(){const t=this.svgRoot.parentNode,e=t.childNodes;e[e.length-1]!==this.svgRoot&&t.appendChild(this.svgRoot)}onDeleteDown(t){d(),f(t)||this.dispose(),t.stopPropagation()}dispose(){this.disposing=!0,pt(this.svgRoot);for(let t=this.disposeListeners.length-1;t>=0;t--)this.disposeListeners[t]();this.disposeListeners.length=0,this.disposed=!0}isDisposed(){return this.disposed}isDeadOrDying(){return this.disposing||this.disposed}addDisposeListener(t){this.disposeListeners.push(t)}removeDisposeListener(t){this.disposeListeners.splice(this.disposeListeners.indexOf(t),1)}getCommentBarButtons(){return[this.foldoutButton,this.deleteButton]}};Ed.defaultCommentSize=new Ec(120,100),Vt("\n.injectionDiv {\n --commentFillColour: #FFFCC7;\n --commentBorderColour: #F2E49B;\n}\n\n.blocklyComment .blocklyTextarea {\n background-color: var(--commentFillColour);\n border: 1px solid var(--commentBorderColour);\n box-sizing: border-box;\n display: block;\n outline: 0;\n padding: 5px;\n resize: none;\n width: 100%;\n height: 100%;\n}\n\n.blocklyReadonly.blocklyComment .blocklyTextarea {\n cursor: inherit;\n}\n\n.blocklyDeleteIcon {\n width: 20px;\n height: 20px;\n display: none;\n cursor: pointer;\n}\n\n.blocklyFoldoutIcon {\n width: 20px;\n height: 20px;\n transform-origin: 12px 12px;\n cursor: pointer;\n}\n.blocklyResizeHandle {\n width: 12px;\n height: 12px;\n cursor: se-resize;\n}\n.blocklyReadonly.blocklyComment .blocklyResizeHandle {\n cursor: inherit;\n}\n\n.blocklyCommentTopbarBackground {\n fill: var(--commentBorderColour);\n height: 24px;\n}\n\n.blocklyComment .blocklyCommentPreview.blocklyText {\n fill: #000;\n dominant-baseline: middle;\n visibility: hidden;\n}\n\n.blocklyCollapsed.blocklyComment .blocklyCommentPreview {\n visibility: visible;\n}\n\n.blocklyCollapsed.blocklyComment .blocklyCommentForeignObject,\n.blocklyCollapsed.blocklyComment .blocklyResizeHandle {\n display: none;\n}\n\n.blocklyCollapsed.blocklyComment .blocklyFoldoutIcon {\n transform: rotate(-90deg);\n}\n\n.blocklyRTL .blocklyCommentTopbar {\n transform: scale(-1, 1);\n}\n\n.blocklyRTL .blocklyCommentForeignObject {\n direction: rtl;\n}\n\n.blocklyRTL .blocklyCommentPreview {\n /* Revert the scale and control RTL using direction instead. */\n transform: scale(-1, 1);\n direction: rtl;\n}\n\n.blocklyRTL .blocklyResizeHandle {\n transform: scale(-1, 1);\n cursor: sw-resize;\n}\n\n.blocklyCommentHighlight {\n fill: none;\n}\n\n.blocklyCommentText.blocklyActiveFocus {\n border-color: #fc3;\n border-width: 2px;\n}\n\n.blocklySelected .blocklyCommentHighlight {\n stroke: #fc3;\n stroke-width: 3px;\n}\n\n.blocklyCollapsed.blocklySelected .blocklyCommentHighlight {\n stroke: none;\n}\n\n.blocklyCollapsed.blocklySelected .blocklyCommentTopbarBackground {\n stroke: #fc3;\n stroke-width: 3px;\n}\n");var bd=class{constructor(t,e){this.workspace=t,this.text="",this.collapsed=!1,this.deletable=this.movable=this.editable=!0,this.location=new _c(0,0),this.disposing=this.disposed=!1,this.id=e&&!t.getCommentById(e)?e:S(),this.size=Ed.defaultCommentSize,t.addTopComment(this),this.fireCreateEvent()}fireCreateEvent(){st()&&J(new(rt(ua.COMMENT_CREATE))(this))}fireDeleteEvent(){st()&&J(new(rt(ua.COMMENT_DELETE))(this))}fireChangeEvent(t,e){st()&&J(new(rt(ua.COMMENT_CHANGE))(this,t,e))}fireCollapseEvent(t){st()&&J(new(rt(ua.COMMENT_COLLAPSE))(this,t))}setText(t){const e=this.text;this.text=t,this.fireChangeEvent(e,t)}getText(){return this.text}setSize(t){const e=new(rt(ua.COMMENT_RESIZE))(this);this.size=t,e.recordCurrentSizeAsNewSize(),J(e)}getSize(){return this.size}setCollapsed(t){this.collapsed=t,this.fireCollapseEvent(t)}isCollapsed(){return this.collapsed}setEditable(t){this.editable=t}isEditable(){return this.isOwnEditable()&&!this.workspace.isReadOnly()}isOwnEditable(){return this.editable}setMovable(t){this.movable=t}isMovable(){return this.isOwnMovable()&&!this.workspace.isReadOnly()&&!this.workspace.isFlyout}isOwnMovable(){return this.movable}setDeletable(t){this.deletable=t}isDeletable(){return this.isOwnDeletable()&&!this.isDeadOrDying()&&!this.workspace.isReadOnly()&&!this.workspace.isFlyout}isOwnDeletable(){return this.deletable}moveTo(t,e){const s=new(rt(ua.COMMENT_MOVE))(this);e&&s.setReason(e),this.location=t,s.recordNew(),J(s)}getRelativeToSurfaceXY(){return this.location}dispose(){this.disposing=!0,this.fireDeleteEvent(),this.workspace.removeTopComment(this),this.disposed=!0}isDisposed(){return this.disposed}isDeadOrDying(){return this.disposing||this.disposed}},fd=class extends bd{constructor(t,e){super(t,e),this.dragStrategy=new ad(this),this.workspace=t,this.view=new Ed(t,this.id),this.view.setSize(this.getSize()),this.view.setEditable(this.isEditable()),this.view.getSvgRoot().setAttribute("data-id",this.id),this.view.getSvgRoot().setAttribute("id",this.id),this.addModelUpdateBindings(),T(this.view.getSvgRoot(),"pointerdown",this,this.startGesture)}addModelUpdateBindings(){this.view.addTextChangeListener((t,e)=>{super.setText(e)}),this.view.addSizeChangeListener((t,e)=>{super.setSize(e)}),this.view.addOnCollapseListener(()=>{super.setCollapsed(this.view.isCollapsed())}),this.view.addDisposeListener(()=>{this.isDeadOrDying()||this.dispose()})}setText(t){this.view.setText(t)}setPlaceholderText(t){this.view.setPlaceholderText(t)}setSize(t){this.view.setSize(t)}setCollapsed(t){this.view.setCollapsed(t)}setEditable(t){super.setEditable(t),this.view.setEditable(this.isEditable())}getSvgRoot(){return this.view.getSvgRoot()}getSize(){return super.getSize()}getBoundingRectangle(){const t=this.getRelativeToSurfaceXY();var e,s;const i=null!=(s=null==(e=this.view)?void 0:e.getSize())?s:this.getSize();return this.workspace.RTL?(e=t.x-i.width,s=t.x):(e=t.x,s=t.x+i.width),new mc(t.y,t.y+i.height,e,s)}moveBy(t,e,s){const i=this.getRelativeToSurfaceXY();t=new _c(i.x+t,i.y+e),this.moveTo(t,s)}moveTo(t,e){super.moveTo(t,e),this.view.moveTo(t)}moveDuringDrag(t){this.location=t,this.view.moveTo(t)}setDragging(t){t?ct(this.getSvgRoot(),"blocklyDragging"):ut(this.getSvgRoot(),"blocklyDragging")}dispose(){this.disposing=!0;const t=Hl.getFocusManager$$module$build$src$core$focus_manager();t.getFocusedNode()===this&&setTimeout(()=>t.focusTree(this.workspace),0),this.view.isDeadOrDying()||this.view.dispose(),super.dispose()}startGesture(t){const e=this.workspace.getGesture(t);e&&(e.handleCommentStart(t,this),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this))}setDeleteStyle(t){t?ct(this.getSvgRoot(),"blocklyDraggingDelete"):ut(this.getSvgRoot(),"blocklyDraggingDelete")}isCopyable(){return this.isOwnMovable()&&this.isOwnDeletable()}isMovable(){return this.dragStrategy.isMovable()}startDrag(){this.dragStrategy.startDrag()}drag(t){this.dragStrategy.drag(t)}endDrag(){this.dragStrategy.endDrag()}revertDrag(){this.dragStrategy.revertDrag()}select(){ct(this.getSvgRoot(),"blocklySelected"),Lt(this)}unselect(){ut(this.getSvgRoot(),"blocklySelected"),Lt(null)}toCopyData(){return{paster:qc.TYPE,commentState:Se(this,{addCoordinates:!0,saveIds:!1})}}showContextMenu(t){const e=sd.registry.getContextMenuOptions({comment:this,focusedNode:this},t);let s;s=t instanceof PointerEvent?new _c(t.clientX,t.clientY):ne(this.workspace,this.getRelativeToSurfaceXY()).translate(10,10),$o(t,e,this.workspace.RTL,this.workspace,s)}snapToGrid(){if(!this.isDeadOrDying()){var t=this.workspace.getGrid();if(null!=t&&t.shouldSnap()){var e=this.getRelativeToSurfaceXY();(t=t.alignXY(e))!==e&&this.moveTo(t,["snap"])}}}getEditorFocusableNode(){return this.view.getEditorFocusableNode()}getFocusableElement(){return this.getSvgRoot()}getFocusableTree(){return this.workspace}onNodeFocus(){let t;this.select(),null==(t=this.getSvgRoot().parentElement)||t.appendChild(this.getSvgRoot()),this.workspace.scrollBoundsIntoView(this.getBoundingRectangle())}onNodeBlur(){this.unselect()}canBeFocused(){return!0}},$d={};$d.appendDomToWorkspace=Wo,$d.blockToDom=Bo,$d.blockToDomWithXY=Do,$d.clearWorkspaceAndLoadFromXml=Go,$d.deleteNext=on,$d.domToBlock=Hl.domToBlock$$module$build$src$core$xml,$d.domToBlockInternal=Xo,$d.domToPrettyText=Ho,$d.domToText=Uo,$d.domToVariables=zo,$d.domToWorkspace=Hl.domToWorkspace$$module$build$src$core$xml,$d.loadWorkspaceComment=Vo,$d.saveWorkspaceComment=Lo,$d.variablesToDom=Mo,$d.workspaceToDom=wo;var Id=class extends jh{constructor(t){super(t),this.type=ua.BLOCK_CREATE,t&&(t.isShadow()&&(this.recordUndo=!1),this.xml=Do(t),this.ids=ot(t),this.json=$s(t,{addCoordinates:!0}))}toJson(){const t=super.toJson();if(!this.xml)throw Error("The block XML is undefined. Either pass a block to the constructor, or call fromJson");if(!this.ids)throw Error("The block IDs are undefined. Either pass a block to the constructor, or call fromJson");if(!this.json)throw Error("The block JSON is undefined. Either pass a block to the constructor, or call fromJson");return t.xml=Uo(this.xml),t.ids=this.ids,t.json=this.json,this.recordUndo||(t.recordUndo=this.recordUndo),t}static fromJson(t,e,s){return(e=jh.fromJson(t,e,null!=s?s:new Id)).xml=Hl.textToDom$$module$build$src$core$utils$xml(t.xml),e.ids=t.ids,e.json=t.json,void 0!==t.recordUndo&&(e.recordUndo=t.recordUndo),e}run(t){const e=this.getEventWorkspace_();if(!this.json)throw Error("The block JSON is undefined. Either pass a block to the constructor, or call fromJson");if(!this.ids)throw Error("The block IDs are undefined. Either pass a block to the constructor, or call fromJson");if(!Cd(e,this.ids))if(t)vs(this.json,e);else for(t=0;tt.getBlockById(e)).filter(t=>t&&t.isShadow()).length===e.length};t(zl.EVENT,ua.BLOCK_CREATE,Id);var Sd=class extends oc{constructor(t,e){super(e),this.type=ua.THEME_CHANGE,this.themeName=t}toJson(){const t=super.toJson();if(!this.themeName)throw Error("The theme name is undefined. Either pass a theme name to the constructor, or call fromJson");return t.themeName=this.themeName,t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new Sd)).themeName=t.themeName,e}};t(zl.EVENT,ua.THEME_CHANGE,Sd);var Rd=class extends oc{constructor(t,e,s,i,o){super(i),this.type=ua.VIEWPORT_CHANGE,this.viewTop=t,this.viewLeft=e,this.scale=s,this.oldScale=o}toJson(){const t=super.toJson();if(void 0===this.viewTop)throw Error("The view top is undefined. Either pass a value to the constructor, or call fromJson");if(void 0===this.viewLeft)throw Error("The view left is undefined. Either pass a value to the constructor, or call fromJson");if(void 0===this.scale)throw Error("The scale is undefined. Either pass a value to the constructor, or call fromJson");if(void 0===this.oldScale)throw Error("The old scale is undefined. Either pass a value to the constructor, or call fromJson");return t.viewTop=this.viewTop,t.viewLeft=this.viewLeft,t.scale=this.scale,t.oldScale=this.oldScale,t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new Rd)).viewTop=t.viewTop,e.viewLeft=t.viewLeft,e.scale=t.scale,e.oldScale=t.oldScale,e}};t(zl.EVENT,ua.VIEWPORT_CHANGE,Rd);var yd={fromJsonInternal:an},Od={TEST_ONLY:yd};Od.fromJson=Hl.fromJson$$module$build$src$core$field_registry,Od.register=rn,Od.unregister=ln;var kd=class extends Uu{constructor(t,e,s){super(Uu.SKIP_SETUP),this.svgArrow=this.arrow=this.imageElement=this.menu_=this.selectedMenuItem=null,this.SERIALIZABLE=!0,this.clickTarget_=this.suffixField=this.prefixField=this.generatedOptions=null,t!==Uu.SKIP_SETUP&&(this.setOptions(t),s&&this.configure_(s),e&&this.setValidator(e))}fromXml(t){this.isOptionListDynamic()&&this.getOptions(!1),this.setValue(t.textContent)}loadState(t){this.loadLegacyState(kd,t)||(this.isOptionListDynamic()&&this.getOptions(!1),this.setValue(t))}initView(){this.shouldAddBorderRect_()?this.createBorderRect_():this.clickTarget_=this.sourceBlock_.getSvgRoot(),this.createTextElement_(),this.imageElement=at(Tc.IMAGE,{},this.fieldGroup_),this.getConstants().FIELD_DROPDOWN_SVG_ARROW?this.createSVGArrow_():this.createTextArrow_(),this.borderRect_&&ct(this.borderRect_,"blocklyDropdownRect"),this.fieldGroup_&&(ct(this.fieldGroup_,"blocklyField"),ct(this.fieldGroup_,"blocklyDropdownField"))}shouldAddBorderRect_(){let t;return!this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW||this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW&&!(null!=(t=this.getSourceBlock())&&t.isShadow())}createTextArrow_(){let t,e;this.arrow=at(Tc.TSPAN,{},this.textElement_),this.arrow.appendChild(document.createTextNode(null!=(t=this.getSourceBlock())&&t.RTL?kd.ARROW_CHAR+" ":" "+kd.ARROW_CHAR)),this.getConstants().FIELD_TEXT_BASELINE_CENTER&&this.arrow.setAttribute("dominant-baseline","central"),null!=(e=this.getSourceBlock())&&e.RTL?this.getTextElement().insertBefore(this.arrow,this.textContent_):this.getTextElement().appendChild(this.arrow)}createSVGArrow_(){this.svgArrow=at(Tc.IMAGE,{height:this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE+"px",width:this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE+"px"},this.fieldGroup_),this.svgArrow.setAttributeNS(Fa,"xlink:href",this.getConstants().FIELD_DROPDOWN_SVG_ARROW_DATAURI)}showEditor_(t){var e=this.getSourceBlock();if(!e)throw new Hu;this.dropdownCreate(),this.menu_&&(this.menu_.openingCoords=t&&"number"==typeof t.clientX?new _c(t.clientX,t.clientY):null,Zs(),t=this.menu_.render(qs()),ct(t,"blocklyDropdownMenu"),this.getConstants().FIELD_DROPDOWN_COLOURED_DIV&&(e=e.getColour(),t=this.sourceBlock_.getColourTertiary(),Qs(e,t)),ei(this,this.dropdownDispose_.bind(this)),qs().style.height=`${this.menu_.getSize().height}px`,this.menu_.focus(),this.selectedMenuItem&&this.menu_.setHighlighted(this.selectedMenuItem),this.applyColour())}dropdownCreate(){const t=this.getSourceBlock();if(!t)throw new Hu;const e=new oh;e.setRole(Zc.LISTBOX),this.menu_=e;const s=this.getOptions(!1);this.selectedMenuItem=null;for(let o=0;oe[1]===t)?t:(this.sourceBlock_&&console.warn("Cannot set the dropdown's value to an unavailable option. Block type: "+this.sourceBlock_.type+", Field name: "+this.name+", Value: "+t),null)}doValueUpdate_(t){super.doValueUpdate_(t),t=this.getOptions(!0);for(let e,s=0;e=t[s];s++)e[1]===this.value_&&(this.selectedOption=e)}applyColour(){const t=this.sourceBlock_;this.borderRect_&&(this.borderRect_.setAttribute("stroke",t.getColourTertiary()),this.menu_?this.borderRect_.setAttribute("fill",t.getColourTertiary()):this.borderRect_.setAttribute("fill","transparent")),t&&this.arrow&&(t.isShadow()?this.arrow.style.fill=t.getColourSecondary():this.arrow.style.fill=t.getColour())}render_(){this.getTextContent().nodeValue="",this.imageElement.style.display="none";const t=this.selectedOption&&this.selectedOption[0];cn(t)?this.renderSelectedImage(t):this.renderSelectedText(),this.positionBorderRect_()}renderSelectedImage(t){const e=this.getSourceBlock();if(!e)throw new Hu;this.imageElement.style.display="",this.imageElement.setAttributeNS(Fa,"xlink:href",t.src),this.imageElement.setAttribute("height",String(t.height)),this.imageElement.setAttribute("width",String(t.width));const s=Number(t.height);t=Number(t.width);var i=!!this.borderRect_;const o=Math.max(i?this.getConstants().FIELD_DROPDOWN_BORDER_RECT_HEIGHT:0,s+kd.IMAGE_Y_PADDING);let n;i=i?this.getConstants().FIELD_BORDER_RECT_X_PADDING:0,n=this.svgArrow?this.positionSVGArrow(t+i,o/2-this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE/2):Et(this.arrow),this.size_=new Ec(t+n+2*i,o);let r=0;e.RTL?this.imageElement.setAttribute("x",`${i+n}`):(r=t+n,this.getTextElement().setAttribute("text-anchor","end"),this.imageElement.setAttribute("x",`${i}`)),this.imageElement.setAttribute("y",String(o/2-s/2)),this.positionTextElement_(r+i,t+n)}renderSelectedText(){this.getTextContent().nodeValue=this.getDisplayText_();var t=this.getTextElement();ct(t,"blocklyDropdownText"),t.setAttribute("text-anchor","start");var e=!!this.borderRect_;t=Math.max(e?this.getConstants().FIELD_DROPDOWN_BORDER_RECT_HEIGHT:0,this.getConstants().FIELD_TEXT_HEIGHT);const s=Et(this.getTextElement());e=e?this.getConstants().FIELD_BORDER_RECT_X_PADDING:0;let i=0;this.svgArrow&&(i=this.positionSVGArrow(s+e,t/2-this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE/2)),this.size_=new Ec(s+i+2*e,t),this.positionTextElement_(e,s)}positionSVGArrow(t,e){if(!this.svgArrow)return 0;const s=this.getSourceBlock();if(!s)throw new Hu;const i=this.borderRect_?this.getConstants().FIELD_BORDER_RECT_X_PADDING:0,o=this.getConstants().FIELD_DROPDOWN_SVG_ARROW_PADDING,n=this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE;return this.svgArrow.setAttribute("transform","translate("+(s.RTL?i:t+o)+","+e+")"),n+o}getText_(){if(!this.selectedOption)return null;const t=this.selectedOption[0];if(cn(t))return t.alt;if("undefined"!=typeof HTMLElement&&t instanceof HTMLElement){let e,s;return null!=(s=null!=(e=t.title)?e:t.ariaLabel)?s:t.innerText}return"string"==typeof t?t:(console.warn("Can't get text for existing dropdown option. If you're using HTMLElement dropdown options in node, ensure you're using jsdom-global or similar."),null)}static fromJson(t){if(!t.options)throw Error("options are required for the dropdown field. The options property must be assigned an array of [humanReadableValue, languageNeutralValue] tuples.");return new this(t.options,void 0,t)}trimOptions(t){let e=!1;const s=t.map(t=>{if(t===kd.SEPARATOR)return e=!0,t;const[s,i]=t;return"string"==typeof s?[eo(s),i]:(e=!0,[cn(s)?Object.assign({},s,{alt:eo(s.alt)}):s,i])});if(e||t.length<2)return{options:s};var i=s.map(([t])=>t),o=Ti(i);t=mi(i,o);const n=Ei(i,o);return!t&&!n||o<=t+n?{options:s}:(o=t?i[0].substring(0,t-1):void 0,i=n?i[0].substr(1-n):void 0,{options:this.applyTrim(s,t,n),prefix:o,suffix:i})}applyTrim(t,e,s){return t.map(([t,i])=>[t.substring(e,t.length-s),i])}validateOptions(t){if(!Array.isArray(t))throw TypeError("FieldDropdown options must be an array.");if(!t.length)throw TypeError("FieldDropdown options must not be an empty array.");let e=!1;for(let s=0;s0&&!!t.snap,e}static parseThemeOptions(t){return"string"==typeof(t=t.theme||Nd)?l(zl.THEME,t):t instanceof vd?t:vd.defineTheme(t.name||"builtin"+C(),t)}},Ld=class{constructor(t,e){this.bubble=t,this.workspace=e,this.startLoc=null}isMovable(){return!0}startDrag(){let t;this.startLoc=this.bubble.getRelativeToSurfaceXY(),this.workspace.setResizesEnabled(!1),null==(t=this.workspace.getLayerManager())||t.moveToDragLayer(this.bubble),this.bubble.setDragging&&this.bubble.setDragging(!0)}drag(t){this.bubble.moveDuringDrag(t)}endDrag(){let t;this.workspace.setResizesEnabled(!0),null==(t=this.workspace.getLayerManager())||t.moveOffDragLayer(this.bubble,rd),this.bubble.setDragging(!1)}revertDrag(){this.startLoc&&this.bubble.moveDuringDrag(this.startLoc)}},Md=class{constructor(t,e,s,i,o){this.workspace=t,this.anchor=e,this.ownerRect=s,this.owner=o,this.size=new Ec(0,0),this.colour="#ffffff",this.disposed=!1,this.relativeLeft=this.relativeTop=0,this.dragStrategy=new Ld(this,this.workspace),this.id=C(),this.svgRoot=at(Tc.G,{class:"blocklyBubble"},t.getBubbleCanvas()),t=at(Tc.G,{class:"blocklyEmboss"},this.svgRoot),this.tail=at(Tc.PATH,{class:"blocklyBubbleTail"},t),this.background=at(Tc.RECT,{class:"blocklyDraggable",x:0,y:0,rx:Ad.BORDER_WIDTH,ry:Ad.BORDER_WIDTH},t),this.contentContainer=at(Tc.G,{},this.svgRoot),this.focusableElement=null!=i?i:this.svgRoot,this.focusableElement.setAttribute("id",this.id),T(this.background,"pointerdown",this,this.onMouseDown),T(this.focusableElement,"keydown",this,this.onKeyDown)}dispose(){pt(this.svgRoot),this.disposed=!0}setAnchorLocation(t,e=!1){this.anchor=t,e?this.positionByRect(this.ownerRect):this.positionRelativeToAnchor(),this.renderTail()}setPositionRelativeToAnchor(t,e){this.relativeLeft=t,this.relativeTop=e,this.positionRelativeToAnchor(),this.renderTail()}getSize(){return this.size}setSize(t,e=!1){t.width=Math.max(t.width,Ad.MIN_SIZE),t.height=Math.max(t.height,Ad.MIN_SIZE),this.size=t,this.background.setAttribute("width",`${t.width}`),this.background.setAttribute("height",`${t.height}`),e?this.positionByRect(this.ownerRect):this.positionRelativeToAnchor(),this.renderTail()}getColour(){return this.colour}setColour(t){this.colour=t,this.tail.setAttribute("fill",t),this.background.setAttribute("fill",t)}onMouseDown(t){let e;null==(e=this.workspace.getGesture(t))||e.handleBubbleStart(t,this),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this)}onKeyDown(t){"Escape"===t.key&&this.owner&&(this.owner.setBubbleVisible(!1),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this.owner))}positionRelativeToAnchor(){let t=this.anchor.x;t=this.workspace.RTL?t-(this.relativeLeft+this.size.width):t+this.relativeLeft,this.moveTo(t,this.relativeTop+this.anchor.y)}moveTo(t,e){this.svgRoot.setAttribute("transform",`translate(${t}, ${e})`)}positionByRect(t=new mc(0,0,0,0)){var e=this.workspace.getMetricsManager().getViewMetrics(!0),s=this.getOptimalRelativeLeft(e),i=this.getOptimalRelativeTop(e);const o={x:s,y:-this.size.height-this.workspace.getRenderer().getConstants().MIN_BLOCK_HEIGHT},n={x:-this.size.width-30,y:i};i={x:t.getWidth(),y:i};var r={x:s,y:t.getHeight()};s=t.getWidth()t.width)return e;if(t=this.getWorkspaceViewRect(t),this.workspace.RTL){var s=this.anchor.x-e;s-this.size.widtht.right&&(e=-(t.right-this.anchor.x))}else{const i=(s=e+this.anchor.x)+this.size.width;st.right&&(e=t.right-this.anchor.x-this.size.width)}return e}getOptimalRelativeTop(t){let e=-this.size.height/4;if(this.size.height>t.height)return e;const s=this.anchor.y+e,i=s+this.size.height;return s<(t=this.getWorkspaceViewRect(t)).top?e=t.top-this.anchor.y:i>t.bottom&&(e=t.bottom-this.anchor.y-this.size.height),e}getWorkspaceViewRect(t){const e=t.top;let s=t.top+t.height,i=t.left;return t=t.left+t.width,s-=this.getScrollbarThickness(),this.workspace.RTL?i-=this.getScrollbarThickness():t-=this.getScrollbarThickness(),new mc(e,s,i,t)}getScrollbarThickness(){return Sc.scrollbarThickness/this.workspace.scale}renderTail(){const t=[];var e=this.size.width/2,s=this.size.height/2,i=-this.relativeLeft,o=-this.relativeTop;if(e===i&&s===o)t.push("M "+e+","+s);else{o-=s,i-=e,this.workspace.RTL&&(i*=-1);var n=Math.sqrt(o*o+i*i),r=Math.acos(i/n);o<0&&(r=2*Math.PI-r);var l=r+Math.PI/2;l>2*Math.PI&&(l-=2*Math.PI);var a=Math.sin(l);const c=Math.cos(l);let h=(this.size.width+this.size.height)/Ad.TAIL_THICKNESS;h=Math.min(h,this.size.width,this.size.height)/4,i=e+(l=1-Ad.ANCHOR_RADIUS/n)*i,o=s+l*o,l=e+h*c;const u=s+h*a;e-=h*c,s-=h*a,(a=r+(a=Xs(this.workspace.RTL?-Ad.TAIL_ANGLE:Ad.TAIL_ANGLE)))>2*Math.PI&&(a-=2*Math.PI),r=Math.sin(a)*n/Ad.TAIL_BEND,n=Math.cos(a)*n/Ad.TAIL_BEND,t.push("M"+l+","+u),t.push("C"+(l+n)+","+(u+r)+" "+i+","+o+" "+i+","+o),t.push("C"+i+","+o+" "+(e+n)+","+(s+r)+" "+e+","+s)}let c;t.push("z"),null==(c=this.tail)||c.setAttribute("d",t.join(" "))}bringToFront(){let t;const e=null==(t=this.svgRoot)?void 0:t.parentNode;return!(!this.svgRoot||(null==e?void 0:e.lastChild)===this.svgRoot||(null==e||e.appendChild(this.svgRoot),0))}getRelativeToSurfaceXY(){return new _c(this.workspace.RTL?-this.relativeLeft+this.anchor.x-this.size.width:this.anchor.x+this.relativeLeft,this.anchor.y+this.relativeTop)}getSvgRoot(){return this.svgRoot}moveDuringDrag(t){this.moveTo(t.x,t.y),this.relativeLeft=this.workspace.RTL?this.anchor.x-t.x-this.size.width:t.x-this.anchor.x,this.relativeTop=t.y-this.anchor.y,this.renderTail()}setDragging(t){}setDeleteStyle(t){}isDeletable(){return!1}showContextMenu(t){}isMovable(){return!0}startDrag(){this.dragStrategy.startDrag()}drag(t){this.dragStrategy.drag(t)}endDrag(){this.dragStrategy.endDrag()}revertDrag(){this.dragStrategy.revertDrag()}select(){Lt(this)}unselect(){Lt(null)}getFocusableElement(){return this.focusableElement}getFocusableTree(){return this.workspace}onNodeFocus(){this.select(),this.bringToFront();var t=this.getRelativeToSurfaceXY();const e=this.getSize();t=new mc(t.y,t.y+e.height,t.x,t.x+e.width),this.workspace.scrollBoundsIntoView(t)}onNodeBlur(){this.unselect()}canBeFocused(){return!0}getOwner(){return this.owner}};Ad=Md,Md.BORDER_WIDTH=6,Md.DOUBLE_BORDER=2*Ad.BORDER_WIDTH,Md.MIN_SIZE=Ad.DOUBLE_BORDER,Md.TAIL_THICKNESS=1,Md.TAIL_ANGLE=20,Md.TAIL_BEND=4,Md.ANCHOR_RADIUS=8;var Dd=class extends Md{constructor(t,e,s,i){let o,n;super(e,s,i),this.workspace=e,this.anchor=s,this.ownerRect=i,this.autoLayout=!0,e=new wd(t),this.validateWorkspaceOptions(e),this.svgDialog=at(Tc.SVG,{x:Md.BORDER_WIDTH,y:Md.BORDER_WIDTH},this.contentContainer),t.parentWorkspace=this.workspace,this.miniWorkspace=this.newWorkspaceSvg(new wd(t)),this.miniWorkspace.internalIsMutator=!0,t=this.miniWorkspace.createDom("blocklyMutatorBackground"),this.svgDialog.appendChild(t),e.languageTree&&(t.insertBefore(this.miniWorkspace.addFlyout(Tc.G),this.miniWorkspace.getCanvas()),null==(t=this.miniWorkspace.getFlyout())||t.init(this.miniWorkspace),null==t||t.show(e.languageTree)),ct(this.svgRoot,"blocklyMiniWorkspaceBubble"),this.miniWorkspace.addChangeListener(this.onWorkspaceChange.bind(this)),null==(o=this.miniWorkspace.getFlyout())||null==(n=o.getWorkspace())||n.addChangeListener(this.onWorkspaceChange.bind(this)),this.updateBubbleSize()}dispose(){this.miniWorkspace.dispose(),super.dispose()}getWorkspace(){return this.miniWorkspace}addWorkspaceChangeListener(t){this.miniWorkspace.addChangeListener(t)}validateWorkspaceOptions(t){if(t.hasCategories)throw Error("The miniworkspace bubble does not support toolboxes with categories");if(t.hasTrashcan)throw Error("The miniworkspace bubble does not support trashcans");if(t.zoomOptions.controls||t.zoomOptions.wheel||t.zoomOptions.pinch)throw Error("The miniworkspace bubble does not support zooming");if(t.moveOptions.scrollbars||t.moveOptions.wheel||t.moveOptions.drag)throw Error("The miniworkspace bubble does not scrolling/moving the workspace");if(t.horizontalLayout)throw Error("The miniworkspace bubble does not support horizontal layouts")}onWorkspaceChange(){this.bumpBlocksIntoBounds(),this.updateBubbleSize()}bumpBlocksIntoBounds(){if(!this.miniWorkspace.isDragging()||this.miniWorkspace.keyboardMoveInProgress)for(const t of this.miniWorkspace.getTopBlocks(!1)){const e=t.getRelativeToSurfaceXY();if(e.y<20&&t.moveBy(0,20-e.y),t.RTL){let s=-20;const i=this.miniWorkspace.getFlyout();i&&(s-=i.getWidth()),e.x>s&&t.moveBy(s-e.x,0)}else e.x<20&&t.moveBy(20-e.x,0)}}updateBubbleSize(){if(!this.miniWorkspace.isDragging()||this.miniWorkspace.keyboardMoveInProgress){this.autoLayout&&(this.autoLayout=!this.miniWorkspace.keyboardMoveInProgress);var t=this.getSize(),e=this.calculateWorkspaceSize();Math.abs(t.width-e.width)({kind:"block",type:t}))}),e}getAnchorLocation(){return _c.sum(this.workspaceLocation,new _c(8.5,8.5))}getBubbleOwnerRect(){const t=this.sourceBlock.getSvgRoot().getBBox();return new mc(t.y,t.y+t.height,t.x,t.x+t.width)}createRootBlock(){if(!this.sourceBlock.decompose)throw Error("Blocks with mutator icons must include a decompose method");for(var t of(this.rootBlock=this.sourceBlock.decompose(this.miniWorkspaceBubble.getWorkspace()),this.rootBlock.getDescendants(!1)))t.queueRender();let e,s,i,o;this.rootBlock.setMovable(!1),this.rootBlock.setDeletable(!1),t=null!=(o=null==(e=this.miniWorkspaceBubble)||null==(s=e.getWorkspace())||null==(i=s.getFlyout())?void 0:i.getWidth())?o:0,this.rootBlock.moveBy(this.rootBlock.RTL?-(t+16):16,16)}addSaveConnectionsListener(){this.sourceBlock.saveConnections&&this.rootBlock&&(this.saveConnectionsListener=()=>{this.sourceBlock.saveConnections&&this.rootBlock&&this.sourceBlock.saveConnections(this.rootBlock)},this.saveConnectionsListener(),this.sourceBlock.workspace.addChangeListener(this.saveConnectionsListener))}createMiniWorkspaceChangeListener(){return t=>{Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon.isIgnorableMutatorEvent(t)||this.updateWorkspacePid||(this.updateWorkspacePid=setTimeout(()=>{this.updateWorkspacePid=null,this.recomposeSourceBlock()},0))}}static isIgnorableMutatorEvent(t){return t.isUiEvent||R(t)||O(t)&&"disabled"===t.element}recomposeSourceBlock(){if(this.rootBlock){if(!this.sourceBlock.compose)throw Error("Blocks with mutator icons must include a compose method");var t=Hl.getGroup$$module$build$src$core$events$utils();t||Hl.setGroup$$module$build$src$core$events$utils(!0);var e=Jh.getExtraBlockState_(this.sourceBlock);this.sourceBlock.compose(this.rootBlock);var s=Jh.getExtraBlockState_(this.sourceBlock);e!==s&&J(new(rt(ua.BLOCK_CHANGE))(this.sourceBlock,"mutation",null,e,s)),Hl.setGroup$$module$build$src$core$events$utils(t)}}getWorkspace(){let t;return null==(t=this.miniWorkspaceBubble)?void 0:t.getWorkspace()}},Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon.TYPE=Kh.MUTATOR,Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon.WEIGHT=1,Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon;var Pd=Object.create(null),Bd={allExtensions:Pd};Hl.register$$module$build$src$core$extensions("parent_tooltip_when_inline",Cn);var Fd,Ud={TEST_ONLY:Bd};Ud.apply=dn,Ud.buildTooltipForDropdown=Hl.buildTooltipForDropdown$$module$build$src$core$extensions,Ud.buildTooltipWithFieldText=Hl.buildTooltipWithFieldText$$module$build$src$core$extensions,Ud.isRegistered=un,Ud.register=Hl.register$$module$build$src$core$extensions,Ud.registerMixin=Hl.registerMixin$$module$build$src$core$extensions,Ud.registerMutator=Hl.registerMutator$$module$build$src$core$extensions,Ud.runAfterPageLoad=$n,Ud.unregister=hn,function(t){t[t.WIN_KEY_FF_LINUX=0]="WIN_KEY_FF_LINUX",t[t.MAC_ENTER=3]="MAC_ENTER",t[t.BACKSPACE=8]="BACKSPACE",t[t.TAB=9]="TAB",t[t.NUM_CENTER=12]="NUM_CENTER",t[t.ENTER=13]="ENTER",t[t.SHIFT=16]="SHIFT",t[t.CTRL=17]="CTRL",t[t.ALT=18]="ALT",t[t.PAUSE=19]="PAUSE",t[t.CAPS_LOCK=20]="CAPS_LOCK",t[t.ESC=27]="ESC",t[t.SPACE=32]="SPACE",t[t.PAGE_UP=33]="PAGE_UP",t[t.PAGE_DOWN=34]="PAGE_DOWN",t[t.END=35]="END",t[t.HOME=36]="HOME",t[t.LEFT=37]="LEFT",t[t.UP=38]="UP",t[t.RIGHT=39]="RIGHT",t[t.DOWN=40]="DOWN",t[t.PLUS_SIGN=43]="PLUS_SIGN",t[t.PRINT_SCREEN=44]="PRINT_SCREEN",t[t.INSERT=45]="INSERT",t[t.DELETE=46]="DELETE",t[t.ZERO=48]="ZERO",t[t.ONE=49]="ONE",t[t.TWO=50]="TWO",t[t.THREE=51]="THREE",t[t.FOUR=52]="FOUR",t[t.FIVE=53]="FIVE",t[t.SIX=54]="SIX",t[t.SEVEN=55]="SEVEN",t[t.EIGHT=56]="EIGHT",t[t.NINE=57]="NINE",t[t.FF_SEMICOLON=59]="FF_SEMICOLON",t[t.FF_EQUALS=61]="FF_EQUALS",t[t.FF_DASH=173]="FF_DASH",t[t.FF_HASH=163]="FF_HASH",t[t.QUESTION_MARK=63]="QUESTION_MARK",t[t.AT_SIGN=64]="AT_SIGN",t[t.A=65]="A",t[t.B=66]="B",t[t.C=67]="C",t[t.D=68]="D",t[t.E=69]="E",t[t.F=70]="F",t[t.G=71]="G",t[t.H=72]="H",t[t.I=73]="I",t[t.J=74]="J",t[t.K=75]="K",t[t.L=76]="L",t[t.M=77]="M",t[t.N=78]="N",t[t.O=79]="O",t[t.P=80]="P",t[t.Q=81]="Q",t[t.R=82]="R",t[t.S=83]="S",t[t.T=84]="T",t[t.U=85]="U",t[t.V=86]="V",t[t.W=87]="W",t[t.X=88]="X",t[t.Y=89]="Y",t[t.Z=90]="Z",t[t.META=91]="META",t[t.WIN_KEY_RIGHT=92]="WIN_KEY_RIGHT",t[t.CONTEXT_MENU=93]="CONTEXT_MENU",t[t.NUM_ZERO=96]="NUM_ZERO",t[t.NUM_ONE=97]="NUM_ONE",t[t.NUM_TWO=98]="NUM_TWO",t[t.NUM_THREE=99]="NUM_THREE",t[t.NUM_FOUR=100]="NUM_FOUR",t[t.NUM_FIVE=101]="NUM_FIVE",t[t.NUM_SIX=102]="NUM_SIX",t[t.NUM_SEVEN=103]="NUM_SEVEN",t[t.NUM_EIGHT=104]="NUM_EIGHT",t[t.NUM_NINE=105]="NUM_NINE",t[t.NUM_MULTIPLY=106]="NUM_MULTIPLY",t[t.NUM_PLUS=107]="NUM_PLUS",t[t.NUM_MINUS=109]="NUM_MINUS",t[t.NUM_PERIOD=110]="NUM_PERIOD",t[t.NUM_DIVISION=111]="NUM_DIVISION",t[t.F1=112]="F1",t[t.F2=113]="F2",t[t.F3=114]="F3",t[t.F4=115]="F4",t[t.F5=116]="F5",t[t.F6=117]="F6",t[t.F7=118]="F7",t[t.F8=119]="F8",t[t.F9=120]="F9",t[t.F10=121]="F10",t[t.F11=122]="F11",t[t.F12=123]="F12",t[t.NUMLOCK=144]="NUMLOCK",t[t.SCROLL_LOCK=145]="SCROLL_LOCK",t[t.FIRST_MEDIA_KEY=166]="FIRST_MEDIA_KEY",t[t.LAST_MEDIA_KEY=183]="LAST_MEDIA_KEY",t[t.SEMICOLON=186]="SEMICOLON",t[t.DASH=189]="DASH",t[t.EQUALS=187]="EQUALS",t[t.COMMA=188]="COMMA",t[t.PERIOD=190]="PERIOD",t[t.SLASH=191]="SLASH",t[t.APOSTROPHE=192]="APOSTROPHE",t[t.TILDE=192]="TILDE",t[t.SINGLE_QUOTE=222]="SINGLE_QUOTE",t[t.OPEN_SQUARE_BRACKET=219]="OPEN_SQUARE_BRACKET",t[t.BACKSLASH=220]="BACKSLASH",t[t.CLOSE_SQUARE_BRACKET=221]="CLOSE_SQUARE_BRACKET",t[t.WIN_KEY=224]="WIN_KEY",t[t.MAC_FF_META=224]="MAC_FF_META",t[t.MAC_WK_CMD_LEFT=91]="MAC_WK_CMD_LEFT",t[t.MAC_WK_CMD_RIGHT=93]="MAC_WK_CMD_RIGHT",t[t.WIN_IME=229]="WIN_IME",t[t.VK_NONAME=252]="VK_NONAME",t[t.PHANTOM=255]="PHANTOM",t[t.CTRL_CMD=ma||Ta||_a?t.MAC_WK_CMD_LEFT:t.CTRL]="CTRL_CMD"}(Fd||(Fd={}));var Hd={};Hd.arc=Nn,Hd.curve=Rn,Hd.line=An,Hd.lineOnAxis=vn,Hd.lineTo=kn,Hd.moveBy=On,Hd.moveTo=yn,Hd.point=Sn;var Gd={};Gd.Coordinate=_c,Gd.KeyCodes=Fd,Gd.Rect=mc,Gd.Size=Ec,Gd.Svg=Tc,Gd.aria=sh,Gd.array=lc,Gd.browserEvents=Ia,Gd.colour=Bu,Gd.deprecation=Mh,Gd.dom=Va,Gd.extensions=Ud,Gd.idGenerator=Oa,Gd.math=qh,Gd.object=Ka,Gd.parsing=Fu,Gd.string=mu,Gd.style=fc,Gd.svgMath=Cc,Gd.svgPaths=Hd,Gd.toolbox=Uc,Gd.userAgent=ba,Gd.xml=wc;var Vd,Wd=class extends Md{constructor(t,e,s,i){super(t,e,s,void 0,i),this.workspace=t,this.anchor=e,this.ownerRect=s,this.owner=i,this.resizePointerMoveListener=this.resizePointerUpListener=null,this.sizeChangeListeners=[],this.locationChangeListeners=[],this.DEFAULT_SIZE=new Ec(160+Md.DOUBLE_BORDER,80+Md.DOUBLE_BORDER),this.MIN_SIZE=new Ec(45+Md.DOUBLE_BORDER,20+Md.DOUBLE_BORDER),this.editable=!0,ct(this.svgRoot,"blocklyTextInputBubble"),this.editor=new _d(t,this.id,()=>{Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this)}),this.contentContainer.appendChild(this.editor.getDom()),this.resizeGroup=this.createResizeHandle(this.svgRoot,t),this.setSize(this.DEFAULT_SIZE,!0)}getText(){return this.editor.getText()}setText(t){this.editor.setText(t)}setEditable(t){this.editable=t,this.editor.setEditable(t)}isEditable(){return this.editable}addTextChangeListener(t){this.editor.addTextChangeListener(t)}addSizeChangeListener(t){this.sizeChangeListeners.push(t)}addLocationChangeListener(t){this.locationChangeListeners.push(t)}createResizeHandle(t,e){return t=at(Tc.IMAGE,{class:"blocklyResizeHandle",href:`${e.options.pathToMedia}resize-handle.svg`},t),T(t,"pointerdown",this,this.onResizePointerDown),t}setSize(t,e=!1){t.width=Math.max(t.width,this.MIN_SIZE.width),t.height=Math.max(t.height,this.MIN_SIZE.height);const s=t.width-Md.DOUBLE_BORDER,i=t.height-Md.DOUBLE_BORDER;this.editor.updateSize(new Ec(s,i),new Ec(0,0)),this.editor.getDom().setAttribute("x",""+Md.DOUBLE_BORDER/2),this.editor.getDom().setAttribute("y",""+Md.DOUBLE_BORDER/2),this.resizeGroup.setAttribute("y",`${i}`),this.workspace.RTL?this.resizeGroup.setAttribute("x",""+-Md.DOUBLE_BORDER):this.resizeGroup.setAttribute("x",`${s}`),super.setSize(t,e),this.onSizeChange()}getSize(){return super.getSize()}moveDuringDrag(t){super.moveDuringDrag(t),this.onLocationChange()}setPositionRelativeToAnchor(t,e){super.setPositionRelativeToAnchor(t,e),this.onLocationChange()}positionByRect(t=new mc(0,0,0,0)){super.positionByRect(t),this.onLocationChange()}onResizePointerDown(t){this.bringToFront(),f(t)||(vo(this.workspace,t,new _c(this.workspace.RTL?-this.getSize().width:this.getSize().width,this.getSize().height)),this.resizePointerUpListener=T(document,"pointerup",this,this.onResizePointerUp),this.resizePointerMoveListener=T(document,"pointermove",this,this.onResizePointerMove),this.workspace.hideChaff()),t.stopPropagation()}onResizePointerUp(t){d(),this.resizePointerUpListener&&(E(this.resizePointerUpListener),this.resizePointerUpListener=null),this.resizePointerMoveListener&&(E(this.resizePointerMoveListener),this.resizePointerMoveListener=null)}onResizePointerMove(t){t=No(this.workspace,t),this.setSize(new Ec(this.workspace.RTL?-t.x:t.x,t.y),!1),this.onSizeChange()}onSizeChange(){for(const t of this.sizeChangeListeners)t()}onLocationChange(){for(const t of this.locationChangeListeners)t()}getEditor(){return this.editor}};Vt("\n.blocklyTextInputBubble .blocklyTextarea {\n background-color: var(--commentFillColour);\n border: 0;\n box-sizing: border-box;\n display: block;\n outline: 0;\n padding: 5px;\n resize: none;\n width: 100%;\n height: 100%;\n}\n"),function(t){t[t.INPUT_VALUE=1]="INPUT_VALUE",t[t.OUTPUT_VALUE=2]="OUTPUT_VALUE",t[t.NEXT_STATEMENT=3]="NEXT_STATEMENT",t[t.PREVIOUS_STATEMENT=4]="PREVIOUS_STATEMENT"}(Vd||(Vd={}));var Xd=class{constructor(t){this.connectionChecker=t,this.connections=[]}addConnection(t,e){e=this.calculateIndexForYPos(e),this.connections.splice(e,0,t)}findIndexOfConnection(t,e){if(!this.connections.length)return-1;const s=this.calculateIndexForYPos(e);if(s>=this.connections.length)return-1;e=t.y;let i=s;for(;i>=0&&this.connections[i].y===e;){if(this.connections[i]===t)return i;i--}for(i=s;it)){e=i;break}s=i}}return e}removeConnection(t,e){if(-1===(t=this.findIndexOfConnection(t,e)))throw Error("Unable to find connection in connectionDB.");this.connections.splice(t,1)}getNeighbours(t,e){function s(t){const s=o-i[t].x,r=n-i[t].y;return Math.sqrt(s*s+r*r)<=e&&a.push(i[t]),r=0&&s(t);)t--;do{r++}while(r=0&&this.isInYRange(a,t.y,e);)r=this.connections[a],this.connectionChecker.canConnect(t,r,!0,l)&&(s=r,l=r.distanceFrom(t)),a--;for(;nthis.fieldRow.length)throw Error("index "+t+" out of bounds.");return e||""===e&&s?("string"==typeof e&&(e=Hl.fromJson$$module$build$src$core$field_registry({type:"field_label",text:e})),e.setSourceBlock(this.sourceBlock),this.sourceBlock.initialized&&this.initField(e),e.name=s,e.setVisible(this.isVisible()),e.prefixField&&(t=this.insertFieldAt(t,e.prefixField)),this.fieldRow.splice(t,0,e),t++,e.suffixField&&(t=this.insertFieldAt(t,e.suffixField)),this.sourceBlock.rendered&&this.sourceBlock.queueRender(),t):t}removeField(t,e){for(let e,s=0;e=this.fieldRow[s];s++)if(e.name===t)return e.dispose(),this.fieldRow.splice(s,1),this.sourceBlock.rendered&&this.sourceBlock.queueRender(),!0;if(e)return!1;throw Error('Field "'+t+'" not found.')}isVisible(){return this.visible}setVisible(t){let e=[];if(this.visible===t)return e;this.visible=t;for(let e,s=0;e=this.fieldRow[s];s++)e.setVisible(t);if(this.connection&&this.connection instanceof ep){t?e=this.connection.startTrackingAll():this.connection.stopTrackingAll();const s=this.connection.targetBlock();s&&(s.getSvgRoot().style.display=t?"block":"none")}return e}markDirty(){for(let t,e=0;t=this.fieldRow[e];e++)t.markDirty()}setCheck(t){if(!this.connection)throw Error("This input does not have a connection.");return this.connection.setCheck(t),this}setAlign(t){return this.align=t,this.sourceBlock.rendered&&this.sourceBlock.queueRender(),this}setShadowDom(t){if(!this.connection)throw Error("This input does not have a connection.");return this.connection.setShadowDom(t),this}getShadowDom(){if(!this.connection)throw Error("This input does not have a connection.");return this.connection.getShadowDom()}init(){for(const t of this.fieldRow)t.init()}initModel(){for(const t of this.fieldRow)t.initModel()}initField(t){this.sourceBlock.rendered?t.init():t.initModel()}dispose(){for(let t,e=0;t=this.fieldRow[e];e++)t.dispose();this.connection&&this.connection.dispose()}makeConnection(t){return this.sourceBlock.makeConnection_(t)}},np=class extends op{constructor(t,e){super(t,e),this.name=t,this.type=Hl.inputTypes$$module$build$src$core$inputs$input_types.DUMMY}},rp=class extends op{constructor(t,e){super(t,e),this.name=t,this.type=Hl.inputTypes$$module$build$src$core$inputs$input_types.END_ROW}},lp=class extends op{constructor(t,e){if(!t)throw Error("Statement inputs must have a non-empty name");super(t,e),this.name=t,this.type=Hl.inputTypes$$module$build$src$core$inputs$input_types.STATEMENT,this.connection=this.makeConnection(Vd.NEXT_STATEMENT)}};Hl.ValueInput$$module$build$src$core$inputs$value_input=class extends op{constructor(t,e){if(!t)throw Error("Value inputs must have a non-empty name");super(t,e),this.name=t,this.type=Hl.inputTypes$$module$build$src$core$inputs$input_types.VALUE,this.connection=this.makeConnection(Vd.INPUT_VALUE)}},Hl.ValueInput$$module$build$src$core$inputs$value_input;var ap=class{constructor(t,e,s){if(this.data=null,this.disposed=!1,this.hue=null,this.colour_="#000000",this.styleName_="",this.suppressPrefixSuffix=!1,this.previousConnection=this.nextConnection=this.outputConnection=null,this.inputList=[],this.icons=[],this.disabledReasons=new Set,this.tooltip="",this.contextMenu=!0,this.parentBlock_=null,this.childBlocks_=[],this.editable=this.movable=this.deletable=!0,this.collapsed_=this.shadow=!1,this.outputShape_=null,this.rendered=this.isInsertionMarker_=this.initialized=this.disposing=!1,this.onchangeWrapper=this.helpUrl=null,this.statementInputCount=0,this.workspace=t,this.id=s&&!t.getBlockById(s)?s:S(),t.setBlockById(this.id,this),this.xy=new _c(0,0),this.isInFlyout=t.isFlyout,this.isInMutator=t.isMutator,this.RTL=t.RTL,e){if(this.type=e,!(s=oa[e])||"object"!=typeof s)throw TypeError("Invalid block definition for type: "+e);Object.assign(this,s)}t.addTopBlock(this),t.addTypedBlock(this),new.target===ap&&this.doInit_()}doInit_(){const t=Hl.getGroup$$module$build$src$core$events$utils();t||Hl.setGroup$$module$build$src$core$events$utils(!0);const e=j();try{"function"==typeof this.init&&(Hl.setRecordUndo$$module$build$src$core$events$utils(!1),this.init(),Hl.setRecordUndo$$module$build$src$core$events$utils(e)),st()&&J(new(rt(ua.BLOCK_CREATE))(this))}finally{Hl.setGroup$$module$build$src$core$events$utils(t),Hl.setRecordUndo$$module$build$src$core$events$utils(e)}this.inputsInlineDefault=this.inputsInline,"function"==typeof this.onchange&&this.setOnChange(this.onchange)}dispose(t=!1){this.disposing=!0,this.onchangeWrapper&&this.workspace.removeChangeListener(this.onchangeWrapper),this.unplug(t),st()&&J(new(rt(ua.BLOCK_DELETE))(this)),this.workspace.removeTopBlock(this),this.disposeInternal()}disposeInternal(){this.disposing=!0,this.onchangeWrapper&&this.workspace.removeChangeListener(this.onchangeWrapper),this.workspace.removeTypedBlock(this),this.workspace.removeBlockById(this.id),"function"==typeof this.destroy&&this.destroy(),this.childBlocks_.forEach(t=>t.disposeInternal()),this.inputList.forEach(t=>t.dispose()),this.inputList.length=0,this.getConnections_(!0).forEach(t=>t.dispose()),this.disposed=!0}isDeadOrDying(){return this.disposing||this.disposed}initModel(){if(!this.initialized){for(const t of this.inputList)t.initModel();this.initialized=!0}}unplug(t){this.outputConnection&&this.unplugFromRow(t),this.previousConnection&&this.unplugFromStack(t)}unplugFromRow(t){let e,s=null;null!=(e=this.outputConnection)&&e.isConnected()&&(s=this.outputConnection.targetConnection,this.outputConnection.disconnect()),s&&t&&(t=this.getOnlyValueConnection())&&t.isConnected()&&!t.targetBlock().isShadow()&&(null==(t=t.targetConnection)||t.disconnect(),this.workspace.connectionChecker.canConnect(t,s,!1)?s.connect(t):null==t||t.onFailedConnect(s))}getOnlyValueConnection(){let t=null;for(let e=0;e1)return!1;return!0}getMatchingConnection(t,e){const s=this.getConnections_(!0);if(t=t.getConnections_(!0),s.length!==t.length)throw Error("Connection lists did not match in length.");for(let i=0;i(t=t+("("===s||")"===e?"":" ")+e,s=e[e.length-1],t),"")).trim()||"???",t&&e.length>t&&(e=e.substring(0,t-3)+"..."),e}toTokens(t="?"){const e=[];for(const i of this.inputList)if(i.name!=rh){for(const t of i.fieldRow)e.push(t.getText());if(i.connection){const o=i.connection.targetBlock();if(o){var s=i.connection;let n=s.getCheck();!n&&s.targetConnection&&(n=s.targetConnection.getCheck()),(s=!!n&&(n.includes("Boolean")||n.includes("Number")))&&e.push("("),e.push(...o.toTokens(t)),s&&e.push(")")}else e.push(t)}}return e}appendValueInput(t){return this.appendInput(new Hl.ValueInput$$module$build$src$core$inputs$value_input(t,this))}appendStatementInput(t){return this.statementInputCount++,this.appendInput(new lp(t,this))}appendDummyInput(t=""){return this.appendInput(new np(t,this))}appendEndRowInput(t=""){return this.appendInput(new rp(t,this))}appendInput(t){return this.inputList.push(t),t}appendInputFromRegistry(t,e){return(t=r(zl.INPUT,t,!1))?this.appendInput(new t(e,this)):null}jsonInit(t){var e=t.type?'Block "'+t.type+'": ':"";if(t.output&&t.previousStatement)throw Error(e+"Must not have both an output and a previousStatement.");for(var s=0;t["args"+s];){if(void 0===t["message"+s])throw Error(e+`args${s} must have a corresponding message (message${s}).`);s++}if(t.style&&t.style.hat&&(this.hat=t.style.hat,t.style=null),t.style&&t.colour)throw Error(e+"Must not have both a colour and a style.");for(t.style?this.jsonInitStyle(t,e):this.jsonInitColour(t,e),s=0;void 0!==t["message"+s];)this.interpolate(t["message"+s],t["args"+s]||[],t["implicitAlign"+s]||t["lastDummyAlign"+s],e),s++;if(void 0!==t.inputsInline&&(Hl.disable$$module$build$src$core$events$utils(),this.setInputsInline(t.inputsInline),Hl.enable$$module$build$src$core$events$utils()),void 0!==t.output&&this.setOutput(!0,t.output),void 0!==t.outputShape&&this.setOutputShape(t.outputShape),void 0!==t.previousStatement&&this.setPreviousStatement(!0,t.previousStatement),void 0!==t.nextStatement&&this.setNextStatement(!0,t.nextStatement),void 0!==t.tooltip&&(s=eo(t.tooltip),this.setTooltip(s)),void 0!==t.enableContextMenu&&(this.contextMenu=!!t.enableContextMenu),void 0!==t.suppressPrefixSuffix&&(this.suppressPrefixSuffix=!!t.suppressPrefixSuffix),void 0!==t.helpUrl&&(s=eo(t.helpUrl),this.setHelpUrl(s)),"string"==typeof t.extensions&&(console.warn(e+"JSON attribute 'extensions' should be an array of strings. Found raw string in JSON for '"+t.type+"' block."),t.extensions=[t.extensions]),void 0!==t.mutator&&dn(t.mutator,this,!0),t=t.extensions,Array.isArray(t))for(e=0;ee)throw Error('Block "'+this.type+'": Message index %'+n+" out of range.");if(s[n])throw Error('Block "'+this.type+'": Message index %'+n+" duplicated.");s[n]=!0,i++}}if(i!==e)throw Error('Block "'+this.type+'": Message does not reference all '+e+" arg(s).")}interpolateArguments(t,e,s){const i=[];for(let n=0;n=this.inputList.length)throw RangeError("Input index "+t+" out of bounds.");if(e>this.inputList.length)throw RangeError("Reference input "+e+" out of bounds.");const s=this.inputList[t];this.inputList.splice(t,1),tt.getWeight()-e.getWeight()),t}removeIcon(t){if(!this.hasIcon(t))return!1;let e;return null==(e=this.getIcon(t))||e.dispose(),this.icons=this.icons.filter(e=>!e.getType().equals(t)),!0}hasIcon(t){return this.icons.some(e=>e.getType().equals(t))}getIcon(t){return t instanceof Kh?this.icons.find(e=>e.getType().equals(t)):this.icons.find(e=>e.getType().toString()===t)}getIcons(){return[...this.icons]}getRelativeToSurfaceXY(){return this.xy}moveBy(t,e,s){if(this.parentBlock_)throw Error("Block has parent");const i=new(rt(ua.BLOCK_MOVE))(this);s&&i.setReason(s),this.xy.translate(t,e),i.recordNew(),J(i)}makeConnection_(t){return new Kd(this,t)}allInputsFilled(t){if(void 0===t&&(t=!0),!t&&this.isShadow())return!1;for(let s,i=0;s=this.inputList[i];i++)if(s.connection){var e=s.connection.targetBlock();if(!e||!e.allInputsFilled(t))return!1}return!(e=this.getNextBlock())||e.allInputsFilled(t)}toDevString(){let t=this.type?'"'+this.type+'" block':"Block";return this.id&&(t+=' (id="'+this.id+'")'),t}};ap.COLLAPSED_INPUT_NAME=rh,ap.COLLAPSED_FIELD_NAME=lh;var cp=null,hp=null,up={};up.connectionUiEffect=Fn,up.disconnectUiEffect=Un,up.disconnectUiStop=Gn,up.disposeUiEffect=Pn;var dp=class{paste(t,e,s){if(!e.isCapacityAvailable(t.typeCounts))return null;let i;s&&(t.blockState.x=s.x,t.blockState.y=s.y),s=s||new _c(t.blockState.x||0,t.blockState.y||0),Hl.disable$$module$build$src$core$events$utils();try{i=vs(t.blockState,e),Vn(i,s)}finally{Hl.enable$$module$build$src$core$events$utils()}if(!i)return i;st()&&!i.isShadow()&&J(new(rt(ua.BLOCK_CREATE))(i));const o=i;return Me().then(()=>Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(o)),i}};dp.TYPE="block",ye(dp.TYPE,new dp);var pp={};pp.BlockPaster=dp,pp.moveBlockToNotConflict=Vn;var gp={};gp.bumpIntoBounds=zn,gp.bumpIntoBoundsHandler=Yn,gp.bumpTopObjectsIntoBounds=jn;var _p=class{constructor(t){this.block=t,this.connectionPreviewer=this.connectionCandidate=this.startLoc=this.startChildConn=this.startParentConn=null,this.dragging=!1,this.dragOffset=new _c(0,0),this.originalEventGroup="",this.workspace=t.workspace}isMovable(){if(this.block.isShadow()){let t,e;return null!=(e=null==(t=this.block.getParent())?void 0:t.isMovable())&&e}return this.block.isOwnMovable()&&!this.block.isDeadOrDying()&&!this.workspace.isReadOnly()&&!this.block.isInFlyout}startDrag(t){var e;this.block.isShadow()?this.startDraggingShadow(t):(this.dragging=!0,this.fireDragStartEvent(),this.startLoc=this.block.getRelativeToSurfaceXY(),this.connectionCandidate=null,this.connectionPreviewer=new(c(zl.CONNECTION_PREVIEWER,this.workspace.options))(this.block),Tt(),this.workspace.setResizesEnabled(!1),Gn(),t=this.shouldHealStack(t),this.shouldDisconnect(t)&&this.disconnectBlock(t),this.block.setDragging(!0),null==(e=this.workspace.getLayerManager())||e.moveToDragLayer(this.block),this.getVisibleBubbles(this.block).forEach(t=>{let e;null==(e=this.workspace.getLayerManager())||e.moveToDragLayer(t,!1)}))}getVisibleBubbles(t){return t.getDescendants(!1).flatMap(t=>t.getIcons()).filter(t=>Ws(t)&&t.bubbleIsVisible()).map(t=>t.getBubble()).filter(t=>!!t).sort((t,e)=>(t=t.getSvgRoot().compareDocumentPosition(e.getSvgRoot()))&Node.DOCUMENT_POSITION_PRECEDING?1:t&Node.DOCUMENT_POSITION_FOLLOWING?-1:0)}shouldHealStack(t){return!!t&&(t.altKey||t.ctrlKey||t.metaKey)}startDraggingShadow(t){const e=this.block.getParent();if(!e)throw Error("Tried to drag a shadow block with no parent. Shadow blocks should always have parents.");this.dragOffset=_c.difference(e.getRelativeToSurfaceXY(),this.block.getRelativeToSurfaceXY()),e.startDrag(t)}shouldDisconnect(t){return!!(this.block.getParent()||t&&this.block.nextConnection&&this.block.nextConnection.targetBlock())}disconnectBlock(t){let e,s,i;if(this.startParentConn=null!=(i=null==(e=this.block.outputConnection)?void 0:e.targetConnection)?i:null==(s=this.block.previousConnection)?void 0:s.targetConnection,t){let t;this.startChildConn=null==(t=this.block.nextConnection)?void 0:t.targetConnection}this.block.unplug(t),Un(this.block)}fireDragStartEvent(){const t=new(rt(ua.BLOCK_DRAG))(this.block,!0,this.block.getDescendants(!1));J(t)}fireDragEndEvent(){const t=new(rt(ua.BLOCK_DRAG))(this.block,!1,this.block.getDescendants(!1));J(t)}fireMoveEvent(){if(!this.block.isDeadOrDying()){var t=new(rt(ua.BLOCK_MOVE))(this.block);t.setReason(["drag"]),t.oldCoordinate=this.startLoc,t.recordNew(),J(t)}}drag(t){if(this.block.isShadow()){let e;null==(e=this.block.getParent())||e.drag(_c.sum(t,this.dragOffset))}else this.block.moveDuringDrag(t),this.updateConnectionPreview(this.block,_c.difference(t,this.startLoc))}updateConnectionPreview(t,e){var s=this.connectionCandidate;const i=this.getConnectionCandidate(t,e);if(i){this.connectionCandidate=e=s&&this.currCandidateIsBetter(s,e,i)?s:i;var o,{local:n,neighbour:r}=e;if(e=n.type===Vd.OUTPUT_VALUE||n.type===Vd.PREVIOUS_STATEMENT,s=r.isConnected()&&!(null!=(o=r.targetBlock())&&o.isInsertionMarker()),e&&s&&!this.orphanCanConnectAtEnd(t,r.targetBlock(),n.type)){let t;null==(t=this.connectionPreviewer)||t.previewReplacement(n,r,r.targetBlock())}else{var l;null==(l=this.connectionPreviewer)||l.previewConnection(n,r)}}else{let t;null==(t=this.connectionPreviewer)||t.hidePreview(),this.connectionCandidate=null}}orphanCanConnectAtEnd(t,e,s){return!!Kd.getConnectionForOrphanedConnection(t,s===Vd.OUTPUT_VALUE?e.outputConnection:e.previousConnection)}currCandidateIsBetter(t,e,s){const{local:i,neighbour:o}=t;t=new _c(i.x,i.y);const n=new _c(o.x,o.y);return e=_c.distance(_c.sum(t,e),n),s.distance>e-Hl.config$$module$build$src$core$config.currentConnectionPreference}getConnectionCandidate(t,e){t=this.getLocalConnections(t);let s=this.getSearchRadius(),i=null;for(const o of t){const{connection:t,radius:n}=o.closest(s,e);t&&(i={local:o,neighbour:t,distance:n},s=n)}return i}getSearchRadius(){return this.connectionCandidate?Hl.config$$module$build$src$core$config.connectingSnapRadius:Hl.config$$module$build$src$core$config.snapRadius}getLocalConnections(t){const e=t.getConnections_(!1),s=t.lastConnectionInStack(!0);return s&&s!==t.nextConnection&&e.push(s),e}endDrag(t){if(this.block.isShadow()){let e;null==(e=this.block.getParent())||e.endDrag(t)}else{var e;if(this.originalEventGroup=Hl.getGroup$$module$build$src$core$events$utils(),this.fireDragEndEvent(),this.fireMoveEvent(),mt(),Gn(),null==(e=this.connectionPreviewer)||e.hidePreview(),!this.block.isDeadOrDying()&&this.dragging){let t;null==(t=this.workspace.getLayerManager())||t.moveOffDragLayer(this.block,nd),this.getVisibleBubbles(this.block).forEach(t=>{let e;return null==(e=this.workspace.getLayerManager())?void 0:e.moveOffDragLayer(t,rd,!1)}),this.block.setDragging(!1)}this.connectionCandidate?(this.applyConnections(this.connectionCandidate),this.disposeStep()):this.block.queueRender().then(()=>this.disposeStep())}}disposeStep(){const t=Hl.getGroup$$module$build$src$core$events$utils();let e;Hl.setGroup$$module$build$src$core$events$utils(this.originalEventGroup),this.block.snapToGrid(),null==(e=this.connectionPreviewer)||e.dispose(),this.workspace.setResizesEnabled(!0),Hl.setGroup$$module$build$src$core$events$utils(t)}applyConnections(t){const{local:e,neighbour:s}=t;e.connect(s);const i=e.isSuperior()?s:e,o=this.block.getRootBlock();Me().then(()=>{Fn(i.getSourceBlock()),setTimeout(()=>{o.bringToFront()},0)})}revertDrag(){if(this.block.isShadow()){let t;null==(t=this.block.getParent())||t.revertDrag()}else{var t,e;if(null==(t=this.connectionPreviewer)||t.hidePreview(),this.connectionCandidate=null,null==(e=this.startChildConn)||e.connect(this.block.nextConnection),this.startParentConn)switch(this.startParentConn.type){case Vd.INPUT_VALUE:this.startParentConn.connect(this.block.outputConnection);break;case Vd.NEXT_STATEMENT:this.startParentConn.connect(this.block.previousConnection)}else{let t;this.block.moveTo(this.startLoc,["drag"]),null==(t=this.workspace.getLayerManager())||t.moveOffDragLayer(this.block,nd),this.getVisibleBubbles(this.block).forEach(t=>{let e;return null==(e=this.workspace.getLayerManager())?void 0:e.moveOffDragLayer(t,rd,!1)}),zn(this.workspace,this.workspace.getMetricsManager().getScrollMetrics(!0),this.block)}this.startParentConn=this.startChildConn=null,this.block.setDragging(!1),this.dragging=!1}}},Tp=class extends Md{constructor(t,e,s,i){super(e,s,i),this.text=t,this.workspace=e,this.anchor=s,this.ownerRect=i,this.paragraph=this.stringToSvg(t,this.contentContainer),this.updateBubbleSize(),ct(this.svgRoot,"blocklyTextBubble")}getText(){return this.text}setText(t){this.text=t,pt(this.paragraph),this.paragraph=this.stringToSvg(t,this.contentContainer),this.updateBubbleSize()}stringToSvg(t,e){return e=this.createParagraph(e),t=this.createTextFragments(e,t),this.workspace.RTL&&this.rightAlignTextFragments(e.getBBox().width,t),e}createParagraph(t){return at(Tc.G,{class:"blocklyText blocklyBubbleText blocklyNoPointerEvents",transform:`translate(0,${Md.BORDER_WIDTH})`,style:"direction: "+(this.workspace.RTL?"rtl":"ltr")},t)}createTextFragments(t,e){let s=1;return e.split("\n").map(e=>{const i=at(Tc.TEXT,{y:`${s}em`,x:Md.BORDER_WIDTH},t);return e=document.createTextNode(e),i.appendChild(e),s+=1,i})}rightAlignTextFragments(t,e){for(const s of e)s.setAttribute("text-anchor","start"),s.setAttribute("x",`${t+Md.BORDER_WIDTH}`)}updateBubbleSize(){const t=this.paragraph.getBBox();this.setSize(new Ec(t.width+2*Md.BORDER_WIDTH,t.height+2*Md.BORDER_WIDTH),!0)}},mp=class extends xd{constructor(t){super(t),this.sourceBlock=t,this.textMap=new Map,this.textBubble=null}getType(){return mp.TYPE}initView(t){this.svgRoot||(super.initView(t),at(Tc.PATH,{class:"blocklyIconShape",d:"M2,15Q-1,15 0.5,12L6.5,1.7Q8,-1 9.5,1.7L15.5,12Q17,15 14,15z"},this.svgRoot),at(Tc.PATH,{class:"blocklyIconSymbol",d:"m7,4.8v3.16l0.27,2.27h1.46l0.27,-2.27v-3.16z"},this.svgRoot),at(Tc.RECT,{class:"blocklyIconSymbol",x:"7",y:"11",height:"2",width:"2"},this.svgRoot),ct(this.svgRoot,"blocklyWarningIcon"))}dispose(){let t;super.dispose(),null==(t=this.textBubble)||t.dispose()}getWeight(){return mp.WEIGHT}getSize(){return new Ec(17,17)}applyColour(){let t;super.applyColour(),null==(t=this.textBubble)||t.setColour(this.sourceBlock.getColour())}updateCollapsed(){}isShownWhenCollapsed(){return!0}onLocationChange(t){let e;super.onLocationChange(t),null==(e=this.textBubble)||e.setAnchorLocation(this.getAnchorLocation())}addMessage(t,e){if(this.textMap.get(e)===t)return this;let s;return t?this.textMap.set(e,t):this.textMap.delete(e),null==(s=this.textBubble)||s.setText(this.getText()),this}getText(){return[...this.textMap.values()].join("\n")}onClick(){super.onClick(),this.setBubbleVisible(!this.bubbleIsVisible())}isClickableInFlyout(){return!1}bubbleIsVisible(){return!!this.textBubble}setBubbleVisible(t){const e=this;return(0,Fl.asyncExecutePromiseGeneratorFunction)(function*(){if(e.bubbleIsVisible()!==t){if(yield Me(),t)e.textBubble=new Tp(e.getText(),e.sourceBlock.workspace,e.getAnchorLocation(),e.getBubbleOwnerRect()),e.applyColour();else{let t;null==(t=e.textBubble)||t.dispose(),e.textBubble=null}J(new(rt(ua.BUBBLE_OPEN))(e.sourceBlock,t,"warning"))}})}getBubble(){return this.textBubble}getAnchorLocation(){return _c.sum(this.workspaceLocation,new _c(8.5,8.5))}getBubbleOwnerRect(){const t=this.sourceBlock.getSvgRoot().getBBox();return new mc(t.y,t.y+t.height,t.x,t.x+t.width)}};mp.TYPE=Kh.WARNING,mp.WEIGHT=2;var Ep=class extends ap{constructor(t,e,s){if(super(t,e,s),this.childlessWidth=this.width=this.height=0,this.warningTextDb=new Map,this.mutator=null,this.rendered=!0,this.visuallyDisabled=!1,this.translation="",this.dragging=!1,this.relativeCoords=new _c(0,0),this.dragStrategy=new _p(this),!t.rendered)throw TypeError("Cannot create a rendered block in a headless workspace");this.workspace=t,this.svgGroup=at(Tc.G,{}),e&&ct(this.svgGroup,e),this.style=t.getRenderer().getConstants().getBlockStyle(null),this.pathObject=t.getRenderer().makePathObject(this.svgGroup,this.style),(t=this.pathObject.svgPath).tooltip=this,vi(t),this.svgGroup.setAttribute("data-id",this.id),t.id=C(),this.doInit_()}initSvg(){if(!this.initialized){for(var t of this.inputList)t.init();for(const t of this.getIcons())t.initView(this.createIconPointerDownListener(t)),t.updateEditable();this.applyColour(),this.pathObject.updateMovable(this.isMovable()||this.isInFlyout),(t=this.getSvgRoot())&&T(t,"pointerdown",this,this.onMouseDown),t.parentNode||this.workspace.getCanvas().appendChild(t),this.initialized=!0}}getColourSecondary(){return this.style.colourSecondary}getColourTertiary(){return this.style.colourTertiary}select(){this.addSelect(),Lt(this)}unselect(){this.removeSelect(),Lt(null)}setParent(t){var e=this.parentBlock_;if(t!==e){Tt(),super.setParent(t),mt();var s=this.getSvgRoot();if(!this.workspace.isClearing&&s){var i,o=this.getRelativeToSurfaceXY(),n=Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode(),r=this.getSvgRoot().contains(null!=(i=null==n?void 0:n.getFocusableElement())?i:null);t?(t.getSvgRoot().appendChild(s),r&&n&&Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(n)):e&&((e=null==(t=this.workspace.getCanvas().querySelector(".blocklyDragging"))?void 0:t.parentElement)===(i=this.workspace.getCanvas())?i.insertBefore(s,t):(i.appendChild(s),r&&n&&Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(n)),this.translate(o.x,o.y)),this.applyColour()}}}getRelativeToSurfaceXY(){const t=this.workspace.getLayerManager();if(!t)throw Error("Cannot calculate position because the workspace has not been appended");let e=0,s=0,i=this.getSvgRoot();if(i)do{const t=te(i);e+=t.x,s+=t.y,i=i.parentNode}while(i&&!t.hasLayer(i));return new _c(e,s)}moveBy(t,e,s){if(this.parentBlock_)throw Error("Block has parent");const i=st();let o=null;i&&(o=new(rt(ua.BLOCK_MOVE))(this),s&&o.setReason(s)),t=new _c(t,e),e=this.getRelativeToSurfaceXY(),t=_c.sum(e,t),this.translate(t.x,t.y),this.updateComponentLocations(t),i&&o&&(o.recordNew(),J(o)),this.workspace.resizeContents()}translate(t,e){this.translation=`translate(${t}, ${e})`,this.relativeCoords=new _c(t,e),this.getSvgRoot().setAttribute("transform",this.getTranslation())}getTranslation(){return this.translation}moveTo(t,e){const s=this.getRelativeToSurfaceXY();this.moveBy(t.x-s.x,t.y-s.y,e)}moveDuringDrag(t){this.translate(t.x,t.y),this.getSvgRoot().setAttribute("transform",this.getTranslation()),this.updateComponentLocations(t)}snapToGrid(){if(!this.isDeadOrDying()&&!this.getParent()&&!this.isInFlyout){var t=this.workspace.getGrid();if(null!=t&&t.shouldSnap()){var e=this.getRelativeToSurfaceXY();(t=t.alignXY(e))!==e&&this.moveTo(t,["snap"])}}}getBoundingRectangle(){return this.getBoundingRectangleWithDimensions(this.getHeightWidth())}getBoundingRectangleWithoutChildren(){return this.getBoundingRectangleWithDimensions({height:this.height,width:this.childlessWidth})}getBoundingRectangleWithDimensions(t){const e=this.getRelativeToSurfaceXY();let s,i;return this.RTL?(s=e.x-t.width,i=e.x):(s=e.x,i=e.x+t.width),new mc(e.y,e.y+t.height,s,i)}markDirty(){this.pathObject.constants=this.workspace.getRenderer().getConstants();for(let t,e=0;t=this.inputList[e];e++)t.markDirty()}setCollapsed(t){this.collapsed_!==t&&(super.setCollapsed(t),this.updateCollapsed())}childHasWarning(){var t=this.getNextBlock();t=t?new Set(t.getDescendants(!1)):null;const e=this.getDescendants(!1);for(const s of e){if(s===this)continue;let e;if((null==(e=t)||!e.has(s))&&s.getIcon(mp.TYPE))return!0}return!1}updateCollapsed(){var t=this.isCollapsed();const e=rh,s=lh;for(let s,i=0;s=this.inputList[i];i++)s.name!==e&&s.setVisible(!t);for(var i of this.getIcons())i.updateCollapsed();t?(ct(this.svgGroup,"blocklyCollapsed"),this.childHasWarning()&&this.setWarningText(Hl.Msg$$module$build$src$core$msg.COLLAPSED_WARNINGS_WARNING,Ep.COLLAPSED_WARNING_ID),t=this.toString(30),(i=this.getField(s))?i.setValue(t):(this.getInput(e)||this.appendDummyInput(e)).appendField(new qd(t),s)):(this.updateDisabled(),this.removeInput(e),ut(this.svgGroup,"blocklyCollapsed"),this.setWarningText(null,Ep.COLLAPSED_WARNING_ID))}onMouseDown(t){if(!this.workspace.isReadOnly()){var e=this.workspace.getGesture(t);e&&e.handleBlockStart(t,this)}}showHelp(){const t="function"==typeof this.helpUrl?this.helpUrl():this.helpUrl;t&&window.open(t)}generateContextMenu(t){return this.workspace.isReadOnly()||!this.contextMenu?null:(t=sd.registry.getContextMenuOptions({block:this,focusedNode:this},t),this.customContextMenu&&this.customContextMenu(t),t)}calculateContextMenuLocation(t){if(t instanceof PointerEvent)return new _c(t.clientX,t.clientY);let e,s;t=ne(this.workspace,this.getRelativeToSurfaceXY());const i=null==(e=this.inputList.filter(t=>t.isVisible()).flatMap(t=>t.fieldRow).find(t=>t.isVisible()))||null==(s=e.getSvgRoot())?void 0:s.getBoundingClientRect();return new _c(this.RTL?t.x-5:t.x+5,(i&&i.height?i.y+i.height:t.y+this.height)+5)}showContextMenu(t){const e=this.generateContextMenu(t),s=this.calculateContextMenuLocation(t);e&&e.length&&($o(t,e,this.RTL,this.workspace,s),fo(this))}updateComponentLocations(t){this.dragging||this.updateConnectionLocations(t),this.updateIconLocations(t),this.updateFieldLocations(t);for(const e of this.getChildren(!1))e.updateComponentLocations(_c.sum(t,e.relativeCoords))}updateConnectionLocations(t){for(const e of this.getConnections_(!1))e.moveToOffset(t)}updateIconLocations(t){for(const e of this.getIcons())e.onLocationChange(t)}updateFieldLocations(t){for(const e of this.inputList)for(const s of e.fieldRow)s.onLocationChange(t)}addClass(t){ct(this.svgGroup,t)}removeClass(t){ut(this.svgGroup,t)}setDragging(t){(this.dragging=t)?(this.translation="",Qa.push(...this.getConnections_(!0)),this.addClass("blocklyDragging")):(Qa.length=0,this.removeClass("blocklyDragging"));for(let e=0;e!t.isDeadOrDying());let e=null,s=Number.MAX_SAFE_INTEGER;const i=this.getRelativeToSurfaceXY();for(const o of t)t=o.getRelativeToSurfaceXY(),(t=Math.sqrt(Math.pow(t.x-i.x,2)+Math.pow(t.y-i.y,2))){this.workspace.rendered&&s.focusTree(this.workspace)},0)}e&&(this.unplug(t),Pn(this)),super.dispose(!!t),pt(this.svgGroup)}disposeInternal(){this.disposing=!0,super.disposeInternal(),Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode()===this&&this.workspace.cancelCurrentGesture(),[...this.warningTextDb.values()].forEach(t=>clearTimeout(t)),this.warningTextDb.clear(),this.getIcons().forEach(t=>t.dispose())}checkAndDelete(){this.workspace.isFlyout||(Hl.setGroup$$module$build$src$core$events$utils(!0),this.workspace.hideChaff(),this.outputConnection?this.dispose(!1,!0):this.dispose(!0,!0),Hl.setGroup$$module$build$src$core$events$utils(!1))}toCopyData(t=!1){return this.isInsertionMarker_?null:{paster:dp.TYPE,blockState:$s(this,{addCoordinates:!0,addNextBlocks:t,saveIds:!1}),typeCounts:Pt(this,!0)}}applyColour(){var t,e;for(null==(e=(t=this.pathObject).applyColour)||e.call(t,this),t=this.getIcons(),e=0;e{this.isDeadOrDying()||(this.warningTextDb.delete(e),this.setWarningText(t,e))},100));else if(this.isInFlyout&&(t=null),s=this.getIcon(mp.TYPE),t){let i=this.getSurroundParent(),o=null;for(;i;)i.isCollapsed()&&(o=i),i=i.getSurroundParent();o&&o.setWarningText(Hl.Msg$$module$build$src$core$msg.COLLAPSED_WARNINGS_WARNING,Ep.COLLAPSED_WARNING_ID),s?s.addMessage(t,e):this.addIcon(new mp(this).addMessage(t,e))}else s&&(e?(s.addMessage("",e),s.getText()||this.removeIcon(mp.TYPE)):this.removeIcon(mp.TYPE))}setMutator(t){this.removeIcon(Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon.TYPE),t&&this.addIcon(t)}addIcon(t){return super.addIcon(t),t instanceof Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon&&(this.mutator=t),t.initView(this.createIconPointerDownListener(t)),t.applyColour(),t.updateEditable(),this.queueRender(),t}createIconPointerDownListener(t){return e=>{!this.isDeadOrDying()&&(e=this.workspace.getGesture(e))&&(this.bringToFront(),e.setStartIcon(t),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(t))}}removeIcon(t){const e=super.removeIcon(t);return t.equals(Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon.TYPE)&&(this.mutator=null),this.queueRender(),e}setDisabledReason(t,e){const s=this.isEnabled();super.setDisabledReason(t,e),this.isEnabled()===s||this.getInheritedDisabled()||this.updateDisabled()}setDeletable(t){super.setDeletable(t),t?ut(this.svgGroup,"blocklyNotDeletable"):ct(this.svgGroup,"blocklyNotDeletable")}setHighlighted(t){this.pathObject.updateHighlighted(t)}addSelect(){this.pathObject.updateSelected(!0)}removeSelect(){this.pathObject.updateSelected(!1)}setDeleteStyle(t){this.pathObject.updateDraggingDelete(t)}getColour(){return this.style.colourPrimary}setColour(t){let e,s;super.setColour(t),t=this.workspace.getRenderer().getConstants().getBlockStyleForColour(this.colour_),null==(s=(e=this.pathObject).setStyle)||s.call(e,t.style),this.style=t.style,this.styleName_=t.name,this.applyColour()}setStyle(t){const e=this.workspace.getRenderer().getConstants().getBlockStyle(t);if(this.styleName_&&ut(this.svgGroup,this.styleName_),!e)throw Error("Invalid style name: "+t);{let s,i;this.hat=e.hat,null==(i=(s=this.pathObject).setStyle)||i.call(s,e),this.colour_=e.colourPrimary,this.style=e,this.applyColour(),ct(this.svgGroup,t),this.styleName_=t}}getStyle(){return this.style}bringToFront(t=!1){const e=Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode();let s=this;if(!s.isDeadOrDying()){do{const e=s.getSvgRoot(),i=e.parentNode,o=i.childNodes;if(o[o.length-1]!==e&&i.appendChild(e),t)break;s=s.getParent()}while(s);e&&Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(e)}}setPreviousStatement(t,e){super.setPreviousStatement(t,e),this.queueRender()}setNextStatement(t,e){super.setNextStatement(t,e),this.queueRender()}setOutput(t,e){super.setOutput(t,e),this.queueRender()}setInputsInline(t){super.setInputsInline(t),this.queueRender()}removeInput(t,e){return t=super.removeInput(t,e),this.queueRender(),t}moveNumberedInputBefore(t,e){super.moveNumberedInputBefore(t,e),this.queueRender()}appendInput(t){return super.appendInput(t),this.queueRender(),t}setConnectionTracking(t){if(this.previousConnection&&this.previousConnection.setTracking(t),this.outputConnection&&this.outputConnection.setTracking(t),this.nextConnection){this.nextConnection.setTracking(t);var e=this.nextConnection.targetBlock();e&&e.setConnectionTracking(t)}if(!this.collapsed_)for(e=0;ee.getElement()===t);return-1===s?null:(s++,s>=e.length&&(s=0),e[s].getElement())}getPreviousSibling(t){const e=this.flyout.getContents();if(!e)return null;let s=e.findIndex(e=>e.getElement()===t);return-1===s?null:(s--,s<0&&(s=e.length-1),e[s].getElement())}isNavigable(t){return this.policy.isNavigable(t)}isApplicable(t){return this.policy.isApplicable(t)}},Op=class{constructor(t,e){this.gap=t,this.axis=e,this.y=this.x=0}getBoundingRectangle(){switch(this.axis){case"x":return new mc(this.y,this.y,this.x,this.x+this.gap);case"y":return new mc(this.y,this.y+this.gap,this.x,this.x)}}moveBy(t,e,s){this.x+=t,this.y+=e}isNavigable(){return!1}getFocusableElement(){throw Error("Cannot be focused")}getFocusableTree(){throw Error("Cannot be focused")}onNodeFocus(){}onNodeBlur(){}canBeFocused(){return!1}},kp=class{getFirstChild(t){return null}getParent(t){return null}getNextSibling(t){return null}getPreviousSibling(t){return null}isNavigable(t){return!1}isApplicable(t){return t instanceof Op}},Ap=class{getFirstChild(t){return t.getEditor()}getParent(t){let e;return null!=(e=t.getOwner())?e:null}getNextSibling(t){return null}getPreviousSibling(t){return null}isNavigable(t){return t.canBeFocused()}isApplicable(t){return t instanceof Wd}},vp=class{getFirstChild(t){return qn(t,!0)[0]}getParent(t){var e;if(null!=(e=t.previousConnection)&&e.targetBlock()){if(e=t.getSurroundParent())return e}else{let e;if(null!=(e=t.outputConnection)&&e.targetBlock())return t.outputConnection.targetBlock()}return t.workspace}getNextSibling(t){let e,s;if(null!=(e=t.nextConnection)&&e.targetBlock()){let e;return null==(e=t.nextConnection)?void 0:e.targetBlock()}return null!=(s=t.outputConnection)&&s.targetBlock()?Qn(t,1):t.getSurroundParent()?Qn(t.getTopStackBlock(),1):this.getParent(t)instanceof Gg?Zn(t,1):null}getPreviousSibling(t){let e,s;if(null!=(e=t.previousConnection)&&e.targetBlock()){let e;return null==(e=t.previousConnection)?void 0:e.targetBlock()}return null!=(s=t.outputConnection)&&s.targetBlock()?Qn(t,-1):this.getParent(t)instanceof Gg?Zn(t,-1):null}isNavigable(t){return t.canBeFocused()}isApplicable(t){return t instanceof Ep}},Np={};Np.BlockNavigationPolicy=vp,Np.navigateBlock=Qn,Np.navigateStacks=Zn;var wp=class{getFirstChild(t){return null}getParent(t){return t.getCommentView().workspace.getCommentById(t.getCommentView().commentId)}getNextSibling(t){const e=t.getCommentView().getCommentBarButtons();return(t=e.indexOf(t))>=0&&t+10?e[t-1]:null}isNavigable(t){return t.canBeFocused()}isApplicable(t){return t instanceof ud}},Lp=class{getFirstChild(t){return null}getParent(t){return null}getNextSibling(t){return null}getPreviousSibling(t){return null}isNavigable(t){return t.canBeFocused()}isApplicable(t){return t instanceof _d}},Mp=class{getFirstChild(t){return t.getParentInput()?t.targetConnection:null}getParent(t){return t.getSourceBlock()}getNextSibling(t){if(t.getParentInput())return Qn(t,1);if(t.type===Vd.NEXT_STATEMENT){const s=t.targetConnection;var e=t.getSourceBlock();if(!s&&e.getRootBlock().lastConnectionInStack(!1)===t){let s;return t=e.workspace.getTopBlocks(!0),(e=t.indexOf(e.getRootBlock())+1)>=t.length&&(e=0),e=t[e],null!=(s=this.getParentConnection(e))?s:e}return s}return t.getSourceBlock()}getPreviousSibling(t){if(t.getParentInput())return Qn(t,-1);if(t.type===Vd.PREVIOUS_STATEMENT||t.type===Vd.OUTPUT_VALUE){const s=t.targetConnection&&!t.targetConnection.getParentInput()?t.targetConnection:null;var e=t.getSourceBlock();if(!s&&this.getParentConnection(e.getRootBlock())===t){let s;return t=e.workspace.getTopBlocks(!0),(e=t.indexOf(e.getRootBlock())-1)<0&&(e=t.length-1),null!=(s=(e=t[e]).lastConnectionInStack(!1))?s:e}return s}return t.type===Vd.NEXT_STATEMENT?t.getSourceBlock():null}getParentConnection(t){let e;return!t.outputConnection||null!=(e=t.previousConnection)&&e.isConnected()?t.previousConnection:t.outputConnection}isNavigable(t){return t.canBeFocused()}isApplicable(t){return t instanceof ep}},Dp=class{getFirstChild(t){return null}getParent(t){return t.getSourceBlock()}getNextSibling(t){return Qn(t,1)}getPreviousSibling(t){return Qn(t,-1)}isNavigable(t){let e;return t.canBeFocused()&&t.isVisible()&&(t.isClickable()||t.isCurrentlyEditable())&&!(null!=(e=t.getSourceBlock())&&e.isSimpleReporter()&&t.isFullBlockField())&&t.getParentInput().isVisible()}isApplicable(t){return t instanceof Uu}},xp={};xp.register=tr,xp.unregister=er;var Pp=class extends xd{constructor(t){super(t),this.sourceBlock=t,this.textInputBubble=null,this.text="",this.bubbleSize=new Ec(160,80),this.bubbleVisiblity=!1}getType(){return Pp.TYPE}initView(t){this.svgRoot||(super.initView(t),at(Tc.CIRCLE,{class:"blocklyIconShape",r:"8",cx:"8",cy:"8"},this.svgRoot),at(Tc.PATH,{class:"blocklyIconSymbol",d:"m6.8,10h2c0.003,-0.617 0.271,-0.962 0.633,-1.266 2.875,-2.4050.607,-5.534 -3.765,-3.874v1.7c3.12,-1.657 3.698,0.118 2.336,1.25-1.201,0.998 -1.201,1.528 -1.204,2.19z"},this.svgRoot),at(Tc.RECT,{class:"blocklyIconSymbol",x:"6.8",y:"10.78",height:"2",width:"2"},this.svgRoot),ct(this.svgRoot,"blocklyCommentIcon"))}dispose(){let t;super.dispose(),null==(t=this.textInputBubble)||t.dispose()}getWeight(){return Pp.WEIGHT}getSize(){return new Ec(17,17)}applyColour(){super.applyColour();const t=this.sourceBlock.getColour();let e;null==(e=this.textInputBubble)||e.setColour(t)}updateEditable(){const t=this,e=()=>super.updateEditable;return(0,Fl.asyncExecutePromiseGeneratorFunction)(function*(){e().call(t),t.bubbleIsVisible()&&(yield t.setBubbleVisible(!1),yield t.setBubbleVisible(!0))})}onLocationChange(t){const e=this.workspaceLocation;let s;super.onLocationChange(t),this.bubbleLocation&&(t=_c.difference(this.workspaceLocation,e),this.bubbleLocation=_c.sum(this.bubbleLocation,t)),t=this.getAnchorLocation(),null==(s=this.textInputBubble)||s.setAnchorLocation(t)}setText(t){const e=this.text;let s;J(new(rt(ua.BLOCK_CHANGE))(this.sourceBlock,"comment",null,e,t)),this.text=t,null==(s=this.textInputBubble)||s.setText(this.text)}getText(){return this.text}setBubbleSize(t){let e;this.bubbleSize=t,null==(e=this.textInputBubble)||e.setSize(this.bubbleSize,!0)}getBubbleSize(){return this.bubbleSize}setBubbleLocation(t){let e;this.bubbleLocation=t,null==(e=this.textInputBubble)||e.moveDuringDrag(t)}getBubbleLocation(){return this.bubbleLocation}saveState(){if(this.text){const t={text:this.text,pinned:this.bubbleIsVisible(),height:this.bubbleSize.height,width:this.bubbleSize.width},e=this.getBubbleLocation();return e&&(t.x=this.sourceBlock.workspace.RTL?this.sourceBlock.workspace.getWidth()-(e.x+this.bubbleSize.width):e.x,t.y=e.y),t}return null}loadState(t){let e,s,i,o;this.text=null!=(e=t.text)?e:"",this.bubbleSize=new Ec(null!=(s=t.width)?s:160,null!=(i=t.height)?i:80),this.bubbleVisiblity=null!=(o=t.pinned)&&o,this.setBubbleVisible(this.bubbleVisiblity);let n=t.x;const r=t.y;Me().then(()=>{n&&r&&(n=this.sourceBlock.workspace.RTL?this.sourceBlock.workspace.getWidth()-(n+this.bubbleSize.width):n,this.setBubbleLocation(new _c(n,r)))})}onClick(){super.onClick(),this.setBubbleVisible(!this.bubbleIsVisible())}isClickableInFlyout(){return!1}onTextChange(){if(this.textInputBubble){var t=this.textInputBubble.getText();this.text!==t&&(J(new(rt(ua.BLOCK_CHANGE))(this.sourceBlock,"comment",null,this.text,t)),this.text=t)}}onSizeChange(){this.textInputBubble&&(this.bubbleSize=this.textInputBubble.getSize())}onBubbleLocationChange(){this.textInputBubble&&(this.bubbleLocation=this.textInputBubble.getRelativeToSurfaceXY())}bubbleIsVisible(){return this.bubbleVisiblity}setBubbleVisible(t){const e=this;return(0,Fl.asyncExecutePromiseGeneratorFunction)(function*(){e.bubbleVisiblity!==t&&(e.bubbleVisiblity=t,yield Me(),!e.sourceBlock.rendered||e.sourceBlock.isInFlyout||e.sourceBlock.isInsertionMarker()||(t?(e.sourceBlock.isEditable()?e.showEditableBubble():e.showNonEditableBubble(),e.applyColour()):e.hideBubble(),J(new(rt(ua.BUBBLE_OPEN))(e.sourceBlock,t,"comment"))))})}getBubble(){return this.textInputBubble}showEditableBubble(){let t,e;this.createBubble(),null==(t=this.textInputBubble)||t.addTextChangeListener(()=>this.onTextChange()),null==(e=this.textInputBubble)||e.addSizeChangeListener(()=>this.onSizeChange())}showNonEditableBubble(){let t;this.createBubble(),null==(t=this.textInputBubble)||t.setEditable(!1)}createBubble(){this.textInputBubble=new Wd(this.sourceBlock.workspace,this.getAnchorLocation(),this.getBubbleOwnerRect(),this),this.textInputBubble.setText(this.getText()),this.textInputBubble.setSize(this.bubbleSize,!0),this.bubbleLocation&&this.textInputBubble.moveDuringDrag(this.bubbleLocation),this.textInputBubble.addTextChangeListener(()=>this.onTextChange()),this.textInputBubble.addSizeChangeListener(()=>this.onSizeChange()),this.textInputBubble.addLocationChangeListener(()=>this.onBubbleLocationChange())}hideBubble(){let t;null==(t=this.textInputBubble)||t.dispose(),this.textInputBubble=null}getAnchorLocation(){return _c.sum(this.workspaceLocation,new _c(8.5,8.5))}getBubbleOwnerRect(){return this.sourceBlock.getBoundingRectangleWithoutChildren()}};Pp.TYPE=Kh.COMMENT,Pp.WEIGHT=3,tr(Pp.TYPE,Pp);var Bp=class{getFirstChild(t){if(t instanceof Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon&&t.bubbleIsVisible()&&Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode()===t){let e,s;return null!=(s=null==(e=t.getBubble())?void 0:e.getWorkspace())?s:null}if(t instanceof Pp&&t.bubbleIsVisible()&&Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode()===t){let e,s;return null!=(s=null==(e=t.getBubble())?void 0:e.getEditor())?s:null}return null}getParent(t){return t.getSourceBlock()}getNextSibling(t){return Qn(t,1)}getPreviousSibling(t){return Qn(t,-1)}isNavigable(t){return t.canBeFocused()}isApplicable(t){return t instanceof xd}},Fp=class{getFirstChild(t){return t.view.getCommentBarButtons()[0]}getParent(t){return t.workspace}getNextSibling(t){return Zn(t,1)}getPreviousSibling(t){return Zn(t,-1)}isNavigable(t){return t.canBeFocused()}isApplicable(t){return t instanceof fd}},Up=class{getFirstChild(t){return(t=t.getTopBlocks(!0)).length?t[0]:null}getParent(t){return null}getNextSibling(t){return null}getPreviousSibling(t){return null}isNavigable(t){return t.canBeFocused()&&!t.isMutator}isApplicable(t){return t instanceof Gg}},Hp=class{constructor(){this.rules=[new vp,new Dp,new Mp,new Up,new Bp,new Fp,new wp,new Ap,new Lp]}addNavigationPolicy(t){this.rules.push(t)}get(t){return this.rules.find(e=>e.isApplicable(t))}getFirstChild(t){let e;const s=null==(e=this.get(t))?void 0:e.getFirstChild(t);if(!s)return null;let i;return null!=(i=this.get(s))&&i.isNavigable(s)?s:this.getFirstChild(s)||this.getNextSibling(s)}getParent(t){let e;const s=null==(e=this.get(t))?void 0:e.getParent(t);if(!s)return null;let i;return null!=(i=this.get(s))&&i.isNavigable(s)?s:this.getParent(s)}getNextSibling(t){let e;const s=null==(e=this.get(t))?void 0:e.getNextSibling(t);if(!s)return null;let i;return null!=(i=this.get(s))&&i.isNavigable(s)?s:this.getNextSibling(s)}getPreviousSibling(t){let e;const s=null==(e=this.get(t))?void 0:e.getPreviousSibling(t);if(!s)return null;let i;return null!=(i=this.get(s))&&i.isNavigable(s)?s:this.getPreviousSibling(s)}},Gp=class extends Hp{constructor(t){super(),this.rules.push(new Rp,new kp),this.rules=this.rules.map(e=>new yp(e,t))}},Vp=class{constructor(t,e,s,i,o){this.workspace=t,this.oldHostMetrics=this.corner_=this.vScroll=this.hScroll=null,s=void 0===s||s;const n=(e=void 0===e||e)&&s;e&&(this.hScroll=new Sc(t,!0,n,i,o)),s&&(this.vScroll=new Sc(t,!1,n,i,o)),n&&(this.corner_=at(Tc.RECT,{height:Sc.scrollbarThickness,width:Sc.scrollbarThickness,class:"blocklyScrollbarBackground"}),gt(this.corner_,t.getBubbleCanvas()))}dispose(){pt(this.corner_),this.oldHostMetrics=this.corner_=null,this.hScroll&&(this.hScroll.dispose(),this.hScroll=null),this.vScroll&&(this.vScroll.dispose(),this.vScroll=null)}resize(){const t=this.workspace.getMetrics();if(t){var e=!1,s=!1;if(this.oldHostMetrics&&this.oldHostMetrics.viewWidth===t.viewWidth&&this.oldHostMetrics.viewHeight===t.viewHeight&&this.oldHostMetrics.absoluteTop===t.absoluteTop&&this.oldHostMetrics.absoluteLeft===t.absoluteLeft?(this.oldHostMetrics&&this.oldHostMetrics.scrollWidth===t.scrollWidth&&this.oldHostMetrics.viewLeft===t.viewLeft&&this.oldHostMetrics.scrollLeft===t.scrollLeft||(e=!0),this.oldHostMetrics&&this.oldHostMetrics.scrollHeight===t.scrollHeight&&this.oldHostMetrics.viewTop===t.viewTop&&this.oldHostMetrics.scrollTop===t.scrollTop||(s=!0)):s=e=!0,e||s){try{Hl.disable$$module$build$src$core$events$utils(),this.hScroll&&e&&this.hScroll.resize(t),this.vScroll&&s&&this.vScroll.resize(t)}finally{Hl.enable$$module$build$src$core$events$utils()}this.workspace.maybeFireViewportChangeEvent()}if(this.hScroll&&this.vScroll){if(!this.oldHostMetrics||this.oldHostMetrics.viewWidth!==t.viewWidth||this.oldHostMetrics.absoluteLeft!==t.absoluteLeft){let t;null==(t=this.corner_)||t.setAttribute("x",String(this.vScroll.position.x))}if(!this.oldHostMetrics||this.oldHostMetrics.viewHeight!==t.viewHeight||this.oldHostMetrics.absoluteTop!==t.absoluteTop){let t;null==(t=this.corner_)||t.setAttribute("y",String(this.hScroll.position.y))}}this.oldHostMetrics=t}}canScrollHorizontally(){return!!this.hScroll}canScrollVertically(){return!!this.vScroll}setOrigin(t,e){this.hScroll&&this.hScroll.setOrigin(t,e),this.vScroll&&this.vScroll.setOrigin(t,e)}set(t,e,s){this.hScroll&&this.hScroll.set(t,!1),this.vScroll&&this.vScroll.set(e,!1),(s||void 0===s)&&(t={},this.hScroll&&(t.x=this.hScroll.getRatio_()),this.vScroll&&(t.y=this.vScroll.getRatio_()),this.workspace.setMetrics(t))}setX(t){this.hScroll&&this.hScroll.set(t,!0)}setY(t){this.vScroll&&this.vScroll.set(t,!0)}setContainerVisible(t){this.hScroll&&this.hScroll.setContainerVisible(t),this.vScroll&&this.vScroll.setContainerVisible(t)}isVisible(){let t=!1;return this.hScroll&&(t=this.hScroll.isVisible()),this.vScroll&&(t=t||this.vScroll.isVisible()),t}setVisible(t){this.hScroll&&this.hScroll.setVisibleInternal(t),this.vScroll&&this.vScroll.setVisibleInternal(t)}resizeContent(t){this.hScroll&&this.hScroll.resizeContentHorizontal(t),this.vScroll&&this.vScroll.resizeContentVertical(t)}resizeView(t){this.hScroll&&this.hScroll.resizeViewHorizontal(t),this.vScroll&&this.vScroll.resizeViewVertical(t)}},Wp="sep",Xp=class{load(t,e){return t=new Op(0,e.horizontalLayout?"x":"y"),new $p(t,Wp)}gapForItem(t,e){let s;return null!=(s=parseInt(String(t.gap)))?s:e}disposeItem(t){}getType(){return Wp}};t(zl.FLYOUT_INFLATER,Wp,Xp),{SEPARATOR_TYPE:Wp}.SeparatorFlyoutInflater=Xp;var zp=class extends fp{constructor(t){super(),this.horizontalLayout=!1,this.boundEvents=[],this.reflowWrapper=null,this.inhibitReflowWrapper=!1,this.contents=[],this.autoClose=!0,this.visible=!1,this.containerVisible=!0,this.CORNER_RADIUS=8,this.SCROLLBAR_MARGIN=2.5,this.height_=this.width_=0,this.dragAngleRange_=70,this.svgGroup_=this.svgBackground_=null,this.inflaters=new Map,t.setMetrics=this.setMetrics_.bind(this),this.workspace_=new Gg(t),this.workspace_.setMetricsManager(new Cp(this.workspace_,this)),this.workspace_.internalIsFlyout=!0,this.workspace_.setVisible(this.visible),this.workspace_.setNavigator(new Gp(this)),this.id=S(),this.RTL=!!t.RTL,this.toolboxPosition_=t.toolboxPosition,this.tabWidth_=this.workspace_.getRenderer().getConstants().TAB_WIDTH,this.MARGIN=this.CORNER_RADIUS,this.GAP_X=3*this.MARGIN,this.GAP_Y=3*this.MARGIN}createDom(t){return this.svgGroup_=at(t,{class:"blocklyFlyout"}),this.svgGroup_.style.display="none",this.svgBackground_=at(Tc.PATH,{class:"blocklyFlyoutBackground"},this.svgGroup_),this.svgGroup_.appendChild(this.workspace_.createDom()),this.workspace_.getThemeManager().subscribe(this.svgBackground_,"flyoutBackgroundColour","fill"),this.workspace_.getThemeManager().subscribe(this.svgBackground_,"flyoutOpacity","fill-opacity"),this.svgGroup_}init(t){this.targetWorkspace=t,this.workspace_.targetWorkspace=t,this.workspace_.scrollbar=new Vp(this.workspace_,this.horizontalLayout,!this.horizontalLayout,"blocklyFlyoutScrollbar",this.SCROLLBAR_MARGIN),this.hide(),this.boundEvents.push(T(this.svgGroup_,"wheel",this,this.wheel_,!1,{passive:!1})),this.boundEvents.push(T(this.svgBackground_,"pointerdown",this,this.onMouseDown)),this.workspace_.getGesture=this.targetWorkspace.getGesture.bind(this.targetWorkspace),this.workspace_.setVariableMap(this.targetWorkspace.getVariableMap()),this.workspace_.createPotentialVariableMap(),t.getComponentManager().addComponent({component:this,weight:cc.ComponentWeight.FLYOUT_WEIGHT,capabilities:[cc.Capability.AUTOHIDEABLE,cc.Capability.DELETE_AREA,cc.Capability.DRAG_TARGET]})}dispose(){this.hide(),this.targetWorkspace.getComponentManager().removeComponent(this.id);for(const t of this.boundEvents)E(t);this.boundEvents.length=0,this.workspace_&&(this.workspace_.getThemeManager().unsubscribe(this.svgBackground_),this.workspace_.dispose()),this.svgGroup_&&pt(this.svgGroup_)}getWidth(){return this.width_}getHeight(){return this.height_}getFlyoutScale(){return this.targetWorkspace.scale}getWorkspace(){return this.workspace_}setAutoClose(t){this.autoClose=t,this.targetWorkspace.recordDragTargets(),this.targetWorkspace.resizeContents()}autoHide(t){!t&&this.targetWorkspace.getFlyout(!0)===this&&this.autoClose&&this.hide()}getTargetWorkspace(){return this.targetWorkspace}isVisible(){return this.visible}setVisible(t){const e=t!==this.isVisible();this.visible=t,e&&(this.autoClose||this.targetWorkspace.recordDragTargets(),this.updateDisplay())}setContainerVisible(t){const e=t!==this.containerVisible;this.containerVisible=t,e&&this.updateDisplay()}getContents(){return this.contents}setContents(t){this.contents=t}updateDisplay(){let t,e;t=!!this.containerVisible&&this.isVisible(),this.svgGroup_&&(this.svgGroup_.style.display=t?"block":"none"),null==(e=this.workspace_.scrollbar)||e.setContainerVisible(t)}positionAt_(t,e,s,i){let o,n;null==(o=this.svgGroup_)||o.setAttribute("width",`${t}`),null==(n=this.svgGroup_)||n.setAttribute("height",`${e}`),this.workspace_.setCachedParentSvgSize(t,e),this.svgGroup_&&_t(this.svgGroup_,"translate("+s+"px,"+i+"px)"),(t=this.workspace_.scrollbar)&&(t.setOrigin(s,i),t.resize(),t.hScroll&&t.hScroll.setPosition(t.hScroll.position.x,t.hScroll.position.y),t.vScroll&&t.vScroll.setPosition(t.vScroll.position.x,t.vScroll.position.y))}hide(){this.isVisible()&&(this.setVisible(!1),this.reflowWrapper&&(this.workspace_.removeChangeListener(this.reflowWrapper),this.reflowWrapper=null))}show(t){this.workspace_.setResizesEnabled(!1),Hl.setRecordUndo$$module$build$src$core$events$utils(!1),this.hide(),this.clearOldBlocks(),"string"==typeof t&&(t=this.getDynamicCategoryContents(t)),this.setVisible(!0),t=ue(t),t=this.createFlyoutInfo(t),De(this.workspace_),this.setContents(t),this.layout_(t),this.horizontalLayout?this.height_=0:this.width_=0,this.reflow(),Hl.setRecordUndo$$module$build$src$core$events$utils(!0),this.workspace_.setResizesEnabled(!0),this.reflowWrapper=t=>{this.inhibitReflowWrapper||t.type!==ua.BLOCK_CHANGE&&t.type!==ua.BLOCK_FIELD_INTERMEDIATE_CHANGE||this.reflow()},this.workspace_.addChangeListener(this.reflowWrapper)}createFlyoutInfo(t){const e=[],s=this.horizontalLayout?this.GAP_X:this.GAP_Y;for(const i of t)"custom"in i&&(t=this.getDynamicCategoryContents(i.custom),t=ue(t),e.push(...this.createFlyoutInfo(t))),t=i.kind.toLowerCase(),(t=this.getInflaterForType(t))&&(e.push(t.load(i,this)),(t=t.gapForItem(i,s))&&e.push(new $p(new Op(t,this.horizontalLayout?"x":"y"),Wp)));return this.normalizeSeparators(e)}normalizeSeparators(t){for(let e=t.length-1;e>0;e--){const s=t[e].getType().toLowerCase(),i=t[e-1].getType().toLowerCase();s===Wp&&i===Wp&&t.splice(e-1,1)}return t}getDynamicCategoryContents(t){if("function"!=typeof(t=this.workspace_.targetWorkspace.getToolboxCategoryCallback(t)))throw TypeError("Couldn't find a callback function when opening a toolbox category.");return t(this.workspace_.targetWorkspace)}clearOldBlocks(){let t;this.getContents().forEach(t=>{let e;null==(e=this.getInflaterForType(t.getType()))||e.disposeItem(t)}),null==(t=this.workspace_.getPotentialVariableMap())||t.clear()}onMouseDown(t){const e=this.targetWorkspace.getGesture(t);e&&e.handleFlyoutStart(t,this)}isBlockCreatable(t){return t.isEnabled()&&!this.getTargetWorkspace().isReadOnly()}createBlock(t){const e=this.targetWorkspace;if(!t.getSvgRoot())throw Error("oldBlock is not rendered");var s=this.serializeBlock(t);return e.setResizesEnabled(!1),s=Ns(s,e,{recordUndo:!0}),this.positionNewBlock(t,s),e.hideChaff(),s}reflow(){this.inhibitReflowWrapper=!0,this.reflowInternal_(),this.inhibitReflowWrapper=!1}isScrollable(){return!!this.workspace_.scrollbar&&this.workspace_.scrollbar.isVisible()}serializeBlock(t){return $s(t)}positionNewBlock(t,e){const s=this.targetWorkspace;var i=s.getOriginOffsetInPixels(),o=this.workspace_.getOriginOffsetInPixels();(t=t.getRelativeToSurfaceXY()).scale(this.workspace_.scale),o=_c.sum(o,t),(i=_c.difference(o,i)).scale(1/s.scale),e.moveTo(new _c(i.x,i.y))}getInflaterForType(t){var e;return this.inflaters.has(t)?null!=(e=this.inflaters.get(t))?e:null:(e=r(zl.FLYOUT_INFLATER,t))?(e=new e,this.inflaters.set(t,e),e):null}getFocusableElement(){throw Error("Flyouts are not directly focusable.")}getFocusableTree(){throw Error("Flyouts are not directly focusable.")}onNodeFocus(){}onNodeBlur(){}canBeFocused(){return!1}getRootFocusableNode(){throw Error("Flyouts are not directly focusable.")}getRestoredFocusableNode(t){throw Error("Flyouts are not directly focusable.")}getNestedTrees(){throw Error("Flyouts are not directly focusable.")}lookUpFocusableNode(t){throw Error("Flyouts are not directly focusable.")}onTreeFocus(t,e){}onTreeBlur(t){throw Error("Flyouts are not directly focusable.")}},Yp=class{constructor(){this.isActive=!1,this.activeClassName="blocklyKeyboardNavigation"}setIsActive(t=!0){this.isActive=t,this.updateActiveVisualization()}getIsActive(){return this.isActive}updateActiveVisualization(){this.isActive?document.body.classList.add(this.activeClassName):document.body.classList.remove(this.activeClassName)}},Kp=new Yp,jp={};jp.KeyboardNavigationController=Yp,jp.keyboardNavigationController=Kp;var Jp=class{constructor(t){this.workspace=t,this.horizontalScrollEnabled=this.workspace.isMovableHorizontally(),this.verticalScrollEnabled=this.workspace.isMovableVertically(),this.startScrollXY_=new _c(t.scrollX,t.scrollY)}startDrag(){}endDrag(t){this.drag(t)}drag(t){if(t=_c.sum(this.startScrollXY_,t),this.horizontalScrollEnabled&&this.verticalScrollEnabled)this.workspace.scroll(t.x,t.y);else if(this.horizontalScrollEnabled)this.workspace.scroll(t.x,this.workspace.scrollY);else{if(!this.verticalScrollEnabled)throw new TypeError("Invalid state.");this.workspace.scroll(this.workspace.scrollX,t.y)}}},qp=class{constructor(t,e){this.creatorWorkspace=e,this.mouseDownXY=new _c(0,0),this.startWorkspace_=this.targetBlock=this.startComment=this.startBlock=this.startIcon=this.startField=this.startBubble=null,this.hasExceededDragRadius=!1,this.boundEvents=[],this.workspaceDragger=this.dragger=null,this.dragging=!1,this.flyout=null,this.multiTouch=this.isEnding_=this.gestureHasStarted=this.calledUpdateIsDragging=!1,this.cachedPoints=new Map,this.startDistance=this.previousScale=0,this.currentDropdownOwner=this.isPinchZoomEnabled=null,this.mostRecentEvent=t,this.currentDragDeltaXY=new _c(0,0)}dispose(){d(),Bi(),this.creatorWorkspace.clearGesture();for(const t of this.boundEvents)E(t);this.boundEvents.length=0}updateFromEvent(t){const e=new _c(t.clientX,t.clientY);this.updateDragDelta(e)&&(this.updateIsDragging(t),u()),this.mostRecentEvent=t}updateDragDelta(t){return this.currentDragDeltaXY=_c.difference(t,this.mouseDownXY),!this.hasExceededDragRadius&&(this.hasExceededDragRadius=_c.magnitude(this.currentDragDeltaXY)>(this.flyout?Hl.config$$module$build$src$core$config.flyoutDragRadius:Hl.config$$module$build$src$core$config.dragRadius))}updateIsDraggingFromFlyout(){let t;if(!this.targetBlock||null==(t=this.flyout)||!t.isBlockCreatable(this.targetBlock))return!1;if(!this.flyout.targetWorkspace)throw Error("Cannot update dragging from the flyout because the ' +\n 'flyout's target workspace is undefined");return this.startWorkspace_=this.flyout.targetWorkspace,this.startWorkspace_.updateScreenCalculationsIfScrolled(),Hl.getGroup$$module$build$src$core$events$utils()||Hl.setGroup$$module$build$src$core$events$utils(!0),this.startBlock=null,this.targetBlock=this.flyout.createBlock(this.targetBlock),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this.targetBlock),!0}updateIsDraggingWorkspace(){if(!this.startWorkspace_)throw Error("Cannot update dragging the workspace because the start workspace is undefined");(this.flyout?this.flyout.isScrollable():this.startWorkspace_&&this.startWorkspace_.isDraggable())&&(this.dragging=!0,this.workspaceDragger=new Jp(this.startWorkspace_),this.workspaceDragger.startDrag())}updateIsDragging(t){if(!this.startWorkspace_)throw Error("Cannot update dragging because the start workspace is undefined");if(this.calledUpdateIsDragging)throw Error("updateIsDragging_ should only be called once per gesture.");this.calledUpdateIsDragging=!0,this.flyout&&this.updateIsDraggingFromFlyout();const e=Nt();e&&ir(e)&&e.isMovable()?(this.dragging=!0,this.dragger=this.createDragger(e,this.startWorkspace_),this.dragger.onDragStart(t),this.dragger.onDrag(t,this.currentDragDeltaXY)):this.updateIsDraggingWorkspace()}createDragger(t,e){return new(c(zl.BLOCK_DRAGGER,this.creatorWorkspace.options,!0))(t,e)}doStart(t){if(!this.startWorkspace_)throw Error("Cannot start the touch gesture becauase the start workspace is undefined");this.isPinchZoomEnabled=this.startWorkspace_.options.zoomOptions&&this.startWorkspace_.options.zoomOptions.pinch,b(t)?this.cancel():(this.gestureHasStarted=!0,Gn(),this.startWorkspace_.updateScreenCalculationsIfScrolled(),this.startWorkspace_.isMutator&&this.startWorkspace_.resize(),this.currentDropdownOwner=Js(),this.startWorkspace_.hideChaff(!!this.flyout),this.startWorkspace_.markFocused(),this.mostRecentEvent=t,Pi(),f(t)?this.handleRightClick(t):("pointerdown"===t.type.toLowerCase()&&"mouse"!==t.pointerType&&h(t,this),this.mouseDownXY=new _c(t.clientX,t.clientY),this.bindMouseEvents(t),this.isEnding_||this.handleTouchStart(t)))}bindMouseEvents(t){this.boundEvents.push(T(document,"pointerdown",null,this.handleStart.bind(this),!0)),this.boundEvents.push(T(document,"pointermove",null,this.handleMove.bind(this),!0)),this.boundEvents.push(T(document,"pointerup",null,this.handleUp.bind(this),!0)),this.boundEvents.push(T(document,"pointercancel",null,this.handleUp.bind(this),!0)),t.preventDefault(),t.stopPropagation()}handleStart(t){this.isDragging()||(this.handleTouchStart(t),this.isMultiTouch()&&u())}handleMove(t){this.isDragging()&&p(t)||!this.isMultiTouch()?(this.updateFromEvent(t),this.workspaceDragger?this.workspaceDragger.drag(this.currentDragDeltaXY):this.dragger&&this.dragger.onDrag(this.mostRecentEvent,this.currentDragDeltaXY),t.preventDefault(),t.stopPropagation()):this.isMultiTouch()&&(this.handleTouchMove(t),u())}handleUp(t){if(this.isDragging()||this.handleTouchEnd(t),!this.isMultiTouch()||this.isDragging()){if(!p(t))return;if(this.updateFromEvent(t),u(),this.isEnding_)return void console.log("Trying to end a gesture recursively.");this.isEnding_=!0,this.dragger?(Kp.setIsActive(!1),this.dragger.onDragEnd(t,this.currentDragDeltaXY)):this.workspaceDragger?(Kp.setIsActive(!1),this.workspaceDragger.endDrag(this.currentDragDeltaXY)):this.isBubbleClick()||this.isCommentClick()||(this.isFieldClick()?this.doFieldClick():this.isIconClick()?this.doIconClick():this.isBlockClick()?this.doBlockClick():this.isWorkspaceClick()&&this.doWorkspaceClick(t))}t.preventDefault(),t.stopPropagation(),this.dispose()}handleTouchStart(t){var e=g(t);this.cachedPoints.set(e,this.getTouchPoint(t));var s=Array.from(this.cachedPoints.keys());2===s.length&&(e=this.cachedPoints.get(s[0]),s=this.cachedPoints.get(s[1]),this.startDistance=_c.distance(e,s),this.multiTouch=!0,t.preventDefault())}handleTouchMove(t){const e=g(t);this.cachedPoints.set(e,this.getTouchPoint(t)),this.isPinchZoomEnabled&&2===this.cachedPoints.size?this.handlePinch(t):(this.updateFromEvent(t),this.workspaceDragger?this.workspaceDragger.drag(this.currentDragDeltaXY):this.dragger&&this.dragger.onDrag(this.mostRecentEvent,this.currentDragDeltaXY),t.preventDefault(),t.stopPropagation())}handlePinch(t){var e=Array.from(this.cachedPoints.keys()),s=this.cachedPoints.get(e[0]);if(e=this.cachedPoints.get(e[1]),s=_c.distance(s,e)/this.startDistance,this.previousScale>0&&this.previousScale<1/0){if(e=(e=s-this.previousScale)>0?5*e:6*e,!this.startWorkspace_)throw Error("Cannot handle a pinch because the start workspace is undefined");const i=this.startWorkspace_,o=$(t,i.getParentSvg(),i.getInverseScreenCTM());i.zoom(o.x,o.y,e)}this.previousScale=s,t.preventDefault()}handleTouchEnd(t){t=g(t),this.cachedPoints.has(t)&&this.cachedPoints.delete(t),this.cachedPoints.size<2&&(this.cachedPoints.clear(),this.previousScale=0)}getTouchPoint(t){return this.startWorkspace_?new _c(t.pageX,t.pageY):null}isMultiTouch(){return this.multiTouch}cancel(){this.isEnding_||(u(),this.dragger?this.dragger.onDragEnd(this.mostRecentEvent,this.currentDragDeltaXY):this.workspaceDragger&&this.workspaceDragger.endDrag(this.currentDragDeltaXY),this.dispose())}handleRightClick(t){const e=Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode();if(sr(e)){let s;null==(s=this.startWorkspace_)||s.hideChaff(!!this.flyout),e.showContextMenu(t)}t.preventDefault(),t.stopPropagation(),Kp.setIsActive(!1),this.dispose()}handleWsStart(t,e){if(this.gestureHasStarted)throw Error("Tried to call gesture.handleWsStart, but the gesture had already been started.");this.setStartWorkspace(e),this.mostRecentEvent=t,this.targetBlock||this.startBubble||this.startComment||this.startIcon||Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(e),this.doStart(t)}fireWorkspaceClick(t){J(new(rt(ua.CLICK))(null,t.id,"workspace"))}handleFlyoutStart(t,e){if(this.gestureHasStarted)throw Error("Tried to call gesture.handleFlyoutStart, but the gesture had already been started.");this.setStartFlyout(e),this.handleWsStart(t,e.getWorkspace())}handleBlockStart(t,e){if(this.gestureHasStarted)throw Error("Tried to call gesture.handleBlockStart, but the gesture had already been started.");this.setStartBlock(e),this.mostRecentEvent=t}handleBubbleStart(t,e){if(this.gestureHasStarted)throw Error("Tried to call gesture.handleBubbleStart, but the gesture had already been started.");this.setStartBubble(e),this.mostRecentEvent=t}handleCommentStart(t,e){if(this.gestureHasStarted)throw Error("Tried to call gesture.handleCommentStart, but the gesture had already been started.");this.setStartComment(e),this.mostRecentEvent=t}doFieldClick(){if(!this.startField)throw Error("Cannot do a field click because the start field is undefined");this.currentDropdownOwner!==this.startField&&this.startField.showEditor(this.mostRecentEvent)}doIconClick(){if(!this.startIcon)throw Error("Cannot do an icon click because the start icon is undefined");this.startIcon.onClick()}doBlockClick(){if(this.flyout&&this.flyout.autoClose){if(!this.targetBlock)throw Error("Cannot do a block click because the target block is undefined");if(this.flyout.isBlockCreatable(this.targetBlock)){Hl.getGroup$$module$build$src$core$events$utils()||Hl.setGroup$$module$build$src$core$events$utils(!0);var t=this.flyout.createBlock(this.targetBlock);t.snapToGrid(),t.bumpNeighbours(),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(t)}}else{if(!this.startWorkspace_)throw Error("Cannot do a block click because the start workspace is undefined");t=new(rt(ua.CLICK))(this.startBlock,this.startWorkspace_.id,"block"),J(t)}Hl.setGroup$$module$build$src$core$events$utils(!1)}doWorkspaceClick(t){this.fireWorkspaceClick(this.startWorkspace_||this.creatorWorkspace)}setStartField(t){if(this.gestureHasStarted)throw Error("Tried to call gesture.setStartField, but the gesture had already been started.");this.startField||(this.startField=t)}setStartIcon(t){if(this.gestureHasStarted)throw Error("Tried to call gesture.setStartIcon, but the gesture had already been started.");this.startIcon||(this.startIcon=t)}setStartBubble(t){this.startBubble||(this.startBubble=t)}setStartComment(t){this.startComment||(this.startComment=t)}setStartBlock(t){this.startBlock||this.startBubble||this.startIcon||(this.startBlock=t,t.isInFlyout&&t!==t.getRootBlock()?this.setTargetBlock(t.getRootBlock()):this.setTargetBlock(t))}setTargetBlock(t){t.isShadow()?this.setTargetBlock(t.getParent()):(this.targetBlock=t,Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this.targetBlock),this.targetBlock.bringToFront())}setStartWorkspace(t){this.startWorkspace_||(this.startWorkspace_=t)}setStartFlyout(t){this.flyout||(this.flyout=t)}isBubbleClick(){return!!this.startBubble&&!this.hasExceededDragRadius}isCommentClick(){return!!this.startComment&&!this.hasExceededDragRadius}isBlockClick(){return!(!this.startBlock||this.hasExceededDragRadius||this.isFieldClick()||this.isIconClick())}isFieldClick(){return!!this.startField&&this.startField.isClickable()&&!this.hasExceededDragRadius&&(!this.flyout||this.startField.isClickableInFlyout(this.flyout.autoClose))}isIconClick(){if(!this.startIcon)return!1;const t=!this.flyout||!this.startIcon.isClickableInFlyout||this.startIcon.isClickableInFlyout(this.flyout.autoClose);return!this.hasExceededDragRadius&&t}isWorkspaceClick(){return!(this.startBlock||this.startBubble||this.startField||this.hasExceededDragRadius)}getCurrentDragger(){let t,e;return null!=(e=null!=(t=this.workspaceDragger)?t:this.dragger)?e:null}isDragging(){return this.dragging}hasStarted(){return this.gestureHasStarted}static inProgress(){const t=yt();for(let e,s=0;e=t[s];s++)if(e.currentGesture_)return!0;return!1}},Zp=class{constructor(t,e){let s,i,o;this.pattern=t,this.scale=1,this.spacing=null!=(s=e.spacing)?s:0,this.length=null!=(i=e.length)?i:1,this.line2=(this.line1=t.firstChild)&&this.line1.nextSibling,this.snapToGrid=null!=(o=e.snap)&&o}setSpacing(t){this.spacing=t,this.update(this.scale)}getSpacing(){return this.spacing}setLength(t){this.length=t,this.update(this.scale)}getLength(){return this.length}setSnapToGrid(t){this.snapToGrid=t}shouldSnap(){return this.snapToGrid}getPatternId(){return this.pattern.id}update(t){this.scale=t;var e=this.spacing*t;this.pattern.setAttribute("width",`${e}`),this.pattern.setAttribute("height",`${e}`);let s=(e=Math.floor(this.spacing/2)+.5)-this.length/2,i=e+this.length/2;e*=t,s*=t,i*=t,this.setLineAttributes(this.line1,t,s,i,e,e),this.setLineAttributes(this.line2,t,e,e,s,i)}setLineAttributes(t,e,s,i,o,n){t&&(t.setAttribute("stroke-width",`${e}`),t.setAttribute("x1",`${s}`),t.setAttribute("y1",`${o}`),t.setAttribute("x2",`${i}`),t.setAttribute("y2",`${n}`))}moveTo(t,e){this.pattern.setAttribute("x",`${t}`),this.pattern.setAttribute("y",`${e}`)}alignXY(t){var e=this.getSpacing();const s=e/2,i=Math.round(Math.round((t.x-s)/e)*e+s);return e=Math.round(Math.round((t.y-s)/e)*e+s),i===t.x&&e===t.y?t:new _c(i,e)}static createDom(t,e,s,i){let o,n;if(t=at(Tc.PATTERN,{id:"blocklyGridPattern"+t,patternUnits:"userSpaceOnUse"},s),(null!=(o=e.length)?o:1)>0&&(null!=(n=e.spacing)?n:0)>0){let s;at(Tc.LINE,{stroke:e.colour},t),null!=(s=e.length)&&s&&at(Tc.LINE,{stroke:e.colour},t)}else at(Tc.LINE,{},t);return i&&i.style.setProperty("--blocklyGridPattern",`url(#${t.id})`),t}},Qp=class{constructor(t){this.workspace=t,this.layers=new Map,(t=t.getInjectionDiv())&&(this.dragLayer=this.createDragLayer(t),this.animationLayer=this.createAnimationLayer(t)),t=this.createLayer(nd),ct(t,"blocklyBlockCanvas"),t=this.createLayer(rd),ct(t,"blocklyBubbleCanvas")}createDragLayer(t){const e=at(Tc.SVG,{class:"blocklyBlockDragSurface",xmlns:Pa,"xmlns:html":Ba,"xmlns:xlink":Fa,version:"1.1"});return t.append(e),at(Tc.G,{},e)}createAnimationLayer(t){const e=at(Tc.SVG,{class:"blocklyAnimationLayer",xmlns:Pa,"xmlns:html":Ba,"xmlns:xlink":Fa,version:"1.1"});return t.append(e),at(Tc.G,{},e)}appendToAnimationLayer(t){let e;const s=null==(e=this.dragLayer)?void 0:e.getAttribute("transform");if(s){let t;null==(t=this.animationLayer)||t.setAttribute("transform",s)}let i;null==(i=this.animationLayer)||i.appendChild(t.getSvgRoot())}translateLayers(t,e){let s;t=`translate(${t.x}, ${t.y}) scale(${e})`,null==(s=this.dragLayer)||s.setAttribute("transform",t);for(const[,e]of this.layers)e.setAttribute("transform",t)}moveToDragLayer(t,e=!0){let s;null==(s=this.dragLayer)||s.appendChild(t.getSvgRoot()),e&&t.canBeFocused()&&Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(t)}moveOffDragLayer(t,e,s=!0){this.append(t,e),s&&t.canBeFocused()&&Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(t)}append(t,e){let s;if(this.layers.has(e)||this.createLayer(e),t=t.getSvgRoot(),(null==(s=this.layers.get(e))?void 0:s.lastChild)!==t){let s;null==(s=this.layers.get(e))||s.appendChild(t)}}createLayer(t){const e=this.workspace.getSvgGroup(),s=at(Tc.G,{});let i=!1;const o=[...this.layers].sort((t,e)=>t[0]-e[0]);for(const[n,r]of o)if(t{let e;return t instanceof Ep&&!(null!=(e=t.outputConnection)&&e.targetBlock())||t instanceof fd},!0))&&this.setCurNode(t),t):null}in(){var t=this.getCurNode();return t?((t=this.getNextNode(t,()=>!0,!0))&&this.setCurNode(t),t):null}prev(){var t=this.getCurNode();return t?((t=this.getPreviousNode(t,t=>{let e;return t instanceof Ep&&!(null!=(e=t.outputConnection)&&e.targetBlock())||t instanceof fd},!0))&&this.setCurNode(t),t):null}out(){var t=this.getCurNode();return t?((t=this.getPreviousNode(t,()=>!0,!0))&&this.setCurNode(t),t):null}atEndOfLine(){var t=this.getCurNode();return!!t&&this.getNextNode(t,()=>!0,!0)===this.getNextNode(t,t=>{let e;return t instanceof Ep&&!(null!=(e=t.outputConnection)&&e.targetBlock())},!0)}getNextNodeImpl(t,e,s=new Set){if(!t||s.has(t))return null;let i=this.workspace.getNavigator().getFirstChild(t)||this.workspace.getNavigator().getNextSibling(t);for(var o=t;o&&!i&&(o=this.workspace.getNavigator().getParent(o));)i=this.workspace.getNavigator().getNextSibling(o);return e(i)?i:i?(s.add(t),this.getNextNodeImpl(i,e,s)):null}getNextNode(t,e,s){return!t||!s&&this.getLastNode()===t?null:this.getNextNodeImpl(t,e)}getPreviousNodeImpl(t,e,s=new Set){if(!t||s.has(t))return null;const i=this.getRightMostChild(this.workspace.getNavigator().getPreviousSibling(t),t)||this.workspace.getNavigator().getParent(t);return e(i)?i:i?(s.add(t),this.getPreviousNodeImpl(i,e,s)):null}getPreviousNode(t,e,s){return!t||!s&&this.getFirstNode()===t?null:this.getPreviousNodeImpl(t,e)}getRightMostChild(t,e){if(!t)return t;let s=this.workspace.getNavigator().getFirstChild(t);if(!s||s===e)return t;for(t=s;t&&t!==e;t=this.workspace.getNavigator().getNextSibling(s))s=t;return this.getRightMostChild(s,e)}preDelete(t){var e,s=this.getCurNode();let i,o;s=s?[s]:[];const n=null!=(o=null==(e=t.previousConnection)?void 0:e.targetConnection)?o:null==(i=t.outputConnection)?void 0:i.targetConnection;n&&s.push(n),(e=t.getNextBlock())&&s.push(e),(t=t.getParent())&&s.push(t),s.push(this.workspace),this.potentialNodes=s}postDelete(){const t=this.potentialNodes;if(this.potentialNodes=null,!t)throw Error("must call preDelete first");for(const e of t){let t;if(null==(t=this.getSourceBlockFromNode(e))||!t.disposed)return void this.setCurNode(e)}throw Error("no valid nodes in this.potentialNodes")}getCurNode(){return Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode()}setCurNode(t){Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(t)}getFirstNode(){return this.workspace.getNavigator().getFirstChild(this.workspace)}getLastNode(){const t=this.getFirstNode();return this.getPreviousNode(t,()=>!0,!0)}};t(zl.CURSOR,Xl,eg);var sg=class{constructor(t){this.workspace=t,this.markers=new Map,this.cursor=new eg(this.workspace)}registerMarker(t,e){this.markers.has(t)&&this.unregisterMarker(t),this.markers.set(t,e)}unregisterMarker(t){const e=this.markers.get(t);if(!e)throw Error("Marker with ID "+t+" does not exist. Can only unregister markers that exist.");e.dispose(),this.markers.delete(t)}getCursor(){return this.cursor}getMarker(t){return this.markers.get(t)||null}setCursor(t){this.cursor=t}dispose(){const t=Object.keys(this.markers);for(let e,s=0;e=t[s];s++)this.unregisterMarker(e);this.markers.clear(),this.cursor.dispose()}};sg.LOCAL_MARKER="local_marker_1";var ig={};ig.CommentIcon=Pp,ig.Icon=xd,ig.IconType=Kh,ig.MutatorIcon=Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon,ig.WarningIcon=mp,ig.exceptions=Jd,ig.registry=xp,Hl.Names$$module$build$src$core$names=class{constructor(t,e){this.db=new Map,this.dbReverse=new Set,this.variableMap=null,this.variablePrefix=e||"",this.reservedWords=new Set(t?t.split(","):[])}reset(){this.db.clear(),this.dbReverse.clear(),this.variableMap=null}setVariableMap(t){this.variableMap=t}getNameForUserVariable(t){return this.variableMap?(t=this.variableMap.getVariableById(t))?t.getName():null:(console.warn("Deprecated call to Names.prototype.getName without defining a variable map. To fix, add the following code in your generator's init() function:\nBlockly.YourGeneratorName.nameDB_.setVariableMap(workspace.getVariableMap());"),null)}populateVariables(t){t=Hl.allUsedVarModels$$module$build$src$core$variables(t);for(let e=0;e=1}isHat(t){return(t.type&this.HAT)>=1}isIcon(t){return(t.type&this.ICON)>=1}isSpacer(t){return(t.type&this.SPACER)>=1}isInRowSpacer(t){return(t.type&this.IN_ROW_SPACER)>=1}isSpacerRow(t){return(t.type&this.BETWEEN_ROW_SPACER)>=1}isInput(t){return(t.type&this.INPUT)>=1}isExternalInput(t){return(t.type&this.EXTERNAL_VALUE_INPUT)>=1}isInlineInput(t){return(t.type&this.INLINE_INPUT)>=1}isStatementInput(t){return(t.type&this.STATEMENT_INPUT)>=1}isPreviousConnection(t){return(t.type&this.PREVIOUS_CONNECTION)>=1}isNextConnection(t){return(t.type&this.NEXT_CONNECTION)>=1}isPreviousOrNextConnection(t){return this.isPreviousConnection(t)||this.isNextConnection(t)}isRoundCorner(t){return(t.type&this.LEFT_ROUND_CORNER)>=1||(t.type&this.RIGHT_ROUND_CORNER)>=1}isLeftRoundedCorner(t){return this.isRoundCorner(t)&&(t.type&this.LEFT_ROUND_CORNER)>=1}isRightRoundedCorner(t){return this.isRoundCorner(t)&&(t.type&this.RIGHT_ROUND_CORNER)>=1}isLeftSquareCorner(t){return(t.type&this.LEFT_SQUARE_CORNER)>=1}isRightSquareCorner(t){return(t.type&this.RIGHT_SQUARE_CORNER)>=1}isCorner(t){return(t.type&this.CORNER)>=1}isJaggedEdge(t){return(t.type&this.JAGGED_EDGE)>=1}isRow(t){return(t.type&this.ROW)>=1}isBetweenRowSpacer(t){return(t.type&this.BETWEEN_ROW_SPACER)>=1}isTopRow(t){return(t.type&this.TOP_ROW)>=1}isBottomRow(t){return(t.type&this.BOTTOM_ROW)>=1}isTopOrBottomRow(t){return this.isTopRow(t)||this.isBottomRow(t)}isInputRow(t){return(t.type&this.INPUT_ROW)>=1}},ag=class{constructor(t){this.centerline=this.xPos=this.height=this.width=0,this.constants_=t,this.type=lg.NONE,this.notchOffset=this.constants_.NOTCH_OFFSET_LEFT}},cg=class{constructor(t){this.elements=[],this.xPos=this.yPos=this.widthWithConnectedBlocks=this.minWidth=this.minHeight=this.width=this.height=0,this.hasStatement=this.hasExternalInput=!1,this.statementEdge=0,this.hasJaggedEdge=this.hasDummyInput=this.hasInlineInput=!1,this.align=null,this.constants_=t,this.type=lg.ROW,this.notchOffset=this.constants_.NOTCH_OFFSET_LEFT}getLastInput(){for(let t=this.elements.length-1;t>=0;t--){const e=this.elements[t];if(lg.isInput(e))return e}return null}measure(){throw Error("Unexpected attempt to measure a base Row.")}startsWithElemSpacer(){return!0}endsWithElemSpacer(){return!0}getFirstSpacer(){for(let t=0;t=0;t--){const e=this.elements[t];if(lg.isInRowSpacer(e))return e}return null}},hg=class extends cg{constructor(t){super(t),this.hasNextConnection=!1,this.connection=null,this.baseline=this.descenderHeight=0,this.type|=lg.BOTTOM_ROW}hasLeftSquareCorner(t){return!!t.outputConnection||!!t.getNextBlock()}hasRightSquareCorner(t){return!0}measure(){let t=0,e=0,s=0;for(let i=0;irect,`,`${t} .blocklyEditableField>rect {`,`fill: ${this.FIELD_BORDER_RECT_COLOUR};`,"fill-opacity: .6;","stroke: none;","}",`${t} .blocklyNonEditableField>text,`,`${t} .blocklyEditableField>text {`,"fill: #000;","}",`${t} .blocklyFlyoutLabelText {`,"fill: #000;","}",`${t} .blocklyText.blocklyBubbleText {`,"fill: #000;","}",`${t} .blocklyEditableField:not(.blocklyEditing):hover>rect {`,"stroke: #fff;","stroke-width: 2;","}",`${t} .blocklyHtmlInput {`,`font-family: ${this.FIELD_TEXT_FONTFAMILY};`,`font-weight: ${this.FIELD_TEXT_FONTWEIGHT};`,"}",`${t} .blocklySelected>.blocklyPath {`,"stroke: #fc3;","stroke-width: 3px;","}",`${t} .blocklyHighlightedConnectionPath {`,"stroke: #fc3;","}",`${t} .blocklyReplaceable .blocklyPath {`,"fill-opacity: .5;","}",`${t} .blocklyReplaceable .blocklyPathLight,`,`${t} .blocklyReplaceable .blocklyPathDark {`,"display: none;","}",`${t} .blocklyInsertionMarker>.blocklyPath {`,`fill-opacity: ${this.INSERTION_MARKER_OPACITY};`,"stroke: none;","}"]}},vg={};vg.ConstantProvider=Ag,vg.isDynamicShape=br,vg.isNotch=$r,vg.isPuzzleTab=fr;var Ng=class{constructor(t,e){this.inlinePath_=this.outlinePath_="",this.block_=t,this.info_=e,this.topLeft_=t.getRelativeToSurfaceXY(),this.constants_=e.getRenderer().getConstants()}draw(){this.drawOutline_(),this.drawInternals_(),this.updateConnectionHighlights(),this.block_.pathObject.setPath(this.outlinePath_+"\n"+this.inlinePath_),this.info_.RTL&&this.block_.pathObject.flipRTL(),this.recordSizeOnBlock_()}recordSizeOnBlock_(){this.block_.height=this.info_.height,this.block_.width=this.info_.widthWithChildren,this.block_.childlessWidth=this.info_.width}drawOutline_(){this.drawTop_();for(let t=1;t0&&this.addAlignmentPadding_(e,t),lg.isTopOrBottomRow(e)&&(e.widthWithConnectedBlocks=e.width)}}getDesiredRowWidth_(t){return this.width-this.startX}addAlignmentPadding_(t,e){const s=t.getFirstSpacer(),i=t.getLastSpacer();if((t.hasExternalInput||t.hasStatement)&&(t.widthWithConnectedBlocks+=e),t.align===Hl.Align$$module$build$src$core$inputs$align.LEFT&&i)i.width+=e;else if(t.align===Hl.Align$$module$build$src$core$inputs$align.CENTRE&&s&&i)s.width+=e/2,i.width+=e/2;else if(t.align===Hl.Align$$module$build$src$core$inputs$align.RIGHT&&s)s.width+=e;else{if(!i)return;i.width+=e}t.width+=e}alignStatementRow_(t){const e=t.getLastInput();if(e){var s=t.width-e.width,i=this.statementEdge;(s=i-s)>0&&this.addAlignmentPadding_(t,s),s=t.width,i=this.getDesiredRowWidth_(t),e.width+=i-s,e.height=Math.max(e.height,t.height),t.width+=i-s,t.widthWithConnectedBlocks=Math.max(t.width,this.statementEdge+t.connectedBlockWidths)}}addRowSpacing_(){const t=this.rows;this.rows=[];for(let e=0;e=0;e--)s[e].element===t&&s.splice(e,1);s.length||this.componentDB.delete(e)}}dispose(){this.subscribedWorkspaces.length=0,this.componentDB.clear()}},Pg="VARIABLE_DYNAMIC",Bg={CATEGORY_NAME:Pg};Bg.flyoutCategory=Ar,Bg.flyoutCategoryBlocks=Nr,Bg.internalFlyoutCategory=kr,Bg.onCreateVariableButtonClick_Colour=Or,Bg.onCreateVariableButtonClick_Number=yr,Bg.onCreateVariableButtonClick_String=Rr;var Fg=class{canConnect(t,e,s,i){return this.canConnectWithReason(t,e,s,i)===Kd.CAN_CONNECT}canConnectWithReason(t,e,s,i){const o=this.doSafetyChecks(t,e);return o!==Kd.CAN_CONNECT?o:this.doTypeChecks(t,e)?s&&!this.doDragChecks(t,e,i||0)?Kd.REASON_DRAG_CHECKS_FAILED:Kd.CAN_CONNECT:Kd.REASON_CHECKS_FAILED}getErrorMessage(t,e,s){switch(t){case Kd.REASON_SELF_CONNECTION:return"Attempted to connect a block to itself.";case Kd.REASON_DIFFERENT_WORKSPACES:return"Blocks not on same workspace.";case Kd.REASON_WRONG_TYPE:return"Attempt to connect incompatible types.";case Kd.REASON_TARGET_NULL:return"Target connection is null.";case Kd.REASON_CHECKS_FAILED:return"Connection checks failed. "+e+" expected "+e.getCheck()+", found "+s.getCheck();case Kd.REASON_SHADOW_PARENT:return"Connecting non-shadow to shadow block.";case Kd.REASON_DRAG_CHECKS_FAILED:return"Drag checks failed.";case Kd.REASON_PREVIOUS_AND_OUTPUT:return"Block would have an output and a previous connection.";default:return"Unknown connection failure: this should never happen!"}}doSafetyChecks(t,e){if(!t||!e)return Kd.REASON_TARGET_NULL;let s,i,o;return t.isSuperior()?(s=t.getSourceBlock(),i=e.getSourceBlock(),o=e):(i=t.getSourceBlock(),s=e.getSourceBlock(),o=t,t=e),s===i?Kd.REASON_SELF_CONNECTION:o.type!==Zd[t.type]?Kd.REASON_WRONG_TYPE:s.workspace!==i.workspace?Kd.REASON_DIFFERENT_WORKSPACES:s.isShadow()&&!i.isShadow()?Kd.REASON_SHADOW_PARENT:o.type===Vd.OUTPUT_VALUE&&i.previousConnection&&i.previousConnection.isConnected()||o.type===Vd.PREVIOUS_STATEMENT&&i.outputConnection&&i.outputConnection.isConnected()?Kd.REASON_PREVIOUS_AND_OUTPUT:Kd.CAN_CONNECT}doTypeChecks(t,e){if(t=t.getCheck(),e=e.getCheck(),!t||!e)return!0;for(let s=0;ss||e.getSourceBlock().isInsertionMarker())return!1;switch(e.type){case Vd.PREVIOUS_STATEMENT:return this.canConnectToPrevious_(t,e);case Vd.OUTPUT_VALUE:if(e.isConnected()&&!e.targetBlock().isInsertionMarker()||t.isConnected())return!1;break;case Vd.INPUT_VALUE:if(e.isConnected()&&!e.targetBlock().isMovable()&&!e.targetBlock().isShadow())return!1;break;case Vd.NEXT_STATEMENT:if(e.isConnected()&&!t.getSourceBlock().nextConnection&&!e.targetBlock().isShadow()&&e.targetBlock().nextConnection||e.targetBlock()&&!e.targetBlock().isMovable()&&!e.targetBlock().isShadow())return!1;break;default:return!1}return!Qa.includes(e)}canConnectToPrevious_(t,e){return!(t.targetConnection||Qa.includes(e)||e.targetConnection&&(!(t=e.targetBlock()).isInsertionMarker()||t.getPreviousBlock()))}};t(zl.CONNECTION_CHECKER,Xl,Fg);var Ug=class{get isFlyout(){return this.internalIsFlyout}get isMutator(){return this.internalIsMutator}constructor(t){this.isClearing=this.internalIsMutator=this.internalIsFlyout=this.rendered=!1,this.MAX_UNDO=1024,this.connectionDBList=[],this.topBlocks=[],this.topComments=[],this.commentDB=new Map,this.listeners=[],this.undoStack_=[],this.redoStack_=[],this.blockDB=new Map,this.typedBlocksDB=new Map,this.procedureMap=new rg,this.readOnly=!1,this.potentialVariableMap=null,this.id=S(),Ot(this),this.options=t||new wd({}),this.RTL=!!this.options.RTL,this.horizontalLayout=!!this.options.horizontalLayout,this.toolboxPosition=this.options.toolboxPosition,this.connectionChecker=new(c(zl.CONNECTION_CHECKER,this.options,!0))(this),this.variableMap=new(this.getVariableMapClass())(this),this.setIsReadOnly(this.options.readOnly)}dispose(){this.listeners.length=0,this.clear(),kt(this)}sortObjects(t,e){const s=t=>({getBoundingRectangle:()=>{const e=t.getRelativeToSurfaceXY();return new mc(e.y,e.y,e.x,e.x)},moveBy:()=>{}});return this.sortByOrigin(s(t),s(e))}sortByOrigin(t,e){const s=Math.sin(Xs(Ug.SCAN_ANGLE))*(this.RTL?-1:1);return t=t.getBoundingRectangle().getOrigin(),e=e.getBoundingRectangle().getOrigin(),t.y+s*t.x-(e.y+s*e.x)}addTopBlock(t){this.topBlocks.push(t)}removeTopBlock(t){if(!Gt(this.topBlocks,t))throw Error("Block not present in workspace's list of top-most blocks.")}getTopBlocks(t=!1){const e=[].concat(this.topBlocks);return t&&e.length>1&&e.sort(this.sortObjects.bind(this)),e}addTypedBlock(t){this.typedBlocksDB.has(t.type)||this.typedBlocksDB.set(t.type,[]),this.typedBlocksDB.get(t.type).push(t)}removeTypedBlock(t){Gt(this.typedBlocksDB.get(t.type),t),this.typedBlocksDB.get(t.type).length||this.typedBlocksDB.delete(t.type)}getBlocksByType(t,e=!1){return this.typedBlocksDB.has(t)?(t=this.typedBlocksDB.get(t).slice(0),e&&t&&t.length>1&&t.sort(this.sortObjects.bind(this)),t.filter(t=>!t.isInsertionMarker())):[]}addTopComment(t){this.topComments.push(t),this.commentDB.has(t.id)&&console.warn('Overriding an existing comment on this workspace, with id "'+t.id+'"'),this.commentDB.set(t.id,t)}removeTopComment(t){if(!Gt(this.topComments,t))throw Error("Comment not present in workspace's list of top-most comments.");this.commentDB.delete(t.id)}getTopComments(t=!1){const e=[].concat(this.topComments);return t&&e.length>1&&e.sort(this.sortObjects.bind(this)),e}getAllBlocks(t=!1){if(t){var e=this.getTopBlocks(!0);t=[];for(let s=0;s!t.isInsertionMarker())}clear(){this.isClearing=!0;try{const t=Hl.getGroup$$module$build$src$core$events$utils();for(t||Hl.setGroup$$module$build$src$core$events$utils(!0);this.topBlocks.length;)this.topBlocks[0].dispose(!1);for(;this.topComments.length;)this.topComments[this.topComments.length-1].dispose();Hl.setGroup$$module$build$src$core$events$utils(t),this.isFlyout||this.variableMap.clear(),this.potentialVariableMap&&this.potentialVariableMap.clear()}finally{this.isClearing=!1}}renameVariableById(t,e){Qe("Blockly.Workspace.renameVariableById","v12","v13","Blockly.Workspace.getVariableMap().renameVariable"),(t=this.variableMap.getVariableById(t))&&this.variableMap.renameVariable(t,e)}createVariable(t,e,s){return Qe("Blockly.Workspace.createVariable","v12","v13","Blockly.Workspace.getVariableMap().createVariable"),this.variableMap.createVariable(t,null!=e?e:void 0,null!=s?s:void 0)}getVariableUsesById(t){return Qe("Blockly.Workspace.getVariableUsesById","v12","v13","Blockly.Variables.getVariableUsesById"),fs(this,t)}deleteVariableById(t){Qe("Blockly.Workspace.deleteVariableById","v12","v13","Blockly.Workspace.getVariableMap().deleteVariable");const e=this.variableMap.getVariableById(t);e?Hl.deleteVariable$$module$build$src$core$variables(this,e):console.warn(`Can't delete non-existent variable: ${t}`)}getVariable(t,e){return Qe("Blockly.Workspace.getVariable","v12","v13","Blockly.Workspace.getVariableMap().getVariable"),this.variableMap.getVariable(t,e)}getVariableById(t){return Qe("Blockly.Workspace.getVariableById","v12","v13","Blockly.Workspace.getVariableMap().getVariableById"),this.variableMap.getVariableById(t)}getVariablesOfType(t){return Qe("Blockly.Workspace.getVariablesOfType","v12","v13","Blockly.Workspace.getVariableMap().getVariablesOfType"),this.variableMap.getVariablesOfType(null!=t?t:"")}getAllVariables(){return Qe("Blockly.Workspace.getAllVariables","v12","v13","Blockly.Workspace.getVariableMap().getAllVariables"),this.variableMap.getAllVariables()}getAllVariableNames(){return Qe("Blockly.Workspace.getAllVariableNames","v12","v13","Blockly.Workspace.getVariableMap().getAllVariables"),this.variableMap.getAllVariables().map(t=>t.getName())}getWidth(){return 0}newBlock(t,e){throw Error("The implementation of newBlock should be monkey-patched in by blockly.ts")}newComment(t){throw Error("The implementation of newComment should be monkey-patched in by blockly.ts")}remainingCapacity(){return isNaN(this.options.maxBlocks)?1/0:this.options.maxBlocks-this.getAllBlocks(!1).length}remainingCapacityOfType(t){return this.options.maxInstances?(void 0!==this.options.maxInstances[t]?this.options.maxInstances[t]:1/0)-this.getBlocksByType(t,!1).length:1/0}isCapacityAvailable(t){if(!this.hasBlockLimits())return!0;let e=0;for(const s in t){if(t[s]>this.remainingCapacityOfType(s))return!1;e+=t[s]}return!(e>this.remainingCapacity())}hasBlockLimits(){return this.options.maxBlocks!==1/0||!!this.options.maxInstances}getUndoStack(){return this.undoStack_}getRedoStack(){return this.redoStack_}undo(t){var e=t?this.redoStack_:this.undoStack_,s=t?this.undoStack_:this.redoStack_;const i=e.pop();if(i){for(var o=[i];e.length&&i.group&&i.group===e[e.length-1].group;){const t=e.pop();t&&o.push(t)}for(e=0;ethis.MAX_UNDO&&this.MAX_UNDO>=0;)this.undoStack_.shift();for(let e=0;e{s.sounds.set(e,t)})}})}play(t,e){const s=this;return(0,Fl.asyncExecutePromiseGeneratorFunction)(function*(){if(!s.muted&&0!==e&&s.context){var i=s.sounds.get(t);if(i){const t=new Date;if(!(null!==s.lastSound&&t.getTime()-s.lastSound.getTime()<100)){s.lastSound=t,"suspended"===s.context.state&&(yield s.context.resume());var o=s.context.createBufferSource(),n=s.context.createGain();n.gain.value=null!=e?e:1,n.connect(s.context.destination),o.buffer=i,o.connect(n),o.addEventListener("ended",()=>{o.disconnect(),n.disconnect()}),o.start()}}else s.parentWorkspace&&s.parentWorkspace.getAudioManager().play(t,e)}})}setMuted(t){this.muted=t}getMuted(){return this.muted}},Gg=class extends Ug{constructor(t){let e;super(t),this.resizeHandlerWrapper=null,this.resizesEnabled=this.visible=this.rendered=!0,this.startScrollY=this.startScrollX=this.scrollY=this.scrollX=0,this.oldScale=this.scale=1,this.oldLeft=this.oldTop=0,this.inverseScreenCTM=this.targetWorkspace=this.dummyWheelListener=this.configureContextMenu=this.lastRecordedPageScroll=this.injectionDiv=this.currentGesture_=this.toolbox=this.flyout=this.scrollbar=this.trashcan=null,this.inverseScreenCTMDirty=!0,this.highlightedBlocks=[],this.toolboxCategoryCallbacks=new Map,this.flyoutButtonCallbacks=new Map,this.cachedParentSvg=null,this.keyboardMoveInProgress=this.keyboardAccessibilityMode=!1,this.topBoundedElements=[],this.dragTargetAreas=[],this.zoomControls_=this.layerManager=null,this.navigator=new Hp,this.metricsManager=new(c(zl.METRICS_MANAGER,t,!0))(this),this.getMetrics=t.getMetrics||this.metricsManager.getMetrics.bind(this.metricsManager),this.setMetrics=t.setMetrics||Gg.setTopLevelWorkspaceMetrics,this.componentManager=new cc,this.connectionDBList=Xd.init(this.connectionChecker),this.audioManager=new Hg(t.parentWorkspace),this.grid=this.options.gridPattern?new Zp(this.options.gridPattern,t.gridOptions):null,this.markerManager=new sg(this),Bh&&ts&&this.registerToolboxCategoryCallback(Dh,ts),Bg&&kr&&this.registerToolboxCategoryCallback(Pg,kr),ng&&dr&&(this.registerToolboxCategoryCallback(og,dr),this.addChangeListener(_r)),this.addChangeListener(this.variableChangeCallback.bind(this)),this.themeManager_=this.options.parentWorkspace?this.options.parentWorkspace.getThemeManager():new xg(this,this.options.theme||Nd),this.themeManager_.subscribeWorkspace(this),this.renderer=Sr(this.options.renderer||"geras",this.getTheme(),null!=(e=this.options.rendererOverrides)?e:void 0),this.cachedParentSvgSize=new Ec(0,0)}getMarkerManager(){return this.markerManager}getMetricsManager(){return this.metricsManager}setMetricsManager(t){this.metricsManager=t,this.getMetrics=this.metricsManager.getMetrics.bind(this.metricsManager)}getComponentManager(){return this.componentManager}getMarker(t){return this.markerManager.getMarker(t)}getCursor(){return this.markerManager.getCursor()}getRenderer(){return this.renderer}getThemeManager(){return this.themeManager_}getTheme(){return this.themeManager_.getTheme()}setTheme(t){t||(t=Nd),this.themeManager_.setTheme(t)}refreshTheme(){if(this.svgGroup_){var t=null===this.options.parentWorkspace;this.renderer.refreshDom(this.svgGroup_,this.getTheme(),t?this.getInjectionDiv():void 0)}this.updateBlockStyles(this.getAllBlocks(!1).filter(t=>!!t.getStyleName())),this.refreshToolboxSelection(),this.toolbox&&this.toolbox.refreshTheme(),this.isVisible()&&this.setVisible(!0),t=new(rt(ua.THEME_CHANGE))(this.getTheme().name,this.id),J(t)}updateBlockStyles(t){for(let e,s=0;e=t[s];s++){const t=e.getStyleName();t&&e.setStyle(t)}}getInverseScreenCTM(){if(this.inverseScreenCTMDirty){const t=this.getParentSvg().getScreenCTM();t&&(this.inverseScreenCTM=t.inverse(),this.inverseScreenCTMDirty=!1)}return this.inverseScreenCTM}updateInverseScreenCTM(){this.inverseScreenCTMDirty=!0}isVisible(){return this.visible}getSvgXY(t){let e=0,s=0,i=1;(this.getCanvas().contains(t)||this.getBubbleCanvas().contains(t))&&(i=this.scale);do{const o=te(t);t!==this.getCanvas()&&t!==this.getBubbleCanvas()||(i=1),e+=o.x*i,s+=o.y*i,t=t.parentNode}while(t&&t!==this.getParentSvg()&&t!==this.getInjectionDiv());return new _c(e,s)}getCachedParentSvgSize(){const t=this.cachedParentSvgSize;return new Ec(t.width,t.height)}getOriginOffsetInPixels(){return ee(this.getCanvas())}getInjectionDiv(){if(!this.injectionDiv){let t=this.svgGroup_;for(;t;){if((" "+(t.getAttribute("class")||"")+" ").includes(" injectionDiv ")){this.injectionDiv=t;break}t=t.parentNode}}return this.injectionDiv}getSvgGroup(){return this.svgGroup_}getBlockCanvas(){return this.getCanvas()}setResizeHandlerWrapper(t){this.resizeHandlerWrapper=t}createDom(t,e){return this.injectionDiv||(this.injectionDiv=null!=e?e:null),this.svgGroup_=at(Tc.G,{class:"blocklyWorkspace",id:this.id}),e&&Ne(this.svgGroup_,Qc.LABEL,Hl.Msg$$module$build$src$core$msg.WORKSPACE_ARIA_LABEL),t&&(this.svgBackground_=at(Tc.RECT,{height:"100%",width:"100%",class:t},this.svgGroup_),"blocklyMainBackground"===t&&this.grid?this.svgBackground_.style.fill="var(--blocklyGridPattern)":this.themeManager_.subscribe(this.svgBackground_,"workspaceBackgroundColour","fill")),this.layerManager=new Qp(this),this.svgBlockCanvas_=this.layerManager.getBlockLayer(),this.svgBubbleCanvas_=this.layerManager.getBubbleLayer(),this.isFlyout||(T(this.svgGroup_,"pointerdown",this,this.onMouseDown,!1),this.dummyWheelListener=()=>{},document.body.addEventListener("wheel",this.dummyWheelListener,{passive:!0}),T(this.svgGroup_,"wheel",this,this.onMouseWheel,!1,{passive:!1})),this.options.hasCategories&&(this.toolbox=new(c(zl.TOOLBOX,this.options,!0))(this)),this.grid&&this.grid.update(this.scale),this.recordDragTargets(),(t=c(zl.CURSOR,this.options))&&this.markerManager.setCursor(new t(this)),t=null===this.options.parentWorkspace,this.renderer.createDom(this.svgGroup_,this.getTheme(),t?this.getInjectionDiv():void 0),Hl.getFocusManager$$module$build$src$core$focus_manager().registerTree(this,!!this.injectionDiv||this.isFlyout),this.svgGroup_}dispose(){if(this.rendered=!1,this.currentGesture_&&this.currentGesture_.cancel(),this.svgGroup_&&pt(this.svgGroup_),this.toolbox&&(this.toolbox.dispose(),this.toolbox=null),this.flyout&&(this.flyout.dispose(),this.flyout=null),this.trashcan&&(this.trashcan.dispose(),this.trashcan=null),this.scrollbar&&(this.scrollbar.dispose(),this.scrollbar=null),this.zoomControls_&&this.zoomControls_.dispose(),this.audioManager&&this.audioManager.dispose(),this.grid&&(this.grid=null),this.renderer.dispose(),this.markerManager.dispose(),super.dispose(),this.themeManager_&&(this.themeManager_.unsubscribeWorkspace(this),this.themeManager_.unsubscribe(this.svgBackground_),this.options.parentWorkspace||this.themeManager_.dispose()),this.connectionDBList.length=0,this.toolboxCategoryCallbacks.clear(),this.flyoutButtonCallbacks.clear(),!this.options.parentWorkspace){const t=this.getParentSvg();t&&t.parentNode&&pt(t.parentNode)}this.resizeHandlerWrapper&&(E(this.resizeHandlerWrapper),this.resizeHandlerWrapper=null),this.dummyWheelListener&&(document.body.removeEventListener("wheel",this.dummyWheelListener),this.dummyWheelListener=null),Hl.getFocusManager$$module$build$src$core$focus_manager().isRegistered(this)&&Hl.getFocusManager$$module$build$src$core$focus_manager().unregisterTree(this)}addTrashcan(){this.trashcan=Gg.newTrashcan(this);const t=this.trashcan.createDom();this.svgGroup_.insertBefore(t,this.getCanvas())}static newTrashcan(t){throw Error("The implementation of newTrashcan should be monkey-patched in by blockly.ts")}addZoomControls(){this.zoomControls_=new Xc(this);const t=this.zoomControls_.createDom();this.svgGroup_.appendChild(t)}copyOptionsForFlyout(){return new wd({parentWorkspace:this,rtl:this.RTL,oneBasedIndex:this.options.oneBasedIndex,horizontalLayout:this.horizontalLayout,renderer:this.options.renderer,rendererOverrides:this.options.rendererOverrides,plugins:this.options.plugins,modalInputs:this.options.modalInputs,move:{scrollbars:!0}})}addFlyout(t){const e=this.copyOptionsForFlyout();return e.toolboxPosition=this.options.toolboxPosition,this.flyout=this.horizontalLayout?new(c(zl.FLYOUTS_HORIZONTAL_TOOLBOX,this.options,!0))(e):new(c(zl.FLYOUTS_VERTICAL_TOOLBOX,this.options,!0))(e),this.flyout.autoClose=!1,this.flyout.getWorkspace().setVisible(!0),this.flyout.createDom(t)}getFlyout(t){return this.flyout||t?this.flyout:this.toolbox?this.toolbox.getFlyout():null}getToolbox(){return this.toolbox}updateScreenCalculations(){this.updateInverseScreenCTM(),this.recordDragTargets()}resizeContents(){this.resizesEnabled&&this.rendered&&(this.scrollbar&&this.scrollbar.resize(),this.updateInverseScreenCTM())}resize(){this.toolbox?this.toolbox.position():this.flyout&&this.flyout.position();const t=this.componentManager.getComponents(cc.Capability.POSITIONABLE,!0),e=this.getMetricsManager().getUiMetrics(),s=[];for(let i,o=0;i=t[o];o++){i.position(e,s);const t=i.getBoundingRectangle();t&&s.push(t)}this.scrollbar&&this.scrollbar.resize(),this.updateScreenCalculations()}updateScreenCalculationsIfScrolled(){const t=ie();_c.equals(this.lastRecordedPageScroll,t)||(this.lastRecordedPageScroll=t,this.updateScreenCalculations())}getLayerManager(){return this.layerManager}getCanvas(){return this.layerManager.getBlockLayer()}setCachedParentSvgSize(t,e){const s=this.getParentSvg();null!=t&&(this.cachedParentSvgSize.width=t,s.setAttribute("data-cached-width",`${t}`)),null!=e&&(this.cachedParentSvgSize.height=e,s.setAttribute("data-cached-height",`${e}`))}getBubbleCanvas(){return this.layerManager.getBubbleLayer()}getParentSvg(){if(!this.cachedParentSvg){let t=this.svgGroup_;for(;t;){if("svg"===t.tagName){this.cachedParentSvg=t;break}t=t.parentNode}}return this.cachedParentSvg}maybeFireViewportChangeEvent(){if(st()){var t=this.scale,e=-this.scrollY,s=-this.scrollX;if(!(t===this.oldScale&&Math.abs(e-this.oldTop)<1&&Math.abs(s-this.oldLeft)<1)){var i=new(rt(ua.VIEWPORT_CHANGE))(e,s,t,this.id,this.oldScale);this.oldScale=t,this.oldTop=e,this.oldLeft=s,J(i)}}}translate(t,e){let s,i;null==(s=this.layerManager)||s.translateLayers(new _c(t,e),this.scale),null==(i=this.grid)||i.moveTo(t,e),this.maybeFireViewportChangeEvent()}getWidth(){const t=this.getMetrics();return t?t.viewWidth/this.scale:0}setVisible(t){this.visible=t,this.svgGroup_&&(this.scrollbar&&this.scrollbar.setContainerVisible(t),this.getFlyout()&&this.getFlyout().setContainerVisible(t),this.getParentSvg().style.display=t?"block":"none",this.toolbox&&this.toolbox.setVisible(t),t||this.hideChaff(!0))}render(){const t=this.getAllBlocks(!1);for(let e=t.length-1;e>=0;e--)t[e].queueRender();this.getTopBlocks().flatMap(t=>t.getDescendants(!1)).filter(t=>t.isInsertionMarker()).forEach(t=>t.queueRender())}highlightBlock(t,e){if(void 0===e){for(let t,e=0;t=this.highlightedBlocks[e];e++)t.setHighlighted(!1);this.highlightedBlocks.length=0}(t=t?this.getBlockById(t):null)&&((e=void 0===e||e)?this.highlightedBlocks.includes(t)||this.highlightedBlocks.push(t):Gt(this.highlightedBlocks,t),t.setHighlighted(e))}variableChangeCallback(t){switch(t.type){case ua.VAR_CREATE:case ua.VAR_DELETE:case ua.VAR_RENAME:case ua.VAR_TYPE_CHANGE:this.refreshToolboxSelection()}}refreshToolboxSelection(){const t=this.isFlyout?this.targetWorkspace:this;t&&!t.currentGesture_&&t.toolbox&&t.toolbox.getFlyout()&&t.toolbox.refreshSelection()}recordDragTargets(){const t=this.componentManager.getComponents(cc.Capability.DRAG_TARGET,!0);this.dragTargetAreas=[];for(let e,s=0;e=t[s];s++){const t=e.getClientRect();t&&this.dragTargetAreas.push({component:e,clientRect:t})}}newBlock(t,e){throw Error("The implementation of newBlock should be monkey-patched in by blockly.ts")}newComment(t){throw Error("The implementation of newComment should be monkey-patched in by blockly.ts")}getDragTarget(t){for(let e,s=0;e=this.dragTargetAreas[s];s++)if(e.clientRect.contains(t.clientX,t.clientY))return e.component;return null}onMouseDown(t){const e=this.getGesture(t);e&&e.handleWsStart(t,this)}startDrag(t,e){vo(this,t,e)}moveDrag(t){return No(this,t)}setKeyboardMoveInProgress(t){this.keyboardMoveInProgress=t}isDragging(){return this.keyboardMoveInProgress||null!==this.currentGesture_&&this.currentGesture_.isDragging()}isDraggable(){return this.options.moveOptions&&this.options.moveOptions.drag}isMovable(){return this.options.moveOptions&&!!this.options.moveOptions.scrollbars||this.options.moveOptions&&this.options.moveOptions.wheel||this.options.moveOptions&&this.options.moveOptions.drag||this.options.zoomOptions&&this.options.zoomOptions.wheel||this.options.zoomOptions&&this.options.zoomOptions.pinch}isMovableHorizontally(){const t=!!this.scrollbar;return this.isMovable()&&(!t||t&&this.scrollbar.canScrollHorizontally())}isMovableVertically(){const t=!!this.scrollbar;return this.isMovable()&&(!t||t&&this.scrollbar.canScrollVertically())}onMouseWheel(t){if(qp.inProgress())t.preventDefault(),t.stopPropagation();else{var e=this.options.zoomOptions&&this.options.zoomOptions.wheel,s=this.options.moveOptions&&this.options.moveOptions.wheel;if(e||s){var i=I(t);if(ma)var o=t.metaKey;e&&(t.ctrlKey||o||!s)?(i=-i.y/50,e=$(t,this.getParentSvg(),this.getInverseScreenCTM()),this.zoom(e.x,e.y,i)):(e=this.scrollX-i.x,s=this.scrollY-i.y,t.shiftKey&&!i.x&&(e=this.scrollX-i.y,s=this.scrollY),this.scroll(e,s)),t.preventDefault()}}}getBlocksBoundingBox(){const t=this.getTopBoundedElements();if(!t.length)return new mc(0,0,0,0);const e=t[0].getBoundingRectangle();for(let i=1;ie.bottom&&(e.bottom=s.bottom),s.lefte.right&&(e.right=s.right))}return e}cleanUp(){this.setResizesEnabled(!1);const t=Hl.getGroup$$module$build$src$core$events$utils();t||Hl.setGroup$$module$build$src$core$events$utils(!0);var e=this.getTopBlocks(!0),s=e.filter(t=>t.isMovable());const i=e.filter(t=>!t.isMovable()).map(t=>t.getBoundingRectangle());e=function(t){for(const e of i)if(t.intersects(e))return e;return null};var o=0;const n=this.renderer.getConstants().MIN_BLOCK_HEIGHT;for(const t of s){for(s=t.getBoundingRectangle(),t.moveBy(-s.left,o-s.top,["cleanup"]),t.snapToGrid(),o=e(s=t.getBoundingRectangle());null!=o;)o=o.top+o.getHeight()+n,t.moveBy(0,o-s.top,["cleanup"]),t.snapToGrid(),o=e(s=t.getBoundingRectangle());o=t.getRelativeToSurfaceXY().y+t.getHeightWidth().height+n}Hl.setGroup$$module$build$src$core$events$utils(t),this.setResizesEnabled(!0)}showContextMenu(t){if(!this.isReadOnly()&&!this.isFlyout){var e=sd.registry.getContextMenuOptions({workspace:this,focusedNode:this},t);this.configureContextMenu&&this.configureContextMenu(e,t);var s=t instanceof PointerEvent?new _c(t.clientX,t.clientY):ne(this,new _c(5,5));$o(t,e,this.RTL,this,s)}}updateToolbox(t){if(t=ce(t)){if(!this.options.languageTree)throw Error("Existing toolbox is null. Can't create new toolbox.");if(de(t)){if(!this.toolbox)throw Error("Existing toolbox has no categories. Can't change mode.");this.options.languageTree=t,this.toolbox.render(t)}else{if(!this.flyout)throw Error("Existing toolbox has categories. Can't change mode.");this.options.languageTree=t,this.flyout.show(t)}}else if(this.options.languageTree)throw Error("Can't nullify an existing toolbox.")}markFocused(){this.options.parentWorkspace?this.options.parentWorkspace.markFocused():(vt(this),this.getParentSvg().focus({preventScroll:!0}))}zoom(t,e,s){s=Math.pow(this.options.zoomOptions.scaleSpeed,s);const i=this.scale*s;if(this.scale!==i){i>this.options.zoomOptions.maxScale?s=this.options.zoomOptions.maxScale/this.scale:ithis.options.zoomOptions.maxScale?t=this.options.zoomOptions.maxScale:this.options.zoomOptions.minScale&&t{if(t.isFlyout){let e;const s=null==(e=t.targetWorkspace)?void 0:e.getFlyout();if(s instanceof zp)return s.getFlyoutScale()}return t.getScale()},e=(s,i)=>s.options.parentWorkspace&&s.options.parentWorkspace.getSvgGroup().contains(s.getSvgGroup())?e(s.options.parentWorkspace,i*t(s)):i*t(s);return e(this,1)}scroll(t,e){this.hideChaff(!0);const s=this.getMetrics();t=Math.min(t,-s.scrollLeft),e=Math.min(e,-s.scrollTop);const i=s.scrollTop+Math.max(0,s.scrollHeight-s.viewHeight);t=Math.max(t,-(s.scrollLeft+Math.max(0,s.scrollWidth-s.viewWidth))),e=Math.max(e,-i),this.scrollX=t,this.scrollY=e,this.scrollbar&&this.scrollbar.set(-(t+s.scrollLeft),-(e+s.scrollTop),!1),t+=s.absoluteLeft,e+=s.absoluteTop,this.translate(t,e)}getBlockById(t){return super.getBlockById(t)}getAllBlocks(t=!1){return super.getAllBlocks(t)}getTopBlocks(t=!1){return super.getTopBlocks(t)}addTopBlock(t){this.addTopBoundedElement(t),super.addTopBlock(t)}removeTopBlock(t){this.removeTopBoundedElement(t),super.removeTopBlock(t)}addTopComment(t){this.addTopBoundedElement(t),super.addTopComment(t)}removeTopComment(t){this.removeTopBoundedElement(t),super.removeTopComment(t)}getTopComments(t=!1){return super.getTopComments(t)}getCommentById(t){return super.getCommentById(t)}getRootWorkspace(){return super.getRootWorkspace()}addTopBoundedElement(t){this.topBoundedElements.push(t)}removeTopBoundedElement(t){Gt(this.topBoundedElements,t)}getTopBoundedElements(t=!1){const e=[].concat(this.topBoundedElements);return t&&e.sort(this.sortByOrigin.bind(this)),e}setResizesEnabled(t){const e=!this.resizesEnabled&&t;this.resizesEnabled=t,e&&this.resizeContents()}clear(){this.setResizesEnabled(!1),super.clear(),this.topBoundedElements=[],this.setResizesEnabled(!0)}registerButtonCallback(t,e){if("function"!=typeof e)throw TypeError("Button callbacks must be functions.");this.flyoutButtonCallbacks.set(t,e)}getButtonCallback(t){let e;return null!=(e=this.flyoutButtonCallbacks.get(t))?e:null}removeButtonCallback(t){this.flyoutButtonCallbacks.delete(t)}registerToolboxCategoryCallback(t,e){if("function"!=typeof e)throw TypeError("Toolbox category callbacks must be functions.");this.toolboxCategoryCallbacks.set(t,e)}getToolboxCategoryCallback(t){return this.toolboxCategoryCallbacks.get(t)||null}removeToolboxCategoryCallback(t){this.toolboxCategoryCallbacks.delete(t)}getGesture(t){if(this.keyboardMoveInProgress)return null==t||t.preventDefault(),null==t||t.stopPropagation(),null;const e="pointerdown"===(null==t?void 0:t.type);let s;return e&&null!=(s=this.currentGesture_)&&s.hasStarted()&&(console.warn("Tried to start the same gesture twice."),this.currentGesture_.cancel()),!this.currentGesture_&&e&&(this.currentGesture_=new qp(t,this)),this.currentGesture_}clearGesture(){this.currentGesture_=null}cancelCurrentGesture(){this.currentGesture_&&this.currentGesture_.cancel()}getAudioManager(){return this.audioManager}getGrid(){return this.grid}hideChaff(t=!1){xi(),uo(this),pi(),this.hideComponents(t)}hideComponents(t=!1){this.getComponentManager().getComponents(cc.Capability.AUTOHIDEABLE,!0).forEach(e=>e.autoHide(t))}static setTopLevelWorkspaceMetrics(t){const e=this.getMetrics();"number"==typeof t.x&&(this.scrollX=-(e.scrollLeft+(e.scrollWidth-e.viewWidth)*t.x)),"number"==typeof t.y&&(this.scrollY=-(e.scrollTop+(e.scrollHeight-e.viewHeight)*t.y)),this.translate(this.scrollX+e.absoluteLeft,this.scrollY+e.absoluteTop)}addClass(t){this.injectionDiv&&ct(this.injectionDiv,t)}removeClass(t){this.injectionDiv&&ut(this.injectionDiv,t)}setIsReadOnly(t){super.setIsReadOnly(t),t?this.addClass("blocklyReadOnly"):this.removeClass("blocklyReadOnly")}scrollBoundsIntoView(t,e=10){if(!qp.inProgress()){var s=this.getScale(),i=this.getMetricsManager().getViewMetrics(!0);if(i=new mc(i.top,i.top+i.height,i.left,i.left+i.width),!(t.left>=i.left&&t.top>=i.top&&t.right<=i.right&&t.bottom<=i.bottom)){(t=t.clone()).top-=e,t.bottom+=e,t.left-=e,t.right+=e;var o=e=0;t.lefti.right&&(e=this.RTL?i.right-t.right:Math.max(i.right-t.right,i.left-t.left)),t.topi.bottom&&(o=Math.max(i.bottom-t.bottom,i.top-t.top)),this.scroll(this.scrollX+e*s,this.scrollY+o*s)}}}getFocusableElement(){return this.svgGroup_}getFocusableTree(){return this.isMutator&&this.options.parentWorkspace||this}onNodeFocus(){}onNodeBlur(){}canBeFocused(){return!0}getRootFocusableNode(){return this}getRestoredFocusableNode(t){if(t)return null;let e,s;if(t=null==(e=this.targetWorkspace)?void 0:e.getFlyout(),this.isFlyout&&t){let e,s;return null!=(s=null==(e=t.getContents().find(t=>(t=t.getElement(),It(t)&&t.canBeFocused())))?void 0:e.getElement())?s:null}return null!=(s=this.getTopBlocks(!0)[0])?s:null}getNestedTrees(){const t=this.getAllBlocks().map(t=>t.getIcons()).flat().filter(t=>t instanceof Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon&&t.bubbleIsVisible()).map(t=>{let e;return null==(e=t.getBubble())?void 0:e.getWorkspace()}).filter(t=>!!t),e=this.getFlyout(!0);return e&&t.push(e.getWorkspace()),t}searchForWorkspaceComment(t){for(const e of this.getTopComments())if(e instanceof fd&&e.canBeFocused()&&e.getFocusableElement().id===t)return e}lookUpFocusableNode(t){var e;const s=null==(e=this.targetWorkspace)?void 0:e.getFlyout();if(this.isFlyout&&s)for(var i of s.getContents())if(e=i.getElement(),It(e)&&e.canBeFocused()&&e.getFocusableElement().id===t)return e;if(i=t.indexOf("_field_"),e=t.indexOf("_connection_"),-1!==i){var o=t.substring(0,i);if(o=this.getBlockById(o))for(var n of o.getFields())if(n.canBeFocused()&&n.getFocusableElement().id===t)return n;return null}if(-1!==e){if(o=t.substring(0,e),o=this.getBlockById(o))for(const e of o.getConnections_(!0))if(e.id===t)return e;return null}var r;if(-1!==(n=Math.max(t.indexOf(gd),t.indexOf(dd),t.indexOf(Td)))&&(n=t.substring(0,n),n=this.searchForWorkspaceComment(n)))return t.indexOf(gd)>-1?n.getEditorFocusableNode():null!=(r=n.view.getCommentBarButtons().find(e=>e.getFocusableElement().id.includes(t)))?r:null;if((r=this.getAllBlocks(!1).find(e=>e.getFocusableElement().id===t))||(r=this.searchForWorkspaceComment(t)))return r;for(o of r=this.getAllBlocks().map(t=>t.getIcons()).flat()){if(o.canBeFocused()&&o.getFocusableElement().id===t)return o;if(Ws(o)){if((r=o.getBubble())&&r.canBeFocused()&&r.getFocusableElement().id===t)return r;if(r instanceof Wd&&r.getEditor().getFocusableElement().id===t)return r.getEditor()}}return null}onTreeFocus(t,e){}onTreeBlur(t){if(this.isFlyout&&this.targetWorkspace&&!Hl.getFocusManager$$module$build$src$core$focus_manager().ephemeralFocusTaken()){var e=this.targetWorkspace.getToolbox();e&&t===e||or(e)&&e.autoHide(!1)}}getNavigator(){return this.navigator}setNavigator(t){this.navigator=t}},Vg={};Vg.WorkspaceSvg=Gg,Vg.resizeSvgContents=wr;var Wg=class extends ic{constructor(t){super(),this.isBlank=!0,this.isBlank=void 0===t,t&&(this.varId=t.getId(),this.workspaceId=t.getWorkspace().id)}toJson(){const t=super.toJson();if(!this.varId)throw Error("The var ID is undefined. Either pass a variable to the constructor, or call fromJson");return t.varId=this.varId,t}static fromJson(t,e,s){return(e=ic.fromJson(t,e,null!=s?s:new Wg)).varId=t.varId,e}},Xg=class extends Wg{constructor(t){super(t),this.type=ua.VAR_CREATE,t&&(this.varType=t.getType(),this.varName=t.getName())}toJson(){const t=super.toJson();if(void 0===this.varType)throw Error("The var type is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.varName)throw Error("The var name is undefined. Either pass a variable to the constructor, or call fromJson");return t.varType=this.varType,t.varName=this.varName,t}static fromJson(t,e,s){return(e=Wg.fromJson(t,e,null!=s?s:new Xg)).varType=t.varType,e.varName=t.varName,e}run(t){var e=this.getEventWorkspace_();if(!this.varId)throw Error("The var ID is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.varName)throw Error("The var name is undefined. Either pass a variable to the constructor, or call fromJson");e=e.getVariableMap(),t?e.createVariable(this.varName,this.varType,this.varId):(t=e.getVariableById(this.varId))&&e.deleteVariable(t)}};t(zl.EVENT,ua.VAR_CREATE,Xg);var zg=class{constructor(t,e,s,i){this.workspace=t,this.name=e,this.type=s||"",this.id=i||S()}getId(){return this.id}getName(){return this.name}setName(t){return this.name=t,this}getType(){return this.type}setType(t){return this.type=t,this}getWorkspace(){return this.workspace}save(){const t={name:this.getName(),id:this.getId()},e=this.getType();return e&&(t.type=e),t}static load(t,e){t=new this(e,t.name,t.type,t.id),e.getVariableMap().addVariable(t),J(new(rt(ua.VAR_CREATE))(t))}};t(zl.VARIABLE_MODEL,Xl,zg);var Yg=class extends Wg{constructor(t){super(t),this.type=ua.VAR_DELETE,t&&(this.varType=t.getType(),this.varName=t.getName())}toJson(){const t=super.toJson();if(void 0===this.varType)throw Error("The var type is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.varName)throw Error("The var name is undefined. Either pass a variable to the constructor, or call fromJson");return t.varType=this.varType,t.varName=this.varName,t}static fromJson(t,e,s){return(e=Wg.fromJson(t,e,null!=s?s:new Yg)).varType=t.varType,e.varName=t.varName,e}run(t){var e=this.getEventWorkspace_();if(!this.varId)throw Error("The var ID is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.varName)throw Error("The var name is undefined. Either pass a variable to the constructor, or call fromJson");e=e.getVariableMap(),t?(t=e.getVariableById(this.varId))&&e.deleteVariable(t):e.createVariable(this.varName,this.varType,this.varId)}};t(zl.EVENT,ua.VAR_DELETE,Yg);var Kg=class extends Wg{constructor(t,e){super(t),this.type=ua.VAR_RENAME,t&&(this.oldName=t.getName(),this.newName=void 0===e?"":e)}toJson(){const t=super.toJson();if(!this.oldName)throw Error("The old var name is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.newName)throw Error("The new var name is undefined. Either pass a value to the constructor, or call fromJson");return t.oldName=this.oldName,t.newName=this.newName,t}static fromJson(t,e,s){return(e=Wg.fromJson(t,e,null!=s?s:new Kg)).oldName=t.oldName,e.newName=t.newName,e}run(t){var e=this.getEventWorkspace_();if(!this.varId)throw Error("The var ID is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.oldName)throw Error("The old var name is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.newName)throw Error("The new var name is undefined. Either pass a value to the constructor, or call fromJson");const s=(e=e.getVariableMap()).getVariableById(this.varId);t?s&&e.renameVariable(s,this.newName):s&&e.renameVariable(s,this.oldName)}};t(zl.EVENT,ua.VAR_RENAME,Kg);var jg=class{constructor(t,e=!1){this.workspace=t,this.potentialMap=e,this.variableMap=new Map}clear(){for(const t of this.variableMap.values())for(const e of t.values())this.deleteVariable(e);if(0!==this.variableMap.size)throw Error("Non-empty variable map")}renameVariable(t,e){if(t.getName()===e)return t;var s=t.getType();s=this.getVariable(e,s);const i=this.workspace.getAllBlocks(!1);let o="";this.potentialMap||(o=Hl.getGroup$$module$build$src$core$events$utils())||Hl.setGroup$$module$build$src$core$events$utils(!0);try{s&&s.getId()!==t.getId()?this.renameVariableWithConflict(t,e,s,i):this.renameVariableAndUses(t,e,i)}finally{this.potentialMap||Hl.setGroup$$module$build$src$core$events$utils(o)}return t}changeVariableType(t,e){const s=t.getType();if(s===e)return t;var i=this.variableMap.get(s);let o;return null==i||i.delete(t.getId()),0===(null==i?void 0:i.size)&&this.variableMap.delete(s),t.setType(e),(i=null!=(o=this.variableMap.get(e))?o:new Map).set(t.getId(),t),this.variableMap.has(e)||this.variableMap.set(e,i),J(new(rt(ua.VAR_TYPE_CHANGE))(t,s,e)),t}renameVariableById(t,e){Qe("VariableMap.renameVariableById","v12","v13","VariableMap.renameVariable");const s=this.getVariableById(t);if(!s)throw Error("Tried to rename a variable that didn't exist. ID: "+t);this.renameVariable(s,e)}renameVariableAndUses(t,e,s){for(this.potentialMap||J(new(rt(ua.VAR_RENAME))(t,e)),t.setName(e),e=0;eHl.Names$$module$build$src$core$names.equals(e.getName(),t)))?s:null}getVariableById(t){for(const e of this.variableMap.values())if(e.has(t)){let s;return null!=(s=e.get(t))?s:null}return null}getVariablesOfType(t){return(t=this.variableMap.get(t||""))?[...t.values()]:[]}getTypes(){return[...this.variableMap.keys()]}getAllVariables(){let t=[];for(const e of this.variableMap.values())t=t.concat(...e.values());return t}getAllVariableNames(){Qe("VariableMap.getAllVariableNames","v12","v13","Blockly.Variables.getAllVariables");const t=[];for(const e of this.variableMap.values())for(const s of e.values())t.push(s.getName());return t}getVariableUsesById(t){return Qe("VariableMap.getVariableUsesById","v12","v13","Blockly.Variables.getVariableUsesById"),fs(this.workspace,t)}};t(zl.VARIABLE_MAP,Xl,jg);var Jg=class extends oc{constructor(t,e){super(e),this.type=ua.TRASHCAN_OPEN,this.isOpen=t}toJson(){const t=super.toJson();if(void 0===this.isOpen)throw Error("Whether this is already open or not is undefined. Either pass a value to the constructor, or call fromJson");return t.isOpen=this.isOpen,t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new Jg)).isOpen=t.isOpen,e}};t(zl.EVENT,ua.TRASHCAN_OPEN,Jg);var qg=class extends fp{constructor(t){super(),this.workspace=t,this.id="trashcan",this.contents=[],this.flyout=null,this.isLidOpen=!1,this.minOpenness=0,this.lidTask=this.svgLid=this.svgGroup=null,this.top=this.left=this.lidOpen=0,this.initialized=!1,this.workspace.options.maxTrashcanContents<=0||(t=this.workspace.copyOptionsForFlyout(),this.workspace.horizontalLayout?(t.toolboxPosition=this.workspace.toolboxPosition===Lc.TOP?Lc.BOTTOM:Lc.TOP,this.flyout=new(c(zl.FLYOUTS_HORIZONTAL_TOOLBOX,this.workspace.options,!0))(t)):(t.toolboxPosition=this.workspace.toolboxPosition===Lc.RIGHT?Lc.LEFT:Lc.RIGHT,this.flyout=new(c(zl.FLYOUTS_VERTICAL_TOOLBOX,this.workspace.options,!0))(t)),this.workspace.addChangeListener(this.onDelete.bind(this)))}createDom(){let t;this.svgGroup=at(Tc.G,{class:"blocklyTrash"});const e=String(Math.random()).substring(2);t=at(Tc.CLIPPATH,{id:"blocklyTrashBodyClipPath"+e},this.svgGroup),at(Tc.RECT,{width:Zg,height:Qg,y:t_},t);const s=at(Tc.IMAGE,{width:Gc,x:-o_,height:Vc,y:-n_,"clip-path":"url(#blocklyTrashBodyClipPath"+e+")"},this.svgGroup);return s.setAttributeNS(Fa,"xlink:href",this.workspace.options.pathToMedia+Wc),t=at(Tc.CLIPPATH,{id:"blocklyTrashLidClipPath"+e},this.svgGroup),at(Tc.RECT,{width:Zg,height:t_},t),this.svgLid=at(Tc.IMAGE,{width:Gc,x:-o_,height:Vc,y:-n_,"clip-path":"url(#blocklyTrashLidClipPath"+e+")"},this.svgGroup),this.svgLid.setAttributeNS(Fa,"xlink:href",this.workspace.options.pathToMedia+Wc),m(this.svgGroup,"pointerdown",this,this.blockMouseDownWhenOpenable),m(this.svgGroup,"pointerup",this,this.click),m(s,"pointerover",this,this.mouseOver),m(s,"pointerout",this,this.mouseOut),this.animateLid(),this.svgGroup}init(){if(this.workspace.options.maxTrashcanContents>0){const t=this.flyout.createDom(Tc.SVG);ct(t,"blocklyTrashcanFlyout"),gt(t,this.workspace.getParentSvg()),this.flyout.init(this.workspace)}this.workspace.getComponentManager().addComponent({component:this,weight:cc.ComponentWeight.TRASHCAN_WEIGHT,capabilities:[cc.Capability.AUTOHIDEABLE,cc.Capability.DELETE_AREA,cc.Capability.DRAG_TARGET,cc.Capability.POSITIONABLE]}),this.initialized=!0,this.setLidOpen(!1)}dispose(){this.workspace.getComponentManager().removeComponent("trashcan"),this.svgGroup&&pt(this.svgGroup),this.lidTask&&clearTimeout(this.lidTask)}hasContents(){return!!this.contents.length}contentsIsOpen(){return!!this.flyout&&this.flyout.isVisible()}openFlyout(){if(!this.contentsIsOpen()){var t=this.contents.map(function(t){return JSON.parse(t)}),e=this.workspace.getParentSvg().style;e.cursor="wait",setTimeout(()=>{let s,i;null==(s=this.flyout)||s.show(t),e.cursor="",null==(i=this.workspace.scrollbar)||i.setVisible(!1)},10),this.fireUiEvent(!0)}}closeFlyout(){var t,e;this.contentsIsOpen()&&(null==(t=this.flyout)||t.hide(),null==(e=this.workspace.scrollbar)||e.setVisible(!0),this.fireUiEvent(!1),this.workspace.recordDragTargets())}autoHide(t){!t&&this.flyout&&this.closeFlyout()}emptyContents(){this.hasContents()&&(this.contents.length=0,this.setMinOpenness(0),this.closeFlyout())}position(t,e){if(this.initialized){var s,i,o=fe(this.workspace,t);t=be(o,new Ec(Zg,Qg+t_),s_,e_,t,this.workspace),e=$e(t,e_,o.vertical===xc.TOP?Bc.DOWN:Bc.UP,e),this.top=e.top,this.left=e.left,null==(s=this.svgGroup)||s.setAttribute("transform","translate("+this.left+","+this.top+")"),null==(i=this.flyout)||i.position()}}getBoundingRectangle(){return new mc(this.top,this.top+Qg+t_,this.left,this.left+Zg)}getClientRect(){if(!this.svgGroup)return null;var t=this.svgGroup.getBoundingClientRect();const e=t.top+n_-i_;return t=t.left+o_-i_,new mc(e,e+t_+Qg+2*i_,t,t+Zg+2*i_)}onDragOver(t){this.setLidOpen(this.wouldDelete_)}onDragExit(t){this.setLidOpen(!1)}onDrop(t){setTimeout(this.setLidOpen.bind(this,!1),100)}setLidOpen(t){this.isLidOpen!==t&&(this.lidTask&&clearTimeout(this.lidTask),this.isLidOpen=t,this.animateLid())}animateLid(){const t=a_;var e=1/(t+1);this.lidOpen+=this.isLidOpen?e:-e,this.lidOpen=Math.min(Math.max(this.lidOpen,this.minOpenness),1),this.setLidAngle(this.lidOpen*u_),e=c_+this.lidOpen*(h_-c_),this.svgGroup&&(this.svgGroup.style.opacity=`${e}`),this.lidOpen>this.minOpenness&&this.lidOpen<1&&(this.lidTask=setTimeout(this.animateLid.bind(this),l_/t))}setLidAngle(t){const e=this.workspace.toolboxPosition===Lc.RIGHT||this.workspace.horizontalLayout&&this.workspace.RTL;let s;null==(s=this.svgLid)||s.setAttribute("transform","rotate("+(e?-t:t)+","+(e?4:Zg-4)+","+(t_-2)+")")}setMinOpenness(t){this.minOpenness=t,this.isLidOpen||this.setLidAngle(t*u_)}closeLid(){this.setLidOpen(!1)}click(){this.hasContents()&&!this.workspace.isDragging()&&this.openFlyout()}fireUiEvent(t){t=new(rt(ua.TRASHCAN_OPEN))(t,this.workspace.id),J(t)}blockMouseDownWhenOpenable(t){!this.contentsIsOpen()&&this.hasContents()&&t.stopPropagation()}mouseOver(){this.hasContents()&&this.setLidOpen(!0)}mouseOut(){this.setLidOpen(!1)}onDelete(t){if(!(this.workspace.options.maxTrashcanContents<=0||!y(t)||t.wasShadow)){if(!t.oldJson)throw Error("Encountered a delete event without proper oldJson");if(t=JSON.stringify(this.cleanBlockJson(t.oldJson)),!this.contents.includes(t)){for(this.contents.unshift(t);this.contents.length>this.workspace.options.maxTrashcanContents;)this.contents.pop();this.setMinOpenness(r_)}}}cleanBlockJson(t){return function t(e){if(e){if(delete e.id,delete e.x,delete e.y,delete e.enabled,delete e.disabledReasons,e.icons&&e.icons.comment){var s=e.icons.comment;delete s.height,delete s.width,delete s.pinned}for(var i in s=e.inputs){var o=s[i];const e=o.block;o=o.shadow,e&&t(e),o&&t(o)}e.next&&(e=(i=e.next).block,i=i.shadow,e&&t(e),i&&t(i))}}(t=JSON.parse(JSON.stringify(t))),Object.assign({},{kind:"BLOCK"},t)}},Zg=47,Qg=44,t_=16,e_=20,s_=20,i_=10,o_=0,n_=32,r_=.1,l_=80,a_=4,c_=.4,h_=.8,u_=45,d_=null,p_=null,g_=void 0,__={};__.BlockPaster=dp,__.copy=Lr,__.getLastCopiedData=Mr,__.getLastCopiedLocation=Br,__.getLastCopiedWorkspace=xr,__.paste=Ur,__.registry=Jc,__.setLastCopiedData=Dr,__.setLastCopiedLocation=Fr,__.setLastCopiedWorkspace=Pr;var T_,m_={};m_.CollapseCommentBarButton=pd,m_.CommentBarButton=ud,m_.CommentEditor=_d,m_.CommentView=Ed,m_.DeleteCommentBarButton=md,m_.RenderedWorkspaceComment=fd,m_.WorkspaceComment=bd,function(t){t.ESCAPE="escape",t.DELETE="delete",t.COPY="copy",t.CUT="cut",t.PASTE="paste",t.UNDO="undo",t.REDO="redo",t.MENU="menu"}(T_||(T_={})),Qr();var E_={};E_.names=T_,E_.registerCopy=Yr,E_.registerCut=Kr,E_.registerDefaultShortcuts=Qr,E_.registerDelete=Wr,E_.registerEscape=Vr,E_.registerPaste=jr,E_.registerRedo=qr,E_.registerShowContextMenu=Zr,E_.registerUndo=Jr;var b_={ProcedureSerializer:class{constructor(t,e){this.procedureModelClass=t,this.parameterModelClass=e,this.priority=75}save(t){return(t=t.getProcedureMap().getProcedures().map(t=>tl(t))).length?t:null}load(t,e){const s=e.getProcedureMap();for(const i of t)s.add(el(this.procedureModelClass,this.parameterModelClass,i,e))}clear(t){t.getProcedureMap().clear()}}};b_.loadProcedure=el,b_.saveProcedure=tl;var f_=class{constructor(){this.priority=100}save(t){return(t=t.getVariableMap().getAllVariables().map(t=>t.save())).length?t:null}load(t,e){const s=l(zl.VARIABLE_MODEL,Xl);t.forEach(t=>{null==s||s.load(t,e)})}clear(t){t.getVariableMap().clear()}};Ie("variables",new f_);var $_={};$_.VariableSerializer=f_;var I_={};I_.load=il,I_.save=sl;var C_={blocks:Yh,exceptions:Xh,priorities:zc,procedures:b_,registry:Yc,variables:$_,workspaceComments:jc,workspaces:I_};"Blockly"in globalThis||(globalThis.Blockly={Msg:uh});var S_="label",R_=class{load(t,e){return(t=new Sp(e.getWorkspace(),e.targetWorkspace,t,!0)).show(),new $p(t,S_)}gapForItem(t,e){return e}disposeItem(t){(t=t.getElement())instanceof Sp&&t.dispose()}getType(){return S_}};t(zl.FLYOUT_INFLATER,S_,R_);var y_=class extends Ag{constructor(t){super(),this.GRID_UNIT=4,this.CURSOR_COLOUR="#ffa200",this.CURSOR_RADIUS=5,this.JAGGED_TEETH_WIDTH=this.JAGGED_TEETH_HEIGHT=0,this.START_HAT_HEIGHT=22,this.START_HAT_WIDTH=96,this.SHAPES={HEXAGONAL:1,ROUND:2,SQUARE:3,PUZZLE:4,NOTCH:5},this.SHAPE_IN_SHAPE_PADDING={1:{0:5*this.GRID_UNIT,1:2*this.GRID_UNIT,2:5*this.GRID_UNIT,3:5*this.GRID_UNIT},2:{0:3*this.GRID_UNIT,1:3*this.GRID_UNIT,2:1*this.GRID_UNIT,3:2*this.GRID_UNIT},3:{0:2*this.GRID_UNIT,1:2*this.GRID_UNIT,2:2*this.GRID_UNIT,3:2*this.GRID_UNIT}},this.FULL_BLOCK_FIELDS=!0,this.FIELD_TEXT_FONTWEIGHT="bold",this.FIELD_TEXT_FONTFAMILY='"Helvetica Neue", "Segoe UI", Helvetica, sans-serif',this.FIELD_COLOUR_FULL_BLOCK=this.FIELD_TEXTINPUT_BOX_SHADOW=this.FIELD_DROPDOWN_SVG_ARROW=this.FIELD_DROPDOWN_COLOURED_DIV=this.FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW=!0,this.SELECTED_GLOW_COLOUR="#fff200",this.SELECTED_GLOW_SIZE=.5,this.REPLACEMENT_GLOW_COLOUR="#fff200",this.REPLACEMENT_GLOW_SIZE=2,this.selectedGlowFilterId="",this.selectedGlowFilter=null,this.replacementGlowFilterId="",this.SQUARED=this.ROUNDED=this.HEXAGONAL=this.replacementGlowFilter=null,t&&(this.GRID_UNIT=t),this.SMALL_PADDING=this.GRID_UNIT,this.MEDIUM_PADDING=2*this.GRID_UNIT,this.MEDIUM_LARGE_PADDING=3*this.GRID_UNIT,this.LARGE_PADDING=4*this.GRID_UNIT,this.CORNER_RADIUS=1*this.GRID_UNIT,this.NOTCH_WIDTH=9*this.GRID_UNIT,this.NOTCH_HEIGHT=2*this.GRID_UNIT,this.STATEMENT_INPUT_NOTCH_OFFSET=this.NOTCH_OFFSET_LEFT=3*this.GRID_UNIT,this.MIN_BLOCK_WIDTH=2*this.GRID_UNIT,this.MIN_BLOCK_HEIGHT=12*this.GRID_UNIT,this.EMPTY_STATEMENT_INPUT_HEIGHT=6*this.GRID_UNIT,this.TOP_ROW_MIN_HEIGHT=this.CORNER_RADIUS,this.TOP_ROW_PRECEDES_STATEMENT_MIN_HEIGHT=this.LARGE_PADDING,this.BOTTOM_ROW_MIN_HEIGHT=this.CORNER_RADIUS,this.BOTTOM_ROW_AFTER_STATEMENT_MIN_HEIGHT=6*this.GRID_UNIT,this.STATEMENT_BOTTOM_SPACER=-this.NOTCH_HEIGHT,this.STATEMENT_INPUT_SPACER_MIN_WIDTH=40*this.GRID_UNIT,this.STATEMENT_INPUT_PADDING_LEFT=4*this.GRID_UNIT,this.EMPTY_INLINE_INPUT_PADDING=4*this.GRID_UNIT,this.EMPTY_INLINE_INPUT_HEIGHT=8*this.GRID_UNIT,this.DUMMY_INPUT_MIN_HEIGHT=8*this.GRID_UNIT,this.DUMMY_INPUT_SHADOW_MIN_HEIGHT=6*this.GRID_UNIT,this.CURSOR_WS_WIDTH=20*this.GRID_UNIT,this.FIELD_TEXT_FONTSIZE=3*this.GRID_UNIT,this.FIELD_BORDER_RECT_RADIUS=this.CORNER_RADIUS,this.FIELD_BORDER_RECT_X_PADDING=2*this.GRID_UNIT,this.FIELD_BORDER_RECT_Y_PADDING=1.625*this.GRID_UNIT,this.FIELD_BORDER_RECT_HEIGHT=8*this.GRID_UNIT,this.FIELD_DROPDOWN_BORDER_RECT_HEIGHT=8*this.GRID_UNIT,this.FIELD_DROPDOWN_SVG_ARROW_PADDING=this.FIELD_BORDER_RECT_X_PADDING,this.FIELD_COLOUR_DEFAULT_WIDTH=6*this.GRID_UNIT,this.FIELD_COLOUR_DEFAULT_HEIGHT=8*this.GRID_UNIT,this.FIELD_CHECKBOX_X_OFFSET=1*this.GRID_UNIT,this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH=12*this.GRID_UNIT}setFontConstants_(t){super.setFontConstants_(t),this.FIELD_DROPDOWN_BORDER_RECT_HEIGHT=this.FIELD_BORDER_RECT_HEIGHT=this.FIELD_TEXT_HEIGHT+2*this.FIELD_BORDER_RECT_Y_PADDING}init(){super.init(),this.HEXAGONAL=this.makeHexagonal(),this.ROUNDED=this.makeRounded(),this.SQUARED=this.makeSquared(),this.STATEMENT_INPUT_NOTCH_OFFSET=this.NOTCH_OFFSET_LEFT+this.INSIDE_CORNERS.rightWidth}setDynamicProperties_(t){super.setDynamicProperties_(t),this.SELECTED_GLOW_COLOUR=t.getComponentStyle("selectedGlowColour")||this.SELECTED_GLOW_COLOUR;const e=Number(t.getComponentStyle("selectedGlowSize"));this.SELECTED_GLOW_SIZE=e&&!isNaN(e)?e:this.SELECTED_GLOW_SIZE,this.REPLACEMENT_GLOW_COLOUR=t.getComponentStyle("replacementGlowColour")||this.REPLACEMENT_GLOW_COLOUR,this.REPLACEMENT_GLOW_SIZE=(t=Number(t.getComponentStyle("replacementGlowSize")))&&!isNaN(t)?t:this.REPLACEMENT_GLOW_SIZE}dispose(){super.dispose(),this.selectedGlowFilter&&pt(this.selectedGlowFilter),this.replacementGlowFilter&&pt(this.replacementGlowFilter)}makeStartHat(){const t=this.START_HAT_HEIGHT,e=this.START_HAT_WIDTH;return{height:.75*t,width:e,path:Rn("c",[Sn(25,-t),Sn(71,-t),Sn(e,0)])}}makeHexagonal(){function t(t,s,i){var o=t/2;return kn(-(i=i?-1:1)*(o=o>e?e:o),t=(s?-1:1)*t/2)+kn(i*o,t)}const e=this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH;return{type:this.SHAPES.HEXAGONAL,isDynamic:!0,width:t=>(t/=2)>e?e:t,height:t=>t,connectionOffsetY:t=>t/2,connectionOffsetX:t=>-t,pathDown:e=>t(e,!1,!1),pathUp:e=>t(e,!0,!1),pathRightDown:e=>t(e,!1,!0),pathRightUp:e=>t(e,!1,!0)}}makeRounded(){function t(t,e,i){const o=t>s?t-s:0,n=i===e?"0":"1";return Nn("a","0 0,"+n,t=(t>s?s:t)/2,Sn((i?1:-1)*t,(e?-1:1)*t))+vn("v",(e?-1:1)*o)+Nn("a","0 0,"+n,t,Sn((i?-1:1)*t,(e?-1:1)*t))}const e=this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH,s=2*e;return{type:this.SHAPES.ROUND,isDynamic:!0,width:t=>(t/=2)>e?e:t,height:t=>t,connectionOffsetY:t=>t/2,connectionOffsetX:t=>-t,pathDown:e=>t(e,!1,!1),pathUp:e=>t(e,!0,!1),pathRightDown:e=>t(e,!1,!0),pathRightUp:e=>t(e,!1,!0)}}makeSquared(){function t(t,s,i){t-=2*e;const o=i===s?"0":"1";return Nn("a","0 0,"+o,e,Sn((i?1:-1)*e,(s?-1:1)*e))+vn("v",(s?-1:1)*t)+Nn("a","0 0,"+o,e,Sn((i?-1:1)*e,(s?-1:1)*e))}const e=this.CORNER_RADIUS;return{type:this.SHAPES.SQUARE,isDynamic:!0,width:t=>e,height:t=>t,connectionOffsetY:t=>t/2,connectionOffsetX:t=>-t,pathDown:e=>t(e,!1,!1),pathUp:e=>t(e,!0,!1),pathRightDown:e=>t(e,!1,!0),pathRightUp:e=>t(e,!1,!0)}}shapeFor(t){let e=t.getCheck();switch(!e&&t.targetConnection&&(e=t.targetConnection.getCheck()),t.type){case Vd.INPUT_VALUE:case Vd.OUTPUT_VALUE:if(null!==(t=t.getSourceBlock().getOutputShape()))switch(t){case this.SHAPES.HEXAGONAL:return this.HEXAGONAL;case this.SHAPES.ROUND:return this.ROUNDED;case this.SHAPES.SQUARE:return this.SQUARED}return e&&e.includes("Boolean")?this.HEXAGONAL:(e&&e.includes("Number")||e&&e.includes("String"),this.ROUNDED);case Vd.PREVIOUS_STATEMENT:case Vd.NEXT_STATEMENT:return this.NOTCH;default:throw Error("Unknown type")}}makeNotch(){function t(t){return Rn("c",[Sn(t*o/2,0),Sn(t*o*3/4,r/2),Sn(t*o,r)])+An([Sn(t*o,n)])+Rn("c",[Sn(t*o/4,r/2),Sn(t*o/2,r),Sn(t*o,r)])+vn("h",t*i)+Rn("c",[Sn(t*o/2,0),Sn(t*o*3/4,-r/2),Sn(t*o,-r)])+An([Sn(t*o,-n)])+Rn("c",[Sn(t*o/4,-r/2),Sn(t*o/2,-r),Sn(t*o,-r)])}const e=this.NOTCH_WIDTH,s=this.NOTCH_HEIGHT,i=e/3,o=i/3,n=s/2,r=n/2,l=t(1),a=t(-1);return{type:this.SHAPES.NOTCH,width:e,height:s,pathLeft:l,pathRight:a}}makeInsideCorners(){const t=this.CORNER_RADIUS,e=Nn("a","0 0,0",t,Sn(-t,t)),s=Nn("a","0 0,1",t,Sn(-t,t));return{width:t,height:t,pathTop:e,pathBottom:Nn("a","0 0,0",t,Sn(t,t)),rightWidth:t,rightHeight:t,pathTopRight:s,pathBottomRight:Nn("a","0 0,1",t,Sn(t,t))}}generateSecondaryColour_(t){return qi("#000",t,.15)||t}generateTertiaryColour_(t){return qi("#000",t,.25)||t}createDom(t,e,s,i){super.createDom(t,e,s,i),t=at(Tc.DEFS,{},t),e=at(Tc.FILTER,{id:"blocklySelectedGlowFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%",x:"-40%"},t),at(Tc.FEGAUSSIANBLUR,{in:"SourceGraphic",stdDeviation:this.SELECTED_GLOW_SIZE},e),s=at(Tc.FECOMPONENTTRANSFER,{result:"outBlur"},e),at(Tc.FEFUNCA,{type:"table",tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},s),at(Tc.FEFLOOD,{"flood-color":this.SELECTED_GLOW_COLOUR,"flood-opacity":1,result:"outColor"},e),at(Tc.FECOMPOSITE,{in:"outColor",in2:"outBlur",operator:"in",result:"outGlow"},e),this.selectedGlowFilterId=e.id,this.selectedGlowFilter=e,t=at(Tc.FILTER,{id:"blocklyReplacementGlowFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%",x:"-40%"},t),at(Tc.FEGAUSSIANBLUR,{in:"SourceGraphic",stdDeviation:this.REPLACEMENT_GLOW_SIZE},t),e=at(Tc.FECOMPONENTTRANSFER,{result:"outBlur"},t),at(Tc.FEFUNCA,{type:"table",tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},e),at(Tc.FEFLOOD,{"flood-color":this.REPLACEMENT_GLOW_COLOUR,"flood-opacity":1,result:"outColor"},t),at(Tc.FECOMPOSITE,{in:"outColor",in2:"outBlur",operator:"in",result:"outGlow"},t),at(Tc.FECOMPOSITE,{in:"SourceGraphic",in2:"outGlow",operator:"over"},t),this.replacementGlowFilterId=t.id,this.replacementGlowFilter=t,i&&(i.style.setProperty("--blocklySelectedGlowFilter",`url(#${this.selectedGlowFilterId})`),i.style.setProperty("--blocklyReplacementGlowFilter",`url(#${this.replacementGlowFilterId})`))}getCSS_(t){return[`${t} .blocklyText,`,`${t} .blocklyFlyoutLabelText {`,`font: ${this.FIELD_TEXT_FONTWEIGHT} ${this.FIELD_TEXT_FONTSIZE}pt ${this.FIELD_TEXT_FONTFAMILY};`,"}",`${t} .blocklyTextInputBubble textarea {`,"font-weight: normal;","}",`${t} .blocklyText {`,"fill: #fff;","}",`${t} .blocklyNonEditableField>rect:not(.blocklyDropdownRect),`,`${t} .blocklyEditableField>rect:not(.blocklyDropdownRect) {`,`fill: ${this.FIELD_BORDER_RECT_COLOUR};`,"}",`${t} .blocklyNonEditableField>text,`,`${t} .blocklyEditableField>text,`,`${t} .blocklyNonEditableField>g>text,`,`${t} .blocklyEditableField>g>text {`,"fill: #575E75;","}",`${t} .blocklyFlyoutLabelText {`,"fill: #575E75;","}",`${t} .blocklyText.blocklyBubbleText {`,"fill: #575E75;","}",`${t} .blocklyDraggable:not(.blocklyDisabled)`," .blocklyEditableField:not(.blocklyEditing):hover>rect,",`${t} .blocklyDraggable:not(.blocklyDisabled)`," .blocklyEditableField:not(.blocklyEditing):hover>.blocklyPath {","stroke: #fff;","stroke-width: 2;","}",`${t} .blocklyHtmlInput {`,`font-family: ${this.FIELD_TEXT_FONTFAMILY};`,`font-weight: ${this.FIELD_TEXT_FONTWEIGHT};`,"color: #575E75;","}",`${t} .blocklyDropdownText {`,"fill: #fff !important;","}",`${t}.blocklyWidgetDiv .blocklyMenuItem,`,`${t}.blocklyDropDownDiv .blocklyMenuItem {`,`font-family: ${this.FIELD_TEXT_FONTFAMILY};`,"}",`${t}.blocklyDropDownDiv .blocklyMenuItemContent {`,"color: #fff;","}",`${t} .blocklyHighlightedConnectionPath {`,`stroke: ${this.SELECTED_GLOW_COLOUR};`,"}",`${t} .blocklyDisabledPattern > .blocklyOutlinePath {`,"fill: var(--blocklyDisabledPattern)","}",`${t} .blocklyInsertionMarker>.blocklyPath {`,`fill-opacity: ${this.INSERTION_MARKER_OPACITY};`,"stroke: none;","}",`${t} .blocklySelected>.blocklyPath.blocklyPathSelected {`,"fill: none;","filter: var(--blocklySelectedGlowFilter);","}",`${t} .blocklyReplaceable>.blocklyPath {`,"filter: var(--blocklyReplacementGlowFilter);","}"]}},O_=class extends Ng{constructor(t,e){super(t,e)}draw(){const t=this.block_.pathObject;t.beginDrawing(),this.drawOutline_(),this.drawInternals_(),this.updateConnectionHighlights(),t.setPath(this.outlinePath_+"\n"+this.inlinePath_),this.info_.RTL&&t.flipRTL(),this.recordSizeOnBlock_(),this.info_.outputConnection&&(t.outputShapeType=this.info_.outputConnection.shape.type),t.endDrawing()}drawOutline_(){this.info_.outputConnection&&this.info_.outputConnection.isDynamicShape&&!this.info_.hasStatementInput&&!this.info_.bottomRow.hasNextConnection?(this.drawFlatTop_(),this.drawRightDynamicConnection_(),this.drawFlatBottom_(),this.drawLeftDynamicConnection_()):super.drawOutline_()}drawLeft_(){this.info_.outputConnection&&this.info_.outputConnection.isDynamicShape?this.drawLeftDynamicConnection_():super.drawLeft_()}drawRightSideRow_(t){if(!(t.height<=0)){if(lg.isSpacer(t)){const i=t.precedesStatement;var e=t.followsStatement;if(i||e){const o=this.constants_.INSIDE_CORNERS;var s=o.rightHeight;return s=t.height-(i?s:0),e=e?o.pathBottomRight:"",t=s>0?vn("V",t.yPos+s):"",void(this.outlinePath_+=e+t+(i?o.pathTopRight:""))}}this.outlinePath_+=vn("V",t.yPos+t.height)}}drawRightDynamicConnection_(){if(!this.info_.outputConnection)throw Error("Cannot draw the output connection of a block that doesn't have one");this.outlinePath_+=this.info_.outputConnection.shape.pathRightDown(this.info_.outputConnection.height)}drawLeftDynamicConnection_(){if(!this.info_.outputConnection)throw Error("Cannot draw the output connection of a block that doesn't have one");this.positionOutputConnection_(),this.outlinePath_+=this.info_.outputConnection.shape.pathUp(this.info_.outputConnection.height),this.outlinePath_+="z"}drawFlatTop_(){const t=this.info_.topRow;this.positionPreviousConnection_(),this.outlinePath_+=On(t.xPos,this.info_.startY),this.outlinePath_+=vn("h",t.width)}drawFlatBottom_(){const t=this.info_.bottomRow;this.positionNextConnection_(),this.outlinePath_+=vn("V",t.baseline),this.outlinePath_+=vn("h",-t.width)}drawInlineInput_(t){this.positionInlineInputConnection_(t);const e=t.input.name;t.connectedBlock||this.info_.isInsertionMarker||(t=yn(t.xPos+t.connectionWidth,t.centerline-t.height/2)+this.getInlineInputPath(t),this.block_.pathObject.setOutlinePath(e,t))}getInlineInputPath(t){const e=t.width-2*t.connectionWidth,s=t.height;return vn("h",e)+t.shape.pathRightDown(s)+vn("h",-e)+t.shape.pathUp(s)+"z"}drawStatementInput_(t){var e=t.getLastInput();const s=e.xPos+e.notchOffset+e.shape.width,i=this.constants_.INSIDE_CORNERS,o=e.shape.pathRight+vn("h",-(e.notchOffset-i.width))+i.pathTop,n=t.height-2*i.height;e=i.pathBottom+vn("h",e.notchOffset-i.width)+(e.connectedBottomNextConnection?"":e.shape.pathLeft),this.outlinePath_+=vn("H",s)+o+vn("v",n)+e+vn("H",t.xPos+t.width),this.positionStatementInputConnection_(t)}drawConnectionHighlightPath(t){const e=t.connectionModel;if(e.type===Vd.NEXT_STATEMENT||e.type===Vd.PREVIOUS_STATEMENT||e.type===Vd.OUTPUT_VALUE&&!t.isDynamicShape)return super.drawConnectionHighlightPath(t);t=e.type===Vd.INPUT_VALUE?yn(t.connectionWidth,-t.height/2)+this.getInlineInputPath(t):yn(t.width,-t.height/2)+t.shape.pathDown(t.height);const s=e.getSourceBlock();let i,o;return null==(o=(i=s.pathObject).addConnectionHighlight)?void 0:o.call(i,e,t,e.getOffsetInBlock(),s.RTL)}},k_=class extends Uu{constructor(t,e,s,i,o,n,r){if(super(Uu.SKIP_SETUP),this.imageElement=this.clickHandler=null,this.flipRtl=this.isDirty_=this.EDITABLE=!1,this.altText="",s=Number(eo(s)),e=Number(eo(e)),isNaN(s)||isNaN(e))throw Error("Height and width values of an image field must cast to numbers.");if(s<=0||e<=0)throw Error("Height and width values of an image field must be greater than 0.");this.size_=new Ec(e,s+k_.Y_PADDING),this.imageHeight=s,"function"==typeof o&&(this.clickHandler=o),t!==Uu.SKIP_SETUP&&(r?this.configure_(r):(this.flipRtl=!!n,this.altText=eo(i)||""),this.setValue(eo(t)))}configure_(t){super.configure_(t),t.flipRtl&&(this.flipRtl=t.flipRtl),t.alt&&(this.altText=eo(t.alt))}initView(){this.imageElement=at(Tc.IMAGE,{height:this.imageHeight+"px",width:this.size_.width+"px",alt:this.altText},this.fieldGroup_),this.imageElement.setAttributeNS(Fa,"xlink:href",this.value_),this.fieldGroup_&&ct(this.fieldGroup_,"blocklyImageField"),this.clickHandler&&(this.imageElement.style.cursor="pointer")}updateSize_(){}doClassValidation_(t){return"string"!=typeof t?null:t}doValueUpdate_(t){this.value_=t,this.imageElement&&this.imageElement.setAttributeNS(Fa,"xlink:href",this.value_)}getFlipRtl(){return this.flipRtl}setAlt(t){t!==this.altText&&(this.altText=t||"",this.imageElement&&this.imageElement.setAttribute("alt",this.altText))}isClickable(){return super.isClickable()&&!!this.clickHandler}showEditor_(){this.clickHandler&&this.clickHandler(this)}setOnClickHandler(t){this.clickHandler=t}getText_(){return this.altText}static fromJson(t){if(!t.src||!t.width||!t.height)throw Error("src, width, and height values for an image field arerequired. The width and height must be non-zero.");return new this(t.src,t.width,t.height,void 0,void 0,void 0,t)}};k_.Y_PADDING=1,rn("field_image",k_),k_.prototype.DEFAULT_VALUE="";var A_=class extends Uu{set size_(t){super.size_=t}get size_(){const t=super.size_;return t.width<14&&(t.width=14),t}constructor(t,e,s){super(Uu.SKIP_SETUP),this.spellcheck_=!0,this.htmlInput_=null,this.isTextValid_=this.isBeingEdited_=!1,this.onInputWrapper=this.onKeyDownWrapper=this.valueWhenEditorWasOpened_=null,this.fullBlockClickTarget_=!1,this.workspace_=null,this.SERIALIZABLE=!0,t!==Uu.SKIP_SETUP&&(s&&this.configure_(s),this.setValue(t),e&&this.setValidator(e))}configure_(t){super.configure_(t),void 0!==t.spellcheck&&(this.spellcheck_=t.spellcheck)}initView(){if(!this.getSourceBlock())throw new Hu;super.initView(),this.isFullBlockField()&&(this.clickTarget_=this.sourceBlock_.getSvgRoot()),this.fieldGroup_&&ct(this.fieldGroup_,"blocklyInputField")}isFullBlockField(){const t=this.getSourceBlock();if(!t)throw new Hu;let e;return this.fullBlockClickTarget_=!(null==(e=this.getConstants())||!e.FULL_BLOCK_FIELDS)&&t.isSimpleReporter()}doValueInvalid_(t,e=!0){this.isBeingEdited_&&(this.isDirty_=!0,this.isTextValid_=!1,t=this.value_,this.value_=this.valueWhenEditorWasOpened_,this.sourceBlock_&&st()&&this.value_!==t&&e&&J(new(rt(ua.BLOCK_CHANGE))(this.sourceBlock_,"field",this.name||null,t,this.value_)))}doValueUpdate_(t){this.isTextValid_=this.isDirty_=!0,this.value_=t}applyColour(){const t=this.getSourceBlock();if(!t)throw new Hu;this.getConstants().FULL_BLOCK_FIELDS&&this.fieldGroup_&&(!this.isFullBlockField()&&this.borderRect_?(this.borderRect_.style.display="block",this.borderRect_.setAttribute("stroke",t.getColourTertiary())):(this.borderRect_.style.display="none",t.pathObject.svgPath.setAttribute("fill",this.getConstants().FIELD_BORDER_RECT_COLOUR)))}getSize(){let t;return null!=(t=this.getConstants())&&t.FULL_BLOCK_FIELDS&&(this.render_(),this.isDirty_=!1),super.getSize()}onLocationChange(){this.isBeingEdited_&&this.resizeEditor_()}render_(){if(super.render_(),this.isBeingEdited_){var t=this.htmlInput_;this.isTextValid_?(ut(t,"blocklyInvalidInput"),Ne(t,Qc.INVALID,!1)):(ct(t,"blocklyInvalidInput"),Ne(t,Qc.INVALID,!0))}if(!(t=this.getSourceBlock()))throw new Hu;this.getConstants().FULL_BLOCK_FIELDS&&t.applyColour()}setSpellcheck(t){t!==this.spellcheck_&&(this.spellcheck_=t,this.htmlInput_&&this.htmlInput_.setAttribute("spellcheck",this.spellcheck_))}showEditor_(t,e=!1,s=!0){this.workspace_=this.sourceBlock_.workspace,!e&&this.workspace_.options.modalInputs&&(Ea||ga||_a)?this.showPromptEditor():this.showInlineEditor(e,s)}showPromptEditor(){ze(Hl.Msg$$module$build$src$core$msg.CHANGE_VALUE_TITLE,this.getText(),t=>{null!==t&&this.setValue(this.getValueFromEditorText_(t)),this.onFinishEditing_(this.value_)})}showInlineEditor(t,e){const s=this.getSourceBlock();if(!s)throw new Hu;lo(this,s.RTL,this.widgetDispose_.bind(this),this.workspace_,e),this.htmlInput_=this.widgetCreate_(),this.isBeingEdited_=!0,this.valueWhenEditorWasOpened_=this.value_,t||(this.htmlInput_.focus({preventScroll:!0}),this.htmlInput_.select())}widgetCreate_(){var t=this.getSourceBlock();if(!t)throw new Hu;Hl.setGroup$$module$build$src$core$events$utils(!0);const e=oo();var s=this.getClickTarget_();if(!s)throw Error("A click target has not been set.");ct(s,"blocklyEditing"),(s=document.createElement("input")).className="blocklyHtmlInput",s.setAttribute("spellcheck",this.spellcheck_);const i=this.workspace_.getAbsoluteScale();var o=this.getConstants().FIELD_TEXT_FONTSIZE*i+"pt";return e.style.fontSize=o,s.style.fontSize=o,o=A_.BORDERRADIUS*i+"px",this.isFullBlockField()&&(o=((o=this.getScaledBBox()).bottom-o.top)/2+"px",t=t.getParent()?t.getParent().getColourTertiary():this.sourceBlock_.getColourTertiary(),s.style.border=1*i+"px solid "+t,e.style.borderRadius=o,e.style.transition="box-shadow 0.25s ease 0s",this.getConstants().FIELD_TEXTINPUT_BOX_SHADOW&&(e.style.boxShadow="rgba(255, 255, 255, 0.3) 0 0 0 "+4*i+"px")),s.style.borderRadius=o,e.appendChild(s),s.value=s.defaultValue=this.getEditorText_(this.value_),s.setAttribute("data-untyped-default-value",String(this.value_)),this.resizeEditor_(),this.bindInputEvents_(s),s}widgetDispose_(){this.isBeingEdited_=!1,this.isTextValid_=!0,this.forceRerender(),this.onFinishEditing_(this.value_),this.sourceBlock_&&st()&&null!==this.valueWhenEditorWasOpened_&&this.valueWhenEditorWasOpened_!==this.value_&&(J(new(rt(ua.BLOCK_CHANGE))(this.sourceBlock_,"field",this.name||null,this.valueWhenEditorWasOpened_,this.value_)),this.valueWhenEditorWasOpened_=null),Hl.setGroup$$module$build$src$core$events$utils(!1),this.unbindInputEvents_();var t=oo().style;if(t.width="auto",t.height="auto",t.fontSize="",t.transition="",t.boxShadow="",this.htmlInput_=null,!(t=this.getClickTarget_()))throw Error("A click target has not been set.");ut(t,"blocklyEditing")}onFinishEditing_(t){}bindInputEvents_(t){this.onKeyDownWrapper=T(t,"keydown",this,this.onHtmlInputKeyDown_),this.onInputWrapper=T(t,"input",this,this.onHtmlInputChange)}unbindInputEvents_(){this.onKeyDownWrapper&&(E(this.onKeyDownWrapper),this.onKeyDownWrapper=null),this.onInputWrapper&&(E(this.onInputWrapper),this.onInputWrapper=null)}onHtmlInputKeyDown_(t){if("Enter"===t.key)ho(this),pi();else if("Escape"===t.key)this.setValue(this.htmlInput_.getAttribute("data-untyped-default-value"),!1),ho(this),pi();else if("Tab"===t.key){t.preventDefault();var e,s=null==(e=this.workspace_)?void 0:e.getCursor();e=t=>(t instanceof A_||t instanceof Ep&&t.isSimpleReporter())&&t!==this.getSourceBlock(),(t=(t=t.shiftKey?null==s?void 0:s.getPreviousNode(this,e,!1):null==s?void 0:s.getNextNode(this,e,!1))instanceof Ep&&t.isSimpleReporter()?t.getFields().next().value:t)instanceof A_&&(ho(this),pi(),s=t.getSourceBlock(),t.isFullBlockField()&&s&&s instanceof Ep?Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(s):Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(t),t.showEditor())}}onHtmlInputChange(t){t=this.value_,this.setValue(this.getValueFromEditorText_(this.htmlInput_.value),!1),this.sourceBlock_&&st()&&this.value_!==t&&J(new(rt(ua.BLOCK_FIELD_INTERMEDIATE_CHANGE))(this.sourceBlock_,this.name||null,t,this.value_))}setEditorValue_(t,e=!0){this.isDirty_=!0,this.isBeingEdited_&&(this.htmlInput_.value=this.getEditorText_(t)),this.setValue(t,e)}resizeEditor_(){Me().then(()=>{const t=this.getSourceBlock();if(!t)throw new Hu;const e=oo(),s=this.getScaledBBox();e.style.width=s.right-s.left+"px",e.style.height=s.bottom-s.top+"px";const i=s.top;e.style.left=`${t.RTL?s.right-e.offsetWidth:s.left}px`,e.style.top=`${i}px`})}repositionForWindowResize(){let t;const e=null==(t=this.getSourceBlock())?void 0:t.getRootBlock();return e instanceof Ep&&(zn(this.workspace_,this.workspace_.getMetricsManager().getViewMetrics(!0),e)||this.resizeEditor_(),!0)}positionTextElement_(t,e){const s=2*t+e;super.positionTextElement_(t+(s<14?(14-s)/2:0),e)}getText_(){return this.isBeingEdited_&&this.htmlInput_?this.htmlInput_.value:null}getEditorText_(t){return`${t}`}getValueFromEditorText_(t){return t}};A_.BORDERRADIUS=4,Hl.FieldTextInput$$module$build$src$core$field_textinput=class extends A_{constructor(t,e,s){super(t,e,s)}initView(){super.initView(),this.fieldGroup_&&ct(this.fieldGroup_,"blocklyTextInputField")}doClassValidation_(t){return void 0===t?null:`${t}`}static fromJson(t){return new this(eo(t.text),void 0,t)}},rn("field_input",Hl.FieldTextInput$$module$build$src$core$field_textinput),Hl.FieldTextInput$$module$build$src$core$field_textinput.prototype.DEFAULT_VALUE="",Hl.FieldTextInput$$module$build$src$core$field_textinput;var v_=class extends hg{constructor(t){super(t)}endsWithElemSpacer(){return!1}hasLeftSquareCorner(t){return!!t.outputConnection}hasRightSquareCorner(t){return!!t.outputConnection&&!t.statementInputCount&&!t.nextConnection}},N_=class extends Og{constructor(t,e){if(super(t,e),this.connectedBottomNextConnection=!1,this.connectedBlock){for(t=this.connectedBlock;e=t.getNextBlock();)t=e;t.nextConnection||(this.height=this.connectedBlockHeight,this.connectedBottomNextConnection=!0)}}},w_=class extends ag{constructor(t){super(t),this.width=this.height=0,this.type|=lg.getType("RIGHT_CONNECTION")}},L_=class extends kg{constructor(t){super(t)}endsWithElemSpacer(){return!1}hasLeftSquareCorner(t){const e=(t.hat?"cap"===t.hat:this.constants_.ADD_START_HATS)&&!t.outputConnection&&!t.previousConnection;return!!t.outputConnection||e}hasRightSquareCorner(t){return!!t.outputConnection&&!t.statementInputCount&&!t.nextConnection}},M_=class extends wg{constructor(t,e){super(t,e),this.isInline=!0,this.renderer_=t,this.constants_=this.renderer_.getConstants(),this.topRow=new L_(this.constants_),this.bottomRow=new v_(this.constants_),this.isMultiRow=!e.getInputsInline()||e.isCollapsed(),this.hasStatementInput=e.statementInputCount>0,this.rightSide=this.outputConnection?new w_(this.constants_):null,this.rightAlignedDummyInputs=new WeakMap}getRenderer(){return this.renderer_}measure(){this.createRows_(),this.addElemSpacing_(),this.addRowSpacing_(),this.adjustXPosition_(),this.computeBounds_(),this.alignRowElements_(),this.finalize_()}shouldStartNewRow_(t,e){return!!e&&(e instanceof rp||t instanceof lp||e instanceof lp||(t instanceof Hl.ValueInput$$module$build$src$core$inputs$value_input||t instanceof np||t instanceof rp)&&(!this.isInline||this.isMultiRow))}getDesiredRowWidth_(t){return t.hasStatement?this.width-this.startX-(this.constants_.INSIDE_CORNERS.rightWidth||0):super.getDesiredRowWidth_(t)}getInRowSpacing_(t,e){return t&&e||!this.outputConnection||!this.outputConnection.isDynamicShape||this.hasStatementInput||this.bottomRow.hasNextConnection?!t&&e&&lg.isStatementInput(e)?this.constants_.STATEMENT_INPUT_PADDING_LEFT:t&&lg.isLeftRoundedCorner(t)&&e&&(lg.isPreviousConnection(e)||lg.isNextConnection(e))?e.notchOffset-this.constants_.CORNER_RADIUS:t&&lg.isLeftSquareCorner(t)&&e&&lg.isHat(e)||t&&lg.isField(t)&&0===t.width?this.constants_.NO_PADDING:this.constants_.MEDIUM_PADDING:this.constants_.NO_PADDING}getSpacerRowHeight_(t,e){if(lg.isTopRow(t)&&lg.isBottomRow(e))return this.constants_.EMPTY_BLOCK_SPACER_HEIGHT;const s=lg.isInputRow(t)&&t.hasStatement,i=lg.isInputRow(e)&&e.hasStatement;return i||s?(t=Math.max(this.constants_.NOTCH_HEIGHT,this.constants_.INSIDE_CORNERS.rightHeight||0),i&&s?Math.max(t,this.constants_.DUMMY_INPUT_MIN_HEIGHT):t):lg.isTopRow(t)?t.hasPreviousConnection||this.outputConnection&&!this.hasStatementInput?this.constants_.NO_PADDING:Math.abs(this.constants_.NOTCH_HEIGHT-this.constants_.CORNER_RADIUS):lg.isBottomRow(e)?this.outputConnection?!e.hasNextConnection&&this.hasStatementInput?Math.abs(this.constants_.NOTCH_HEIGHT-this.constants_.CORNER_RADIUS):this.constants_.NO_PADDING:Math.max(this.topRow.minHeight,Math.max(this.constants_.NOTCH_HEIGHT,this.constants_.CORNER_RADIUS))-this.constants_.CORNER_RADIUS:this.constants_.MEDIUM_PADDING}getSpacerRowWidth_(t,e){const s=this.width-this.startX;return lg.isInputRow(t)&&t.hasStatement||lg.isInputRow(e)&&e.hasStatement?Math.max(s,this.constants_.STATEMENT_INPUT_SPACER_MIN_WIDTH):s}getElemCenterline_(t,e){if(t.hasStatement&&!lg.isSpacer(e)&&!lg.isStatementInput(e))return t.yPos+this.constants_.EMPTY_STATEMENT_INPUT_HEIGHT/2;if(lg.isInlineInput(e)){const s=e.connectedBlock;if(s&&s.outputConnection&&s.nextConnection)return t.yPos+s.height/2}return super.getElemCenterline_(t,e)}addInput_(t,e){if((t instanceof np||t instanceof rp)&&e.hasDummyInput&&e.align===Hl.Align$$module$build$src$core$inputs$align.LEFT&&t.align===Hl.Align$$module$build$src$core$inputs$align.RIGHT)this.rightAlignedDummyInputs.set(e,t);else if(t instanceof lp)return e.elements.push(new N_(this.constants_,t)),e.hasStatement=!0,void(null===e.align&&(e.align=t.align));super.addInput_(t,e)}addAlignmentPadding_(t,e){if(this.rightAlignedDummyInputs.get(t)){let s;for(let e=0;e=this.rows.length-1?!!this.bottomRow.hasNextConnection:!!i.precedesStatement,lg.isInputRow(n)&&n.hasStatement){let s,i;n.measure(),e=n.width-(null!=(i=null==(s=n.getLastInput())?void 0:s.width)?i:0)+t}else if(s&&(2===o||i)&&lg.isInputRow(n)&&!n.hasStatement){i=n.xPos,s=null;for(let t=0;t1)return s===i.SHAPES.ROUND?(s=this.constants_.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH,e-(s=this.height/2>s?s:this.height/2)*(1-Math.sin(Math.acos((s-this.constants_.SMALL_PADDING)/s)))):0;if(lg.isInlineInput(t)){const o=t.connectedBlock;return null==(t=o?o.pathObject.outputShapeType:t.shape.type)||o&&o.outputConnection&&(o.statementInputCount||o.nextConnection)||s===i.SHAPES.HEXAGONAL&&s!==t?0:e-this.constants_.SHAPE_IN_SHAPE_PADDING[s][t]}return lg.isField(t)?s===i.SHAPES.ROUND&&t.field instanceof Hl.FieldTextInput$$module$build$src$core$field_textinput?e-2.75*i.GRID_UNIT:e-this.constants_.SHAPE_IN_SHAPE_PADDING[s][0]:lg.isIcon(t)?this.constants_.SMALL_PADDING:0}finalizeVerticalAlignment_(){if(!this.outputConnection)for(let i=2;i=this.rows.length-1?!!this.bottomRow.hasNextConnection:!!r.precedesStatement;if(t?this.topRow.hasPreviousConnection:o.followsStatement){var s=n.elements[1];if(s=3===n.elements.length&&s instanceof gg&&(s.field instanceof qd||s.field instanceof k_),!t&&s)o.height-=this.constants_.SMALL_PADDING,r.height-=this.constants_.SMALL_PADDING,n.height-=this.constants_.MEDIUM_PADDING;else if(t||e){if(e){for(t=!1,e=0;e=40){t=!0;break}t&&(o.height-=this.constants_.SMALL_PADDING,r.height-=this.constants_.SMALL_PADDING)}}else o.height+=this.constants_.SMALL_PADDING}}}finalize_(){this.finalizeOutputConnection_(),this.finalizeHorizontalAlignment_(),this.finalizeVerticalAlignment_(),super.finalize_(),this.rightSide&&(this.widthWithChildren+=this.rightSide.width)}},D_=class extends Lg{constructor(t,e,s){super(t,e,s),this.svgPathSelected=null,this.outlines=new Map,this.remainingOutlines=new Set,this.outputShapeType=null,this.constants=s}setPath(t){super.setPath(t),this.svgPathSelected&&this.svgPathSelected.setAttribute("d",t)}applyColour(t){super.applyColour(t);const e=t.getParent();t.isShadow()&&e&&this.svgPath.setAttribute("stroke",e.getColourTertiary());for(const t of this.outlines.values())t.setAttribute("fill",this.style.colourTertiary)}flipRTL(){super.flipRTL();for(const t of this.outlines.values())t.setAttribute("transform","scale(-1 1)")}updateSelected(t){this.setClass_("blocklySelected",t),t?this.svgPathSelected||(this.svgPathSelected=this.svgPath.cloneNode(!0),this.svgPathSelected.classList.add("blocklyPathSelected"),ut(this.svgPathSelected,za.ACTIVE_FOCUS_NODE_CSS_CLASS_NAME),ut(this.svgPathSelected,za.PASSIVE_FOCUS_NODE_CSS_CLASS_NAME),this.svgPathSelected.removeAttribute("tabindex"),this.svgPathSelected.removeAttribute("id"),this.svgRoot.appendChild(this.svgPathSelected)):this.svgPathSelected&&(this.svgRoot.removeChild(this.svgPathSelected),this.svgPathSelected=null)}updateReplacementFade(t){this.setClass_("blocklyReplaceable",t)}updateShapeForInputHighlight(t,e){t=t.getParentInput().name,(t=this.getOutlinePath(t))&&(e?t.setAttribute("filter","url(#"+this.constants.replacementGlowFilterId+")"):t.removeAttribute("filter"))}beginDrawing(){this.remainingOutlines.clear();for(const t of this.outlines.keys())this.remainingOutlines.add(t)}endDrawing(){if(this.remainingOutlines.size)for(const t of this.remainingOutlines)this.removeOutlinePath(t);this.remainingOutlines.clear()}setOutlinePath(t,e){(t=this.getOutlinePath(t)).setAttribute("d",e),t.setAttribute("fill",this.style.colourTertiary)}getOutlinePath(t){return this.outlines.has(t)||this.outlines.set(t,at(Tc.PATH,{class:"blocklyOutlinePath",d:""},this.svgRoot)),this.remainingOutlines.delete(t),this.outlines.get(t)}removeOutlinePath(t){let e,s;null==(e=this.outlines.get(t))||null==(s=e.parentNode)||s.removeChild(this.outlines.get(t)),this.outlines.delete(t)}},x_=class extends Mg{constructor(t){super(t)}makeConstants_(){return new y_}makeRenderInfo_(t){return new M_(this,t)}makeDrawer_(t,e){return new O_(t,e)}makePathObject(t,e){return new D_(t,e,this.getConstants())}getConstants(){return this.constants_}};Ir("zelos",x_);var P_=class{constructor(t){this.staticConn=this.draggedConn=this.markerConn=this.fadedBlock=null,this.workspace=t.workspace}previewReplacement(t,e,s){Hl.disable$$module$build$src$core$events$utils();try{this.hidePreview(),this.fadedBlock=s,s.fadeForReplacement(!0),this.workspace.getRenderer().shouldHighlightConnection(e)&&(e.highlight(),this.staticConn=e)}finally{Hl.enable$$module$build$src$core$events$utils()}}previewConnection(t,e){if(t!==this.draggedConn||e!==this.staticConn){Hl.disable$$module$build$src$core$events$utils();try{this.hidePreview(),this.shouldUseMarkerPreview(t,e)&&(this.markerConn=this.previewMarker(t,e)),this.workspace.getRenderer().shouldHighlightConnection(e)&&e.highlight(),this.draggedConn=t,this.staticConn=e}finally{Hl.enable$$module$build$src$core$events$utils()}}}shouldUseMarkerPreview(t,e){return e.type===Vd.PREVIOUS_STATEMENT||e.type===Vd.NEXT_STATEMENT||!(this.workspace.getRenderer()instanceof x_)}previewMarker(t,e){const s=t.getSourceBlock(),i=this.createInsertionMarker(s),o=this.getMatchingConnection(s,i,t);if(!o)return null;i.queueRender(),De(),o.connect(e);const n={x:e.x-o.x,y:e.y-o.y},r=o.getOffsetInBlock().clone();return Me().then(()=>{if(!i.isDeadOrDying()){Hl.disable$$module$build$src$core$events$utils();try{null==i||i.positionNearConnection(o,n,r),null==i||i.getSvgRoot().setAttribute("visibility","visible")}finally{Hl.enable$$module$build$src$core$events$utils()}}}),o}serializeBlockToInsertionMarker(t){const e=$s(t,{addCoordinates:!1,addInputBlocks:!1,addNextBlocks:!1,doFullSerialization:!1});if(!e)throw Error(`Failed to serialize source block. ${t.toDevString()}`);return e}createInsertionMarker(t){t=this.serializeBlockToInsertionMarker(t),t=vs(t,this.workspace);for(const e of t.getDescendants(!1))e.setInsertionMarker(!0);return t.initSvg(),t.getSvgRoot().setAttribute("visibility","hidden"),t}getMatchingConnection(t,e,s){if(t=t.getConnections_(!0),e=e.getConnections_(!0),t.length!==e.length)return null;for(let i=0;i-e||t<-180+e||t>180-e}getClientRect(){if(!this.svgGroup_||this.autoClose||!this.isVisible())return null;const t=this.svgGroup_.getBoundingClientRect(),e=t.left;return this.toolboxPosition_===Lc.LEFT?new mc(-1e9,1e9,-1e9,e+t.width):new mc(-1e9,1e9,e,1e9)}reflowInternal_(){this.workspace_.scale=this.getFlyoutScale();let t=this.getContents().reduce((t,e)=>Math.max(t,e.getElement().getBoundingRectangle().getWidth()),0);if(t+=1.5*this.MARGIN+this.tabWidth_,t*=this.workspace_.scale,t+=Sc.scrollbarThickness,this.getWidth()!==t){if(this.RTL)for(const e of this.getContents()){const s=e.getElement().getBoundingRectangle().left,i=t/this.workspace_.scale-e.getElement().getBoundingRectangle().getWidth()-this.MARGIN-this.tabWidth_;e.getElement().moveBy(i-s,0)}this.targetWorkspace.scrollbar||this.autoClose||this.targetWorkspace.getFlyout()!==this||this.toolboxPosition_!==Lc.LEFT||this.targetWorkspace.translate(this.targetWorkspace.scrollX+t,this.targetWorkspace.scrollY),this.width_=t,this.position(),this.targetWorkspace.resizeContents(),this.targetWorkspace.recordDragTargets()}}};U_.registryName="verticalFlyout",t(zl.FLYOUTS_VERTICAL_TOOLBOX,Xl,U_);var H_=class extends zp{constructor(t){super(t),this.horizontalLayout=!0}setMetrics_(t){if(this.isVisible()){var e=this.workspace_.getMetricsManager(),s=e.getScrollMetrics(),i=e.getViewMetrics();e=e.getAbsoluteMetrics(),"number"==typeof t.x&&(this.workspace_.scrollX=-(s.left+(s.width-i.width)*t.x)),this.workspace_.translate(this.workspace_.scrollX+e.left,this.workspace_.scrollY+e.top)}}getX(){return 0}getY(){if(!this.isVisible())return 0;var t=this.targetWorkspace.getMetricsManager();const e=t.getAbsoluteMetrics(),s=t.getViewMetrics();t=t.getToolboxMetrics();const i=this.toolboxPosition_===Lc.TOP;return this.targetWorkspace.toolboxPosition===this.toolboxPosition_?this.targetWorkspace.getToolbox()?i?t.height:s.height-this.getHeight():i?0:s.height:i?0:s.height+e.top-this.getHeight()}position(){if(this.isVisible()&&this.targetWorkspace.isVisible()){var t=this.targetWorkspace.getMetricsManager().getViewMetrics();this.width_=t.width,t=t.width-2*this.CORNER_RADIUS;var e=this.getHeight()-this.CORNER_RADIUS;this.setBackgroundPath(t,e),t=this.getX(),e=this.getY(),this.positionAt_(this.getWidth(),this.getHeight(),t,e)}}setBackgroundPath(t,e){const s=this.toolboxPosition_===Lc.TOP,i=["M 0,"+(s?0:this.CORNER_RADIUS)];s?(i.push("h",t+2*this.CORNER_RADIUS),i.push("v",e),i.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,-this.CORNER_RADIUS,this.CORNER_RADIUS),i.push("h",-t),i.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,-this.CORNER_RADIUS,-this.CORNER_RADIUS)):(i.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,this.CORNER_RADIUS,-this.CORNER_RADIUS),i.push("h",t),i.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,this.CORNER_RADIUS,this.CORNER_RADIUS),i.push("v",e),i.push("h",-t-2*this.CORNER_RADIUS)),i.push("z"),this.svgBackground_.setAttribute("d",i.join(" "))}scrollToStart(){let t;null==(t=this.workspace_.scrollbar)||t.setX(this.RTL?1/0:0)}wheel_(t){var e=I(t);if(e=e.x||e.y){const t=this.workspace_.getMetricsManager(),s=t.getScrollMetrics();let i;e=t.getViewMetrics().left-s.left+e,null==(i=this.workspace_.scrollbar)||i.setX(e),uo(this.workspace_),pi()}t.preventDefault(),t.stopPropagation()}layout_(t){this.workspace_.scale=this.targetWorkspace.scale;const e=this.MARGIN;let s=e+this.tabWidth_;this.RTL&&(t=t.reverse());for(const i of t)t=i.getElement().getBoundingRectangle(),t=this.RTL?s+t.getWidth():s,i.getElement().moveBy(t,e),s+=i.getElement().getBoundingRectangle().getWidth()}isDragTowardWorkspace(t){t=Math.atan2(t.y,t.x)/Math.PI*180;const e=this.dragAngleRange_;return t<90+e&&t>90-e||t>-90-e&&t<-90+e}getClientRect(){if(!this.svgGroup_||this.autoClose||!this.isVisible())return null;const t=this.svgGroup_.getBoundingClientRect(),e=t.top;return this.toolboxPosition_===Lc.TOP?new mc(-1e9,e+t.height,-1e9,1e9):new mc(e,1e9,-1e9,1e9)}reflowInternal_(){this.workspace_.scale=this.getFlyoutScale();let t=this.getContents().reduce((t,e)=>Math.max(t,e.getElement().getBoundingRectangle().getHeight()),0);t+=1.5*this.MARGIN,t*=this.workspace_.scale,t+=Sc.scrollbarThickness,this.getHeight()!==t&&(this.targetWorkspace.scrollbar||this.autoClose||this.targetWorkspace.getFlyout()!==this||this.toolboxPosition_!==Lc.TOP||this.targetWorkspace.translate(this.targetWorkspace.scrollX,this.targetWorkspace.scrollY+t),this.height_=t,this.position(),this.targetWorkspace.resizeContents(),this.targetWorkspace.recordDragTargets())}};t(zl.FLYOUTS_HORIZONTAL_TOOLBOX,Xl,H_);var G_=class extends kd{constructor(t,e,s,i,o){super(Uu.SKIP_SETUP),this.defaultType="",this.variableTypes=[],this.variable=null,this.SERIALIZABLE=!0,this.menuGenerator_=G_.dropdownCreate,this.defaultVariableName="string"==typeof t?t:"",this.size_=new Ec(0,0),t!==Uu.SKIP_SETUP&&(o?this.configure_(o):this.setTypes(s,i),e&&this.setValidator(e))}configure_(t){super.configure_(t),this.setTypes(t.variableTypes,t.defaultType)}initModel(){var t=this.getSourceBlock();if(!t)throw new Hu;this.variable||(t=Hl.getOrCreateVariablePackage$$module$build$src$core$variables(t.workspace,null,this.defaultVariableName,this.defaultType),this.doValueUpdate_(t.getId()))}initView(){super.initView(),ct(this.fieldGroup_,"blocklyVariableField")}shouldAddBorderRect_(){const t=this.getSourceBlock();if(!t)throw new Hu;return super.shouldAddBorderRect_()&&(!this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW||"variables_get"!==t.type)}fromXml(t){var e=this.getSourceBlock();if(!e)throw new Hu;const s=t.getAttribute("id"),i=t.textContent,o=t.getAttribute("variabletype")||t.getAttribute("variableType")||"";if(e=Hl.getOrCreateVariablePackage$$module$build$src$core$variables(e.workspace,s,i,o),null!==o&&o!==e.getType())throw Error("Serialized variable type with id '"+e.getId()+"' had type "+e.getType()+", and does not match variable field that references it: "+Uo(t)+".");this.setValue(e.getId())}toXml(t){return this.initModel(),t.id=this.variable.getId(),t.textContent=this.variable.getName(),this.variable.getType()&&t.setAttribute("variabletype",this.variable.getType()),t}saveState(t){var e=this.saveLegacyState(G_);return null!==e||(this.initModel(),e={id:this.variable.getId()},t&&(e.name=this.variable.getName(),e.type=this.variable.getType())),e}loadState(t){const e=this.getSourceBlock();if(!e)throw new Hu;this.loadLegacyState(G_,t)||(t=Hl.getOrCreateVariablePackage$$module$build$src$core$variables(e.workspace,t.id||null,t.name,t.type||""),this.setValue(t.getId()))}setSourceBlock(t){if(t.isShadow())throw Error("Variable fields are not allowed to exist on shadow blocks.");super.setSourceBlock(t)}getValue(){return this.variable?this.variable.getId():null}getText(){return this.variable?this.variable.getName():""}getVariable(){return this.variable}getDefaultType(){return this.defaultType}getValidator(){return this.variable?this.validator_:null}doClassValidation_(t){if(null===t)return null;var e=this.getSourceBlock();if(!e)throw new Hu;return(e=Hl.getVariable$$module$build$src$core$variables(e.workspace,t))?(e=e.getType(),this.typeIsAllowed(e)?t:(console.warn("Variable type doesn't match this field! Type was "+e),null)):(console.warn("Variable id doesn't point to a real variable! ID was "+t),null)}doValueUpdate_(t){const e=this.getSourceBlock();if(!e)throw new Hu;this.variable=Hl.getVariable$$module$build$src$core$variables(e.workspace,t),super.doValueUpdate_(t)}typeIsAllowed(t){const e=this.getVariableTypes();if(!e)return!0;for(let s=0;s-1/0&&(t.min=`${this.min_}`,Ne(t,Qc.VALUEMIN,this.min_)),this.max_<1/0&&(t.max=`${this.max_}`,Ne(t,Qc.VALUEMAX,this.max_)),t}initView(){super.initView(),this.fieldGroup_&&ct(this.fieldGroup_,"blocklyNumberField")}static fromJson(t){return new this(t.value,void 0,void 0,void 0,void 0,t)}};rn("field_number",V_),V_.prototype.DEFAULT_VALUE=0;var W_=class extends qd{constructor(t,e,s){super(String(null!=t?t:""),e,s),this.EDITABLE=!1,this.SERIALIZABLE=!0}static fromJson(t){return new this(eo(t.text),void 0,t)}};rn("field_label_serializable",W_);var X_=class extends Uu{constructor(t,e,s){super(Uu.SKIP_SETUP),this.SERIALIZABLE=!0,this.value_=this.value_,this.checkChar=X_.CHECK_CHAR,t!==Uu.SKIP_SETUP&&(s&&this.configure_(s),this.setValue(t),e&&this.setValidator(e))}configure_(t){super.configure_(t),t.checkCharacter&&(this.checkChar=t.checkCharacter)}saveState(){const t=this.saveLegacyState(X_);return null!==t?t:this.getValueBoolean()}initView(){super.initView();const t=this.getTextElement();ct(this.fieldGroup_,"blocklyCheckboxField"),t.style.display=this.value_?"block":"none"}render_(){this.textContent_&&(this.textContent_.nodeValue=this.getDisplayText_()),this.updateSize_(this.getConstants().FIELD_CHECKBOX_X_OFFSET)}getDisplayText_(){return this.checkChar}setCheckCharacter(t){this.checkChar=t||X_.CHECK_CHAR,this.forceRerender()}showEditor_(){this.setValue(!this.value_)}doClassValidation_(t){return!0===t||"TRUE"===t?"TRUE":!1===t||"FALSE"===t?"FALSE":null}doValueUpdate_(t){this.value_=this.convertValueToBool(t),this.textElement_&&(this.textElement_.style.display=this.value_?"block":"none")}getValue(){return this.value_?"TRUE":"FALSE"}getValueBoolean(){return this.value_}getText(){return String(this.convertValueToBool(this.value_))}convertValueToBool(t){return"string"==typeof t?"TRUE"===t:!!t}static fromJson(t){return new this(t.checked,void 0,t)}};X_.CHECK_CHAR="✓",rn("field_checkbox",X_),X_.prototype.DEFAULT_VALUE=!1;var z_=class{constructor(t,e){this.draggable=t,this.workspace=e,this.dragTarget=null,this.startLoc=t.getRelativeToSurfaceXY()}onDragStart(t){Hl.getGroup$$module$build$src$core$events$utils()||Hl.setGroup$$module$build$src$core$events$utils(!0),this.draggable.startDrag(t)}onDrag(t,e){this.moveDraggable(t,e),e=this.getRoot(this.draggable),Jn(e)&&e.setDeleteStyle(this.wouldDeleteDraggable(t,e)),this.updateDragTarget(t)}updateDragTarget(t){t=this.workspace.getDragTarget(t);const e=this.getRoot(this.draggable);if(this.dragTarget!==t){let s;null==(s=this.dragTarget)||s.onDragExit(e),null==t||t.onDragEnter(e)}null==t||t.onDragOver(e),this.dragTarget=t}moveDraggable(t,e){e=this.pixelsToWorkspaceUnits(e),e=_c.sum(this.startLoc,e),this.draggable.drag(e,t)}wouldDeleteDraggable(t,e){return!(!(t=this.workspace.getDragTarget(t))||!this.workspace.getComponentManager().hasCapability(t.id,cc.Capability.DELETE_AREA))&&t.wouldDelete(e)}onDragEnd(t){const e=Hl.getGroup$$module$build$src$core$events$utils();var s=this.workspace.getDragTarget(t);const i=this.getRoot(this.draggable);if(s){let t;null==(t=this.dragTarget)||t.onDrop(i)}this.shouldReturnToStart(t,i)&&this.draggable.revertDrag(),(s=Jn(i)&&this.wouldDeleteDraggable(t,i))&&this.draggable instanceof Ep&&Pn(this.draggable.getRootBlock()),this.draggable.endDrag(t),s&&Jn(i)&&(Hl.setGroup$$module$build$src$core$events$utils(e),i.dispose()),Hl.setGroup$$module$build$src$core$events$utils(!1),!s&&It(this.draggable)&&Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this.draggable)}getRoot(t){return t instanceof Ep?t.getRootBlock():t}shouldReturnToStart(t,e){return!!(t=this.workspace.getDragTarget(t))&&t.shouldPreventMove(e)}pixelsToWorkspaceUnits(t){return t=new _c(t.x/this.workspace.scale,t.y/this.workspace.scale),this.workspace.isMutator&&t.scale(1/this.workspace.options.parentWorkspace.scale),t}};t(zl.BLOCK_DRAGGER,Xl,z_);var Y_={};Y_.BlockDragStrategy=_p,Y_.BubbleDragStrategy=Ld,Y_.CommentDragStrategy=ad,Y_.Dragger=z_;var K_=class extends oc{constructor(t,e,s){super(t?t.workspace.id:void 0),this.type=ua.BLOCK_DRAG,t&&(this.blockId=t.id,this.isStart=e,this.blocks=s)}toJson(){const t=super.toJson();if(void 0===this.isStart)throw Error("Whether this event is the start of a drag is undefined. Either pass the value to the constructor, or call fromJson");if(void 0===this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");return t.isStart=this.isStart,t.blockId=this.blockId,t.blocks=this.blocks,t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new K_)).isStart=t.isStart,e.blockId=t.blockId,e.blocks=t.blocks,e}};t(zl.EVENT,ua.BLOCK_DRAG,K_);var j_=class extends jh{constructor(t,e,s,i){super(t),this.type=ua.BLOCK_FIELD_INTERMEDIATE_CHANGE,this.recordUndo=!1,t&&(this.name=e,this.oldValue=s,this.newValue=i)}toJson(){const t=super.toJson();if(!this.name)throw Error("The changed field name is undefined. Either pass a name to the constructor, or call fromJson.");return t.name=this.name,t.oldValue=this.oldValue,t.newValue=this.newValue,t}static fromJson(t,e,s){return(e=jh.fromJson(t,e,null!=s?s:new j_)).name=t.name,e.oldValue=t.oldValue,e.newValue=t.newValue,e}isNull(){return this.oldValue===this.newValue}run(t){var e=this.getEventWorkspace_();if(!this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");if(!(e=e.getBlockById(this.blockId)))throw Error("The associated block is undefined. Either pass a block to the constructor, or call fromJson");t=t?this.newValue:this.oldValue,(e=e.getField(this.name))?e.setValue(t):console.warn("Can't set non-existent field: "+this.name)}};t(zl.EVENT,ua.BLOCK_FIELD_INTERMEDIATE_CHANGE,j_);var J_=class extends jh{constructor(t){super(t),this.type=ua.BLOCK_MOVE,t&&(t.isShadow()&&(this.recordUndo=!1),t=this.currentLocation(),this.oldParentId=t.parentId,this.oldInputName=t.inputName,this.oldCoordinate=t.coordinate)}toJson(){const t=super.toJson();return t.oldParentId=this.oldParentId,t.oldInputName=this.oldInputName,this.oldCoordinate&&(t.oldCoordinate=`${Math.round(this.oldCoordinate.x)}, ${Math.round(this.oldCoordinate.y)}`),t.newParentId=this.newParentId,t.newInputName=this.newInputName,this.newCoordinate&&(t.newCoordinate=`${Math.round(this.newCoordinate.x)}, ${Math.round(this.newCoordinate.y)}`),this.reason&&(t.reason=this.reason),this.recordUndo||(t.recordUndo=this.recordUndo),t}static fromJson(t,e,s){return(e=jh.fromJson(t,e,null!=s?s:new J_)).oldParentId=t.oldParentId,e.oldInputName=t.oldInputName,t.oldCoordinate&&(s=t.oldCoordinate.split(","),e.oldCoordinate=new _c(Number(s[0]),Number(s[1]))),e.newParentId=t.newParentId,e.newInputName=t.newInputName,t.newCoordinate&&(s=t.newCoordinate.split(","),e.newCoordinate=new _c(Number(s[0]),Number(s[1]))),void 0!==t.reason&&(e.reason=t.reason),void 0!==t.recordUndo&&(e.recordUndo=t.recordUndo),e}recordNew(){const t=this.currentLocation();this.newParentId=t.parentId,this.newInputName=t.inputName,this.newCoordinate=t.coordinate}setReason(t){this.reason=t}currentLocation(){var t=this.getEventWorkspace_();if(!this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");var e=t.getBlockById(this.blockId);if(!e)throw Error("The block associated with the block move event could not be found");t={};const s=e.getParent();return s?(t.parentId=s.id,(e=s.getInputWithBlock(e))&&(t.inputName=e.name)):t.coordinate=e.getRelativeToSurfaceXY(),t}isNull(){return this.oldParentId===this.newParentId&&this.oldInputName===this.newInputName&&_c.equals(this.oldCoordinate,this.newCoordinate)}run(t){var e=this.getEventWorkspace_();if(!this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");var s=e.getBlockById(this.blockId);if(s){var i=t?this.newParentId:this.oldParentId,o=t?this.newInputName:this.oldInputName;if(t=t?this.newCoordinate:this.oldCoordinate,i){var n=e.getBlockById(i);if(!n)return void console.warn("Can't connect to non-existent block: "+i)}if(s.getParent()&&s.unplug(),t)o=s.getRelativeToSurfaceXY(),s.moveBy(t.x-o.x,t.y-o.y,this.reason);else{let t,i;(!(e=s.outputConnection)||s.previousConnection&&s.previousConnection.isConnected())&&(e=s.previousConnection),s=null==(i=e)?void 0:i.type,o?(s=n.getInput(o))&&(t=s.connection):s===Vd.PREVIOUS_STATEMENT&&(t=n.nextConnection),t&&e?e.connect(t):console.warn("Can't connect to non-existent input: "+o)}}else console.warn("Can't move non-existent block: "+this.blockId)}};t(zl.EVENT,ua.BLOCK_MOVE,J_);var q_,Z_=class extends oc{constructor(t,e,s){super(t?t.workspace.id:void 0),this.type=ua.BUBBLE_OPEN,t&&(this.blockId=t.id,this.isOpen=e,this.bubbleType=s)}toJson(){const t=super.toJson();if(void 0===this.isOpen)throw Error("Whether this event is for opening the bubble is undefined. Either pass the value to the constructor, or call fromJson");if(!this.bubbleType)throw Error("The type of bubble is undefined. Either pass the value to the constructor, or call fromJson");return t.isOpen=this.isOpen,t.bubbleType=this.bubbleType,t.blockId=this.blockId||"",t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new Z_)).isOpen=t.isOpen,e.bubbleType=t.bubbleType,e.blockId=t.blockId,e}};(function(t){t.MUTATOR="mutator",t.COMMENT="comment",t.WARNING="warning"})(q_||(q_={})),t(zl.EVENT,ua.BUBBLE_OPEN,Z_);var Q_={};Q_.BubbleOpen=Z_,Q_.BubbleType=q_;var tT=class extends ic{constructor(t){super(),this.isBlank=!0,this.isBlank=!t,t&&(this.commentId=t.id,this.workspaceId=t.workspace.id,this.group=Hl.getGroup$$module$build$src$core$events$utils(),this.recordUndo=j())}toJson(){const t=super.toJson();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");return t.commentId=this.commentId,t}static fromJson(t,e,s){return(e=ic.fromJson(t,e,null!=s?s:new tT)).commentId=t.commentId,e}static CommentCreateDeleteHelper(t,e){const s=t.getEventWorkspace_();if(e){if(!t.json)throw Error("Encountered a comment event without proper json");Re(t.json,s)}else{if(!t.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");(e=s.getCommentById(t.commentId))?e.dispose():console.warn("Can't delete non-existent comment: "+t.commentId)}}},eT=class extends tT{constructor(t,e,s){super(t),this.type=ua.COMMENT_CHANGE,t&&(this.oldContents_=void 0===e?"":e,this.newContents_=void 0===s?"":s)}toJson(){const t=super.toJson();if(!this.oldContents_)throw Error("The old contents is undefined. Either pass a value to the constructor, or call fromJson");if(!this.newContents_)throw Error("The new contents is undefined. Either pass a value to the constructor, or call fromJson");return t.oldContents=this.oldContents_,t.newContents=this.newContents_,t}static fromJson(t,e,s){return(e=tT.fromJson(t,e,null!=s?s:new eT)).oldContents_=t.oldContents,e.newContents_=t.newContents,e}isNull(){return this.oldContents_===this.newContents_}run(t){var e=this.getEventWorkspace_();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");if(e=e.getCommentById(this.commentId)){var s=t?this.newContents_:this.oldContents_;if(void 0===s){if(t)throw Error("The new contents is undefined. Either pass a value to the constructor, or call fromJson");throw Error("The old contents is undefined. Either pass a value to the constructor, or call fromJson")}e.setText(s)}else console.warn("Can't change non-existent comment: "+this.commentId)}};t(zl.EVENT,ua.COMMENT_CHANGE,eT);var sT=class extends tT{constructor(t,e){super(t),this.newCollapsed=e,this.type=ua.COMMENT_COLLAPSE}toJson(){const t=super.toJson();if(void 0===this.newCollapsed)throw Error("The new collapse value undefined. Either call recordNew, or call fromJson");return t.newCollapsed=this.newCollapsed,t}static fromJson(t,e,s){return(e=tT.fromJson(t,e,null!=s?s:new sT)).newCollapsed=t.newCollapsed,e}run(t){var e=this.getEventWorkspace_();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");(e=e.getCommentById(this.commentId))?e.setCollapsed(t?!!this.newCollapsed:!this.newCollapsed):console.warn("Can't collapse or uncollapse non-existent comment: "+this.commentId)}};t(zl.EVENT,ua.COMMENT_COLLAPSE,sT);var iT=class extends tT{constructor(t){super(t),this.type=ua.COMMENT_CREATE,t&&(this.xml=Lo(t),this.json=Se(t,{addCoordinates:!0}))}toJson(){const t=super.toJson();if(!this.xml)throw Error("The comment XML is undefined. Either pass a comment to the constructor, or call fromJson");if(!this.json)throw Error("The comment JSON is undefined. Either pass a block to the constructor, or call fromJson");return t.xml=Uo(this.xml),t.json=this.json,t}static fromJson(t,e,s){return(e=tT.fromJson(t,e,null!=s?s:new iT)).xml=Hl.textToDom$$module$build$src$core$utils$xml(t.xml),e.json=t.json,e}run(t){tT.CommentCreateDeleteHelper(this,t)}};t(zl.EVENT,ua.COMMENT_CREATE,iT);var oT=class extends tT{constructor(t){super(t),this.type=ua.COMMENT_DELETE,t&&(this.xml=Lo(t),this.json=Se(t,{addCoordinates:!0}))}run(t){tT.CommentCreateDeleteHelper(this,!t)}toJson(){const t=super.toJson();if(!this.xml)throw Error("The comment XML is undefined. Either pass a comment to the constructor, or call fromJson");if(!this.json)throw Error("The comment JSON is undefined. Either pass a block to the constructor, or call fromJson");return t.xml=Uo(this.xml),t.json=this.json,t}static fromJson(t,e,s){return(e=tT.fromJson(t,e,null!=s?s:new oT)).xml=Hl.textToDom$$module$build$src$core$utils$xml(t.xml),e.json=t.json,e}};t(zl.EVENT,ua.COMMENT_DELETE,oT);var nT=class extends oc{constructor(t,e){super(t?t.workspace.id:void 0),this.type=ua.COMMENT_DRAG,t&&(this.commentId=t.id,this.isStart=e)}toJson(){const t=super.toJson();if(void 0===this.isStart)throw Error("Whether this event is the start of a drag is undefined. Either pass the value to the constructor, or call fromJson");if(void 0===this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");return t.isStart=this.isStart,t.commentId=this.commentId,t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new nT)).isStart=t.isStart,e.commentId=t.commentId,e}};t(zl.EVENT,ua.COMMENT_DRAG,nT);var rT=class extends tT{constructor(t){super(t),this.type=ua.COMMENT_MOVE,t&&(this.comment_=t,this.oldCoordinate_=t.getRelativeToSurfaceXY())}recordNew(){if(this.newCoordinate_)throw Error("Tried to record the new position of a comment on the same event twice.");if(!this.comment_)throw Error("The comment is undefined. Pass a comment to the constructor if you want to use the record functionality");this.newCoordinate_=this.comment_.getRelativeToSurfaceXY()}setReason(t){this.reason=t}setOldCoordinate(t){this.oldCoordinate_=t}toJson(){const t=super.toJson();if(!this.oldCoordinate_)throw Error("The old comment position is undefined. Either pass a comment to the constructor, or call fromJson");if(!this.newCoordinate_)throw Error("The new comment position is undefined. Either call recordNew, or call fromJson");return t.oldCoordinate=`${Math.round(this.oldCoordinate_.x)}, ${Math.round(this.oldCoordinate_.y)}`,t.newCoordinate=Math.round(this.newCoordinate_.x)+","+Math.round(this.newCoordinate_.y),t}static fromJson(t,e,s){return e=tT.fromJson(t,e,null!=s?s:new rT),s=t.oldCoordinate.split(","),e.oldCoordinate_=new _c(Number(s[0]),Number(s[1])),s=t.newCoordinate.split(","),e.newCoordinate_=new _c(Number(s[0]),Number(s[1])),e}isNull(){return _c.equals(this.oldCoordinate_,this.newCoordinate_)}run(t){var e=this.getEventWorkspace_();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");if(e=e.getCommentById(this.commentId)){if(!(t=t?this.newCoordinate_:this.oldCoordinate_))throw Error("Either oldCoordinate_ or newCoordinate_ is undefined. Either pass a comment to the constructor and call recordNew, or call fromJson");e.moveTo(t)}else console.warn("Can't move non-existent comment: "+this.commentId)}};t(zl.EVENT,ua.COMMENT_MOVE,rT);var lT=class extends tT{constructor(t){super(t),this.type=ua.COMMENT_RESIZE,t&&(this.oldSize=t.getSize())}recordCurrentSizeAsNewSize(){if(this.newSize)throw Error("Tried to record the new size of a comment on the same event twice.");var t=this.getEventWorkspace_();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");if(!(t=t.getCommentById(this.commentId)))throw Error("The comment associated with the comment resize event could not be found");this.newSize=t.getSize()}toJson(){const t=super.toJson();if(!this.oldSize)throw Error("The old comment size is undefined. Either pass a comment to the constructor, or call fromJson");if(!this.newSize)throw Error("The new comment size is undefined. Either call recordCurrentSizeAsNewSize, or call fromJson");return t.oldWidth=Math.round(this.oldSize.width),t.oldHeight=Math.round(this.oldSize.height),t.newWidth=Math.round(this.newSize.width),t.newHeight=Math.round(this.newSize.height),t}static fromJson(t,e,s){return(e=tT.fromJson(t,e,null!=s?s:new lT)).oldSize=new Ec(t.oldWidth,t.oldHeight),e.newSize=new Ec(t.newWidth,t.newHeight),e}isNull(){return Ec.equals(this.oldSize,this.newSize)}run(t){var e=this.getEventWorkspace_();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");if(e=e.getCommentById(this.commentId)){if(!(t=t?this.newSize:this.oldSize))throw Error("Either oldSize or newSize is undefined. Either pass a comment to the constructor and call recordCurrentSizeAsNewSize, or call fromJson");e.setSize(t)}else console.warn("Can't resize non-existent comment: "+this.commentId)}};t(zl.EVENT,ua.COMMENT_RESIZE,lT);var aT=class extends oc{constructor(t,e,s){super(s),this.type=ua.TOOLBOX_ITEM_SELECT,this.oldItem=null!=t?t:void 0,this.newItem=null!=e?e:void 0}toJson(){const t=super.toJson();return t.oldItem=this.oldItem,t.newItem=this.newItem,t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new aT)).oldItem=t.oldItem,e.newItem=t.newItem,e}};t(zl.EVENT,ua.TOOLBOX_ITEM_SELECT,aT);var cT=class extends Wg{constructor(t,e,s){super(t),this.oldType=e,this.newType=s,this.type=ua.VAR_TYPE_CHANGE}toJson(){const t=super.toJson();if(!this.oldType||!this.newType)throw Error("The variable's types are undefined. Either pass them to the constructor, or call fromJson");return t.oldType=this.oldType,t.newType=this.newType,t}static fromJson(t,e,s){return(e=Wg.fromJson(t,e,null!=s?s:new cT)).oldType=t.oldType,e.newType=t.newType,e}run(t){const e=this.getEventWorkspace_();if(!this.varId)throw Error("The var ID is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.oldType||!this.newType)throw Error("The variable's types are undefined. Either pass them to the constructor, or call fromJson");const s=e.getVariableMap().getVariableById(this.varId);s&&(t?e.getVariableMap().changeVariableType(s,this.newType):e.getVariableMap().changeVariableType(s,this.oldType))}};t(zl.EVENT,ua.VAR_TYPE_CHANGE,cT);var hT,uT,dT,pT,gT,_T,TT,mT,ET,bT,fT,$T,IT,CT,ST,RT,yT,OT,kT,AT,vT,NT,wT,LT,MT,DT=class extends ic{constructor(t){super(),this.isBlank=!0,this.recordUndo=!1,this.type=ua.FINISHED_LOADING,this.isBlank=!!t,t&&(this.workspaceId=t.id)}};t(zl.EVENT,ua.FINISHED_LOADING,DT),Hl.BLOCK_CHANGE$$module$build$src$core$events$events=ua.BLOCK_CHANGE,Hl.BLOCK_CREATE$$module$build$src$core$events$events=ua.BLOCK_CREATE,Hl.BLOCK_DELETE$$module$build$src$core$events$events=ua.BLOCK_DELETE,hT=ua.BLOCK_DRAG,Hl.BLOCK_MOVE$$module$build$src$core$events$events=ua.BLOCK_MOVE,uT=ua.BLOCK_FIELD_INTERMEDIATE_CHANGE,dT=ua.BUBBLE_OPEN,pT=ua.BLOCK_CHANGE,gT=ua.CLICK,_T=ua.COMMENT_CHANGE,TT=ua.COMMENT_CREATE,mT=ua.COMMENT_DELETE,ET=ua.COMMENT_MOVE,bT=ua.COMMENT_RESIZE,fT=ua.COMMENT_DRAG,$T=ua.BLOCK_CREATE,IT=ua.BLOCK_DELETE,CT=ua.FINISHED_LOADING,ST=ua.BLOCK_MOVE,RT=ua.SELECTED,yT=ua.THEME_CHANGE,OT=ua.TOOLBOX_ITEM_SELECT,kT=ua.TRASHCAN_OPEN,AT=ua.UI,vT=ua.VAR_CREATE,NT=ua.VAR_DELETE,wT=ua.VAR_RENAME,LT=ua.VIEWPORT_CHANGE,(MT={}).Abstract=ic,MT.BLOCK_CHANGE=Hl.BLOCK_CHANGE$$module$build$src$core$events$events,MT.BLOCK_CREATE=Hl.BLOCK_CREATE$$module$build$src$core$events$events,MT.BLOCK_DELETE=Hl.BLOCK_DELETE$$module$build$src$core$events$events,MT.BLOCK_DRAG=hT,MT.BLOCK_FIELD_INTERMEDIATE_CHANGE=uT,MT.BLOCK_MOVE=Hl.BLOCK_MOVE$$module$build$src$core$events$events,MT.BUBBLE_OPEN=dT,MT.BUMP_EVENTS=Ca,MT.BlockBase=jh,MT.BlockChange=Jh,MT.BlockCreate=Id,MT.BlockDelete=Yd,MT.BlockDrag=K_,MT.BlockFieldIntermediateChange=j_,MT.BlockMove=J_,MT.BubbleOpen=Z_,MT.BubbleType=q_,MT.CHANGE=pT,MT.CLICK=gT,MT.COMMENT_CHANGE=_T,MT.COMMENT_CREATE=TT,MT.COMMENT_DELETE=mT,MT.COMMENT_DRAG=fT,MT.COMMENT_MOVE=ET,MT.COMMENT_RESIZE=bT,MT.CREATE=$T,MT.Click=nc,MT.ClickTarget=sc,MT.CommentBase=tT,MT.CommentChange=eT,MT.CommentCollapse=sT,MT.CommentCreate=iT,MT.CommentDelete=oT,MT.CommentDrag=nT,MT.CommentMove=rT,MT.CommentResize=lT,MT.DELETE=IT,MT.FINISHED_LOADING=CT,MT.FinishedLoading=DT,MT.MOVE=ST,MT.SELECTED=RT,MT.Selected=zd,MT.THEME_CHANGE=yT,MT.TOOLBOX_ITEM_SELECT=OT,MT.TRASHCAN_OPEN=kT,MT.ThemeChange=Sd,MT.ToolboxItemSelect=aT,MT.TrashcanOpen=Jg,MT.UI=AT,MT.UiBase=oc,MT.VAR_CREATE=vT,MT.VAR_DELETE=NT,MT.VAR_RENAME=wT,MT.VIEWPORT_CHANGE=LT,MT.VarBase=Wg,MT.VarCreate=Xg,MT.VarDelete=Yg,MT.VarRename=Kg,MT.VarTypeChange=cT,MT.ViewportChange=Rd,MT.clearPendingUndo=et,MT.disable=Hl.disable$$module$build$src$core$events$utils,MT.disableOrphans=lt,MT.enable=Hl.enable$$module$build$src$core$events$utils,MT.filter=tt,MT.fire=J,MT.fromJson=nt,MT.get=rt,MT.getDescendantIds=ot,MT.getGroup=Hl.getGroup$$module$build$src$core$events$utils,MT.getRecordUndo=j,MT.isEnabled=st,MT.setGroup=Hl.setGroup$$module$build$src$core$events$utils,MT.setRecordUndo=Hl.setRecordUndo$$module$build$src$core$events$utils;var xT={};xT.BottomRow=v_,xT.ConstantProvider=y_,xT.Drawer=O_,xT.PathObject=D_,xT.RenderInfo=M_,xT.Renderer=x_,xT.RightConnectionShape=w_,xT.StatementInput=N_,xT.TopRow=L_,Ml();var PT={};PT.registerCleanup=pl,PT.registerCollapse=_l,PT.registerCollapseExpandBlock=Rl,PT.registerComment=Cl,PT.registerCommentCreate=Nl,PT.registerCommentDelete=Al,PT.registerCommentDuplicate=vl,PT.registerCommentOptions=Ll,PT.registerDefaultOptions=Ml,PT.registerDelete=Ol,PT.registerDeleteAll=fl,PT.registerDisable=yl,PT.registerDuplicate=Il,PT.registerExpand=Tl,PT.registerHelp=kl,PT.registerInline=Sl,PT.registerRedo=dl,PT.registerUndo=ul;var BT="button",FT=class{load(t,e){return(t=new Sp(e.getWorkspace(),e.targetWorkspace,t,!1)).show(),new $p(t,BT)}gapForItem(t,e){return e}disposeItem(t){(t=t.getElement())instanceof Sp&&t.dispose()}getType(){return BT}};t(zl.FLYOUT_INFLATER,BT,FT);var UT={};UT.Bubble=Md,UT.MiniWorkspaceBubble=Dd,UT.TextBubble=Tp,UT.TextInputBubble=Wd;var HT="block",GT=class{constructor(){this.permanentlyDisabledBlocks=new Set,this.listeners=new Map,this.capacityWrapper=this.filterFlyoutBasedOnCapacity.bind(this)}load(t,e){return this.setFlyout(e),(t=this.createBlock(t,e.getWorkspace())).isEnabled()?this.updateStateBasedOnCapacity(t):this.permanentlyDisabledBlocks.add(t),t.getDescendants(!1).forEach(t=>t.isInFlyout=!0),this.addBlockListeners(t),new $p(t,HT)}createBlock(t,e){return t.blockxml?(t="string"==typeof t.blockxml?Hl.textToDom$$module$build$src$core$utils$xml(t.blockxml):t.blockxml,e=Xo(t,e)):(void 0===t.enabled&&(t.enabled="true"!==t.disabled&&!0!==t.disabled),void 0===t.disabledReasons&&!1===t.enabled&&(t.disabledReasons=[ah]),"x"in t&&delete t.x,"y"in t&&delete t.y,e=Ns(t,e)),e}gapForItem(t,e){let s;return t.gap?s=parseInt(String(t.gap)):t.blockxml&&(t="string"==typeof t.blockxml?Hl.textToDom$$module$build$src$core$utils$xml(t.blockxml):t.blockxml,s=parseInt(t.getAttribute("gap"))),!s||isNaN(s)?e:s}disposeItem(t){(t=t.getElement())instanceof Ep&&(this.removeListeners(t.id),t.dispose(!1,!1))}removeListeners(t){let e;(null!=(e=this.listeners.get(t))?e:[]).forEach(t=>E(t)),this.listeners.delete(t)}setFlyout(t){if(this.flyout!==t){if(this.flyout){let t;null==(t=this.flyout.targetWorkspace)||t.removeChangeListener(this.capacityWrapper)}var e;this.flyout=t,null==(e=this.flyout.targetWorkspace)||e.addChangeListener(this.capacityWrapper)}}updateStateBasedOnCapacity(t){let e,s;const i=null==(e=this.flyout)||null==(s=e.targetWorkspace)?void 0:s.isCapacityAvailable(Pt(t));for(;t;)t.setDisabledReason(!i,"WORKSPACE_AT_BLOCK_CAPACITY"),t=t.getNextBlock()}addBlockListeners(t){const e=[];e.push(T(t.getSvgRoot(),"pointerdown",t,e=>{let s,i;const o=null==(s=this.flyout)||null==(i=s.targetWorkspace)?void 0:i.getGesture(e);o&&this.flyout&&(o.setStartBlock(t),o.handleFlyoutStart(e,this.flyout))})),e.push(m(t.getSvgRoot(),"pointermove",null,()=>{let e,s;null!=(e=this.flyout)&&null!=(s=e.targetWorkspace)&&s.isDragging()||t.addSelect()})),e.push(m(t.getSvgRoot(),"pointerleave",null,()=>{let e,s;null!=(e=this.flyout)&&null!=(s=e.targetWorkspace)&&s.isDragging()||t.removeSelect()})),this.listeners.set(t.id,e)}filterFlyoutBasedOnCapacity(t){!this.flyout||t&&t.type!==ua.BLOCK_CREATE&&t.type!==ua.BLOCK_DELETE||this.flyout.getWorkspace().getTopBlocks(!1).forEach(t=>{this.permanentlyDisabledBlocks.has(t)||this.updateStateBasedOnCapacity(t)})}getType(){return HT}};t(zl.FLYOUT_INFLATER,HT,GT);var VT=class extends Ag{constructor(){super(),this.FIELD_TEXT_BASELINE_CENTER=!1,this.DARK_PATH_OFFSET=1,this.MAX_BOTTOM_WIDTH=30,this.STATEMENT_BOTTOM_SPACER=-this.NOTCH_HEIGHT/2}getCSS_(t){return super.getCSS_(t).concat([`${t} .blocklyInsertionMarker>.blocklyPathLight,`,`${t} .blocklyInsertionMarker>.blocklyPathDark {`,`fill-opacity: ${this.INSERTION_MARKER_OPACITY};`,"stroke: none;","}"])}},WT=class{constructor(t){this.inlineSteps_=this.steps_="",this.info_=t,this.RTL_=this.info_.RTL,t=t.getRenderer(),this.constants_=t.getConstants(),this.highlightConstants_=t.getHighlightConstants(),this.highlightOffset=this.highlightConstants_.OFFSET,this.outsideCornerPaths_=this.highlightConstants_.OUTSIDE_CORNER,this.insideCornerPaths_=this.highlightConstants_.INSIDE_CORNER,this.puzzleTabPaths_=this.highlightConstants_.PUZZLE_TAB,this.notchPaths_=this.highlightConstants_.NOTCH,this.startPaths_=this.highlightConstants_.START_HAT,this.jaggedTeethPaths_=this.highlightConstants_.JAGGED_TEETH}getPath(){return this.steps_+"\n"+this.inlineSteps_}drawTopCorner(t){this.steps_+=On(t.xPos,this.info_.startY);for(let e,s=0;e=t.elements[s];s++)lg.isLeftSquareCorner(e)?this.steps_+=this.highlightConstants_.START_POINT:lg.isLeftRoundedCorner(e)?this.steps_+=this.outsideCornerPaths_.topLeft(this.RTL_):lg.isPreviousConnection(e)?this.steps_+=this.notchPaths_.pathLeft:lg.isHat(e)?this.steps_+=this.startPaths_.path(this.RTL_):lg.isSpacer(e)&&0!==e.width&&(this.steps_+=vn("H",e.xPos+e.width-this.highlightOffset));this.steps_+=vn("H",t.xPos+t.width-this.highlightOffset)}drawJaggedEdge_(t){this.info_.RTL&&(this.steps_+=this.jaggedTeethPaths_.pathLeft+vn("v",t.height-this.jaggedTeethPaths_.height-this.highlightOffset))}drawValueInput(t){const e=t.getLastInput();if(this.RTL_){const s=t.height-e.connectionHeight;this.steps_+=yn(e.xPos+e.width-this.highlightOffset,t.yPos)+this.puzzleTabPaths_.pathDown(this.RTL_)+vn("v",s)}else this.steps_+=yn(e.xPos+e.width,t.yPos)+this.puzzleTabPaths_.pathDown(this.RTL_)}drawStatementInput(t){const e=t.getLastInput();if(e)if(this.RTL_){const s=t.height-2*this.insideCornerPaths_.height;this.steps_+=yn(e.xPos,t.yPos)+this.insideCornerPaths_.pathTop(this.RTL_)+vn("v",s)+this.insideCornerPaths_.pathBottom(this.RTL_)+kn(t.width-e.xPos-this.insideCornerPaths_.width,0)}else this.steps_+=yn(e.xPos,t.yPos+t.height)+this.insideCornerPaths_.pathBottom(this.RTL_)+kn(t.width-e.xPos-this.insideCornerPaths_.width,0)}drawRightSideRow(t){const e=t.xPos+t.width-this.highlightOffset;t instanceof Rg&&t.followsStatement&&(this.steps_+=vn("H",e)),this.RTL_&&(this.steps_+=vn("H",e),t.height>this.highlightOffset&&(this.steps_+=vn("V",t.yPos+t.height-this.highlightOffset)))}drawBottomRow(t){if(this.RTL_)this.steps_+=vn("V",t.baseline-this.highlightOffset);else{const e=this.info_.bottomRow.elements[0];lg.isLeftSquareCorner(e)?this.steps_+=yn(t.xPos+this.highlightOffset,t.baseline-this.highlightOffset):lg.isLeftRoundedCorner(e)&&(this.steps_+=yn(t.xPos,t.baseline),this.steps_+=this.outsideCornerPaths_.bottomLeft())}}drawLeft(){var t=this.info_.outputConnection;t&&(t=t.connectionOffsetY+t.height,this.RTL_?this.steps_+=yn(this.info_.startX,t):(this.steps_+=yn(this.info_.startX+this.highlightOffset,this.info_.bottomRow.baseline-this.highlightOffset),this.steps_+=vn("V",t)),this.steps_+=this.puzzleTabPaths_.pathUp(this.RTL_)),this.RTL_||(t=this.info_.topRow,lg.isLeftRoundedCorner(t.elements[0])?this.steps_+=vn("V",this.outsideCornerPaths_.height):this.steps_+=vn("V",t.capline+this.highlightOffset))}drawInlineInput(t){const e=this.highlightOffset,s=t.xPos+t.connectionWidth;var i=t.centerline-t.height/2;const o=t.width-t.connectionWidth,n=i+e;this.RTL_?(i=t.connectionOffsetY-e,t=t.height-(t.connectionOffsetY+t.connectionHeight)+e,this.inlineSteps_+=yn(s-e,n)+vn("v",i)+this.puzzleTabPaths_.pathDown(this.RTL_)+vn("v",t)+vn("h",o)):this.inlineSteps_+=yn(t.xPos+t.width+e,n)+vn("v",t.height)+vn("h",-o)+yn(s,i+t.connectionOffsetY)+this.puzzleTabPaths_.pathDown(this.RTL_)}},XT=class extends Ng{constructor(t,e){super(t,e),this.highlighter_=new WT(e)}draw(){this.drawOutline_(),this.drawInternals_(),this.updateConnectionHighlights();const t=this.block_.pathObject;t.setPath(this.outlinePath_+"\n"+this.inlinePath_),t.setHighlightPath(this.highlighter_.getPath()),this.info_.RTL&&t.flipRTL(),this.recordSizeOnBlock_()}drawTop_(){this.highlighter_.drawTopCorner(this.info_.topRow),this.highlighter_.drawRightSideRow(this.info_.topRow),super.drawTop_()}drawJaggedEdge_(t){this.highlighter_.drawJaggedEdge_(t),super.drawJaggedEdge_(t)}drawValueInput_(t){this.highlighter_.drawValueInput(t),super.drawValueInput_(t)}drawStatementInput_(t){this.highlighter_.drawStatementInput(t),super.drawStatementInput_(t)}drawRightSideRow_(t){this.highlighter_.drawRightSideRow(t),this.outlinePath_+=vn("H",t.xPos+t.width)+vn("V",t.yPos+t.height)}drawBottom_(){this.highlighter_.drawBottomRow(this.info_.bottomRow),super.drawBottom_()}drawLeft_(){this.highlighter_.drawLeft(),super.drawLeft_()}drawInlineInput_(t){this.highlighter_.drawInlineInput(t),super.drawInlineInput_(t)}positionInlineInputConnection_(t){const e=t.centerline-t.height/2;if(t.connectionModel){let s=t.xPos+t.connectionWidth+this.constants_.DARK_PATH_OFFSET;this.info_.RTL&&(s*=-1),t.connectionModel.setOffsetInBlock(s,e+t.connectionOffsetY+this.constants_.DARK_PATH_OFFSET)}}positionStatementInputConnection_(t){const e=t.getLastInput();if(null!=e&&e.connectionModel){let s=t.xPos+t.statementEdge+e.notchOffset;s=this.info_.RTL?-1*s:s+this.constants_.DARK_PATH_OFFSET,e.connectionModel.setOffsetInBlock(s,t.yPos+this.constants_.DARK_PATH_OFFSET)}}positionExternalValueConnection_(t){const e=t.getLastInput();if(e&&e.connectionModel){let s=t.xPos+t.width+this.constants_.DARK_PATH_OFFSET;this.info_.RTL&&(s*=-1),e.connectionModel.setOffsetInBlock(s,t.yPos)}}positionNextConnection_(){const t=this.info_.bottomRow;if(t.connection){const e=t.connection,s=e.xPos;e.connectionModel.setOffsetInBlock((this.info_.RTL?-s:s)+this.constants_.DARK_PATH_OFFSET/2,t.baseline+this.constants_.DARK_PATH_OFFSET)}}},zT=class{constructor(t){this.OFFSET=.5,this.constantProvider=t,this.START_POINT=On(this.OFFSET,this.OFFSET)}init(){this.INSIDE_CORNER=this.makeInsideCorner(),this.OUTSIDE_CORNER=this.makeOutsideCorner(),this.PUZZLE_TAB=this.makePuzzleTab(),this.NOTCH=this.makeNotch(),this.JAGGED_TEETH=this.makeJaggedTeeth(),this.START_HAT=this.makeStartHat()}makeInsideCorner(){const t=this.constantProvider.CORNER_RADIUS,e=this.OFFSET,s=(1-Math.SQRT1_2)*(t+e)-e,i=On(s,s)+Nn("a","0 0,0",t,Sn(-s-e,t-s)),o=Nn("a","0 0,0",t+e,Sn(t+e,t+e)),n=On(s,-s)+Nn("a","0 0,0",t+e,Sn(t-s,s+e));return{width:t+e,height:t,pathTop:t=>t?i:"",pathBottom:t=>t?o:n}}makeOutsideCorner(){const t=this.constantProvider.CORNER_RADIUS,e=this.OFFSET,s=(1-Math.SQRT1_2)*(t-e)+e,i=On(s,s)+Nn("a","0 0,1",t-e,Sn(t-s,-s+e)),o=On(e,t)+Nn("a","0 0,1",t-e,Sn(t,-t+e)),n=-s,r=On(s,n)+Nn("a","0 0,1",t-e,Sn(-s+e,-n-t));return{height:t,topLeft:t=>t?i:o,bottomLeft:()=>r}}makePuzzleTab(){const t=this.constantProvider.TAB_WIDTH,e=this.constantProvider.TAB_HEIGHT,s=On(-2,2.5-e+.9)+kn(-.45*t,-2.1),i=vn("v",2.5)+On(.97*-t,2.5)+Rn("q",[Sn(.05*-t,10),Sn(.3*t,9.5)])+On(.67*t,-1.9)+vn("v",2.5),o=vn("v",-1.5)+On(-.92*t,-.5)+Rn("q",[Sn(-.19*t,-5.5),Sn(0,-11)])+On(.92*t,1),n=On(-5,e-.7)+kn(.46*t,-2.1);return{width:t,height:e,pathUp:t=>t?s:o,pathDown:t=>t?i:n}}makeNotch(){return{pathLeft:vn("h",this.OFFSET)+this.constantProvider.NOTCH.pathLeft}}makeJaggedTeeth(){return{pathLeft:kn(5.1,2.6)+On(-10.2,6.8)+kn(5.1,2.6),height:12,width:10.2}}makeStartHat(){const t=this.constantProvider.START_HAT.height,e=On(25,-8.7)+Rn("c",[Sn(29.7,-6.2),Sn(57.2,-.5),Sn(75,8.7)]),s=Rn("c",[Sn(17.8,-9.2),Sn(45.3,-14.9),Sn(75,-8.7)])+yn(100.5,t+.5);return{path:t=>t?e:s}}},YT=class extends Eg{constructor(t,e){super(t,e),this.constants_=t,this.connectedBlock&&(this.width+=this.constants_.DARK_PATH_OFFSET,this.height+=this.constants_.DARK_PATH_OFFSET)}},KT=class extends Og{constructor(t,e){super(t,e),this.constants_=t,this.connectedBlock&&(this.height+=this.constants_.DARK_PATH_OFFSET)}},jT=class extends wg{constructor(t,e){super(t,e),this.renderer_=t}getRenderer(){return this.renderer_}populateBottomRow_(){super.populateBottomRow_(),this.block_.inputList.length&&this.block_.inputList[this.block_.inputList.length-1]instanceof lp||(this.bottomRow.minHeight=this.constants_.MEDIUM_PADDING-this.constants_.DARK_PATH_OFFSET)}addInput_(t,e){this.isInline&&t instanceof Hl.ValueInput$$module$build$src$core$inputs$value_input?(e.elements.push(new YT(this.constants_,t)),e.hasInlineInput=!0):t instanceof lp?(e.elements.push(new KT(this.constants_,t)),e.hasStatement=!0):t instanceof Hl.ValueInput$$module$build$src$core$inputs$value_input?(e.elements.push(new pg(this.constants_,t)),e.hasExternalInput=!0):(t instanceof np||t instanceof rp)&&(e.minHeight=Math.max(e.minHeight,this.constants_.DUMMY_INPUT_MIN_HEIGHT),e.hasDummyInput=!0),this.isInline||null!==e.align||(e.align=t.align)}addElemSpacing_(){let t=!1;for(let e,s=0;e=this.rows[s];s++)e.hasExternalInput&&(t=!0);for(let s,i=0;s=this.rows[i];i++){var e=s.elements;if(s.elements=[],s.startsWithElemSpacer()&&s.elements.push(new mg(this.constants_,this.getInRowSpacing_(null,e[0]))),e.length){for(let t=0;t0&&this.addAlignmentPadding_(i,t),t=i.width)}else super.alignRowElements_()}getDesiredRowWidth_(t){return this.isInline&&t.hasStatement?this.statementEdge+this.constants_.MAX_BOTTOM_WIDTH+this.startX:super.getDesiredRowWidth_(t)}finalize_(){let t=0,e=0;for(let i,o=0;i=this.rows[o];o++){i.yPos=e,i.xPos=this.startX,e+=i.height,t=Math.max(t,i.widthWithConnectedBlocks);var s=e-this.topRow.ascenderHeight;i===this.bottomRow&&s>>/sprites.png);\n height: 16px;\n vertical-align: middle;\n visibility: hidden;\n width: 16px;\n}\n\n.blocklyToolboxCategoryIconClosed {\n background-position: -32px -1px;\n}\n\n.blocklyToolbox[dir="RTL"] .blocklyToolboxCategoryIconClosed {\n background-position: 0 -1px;\n}\n\n.blocklyToolboxSelected>.blocklyToolboxCategoryIconClosed {\n background-position: -32px -17px;\n}\n\n.blocklyToolbox[dir="RTL"] .blocklyToolboxSelected>.blocklyToolboxCategoryIconClosed {\n background-position: 0 -17px;\n}\n\n.blocklyToolboxCategoryIconOpen {\n background-position: -16px -1px;\n}\n\n.blocklyToolboxSelected>.blocklyToolboxCategoryIconOpen {\n background-position: -16px -17px;\n}\n\n.blocklyToolboxCategoryLabel {\n cursor: default;\n font: 16px sans-serif;\n padding: 0 3px;\n vertical-align: middle;\n}\n\n.blocklyToolboxDelete .blocklyToolboxCategoryLabel {\n cursor: url("<<>>/handdelete.cur"), auto;\n}\n\n.blocklyToolboxSelected .blocklyToolboxCategoryLabel {\n color: #fff;\n}\n'),t(zl.TOOLBOX_ITEM,nm.registrationName,nm);var rm=class extends om{constructor(t,e){super(t,e),this.cssConfig_={container:"blocklyTreeSeparator"},this.htmlDiv=null,Object.assign(this.cssConfig_,t.cssconfig||t.cssConfig)}init(){this.createDom_()}createDom_(){const t=document.createElement("div");t.tabIndex=-1,t.id=this.getId();const e=this.cssConfig_.container;return e&&ct(t,e),this.htmlDiv=t}getDiv(){return this.htmlDiv}dispose(){pt(this.htmlDiv)}};rm.registrationName="sep",Vt('\n.blocklyTreeSeparator {\n border-bottom: solid #e5e5e5 1px;\n height: 0;\n margin: 5px 0;\n}\n\n.blocklyToolbox[layout="h"] .blocklyTreeSeparator {\n border-right: solid #e5e5e5 1px;\n border-bottom: none;\n height: auto;\n margin: 0 5px 0 5px;\n padding: 5px 0;\n width: 0;\n}\n'),t(zl.TOOLBOX_ITEM,rm.registrationName,rm);var lm=class extends nm{constructor(t,e,s){super(t,e,s),this.subcategoriesDiv_=null,this.expanded_=!1,this.toolboxItems_=[]}makeDefaultCssConfig_(){const t=super.makeDefaultCssConfig_();return t.contents="blocklyToolboxCategoryGroup",t}parseContents_(t){if("custom"in t)this.flyoutItems_=t.custom;else{const e=t.contents;if(e){this.flyoutItems_=[],t=!0;for(let s=0;s{this.mouseDown=!1}),this.boundEvents_.push(t),e=T(e,"keydown",this,this.onKeyDown_,!1),this.boundEvents_.push(e)}onClick_(t){if(this.mouseDown=!0,f(t)||t.target===this.HtmlDiv)At().hideChaff(!1);else{var e=t.target.getAttribute("id");e&&null!=(e=this.getToolboxItemById(e))&&e.isSelectable()&&(this.setSelectedItem(e),e.onClick(t)),At().hideChaff(!0)}d()}onKeyDown_(t){let e=!1;switch(t.key){case"ArrowDown":e=this.selectNext();break;case"ArrowUp":e=this.selectPrevious();break;case"ArrowLeft":e=this.selectParent();break;case"ArrowRight":e=this.selectChild();break;case"Enter":case" ":this.selectedItem_&&this.selectedItem_.isCollapsible()&&(this.selectedItem_.toggleExpanded(),e=!0);break;default:e=!1}!e&&this.selectedItem_&&this.selectedItem_.onKeyDown&&(e=this.selectedItem_.onKeyDown(t)),e&&t.preventDefault()}createFlyout_(){const t=this.workspace_,e=t.copyOptionsForFlyout();return e.toolboxPosition=t.options.toolboxPosition,new(t.horizontalLayout?c(zl.FLYOUTS_HORIZONTAL_TOOLBOX,t.options,!0):c(zl.FLYOUTS_VERTICAL_TOOLBOX,t.options,!0))(e)}render(t){this.toolboxDef_=t,this.contents.forEach(t=>t.dispose()),this.contents.clear(),this.renderContents_(t.contents),this.position(),this.handleToolboxItemResize()}renderContents_(t){const e=document.createDocumentFragment();for(let s=0;s{t.refreshTheme&&t.refreshTheme()})}refreshSelection(){if(this.selectedItem_&&this.selectedItem_.isSelectable()&&this.selectedItem_.getContents().length){let t;null==(t=this.flyout)||t.show(this.selectedItem_.getContents())}}setVisible(t){this.isVisible_!==t&&(this.HtmlDiv&&(this.HtmlDiv.style.display=t?"block":"none"),this.isVisible_=t,this.workspace_.recordDragTargets())}autoHide(t){!t&&this.flyout&&this.flyout.autoClose&&this.clearSelection()}setSelectedItem(t){const e=this.selectedItem_;!t&&!e||t&&!Pl(t)||(this.shouldDeselectItem_(e,t)&&null!==e&&this.deselectItem_(e),this.shouldSelectItem_(e,t)&&null!==t&&this.selectItem_(e,t),this.updateFlyout_(e,t),this.fireSelectEvent(e,t))}shouldDeselectItem_(t,e){return null!==t&&(!t.isCollapsible()||t!==e)}shouldSelectItem_(t,e){return null!==e&&e!==t}deselectItem_(t){this.selectedItem_=null,this.previouslySelectedItem_=t,t.setSelected(!1),Ne(this.contentsDiv_,Qc.ACTIVEDESCENDANT,"")}selectItem_(t,e){this.selectedItem_=e,this.previouslySelectedItem_=t,e.setSelected(!0),Ne(this.contentsDiv_,Qc.ACTIVEDESCENDANT,e.getId())}selectItemByPosition(t){(t=this.getToolboxItems()[t])&&this.setSelectedItem(t)}updateFlyout_(t,e){if(e&&(t!==e||e.isCollapsible())&&e.getContents().length){let t,s;null==(t=this.flyout)||t.show(e.getContents()),null==(s=this.flyout)||s.scrollToStart()}else{let t;null==(t=this.flyout)||t.hide()}}fireSelectEvent(t,e){const s=t&&t.getName();let i=e&&e.getName();t===e&&(i=null),t=new(rt(ua.TOOLBOX_ITEM_SELECT))(s,i,this.workspace_.id),J(t)}selectParent(){if(!this.selectedItem_)return!1;if(this.selectedItem_.isCollapsible()&&this.selectedItem_.isExpanded())return this.selectedItem_.toggleExpanded(),!0;let t;return!(null==(t=this.selectedItem_.getParent())||!t.isSelectable()||(this.setSelectedItem(this.selectedItem_.getParent()),0))}selectChild(){if(!this.selectedItem_||!this.selectedItem_.isCollapsible())return!1;const t=this.selectedItem_;return t.isExpanded()?this.selectNext():t.toggleExpanded(),!0}selectNext(){if(!this.selectedItem_)return!1;const t=[...this.contents.values()];let e=t.indexOf(this.selectedItem_)+1;if(e>-1&&e-1&&et.dispose()),t=0;tt.isSelectable()))?t:null}return null}getNestedTrees(){return[]}lookUpFocusableNode(t){return this.getToolboxItemById(t)}onTreeFocus(t,e){t!==this?this.getSelectedItem()===t||this.mouseDown||this.setSelectedItem(t):this.clearSelection()}onTreeBlur(t){let e;t&&t===(null==(e=this.flyout)?void 0:e.getWorkspace())||this.autoHide(!1)}};Vt('\n.blocklyToolboxDelete {\n cursor: url("<<>>/handdelete.cur"), auto;\n}\n\n.blocklyToolboxGrab {\n cursor: url("<<>>/handclosed.cur"), auto;\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n/* Category tree in Toolbox. */\n.blocklyToolbox {\n box-sizing: border-box;\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n background-color: #ddd;\n overflow-x: visible;\n overflow-y: auto;\n padding: 4px 0 4px 0;\n position: absolute;\n z-index: 70; /* so blocks go under toolbox when dragging */\n -webkit-tap-highlight-color: transparent; /* issue #1345 */\n}\n\n.blocklyToolboxCategoryGroup {\n display: flex;\n flex-wrap: wrap;\n flex-direction: column;\n}\n\n.blocklyToolboxCategoryGroup:focus {\n outline: none;\n}\n'),t(zl.TOOLBOX,Xl,am);var cm=Vd.INPUT_VALUE,hm=Vd.OUTPUT_VALUE,um=Vd.NEXT_STATEMENT,dm=Vd.PREVIOUS_STATEMENT,pm=Lc.TOP,gm=Lc.BOTTOM,_m=Lc.LEFT,Tm=Lc.RIGHT;Ug.prototype.newBlock=function(t,e){return new ap(this,t,e)},Gg.prototype.newBlock=function(t,e){return new Ep(this,t,e)},Ug.prototype.newComment=function(t){return new bd(this,t)},Gg.prototype.newComment=function(t){return new fd(this,t)},Gg.newTrashcan=function(t){return new qg(t)},Dd.prototype.newWorkspaceSvg=function(t){return new Gg(t)},Hl.Names$$module$build$src$core$names.prototype.populateProcedures=function(t){t=(t=lr(t))[0].concat(t[1]);for(let e=0;e0,text:i.replace("%1",r.getText()),callback:e.callbackFactory$$module$build$src$core$contextmenu(this,s)})}},onchange:function(t){t=this.getFieldValue("VAR"),t=e.getVariable$$module$build$src$core$variables(this.workspace,t),"variables_get_dynamic"===this.type?this.outputConnection.setCheck(t.getType()):this.getInput("VALUE").connection.setCheck(t.getType())}},o=function(t){return function(){const s=t.workspace,i=t.getField("VAR").getVariable();e.renameVariable$$module$build$src$core$variables(s,i)}},n=function(t){return function(){const s=t.getField("VAR").getVariable();s&&e.deleteVariable$$module$build$src$core$variables(s.getWorkspace(),s,t)}};e.registerMixin$$module$build$src$core$extensions("contextMenu_variableDynamicSetterGetter",i),e.defineBlocks$$module$build$src$core$common(s);var r={blocks:s},l=e.createBlockDefinitionsFromJsonArray$$module$build$src$core$common([{type:"variables_get",message0:"%1",args0:[{type:"field_variable",name:"VAR",variable:"%{BKY_VARIABLES_DEFAULT_NAME}"}],output:null,style:"variable_blocks",helpUrl:"%{BKY_VARIABLES_GET_HELPURL}",tooltip:"%{BKY_VARIABLES_GET_TOOLTIP}",extensions:["contextMenu_variableSetterGetter"]},{type:"variables_set",message0:"%{BKY_VARIABLES_SET}",args0:[{type:"field_variable",name:"VAR",variable:"%{BKY_VARIABLES_DEFAULT_NAME}"},{type:"input_value",name:"VALUE"}],previousStatement:null,nextStatement:null,style:"variable_blocks",tooltip:"%{BKY_VARIABLES_SET_TOOLTIP}",helpUrl:"%{BKY_VARIABLES_SET_HELPURL}",extensions:["contextMenu_variableSetterGetter"]}]),a={customContextMenu:function(t){if(this.isInFlyout)"variables_get"!==this.type&&"variables_get_reporter"!==this.type||(i={text:e.Msg$$module$build$src$core$msg.RENAME_VARIABLE,enabled:!0,callback:c(this)},o=this.getField("VAR").getText(),o={text:e.Msg$$module$build$src$core$msg.DELETE_VARIABLE.replace("%1",o),enabled:!0,callback:h(this)},t.unshift(i),t.unshift(o));else{if("variables_get"===this.type)var s="variables_set",i=e.Msg$$module$build$src$core$msg.VARIABLES_GET_CREATE_SET;else s="variables_get",i=e.Msg$$module$build$src$core$msg.VARIABLES_SET_CREATE_GET;var o=this.getField("VAR");s={type:s,fields:{VAR:o.saveState(!0)}},t.push({enabled:this.workspace.remainingCapacity()>0,text:i.replace("%1",o.getText()),callback:e.callbackFactory$$module$build$src$core$contextmenu(this,s)})}}},c=function(t){return function(){const s=t.workspace,i=t.getField("VAR").getVariable();e.renameVariable$$module$build$src$core$variables(s,i)}},h=function(t){return function(){const s=t.getField("VAR").getVariable();s&&e.deleteVariable$$module$build$src$core$variables(s.getWorkspace(),s,t)}};e.registerMixin$$module$build$src$core$extensions("contextMenu_variableSetterGetter",a),e.defineBlocks$$module$build$src$core$common(l);var u={blocks:l},d=e.createBlockDefinitionsFromJsonArray$$module$build$src$core$common([{type:"text",message0:"%1",args0:[{type:"field_input",name:"TEXT",text:""}],output:"String",style:"text_blocks",helpUrl:"%{BKY_TEXT_TEXT_HELPURL}",tooltip:"%{BKY_TEXT_TEXT_TOOLTIP}",extensions:["text_quotes","parent_tooltip_when_inline"]},{type:"text_join",message0:"",output:"String",style:"text_blocks",helpUrl:"%{BKY_TEXT_JOIN_HELPURL}",tooltip:"%{BKY_TEXT_JOIN_TOOLTIP}",mutator:"text_join_mutator"},{type:"text_create_join_container",message0:"%{BKY_TEXT_CREATE_JOIN_TITLE_JOIN} %1 %2",args0:[{type:"input_dummy"},{type:"input_statement",name:"STACK"}],style:"text_blocks",tooltip:"%{BKY_TEXT_CREATE_JOIN_TOOLTIP}",enableContextMenu:!1},{type:"text_create_join_item",message0:"%{BKY_TEXT_CREATE_JOIN_ITEM_TITLE_ITEM}",previousStatement:null,nextStatement:null,style:"text_blocks",tooltip:"%{BKY_TEXT_CREATE_JOIN_ITEM_TOOLTIP}",enableContextMenu:!1},{type:"text_append",message0:"%{BKY_TEXT_APPEND_TITLE}",args0:[{type:"field_variable",name:"VAR",variable:"%{BKY_TEXT_APPEND_VARIABLE}"},{type:"input_value",name:"TEXT"}],previousStatement:null,nextStatement:null,style:"text_blocks",extensions:["text_append_tooltip"]},{type:"text_length",message0:"%{BKY_TEXT_LENGTH_TITLE}",args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Number",style:"text_blocks",tooltip:"%{BKY_TEXT_LENGTH_TOOLTIP}",helpUrl:"%{BKY_TEXT_LENGTH_HELPURL}"},{type:"text_isEmpty",message0:"%{BKY_TEXT_ISEMPTY_TITLE}",args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Boolean",style:"text_blocks",tooltip:"%{BKY_TEXT_ISEMPTY_TOOLTIP}",helpUrl:"%{BKY_TEXT_ISEMPTY_HELPURL}"},{type:"text_indexOf",message0:"%{BKY_TEXT_INDEXOF_TITLE}",args0:[{type:"input_value",name:"VALUE",check:"String"},{type:"field_dropdown",name:"END",options:[["%{BKY_TEXT_INDEXOF_OPERATOR_FIRST}","FIRST"],["%{BKY_TEXT_INDEXOF_OPERATOR_LAST}","LAST"]]},{type:"input_value",name:"FIND",check:"String"}],output:"Number",style:"text_blocks",helpUrl:"%{BKY_TEXT_INDEXOF_HELPURL}",inputsInline:!0,extensions:["text_indexOf_tooltip"]},{type:"text_charAt",message0:"%{BKY_TEXT_CHARAT_TITLE}",args0:[{type:"input_value",name:"VALUE",check:"String"},{type:"field_dropdown",name:"WHERE",options:[["%{BKY_TEXT_CHARAT_FROM_START}","FROM_START"],["%{BKY_TEXT_CHARAT_FROM_END}","FROM_END"],["%{BKY_TEXT_CHARAT_FIRST}","FIRST"],["%{BKY_TEXT_CHARAT_LAST}","LAST"],["%{BKY_TEXT_CHARAT_RANDOM}","RANDOM"]]}],output:"String",style:"text_blocks",helpUrl:"%{BKY_TEXT_CHARAT_HELPURL}",inputsInline:!0,mutator:"text_charAt_mutator"}]),p={init:function(){this.WHERE_OPTIONS_1=[[e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_START_FROM_START,"FROM_START"],[e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_START_FROM_END,"FROM_END"],[e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_START_FIRST,"FIRST"]],this.WHERE_OPTIONS_2=[[e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_END_FROM_START,"FROM_START"],[e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_END_FROM_END,"FROM_END"],[e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_END_LAST,"LAST"]],this.setHelpUrl(e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_HELPURL),this.setStyle("text_blocks"),this.appendValueInput("STRING").setCheck("String").appendField(e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT);const t=t=>{const s=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:this["WHERE_OPTIONS_"+t]});return s.setValidator(function(e){const s=this.getValue();(e="FROM_START"===e||"FROM_END"===e)!=("FROM_START"===s||"FROM_END"===s)&&this.getSourceBlock().updateAt_(t,e)}),s};this.appendDummyInput("WHERE1_INPUT").appendField(t(1),"WHERE1"),this.appendDummyInput("AT1"),this.appendDummyInput("WHERE2_INPUT").appendField(t(2),"WHERE2"),this.appendDummyInput("AT2"),e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_TAIL&&this.appendDummyInput("TAIL").appendField(e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_TAIL),this.setInputsInline(!0),this.setOutput(!0,"String"),this.updateAt_(1,!0),this.updateAt_(2,!0),this.setTooltip(e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_TOOLTIP)},mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation");var s=this.getInput("AT1")instanceof e.ValueInput$$module$build$src$core$inputs$value_input;return t.setAttribute("at1",`${s}`),s=this.getInput("AT2")instanceof e.ValueInput$$module$build$src$core$inputs$value_input,t.setAttribute("at2",`${s}`),t},domToMutation:function(t){const e="true"===t.getAttribute("at1");t="true"===t.getAttribute("at2"),this.updateAt_(1,e),this.updateAt_(2,t)},updateAt_:function(t,s){this.removeInput("AT"+t),this.removeInput("ORDINAL"+t,!0),s?(this.appendValueInput("AT"+t).setCheck("Number"),e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX&&this.appendDummyInput("ORDINAL"+t).appendField(e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX)):this.appendDummyInput("AT"+t),2===t&&e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_TAIL&&(this.removeInput("TAIL",!0),this.appendDummyInput("TAIL").appendField(e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_TAIL)),1===t&&(this.moveInputBefore("AT1","WHERE2_INPUT"),this.getInput("ORDINAL1")&&this.moveInputBefore("ORDINAL1","WHERE2_INPUT"))}};d.text_getSubstring=p,d.text_changeCase={init:function(){const t=[[e.Msg$$module$build$src$core$msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE,"UPPERCASE"],[e.Msg$$module$build$src$core$msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE,"LOWERCASE"],[e.Msg$$module$build$src$core$msg.TEXT_CHANGECASE_OPERATOR_TITLECASE,"TITLECASE"]];this.setHelpUrl(e.Msg$$module$build$src$core$msg.TEXT_CHANGECASE_HELPURL),this.setStyle("text_blocks"),this.appendValueInput("TEXT").setCheck("String").appendField(e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:t}),"CASE"),this.setOutput(!0,"String"),this.setTooltip(e.Msg$$module$build$src$core$msg.TEXT_CHANGECASE_TOOLTIP)}},d.text_trim={init:function(){const t=[[e.Msg$$module$build$src$core$msg.TEXT_TRIM_OPERATOR_BOTH,"BOTH"],[e.Msg$$module$build$src$core$msg.TEXT_TRIM_OPERATOR_LEFT,"LEFT"],[e.Msg$$module$build$src$core$msg.TEXT_TRIM_OPERATOR_RIGHT,"RIGHT"]];this.setHelpUrl(e.Msg$$module$build$src$core$msg.TEXT_TRIM_HELPURL),this.setStyle("text_blocks"),this.appendValueInput("TEXT").setCheck("String").appendField(e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:t}),"MODE"),this.setOutput(!0,"String"),this.setTooltip(e.Msg$$module$build$src$core$msg.TEXT_TRIM_TOOLTIP)}},d.text_print={init:function(){this.jsonInit({message0:e.Msg$$module$build$src$core$msg.TEXT_PRINT_TITLE,args0:[{type:"input_value",name:"TEXT"}],previousStatement:null,nextStatement:null,style:"text_blocks",tooltip:e.Msg$$module$build$src$core$msg.TEXT_PRINT_TOOLTIP,helpUrl:e.Msg$$module$build$src$core$msg.TEXT_PRINT_HELPURL})}};var g={updateType_:function(t){this.outputConnection.setCheck("NUMBER"===t?"Number":"String")},mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation");return t.setAttribute("type",this.getFieldValue("TYPE")),t},domToMutation:function(t){this.updateType_(t.getAttribute("type"))}};d.text_prompt_ext=Object.assign({},g,{init:function(){var t=[[e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TYPE_TEXT,"TEXT"],[e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TYPE_NUMBER,"NUMBER"]];this.setHelpUrl(e.Msg$$module$build$src$core$msg.TEXT_PROMPT_HELPURL),this.setStyle("text_blocks"),(t=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:t})).setValidator(t=>{this.updateType_(t)}),this.appendValueInput("TEXT").appendField(t,"TYPE"),this.setOutput(!0,"String"),this.setTooltip(()=>"TEXT"===this.getFieldValue("TYPE")?e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TOOLTIP_TEXT:e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TOOLTIP_NUMBER)}}),d.text_prompt=Object.assign({},g,{init:function(){this.mixin(_);var t=[[e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TYPE_TEXT,"TEXT"],[e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TYPE_NUMBER,"NUMBER"]];this.setHelpUrl(e.Msg$$module$build$src$core$msg.TEXT_PROMPT_HELPURL),this.setStyle("text_blocks"),(t=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:t})).setValidator(t=>{this.updateType_(t)}),this.appendDummyInput().appendField(t,"TYPE").appendField(this.newQuote_(!0)).appendField(e.fromJson$$module$build$src$core$field_registry({type:"field_input",text:""}),"TEXT").appendField(this.newQuote_(!1)),this.setOutput(!0,"String"),this.setTooltip(()=>"TEXT"===this.getFieldValue("TYPE")?e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TOOLTIP_TEXT:e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TOOLTIP_NUMBER)}}),d.text_count={init:function(){this.jsonInit({message0:e.Msg$$module$build$src$core$msg.TEXT_COUNT_MESSAGE0,args0:[{type:"input_value",name:"SUB",check:"String"},{type:"input_value",name:"TEXT",check:"String"}],output:"Number",inputsInline:!0,style:"text_blocks",tooltip:e.Msg$$module$build$src$core$msg.TEXT_COUNT_TOOLTIP,helpUrl:e.Msg$$module$build$src$core$msg.TEXT_COUNT_HELPURL})}},d.text_replace={init:function(){this.jsonInit({message0:e.Msg$$module$build$src$core$msg.TEXT_REPLACE_MESSAGE0,args0:[{type:"input_value",name:"FROM",check:"String"},{type:"input_value",name:"TO",check:"String"},{type:"input_value",name:"TEXT",check:"String"}],output:"String",inputsInline:!0,style:"text_blocks",tooltip:e.Msg$$module$build$src$core$msg.TEXT_REPLACE_TOOLTIP,helpUrl:e.Msg$$module$build$src$core$msg.TEXT_REPLACE_HELPURL})}},d.text_reverse={init:function(){this.jsonInit({message0:e.Msg$$module$build$src$core$msg.TEXT_REVERSE_MESSAGE0,args0:[{type:"input_value",name:"TEXT",check:"String"}],output:"String",inputsInline:!0,style:"text_blocks",tooltip:e.Msg$$module$build$src$core$msg.TEXT_REVERSE_TOOLTIP,helpUrl:e.Msg$$module$build$src$core$msg.TEXT_REVERSE_HELPURL})}};var _={QUOTE_IMAGE_LEFT_DATAURI:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC",QUOTE_IMAGE_RIGHT_DATAURI:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==",QUOTE_IMAGE_WIDTH:12,QUOTE_IMAGE_HEIGHT:12,quoteField_:function(t){for(let e,s=0;e=this.inputList[s];s++)for(let s,i=0;s=e.fieldRow[i];i++)if(t===s.name)return e.insertFieldAt(i,this.newQuote_(!0)),void e.insertFieldAt(i+2,this.newQuote_(!1));console.warn('field named "'+t+'" not found in '+this.toDevString())},newQuote_:function(t){return t=this.RTL?!t:t,e.fromJson$$module$build$src$core$field_registry({type:"field_image",src:t?this.QUOTE_IMAGE_LEFT_DATAURI:this.QUOTE_IMAGE_RIGHT_DATAURI,width:this.QUOTE_IMAGE_WIDTH,height:this.QUOTE_IMAGE_HEIGHT,alt:t?"“":"”"})}},T={itemCount_:0,mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation");return t.setAttribute("items",`${this.itemCount_}`),t},domToMutation:function(t){this.itemCount_=parseInt(t.getAttribute("items"),10),this.updateShape_()},saveExtraState:function(){return{itemCount:this.itemCount_}},loadExtraState:function(t){this.itemCount_=t.itemCount,this.updateShape_()},decompose:function(t){const e=t.newBlock("text_create_join_container");e.initSvg();let s=e.getInput("STACK").connection;for(let e=0;ee.Msg$$module$build$src$core$msg.TEXT_INDEXOF_TOOLTIP.replace("%1",this.workspace.options.oneBasedIndex?"0":"-1"))}),e.register$$module$build$src$core$extensions("text_quotes",function(){this.mixin(_),this.quoteField_("TEXT")}),e.registerMixin$$module$build$src$core$extensions("quote_image_mixin",_),e.registerMutator$$module$build$src$core$extensions("text_join_mutator",T,function(){this.mixin(_),this.itemCount_=2,this.updateShape_(),this.setMutator(new e.MutatorIcon$$module$build$src$core$icons$mutator_icon(["text_create_join_item"],this))}),e.registerMutator$$module$build$src$core$extensions("text_charAt_mutator",m,function(){this.getField("WHERE").setValidator(function(t){t="FROM_START"===t||"FROM_END"===t;const e=this.getSourceBlock();t!==e.isAt_&&e.updateAt_(t)}),this.updateAt_(!0),this.setTooltip(()=>{var t=this.getFieldValue("WHERE");let s=e.Msg$$module$build$src$core$msg.TEXT_CHARAT_TOOLTIP;return("FROM_START"===t||"FROM_END"===t)&&(t="FROM_START"===t?e.Msg$$module$build$src$core$msg.LISTS_INDEX_FROM_START_TOOLTIP:e.Msg$$module$build$src$core$msg.LISTS_INDEX_FROM_END_TOOLTIP)&&(s+=" "+t.replace("%1",this.workspace.options.oneBasedIndex?"#1":"#0")),s})}),e.defineBlocks$$module$build$src$core$common(d);var E={blocks:d},b={},f={setStatements_:function(t){this.hasStatements_!==t&&(t?(this.appendStatementInput("STACK").appendField(e.Msg$$module$build$src$core$msg.PROCEDURES_DEFNORETURN_DO),this.getInput("RETURN")&&this.moveInputBefore("STACK","RETURN")):this.removeInput("STACK",!0),this.hasStatements_=t)},updateParams_:function(){let t="";this.arguments_.length&&(t=e.Msg$$module$build$src$core$msg.PROCEDURES_BEFORE_PARAMS+" "+this.arguments_.join(", ")),e.disable$$module$build$src$core$events$utils();try{this.setFieldValue(t,"PARAMS")}finally{e.enable$$module$build$src$core$events$utils()}},mutationToDom:function(t){const s=e.createElement$$module$build$src$core$utils$xml("mutation");t&&s.setAttribute("name",this.getFieldValue("NAME"));for(let i=0;i","GT"],["‏≥","GTE"]]},{type:"input_value",name:"B"}],inputsInline:!0,output:"Boolean",style:"logic_blocks",helpUrl:"%{BKY_LOGIC_COMPARE_HELPURL}",extensions:["logic_compare","logic_op_tooltip"]},{type:"logic_operation",message0:"%1 %2 %3",args0:[{type:"input_value",name:"A",check:"Boolean"},{type:"field_dropdown",name:"OP",options:[["%{BKY_LOGIC_OPERATION_AND}","AND"],["%{BKY_LOGIC_OPERATION_OR}","OR"]]},{type:"input_value",name:"B",check:"Boolean"}],inputsInline:!0,output:"Boolean",style:"logic_blocks",helpUrl:"%{BKY_LOGIC_OPERATION_HELPURL}",extensions:["logic_op_tooltip"]},{type:"logic_negate",message0:"%{BKY_LOGIC_NEGATE_TITLE}",args0:[{type:"input_value",name:"BOOL",check:"Boolean"}],output:"Boolean",style:"logic_blocks",tooltip:"%{BKY_LOGIC_NEGATE_TOOLTIP}",helpUrl:"%{BKY_LOGIC_NEGATE_HELPURL}"},{type:"logic_null",message0:"%{BKY_LOGIC_NULL}",output:null,style:"logic_blocks",tooltip:"%{BKY_LOGIC_NULL_TOOLTIP}",helpUrl:"%{BKY_LOGIC_NULL_HELPURL}"},{type:"logic_ternary",message0:"%{BKY_LOGIC_TERNARY_CONDITION} %1",args0:[{type:"input_value",name:"IF",check:"Boolean"}],message1:"%{BKY_LOGIC_TERNARY_IF_TRUE} %1",args1:[{type:"input_value",name:"THEN"}],message2:"%{BKY_LOGIC_TERNARY_IF_FALSE} %1",args2:[{type:"input_value",name:"ELSE"}],output:null,style:"logic_blocks",tooltip:"%{BKY_LOGIC_TERNARY_TOOLTIP}",helpUrl:"%{BKY_LOGIC_TERNARY_HELPURL}",extensions:["logic_ternary"]},{type:"controls_if_if",message0:"%{BKY_CONTROLS_IF_IF_TITLE_IF}",nextStatement:null,enableContextMenu:!1,style:"logic_blocks",tooltip:"%{BKY_CONTROLS_IF_IF_TOOLTIP}"},{type:"controls_if_elseif",message0:"%{BKY_CONTROLS_IF_ELSEIF_TITLE_ELSEIF}",previousStatement:null,nextStatement:null,enableContextMenu:!1,style:"logic_blocks",tooltip:"%{BKY_CONTROLS_IF_ELSEIF_TOOLTIP}"},{type:"controls_if_else",message0:"%{BKY_CONTROLS_IF_ELSE_TITLE_ELSE}",previousStatement:null,enableContextMenu:!1,style:"logic_blocks",tooltip:"%{BKY_CONTROLS_IF_ELSE_TOOLTIP}"}]);e.register$$module$build$src$core$extensions("logic_op_tooltip",e.buildTooltipForDropdown$$module$build$src$core$extensions("OP",{EQ:"%{BKY_LOGIC_COMPARE_TOOLTIP_EQ}",NEQ:"%{BKY_LOGIC_COMPARE_TOOLTIP_NEQ}",LT:"%{BKY_LOGIC_COMPARE_TOOLTIP_LT}",LTE:"%{BKY_LOGIC_COMPARE_TOOLTIP_LTE}",GT:"%{BKY_LOGIC_COMPARE_TOOLTIP_GT}",GTE:"%{BKY_LOGIC_COMPARE_TOOLTIP_GTE}",AND:"%{BKY_LOGIC_OPERATION_TOOLTIP_AND}",OR:"%{BKY_LOGIC_OPERATION_TOOLTIP_OR}"}));var B={elseifCount_:0,elseCount_:0,mutationToDom:function(){if(!this.elseifCount_&&!this.elseCount_)return null;const t=e.createElement$$module$build$src$core$utils$xml("mutation");return this.elseifCount_&&t.setAttribute("elseif",String(this.elseifCount_)),this.elseCount_&&t.setAttribute("else","1"),t},domToMutation:function(t){this.elseifCount_=parseInt(t.getAttribute("elseif"),10)||0,this.elseCount_=parseInt(t.getAttribute("else"),10)||0,this.rebuildShape_()},saveExtraState:function(){if(!this.elseifCount_&&!this.elseCount_)return null;const t=Object.create(null);return this.elseifCount_&&(t.elseIfCount=this.elseifCount_),this.elseCount_&&(t.hasElse=!0),t},loadExtraState:function(t){this.elseifCount_=t.elseIfCount||0,this.elseCount_=t.hasElse?1:0,this.updateShape_()},decompose:function(t){const e=t.newBlock("controls_if_if");e.initSvg();let s=e.nextConnection;for(let e=1;e<=this.elseifCount_;e++){const e=t.newBlock("controls_if_elseif");e.initSvg(),s.connect(e.previousConnection),s=e.nextConnection}return this.elseCount_&&((t=t.newBlock("controls_if_else")).initSvg(),s.connect(t.previousConnection)),e},compose:function(t){t=t.nextConnection.targetBlock(),this.elseCount_=this.elseifCount_=0;const e=[null],s=[null];let i=null;for(;t;){if(!t.isInsertionMarker())switch(t.type){case"controls_if_elseif":this.elseifCount_++,e.push(t.valueConnection_),s.push(t.statementConnection_);break;case"controls_if_else":this.elseCount_++,i=t.statementConnection_;break;default:throw TypeError("Unknown block type: "+t.type)}t=t.getNextBlock()}this.updateShape_(),this.reconnectChildBlocks_(e,s,i)},saveConnections:function(t){t=t.nextConnection.targetBlock();let e=1;for(;t;){if(!t.isInsertionMarker())switch(t.type){case"controls_if_elseif":var s=this.getInput("IF"+e);const i=this.getInput("DO"+e);t.valueConnection_=s&&s.connection.targetConnection,t.statementConnection_=i&&i.connection.targetConnection,e++;break;case"controls_if_else":s=this.getInput("ELSE"),t.statementConnection_=s&&s.connection.targetConnection;break;default:throw TypeError("Unknown block type: "+t.type)}t=t.getNextBlock()}},rebuildShape_:function(){const t=[null],e=[null];let s=null;this.getInput("ELSE")&&(s=this.getInput("ELSE").connection.targetConnection);for(let s=1;this.getInput("IF"+s);s++){const i=this.getInput("IF"+s),o=this.getInput("DO"+s);t.push(i.connection.targetConnection),e.push(o.connection.targetConnection)}this.updateShape_(),this.reconnectChildBlocks_(t,e,s)},updateShape_:function(){this.getInput("ELSE")&&this.removeInput("ELSE");for(var t=1;this.getInput("IF"+t);t++)this.removeInput("IF"+t),this.removeInput("DO"+t);for(t=1;t<=this.elseifCount_;t++)this.appendValueInput("IF"+t).setCheck("Boolean").appendField(e.Msg$$module$build$src$core$msg.CONTROLS_IF_MSG_ELSEIF),this.appendStatementInput("DO"+t).appendField(e.Msg$$module$build$src$core$msg.CONTROLS_IF_MSG_THEN);this.elseCount_&&this.appendStatementInput("ELSE").appendField(e.Msg$$module$build$src$core$msg.CONTROLS_IF_MSG_ELSE)},reconnectChildBlocks_:function(t,e,s){for(let s=1;s<=this.elseifCount_;s++){let i,o;null==(i=t[s])||i.reconnect(this,"IF"+s),null==(o=e[s])||o.reconnect(this,"DO"+s)}null==s||s.reconnect(this,"ELSE")}};e.registerMutator$$module$build$src$core$extensions("controls_if_mutator",B,null,["controls_if_elseif","controls_if_else"]);e.register$$module$build$src$core$extensions("controls_if_tooltip",function(){this.setTooltip(function(){return this.elseifCount_||this.elseCount_?!this.elseifCount_&&this.elseCount_?e.Msg$$module$build$src$core$msg.CONTROLS_IF_TOOLTIP_2:this.elseifCount_&&!this.elseCount_?e.Msg$$module$build$src$core$msg.CONTROLS_IF_TOOLTIP_3:this.elseifCount_&&this.elseCount_?e.Msg$$module$build$src$core$msg.CONTROLS_IF_TOOLTIP_4:"":e.Msg$$module$build$src$core$msg.CONTROLS_IF_TOOLTIP_1}.bind(this))});var F={onchange:function(t){this.prevBlocks_||(this.prevBlocks_=[null,null]);var s=this.getInputTargetBlock("A");const i=this.getInputTargetBlock("B");s&&i&&!this.workspace.connectionChecker.doTypeChecks(s.outputConnection,i.outputConnection)&&(e.setGroup$$module$build$src$core$events$utils(t.group),(t=this.prevBlocks_[0])!==s&&(s.unplug(),!t||t.isDisposed()||t.isShadow()||this.getInput("A").connection.connect(t.outputConnection)),(s=this.prevBlocks_[1])!==i&&(i.unplug(),!s||s.isDisposed()||s.isShadow()||this.getInput("B").connection.connect(s.outputConnection)),this.bumpNeighbours(),e.setGroup$$module$build$src$core$events$utils(!1)),this.prevBlocks_[0]=this.getInputTargetBlock("A"),this.prevBlocks_[1]=this.getInputTargetBlock("B")}};e.register$$module$build$src$core$extensions("logic_compare",function(){this.mixin(F)});var U={prevParentConnection_:null,onchange:function(t){const s=this.getInputTargetBlock("THEN"),i=this.getInputTargetBlock("ELSE"),o=this.outputConnection.targetConnection;if((s||i)&&o)for(let n=0;n<2;n++){const r=1===n?s:i;r&&!r.workspace.connectionChecker.doTypeChecks(r.outputConnection,o)&&(e.setGroup$$module$build$src$core$events$utils(t.group),o===this.prevParentConnection_?(this.unplug(),o.getSourceBlock().bumpNeighbours()):(r.unplug(),r.bumpNeighbours()),e.setGroup$$module$build$src$core$events$utils(!1))}this.prevParentConnection_=o}};e.registerMixin$$module$build$src$core$extensions("logic_ternary",U),e.defineBlocks$$module$build$src$core$common(P);var H={blocks:P},G=e.createBlockDefinitionsFromJsonArray$$module$build$src$core$common([{type:"lists_create_empty",message0:"%{BKY_LISTS_CREATE_EMPTY_TITLE}",output:"Array",style:"list_blocks",tooltip:"%{BKY_LISTS_CREATE_EMPTY_TOOLTIP}",helpUrl:"%{BKY_LISTS_CREATE_EMPTY_HELPURL}"},{type:"lists_repeat",message0:"%{BKY_LISTS_REPEAT_TITLE}",args0:[{type:"input_value",name:"ITEM"},{type:"input_value",name:"NUM",check:"Number"}],output:"Array",style:"list_blocks",tooltip:"%{BKY_LISTS_REPEAT_TOOLTIP}",helpUrl:"%{BKY_LISTS_REPEAT_HELPURL}"},{type:"lists_reverse",message0:"%{BKY_LISTS_REVERSE_MESSAGE0}",args0:[{type:"input_value",name:"LIST",check:"Array"}],output:"Array",inputsInline:!0,style:"list_blocks",tooltip:"%{BKY_LISTS_REVERSE_TOOLTIP}",helpUrl:"%{BKY_LISTS_REVERSE_HELPURL}"},{type:"lists_isEmpty",message0:"%{BKY_LISTS_ISEMPTY_TITLE}",args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Boolean",style:"list_blocks",tooltip:"%{BKY_LISTS_ISEMPTY_TOOLTIP}",helpUrl:"%{BKY_LISTS_ISEMPTY_HELPURL}"},{type:"lists_length",message0:"%{BKY_LISTS_LENGTH_TITLE}",args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Number",style:"list_blocks",tooltip:"%{BKY_LISTS_LENGTH_TOOLTIP}",helpUrl:"%{BKY_LISTS_LENGTH_HELPURL}"}]),V={init:function(){this.setHelpUrl(e.Msg$$module$build$src$core$msg.LISTS_CREATE_WITH_HELPURL),this.setStyle("list_blocks"),this.itemCount_=3,this.updateShape_(),this.setOutput(!0,"Array"),this.setMutator(new e.MutatorIcon$$module$build$src$core$icons$mutator_icon(["lists_create_with_item"],this)),this.setTooltip(e.Msg$$module$build$src$core$msg.LISTS_CREATE_WITH_TOOLTIP)},mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation");return t.setAttribute("items",String(this.itemCount_)),t},domToMutation:function(t){if(!(t=t.getAttribute("items")))throw new TypeError("element did not have items");this.itemCount_=parseInt(t,10),this.updateShape_()},saveExtraState:function(){return{itemCount:this.itemCount_}},loadExtraState:function(t){this.itemCount_=t.itemCount,this.updateShape_()},decompose:function(t){const e=t.newBlock("lists_create_with_container");e.initSvg();let s=e.getInput("STACK").connection;for(let e=0;ee.Msg$$module$build$src$core$msg.LISTS_INDEX_OF_TOOLTIP.replace("%1",this.workspace.options.oneBasedIndex?"0":"-1"))}};G.lists_indexOf=z;var Y={init:function(){var t=[[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_GET,"GET"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_GET_REMOVE,"GET_REMOVE"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_REMOVE,"REMOVE"]];this.WHERE_OPTIONS=[[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_FROM_START,"FROM_START"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_FROM_END,"FROM_END"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_FIRST,"FIRST"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_LAST,"LAST"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_RANDOM,"RANDOM"]],this.setHelpUrl(e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_HELPURL),this.setStyle("list_blocks"),(t=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:t})).setValidator(function(t){t="REMOVE"===t,this.getSourceBlock().updateStatement_(t)}),this.appendValueInput("VALUE").setCheck("Array").appendField(e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_INPUT_IN_LIST),this.appendDummyInput().appendField(t,"MODE").appendField("","SPACE"),(t=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:this.WHERE_OPTIONS})).setValidator(function(t){const e=this.getValue();(t="FROM_START"===t||"FROM_END"===t)!=("FROM_START"===e||"FROM_END"===e)&&this.getSourceBlock().updateAt_(t)}),this.appendDummyInput().appendField(t,"WHERE"),this.appendDummyInput("AT"),e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TAIL&&this.appendDummyInput("TAIL").appendField(e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TAIL),this.setInputsInline(!0),this.setOutput(!0),this.updateAt_(!0),this.setTooltip(()=>{const t=this.getFieldValue("MODE"),s=this.getFieldValue("WHERE");let i="";switch(t+" "+s){case"GET FROM_START":case"GET FROM_END":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM;break;case"GET FIRST":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST;break;case"GET LAST":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST;break;case"GET RANDOM":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM;break;case"GET_REMOVE FROM_START":case"GET_REMOVE FROM_END":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM;break;case"GET_REMOVE FIRST":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST;break;case"GET_REMOVE LAST":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST;break;case"GET_REMOVE RANDOM":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM;break;case"REMOVE FROM_START":case"REMOVE FROM_END":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM;break;case"REMOVE FIRST":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST;break;case"REMOVE LAST":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST;break;case"REMOVE RANDOM":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM}return"FROM_START"!==s&&"FROM_END"!==s||(i+=" "+("FROM_START"===s?e.Msg$$module$build$src$core$msg.LISTS_INDEX_FROM_START_TOOLTIP:e.Msg$$module$build$src$core$msg.LISTS_INDEX_FROM_END_TOOLTIP).replace("%1",this.workspace.options.oneBasedIndex?"#1":"#0")),i})},mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation");t.setAttribute("statement",String(!this.outputConnection));const s=this.getInput("AT")instanceof e.ValueInput$$module$build$src$core$inputs$value_input;return t.setAttribute("at",String(s)),t},domToMutation:function(t){const e="true"===t.getAttribute("statement");this.updateStatement_(e),t="false"!==t.getAttribute("at"),this.updateAt_(t)},saveExtraState:function(){return this.outputConnection?null:{isStatement:!0}},loadExtraState:function(t){t.isStatement?this.updateStatement_(!0):"string"==typeof t&&this.domToMutation(e.textToDom$$module$build$src$core$utils$xml(t))},updateStatement_:function(t){t!==!this.outputConnection&&(this.unplug(!0,!0),t?(this.setOutput(!1),this.setPreviousStatement(!0),this.setNextStatement(!0)):(this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0)))},updateAt_:function(t){this.removeInput("AT"),this.removeInput("ORDINAL",!0),t?(this.appendValueInput("AT").setCheck("Number"),e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX&&this.appendDummyInput("ORDINAL").appendField(e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX)):this.appendDummyInput("AT"),e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TAIL&&this.moveInputBefore("TAIL",null)}};G.lists_getIndex=Y;var K={init:function(){var t=[[e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_SET,"SET"],[e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_INSERT,"INSERT"]];this.WHERE_OPTIONS=[[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_FROM_START,"FROM_START"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_FROM_END,"FROM_END"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_FIRST,"FIRST"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_LAST,"LAST"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_RANDOM,"RANDOM"]],this.setHelpUrl(e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_HELPURL),this.setStyle("list_blocks"),this.appendValueInput("LIST").setCheck("Array").appendField(e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_INPUT_IN_LIST),t=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:t}),this.appendDummyInput().appendField(t,"MODE").appendField("","SPACE"),(t=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:this.WHERE_OPTIONS})).setValidator(function(t){const e=this.getValue();(t="FROM_START"===t||"FROM_END"===t)!=("FROM_START"===e||"FROM_END"===e)&&this.getSourceBlock().updateAt_(t)}),this.appendDummyInput().appendField(t,"WHERE"),this.appendDummyInput("AT"),this.appendValueInput("TO").appendField(e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_INPUT_TO),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP),this.updateAt_(!0),this.setTooltip(()=>{const t=this.getFieldValue("MODE"),s=this.getFieldValue("WHERE");let i="";switch(t+" "+s){case"SET FROM_START":case"SET FROM_END":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM;break;case"SET FIRST":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST;break;case"SET LAST":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST;break;case"SET RANDOM":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM;break;case"INSERT FROM_START":case"INSERT FROM_END":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM;break;case"INSERT FIRST":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST;break;case"INSERT LAST":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST;break;case"INSERT RANDOM":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM}return"FROM_START"!==s&&"FROM_END"!==s||(i+=" "+e.Msg$$module$build$src$core$msg.LISTS_INDEX_FROM_START_TOOLTIP.replace("%1",this.workspace.options.oneBasedIndex?"#1":"#0")),i})},mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation"),s=this.getInput("AT")instanceof e.ValueInput$$module$build$src$core$inputs$value_input;return t.setAttribute("at",String(s)),t},domToMutation:function(t){t="false"!==t.getAttribute("at"),this.updateAt_(t)},saveExtraState:function(){return null},loadExtraState:function(){},updateAt_:function(t){this.removeInput("AT"),this.removeInput("ORDINAL",!0),t?(this.appendValueInput("AT").setCheck("Number"),e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX&&this.appendDummyInput("ORDINAL").appendField(e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX)):this.appendDummyInput("AT"),this.moveInputBefore("AT","TO"),this.getInput("ORDINAL")&&this.moveInputBefore("ORDINAL","TO")}};G.lists_setIndex=K;var j={init:function(){this.WHERE_OPTIONS_1=[[e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_START_FROM_START,"FROM_START"],[e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_START_FROM_END,"FROM_END"],[e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_START_FIRST,"FIRST"]],this.WHERE_OPTIONS_2=[[e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_END_FROM_START,"FROM_START"],[e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_END_FROM_END,"FROM_END"],[e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_END_LAST,"LAST"]],this.setHelpUrl(e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_HELPURL),this.setStyle("list_blocks"),this.appendValueInput("LIST").setCheck("Array").appendField(e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_INPUT_IN_LIST);const t=t=>{const s=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:this["WHERE_OPTIONS_"+t]});return s.setValidator(function(e){const s=this.getValue();(e="FROM_START"===e||"FROM_END"===e)!=("FROM_START"===s||"FROM_END"===s)&&this.getSourceBlock().updateAt_(t,e)}),s};this.appendDummyInput("WHERE1_INPUT").appendField(t(1),"WHERE1"),this.appendDummyInput("AT1"),this.appendDummyInput("WHERE2_INPUT").appendField(t(2),"WHERE2"),this.appendDummyInput("AT2"),e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_TAIL&&this.appendDummyInput("TAIL").appendField(e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_TAIL),this.setInputsInline(!0),this.setOutput(!0,"Array"),this.updateAt_(1,!0),this.updateAt_(2,!0),this.setTooltip(e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_TOOLTIP)},mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation");var s=this.getInput("AT1")instanceof e.ValueInput$$module$build$src$core$inputs$value_input;return t.setAttribute("at1",String(s)),s=this.getInput("AT2")instanceof e.ValueInput$$module$build$src$core$inputs$value_input,t.setAttribute("at2",String(s)),t},domToMutation:function(t){const e="true"===t.getAttribute("at1");t="true"===t.getAttribute("at2"),this.updateAt_(1,e),this.updateAt_(2,t)},saveExtraState:function(){return null},loadExtraState:function(){},updateAt_:function(t,s){this.removeInput("AT"+t),this.removeInput("ORDINAL"+t,!0),s?(this.appendValueInput("AT"+t).setCheck("Number"),e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX&&this.appendDummyInput("ORDINAL"+t).appendField(e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX)):this.appendDummyInput("AT"+t),1===t&&(this.moveInputBefore("AT1","WHERE2_INPUT"),this.getInput("ORDINAL1")&&this.moveInputBefore("ORDINAL1","WHERE2_INPUT")),e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_TAIL&&this.moveInputBefore("TAIL",null)}};G.lists_getSublist=j,G.lists_sort={init:function(){this.jsonInit({message0:"%{BKY_LISTS_SORT_TITLE}",args0:[{type:"field_dropdown",name:"TYPE",options:[["%{BKY_LISTS_SORT_TYPE_NUMERIC}","NUMERIC"],["%{BKY_LISTS_SORT_TYPE_TEXT}","TEXT"],["%{BKY_LISTS_SORT_TYPE_IGNORECASE}","IGNORE_CASE"]]},{type:"field_dropdown",name:"DIRECTION",options:[["%{BKY_LISTS_SORT_ORDER_ASCENDING}","1"],["%{BKY_LISTS_SORT_ORDER_DESCENDING}","-1"]]},{type:"input_value",name:"LIST",check:"Array"}],output:"Array",style:"list_blocks",tooltip:"%{BKY_LISTS_SORT_TOOLTIP}",helpUrl:"%{BKY_LISTS_SORT_HELPURL}"})}},G.lists_split={init:function(){const t=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:[[e.Msg$$module$build$src$core$msg.LISTS_SPLIT_LIST_FROM_TEXT,"SPLIT"],[e.Msg$$module$build$src$core$msg.LISTS_SPLIT_TEXT_FROM_LIST,"JOIN"]]});if(!t)throw Error("field_dropdown not found");t.setValidator(t=>{this.updateType_(t)}),this.setHelpUrl(e.Msg$$module$build$src$core$msg.LISTS_SPLIT_HELPURL),this.setStyle("list_blocks"),this.appendValueInput("INPUT").setCheck("String").appendField(t,"MODE"),this.appendValueInput("DELIM").setCheck("String").appendField(e.Msg$$module$build$src$core$msg.LISTS_SPLIT_WITH_DELIMITER),this.setInputsInline(!0),this.setOutput(!0,"Array"),this.setTooltip(()=>{const t=this.getFieldValue("MODE");if("SPLIT"===t)return e.Msg$$module$build$src$core$msg.LISTS_SPLIT_TOOLTIP_SPLIT;if("JOIN"===t)return e.Msg$$module$build$src$core$msg.LISTS_SPLIT_TOOLTIP_JOIN;throw Error("Unknown mode: "+t)})},updateType_:function(t){if(this.getFieldValue("MODE")!==t){const t=this.getInput("INPUT").connection;t.setShadowDom(null);const e=t.targetBlock();e&&(t.disconnect(),e.isShadow()?e.dispose(!1):this.bumpNeighbours())}"SPLIT"===t?(this.outputConnection.setCheck("Array"),this.getInput("INPUT").setCheck("String")):(this.outputConnection.setCheck("String"),this.getInput("INPUT").setCheck("Array"))},mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation");return t.setAttribute("mode",this.getFieldValue("MODE")),t},domToMutation:function(t){this.updateType_(t.getAttribute("mode"))},saveExtraState:function(){return{mode:this.getFieldValue("MODE")}},loadExtraState:function(t){this.updateType_(t.mode)}},e.defineBlocks$$module$build$src$core$common(G);var J={blocks:G},q={blocks:Object.assign({},G,P,w,k,b,d,l,s),lists:J,logic:H,loops:x,math:N,procedures:O,texts:E,variables:u,variablesDynamic:r};return q.__namespace__=e,q},void 0===(n=i.apply(e,o))||(t.exports=n)},548(t,e,s){var i,o,n;o=[s(500),s(955),s(822)],void 0===(n="function"==typeof(i=function(t,e,s){"use strict";return t.setLocale(e),t})?i.apply(e,o):i)||(t.exports=n)},449(t,e,s){var i,o,n;o=[s(500)],void 0===(n="function"==typeof(i=function(t){var e,s,i=t.__namespace__,o=function(t,s){var i=0;let o="";s.STATEMENT_PREFIX&&(o+=s.injectId(s.STATEMENT_PREFIX,t));do{const n=s.valueToCode(t,"IF"+i,e.NONE)||"false";let r=s.statementToCode(t,"DO"+i);s.STATEMENT_SUFFIX&&(r=s.prefixLines(s.injectId(s.STATEMENT_SUFFIX,t),s.INDENT)+r),o+=(i>0?" else ":"")+"if ("+n+") {\n"+r+"}",i++}while(t.getInput("IF"+i));return(t.getInput("ELSE")||s.STATEMENT_SUFFIX)&&(i=t.getInput("ELSE")?s.statementToCode(t,"ELSE"):"",s.STATEMENT_SUFFIX&&(i=s.prefixLines(s.injectId(s.STATEMENT_SUFFIX,t),s.INDENT)+i),o+=" else {\n"+i+"}"),o+"\n"},n=function(t,s){let o;o=t.getField("TIMES")?String(Number(t.getFieldValue("TIMES"))):s.valueToCode(t,"TIMES",e.ASSIGNMENT)||"0";let n=s.statementToCode(t,"DO");n=s.addLoopTrap(n,t),t="";const r=s.nameDB_.getDistinctName("count",i.NameType$$module$build$src$core$names.VARIABLE);let l=o;return o.match(/^\w+$/)||i.isNumber$$module$build$src$core$utils$string(o)||(l=s.nameDB_.getDistinctName("repeat_end",i.NameType$$module$build$src$core$names.VARIABLE),t+="var "+l+" = "+o+";\n"),t+"for (var "+r+" = 0; "+r+" < "+l+"; "+r+"++) {\n"+n+"}\n"},r=function(t,s){const i=t.getFieldValue("OP");let o;if("NEG"===i)return"-"===(t=s.valueToCode(t,"NUM",e.UNARY_NEGATION)||"0")[0]&&(t=" "+t),["-"+t,e.UNARY_NEGATION];switch(t="SIN"===i||"COS"===i||"TAN"===i?s.valueToCode(t,"NUM",e.DIVISION)||"0":s.valueToCode(t,"NUM",e.NONE)||"0",i){case"ABS":o="Math.abs("+t+")";break;case"ROOT":o="Math.sqrt("+t+")";break;case"LN":o="Math.log("+t+")";break;case"EXP":o="Math.exp("+t+")";break;case"POW10":o="Math.pow(10,"+t+")";break;case"ROUND":o="Math.round("+t+")";break;case"ROUNDUP":o="Math.ceil("+t+")";break;case"ROUNDDOWN":o="Math.floor("+t+")";break;case"SIN":o="Math.sin("+t+" / 180 * Math.PI)";break;case"COS":o="Math.cos("+t+" / 180 * Math.PI)";break;case"TAN":o="Math.tan("+t+" / 180 * Math.PI)"}if(o)return[o,e.FUNCTION_CALL];switch(i){case"LOG10":o="Math.log("+t+") / Math.log(10)";break;case"ASIN":o="Math.asin("+t+") / Math.PI * 180";break;case"ACOS":o="Math.acos("+t+") / Math.PI * 180";break;case"ATAN":o="Math.atan("+t+") / Math.PI * 180";break;default:throw Error("Unknown math operator: "+i)}return[o,e.DIVISION]},l=function(t,s){const i=s.getProcedureName(t.getFieldValue("NAME"));var o="";s.STATEMENT_PREFIX&&(o+=s.injectId(s.STATEMENT_PREFIX,t)),s.STATEMENT_SUFFIX&&(o+=s.injectId(s.STATEMENT_SUFFIX,t)),o&&(o=s.prefixLines(o,s.INDENT));let n="";s.INFINITE_LOOP_TRAP&&(n=s.prefixLines(s.injectId(s.INFINITE_LOOP_TRAP,t),s.INDENT));let r="";t.getInput("STACK")&&(r=s.statementToCode(t,"STACK"));let l="";t.getInput("RETURN")&&(l=s.valueToCode(t,"RETURN",e.NONE)||"");let a="";r&&l&&(a=o),l&&(l=s.INDENT+"return "+l+";\n");const c=[],h=t.getVars();for(let t=0;t0?a=e.ADDITION:o<0?a=e.SUBTRACTION:n&&(a=e.UNARY_NEGATION),t=this.valueToCode(t,s,a)||l,0!==o||n?i.isNumber$$module$build$src$core$utils$string(t)?(t=String(Number(t)+o),n&&(t=String(-Number(t))),t):(o>0?t=`${t} + ${o}`:o<0&&(t=`${t} - ${-o}`),n&&(t=o?`-(${t})`:`-${t}`),Math.floor(r)>=Math.floor(a)&&(t=`(${t})`),t):t}},d={};d.JavascriptGenerator=u,d.Order=e;var p=function(t,e,s){return"FIRST"===e?"0":"FROM_END"===e?t+".length - 1 - "+s:"LAST"===e?t+".length - 1":s},g={lists_create_empty:function(t,s){return["[]",e.ATOMIC]},lists_create_with:function(t,s){const i=Array(t.itemCount_);for(let o=0;o String(b) ? 1 : -1; },\n 'IGNORE_CASE': function(a, b) {\n return String(a).toLowerCase() > String(b).toLowerCase() ? 1 : -1; },\n };\n var compare = compareFuncs[type];\n return function(a, b) { return compare(a, b) * direction; };\n}\n `))+'("'+t+'", '+o+"))",e.FUNCTION_CALL]},lists_split:function(t,s){let i=s.valueToCode(t,"INPUT",e.MEMBER);if(s=s.valueToCode(t,"DELIM",e.NONE)||"''","SPLIT"===(t=t.getFieldValue("MODE")))i||(i="''"),t="split";else{if("JOIN"!==t)throw Error("Unknown mode: "+t);i||(i="[]"),t="join"}return[i+"."+t+"("+s+")",e.FUNCTION_CALL]}},_={};_.controls_if=o,_.controls_ifelse=o,_.logic_boolean=function(t,s){return["TRUE"===t.getFieldValue("BOOL")?"true":"false",e.ATOMIC]},_.logic_compare=function(t,s){const i={EQ:"==",NEQ:"!=",LT:"<",LTE:"<=",GT:">",GTE:">="}[t.getFieldValue("OP")],o="=="===i||"!="===i?e.EQUALITY:e.RELATIONAL;return[(s.valueToCode(t,"A",o)||"0")+" "+i+" "+(t=s.valueToCode(t,"B",o)||"0"),o]},_.logic_negate=function(t,s){const i=e.LOGICAL_NOT;return["!"+(s.valueToCode(t,"BOOL",i)||"true"),i]},_.logic_null=function(t,s){return["null",e.ATOMIC]},_.logic_operation=function(t,s){const i="AND"===t.getFieldValue("OP")?"&&":"||",o="&&"===i?e.LOGICAL_AND:e.LOGICAL_OR;let n=s.valueToCode(t,"A",o);return t=s.valueToCode(t,"B",o),n||t?(s="&&"===i?"true":"false",n||(n=s),t||(t=s)):t=n="false",[n+" "+i+" "+t,o]},_.logic_ternary=function(t,s){return[(s.valueToCode(t,"IF",e.CONDITIONAL)||"false")+" ? "+(s.valueToCode(t,"THEN",e.CONDITIONAL)||"null")+" : "+(t=s.valueToCode(t,"ELSE",e.CONDITIONAL)||"null"),e.CONDITIONAL]};var T={controls_flow_statements:function(t,e){let s="";if(e.STATEMENT_PREFIX&&(s+=e.injectId(e.STATEMENT_PREFIX,t)),e.STATEMENT_SUFFIX&&(s+=e.injectId(e.STATEMENT_SUFFIX,t)),e.STATEMENT_PREFIX){const i=t.getSurroundLoop();i&&!i.suppressPrefixSuffix&&(s+=e.injectId(e.STATEMENT_PREFIX,i))}switch(t.getFieldValue("FLOW")){case"BREAK":return s+"break;\n";case"CONTINUE":return s+"continue;\n"}throw Error("Unknown flow statement.")},controls_for:function(t,s){var o=s.getVariableName(t.getFieldValue("VAR")),n=s.valueToCode(t,"FROM",e.ASSIGNMENT)||"0",r=s.valueToCode(t,"TO",e.ASSIGNMENT)||"0";const l=s.valueToCode(t,"BY",e.ASSIGNMENT)||"1";let a=s.statementToCode(t,"DO");if(a=s.addLoopTrap(a,t),i.isNumber$$module$build$src$core$utils$string(n)&&i.isNumber$$module$build$src$core$utils$string(r)&&i.isNumber$$module$build$src$core$utils$string(l))t="for ("+o+" = "+n+"; "+o+((s=Number(n)<=Number(r))?" <= ":" >= ")+r+"; "+o,t=1===(o=Math.abs(Number(l)))?t+(s?"++":"--"):t+(s?" += ":" -= ")+o,t+=") {\n"+a+"}\n";else{t="";let e=n;n.match(/^\w+$/)||i.isNumber$$module$build$src$core$utils$string(n)||(e=s.nameDB_.getDistinctName(o+"_start",i.NameType$$module$build$src$core$names.VARIABLE),t+="var "+e+" = "+n+";\n"),n=r,r.match(/^\w+$/)||i.isNumber$$module$build$src$core$utils$string(r)||(t+="var "+(n=s.nameDB_.getDistinctName(o+"_end",i.NameType$$module$build$src$core$names.VARIABLE))+" = "+r+";\n"),t+="var "+(r=s.nameDB_.getDistinctName(o+"_inc",i.NameType$$module$build$src$core$names.VARIABLE))+" = ",t=i.isNumber$$module$build$src$core$utils$string(l)?t+(Math.abs(Number(l))+";\n"):t+"Math.abs("+l+");\n",t+="if ("+e+" > "+n+") {\n",t=(t+=s.INDENT+r+" = -"+r+";\n")+"}\nfor ("+o+" = "+e+"; "+r+" >= 0 ? "+o+" <= "+n+" : "+o+" >= "+n+"; "+o+" += "+r+") {\n"+a+"}\n"}return t},controls_forEach:function(t,s){const o=s.getVariableName(t.getFieldValue("VAR"));var n=s.valueToCode(t,"LIST",e.ASSIGNMENT)||"[]";let r=s.statementToCode(t,"DO");r=s.addLoopTrap(r,t),t="";let l=n;return n.match(/^\w+$/)||(l=s.nameDB_.getDistinctName(o+"_list",i.NameType$$module$build$src$core$names.VARIABLE),t+="var "+l+" = "+n+";\n"),n=s.nameDB_.getDistinctName(o+"_index",i.NameType$$module$build$src$core$names.VARIABLE),r=s.INDENT+o+" = "+l+"["+n+"];\n"+r,t+"for (var "+n+" in "+l+") {\n"+r+"}\n"}};T.controls_repeat=n,T.controls_repeat_ext=n,T.controls_whileUntil=function(t,s){const i="UNTIL"===t.getFieldValue("MODE");let o=s.valueToCode(t,"BOOL",i?e.LOGICAL_NOT:e.NONE)||"false",n=s.statementToCode(t,"DO");return n=s.addLoopTrap(n,t),i&&(o="!"+o),"while ("+o+") {\n"+n+"}\n"};var m={math_arithmetic:function(t,s){var i={ADD:[" + ",e.ADDITION],MINUS:[" - ",e.SUBTRACTION],MULTIPLY:[" * ",e.MULTIPLICATION],DIVIDE:[" / ",e.DIVISION],POWER:[null,e.NONE]}[t.getFieldValue("OP")];const o=i[0];i=i[1];const n=s.valueToCode(t,"A",i)||"0";return t=s.valueToCode(t,"B",i)||"0",o?[n+o+t,i]:["Math.pow("+n+", "+t+")",e.FUNCTION_CALL]},math_atan2:function(t,s){const i=s.valueToCode(t,"X",e.NONE)||"0";return["Math.atan2("+(s.valueToCode(t,"Y",e.NONE)||"0")+", "+i+") / Math.PI * 180",e.DIVISION]},math_change:function(t,s){const i=s.valueToCode(t,"DELTA",e.ADDITION)||"0";return(t=s.getVariableName(t.getFieldValue("VAR")))+" = (typeof "+t+" === 'number' ? "+t+" : 0) + "+i+";\n"},math_constant:function(t,s){return{PI:["Math.PI",e.MEMBER],E:["Math.E",e.MEMBER],GOLDEN_RATIO:["(1 + Math.sqrt(5)) / 2",e.DIVISION],SQRT2:["Math.SQRT2",e.MEMBER],SQRT1_2:["Math.SQRT1_2",e.MEMBER],INFINITY:["Infinity",e.ATOMIC]}[t.getFieldValue("CONSTANT")]},math_constrain:function(t,s){return["Math.min(Math.max("+(s.valueToCode(t,"VALUE",e.NONE)||"0")+", "+(s.valueToCode(t,"LOW",e.NONE)||"0")+"), "+(t=s.valueToCode(t,"HIGH",e.NONE)||"Infinity")+")",e.FUNCTION_CALL]},math_modulo:function(t,s){return[(s.valueToCode(t,"DIVIDEND",e.MODULUS)||"0")+" % "+(t=s.valueToCode(t,"DIVISOR",e.MODULUS)||"0"),e.MODULUS]},math_number:function(t,s){return t=Number(t.getFieldValue("NUM")),[String(t),t>=0?e.ATOMIC:e.UNARY_NEGATION]},math_number_property:function(t,s){var i={EVEN:[" % 2 === 0",e.MODULUS,e.EQUALITY],ODD:[" % 2 === 1",e.MODULUS,e.EQUALITY],WHOLE:[" % 1 === 0",e.MODULUS,e.EQUALITY],POSITIVE:[" > 0",e.RELATIONAL,e.RELATIONAL],NEGATIVE:[" < 0",e.RELATIONAL,e.RELATIONAL],DIVISIBLE_BY:[null,e.MODULUS,e.EQUALITY],PRIME:[null,e.NONE,e.FUNCTION_CALL]};const o=t.getFieldValue("PROPERTY"),[n,r,l]=i[o];return i=s.valueToCode(t,"NUMBER_TO_CHECK",r)||"0",[t="PRIME"===o?s.provideFunction_("mathIsPrime",`\nfunction ${s.FUNCTION_NAME_PLACEHOLDER_}(n) {\n // https://en.wikipedia.org/wiki/Primality_test#Naive_methods\n if (n == 2 || n == 3) {\n return true;\n }\n // False if n is NaN, negative, is 1, or not whole.\n // And false if n is divisible by 2 or 3.\n if (isNaN(n) || n <= 1 || n % 1 !== 0 || n % 2 === 0 || n % 3 === 0) {\n return false;\n }\n // Check all the numbers of form 6k +/- 1, up to sqrt(n).\n for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {\n if (n % (x - 1) === 0 || n % (x + 1) === 0) {\n return false;\n }\n }\n return true;\n}\n`)+"("+i+")":"DIVISIBLE_BY"===o?i+" % "+(t=s.valueToCode(t,"DIVISOR",e.MODULUS)||"0")+" === 0":i+n,l]},math_on_list:function(t,s){var i=t.getFieldValue("OP");switch(i){case"SUM":t=s.valueToCode(t,"LIST",e.MEMBER)||"[]",t+=".reduce(function(x, y) {return x + y;}, 0)";break;case"MIN":t="Math.min.apply(null, "+(t=s.valueToCode(t,"LIST",e.NONE)||"[]")+")";break;case"MAX":t="Math.max.apply(null, "+(t=s.valueToCode(t,"LIST",e.NONE)||"[]")+")";break;case"AVERAGE":t=(i=s.provideFunction_("mathMean",`\nfunction ${s.FUNCTION_NAME_PLACEHOLDER_}(myList) {\n return myList.reduce(function(x, y) {return x + y;}, 0) / myList.length;\n}\n`))+"("+(t=s.valueToCode(t,"LIST",e.NONE)||"[]")+")";break;case"MEDIAN":t=(i=s.provideFunction_("mathMedian",`\nfunction ${s.FUNCTION_NAME_PLACEHOLDER_}(myList) {\n var localList = myList.filter(function (x) {return typeof x === 'number';});\n if (!localList.length) return null;\n localList.sort(function(a, b) {return b - a;});\n if (localList.length % 2 === 0) {\n return (localList[localList.length / 2 - 1] + localList[localList.length / 2]) / 2;\n } else {\n return localList[(localList.length - 1) / 2];\n }\n}\n`))+"("+(t=s.valueToCode(t,"LIST",e.NONE)||"[]")+")";break;case"MODE":t=(i=s.provideFunction_("mathModes",`\nfunction ${s.FUNCTION_NAME_PLACEHOLDER_}(values) {\n var modes = [];\n var counts = [];\n var maxCount = 0;\n for (var i = 0; i < values.length; i++) {\n var value = values[i];\n var found = false;\n var thisCount;\n for (var j = 0; j < counts.length; j++) {\n if (counts[j][0] === value) {\n thisCount = ++counts[j][1];\n found = true;\n break;\n }\n }\n if (!found) {\n counts.push([value, 1]);\n thisCount = 1;\n }\n maxCount = Math.max(thisCount, maxCount);\n }\n for (var j = 0; j < counts.length; j++) {\n if (counts[j][1] === maxCount) {\n modes.push(counts[j][0]);\n }\n }\n return modes;\n}\n`))+"("+(t=s.valueToCode(t,"LIST",e.NONE)||"[]")+")";break;case"STD_DEV":t=(i=s.provideFunction_("mathStandardDeviation",`\nfunction ${s.FUNCTION_NAME_PLACEHOLDER_}(numbers) {\n var n = numbers.length;\n if (!n) return null;\n var mean = numbers.reduce(function(x, y) {return x + y;}) / n;\n var variance = 0;\n for (var j = 0; j < n; j++) {\n variance += Math.pow(numbers[j] - mean, 2);\n }\n variance /= n;\n return Math.sqrt(variance);\n}\n`))+"("+(t=s.valueToCode(t,"LIST",e.NONE)||"[]")+")";break;case"RANDOM":t=(i=s.provideFunction_("mathRandomList",`\nfunction ${s.FUNCTION_NAME_PLACEHOLDER_}(list) {\n var x = Math.floor(Math.random() * list.length);\n return list[x];\n}\n`))+"("+(t=s.valueToCode(t,"LIST",e.NONE)||"[]")+")";break;default:throw Error("Unknown operator: "+i)}return[t,e.FUNCTION_CALL]},math_random_float:function(t,s){return["Math.random()",e.FUNCTION_CALL]},math_random_int:function(t,s){const i=s.valueToCode(t,"FROM",e.NONE)||"0";return t=s.valueToCode(t,"TO",e.NONE)||"0",[s.provideFunction_("mathRandomInt",`\nfunction ${s.FUNCTION_NAME_PLACEHOLDER_}(a, b) {\n if (a > b) {\n // Swap a and b to ensure a is smaller.\n var c = a;\n a = b;\n b = c;\n }\n return Math.floor(Math.random() * (b - a + 1) + a);\n}\n`)+"("+i+", "+t+")",e.FUNCTION_CALL]}};m.math_round=r,m.math_single=r,m.math_trig=r;var E={procedures_callnoreturn:function(t,e){return e.forBlock.procedures_callreturn(t,e)[0]+";\n"},procedures_callreturn:function(t,s){const i=s.getProcedureName(t.getFieldValue("NAME")),o=[],n=t.getVars();for(let i=0;iKe,sV:()=>A,sh:()=>_e});var i=s(500);const{Block:o,BlockFlyoutInflater:n,BlockNavigationPolicy:r,BlockSvg:l,Blocks:a,ButtonFlyoutInflater:c,COLLAPSED_FIELD_NAME:h,COLLAPSED_INPUT_NAME:u,COLLAPSE_CHARS:d,CodeGenerator:p,CollapsibleToolboxCategory:g,ComponentManager:_,Connection:T,ConnectionChecker:m,ConnectionDB:E,ConnectionNavigationPolicy:b,ConnectionType:f,ContextMenu:$,ContextMenuItems:I,ContextMenuRegistry:C,Css:S,DELETE_VARIABLE_ID:R,DeleteArea:y,DragTarget:O,DropDownDiv:k,Events:A,Extensions:v,Field:N,FieldCheckbox:w,FieldDropdown:L,FieldImage:M,FieldLabel:D,FieldLabelSerializable:x,FieldNavigationPolicy:P,FieldNumber:B,FieldTextInput:F,FieldVariable:U,Flyout:H,FlyoutButton:G,FlyoutButtonNavigationPolicy:V,FlyoutItem:W,FlyoutMetricsManager:X,FlyoutNavigationPolicy:z,FlyoutNavigator:Y,FlyoutSeparator:K,FlyoutSeparatorNavigationPolicy:j,FocusManager:J,FocusableTreeTraverser:q,Generator:Z,Gesture:Q,Grid:tt,HorizontalFlyout:et,INPUT_VALUE:st,Input:it,InsertionMarkerPreviewer:ot,KeyboardNavigationController:nt,LabelFlyoutInflater:rt,LineCursor:lt,Marker:at,MarkerManager:ct,Menu:ht,MenuItem:ut,MetricsManager:dt,Msg:pt,NEXT_STATEMENT:gt,Names:_t,Navigator:Tt,OPPOSITE_TYPE:mt,OUTPUT_VALUE:Et,Options:bt,PREVIOUS_STATEMENT:ft,PROCEDURE_CATEGORY_NAME:$t,Procedures:It,RENAME_VARIABLE_ID:Ct,RenderedConnection:St,Scrollbar:Rt,ScrollbarPair:yt,SeparatorFlyoutInflater:Ot,ShortcutItems:kt,ShortcutRegistry:At,TOOLBOX_AT_BOTTOM:vt,TOOLBOX_AT_LEFT:Nt,TOOLBOX_AT_RIGHT:wt,TOOLBOX_AT_TOP:Lt,Theme:Mt,ThemeManager:Dt,Themes:xt,Toast:Pt,Toolbox:Bt,ToolboxCategory:Ft,ToolboxItem:Ut,ToolboxSeparator:Ht,Tooltip:Gt,Touch:Vt,Trashcan:Wt,UnattachedFieldError:Xt,VARIABLE_CATEGORY_NAME:zt,VARIABLE_DYNAMIC_CATEGORY_NAME:Yt,VERSION:Kt,VariableMap:jt,VariableModel:Jt,Variables:qt,VariablesDynamic:Zt,VerticalFlyout:Qt,WidgetDiv:te,Workspace:ee,WorkspaceAudio:se,WorkspaceDragger:ie,WorkspaceNavigationPolicy:oe,WorkspaceSvg:ne,Xml:re,ZoomControls:le,blockAnimations:ae,blockRendering:ce,browserEvents:he,bubbles:ue,bumpObjects:de,clipboard:pe,comments:ge,common:_e,config:Te,constants:me,defineBlocksWithJsonArray:Ee,dialog:be,dragging:fe,fieldRegistry:$e,geras:Ie,getFocusManager:Ce,getMainWorkspace:Se,getSelected:Re,hasBubble:ye,hideChaff:Oe,icons:ke,inject:Ae,inputs:ve,isCopyable:Ne,isDeletable:we,isDraggable:Le,isIcon:Me,isObservable:De,isPaster:xe,isRenderedElement:Pe,isSelectable:Be,isSerializable:Fe,isVariableBackedParameterModel:Ue,keyboardNavigationController:He,layers:Ge,navigateBlock:Ve,navigateStacks:We,procedures:Xe,registry:ze,renderManagement:Ye,serialization:Ke,setLocale:je,setParentContainer:Je,svgResize:qe,thrasos:Ze,uiPosition:Qe,utils:ts,zelos:es}=i},501(t,e,s){"use strict";s.d(e,{WQ:()=>Ae,sV:()=>A,sh:()=>_e});var i=s(548);const{Block:o,BlockFlyoutInflater:n,BlockNavigationPolicy:r,BlockSvg:l,Blocks:a,ButtonFlyoutInflater:c,COLLAPSED_FIELD_NAME:h,COLLAPSED_INPUT_NAME:u,COLLAPSE_CHARS:d,CodeGenerator:p,CollapsibleToolboxCategory:g,ComponentManager:_,Connection:T,ConnectionChecker:m,ConnectionDB:E,ConnectionNavigationPolicy:b,ConnectionType:f,ContextMenu:$,ContextMenuItems:I,ContextMenuRegistry:C,Css:S,DELETE_VARIABLE_ID:R,DeleteArea:y,DragTarget:O,DropDownDiv:k,Events:A,Extensions:v,Field:N,FieldCheckbox:w,FieldDropdown:L,FieldImage:M,FieldLabel:D,FieldLabelSerializable:x,FieldNavigationPolicy:P,FieldNumber:B,FieldTextInput:F,FieldVariable:U,Flyout:H,FlyoutButton:G,FlyoutButtonNavigationPolicy:V,FlyoutItem:W,FlyoutMetricsManager:X,FlyoutNavigationPolicy:z,FlyoutNavigator:Y,FlyoutSeparator:K,FlyoutSeparatorNavigationPolicy:j,FocusManager:J,FocusableTreeTraverser:q,Generator:Z,Gesture:Q,Grid:tt,HorizontalFlyout:et,INPUT_VALUE:st,Input:it,InsertionMarkerPreviewer:ot,KeyboardNavigationController:nt,LabelFlyoutInflater:rt,LineCursor:lt,Marker:at,MarkerManager:ct,Menu:ht,MenuItem:ut,MetricsManager:dt,Msg:pt,NEXT_STATEMENT:gt,Names:_t,Navigator:Tt,OPPOSITE_TYPE:mt,OUTPUT_VALUE:Et,Options:bt,PREVIOUS_STATEMENT:ft,PROCEDURE_CATEGORY_NAME:$t,Procedures:It,RENAME_VARIABLE_ID:Ct,RenderedConnection:St,Scrollbar:Rt,ScrollbarPair:yt,SeparatorFlyoutInflater:Ot,ShortcutItems:kt,ShortcutRegistry:At,TOOLBOX_AT_BOTTOM:vt,TOOLBOX_AT_LEFT:Nt,TOOLBOX_AT_RIGHT:wt,TOOLBOX_AT_TOP:Lt,Theme:Mt,ThemeManager:Dt,Themes:xt,Toast:Pt,Toolbox:Bt,ToolboxCategory:Ft,ToolboxItem:Ut,ToolboxSeparator:Ht,Tooltip:Gt,Touch:Vt,Trashcan:Wt,UnattachedFieldError:Xt,VARIABLE_CATEGORY_NAME:zt,VARIABLE_DYNAMIC_CATEGORY_NAME:Yt,VERSION:Kt,VariableMap:jt,VariableModel:Jt,Variables:qt,VariablesDynamic:Zt,VerticalFlyout:Qt,WidgetDiv:te,Workspace:ee,WorkspaceAudio:se,WorkspaceDragger:ie,WorkspaceNavigationPolicy:oe,WorkspaceSvg:ne,Xml:re,ZoomControls:le,blockAnimations:ae,blockRendering:ce,browserEvents:he,bubbles:ue,bumpObjects:de,clipboard:pe,comments:ge,common:_e,config:Te,constants:me,defineBlocksWithJsonArray:Ee,dialog:be,dragging:fe,fieldRegistry:$e,geras:Ie,getFocusManager:Ce,getMainWorkspace:Se,getSelected:Re,hasBubble:ye,hideChaff:Oe,icons:ke,inject:Ae,inputs:ve,isCopyable:Ne,isDeletable:we,isDraggable:Le,isIcon:Me,isObservable:De,isPaster:xe,isRenderedElement:Pe,isSelectable:Be,isSerializable:Fe,isVariableBackedParameterModel:Ue,keyboardNavigationController:He,layers:Ge,navigateBlock:Ve,navigateStacks:We,procedures:Xe,registry:ze,renderManagement:Ye,serialization:Ke,setLocale:je,setParentContainer:Je,svgResize:qe,thrasos:Ze,uiPosition:Qe,utils:ts,zelos:es}=i},290(t,e,s){"use strict";s.d(e,{bw:()=>r,pH:()=>n});var i=s(449);const{JavascriptGenerator:o,Order:n,javascriptGenerator:r}=i}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var s=__webpack_module_cache__[t]={id:t,exports:{}};return __webpack_modules__[t].call(s.exports,s,s.exports,__webpack_require__),s.exports}__webpack_require__.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return __webpack_require__.d(e,{a:e}),e},__webpack_require__.d=(t,e)=>{for(var s in e)__webpack_require__.o(e,s)&&!__webpack_require__.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:e[s]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),__webpack_require__.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),__webpack_require__.nc=void 0;var __webpack_exports__={};(()=>{"use strict";var blockly__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(501),_blocks_text__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(780),_generators_javascript__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(352),blockly_javascript__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(290),_serialization__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(952),_toolbox__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(336),_index_css__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(216);blockly__WEBPACK_IMPORTED_MODULE_0__.sh.defineBlocks(_blocks_text__WEBPACK_IMPORTED_MODULE_1__.B),Object.assign(blockly_javascript__WEBPACK_IMPORTED_MODULE_3__.bw.forBlock,_generators_javascript__WEBPACK_IMPORTED_MODULE_2__.J);const codeDiv=document.getElementById("generatedCode").firstChild,outputDiv=document.getElementById("output"),blocklyDiv=document.getElementById("blocklyDiv"),ws=blockly__WEBPACK_IMPORTED_MODULE_0__.WQ(blocklyDiv,{toolbox:_toolbox__WEBPACK_IMPORTED_MODULE_5__.M}),runCode=()=>{const code=blockly_javascript__WEBPACK_IMPORTED_MODULE_3__.bw.workspaceToCode(ws);codeDiv.innerText=code,outputDiv.innerHTML="",eval(code)};(0,_serialization__WEBPACK_IMPORTED_MODULE_4__.H)(ws),runCode(),ws.addChangeListener(t=>{t.isUiEvent||(0,_serialization__WEBPACK_IMPORTED_MODULE_4__.U)(ws)}),ws.addChangeListener(t=>{t.isUiEvent||t.type==blockly__WEBPACK_IMPORTED_MODULE_0__.sV.FINISHED_LOADING||ws.isDragging()||runCode()})})()})(); \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js.LICENSE.txt b/packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js.LICENSE.txt new file mode 100644 index 00000000000..4edc2251c46 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js.LICENSE.txt @@ -0,0 +1,11 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @license + * Copyright 2023 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/dist/index.html b/packages/docs/docs/codelabs/getting-started/starter-code/dist/index.html new file mode 100644 index 00000000000..aea1aefef6e --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/starter-code/dist/index.html @@ -0,0 +1 @@ +Blockly Sample App
\ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/package-lock.json b/packages/docs/docs/codelabs/getting-started/starter-code/package-lock.json new file mode 100644 index 00000000000..dc1ef9c8442 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/starter-code/package-lock.json @@ -0,0 +1,5638 @@ +{ + "name": "getting-started-app", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "getting-started-app", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "blockly": "^12.0.0" + }, + "devDependencies": { + "css-loader": "^6.7.1", + "html-webpack-plugin": "^5.5.0", + "source-map-loader": "^4.0.1", + "style-loader": "^3.3.1", + "webpack": "^5.93.0", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.0.4" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.7.tgz", + "integrity": "sha512-GDKuYHjP7vAI1kjBo73V+STKr9XIMZknW/xirpRW/EcShX0IKSev/ALafeRfC8Q331nodrXUFu04PugPB0MAhw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.7", + "@jsonjoy.com/fs-node-utils": "4.57.7", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.7.tgz", + "integrity": "sha512-1rWsah2nZtRbNeP+c61QcfGfVrJXBmBD0Hm7Akvv4C9MKEasXnbiOS//iH3T3HwUSSBATGrfSp0Xi8nlNhATeQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.7", + "@jsonjoy.com/fs-node-builtins": "4.57.7", + "@jsonjoy.com/fs-node-utils": "4.57.7", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.7.tgz", + "integrity": "sha512-xhnyeyEVTiIOibFvda/5n89nChMLCPKHHM2WQ+GGDf6+U/IrQBW3Qx6x+Uq1bkDbxBkybLOdIGoBtVBrE8Nngg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.7", + "@jsonjoy.com/fs-node-builtins": "4.57.7", + "@jsonjoy.com/fs-node-utils": "4.57.7", + "@jsonjoy.com/fs-print": "4.57.7", + "@jsonjoy.com/fs-snapshot": "4.57.7", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.7.tgz", + "integrity": "sha512-LWqfY1m+uAosjwM1RrKhMkUnP9jcq1RUczHsNO779ovm1E9v8I/pmj04eBAcoBjhC7ltcPbNFGyRJ5JqSJ7Jdg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.7.tgz", + "integrity": "sha512-9T0zC9LKcAWXDoTLRdLMoJ0seOvJ5bgDKq1tSBoQAFQpPDstQUeV1Oe7PLypdu7F2D3ddRstmwgeNUEN/VaZ4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.57.7", + "@jsonjoy.com/fs-node-builtins": "4.57.7", + "@jsonjoy.com/fs-node-utils": "4.57.7" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.7.tgz", + "integrity": "sha512-jjWSDOsfcog2cZnUCwX5AHmlIq6b6wx5Pz/2LAcNjJ62Rajwg89Fy7ubN+lDHew0/1reLDa9Z5urybYadhh37g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.7" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.7.tgz", + "integrity": "sha512-mFM4P4Gjq0QQHkLnXzPYPEMFrAoe6a5Myedgb6+CmL+nGd3MKvTxYPuD7N1dLIH9RBy1fLdzxd80qvuK8xrx3Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-utils": "4.57.7", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.7.tgz", + "integrity": "sha512-1GS3+plfm2giB3PqokiqyydyqYTPLcCQIKSkp0TdMNRh3KVk7rqRM6U785FLlVRG7XLmkc0KWr215OY+22K3QA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.57.7", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/util": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.8.0.tgz", + "integrity": "sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "@peculiar/asn1-x509-attr": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.8.0.tgz", + "integrity": "sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.8.0.tgz", + "integrity": "sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.8.0.tgz", + "integrity": "sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.8.0", + "@peculiar/asn1-pkcs8": "^2.8.0", + "@peculiar/asn1-rsa": "^2.8.0", + "@peculiar/asn1-schema": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.8.0.tgz", + "integrity": "sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.8.0.tgz", + "integrity": "sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.8.0", + "@peculiar/asn1-pfx": "^2.8.0", + "@peculiar/asn1-pkcs8": "^2.8.0", + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "@peculiar/asn1-x509-attr": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.8.0.tgz", + "integrity": "sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.8.0.tgz", + "integrity": "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.8.0.tgz", + "integrity": "sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.8.0.tgz", + "integrity": "sha512-tHjkfS/qhMnmrlB2J9NhflQlQ7In3khO3CfmVrriOlpTeErY9ZIKOso1hQ5JQiyrJ7ShvqVPk7E5fQmbclkSKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.3.tgz", + "integrity": "sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.37", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.37.tgz", + "integrity": "sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/blockly": { + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-12.5.1.tgz", + "integrity": "sha512-etXLpUtEkcRibHGwIJ4BsvnIzMJJs0C0yPIjE/W0NCtj8ACha/a7Q9n7Ib6+j7N4EzQ0p28YPZMnypi5pNIj1g==", + "license": "Apache-2.0", + "dependencies": { + "jsdom": "26.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/body-parser": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.4.1.tgz", + "integrity": "sha512-9KM4QMPKnaJqaja1v7gYO/+TXZGLtzPA05NmUTqDAJjcsWeVoOXKMvU9g0gfuuoYTQqJZ924hivICd5R/bCJbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.375", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.375.tgz", + "integrity": "sha512-ZWP5eB4BVPW/ZYo9252hQZHZ5XavtsTgpbhcmMmRwymavC5AsLWQWBPaKMeNd2LW0KGby5HPXvj7+sr4ta5j/Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.0.tgz", + "integrity": "sha512-SkE2t82KlkkxQRVMVLAGKxLfORGQfrkx5dkj+vlgXRVNEdPc4eZcR+J/Fvj8C+yKSFH5L0q3NFlyufOVQnCcYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.7", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", + "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", + "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jsdom": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "license": "MIT", + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.4" + } + }, + "node_modules/loader-runner": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.7.tgz", + "integrity": "sha512-YZPphUQZSRGk6ddPlsNuMbztrLwsbUATFNZcqKscSbSJZ4g0+Y3vSZLJ/rfnGZaB1FFhC7SrywZXev6i8lnHgg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.7", + "@jsonjoy.com/fs-fsa": "4.57.7", + "@jsonjoy.com/fs-node": "4.57.7", + "@jsonjoy.com/fs-node-builtins": "4.57.7", + "@jsonjoy.com/fs-node-to-fsa": "4.57.7", + "@jsonjoy.com/fs-node-utils": "4.57.7", + "@jsonjoy.com/fs-print": "4.57.7", + "@jsonjoy.com/fs-snapshot": "4.57.7", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-releases": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.24", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.24.tgz", + "integrity": "sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==", + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/qs": { + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", + "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.2.tgz", + "integrity": "sha512-oYwAqCuL0OZhBoSgmdrLa7mv9MjommVMiQIWgcztf+eS4+8BfcUee6nenFnDhKOhzAVnk5gpZdfnz1iiBv+5sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", + "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/thingies": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", + "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/watchpack": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "5.107.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", + "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.22.0", + "es-module-lexer": "^2.1.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "loader-runner": "^4.3.2", + "mime-db": "^1.54.0", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.5.0", + "watchpack": "^2.5.1", + "webpack-sources": "^3.5.0" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.5.tgz", + "integrity": "sha512-4wZtCquSuv9CKX8oybo+mqxtxZqWz47uM1Ch94lxowBztOhWCbhqvRbfC/mODOwxgV2brY+JGZpHq58/SuVFYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.25", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.8.1", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.22.1", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^5.5.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", + "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.5.tgz", + "integrity": "sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + } + } +} diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/package.json b/packages/docs/docs/codelabs/getting-started/starter-code/package.json new file mode 100644 index 00000000000..f4d9397180c --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/starter-code/package.json @@ -0,0 +1,29 @@ +{ + "name": "getting-started-app", + "version": "1.0.0", + "description": "A sample app using Blockly", + "main": "index.js", + "private": true, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "webpack --mode production", + "start": "webpack serve --open --mode development" + }, + "keywords": [ + "blockly" + ], + "author": "", + "license": "Apache-2.0", + "devDependencies": { + "css-loader": "^6.7.1", + "html-webpack-plugin": "^5.5.0", + "source-map-loader": "^4.0.1", + "style-loader": "^3.3.1", + "webpack": "^5.93.0", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.0.4" + }, + "dependencies": { + "blockly": "^12.0.0" + } +} \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/blocks/text.js b/packages/docs/docs/codelabs/getting-started/starter-code/src/blocks/text.js new file mode 100644 index 00000000000..a84680bc6b2 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/blocks/text.js @@ -0,0 +1,35 @@ +/** + * @license + * Copyright 2023 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as Blockly from 'blockly/core'; + +// Create a custom block called 'add_text' that adds +// text to the output div on the sample app. +// This is just an example and you should replace this with your +// own custom blocks. +const addText = { + type: 'add_text', + message0: 'Add text %1', + args0: [ + { + type: 'input_value', + name: 'TEXT', + check: 'String', + }, + ], + previousStatement: null, + nextStatement: null, + colour: 160, + tooltip: '', + helpUrl: '', +}; + +// Create the block definitions for the JSON-only blocks. +// This does not register their definitions with Blockly. +// This file has no side effects! +export const blocks = Blockly.common.createBlockDefinitionsFromJsonArray([ + addText, +]); diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/generators/javascript.js b/packages/docs/docs/codelabs/getting-started/starter-code/src/generators/javascript.js new file mode 100644 index 00000000000..0315d9504d6 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/generators/javascript.js @@ -0,0 +1,30 @@ +/** + * @license + * Copyright 2023 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import {Order} from 'blockly/javascript'; + +// Export all the code generators for our custom blocks, +// but don't register them with Blockly yet. +// This file has no side effects! +export const forBlock = Object.create(null); + +forBlock['add_text'] = function (block, generator) { + const text = generator.valueToCode(block, 'TEXT', Order.NONE) || "''"; + const addText = generator.provideFunction_( + 'addText', + `function ${generator.FUNCTION_NAME_PLACEHOLDER_}(text) { + + // Add text to the output area. + const outputDiv = document.getElementById('output'); + const textEl = document.createElement('p'); + textEl.innerText = text; + outputDiv.appendChild(textEl); +}`, + ); + // Generate the function call for this block. + const code = `${addText}(${text});\n`; + return code; +}; diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/index.css b/packages/docs/docs/codelabs/getting-started/starter-code/src/index.css new file mode 100644 index 00000000000..f282700701f --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/index.css @@ -0,0 +1,40 @@ +body { + margin: 0; + max-width: 100vw; +} + +pre, +code { + overflow: auto; +} + +#pageContainer { + display: flex; + width: 100%; + max-width: 100vw; + height: 100vh; +} + +#blocklyDiv { + flex-basis: 100%; + height: 100%; + min-width: 600px; +} + +#outputPane { + display: flex; + flex-direction: column; + width: 400px; + flex: 0 0 400px; + overflow: auto; + margin: 1rem; +} + +#generatedCode { + height: 50%; + background-color: rgb(247, 240, 228); +} + +#output { + height: 50%; +} diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/index.html b/packages/docs/docs/codelabs/getting-started/starter-code/src/index.html new file mode 100644 index 00000000000..36d8eeacd99 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/index.html @@ -0,0 +1,16 @@ + + + + + Blockly Sample App + + +
+
+
+
+
+
+
+ + diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/index.js b/packages/docs/docs/codelabs/getting-started/starter-code/src/index.js new file mode 100644 index 00000000000..36abfb6dd82 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/index.js @@ -0,0 +1,62 @@ +/** + * @license + * Copyright 2023 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as Blockly from 'blockly'; +import {blocks} from './blocks/text'; +import {forBlock} from './generators/javascript'; +import {javascriptGenerator} from 'blockly/javascript'; +import {save, load} from './serialization'; +import {toolbox} from './toolbox'; +import './index.css'; + +// Register the blocks and generator with Blockly +Blockly.common.defineBlocks(blocks); +Object.assign(javascriptGenerator.forBlock, forBlock); + +// Set up UI elements and inject Blockly +const codeDiv = document.getElementById('generatedCode').firstChild; +const outputDiv = document.getElementById('output'); +const blocklyDiv = document.getElementById('blocklyDiv'); +const ws = Blockly.inject(blocklyDiv, {toolbox}); + +// This function resets the code and output divs, shows the +// generated code from the workspace, and evals the code. +// In a real application, you probably shouldn't use `eval`. +const runCode = () => { + const code = javascriptGenerator.workspaceToCode(ws); + codeDiv.innerText = code; + + outputDiv.innerHTML = ''; + + eval(code); +}; + +// Load the initial state from storage and run the code. +load(ws); +runCode(); + +// Every time the workspace changes state, save the changes to storage. +ws.addChangeListener((e) => { + // UI events are things like scrolling, zooming, etc. + // No need to save after one of these. + if (e.isUiEvent) return; + save(ws); +}); + +// Whenever the workspace changes meaningfully, run the code again. +ws.addChangeListener((e) => { + // Don't run the code when the workspace finishes loading; we're + // already running it once when the application starts. + // Don't run the code during drags; we might have invalid state. + if ( + e.isUiEvent || + e.type == Blockly.Events.FINISHED_LOADING || + ws.isDragging() + ) { + return; + } + runCode(); +}); diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/serialization.js b/packages/docs/docs/codelabs/getting-started/starter-code/src/serialization.js new file mode 100644 index 00000000000..1fe1b420336 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/serialization.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2023 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as Blockly from 'blockly/core'; + +const storageKey = 'getting-started-app/mainWorkspace'; + +/** + * Saves the state of the workspace to browser's local storage. + * @param {Blockly.Workspace} workspace Blockly workspace to save. + */ +export const save = function (workspace) { + const data = Blockly.serialization.workspaces.save(workspace); + window.localStorage?.setItem(storageKey, JSON.stringify(data)); +}; + +/** + * Loads saved state from local storage into the given workspace. + * @param {Blockly.Workspace} workspace Blockly workspace to load into. + */ +export const load = function (workspace) { + const data = window.localStorage?.getItem(storageKey); + if (!data) return; + + // Don't emit events during loading. + Blockly.Events.disable(); + Blockly.serialization.workspaces.load(JSON.parse(data), workspace, false); + Blockly.Events.enable(); +}; diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js b/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js new file mode 100644 index 00000000000..1e1f8e6c931 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js @@ -0,0 +1,629 @@ +/** + * @license + * Copyright 2023 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/* +This toolbox contains nearly every single built-in block that Blockly offers, +in addition to the custom block 'add_text' this sample app adds. +You probably don't need every single block, and should consider either rewriting +your toolbox from scratch, or carefully choosing whether you need each block +listed here. +*/ + +export const toolbox = { + kind: 'categoryToolbox', + contents: [ + { + kind: 'category', + name: 'Logic', + categorystyle: 'logic_category', + contents: [ + { + kind: 'block', + type: 'controls_if', + }, + { + kind: 'block', + type: 'logic_compare', + }, + { + kind: 'block', + type: 'logic_operation', + }, + { + kind: 'block', + type: 'logic_negate', + }, + { + kind: 'block', + type: 'logic_boolean', + }, + { + kind: 'block', + type: 'logic_null', + }, + { + kind: 'block', + type: 'logic_ternary', + }, + ], + }, + { + kind: 'category', + name: 'Loops', + categorystyle: 'loop_category', + contents: [ + { + kind: 'block', + type: 'controls_repeat_ext', + inputs: { + TIMES: { + shadow: { + type: 'math_number', + fields: { + NUM: 10, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'controls_whileUntil', + }, + { + kind: 'block', + type: 'controls_for', + inputs: { + FROM: { + shadow: { + type: 'math_number', + fields: { + NUM: 1, + }, + }, + }, + TO: { + shadow: { + type: 'math_number', + fields: { + NUM: 10, + }, + }, + }, + BY: { + shadow: { + type: 'math_number', + fields: { + NUM: 1, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'controls_forEach', + }, + { + kind: 'block', + type: 'controls_flow_statements', + }, + ], + }, + { + kind: 'category', + name: 'Math', + categorystyle: 'math_category', + contents: [ + { + kind: 'block', + type: 'math_number', + fields: { + NUM: 123, + }, + }, + { + kind: 'block', + type: 'math_arithmetic', + inputs: { + A: { + shadow: { + type: 'math_number', + fields: { + NUM: 1, + }, + }, + }, + B: { + shadow: { + type: 'math_number', + fields: { + NUM: 1, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'math_single', + inputs: { + NUM: { + shadow: { + type: 'math_number', + fields: { + NUM: 9, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'math_trig', + inputs: { + NUM: { + shadow: { + type: 'math_number', + fields: { + NUM: 45, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'math_constant', + }, + { + kind: 'block', + type: 'math_number_property', + inputs: { + NUMBER_TO_CHECK: { + shadow: { + type: 'math_number', + fields: { + NUM: 0, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'math_round', + fields: { + OP: 'ROUND', + }, + inputs: { + NUM: { + shadow: { + type: 'math_number', + fields: { + NUM: 3.1, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'math_on_list', + fields: { + OP: 'SUM', + }, + }, + { + kind: 'block', + type: 'math_modulo', + inputs: { + DIVIDEND: { + shadow: { + type: 'math_number', + fields: { + NUM: 64, + }, + }, + }, + DIVISOR: { + shadow: { + type: 'math_number', + fields: { + NUM: 10, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'math_constrain', + inputs: { + VALUE: { + shadow: { + type: 'math_number', + fields: { + NUM: 50, + }, + }, + }, + LOW: { + shadow: { + type: 'math_number', + fields: { + NUM: 1, + }, + }, + }, + HIGH: { + shadow: { + type: 'math_number', + fields: { + NUM: 100, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'math_random_int', + inputs: { + FROM: { + shadow: { + type: 'math_number', + fields: { + NUM: 1, + }, + }, + }, + TO: { + shadow: { + type: 'math_number', + fields: { + NUM: 100, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'math_random_float', + }, + { + kind: 'block', + type: 'math_atan2', + inputs: { + X: { + shadow: { + type: 'math_number', + fields: { + NUM: 1, + }, + }, + }, + Y: { + shadow: { + type: 'math_number', + fields: { + NUM: 1, + }, + }, + }, + }, + }, + ], + }, + { + kind: 'category', + name: 'Text', + categorystyle: 'text_category', + contents: [ + { + kind: 'block', + type: 'text', + }, + { + kind: 'block', + type: 'text_join', + }, + { + kind: 'block', + type: 'text_append', + inputs: { + TEXT: { + shadow: { + type: 'text', + fields: { + TEXT: '', + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'text_length', + inputs: { + VALUE: { + shadow: { + type: 'text', + fields: { + TEXT: 'abc', + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'text_isEmpty', + inputs: { + VALUE: { + shadow: { + type: 'text', + fields: { + TEXT: '', + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'text_indexOf', + inputs: { + VALUE: { + block: { + type: 'variables_get', + }, + }, + FIND: { + shadow: { + type: 'text', + fields: { + TEXT: 'abc', + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'text_charAt', + inputs: { + VALUE: { + block: { + type: 'variables_get', + }, + }, + }, + }, + { + kind: 'block', + type: 'text_getSubstring', + inputs: { + STRING: { + block: { + type: 'variables_get', + }, + }, + }, + }, + { + kind: 'block', + type: 'text_changeCase', + inputs: { + TEXT: { + shadow: { + type: 'text', + fields: { + TEXT: 'abc', + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'text_trim', + inputs: { + TEXT: { + shadow: { + type: 'text', + fields: { + TEXT: 'abc', + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'text_count', + inputs: { + SUB: { + shadow: { + type: 'text', + }, + }, + TEXT: { + shadow: { + type: 'text', + }, + }, + }, + }, + { + kind: 'block', + type: 'text_replace', + inputs: { + FROM: { + shadow: { + type: 'text', + }, + }, + TO: { + shadow: { + type: 'text', + }, + }, + TEXT: { + shadow: { + type: 'text', + }, + }, + }, + }, + { + kind: 'block', + type: 'text_reverse', + inputs: { + TEXT: { + shadow: { + type: 'text', + }, + }, + }, + }, + { + kind: 'block', + type: 'add_text', + inputs: { + TEXT: { + shadow: { + type: 'text', + fields: { + TEXT: 'abc', + }, + }, + }, + }, + }, + ], + }, + { + kind: 'category', + name: 'Lists', + categorystyle: 'list_category', + contents: [ + { + kind: 'block', + type: 'lists_create_with', + }, + { + kind: 'block', + type: 'lists_create_with', + }, + { + kind: 'block', + type: 'lists_repeat', + inputs: { + NUM: { + shadow: { + type: 'math_number', + fields: { + NUM: 5, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'lists_length', + }, + { + kind: 'block', + type: 'lists_isEmpty', + }, + { + kind: 'block', + type: 'lists_indexOf', + inputs: { + VALUE: { + block: { + type: 'variables_get', + }, + }, + }, + }, + { + kind: 'block', + type: 'lists_getIndex', + inputs: { + VALUE: { + block: { + type: 'variables_get', + }, + }, + }, + }, + { + kind: 'block', + type: 'lists_setIndex', + inputs: { + LIST: { + block: { + type: 'variables_get', + }, + }, + }, + }, + { + kind: 'block', + type: 'lists_getSublist', + inputs: { + LIST: { + block: { + type: 'variables_get', + }, + }, + }, + }, + { + kind: 'block', + type: 'lists_split', + inputs: { + DELIM: { + shadow: { + type: 'text', + fields: { + TEXT: ',', + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'lists_sort', + }, + { + kind: 'block', + type: 'lists_reverse', + }, + ], + }, + { + kind: 'sep', + }, + { + kind: 'category', + name: 'Variables', + categorystyle: 'variable_category', + custom: 'VARIABLE', + }, + { + kind: 'category', + name: 'Functions', + categorystyle: 'procedure_category', + custom: 'PROCEDURE', + }, + ], +}; diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/webpack.config.js b/packages/docs/docs/codelabs/getting-started/starter-code/webpack.config.js new file mode 100644 index 00000000000..1a095648fd7 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/starter-code/webpack.config.js @@ -0,0 +1,59 @@ +const path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); + +// Base config that applies to either development or production mode. +const config = { + entry: './src/index.js', + output: { + // Compile the source files into a bundle. + filename: 'bundle.js', + path: path.resolve(__dirname, 'dist'), + clean: true, + }, + // Enable webpack-dev-server to get hot refresh of the app. + devServer: { + static: './build', + }, + module: { + rules: [ + { + // Load CSS files. They can be imported into JS files. + test: /\.css$/i, + use: ['style-loader', 'css-loader'], + }, + ], + }, + plugins: [ + // Generate the HTML index page based on our template. + // This will output the same index page with the bundle we + // created above added in a script tag. + new HtmlWebpackPlugin({ + template: 'src/index.html', + }), + ], +}; + +module.exports = (env, argv) => { + if (argv.mode === 'development') { + // Set the output path to the `build` directory + // so we don't clobber production builds. + config.output.path = path.resolve(__dirname, 'build'); + + // Generate source maps for our code for easier debugging. + // Not suitable for production builds. If you want source maps in + // production, choose a different one from https://webpack.js.org/configuration/devtool + config.devtool = 'eval-cheap-module-source-map'; + + // Include the source maps for Blockly for easier debugging Blockly code. + config.module.rules.push({ + test: /(blockly[/\\].*\.js)$/, + use: [require.resolve('source-map-loader')], + enforce: 'pre', + }); + + // Ignore spurious warnings from source-map-loader + // It can't find source maps for some Closure modules and that is expected + config.ignoreWarnings = [/Failed to parse source map.*blockly/]; + } + return config; +}; From 42b433226fe1395f0d3071a341cf00589b2e997b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Spriggs?= Date: Tue, 23 Jun 2026 16:04:36 -0400 Subject: [PATCH 2/8] docs: refactor getting-started codelab --- .vscode/settings.json | 3 + package-lock.json | 14 +- .../getting-started/add-blockly-libraries.mdx | 57 +- .../getting-started/codelab-overview.mdx | 2 +- .../create-a-blockly-workspace.mdx | 72 +- .../getting-started/create-a-custom-block.mdx | 142 ++-- .../getting-started/create-base-app.mdx | 40 ++ .../getting-started/explore-the-app.mdx | 19 - .../generate-javaScript-code.mdx | 51 +- .../getting-started/run-generated-code.mdx | 110 ++- .../getting-started/save-load-workspace.mdx | 93 ++- .../docs/codelabs/getting-started/setup.mdx | 11 +- .../starter-code/dist/bundle.js | 2 - .../starter-code/dist/bundle.js.LICENSE.txt | 11 - .../starter-code/dist/index.html | 1 - .../starter-code/src/blocks/text.js | 35 - .../starter-code/src/generators/javascript.js | 30 - .../starter-code/src/index.html | 16 - .../getting-started/starter-code/src/index.js | 62 -- .../starter-code/src/serialization.js | 32 - .../starter-code/src/toolbox.js | 638 +----------------- .../docs/codelabs/getting-started/the-end.mdx | 16 +- packages/docs/package.json | 2 +- packages/docs/sidebars.js | 8 +- 24 files changed, 399 insertions(+), 1068 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 packages/docs/docs/codelabs/getting-started/create-base-app.mdx delete mode 100644 packages/docs/docs/codelabs/getting-started/explore-the-app.mdx delete mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js delete mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js.LICENSE.txt delete mode 100644 packages/docs/docs/codelabs/getting-started/starter-code/dist/index.html diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000000..b5fcce1c73a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "mdx-preview.framework": "docusaurus" +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 7c365def3d8..51e6ca3dcf8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24390,15 +24390,15 @@ } }, "node_modules/react-dom": { - "version": "19.2.6", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", - "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.6" + "react": "^19.2.7" } }, "node_modules/react-fast-compare": { @@ -28929,7 +28929,7 @@ "concurrently": "^10.0.3", "conventional-changelog-conventionalcommits": "^9.3.1", "conventional-recommended-bump": "^11.2.0", - "eslint": "^10.5.0", + "eslint": "10.5.0", "eslint-config-google": "^0.14.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-jsdoc": "^62.9.0", @@ -29061,7 +29061,7 @@ "js-yaml": "^4.2.0", "prism-react-renderer": "^2.4.1", "react": "^19.2.7", - "react-dom": "^19.2.6", + "react-dom": "^19.2.7", "remark-directive": "^4.0.0" }, "devDependencies": { @@ -29069,7 +29069,7 @@ "@docusaurus/faster": "^3.10.1", "@docusaurus/module-type-aliases": "^3.10.1", "@docusaurus/types": "^3.10.1", - "eslint": "^10.5.0", + "eslint": "10.5.0", "eslint-plugin-mdx": "^3.7.0", "prettier": "3.8.3" }, diff --git a/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx b/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx index e39b3734713..466fbcb3ffb 100644 --- a/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx +++ b/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx @@ -4,53 +4,28 @@ description: How to add Blockly libraries to an app. # Getting started with Blockly -## 4. Add Blockly libraries +## 3. Add Blockly libraries To start, you'll need to add Blockly dependencies to your app. Blockly releases are [published on npm](https://www.npmjs.com/package/blockly) on a quarterly basis. -There are multiple ways to import Blockly into your project, but for this codelab you will be using *injection*. -TODO: explain injection - -### Create index.html -Open `starter-code/src` and create a new file called `index.html`. -In this file, you'll specify some basic structure for your webpage. -You'll also make a div (here called `blocklyDiv`) to inject Blockly into. - -Copy and paste the following HTML into your `index.html` file. - -```html - - - - - Blockly Sample App - - -
-
-
-
-
-
-
- - -``` - -### Default imports - -TODO: this is true for when you use unpckg, but not necessarily in this case right? - -Importing Blockly this way loads four default modules. - -- Blockly core: The main Blockly library, which defines the basic Blockly UI and logic. -- Built-in block definitions: Common blocks such as loops, logic, math, and string manipulation. -- The JavaScript generator: Converts blocks into JavaScript, and contains block generators for all built-in blocks. -- English language files: String tables for all messages on built-in blocks and the Blockly UI, in English. +There are multiple ways to import Blockly into your project, but for this codelab you will be using npm. + +### Install dependencies and run your app + +For this codelab, you'll use npm to run your app. Use the following instructions + +1. Install [node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) if you haven't already. +2. Navigate to the starter code folder `packages/docs/docs/codelabs/getting-started/starter-code` +in your terminal. +3. Run `npm install` in your terminal. npm install will install the necessary dependencies that are defined in package.json, which includes Blockly. +4. Run `npm start` in your terminal. + +After following these steps, a browser page should open automatically, or you can copy-paste the address that includes `localhost` into your browser. +The page should be blank. Don't worry, we'll add in our Blockly workspace in the following step. ### Alternate imports There are many ways to import a library in JavaScript, and this tutorial does not cover all of them. For samples that show how to integrate Blockly in your project, look at the `examples` folder in [blockly-samples](https://github.com/RaspberryPiFoundation/blockly-samples). -You can also define your imports more carefully to get [different generators](https://www.npmjs.com/package/blockly#blockly-generators) and [locales](https://www.npmjs.com/package/blockly#blockly-languages). +You can also define your imports more carefully to get [different generators](https://www.npmjs.com/package/blockly#blockly-generators) and [locales](https://www.npmjs.com/package/blockly#blockly-languages). \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx b/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx index c04fc80ec47..7d1e9c55840 100644 --- a/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx +++ b/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx @@ -23,7 +23,7 @@ Blockly includes everything you need for defining and rendering blocks in a drag ### What you'll build -TODO +A version of Blockly's sample app, built from scratch. ### What you'll need diff --git a/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx b/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx index 8bb02afa643..8d67a46cc5c 100644 --- a/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx +++ b/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx @@ -17,13 +17,14 @@ A Blockly workspace has two main components: - The area where the user assembles their blocks (the white area). - A toolbox that contains all blocks that are available to the user (the grey area). +TODO: change image and fix alt image -The toolbox may be organized into categories, and may contain both single blocks and groups of blocks. A well-organized toolbox helps the user to explore the available blocks and understand the capabilities of the underlying system. +The toolbox may be organized into categories, and may contain both single blocks or groups of blocks. A well-organized toolbox helps the user to explore the available blocks and understand the capabilities of the underlying system. A toolbox is defined as a JavaScript object and passed into the workspace constructor through an options struct. @@ -31,28 +32,12 @@ For more information on this JSON format and toolbox configuration, including ca ### Define the toolbox -Open up `scripts/main.js` and scroll down to the end of the file. Then add the code for your `toolbox` definition just after the call to `enableMakerMode()`: +Find the file in your `src/` folder called `toolbox.js`. This is where you'll define your toolbox using the JSON format. + +Add the following toolbox definition to `toolbox.js`: ```js -const toolbox = { - kind: 'flyoutToolbox', - contents: [ - { - kind: 'block', - type: 'controls_repeat_ext', - inputs: { - TIMES: { - shadow: { - type: 'math_number', - fields: { - NUM: 5, - }, - }, - }, - }, - }, - ], -}; +// TODO: toolbox def ``` This JavaScript object defines a toolbox with a single "repeat loop" block. @@ -66,42 +51,45 @@ To do this you call the function `Blockly.inject(container, options)`, which tak - `container` is where the Blockly workspace should be placed on the page. It can be an `Element`, an ID string, or a CSS selector. - `options` is a dictionary of configuration options. -For this codelab we will inject into a div with the id `"blocklyDiv"`, which you can find in `index.html`: +For this codelab we will inject into a div with the id `"blocklyDiv"`, which was already created in `index.html`. ```html -
+
``` ### Create the workspace -Now add code to inject the Blockly editor just after the code you used to define your toolbox: +Now add code to inject the Blockly editor in `src/index.js`. You'll first import Blockly, then set up each div from the `index.html`. +Finally, you'll inject Blockly using the toolbox you just created. ```js -Blockly.inject('blocklyDiv', { - toolbox: toolbox, - scrollbars: false, - horizontalLayout: true, - toolboxPosition: 'end', -}); +import * as Blockly from 'blockly'; +import {toolbox} from './toolbox'; + +// Set up UI elements and inject Blockly +const codeDiv = document.getElementById('generatedCode').firstChild; +const outputDiv = document.getElementById('output'); +const blocklyDiv = document.getElementById('blocklyDiv'); + +const ws = Blockly.inject(blocklyDiv, {toolbox}); ``` -Let's look at the options we used to initialize your blockly editor: +`Blockly.inject` allows you to specify some options regarding what your workspace and toolbox look like. +In this case, the only configuration option you selected was `toolbox` which lets you add a toolbox definition to your instance of Blockly. + +The `options` struct offers many additional options which give you significant control over your Blockly's instance. -- `toolbox`: A JavaScript object which defines the toolbox for the editor. +For example: - `scrollbars`: Whether to show scrollbars in the workspace. - `horizontalLayout`: Whether to display the toolbox horizontally or vertically in the workspace. - `toolboxPosition`: Whether to show the toolbox at the top or bottom of the workspace. +- `maxBlocks`: The maximum number of blocks that may be created in the workspace. -The `options` struct gives you significant control over your Blockly instance. You can pass options to set Blockly's theme, modify scrolling behaviour, set the renderer, and more. For more information, head over to Blockly's developer site and check out the [configuration](/guides/configure/configuration_struct#the-options-dictionary) section. +You can also pass options to set Blockly's theme, modify scrolling behaviour, set the renderer, and more. For more information, head over to Blockly's developer site and check out the [configuration](/guides/configure/configuration_struct#the-options-dictionary) section. ### Check your work -Now refresh the page. Select the EDIT mode, then tap on one of the buttons. You should see a Blockly editor: - -image +Make sure both `toolbox.js` and `index.js` are saved, then refresh your `localhost` page. +You should now see your blockly workspace. -Drag and drop the available loop block to the workspace to test it out. +TODO: add screenshot. diff --git a/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx b/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx index 3b1787d33cb..ea718e20bff 100644 --- a/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx +++ b/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx @@ -8,104 +8,98 @@ import Image from '@site/src/components/Image'; ## 6. Create a custom block -Since this is a music maker app, we want a block that plays sounds. We could create one block per sound, but instead we will create a single block with a dropdown to select which note to play: - -image +Let's add a custom block to the workspace. In Blockly, a _block definition_ describes how a block looks and behaves. This includes its text, colour, and shape. It may also include which other blocks it can connect to. Blocks can be defined in either JavaScript or JSON. The developer site has a full article on [how to define a block](/guides/create-custom-blocks/define/block-definitions#how-to-create-block-definitions). +There are also more opinionated guides on things like [block design](/guides/design/blocks) and [block appearance](guides/design/apperance) that reflect recommended best practices when creating blocks. In this codelab we will simply provide the block definition for you to copy and use. -### Define the sound block +### Define the add_text block -Create a JS file to define a new "play sound" block: +Imagine you want to build a block that adds text to the output div of this workspace. +We'll start with the block definition, and then add the ability to generate JavaScript code with that block. -1. Add `sound_blocks.js` file in the `scripts` directory. -1. Add the following code to `sound_blocks.js`: +The [Anatomy of a block](/guides/create-custom-blocks/define/block-anatomy/) page describes the parts of a block in detail. +Find the `text.js` file in `src/blocks/`. Here you'll specify your block definition. Add the following code to `text.js`: ```js -Blockly.common.defineBlocksWithJsonArray([ - { - type: 'play_sound', - message0: 'Play %1', - args0: [ - { - type: 'field_dropdown', - name: 'VALUE', - options: [ - ['C4', 'sounds/c4.m4a'], - ['D4', 'sounds/d4.m4a'], - ['E4', 'sounds/e4.m4a'], - ['F4', 'sounds/f4.m4a'], - ['G4', 'sounds/g4.m4a'], - ], - }, - ], - previousStatement: null, - nextStatement: null, - colour: 355, - }, -]); +import * as Blockly from 'blockly/core'; + +// Create a custom block called 'add_text' that adds +// text to the output div on the sample app. +const addText = { + type: 'add_text', + message0: 'Add text %1', + args0: [ + { + type: 'input_value', + name: 'TEXT', + check: 'String', + }, + ], + previousStatement: null, + nextStatement: null, + colour: 160, + tooltip: '', + helpUrl: '', +}; ``` -Add a script tag to `index.html` to include your new block definition: +The page on [Block structure in JSON](/guides/create-custom-blocks/define/structure-json) is also a good resource for understanding the parts of a JSON block definition. -```html - -``` +The block definition for `add_text` includes the following +Note that not all of these are required for a block definition. +For example, `previousStatement` and `nextStatement` should be left out of a block definition if the block does not allow statements to be stacked above or below itself. + +- `type`: The name for this block. +- `message0`: The label for the block. +- `args0`: The inputs to the block. + - `type`: The type of input. + - `name`: The unique name of the input. + - `check`: The expected type of the input. +- `previousStatement`: Include if other statements can be stacked above this block. +- `nextStatement`: Include if other statements can be stacked below this block. +- `colour`: The color of the block. +- `tooltip`: A message that displays when the user hovers their mouse over the block. +- `helpUrl`: The URL that a user is sent to after right-clicking the block and selecting 'Help'. + +### Create Block Definition -Your sound block definitions must come after importing Blockly and before the other imports, since you will use Blockly functions in this file, and you will be using functions from this file in later files. Your imports should now look like this: +After defining the JSON definition for the block, we'll need to create the block definition. +Add the following code to the end of `text.js` in `src/blocks/`, after your `addText` object. -```html - - - - +```js +// Create the block definitions for the JSON-only blocks. +// This does not register their definitions with Blockly. +// This file has no side effects! +export const blocks = Blockly.common.createBlockDefinitionsFromJsonArray([ + addText, +]); ``` -### Add the sound block to the toolbox +### Register the custom block -Now we can update the toolbox to include the new sound block, by adding `{'kind': 'block', 'type': 'play_sound'}` to our `toolbox` definition: +The block is all set up, now we just need to register it. Add the following import statement and code to the top of `src/index.js` ```js -const toolbox = { - kind: 'flyoutToolbox', - contents: [ - { - kind: 'block', - type: 'controls_repeat_ext', - inputs: { - TIMES: { - shadow: { - type: 'math_number', - fields: { - NUM: 5, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'play_sound', - }, - ], -}; +import {blocks} from './blocks/text'; + +Blockly.common.defineBlocks(blocks); ``` -Run the app one more time, and play around with the new `Play (sound)` block. It should look like this: +### Add the custom block to the toolbox + +Now we can update the toolbox to include the new block, by adding `{'kind': 'block', 'type': 'add_text'}` to our `toolbox` definition: + +```js +// TODO: toolbox def with custom block +``` -image +Refresh the page. +TODO: it might glitch out bc no generator def :/ ### The block factory diff --git a/packages/docs/docs/codelabs/getting-started/create-base-app.mdx b/packages/docs/docs/codelabs/getting-started/create-base-app.mdx new file mode 100644 index 00000000000..941f6d12bc8 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/create-base-app.mdx @@ -0,0 +1,40 @@ +--- +description: How to set up the base for your app. +--- + +# Getting started with Blockly + +## 4. Add basic HTML and CS + +### Create HTML for your page +Open `starter-code/src/` and find the file called `index.html`. In this file, you'll specify some basic structure for your app. +You'll also make a div (here called `blocklyDiv`) that you'll later inject Blockly into. + +Copy and paste the following HTML into your `index.html` file. + +```html + + + + + Blockly Sample App + + +
+
+
+
+
+
+
+ + +``` + +### Examine the CSS for your page + +The css for the app is already included in `index.css`. This codelab just includes basic styling for the webpage itself. + +If you would like to change the theme of Blockly, you can check out the [customizing your themes codelab](/codelabs/theme-extension-identifier/codelab-overview/) for an overview. + +There is also a [css codelab](codelabs/css/codelab-overview/) that offers a walkthrough of more fine-grained styling. \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/explore-the-app.mdx b/packages/docs/docs/codelabs/getting-started/explore-the-app.mdx deleted file mode 100644 index b4d58993de3..00000000000 --- a/packages/docs/docs/codelabs/getting-started/explore-the-app.mdx +++ /dev/null @@ -1,19 +0,0 @@ ---- -description: Explore Blockly's getting started app. ---- - -import Image from '@site/src/components/Image'; - -# Getting started with Blockly - -## 3. Run the app - -TODO: Save this for later I think -1. Install [node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) if you haven't already. -2. Navigate to the starter code folder `packages/docs/docs/codelabs/getting-started/starter-code` -in your terminal. -3. Run `npm install` in your terminal. -4. Run `npm start` - - - diff --git a/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx b/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx index ad874d7a640..08c3a6418c3 100644 --- a/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx +++ b/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx @@ -8,33 +8,58 @@ import Image from '@site/src/components/Image'; ## 8. Generate JavaScript code -Now that each button can be configured with its own Blockly workspace, the next thing we want to do is to generate JavaScript code from each workspace. +The next thing we want to do is to generate JavaScript code. This generated code will be run by the browser, effectively executing the blocks set up in the Blockly workspace. ### The language generator -Blockly can generate code from blocks for different languages, e.g. JavaScript, Python, or PHP. +A _language generator_ defines the rules for generating a specific language (such as indentation). -A _language generator_ defines the rules for generating a specific language (such as indentation). Because we are using the default imports, we don't need to add any new code to get the JavaScript generator. +Blockly can generate code from blocks for five different languages: Dart, JavaScript, Lua, PHP, and Python. +You can also create a custom code generator to generate code in a different language, which the [custom generator codelab]() walks through. +TODO: gotta figure out the imports stuff As previously mentioned, you can define your imports more carefully to get a [different generator](https://www.npmjs.com/package/blockly#blockly-generators). ### Add a block generator When Blockly generates JavaScript code for blocks in a workspace, it translates each block into code. By default, it knows how to translate all library-provided default blocks into JavaScript code. However, for any custom blocks, we need to specify our own translation functions. These are called _block generators_. -Add the following code to the bottom of `scripts/sound_blocks.js`: +Find the `javascript.js` file in `src/generators/`. This is where you will tell Blockly's JavaScript generator how to generate code for the add text block. +Add the following code to the bottom of `src/sound_blocks.js`: + +TODO: explain this code a bit ```js -javascript.javascriptGenerator.forBlock['play_sound'] = function (block) { - let value = "'" + block.getFieldValue('VALUE') + "'"; - return 'MusicMaker.queueSound(' + value + ');\n'; +import {Order} from 'blockly/javascript'; + +export const forBlock = Object.create(null); + +forBlock['add_text'] = function (block, generator) { + const text = generator.valueToCode(block, 'TEXT', Order.NONE) || "''"; + const addText = generator.provideFunction_( + 'addText', + `function ${generator.FUNCTION_NAME_PLACEHOLDER_}(text) { + + // Add text to the output area. + const outputDiv = document.getElementById('output'); + const textEl = document.createElement('p'); + textEl.innerText = text; + outputDiv.appendChild(textEl); +}`, + ); + // Generate the function call for this block. + const code = `${addText}(${text});\n`; + return code; }; ``` -With this translation function, the following `play_sound` block: +The code that this generates is a JavaScript function which adds text to the output area. + +With this translation function, the following `add_text` block: +TODO: update image!! image { + const code = javascriptGenerator.workspaceToCode(ws); + codeDiv.innerText = code; + + outputDiv.innerHTML = ''; + eval(code); -} catch (error) { - console.log(error); -} +}; ``` -### The full code +### Automatically run the code + +Now, we need to actually call this `runCode` function. +First let's consider the scenario where there's some state that needs to be loaded up. We'll want to load that state right away, and run the code as well. -The end result should look like this: +Add the following lines of code to `index.js` beneath your `runCode` function. ```js -function handlePlay(event) { - loadWorkspace(event.target); - let code = javascript.javascriptGenerator.workspaceToCode( - Blockly.getMainWorkspace(), - ); - code += 'MusicMaker.play();'; - try { - eval(code); - } catch (error) { - console.log(error); +// Load the initial state from storage and run the code. +load(ws); +runCode(); +``` + +Since this code is simply declared in `index.js`, it'll only run once, upon load of the workspace. +We want the code to run any time a block is added or changed in the workspace. This sounds like another job for change listeners! + +Similar to our last change listener, we'll want to exclude certain types of events. This time, in addition to ignoring UI Events, we'll ignore an event that fires when the workspace has finished loading, since this would be redundant with the code we just added. +We'll also disregard anything that fires when a block is currently being dragged so that we don't save an invalid state. +For all other events, this change listener will call `runCode()` + +```js +// Whenever the workspace changes meaningfully, run the code again. +ws.addChangeListener((e) => { + // Don't run the code when the workspace finishes loading; we're + // already running it once when the application starts. + // Don't run the code during drags; we might have invalid state. + if ( + e.isUiEvent || + e.type == Blockly.Events.FINISHED_LOADING || + ws.isDragging() + ) { + return; } + runCode(); +}); +``` + + +TODO: add a try catch to sample app? this would be good!!!!!! +Finally, execute the script with the `eval` function. Wrap it in a `try/catch` so that any runtime errors are logged to the console, instead of failing quietly: + +```js +try { + eval(code); +} catch (error) { + console.log(error); } ``` @@ -62,12 +109,13 @@ Executing scripts with eval is not always the safest option - we use it here for ### Test it -Run the app and try it out! Edit one of the buttons to play a D4 sound 3 times: +Run the app and try it out! Try making a simple program by putting the add text block into a loop. + +You can set the text, and it should display in the output window as seen below. +TODO: update image! image - -Save and exit the edit mode. Now if you tap this button, you should hear the D4 sound played 3 times. +/> \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx b/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx index 039ea389558..8b3d21efa2d 100644 --- a/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx +++ b/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx @@ -6,48 +6,87 @@ description: How to save and load your workspace. ## 7. Save/load workspace -You now have a Blockly workspace that appears when editing a button. The user can use this to write code, but there's no link between the code the user has written and an individual button on the page. - -Once the button behavior is defined by the user, it needs to be saved for later use. The saved code must be per button, since buttons can be programmed to play different sounds. +You now have a Blockly workspace. However, if you reload the page, you'll find that all your blocks disappear! +Your users likely won't want their blocks to vanish, so let's add some serialization. +In this case, we'll save the state of the workspace to local browser storage, so that if you reload or close the tab, ### Add the save method -Open `scripts/main.js`. Add the following code to the `save()` method: +Open `src/serialization.js`. We'll set a unique storage key for this codelab. `save` takes the Blockly workspace, exports its state to a JavaScript object, then saves that object to local storage. + +Add the following code to `serialization.js`: ```js -button.blocklySave = Blockly.serialization.workspaces.save( - Blockly.getMainWorkspace(), -); +import * as Blockly from 'blockly/core'; + +const storageKey = 'getting-started-codelab/mainWorkspace'; + +/** + * Saves the state of the workspace to browser's local storage. + * @param {Blockly.Workspace} workspace Blockly workspace to save. + */ +export const save = function (workspace) { + const data = Blockly.serialization.workspaces.save(workspace); + window.localStorage?.setItem(storageKey, JSON.stringify(data)); +}; ``` -`workspaces.save` takes the Blockly workspace, exports its state to a JavaScript object and stores it in a `blocklySave` property on the button. This way the exported state for the block sequence gets associated with a particular button. - ### Add the load method -Similarly, when a user opens the editor, the blocks previously associated with this button should get loaded into the workspace. +Similarly, when a user opens or reloads the page, the blocks in local storage should be loaded back into the workspace. -In the `scripts/main.js `file, add `loadWorkspace` function: +In the `src/serialization.js `file, add the `load` function. `load` checks for items in local storage and loads them into the workspace. +```js +/** + * Loads saved state from local storage into the given workspace. + * @param {Blockly.Workspace} workspace Blockly workspace to load into. + */ +export const load = function (workspace) { + const data = window.localStorage?.getItem(storageKey); + if (!data) return; + + // Don't emit events during loading. + Blockly.Events.disable(); + Blockly.serialization.workspaces.load(JSON.parse(data), workspace, false); + Blockly.Events.enable(); +}; ``` -function loadWorkspace(button) { - const workspace = Blockly.getMainWorkspace(); - if (button.blocklySave) { - Blockly.serialization.workspaces.load(button.blocklySave, workspace); - } else { - workspace.clear(); - } -} -``` -This loads the blocks stored on the button that was clicked back into the workspace. +TODO: assess whether this needs to be split into a new page +### Events + +You may have noticed that the `load` function disables events from emitting while loading the workspace. +Every change on the workspace triggers an event. For example, when a user drags a block into the workspace or connects two blocks, these actions will trigger events. + +In this case, disabling events while loading will help prevent unexpected behavior, since some parts of Blockly listen to the event stream to know when to execute. -Call this function from the end of the function `enableBlocklyMode`: +We can take advantage of the events stream to know when to call the `save` and `load` functions that you just implemented. +### Add a Change Listener +In `src/index.js`, add the following import statement so that you can use the `save` and `load` functions from `serialization.js`. + +```js +import {save, load} from './serialization'; ``` -function enableBlocklyMode(e) { - ... - loadWorkspace(currentButton); -} + +Now, you'll add a `ChangeListener` to listen to the event stream. Every time an event fires, this function will trigger and save the workspace. + +There are some types of events that we don't need to save after. +Whenever the user changes something about the UI by scrolling, zooming, or opening toolbox categories, we don't want to save the workspace because these changes don't actually the data of the workspace. +These types of events are called UI Events, so we'll ignore UI events in the `ChangeListener`. + +```js +// Every time the workspace changes state, save the changes to storage. +ws.addChangeListener((e) => { + // UI events are things like scrolling, zooming, etc. + // No need to save after one of these. + if (e.isUiEvent) return; + save(ws); +}); ``` -Now, test the code. Edit the workspace for one of the buttons, add some blocks, save it, and reopen it. The workspace should still contain the blocks you added. +To learn more about the events stream, see the [Events documentation](/guides/configure/events/). + +### Testing the changes +Now, test the code. Add some blocks, then reload the page. The workspace should still contain the blocks you added. diff --git a/packages/docs/docs/codelabs/getting-started/setup.mdx b/packages/docs/docs/codelabs/getting-started/setup.mdx index f29315973f2..0c8a2be57a1 100644 --- a/packages/docs/docs/codelabs/getting-started/setup.mdx +++ b/packages/docs/docs/codelabs/getting-started/setup.mdx @@ -25,11 +25,10 @@ The relevant files are in `packages/docs/docs/codelabs/getting-started`. There a - `starter-code/`: The starter code that you'll build upon in this codelab. - `complete-code/`: The code after completing the codelab, in case you get lost or want to compare to your version. -Each folder contains: +The starter code folder contains: -- `dist/`: TODO -- `src/`: Where you'll put your code. -- `package-lock.json`: TODO -- `package.json`: TODO -- `webpack.config.js`: TODO +- `src/`: Where you'll put your code. The necessary files are already included. +- `package-lock.json`: Keeps track of the dependencies. +- `package.json`: Stores basic information about the app. +- `webpack.config.js`: The configuration for webpack, which handles the application bundling and running the server. diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js b/packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js deleted file mode 100644 index 564794ffc49..00000000000 --- a/packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see bundle.js.LICENSE.txt */ -(()=>{var __webpack_modules__={523(t,e,s){"use strict";s.d(e,{A:()=>l});var i=s(601),o=s.n(i),n=s(314),r=s.n(n)()(o());r.push([t.id,"body {\n margin: 0;\n max-width: 100vw;\n}\n\npre,\ncode {\n overflow: auto;\n}\n\n#pageContainer {\n display: flex;\n width: 100%;\n max-width: 100vw;\n height: 100vh;\n}\n\n#blocklyDiv {\n flex-basis: 100%;\n height: 100%;\n min-width: 600px;\n}\n\n#outputPane {\n display: flex;\n flex-direction: column;\n width: 400px;\n flex: 0 0 400px;\n overflow: auto;\n margin: 1rem;\n}\n\n#generatedCode {\n height: 50%;\n background-color: rgb(247, 240, 228);\n}\n\n#output {\n height: 50%;\n}\n",""]);const l=r},314(t){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var s="",i=void 0!==e[5];return e[4]&&(s+="@supports (".concat(e[4],") {")),e[2]&&(s+="@media ".concat(e[2]," {")),i&&(s+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),s+=t(e),i&&(s+="}"),e[2]&&(s+="}"),e[4]&&(s+="}"),s}).join("")},e.i=function(t,s,i,o,n){"string"==typeof t&&(t=[[null,t,void 0]]);var r={};if(i)for(var l=0;l0?" ".concat(h[5]):""," {").concat(h[1],"}")),h[5]=n),s&&(h[2]?(h[1]="@media ".concat(h[2]," {").concat(h[1],"}"),h[2]=s):h[2]=s),o&&(h[4]?(h[1]="@supports (".concat(h[4],") {").concat(h[1],"}"),h[4]=o):h[4]="".concat(o)),e.push(h))}},e}},601(t){"use strict";t.exports=function(t){return t[1]}},216(t,e,s){"use strict";var i=s(72),o=s.n(i),n=s(825),r=s.n(n),l=s(659),a=s.n(l),c=s(56),h=s.n(c),u=s(540),d=s.n(u),p=s(113),g=s.n(p),_=s(523),T={};T.styleTagTransform=g(),T.setAttributes=h(),T.insert=a().bind(null,"head"),T.domAPI=r(),T.insertStyleElement=d(),o()(_.A,T),_.A&&_.A.locals&&_.A.locals},72(t){"use strict";var e=[];function s(t){for(var s=-1,i=0;i0?" ".concat(s.layer):""," {")),i+=s.css,o&&(i+="}"),s.media&&(i+="}"),s.supports&&(i+="}");var n=s.sourceMap;n&&"undefined"!=typeof btoa&&(i+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(n))))," */")),e.styleTagTransform(i,t,e.options)}(e,t,s)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}},113(t){"use strict";t.exports=function(t,e){if(e.styleSheet)e.styleSheet.cssText=t;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(t))}}},780(t,e,s){"use strict";s.d(e,{B:()=>i});const i=s(671).sh.createBlockDefinitionsFromJsonArray([{type:"add_text",message0:"Add text %1",args0:[{type:"input_value",name:"TEXT",check:"String"}],previousStatement:null,nextStatement:null,colour:160,tooltip:"",helpUrl:""}])},352(t,e,s){"use strict";s.d(e,{J:()=>o});var i=s(290);const o=Object.create(null);o.add_text=function(t,e){const s=e.valueToCode(t,"TEXT",i.pH.NONE)||"''";return`${e.provideFunction_("addText",`function ${e.FUNCTION_NAME_PLACEHOLDER_}(text) {\n\n // Add text to the output area.\n const outputDiv = document.getElementById('output');\n const textEl = document.createElement('p');\n textEl.innerText = text;\n outputDiv.appendChild(textEl);\n}`)}(${s});\n`}},952(t,e,s){"use strict";s.d(e,{H:()=>r,U:()=>n});var i=s(671);const o="mainWorkspace",n=function(t){const e=i.JF.workspaces.save(t);window.localStorage?.setItem(o,JSON.stringify(e))},r=function(t){const e=window.localStorage?.getItem(o);e&&(i.sV.disable(),i.JF.workspaces.load(JSON.parse(e),t,!1),i.sV.enable())}},336(t,e,s){"use strict";s.d(e,{M:()=>i});const i={kind:"categoryToolbox",contents:[{kind:"category",name:"Logic",categorystyle:"logic_category",contents:[{kind:"block",type:"controls_if"},{kind:"block",type:"logic_compare"},{kind:"block",type:"logic_operation"},{kind:"block",type:"logic_negate"},{kind:"block",type:"logic_boolean"},{kind:"block",type:"logic_null"},{kind:"block",type:"logic_ternary"}]},{kind:"category",name:"Loops",categorystyle:"loop_category",contents:[{kind:"block",type:"controls_repeat_ext",inputs:{TIMES:{shadow:{type:"math_number",fields:{NUM:10}}}}},{kind:"block",type:"controls_whileUntil"},{kind:"block",type:"controls_for",inputs:{FROM:{shadow:{type:"math_number",fields:{NUM:1}}},TO:{shadow:{type:"math_number",fields:{NUM:10}}},BY:{shadow:{type:"math_number",fields:{NUM:1}}}}},{kind:"block",type:"controls_forEach"},{kind:"block",type:"controls_flow_statements"}]},{kind:"category",name:"Math",categorystyle:"math_category",contents:[{kind:"block",type:"math_number",fields:{NUM:123}},{kind:"block",type:"math_arithmetic",inputs:{A:{shadow:{type:"math_number",fields:{NUM:1}}},B:{shadow:{type:"math_number",fields:{NUM:1}}}}},{kind:"block",type:"math_single",inputs:{NUM:{shadow:{type:"math_number",fields:{NUM:9}}}}},{kind:"block",type:"math_trig",inputs:{NUM:{shadow:{type:"math_number",fields:{NUM:45}}}}},{kind:"block",type:"math_constant"},{kind:"block",type:"math_number_property",inputs:{NUMBER_TO_CHECK:{shadow:{type:"math_number",fields:{NUM:0}}}}},{kind:"block",type:"math_round",fields:{OP:"ROUND"},inputs:{NUM:{shadow:{type:"math_number",fields:{NUM:3.1}}}}},{kind:"block",type:"math_on_list",fields:{OP:"SUM"}},{kind:"block",type:"math_modulo",inputs:{DIVIDEND:{shadow:{type:"math_number",fields:{NUM:64}}},DIVISOR:{shadow:{type:"math_number",fields:{NUM:10}}}}},{kind:"block",type:"math_constrain",inputs:{VALUE:{shadow:{type:"math_number",fields:{NUM:50}}},LOW:{shadow:{type:"math_number",fields:{NUM:1}}},HIGH:{shadow:{type:"math_number",fields:{NUM:100}}}}},{kind:"block",type:"math_random_int",inputs:{FROM:{shadow:{type:"math_number",fields:{NUM:1}}},TO:{shadow:{type:"math_number",fields:{NUM:100}}}}},{kind:"block",type:"math_random_float"},{kind:"block",type:"math_atan2",inputs:{X:{shadow:{type:"math_number",fields:{NUM:1}}},Y:{shadow:{type:"math_number",fields:{NUM:1}}}}}]},{kind:"category",name:"Text",categorystyle:"text_category",contents:[{kind:"block",type:"text"},{kind:"block",type:"text_join"},{kind:"block",type:"text_append",inputs:{TEXT:{shadow:{type:"text",fields:{TEXT:""}}}}},{kind:"block",type:"text_length",inputs:{VALUE:{shadow:{type:"text",fields:{TEXT:"abc"}}}}},{kind:"block",type:"text_isEmpty",inputs:{VALUE:{shadow:{type:"text",fields:{TEXT:""}}}}},{kind:"block",type:"text_indexOf",inputs:{VALUE:{block:{type:"variables_get"}},FIND:{shadow:{type:"text",fields:{TEXT:"abc"}}}}},{kind:"block",type:"text_charAt",inputs:{VALUE:{block:{type:"variables_get"}}}},{kind:"block",type:"text_getSubstring",inputs:{STRING:{block:{type:"variables_get"}}}},{kind:"block",type:"text_changeCase",inputs:{TEXT:{shadow:{type:"text",fields:{TEXT:"abc"}}}}},{kind:"block",type:"text_trim",inputs:{TEXT:{shadow:{type:"text",fields:{TEXT:"abc"}}}}},{kind:"block",type:"text_count",inputs:{SUB:{shadow:{type:"text"}},TEXT:{shadow:{type:"text"}}}},{kind:"block",type:"text_replace",inputs:{FROM:{shadow:{type:"text"}},TO:{shadow:{type:"text"}},TEXT:{shadow:{type:"text"}}}},{kind:"block",type:"text_reverse",inputs:{TEXT:{shadow:{type:"text"}}}},{kind:"block",type:"add_text",inputs:{TEXT:{shadow:{type:"text",fields:{TEXT:"abc"}}}}}]},{kind:"category",name:"Lists",categorystyle:"list_category",contents:[{kind:"block",type:"lists_create_with"},{kind:"block",type:"lists_create_with"},{kind:"block",type:"lists_repeat",inputs:{NUM:{shadow:{type:"math_number",fields:{NUM:5}}}}},{kind:"block",type:"lists_length"},{kind:"block",type:"lists_isEmpty"},{kind:"block",type:"lists_indexOf",inputs:{VALUE:{block:{type:"variables_get"}}}},{kind:"block",type:"lists_getIndex",inputs:{VALUE:{block:{type:"variables_get"}}}},{kind:"block",type:"lists_setIndex",inputs:{LIST:{block:{type:"variables_get"}}}},{kind:"block",type:"lists_getSublist",inputs:{LIST:{block:{type:"variables_get"}}}},{kind:"block",type:"lists_split",inputs:{DELIM:{shadow:{type:"text",fields:{TEXT:","}}}}},{kind:"block",type:"lists_sort"},{kind:"block",type:"lists_reverse"}]},{kind:"sep"},{kind:"category",name:"Variables",categorystyle:"variable_category",custom:"VARIABLE"},{kind:"category",name:"Functions",categorystyle:"procedure_category",custom:"PROCEDURE"}]}},500(t,e,s){var i,o;void 0===(o="function"==typeof(i=function(){var t,e,i,o,n,r,l,a,c,h,u,d,p,g,_,T,m,E,b,f,$,I,C,S,R,y,O,k,A,v,N,w,L,M,D,x,P,B,F,U,H,G,V,W,X,z,Y,K,j,J,q,Z,Q,tt,et,st,it,ot,nt,rt,lt,at,ct,ht,ut,dt,pt,gt,_t,Tt,mt,Et,bt,ft,$t,It,Ct,St,Rt,yt,Ot,kt,At,vt,Nt,wt,Lt,Mt,Dt,xt,Pt,Bt,Ft,Ut,Ht,Gt,Vt,Wt,Xt,zt,Yt,Kt,jt,Jt,qt,Zt,Qt,te,ee,se,ie,oe,ne,re,le,ae,ce,he,ue,de,pe,ge,_e,Te,me,Ee,be,fe,$e,Ie,Ce,Se,Re,ye,Oe,ke,Ae,ve,Ne,we,Le,Me,De,xe,Pe,Be,Fe,Ue,He,Ge,Ve,We,Xe,ze,Ye,Ke,je,Je,qe,Ze,Qe,ts,es,ss,is,os,ns,rs,ls,as,cs,hs,us,ds,ps,gs,_s,Ts,ms,Es,bs,fs,$s,Is,Cs,Ss,Rs,ys,Os,ks,As,vs,Ns,ws,Ls,Ms,Ds,xs,Ps,Bs,Fs,Us,Hs,Gs,Vs,Ws,Xs,zs,Ys,Ks,js,Js,qs,Zs,Qs,ti,ei,si,ii,oi,ni,ri,li,ai,ci,hi,ui,di,pi,gi,_i,Ti,mi,Ei,bi,fi,$i,Ii,Ci,Si,Ri,yi,Oi,ki,Ai,vi,Ni,wi,Li,Mi,Di,xi,Pi,Bi,Fi,Ui,Hi,Gi,Vi,Wi,Xi,zi,Yi,Ki,ji,Ji,qi,Zi,Qi,to,eo,so,io,oo,no,ro,lo,ao,co,ho,uo,po,go,_o,To,mo,Eo,bo,fo,$o,Io,Co,So,Ro,yo,Oo,ko,Ao,vo,No,wo,Lo,Mo,Do,xo,Po,Bo,Fo,Uo,Ho,Go,Vo,Wo,Xo,zo,Yo,Ko,jo,Jo,qo,Zo,Qo,tn,en,sn,on,nn,rn,ln,an,cn,hn,un,dn,pn,gn,_n,Tn,mn,En,bn,fn,$n,In,Cn,Sn,Rn,yn,On,kn,An,vn,Nn,wn,Ln,Mn,Dn,xn,Pn,Bn,Fn,Un,Hn,Gn,Vn,Wn,Xn,zn,Yn,Kn,jn,Jn,qn,Zn,Qn,tr,er,sr,ir,or,nr,rr,lr,ar,cr,hr,ur,dr,pr,gr,_r,Tr,mr,Er,br,fr,$r,Ir,Cr,Sr,Rr,yr,Or,kr,Ar,vr,Nr,wr,Lr,Mr,Dr,xr,Pr,Br,Fr,Ur,Hr,Gr,Vr,Wr,Xr,zr,Yr,Kr,jr,Jr,qr,Zr,Qr,tl,el,sl,il,ol,nl,rl,ll,al,cl,hl,ul,dl,pl,gl,_l,Tl,ml,El,bl,fl,$l,Il,Cl,Sl,Rl,yl,Ol,kl,Al,vl,Nl,wl,Ll,Ml,Dl,xl,Pl,Bl,Fl,Ul,Hl={};t=function(t,s,i,o){if(!(t instanceof zl)&&"string"!=typeof t||""===`${t}`.trim())throw Error('Invalid type "'+t+'". The type must be a non-empty string or a Blockly.registry.Type.');if(t=`${t}`.toLowerCase(),"string"!=typeof s||""===s.trim())throw Error('Invalid name "'+s+'". The name must be a non-empty string.');const n=s.toLowerCase();if(!i)throw Error("Can not register a null value");let r=Gl[t],l=Wl[t];if(r||(r=Gl[t]=Object.create(null),l=Wl[t]=Object.create(null)),e(t,i),!o&&r[n]&&r[n]!==i)throw Error('Name "'+n+'" with type "'+t+'" already registered.');r[n]=i,l[n]=s},e=function(t,e){if(t===String(zl.FIELD)&&"function"!=typeof e.fromJson)throw Error('Type "'+t+'" must have a fromJson function')},i=function(t,e){t=`${t}`.toLowerCase(),e=e.toLowerCase();const s=Gl[t];s&&s[e]?(delete Gl[t][e],delete Wl[t][e]):console.warn("Unable to unregister ["+e+"]["+t+"] from the registry.")},o=function(t,e,s){t=`${t}`.toLowerCase(),e=e.toLowerCase();const i=Gl[t];if(!i||!i[e]){if(e="Unable to find ["+e+"]["+t+"] in the registry.",s)throw Error(e+" You must require or register a "+t+" plugin.");return console.warn(e),null}return i[e]},n=function(t,e){return t=`${t}`.toLowerCase(),e=e.toLowerCase(),!!(t=Gl[t])&&!!t[e]},r=function(t,e,s){return o(t,e,s)},l=function(t,e,s){return o(t,e,s)},a=function(t,e,s){t=`${t}`.toLowerCase();var i=Gl[t];if(!i){if(i=`Unable to find [${t}] in the registry.`,s)throw Error(`${i} You must require or register a ${t} plugin.`);return console.warn(i),null}if(!e)return i;t=Wl[t],s=Object.create(null);for(const e of Object.keys(i))s[t[e]]=i[e];return s},c=function(t,e,s){return"function"==typeof(e=e.plugins[String(t)]||Xl)?e:r(t,e,s)},h=function(t,e){u(),ca=setTimeout(function(){e&&e.handleRightClick(t)},na)},u=function(){ca&&(clearTimeout(ca),ca=0)},d=function(){la=null},p=function(t){return!t.type.startsWith("pointer")||t instanceof PointerEvent&&_(t)},g=function(t){return`${t.pointerId}`},_=function(t){const e=g(t);return la?la===e:"pointerdown"===t.type&&(la=e,!0)},T=function(t,e,s,i,o,n){function r(t){(o||p(t))&&(s?i.call(s,t):i(t))}const l=[];if(e in aa)for(let s=0;s{setTimeout(Z,0)})}catch(t){setTimeout(Z,0)}Q(t)}},Z=function(){const t=tt(La);La.length=0;for(const e of t){if(!e.workspaceId)continue;let t;null==(t=Rt(e.workspaceId))||t.fireChangeListener(e)}},Q=function(t){if(O(t)&&"mutation"===t.element){let e;for(e=La.length;e>0;e--){const s=La[e-1];if(s.group!==t.group||s.workspaceId!==t.workspaceId||!A(s)||s.newParentId!==t.blockId)break}La.splice(e,0,t)}else La.push(t)},tt=function(t){const e=[];for(const s of t)if(t=e[e.length-1],!s.isNull())if(t&&t.workspaceId===s.workspaceId&&t.group===s.group)if(A(s)&&A(t)&&s.blockId===t.blockId){if(t.newParentId=s.newParentId,t.newInputName=s.newInputName,t.newCoordinate=s.newCoordinate,t.reason||s.reason){let e,i;t.reason=Array.from(new Set((null!=(e=t.reason)?e:[]).concat(null!=(i=s.reason)?i:[])))}}else O(s)&&O(t)&&s.blockId===t.blockId&&s.element===t.element&&s.name===t.name?t.newValue=s.newValue:U(s)&&U(t)?(t.viewTop=s.viewTop,t.viewLeft=s.viewLeft,t.scale=s.scale,t.oldScale=s.oldScale):D(s)&&x(t)||e.push(s);else e.push(s);return e.filter(t=>!t.isNull())},et=function(){for(let t,e=0;t=La[e];e++)t.recordUndo=!1},Hl.disable$$module$build$src$core$events$utils=function(){Na++},Hl.enable$$module$build$src$core$events$utils=function(){Na--},st=function(){return 0===Na},Hl.getGroup$$module$build$src$core$events$utils=function(){return Aa},Hl.setGroup$$module$build$src$core$events$utils=function(t){Ma.setGroupInternal(t)},it=function(t){Aa="boolean"==typeof t?t?S():"":t},ot=function(t){const e=[];t=t.getDescendants(!1);for(let s,i=0;s=t[i];i++)e[i]=s.id;return e},nt=function(t,e){const s=rt(t.type);if(!s)throw Error("Unknown event type.");return s.fromJson(t,e)},rt=function(t){const e=r(zl.EVENT,t);if(!e)throw Error(`Event type ${t} not found in registry.`);return e},lt=function(t){if((A(t)||R(t))&&t.workspaceId){var e=Rt(t.workspaceId);if(!t.blockId)throw Error("Encountered a blockEvent without a proper blockId");if(t=e.getBlockById(t.blockId)){const s=va;try{va=!1;const s=t.getParent();if(s&&!s.hasDisabledReason(wa)){const e=t.getDescendants(!1);for(let t,s=0;t=e[s];s++)t.setDisabledReason(!1,wa)}else if((t.outputConnection||t.previousConnection)&&!e.isDragging())do{t.setDisabledReason(!0,wa),t=t.getNextBlock()}while(t)}finally{va=s}}}},at=function(t,e,s){t=document.createElementNS(Pa,`${t}`);for(const s in e)t.setAttribute(s,`${e[s]}`);return s&&s.appendChild(t),t},ct=function(t,e){return!(e=e.split(" ")).every(e=>t.classList.contains(e))&&(t.classList.add(...e),!0)},ht=function(t,e){t.classList.remove(...e.split(" "))},ut=function(t,e){return!(e=e.split(" ")).every(e=>!t.classList.contains(e))&&(t.classList.remove(...e),!0)},dt=function(t,e){return t.classList.contains(e)},pt=function(t){return t&&t.parentNode?t.parentNode.removeChild(t):null},gt=function(t,e){const s=e.nextSibling;if(!(e=e.parentNode))throw Error("Reference node has no parent.");s?e.insertBefore(t,s):e.appendChild(t)},_t=function(t,e){t.style.transform=e,t.style["-webkit-transform"]=e},Tt=function(){Ha++,Ua||(Ua=Object.create(null))},mt=function(){--Ha||(Ua=null)},Et=function(t){const e=t.textContent+"\n"+t.className.baseVal;var s;return Ua&&(s=Ua[e])||(s=window.getComputedStyle(t),s=ft(t,s.fontSize,s.fontWeight,s.fontFamily),Ua&&(Ua[e]=s)),s},bt=function(t,e,s,i){return ft(t,e+"pt",s,i)},ft=function(t,e,s,i){const o=t.textContent;var n;return t=o+"\n"+t.className.baseVal,Ua&&(n=Ua[t])||(Ga||((n=document.createElement("canvas")).className="blocklyComputeCanvas",document.body.appendChild(n),Ga=n.getContext("2d")),o&&Ga?(Ga.font=s+" "+e+" "+i,n=Ga.measureText(o).width):n=0,Ua&&(Ua[t]=n)),n},$t=function(t,e,s,i){const o=document.createElement("span");o.style.font=s+" "+e+" "+i,o.textContent=t,(t=document.createElement("div")).style.width="1px",t.style.height="0",(e=document.createElement("div")).style.display="flex",e.style.position="fixed",e.style.top="0",e.style.left="0",e.appendChild(o),e.appendChild(t),document.body.appendChild(e),s={height:0,baseline:0};try{e.style.alignItems="baseline",s.baseline=t.offsetTop-o.offsetTop,e.style.alignItems="flex-end",s.height=t.offsetTop-o.offsetTop}finally{document.body.removeChild(e)}return s},Hl.getFocusManager$$module$build$src$core$focus_manager=function(){return za.getFocusManager()},It=function(t){return t&&"function"==typeof t.getFocusableElement&&"function"==typeof t.getFocusableTree&&"function"==typeof t.onNodeFocus&&"function"==typeof t.onNodeBlur&&"function"==typeof t.canBeFocused},Ct=function(t){return It(t)&&"string"==typeof t.id&&"object"==typeof t.workspace&&"function"==typeof t.select&&"function"==typeof t.unselect},St=function(t,e){for(const s in e)null!==e[s]&&Array.isArray(e[s])?t[s]=St(t[s]||[],e[s]):t[s]=null!==e[s]&&"object"==typeof e[s]?St(t[s]||Object.create(null),e[s]):e[s];return t},Rt=function(t){return Za[t]||null},yt=function(){const t=[];for(const e in Za)t.push(Za[e]);return t},Ot=function(t){Za[t.id]=t},kt=function(t){delete Za[t.id]},At=function(){return Ja},vt=function(t){Ja=t},Nt=function(){const t=Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode();return t&&Ct(t)?t:null},wt=function(t){Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(t)},Lt=function(t){const e=Nt();let s,i,o,n;const r=new(rt(ua.SELECTED))(null!=(s=null==e?void 0:e.id)?s:null,null!=(i=null==t?void 0:t.id)?i:null,null!=(n=null!=(o=null==t?void 0:t.workspace.id)?o:null==e?void 0:e.workspace.id)?n:"");J(r)},Mt=function(){return qa},Dt=function(t){qa=t},xt=function(t){for(;t.options.parentWorkspace;)t=t.options.parentWorkspace;const e=t.getParentSvg(),s=t.getCachedParentSvgSize();var i=e.parentElement;if(i instanceof HTMLElement){var o=i.offsetWidth;i=i.offsetHeight,s.width!==o&&(e.setAttribute("width",o+"px"),t.setCachedParentSvgSize(o,null)),s.height!==i&&(e.setAttribute("height",i+"px"),t.setCachedParentSvgSize(null,i)),t.resize()}},Pt=function(t,e){const s=Object.create(null),i=t.getDescendants(!0);e&&(t=t.getNextBlock())&&(t=i.indexOf(t),i.splice(t,i.length-t));for(let t,e=0;t=i[e];e++)s[t.type]?s[t.type]++:s[t.type]=1;return s},Bt=function(t){return function(){this.jsonInit(t)}},Ft=function(t){tc.defineBlocksWithJsonArrayInternal(t)},Ut=function(t){Hl.defineBlocks$$module$build$src$core$common(Hl.createBlockDefinitionsFromJsonArray$$module$build$src$core$common(t))},Hl.createBlockDefinitionsFromJsonArray$$module$build$src$core$common=function(t){const e={};for(let s=0;s>>/g,t),pc="",(t=document.createElement("style")).id="blockly-common-style",e=document.createTextNode(e),t.appendChild(e),document.head.insertBefore(t,document.head.firstChild)))},Xt=function(t){return bc.getSizeInternal(t)},zt=function(t){if("none"!==Kt(t,"display"))return Yt(t);const e=t.style,s=e.display,i=e.visibility,o=e.position;e.visibility="hidden",e.position="absolute",e.display="inline";const n=t.offsetWidth;return t=t.offsetHeight,e.display=s,e.position=o,e.visibility=i,new Ec(n,t)},Yt=function(t){return new Ec(t.offsetWidth,t.offsetHeight)},Kt=function(t,e){return(t=window.getComputedStyle(t))[e]||t.getPropertyValue(e)},jt=function(t){const e=new _c(0,0);t=t.getBoundingClientRect();var s=document.documentElement;return s=new _c(window.pageXOffset||s.scrollLeft,window.pageYOffset||s.scrollTop),e.x=t.left+s.x,e.y=t.top+s.y,e},Jt=function(){const t=document.body,e=document.documentElement;return new _c(t.scrollLeft||e.scrollLeft,t.scrollTop||e.scrollTop)},qt=function(t){const e=parseFloat(Kt(t,"borderLeftWidth")),s=parseFloat(Kt(t,"borderRightWidth")),i=parseFloat(Kt(t,"borderTopWidth"));return t=parseFloat(Kt(t,"borderBottomWidth")),new mc(i,t,e,s)},Zt=function(t,e,s){t=Qt(t,e,s),e.scrollLeft=t.x,e.scrollTop=t.y},Qt=function(t,e,s){var i=jt(t),o=jt(e),n=qt(e);const r=i.x-o.x-n.left;return i=i.y-o.y-n.top,o=Yt(t),t=e.clientWidth-o.width,o=e.clientHeight-o.height,n=e.scrollLeft,e=e.scrollTop,s?(n+=r-t/2,e+=i-o/2):(n+=Math.min(r,Math.max(r-t,0)),e+=Math.min(i,Math.max(i-o,0))),new _c(n,e)},te=function(t){const e=new _c(0,0);var s=t.x&&t.getAttribute("x");const i=t.y&&t.getAttribute("y");return s&&(e.x=parseInt(s)),i&&(e.y=parseInt(i)),(s=(s=t.getAttribute("transform"))&&s.match($c))&&(e.x+=Number(s[1]),s[3]&&(e.y+=Number(s[3]))),(t=t.getAttribute("style"))&&t.includes("translate")&&(t=t.match(Ic))&&(e.x+=Number(t[1]),t[3]&&(e.y+=Number(t[3]))),e},ee=function(t){let e=0,s=0;for(;t;){const i=te(t);if(e+=i.x,s+=i.y,(" "+(t.getAttribute("class")||"")+" ").includes(" injectionDiv "))break;t=t.parentNode}return new _c(e,s)},se=function(){const t=Jt();return new mc(t.y,document.documentElement.clientHeight+t.y,t.x,document.documentElement.clientWidth+t.x)},ie=function(){const t=document.documentElement,e=window;return new _c(e.pageXOffset||t.scrollLeft,e.pageYOffset||t.scrollTop)},oe=function(t,e){var s=e.x;e=e.y;const i=t.getInjectionDiv().getBoundingClientRect();return s=new _c(s-i.left,e-i.top),e=t.getOriginOffsetInPixels(),_c.difference(s,e).scale(1/t.scale)},ne=function(t,e){var s=e.scale(t.scale);e=s.x,s=s.y;const i=t.getInjectionDiv().getBoundingClientRect();return t=t.getOriginOffsetInPixels(),new _c(e+i.left+t.x,s+i.top+t.y)},re=function(t){({document:Oc=Oc,DOMParser:kc=kc,XMLSerializer:Ac=Ac}=t),Rc=new kc,yc=new Ac},Hl.createElement$$module$build$src$core$utils$xml=function(t){return Oc.createElementNS(vc,t)},Hl.createTextNode$$module$build$src$core$utils$xml=function(t){return Oc.createTextNode(t)},Hl.textToDom$$module$build$src$core$utils$xml=function(t){let e=Rc.parseFromString(t,"text/xml");if(e&&e.documentElement&&!e.getElementsByTagName("parsererror").length)return e.documentElement;if((e=Rc.parseFromString(t,"text/html"))&&e.body.firstChild&&"xml"===e.body.firstChild.nodeName.toLowerCase())return e.body.firstChild;throw Error(`DOMParser was unable to parse: ${t}`)},le=function(t){return ae(yc.serializeToString(t))},ae=function(t){return t.replace(Nc,t=>`&#${t.charCodeAt(0)};`)},ce=function(t){return t?((t instanceof Element||"string"==typeof t)&&(t=Ee(t),t=_e(t)),he(t),t):null},he=function(t){const e=t.kind;if(t=t.contents,e&&e!==Dc&&e!==Mc)throw Error("Invalid toolbox kind "+e+". Please supply either "+Dc+" or "+Mc);if(!t)throw Error("Toolbox must have a contents attribute.")},ue=function(t){return t?t.contents?t.contents:Array.isArray(t)&&t.length>0&&!t[0].nodeType?t:Te(t):[]},de=function(t){return Fc.hasCategoriesInternal(t)},pe=function(t){if(!t)return!1;const e=t.kind;return e?e===Mc:!!t.contents.filter(t=>"CATEGORY"===t.kind.toUpperCase()).length},ge=function(t){return!(!t||!t.contents||!t.contents.filter(function(t){return"CATEGORY"===t.kind.toUpperCase()}).length)},_e=function(t){const e={contents:Te(t)};return t instanceof Node&&me(t,e),e},Te=function(t){const e=[];let s=t.childNodes;s||(s=t);for(let i,o=0;i=s[o];o++){if(!i.tagName)continue;t={};const s=i.tagName.toUpperCase();t.kind=s,"BLOCK"===s?t.blockxml=i:i.childNodes&&i.childNodes.length>0&&(t.contents=Te(i)),me(i,t),e.push(t)}return e},me=function(t,e){for(let s=0;s document.")}else t instanceof Element&&(e=t);return e},be=function(t,e,s,i,o,n){const r=n.scrollbar&&n.scrollbar.canScrollVertically();return t.horizontal===Pc.LEFT?(s=o.absoluteMetrics.left+s,r&&n.RTL&&(s+=Sc.scrollbarThickness)):(s=o.absoluteMetrics.left+o.viewMetrics.width-e.width-s,r&&!n.RTL&&(s-=Sc.scrollbarThickness)),t.vertical===xc.TOP?t=o.absoluteMetrics.top+i:(t=o.absoluteMetrics.top+o.viewMetrics.height-e.height-i,n.scrollbar&&n.scrollbar.canScrollHorizontally()&&(t-=Sc.scrollbarThickness)),new mc(t,t+e.height,s,s+e.width)},fe=function(t,e){return{horizontal:e.toolboxMetrics.position===Lc.LEFT||t.horizontalLayout&&!t.RTL?Pc.RIGHT:Pc.LEFT,vertical:e.toolboxMetrics.position===Lc.BOTTOM?xc.TOP:xc.BOTTOM}},$e=function(t,e,s,i){const o=t.left,n=t.right-t.left,r=t.bottom-t.top;for(let l=0;le.id!==t.id).map(t=>t.getRelativeToSurfaceXY());for(;Ae(_c.sum(s,i),o);)i.translate(e.RTL?-30:30,30);t.moveTo(_c.sum(s,i))},Ae=function(t,e){return e.some(e=>Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1)},ve=function(t,e){t.setAttribute(eh,e)},Ne=function(t,e,s){Array.isArray(s)&&(s=s.join(" ")),t.setAttribute(th+e,`${s}`)},we=function(t){return t&&"function"==typeof t.saveState&&"function"==typeof t.loadState},Le=function(t){return Pe(t),xe()?(Be(),Promise.resolve()):(_h||(_h=new Promise(t=>{Th=t,mh=window.requestAnimationFrame(()=>{Be(),t()})})),_h)},Me=function(){return _h||Promise.resolve()},De=function(t){t||window.cancelAnimationFrame(mh),Be(t),!t&&Th&&Th()},xe=function(){return da},Pe=function(t){ph.add(t),gh.set(t,Hl.getGroup$$module$build$src$core$events$utils());const e=t.getParent();e?Pe(e):dh.add(t)},Be=function(t){const e=t?new Set([t]):new Set([...dh].map(t=>t.workspace)),s=[...dh].filter(Ue).filter(t=>e.has(t.workspace));for(var i of s)He(i);for(const t of e)t.resizeContents();for(var o of s)i=o.getRelativeToSurfaceXY(),o.updateComponentLocations(i);for(const t of s)o=Hl.getGroup$$module$build$src$core$events$utils(),(i=gh.get(t))&&Hl.setGroup$$module$build$src$core$events$utils(i),t.bumpNeighbours(),Hl.setGroup$$module$build$src$core$events$utils(o);for(const t of s)Fe(t);t||(_h=null)},Fe=function(t){dh.delete(t),ph.delete(t),gh.delete(t);for(const e of t.getChildren(!1))Fe(e)},Ue=function(t){return!t.isDisposed()&&!t.getParent()},He=function(t){if(ph.has(t)&&t.initialized){for(const e of t.getChildren(!1))He(e);t.renderEfficiently()}},Ge=function(t,e){Sh(t,e)},Ve=function(t=Ch){Sh=t},We=function(t,e){yh(t,e)},Xe=function(t=Rh){yh=t},ze=function(t,e,s){kh(t,e,s)},Ye=function(t=Oh){kh=t},Ke=function(t,e){vh(t,e)},je=function(t=Ah){vh=t},Je=function(t){return t&&"function"==typeof t.getProcedureDef},qe=function(t){return t&&"function"==typeof t.getProcedureCall&&"function"==typeof t.renameProcedure},Ze=function(t){return void 0!==t.getVariableModel},Qe=function(t,e,s,i){t=t+" was deprecated in "+e+" and will be deleted in "+s+".",i&&(t+="\nUse "+i+" instead."),Lh.has(t)||(Lh.add(t),console.warn(t))},Hl.allUsedVarModels$$module$build$src$core$variables=function(t){t=t.getAllBlocks(!1);const e=new Set;for(let s=0;s({kind:"block",type:i,gap:8,fields:ss(t)}))),t},os=function(t){let e=[];const s=document.createElement("button");return s.setAttribute("text","%{BKY_NEW_VARIABLE}"),s.setAttribute("callbackKey","CREATE_VARIABLE"),t.registerButtonCallback("CREATE_VARIABLE",function(t){cs(t.getTargetWorkspace())}),e.push(s),t=ns(t),e.concat(t)},ns=function(t){const e=[];if((t=t.getVariableMap().getVariablesOfType("")).length>0){var s=t[t.length-1];if(oa.variables_set){var i=Hl.createElement$$module$build$src$core$utils$xml("block");i.setAttribute("type","variables_set"),i.setAttribute("gap",oa.math_change?"8":"24"),i.appendChild(Ts(s)),e.push(i)}if(oa.math_change&&((i=Hl.createElement$$module$build$src$core$utils$xml("block")).setAttribute("type","math_change"),i.setAttribute("gap",oa.variables_get?"20":"8"),i.appendChild(Ts(s)),s=Hl.textToDom$$module$build$src$core$utils$xml('1'),i.appendChild(s),e.push(i)),oa.variables_get){t.sort(bs);for(let i,o=0;i=t[o];o++)(s=Hl.createElement$$module$build$src$core$utils$xml("block")).setAttribute("type","variables_get"),s.setAttribute("gap","8"),s.appendChild(Ts(i)),e.push(s)}}return e},rs=function(t){return Ph.generateUniqueNameInternal(t)},ls=function(t){return as(xh.charAt(0),t.getVariableMap().getAllVariables().map(t=>t.getName()))},as=function(t,e){if(!e.length)return t;const s=xh;let i="",o=s.indexOf(t);for(;;){let n=!1;for(let s=0;st.getVariableModel().getName());if(i&&(s=i.some(e=>e.toLowerCase()===t),i=i.some(t=>t.toLowerCase()===e),s&&i))return o.getName()}return null},_s=function(t,e,s){t=t.toLowerCase(),e=e.toLowerCase(),s=s.getAllBlocks(!1);for(const o of s){if(!Je(o))continue;var i=(s=o.getProcedureDef())[1];const n=i.some(e=>e.toLowerCase()===t);if(i=i.some(t=>t.toLowerCase()===e),n&&i)return s[0]}return null},Ts=function(t){const e=Hl.createElement$$module$build$src$core$utils$xml("field");return e.setAttribute("name","VAR"),e.setAttribute("id",t.getId()),e.setAttribute("variabletype",t.getType()),t=Hl.createTextNode$$module$build$src$core$utils$xml(t.getName()),e.appendChild(t),e},Hl.getOrCreateVariablePackage$$module$build$src$core$variables=function(t,e,s,i){let o=Hl.getVariable$$module$build$src$core$variables(t,e,s,i);return o||(o=ms(t,e,s,i)),o},Hl.getVariable$$module$build$src$core$variables=function(t,e,s,i){const o=t.getPotentialVariableMap();let n=null;if(e&&(n=t.getVariableMap().getVariableById(e),!n&&o&&(n=o.getVariableById(e)),n))return n;if(s){if(void 0===i)throw Error("Tried to look up a variable by name without a type");n=t.getVariableMap().getVariable(s,i),!n&&o&&(n=o.getVariable(s,i))}return n},ms=function(t,e,s,i){const o=t.getVariableMap(),n=t.getPotentialVariableMap();return s||(s=rs(t.isFlyout?t.targetWorkspace:t)),n?n.createVariable(s,i,null!=e?e:void 0):o.createVariable(s,i,e)},Es=function(t,e){t=t.getVariableMap().getAllVariables();const s=[];if(e.length!==t.length)for(let i=0;i=0;t--){const e=o[t];if("procedures_defnoreturn"===e.type||"procedures_defreturn"===e.type)return s=String(e.getFieldValue("NAME")),i=Hl.Msg$$module$build$src$core$msg.CANNOT_DELETE_VARIABLE_PROCEDURE.replace("%1",i).replace("%2",s),void Ge(i);e===s&&o.splice(t,1)}s&&o.length||o.length>1?(i=Hl.Msg$$module$build$src$core$msg.DELETE_VARIABLE_CONFIRMATION.replace("%1",String(o.length+(s&&!s.workspace.isFlyout?1:0))).replace("%2",i),We(i,s=>{s&&e&&t.getVariableMap().deleteVariable(e)})):t.getVariableMap().deleteVariable(e)},$s=function(t,{addCoordinates:e=!1,addInputBlocks:s=!0,addNextBlocks:i=!0,doFullSerialization:o=!0,saveIds:n=!0}={}){if(t.isInsertionMarker())return null;const r={type:t.type,id:n?t.id:void 0};return e&&Cs(t,r),Is(t,r),Ss(t,r,o),Rs(t,r,o),ys(t,r,o),s&&Os(t,r,o,n),i&&ks(t,r,o,n),r},Is=function(t,e){t.isCollapsed()&&(e.collapsed=!0),t.isEnabled()||(e.disabledReasons=Array.from(t.getDisabledReasons())),t.isOwnDeletable()||(e.deletable=!1),t.isOwnMovable()||(e.movable=!1),t.isOwnEditable()||(e.editable=!1),void 0!==t.inputsInline&&t.inputsInline!==t.inputsInlineDefault&&(e.inline=t.inputsInline),t.data&&(e.data=t.data)},Cs=function(t,e){const s=t.workspace;t=t.getRelativeToSurfaceXY(),e.x=Math.round(s.RTL?s.getWidth()-t.x:t.x),e.y=Math.round(t.y)},Ss=function(t,e,s){t.saveExtraState?null!==(t=t.saveExtraState(s))&&(e.extraState=t):t.mutationToDom&&null!==(t=t.mutationToDom())&&(e.extraState=Uo(t).replace(' xmlns="https://developers.google.com/blockly/xml"',""))},Rs=function(t,e,s){const i=Object.create(null);for(const e of t.getIcons())we(e)&&(t=e.saveState(s))&&(i[e.getType().toString()]=t);Object.keys(i).length&&(e.icons=i)},ys=function(t,e,s){const i=Object.create(null);for(const e of t.getFields())e.isSerializable()&&(i[e.name]=e.saveState(s));Object.keys(i).length&&(e.fields=i)},Os=function(t,e,s,i){const o=Object.create(null);for(let e=0;e{t.disposed||t.setConnectionTracking(!0)},1)}return l},ws=function(t,e,{parentConnection:s,isShadow:i=!1}={}){if(!t.type)throw new Uh(t);const o=e.newBlock(t.type,t.id);return o.setShadow(i),Ms(o,t),Ds(o,t),xs(o,t),Ps(s,o,t),Bs(o,t),Fs(o,t),Us(o,t),Hs(o,t),Vs(o,e.rendered),o},Ls=function(t,e){if(st())for(t=Es(t,e),e=0;ee&&(e=s[i].length);var o=-1/0;let n,r=1;do{i=o,n=t,t=[],o=s.length/r;let l=1;for(let e=0;ei);return n},fi=function(t,e,s){const i=[0],o=[];for(var n=0;n1&&i[i.length-1]<=i[i.length-2]&&(e+=.5),e},$i=function(t,e,s){let i,o=fi(t,e,s);for(let n=0;no&&(o=l,i=r)}return i?$i(t,i,s):e},Ii=function(t,e){const s=[];for(let i=0;ivu&&xi()}else Ou!==yu&&(clearTimeout(Cu),Su=t.pageX,Ru=t.pageY,Cu=setTimeout(Gi,Nu))},Di=function(){Ou=yu=null,xi()},xi=function(){bu&&(bu=!1,Lu&&(Lu.style.display="none")),Cu&&(clearTimeout(Cu),Cu=0)},Pi=function(){xi(),fu=!0},Bi=function(){fu=!1},Fi=function(){Lu&&yu&&("function"==typeof Eu?Eu(Lu,yu):Ui())},Ui=function(){var t=Oi(yu);t=(t=Hl.wrap$$module$build$src$core$utils$string(t,$u)).split("\n");for(let e=0;es+window.scrollY&&(o-=Lu.offsetHeight+2*Au),t?i=Math.max(wu-window.scrollX,i):i+Lu.offsetWidth>e+window.scrollX-2*wu&&(i=e-Lu.offsetWidth-2*wu),{x:i,y:o}},Gi=function(){if(!fu&&(Ou=yu,Lu)){Lu.textContent="",Fi();var t=yu.RTL;Lu.style.direction=t?"rtl":"ltr",Lu.style.display="block",bu=!0;var{x:e,y:s}=Hi(t);Lu.style.left=e+"px",Lu.style.top=s+"px"}},Vi=function(){return Du},Wi=function(t){Du=t},Xi=function(){return xu},zi=function(t){xu=t},Yi=function(t){t=`${t}`.toLowerCase().trim();var e=Pu[t];if(e)return e;if(e="#"===(e="0x"===t.substring(0,2)?"#"+t.substring(2):t)[0]?e:"#"+e,/^#[0-9a-f]{6}$/.test(e))return e;if(/^#[0-9a-f]{3}$/.test(e))return["#",e[1],e[1],e[2],e[2],e[3],e[3]].join("");var s=t.match(/^(?:rgb)?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/);return s&&(t=Number(s[1]),e=Number(s[2]),s=Number(s[3]),t>=0&&t<256&&e>=0&&e<256&&s>=0&&s<256)?Ki(t,e,s):null},Ki=function(t,e,s){return e=t<<16|e<<8|s,t<16?"#"+(16777216|e).toString(16).substr(1):"#"+e.toString(16)},ji=function(t){return(t=Yi(t))?[(t=parseInt(t.substr(1),16))>>16,t>>8&255,255&t]:[0,0,0]},Ji=function(t,e,s){let i=0,o=0,n=0;if(0===e)n=o=i=s;else{const r=Math.floor(t/60),l=t/60-r;t=s*(1-e);const a=s*(1-e*l);switch(e=s*(1-e*(1-l)),r){case 1:i=a,o=s,n=t;break;case 2:i=t,o=s,n=e;break;case 3:i=t,o=a,n=s;break;case 4:i=e,o=t,n=s;break;case 5:i=s,o=t,n=a;break;case 6:case 0:i=s,o=e,n=t}}return Ki(Math.floor(i),Math.floor(o),Math.floor(n))},qi=function(t,e,s){return(t=Yi(t))&&(e=Yi(e))?(t=ji(t),e=ji(e),Ki(Math.round(e[0]+s*(t[0]-e[0])),Math.round(e[1]+s*(t[1]-e[1])),Math.round(e[2]+s*(t[2]-e[2])))):null},Zi=function(t){return Ji(t,Du,255*xu)},Qi=function(t,e,s){const i=[];var o=t.split("");o.push("");var n=0;t=[];let r=null;for(let c=0;c=t.bottom?e.top-s.height:e.bottom},mo=function(t){return!(null==t||!t.repositionForWindowResize)},Eo=function(){mo(Wu)&&Wu.repositionForWindowResize()||ao()},bo=function(){return Zu},fo=function(t){Zu=t},$o=function(t,e,s,i,o){if(lo(Qu,s,Oo,i),e.length){o||(t instanceof PointerEvent?o=new _c(t.clientX,t.clientY):(console.warn("Context menu opened with keyboard but no location given"),o=new _c(0,0)));var n=Io(e,s,t,o);td=n,Co(n,s,o),setTimeout(function(){n.focus()},1),Zu=null}else yo()},Io=function(t,e,s,i){const o=new oh;o.setRole(Zc.MENU);for(let n=0;n{setTimeout(()=>{r.callback(r.scope,s,e,i)},0)})},{})}return o},Co=function(t,e,s){const i=se();s=new mc(s.y+i.top,s.y+i.top,s.x+i.left,s.x+i.left),So(t);const o=t.getSize();e&&(s.left+=o.width,s.right+=o.width,i.left+=o.width,i.right+=o.width),go(i,s,o,e),t.focus()},So=function(t){var e=oo();if(!e)throw Error("Attempting to create a context menu when widget div is null");e=t.render(e),ct(e,"blocklyContextMenu"),T(e,"contextmenu",null,Ro),t.focus()},Ro=function(t){t.preventDefault(),t.stopPropagation()},yo=function(){let t;ho(Qu),Zu=null,null==(t=td)||t.dispose(),td=null},Oo=function(){td&&(td.dispose(),td=null)},Hl.callbackFactory$$module$build$src$core$contextmenu=function(t,e){return()=>{let s;Hl.disable$$module$build$src$core$events$utils();try{s=e instanceof Element?Xo(e,t.workspace):Ns(e,t.workspace);const i=t.getRelativeToSurfaceXY();i.x=t.RTL?i.x-Hl.config$$module$build$src$core$config.snapRadius:i.x+Hl.config$$module$build$src$core$config.snapRadius,i.y+=2*Hl.config$$module$build$src$core$config.snapRadius,s.moveBy(i.x,i.y)}finally{Hl.enable$$module$build$src$core$events$utils()}return st()&&!s.isShadow()&&J(new(rt(ua.BLOCK_CREATE))(s)),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(s),s}},ko=function(){return td},Ao=function(t,e){return(e=$(e,t.getParentSvg(),t.getInverseScreenCTM())).x/=t.scale,e.y/=t.scale,e},vo=function(t,e,s){e=Ao(t,e),cd.set(t,_c.difference(s,e))},No=function(t,e){if(e=Ao(t,e),!(t=cd.get(t)))throw Error("Drag not initialized");return _c.sum(t,e)},wo=function(t,e=!1){const s=Hl.createElement$$module$build$src$core$utils$xml("xml");var i=Mo(Hl.allUsedVarModels$$module$build$src$core$variables(t));i.hasChildNodes()&&s.appendChild(i);for(const i of t.getTopComments())s.appendChild(Lo(i,e));for(t=t.getTopBlocks(!0),i=0;i/g,"<$1$2>")},Ho=function(t){t=Uo(t).split("<");let e="";for(let s=1;s"!==i.slice(-2)&&(e+=" ")}return(t=(t=t.join("\n")).replace(/(<(\w+)\b[^>]*>[^\n]*)\n *<\/\2>/g,"$1")).replace(/^\n/,"")},Go=function(t,e){return e.setResizesEnabled(!1),e.clear(),t=Hl.domToWorkspace$$module$build$src$core$xml(t,e),e.setResizesEnabled(!0),t},Hl.domToWorkspace$$module$build$src$core$xml=function(t,e){let s=0;e.RTL&&(s=e.getWidth());const i=[];Tt();const o=Hl.getGroup$$module$build$src$core$events$utils();o||Hl.setGroup$$module$build$src$core$events$utils(!0),e.setResizesEnabled&&e.setResizesEnabled(!1);let n=!0;try{for(let o,r=0;o=t.childNodes[r];r++){const t=o.nodeName.toLowerCase(),r=o;if("block"===t||"shadow"===t&&!j()){const t=Xo(r,e);let o;i.push(t.id);const l=parseInt(null!=(o=r.getAttribute("x"))?o:"10",10);let a;const c=parseInt(null!=(a=r.getAttribute("y"))?a:"10",10);isNaN(l)||isNaN(c)||t.moveBy(e.RTL?s-l:l,c,["create"]),n=!1}else{if("shadow"===t)throw TypeError("Shadow block cannot be a top-level block.");if("comment"===t)Vo(r,e);else if("variables"===t){if(!n)throw Error("'variables' tag must exist once before block and shadow tag elements in the workspace XML, but it was found in another location.");zo(r,e),n=!1}}}}finally{Hl.setGroup$$module$build$src$core$events$utils(o),e.setResizesEnabled&&e.setResizesEnabled(!0),e.rendered&&De(),mt()}return J(new(rt(ua.FINISHED_LOADING))(e)),i},Vo=function(t,e){var s;const i=null!=(s=t.getAttribute("id"))?s:void 0;var o,n;let r;var l;let a;return(s=e.rendered?new fd(e,i):new bd(e,i)).setText(null!=(o=t.textContent)?o:""),o=parseInt(null!=(n=t.getAttribute("x"))?n:"",10),n=parseInt(null!=(r=t.getAttribute("y"))?r:"",10),isNaN(o)||isNaN(n)||(o=e.RTL?e.getWidth()-o:o,s.moveTo(new _c(o,n))),e=parseInt(null!=(l=t.getAttribute("w"))?l:"",10),l=parseInt(null!=(a=t.getAttribute("h"))?a:"",10),isNaN(e)||isNaN(l)||s.setSize(new Ec(e,l)),"true"===t.getAttribute("collapsed")&&s.setCollapsed(!0),"false"===t.getAttribute("editable")&&s.setEditable(!1),"false"===t.getAttribute("movable")&&s.setMovable(!1),"false"===t.getAttribute("deletable")&&s.setDeletable(!1),s},Wo=function(t,e){if(!e.getBlocksBoundingBox)return Hl.domToWorkspace$$module$build$src$core$xml(t,e);var s=e.getBlocksBoundingBox();if(t=Hl.domToWorkspace$$module$build$src$core$xml(t,e),s&&s.top!==s.bottom){var i=s.bottom;s=e.RTL?s.right:s.left;var o=1/0;let n=-1/0,r=1/0;for(let s=0;sn&&(n=i.x)}for(i=i-r+10,s=e.RTL?s-n:s-o,o=0;o=0;t--)s[t].initSvg();for(let t=s.length-1;t>=0;t--)s[t].queueRender();setTimeout(function(){t.disposed||t.setConnectionTracking(!0)},1),e.resizeContents()}else{const t=i.getDescendants(!1);for(let e=t.length-1;e>=0;e--)t[e].initModel()}}finally{Hl.enable$$module$build$src$core$events$utils()}if(st()){for(t=Es(e,s),e=0;e{isNaN(d)||isNaN(p)||(d=e.workspace.RTL?e.workspace.getWidth()-(d+l):d,g.setBubbleLocation(new _c(d,p))),g.setBubbleVisible(n)},1)}},Jo=function(t,e){for(let s=0;s100)){var e=t.workspace,s=t.getSvgRoot();e.getAudioManager().play("delete");var i,o=t.getRelativeToSurfaceXY(),n=s.cloneNode(!0);n.setAttribute("transform","translate("+o.x+","+o.y+")"),null==(i=e.getLayerManager())||i.appendToAnimationLayer({getSvgRoot:()=>n}),Bn(n,{x:o.x,y:o.y,width:t.width,height:t.height},e.RTL,new Date)}},Bn=function(t,e,s,i){const o=((new Date).getTime()-i.getTime())/150;o>1?pt(t):(t.setAttribute("transform","translate("+(e.x+(s?-1:1)*e.width/2*o)+","+(e.y+e.height/2*o)+") scale("+(1-o)+")"),setTimeout(Bn,10,t,e,s,i))},Fn=function(t){var e=t.workspace;const s=e.scale;if(e.getAudioManager().play("click"),!(s<1)){var i=e.getSvgXY(t.getSvgRoot());t.outputConnection?(i.x+=(t.RTL?3:-3)*s,i.y+=13*s):t.previousConnection&&(i.x+=(t.RTL?-23:23)*s,i.y+=3*s);var o=at(Tc.CIRCLE,{cx:i.x,cy:i.y,r:0,fill:"none",stroke:"#888","stroke-width":10},e.getParentSvg());t=at(Tc.ANIMATE,{id:"animationCircle",begin:"indefinite",attributeName:"r",dur:"150ms",from:0,to:25*s},o),e=at(Tc.ANIMATE,{id:"animationOpacity",begin:"indefinite",attributeName:"opacity",dur:"150ms",from:1,to:0},o),t.beginElement(),e.beginElement(),setTimeout(()=>{pt(o)},150)}},Un=function(t){if(Gn(),t.workspace.getAudioManager().play("disconnect"),!(t.workspace.scale<1)){var e=t.getHeightWidth().height;e=Math.atan(10/e)/Math.PI*180,t.RTL||(e*=-1),hp=t,Hn(t,e,new Date,0)}},Hn=function(t,e,s,i){const o=[.66,1,.66,0,-.66,-1,-.66,0];let n="";s.getTime()+200>(new Date).getTime()&&(n=`skewX(${Math.round(o[i%o.length]*e)})`,cp=setTimeout(Hn,15,t,e,s,i+1)),t.getSvgRoot().setAttribute("transform",`${t.getTranslation()} ${n}`)},Gn=function(){hp&&(cp&&(clearTimeout(cp),cp=null),hp.getSvgRoot().setAttribute("transform",hp.getTranslation()),hp=null)},Vn=function(t,e){t.workspace.RTL&&(e.x=t.workspace.getWidth()-e.x);const s=t.workspace,i=Hl.config$$module$build$src$core$config.snapRadius,o=_c.difference(e,t.getRelativeToSurfaceXY()),n=new _c(0,0),r=s.getAllBlocks(!1).filter(e=>e.id!=t.id).map(t=>t.getRelativeToSurfaceXY());for(;Wn(_c.sum(e,n),r)||Xn(t,_c.sum(o,n),i);)s.RTL?n.translate(-i,2*i):n.translate(i,2*i);t.moveTo(_c.sum(e,n))},Wn=function(t,e){return e.some(e=>Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1)},Xn=function(t,e,s){return t.getConnections_(!1).some(t=>!!t.closest(s,e).connection)},zn=function(t,e,s){const i=s.getBoundingRectangle(),o=i.right-i.left,n=Ys(e.top,i.top,e.top+e.height-(i.bottom-i.top))-i.top;let r=e.left;return e=e.left+e.width-o,t.RTL?r=Math.min(e,r):e=Math.max(r,e),!(!(t=Ys(r,i.left,e)-i.left)&&!n||(s.moveBy(t,n,["inbounds"]),0))},Yn=function(t){return e=>{var s,i=t.getMetricsManager();if(i.hasFixedEdges()&&!t.isDragging())if(Ca.includes(null!=(s=e.type)?s:"")){s=i.getScrollMetrics(!0);const o=Kn(t,e);o&&(i=Hl.getGroup$$module$build$src$core$events$utils()||!1,Hl.setGroup$$module$build$src$core$events$utils(e.group),zn(t,s,o)&&!e.group&&console.warn("Moved object in bounds but there was no event group. This may break undo."),Hl.setGroup$$module$build$src$core$events$utils(i))}else U(e)&&e.scale&&e.oldScale&&e.scale>e.oldScale&&jn(t)}},Kn=function(t,e){let s=null;switch(e.type){case ua.BLOCK_CREATE:case ua.BLOCK_MOVE:(s=t.getBlockById(e.blockId))&&(s=s.getRootBlock());break;case ua.COMMENT_CREATE:case ua.COMMENT_MOVE:case ua.COMMENT_RESIZE:s=t.getCommentById(e.commentId)}return s},jn=function(t){var e=t.getMetricsManager();if(e.hasFixedEdges()&&!t.isDragging()){e=e.getScrollMetrics(!0);var s=t.getTopBoundedElements();for(let i,o=0;i=s[o];o++)zn(t,e,i)}},Jn=function(t){return t&&"function"==typeof t.isDeletable&&"function"==typeof t.dispose&&"function"==typeof t.setDeleteStyle},qn=function(t,e){const s=t.getIcons();for(const i of t.inputList){if(!i.isVisible())continue;let o;if(s.push(...i.fieldRow),null!=(o=i.connection)&&o.targetBlock())if(t=i.connection.targetBlock(),i.connection.type!==Vd.NEXT_STATEMENT||e)s.push(t);else{let e;(t=null==(e=t.lastConnectionInStack(!1))?void 0:e.getSourceBlock())&&s.push(t)}else{let t;(null==(t=i.connection)?void 0:t.type)===Vd.INPUT_VALUE&&s.push(i.connection)}}return s},Zn=function(t,e){const s=t.workspace.getTopBoundedElements(!0).filter(t=>It(t));let i=null;if((t=s.indexOf(t instanceof Ep?t.getRootBlock():t)+e)>=0&&t=s.length&&(i=s[0]),e<0&&i instanceof Ep){let t,e;return null!=(e=null==(t=i.lastConnectionInStack(!1))?void 0:t.getSourceBlock())?e:i}return i},Qn=function(t,e){var s;let i;const o=t instanceof Ep?null!=(i=null==(s=t.outputConnection)?void 0:s.targetBlock())?i:t.getSurroundParent():t.getSourceBlock();return o instanceof Ep?-1===(t=(s=qn(o,e>0)).indexOf(t))?null:(e=t+e)>=0&&e!t.getReturnTypes()).map(t=>[t.getName(),t.getParameters().map(t=>t.getName()),!1]);t.getBlocksByType("procedures_defnoreturn",!1).forEach(t=>{!nr(t)&&Je(t)&&e.push(t.getProcedureDef())});const s=t.getProcedureMap().getProcedures().filter(t=>!!t.getReturnTypes()).map(t=>[t.getName(),t.getParameters().map(t=>t.getName()),!0]);return t.getBlocksByType("procedures_defreturn",!1).forEach(t=>{!nr(t)&&Je(t)&&s.push(t.getProcedureDef())}),e.sort(ar),s.sort(ar),[e,s]},ar=function(t,e){return t[0].localeCompare(e[0],void 0,{sensitivity:"base"})},Hl.findLegalName$$module$build$src$core$procedures=function(t,e){if(e.isInFlyout)return t;for(t=t||Hl.Msg$$module$build$src$core$msg.UNNAMED_KEY||"unnamed";!cr(t,e.workspace,e);){const e=t.match(/^(.*?)(\d+)$/);t=e?e[1]+(parseInt(e[2])+1):t+"2"}return t},cr=function(t,e,s){return!hr(t,e,s)},hr=function(t,e,s){for(const i of e.getAllBlocks(!1))if(i!==s&&Je(i)&&Hl.Names$$module$build$src$core$names.equals(i.getProcedureDef()[0],t))return!0;s=s&&nr(s)?null==s?void 0:s.getProcedureModel():void 0;for(const i of e.getProcedureMap().getProcedures())if(i!==s&&Hl.Names$$module$build$src$core$names.equals(i.getName(),t))return!0;return!1},Hl.rename$$module$build$src$core$procedures=function(t){var e=this.getSourceBlock();if(!e)throw new Hu;t=t.trim();const s=Hl.findLegalName$$module$build$src$core$procedures(t,e);nr(e)&&!e.isInsertionMarker()&&e.getProcedureModel().setName(s);const i=this.getValue();if(i!==t&&i!==s)for(t=e.workspace.getAllBlocks(!1),e=0;eEr(e,t)||qe(e)&&Hl.Names$$module$build$src$core$names.equals(e.getProcedureCall(),t))},Er=function(t,e){return nr(t)&&!t.isProcedureDef()&&t.getProcedureModel()&&Hl.Names$$module$build$src$core$names.equals(t.getProcedureModel().getName(),e)},Hl.mutateCallers$$module$build$src$core$procedures=function(t){const e=j();var s=t.getProcedureDef()[0];const i=t.mutationToDom(!0);t=mr(s,t.workspace);for(let n,r=0;n=t[r];r++){s=(s=n.mutationToDom())&&le(s),n.domToMutation&&n.domToMutation(i);var o=n.mutationToDom();s!==(o=o&&le(o))&&(Hl.setRecordUndo$$module$build$src$core$events$utils(!1),J(new(rt(ua.BLOCK_CHANGE))(n,"mutation",null,s,o)),Hl.setRecordUndo$$module$build$src$core$events$utils(e))}},Hl.getDefinition$$module$build$src$core$procedures=function(t,e){for(const s of e.getAllBlocks(!1))if(nr(s)&&s.isProcedureDef()&&Hl.Names$$module$build$src$core$names.equals(s.getProcedureModel().getName(),t)||Je(s)&&Hl.Names$$module$build$src$core$names.equals(s.getProcedureDef()[0],t))return s;return null},br=function(t){return t.isDynamic},fr=function(t){return void 0!==t.pathDown&&void 0!==t.pathUp},$r=function(t){return void 0!==t.pathLeft&&void 0!==t.pathRight},Ir=function(e,s){t(zl.RENDERER,e,s)},Cr=function(t){i(zl.RENDERER,t)},Sr=function(t,e,s){return(t=new(r(zl.RENDERER,t))(t)).init(e,s),t},Rr=function(t){cs(t.getTargetWorkspace(),void 0,"String")},yr=function(t){cs(t.getTargetWorkspace(),void 0,"Number")},Or=function(t){cs(t.getTargetWorkspace(),void 0,"Colour")},kr=function(t){return Ar(t,!1)},Ar=function(t,e=!0){return oa.variables_set_dynamic||oa.variables_get_dynamic||console.warn("There are no dynamic variable blocks, but there is a dynamic variable category."),e?(Qe("The XML return value of Blockly.VariablesDynamic.flyoutCategory()","v12","v13","the same method, but handle a return type of FlyoutItemInfo[] (JSON) instead."),vr(t)):(t.registerButtonCallback("CREATE_VARIABLE_STRING",Rr),t.registerButtonCallback("CREATE_VARIABLE_NUMBER",yr),t.registerButtonCallback("CREATE_VARIABLE_COLOUR",Or),[{kind:"button",text:Hl.Msg$$module$build$src$core$msg.NEW_STRING_VARIABLE,callbackkey:"CREATE_VARIABLE_STRING"},{kind:"button",text:Hl.Msg$$module$build$src$core$msg.NEW_NUMBER_VARIABLE,callbackkey:"CREATE_VARIABLE_NUMBER"},{kind:"button",text:Hl.Msg$$module$build$src$core$msg.NEW_COLOUR_VARIABLE,callbackkey:"CREATE_VARIABLE_COLOUR"},...is(t,t.getVariableMap().getAllVariables(),!1,"variables_get_dynamic","variables_set_dynamic")])},vr=function(t){let e=[],s=document.createElement("button");return s.setAttribute("text",Hl.Msg$$module$build$src$core$msg.NEW_STRING_VARIABLE),s.setAttribute("callbackKey","CREATE_VARIABLE_STRING"),e.push(s),s=document.createElement("button"),s.setAttribute("text",Hl.Msg$$module$build$src$core$msg.NEW_NUMBER_VARIABLE),s.setAttribute("callbackKey","CREATE_VARIABLE_NUMBER"),e.push(s),s=document.createElement("button"),s.setAttribute("text",Hl.Msg$$module$build$src$core$msg.NEW_COLOUR_VARIABLE),s.setAttribute("callbackKey","CREATE_VARIABLE_COLOUR"),e.push(s),t.registerButtonCallback("CREATE_VARIABLE_STRING",Rr),t.registerButtonCallback("CREATE_VARIABLE_NUMBER",yr),t.registerButtonCallback("CREATE_VARIABLE_COLOUR",Or),t=Nr(t),e.concat(t)},Nr=function(t){const e=[];if((t=t.getVariableMap().getAllVariables()).length>0){if(oa.variables_set_dynamic){var s=t[t.length-1];const i=Hl.createElement$$module$build$src$core$utils$xml("block");i.setAttribute("type","variables_set_dynamic"),i.setAttribute("gap","24"),i.appendChild(Ts(s)),e.push(i)}if(oa.variables_get_dynamic){t.sort(bs);for(let i,o=0;i=t[o];o++)(s=Hl.createElement$$module$build$src$core$utils$xml("block")).setAttribute("type","variables_get_dynamic"),s.setAttribute("gap","8"),s.appendChild(Ts(i)),e.push(s)}}return e},wr=function(t){t.resizeContents()},Lr=function(t,e){const s=t.toCopyData();return d_=s,p_=Ct(t)&&t.workspace instanceof Gg?t.workspace:null,g_=e,s},Mr=function(){return d_},Dr=function(t){d_=t},xr=function(){return p_},Pr=function(t){p_=t},Br=function(){return g_},Fr=function(t){g_=t},Ur=function(t,e,s){return t&&e?Hr(t,e,s):d_&&p_?Hr(d_,p_,g_):null},Hr=function(t,e,s){let i,o,n;return e=e.isMutator?e:null!=(i=e.options.parentWorkspace)?i:e,null!=(n=null==(o=l(zl.PASTER,t.paster,!1))?void 0:o.paste(t,e,s))?n:null},Gr=function(t){return t&&"function"==typeof t.toCopyData},Vr=function(){ja.registry.register({name:T_.ESCAPE,preconditionFn:t=>!t.isReadOnly(),callback:t=>(t.hideChaff(),!0),keyCodes:[Fd.ESC]})},Wr=function(){ja.registry.register({name:T_.DELETE,preconditionFn:(t,e)=>(e=e.focusedNode,!t.isReadOnly()&&null!=e&&Jn(e)&&e.isDeletable()&&!t.isDragging()&&!Hl.getFocusManager$$module$build$src$core$focus_manager().ephemeralFocusTaken()),callback:(t,e,s,i)=>(e.preventDefault(),(t=i.focusedNode)instanceof Ep?t.checkAndDelete():Jn(t)&&t.isDeletable()&&(Hl.setGroup$$module$build$src$core$events$utils(!0),t.dispose(),Hl.setGroup$$module$build$src$core$events$utils(!1)),!0),keyCodes:[Fd.DELETE,Fd.BACKSPACE]})},Xr=function(t){return!!(Gr(t)&&Jn(t)&&ir(t))&&(t.isCopyable?t.isCopyable():t instanceof Ep||t instanceof fd?t.isOwnDeletable()&&t.isOwnMovable():t.isDeletable()&&t.isMovable())},zr=function(t){return Xr(t)&&Jn(t)&&t.isDeletable()},Yr=function(){const t=ja.registry.createSerializedKey(Fd.C,[Fd.CTRL_CMD]);ja.registry.register({name:T_.COPY,preconditionFn:(t,e)=>(e=e.focusedNode,t=t.isFlyout?t.targetWorkspace:t,!!e&&!!t&&!t.isDragging()&&!Hl.getFocusManager$$module$build$src$core$focus_manager().ephemeralFocusTaken()&&Xr(e)),callback:(t,e,s,i)=>(e.preventDefault(),!!((e=i.focusedNode)&&Gr(e)&&Xr(e))&&!!(t=t.isFlyout?t.targetWorkspace:t)&&(e.workspace.isFlyout||t.hideChaff(),t=ir(e)&&e.workspace==t?e.getRelativeToSurfaceXY():void 0,!!Lr(e,t))),keyCodes:[t]})},Kr=function(){const t=ja.registry.createSerializedKey(Fd.X,[Fd.CTRL_CMD]);ja.registry.register({name:T_.CUT,preconditionFn:(t,e)=>!!(e=e.focusedNode)&&!t.isReadOnly()&&!t.isDragging()&&!Hl.getFocusManager$$module$build$src$core$focus_manager().ephemeralFocusTaken()&&zr(e),callback:(t,e,s,i)=>!!((t=i.focusedNode)&&zr(t)&&Gr(t))&&(e=ir(t)?t.getRelativeToSurfaceXY():void 0,e=Lr(t,e),t instanceof Ep?t.checkAndDelete():Jn(t)&&t.dispose(),!!e),keyCodes:[t]})},jr=function(){const t=ja.registry.createSerializedKey(Fd.V,[Fd.CTRL_CMD]);ja.registry.register({name:T_.PASTE,preconditionFn(){var t=xr();return!(!t||!t.rendered||(t=t.isFlyout?t.targetWorkspace:t,!Mr()||!t||t.isReadOnly()||t.isDragging()||Hl.getFocusManager$$module$build$src$core$focus_manager().ephemeralFocusTaken()))},callback(t,e){if(!(t=Mr()))return!1;var s=xr();if(!s)return!1;if(!(s=s.isFlyout?s.targetWorkspace:s)||s.isReadOnly())return!1;if(e instanceof PointerEvent)return e=oe(s,new _c(e.clientX,e.clientY)),!!Ur(t,s,e);if(!(e=Br()))return!!Ur(t,s);const{left:i,top:o,width:n,height:r}=s.getMetricsManager().getViewMetrics(!0);return new mc(o,o+r,i,i+n).contains(e.x,e.y)?!!Ur(t,s):(e=new _c(i+n/2,o+r/2),!!Ur(t,s,e))},keyCodes:[t]})},Jr=function(){const t=ja.registry.createSerializedKey(Fd.Z,[Fd.CTRL_CMD]);ja.registry.register({name:T_.UNDO,preconditionFn:t=>!t.isReadOnly()&&!t.isDragging()&&!Hl.getFocusManager$$module$build$src$core$focus_manager().ephemeralFocusTaken(),callback:(t,e)=>(t.hideChaff(),t.undo(!1),e.preventDefault(),!0),keyCodes:[t]})},qr=function(){const t=ja.registry.createSerializedKey(Fd.Z,[Fd.CTRL_CMD,Fd.SHIFT]),e=ja.registry.createSerializedKey(Fd.Y,[Fd.CTRL]);ja.registry.register({name:T_.REDO,preconditionFn:t=>!t.isDragging()&&!t.isReadOnly()&&!Hl.getFocusManager$$module$build$src$core$focus_manager().ephemeralFocusTaken(),callback:(t,e)=>(t.hideChaff(),t.undo(!0),e.preventDefault(),!0),keyCodes:[t,e]})},Zr=function(){const t=ja.registry.createSerializedKey(Fd.ENTER,[Fd.CTRL_CMD]);ja.registry.register({name:T_.MENU,preconditionFn:t=>!t.isDragging(),callback:(t,e)=>{if(t=Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode(),sr(t)){let s;return t.showContextMenu(e),null==(s=ko())||s.highlightNext(),!0}return!1},keyCodes:[t]})},Qr=function(){Vr(),Wr(),Yr(),Kr(),jr(),Jr(),qr(),Zr()},tl=function(t){const e=t.saveState();return t.getParameters().length?(e.parameters=t.getParameters().map(t=>t.saveState()),e):e},el=function(t,e,s,i){if(t=t.loadState(s,i),!s.parameters)return t;for(const[o,n]of s.parameters.entries())t.insertParameter(e.loadState(n,i),o);return t},sl=function(t){const e=Object.create(null),s=a(zl.SERIALIZER,!0);for(const i in s){let o;const n=null==(o=s[i])?void 0:o.save(t);n&&(e[i]=n)}return e},il=function(t,e,{recordUndo:s=!1}={}){var i=a(zl.SERIALIZER,!0);if(i){i=Object.entries(i).sort((t,e)=>e[1].priority-t[1].priority);var o=j();Hl.setRecordUndo$$module$build$src$core$events$utils(s),(s=Hl.getGroup$$module$build$src$core$events$utils())||Hl.setGroup$$module$build$src$core$events$utils(!0),Tt(),e instanceof Gg&&e.setResizesEnabled(!1);for(const[,t]of i.reverse()){let s;null==(s=t)||s.clear(e)}for(const[s,o]of i.reverse())if(t[s]){let i;null==(i=o)||i.load(t[s],e)}e instanceof Gg&&e.setResizesEnabled(!0),mt(),J(new(rt(ua.FINISHED_LOADING))(e)),Hl.setGroup$$module$build$src$core$events$utils(s),Hl.setRecordUndo$$module$build$src$core$events$utils(o)}},ol=function(t,e){let s=null;var i;if(s="string"==typeof t?document.getElementById(t)||document.querySelector(t):t,!document.contains(s)&&document!==(null==(i=s)?void 0:i.ownerDocument))throw Error("Error: container is not in current document");t=new wd(e||{}),i=document.createElement("div"),ct(i,"injectionDiv"),null!=e&&e.rtl&&ct(i,"blocklyRTL"),s.appendChild(i),e=nl(i,t);const o=rl(i,e,t);return ll(o),vt(o),xt(o),i.addEventListener("focusin",function(){vt(o)}),T(i,"keydown",null,Ht),o},nl=function(t,e){t.setAttribute("dir","LTR"),Wt(e.hasCss,e.pathToMedia);const s=at(Tc.SVG,{xmlns:Pa,"xmlns:html":Ba,"xmlns:xlink":Fa,version:"1.1",class:"blocklySvg"},t),i=at(Tc.DEFS,{},s),o=String(Math.random()).substring(2);return e.gridPattern=Zp.createDom(o,e.gridOptions,i,t),s},rl=function(t,e,s){s.parentWorkspace=null;const i=(s=new Gg(s)).options;s.scale=i.zoomOptions.startScale,e.appendChild(s.createDom("blocklyMainBackground",t));var o=s.getRenderer().getClassName();return o&&ct(t,o),(o=s.getTheme().getClassName())&&ct(t,o),!i.hasCategories&&i.languageTree&&(t=s.addFlyout(Tc.SVG),gt(t,e)),i.hasTrashcan&&s.addTrashcan(),i.zoomOptions&&i.zoomOptions.controls&&s.addZoomControls(),s.getThemeManager().subscribe(e,"workspaceBackgroundColour","background-color"),s.translate(0,0),s.addChangeListener(Yn(s)),xt(s),ro(),Ks(),Ai(),s},ll=function(t){const e=t.options;var s=t.getParentSvg();if(T(s.parentNode,"contextmenu",null,function(t){b(t)||t.preventDefault()}),s=T(window,"resize",null,function(){xi(),t.hideComponents(!0),_i(),Eo(),xt(t),jn(t)}),t.setResizeHandlerWrapper(s),al(),e.languageTree){s=t.getToolbox();const i=t.getFlyout(!0);s?s.init():i&&(i.init(t),i.show(e.languageTree),"function"==typeof i.scrollToStart&&i.scrollToStart())}e.hasTrashcan&&t.trashcan.init(),e.zoomOptions&&e.zoomOptions.controls&&t.zoomControls_.init(),e.moveOptions&&e.moveOptions.scrollbars?(t.scrollbar=new Vp(t,!0===e.moveOptions.scrollbars||!!e.moveOptions.scrollbars.horizontal,!0===e.moveOptions.scrollbars||!!e.moveOptions.scrollbars.vertical,"blocklyMainWorkspaceScrollbar"),t.scrollbar.resize()):t.setMetrics({x:.5,y:.5}),e.hasSounds&&cl(e.pathToMedia,t)},al=function(){F_||(T(document,"scroll",null,function(){const t=yt();for(let e,s=0;e=t[s];s++)e instanceof Gg&&e.updateInverseScreenCTM()}),m(document,"touchend",null,u),m(document,"touchcancel",null,u)),F_=!0},cl=function(t,e){(e=e.getAudioManager()).load([`${t}click.mp3`],"click"),e.load([`${t}disconnect.mp3`],"disconnect"),e.load([`${t}delete.mp3`],"delete")},hl=function(t){if(!t||!t.isSimpleReporter())return!1;let e;return null==(e=t.getFields().next().value)?void 0:e.isFullBlockField()},ul=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.UNDO,preconditionFn:t=>t.workspace.getUndoStack().length>0?"enabled":"disabled",callback(t){t.workspace.undo(!1)},scopeType:sd.ScopeType.WORKSPACE,id:"undoWorkspace",weight:1})},dl=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.REDO,preconditionFn:t=>t.workspace.getRedoStack().length>0?"enabled":"disabled",callback(t){t.workspace.undo(!0)},scopeType:sd.ScopeType.WORKSPACE,id:"redoWorkspace",weight:2})},pl=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.CLEAN_UP,preconditionFn:t=>t.workspace.isMovable()?t.workspace.getTopBlocks(!1).length>1?"enabled":"disabled":"hidden",callback(t){t.workspace.cleanUp()},scopeType:sd.ScopeType.WORKSPACE,id:"cleanWorkspace",weight:3})},gl=function(t,e){function s(e){o--,e.setCollapsed(t),0===o&&Hl.setGroup$$module$build$src$core$events$utils(!1)}let i=0,o=0;Hl.setGroup$$module$build$src$core$events$utils(!0);for(let t=0;tHl.Msg$$module$build$src$core$msg.COLLAPSE_ALL,preconditionFn(t){if(t.workspace.options.collapse){t=t.workspace.getTopBlocks(!1);for(let e=0;eHl.Msg$$module$build$src$core$msg.EXPAND_ALL,preconditionFn(t){if(t.workspace.options.collapse){t=t.workspace.getTopBlocks(!1);for(let e=0;et.workspace?1===(t=El(t.workspace).length)?Hl.Msg$$module$build$src$core$msg.DELETE_BLOCK:Hl.Msg$$module$build$src$core$msg.DELETE_X_BLOCKS.replace("%1",`${t}`):"",preconditionFn:t=>t.workspace&&El(t.workspace).length>0?"enabled":"disabled",callback(t){if(t.workspace){t.workspace.cancelCurrentGesture();var e=El(t.workspace);e.length<2?bl(e):We(Hl.Msg$$module$build$src$core$msg.DELETE_ALL_BLOCKS.replace("%1",String(e.length)),function(t){t&&bl(e)})}},scopeType:sd.ScopeType.WORKSPACE,id:"workspaceDelete",weight:6})},$l=function(){ul(),dl(),pl(),_l(),Tl(),fl()},Il=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.DUPLICATE_BLOCK,preconditionFn:t=>!(t=t.block).isInFlyout&&t.isDeletable()&&t.isMovable()?t.isDuplicatable()?"enabled":"disabled":"hidden",callback(t){if(t.block){var e=t.block.toCopyData();e&&Ur(e,t.block.workspace)}},scopeType:sd.ScopeType.BLOCK,id:"blockDuplicate",weight:1})},Cl=function(){sd.registry.register({displayText:t=>t.block.hasIcon(Pp.TYPE)?Hl.Msg$$module$build$src$core$msg.REMOVE_COMMENT:Hl.Msg$$module$build$src$core$msg.ADD_COMMENT,preconditionFn:t=>!(t=t.block)||t.isInFlyout||!t.workspace.options.comments||t.isCollapsed()||!t.isEditable()||!t.hasIcon(Pp.TYPE)&&hl(t)?"hidden":"enabled",callback(t){(t=t.block)&&t.hasIcon(Pp.TYPE)?t.setCommentText(null):t.setCommentText("")},scopeType:sd.ScopeType.BLOCK,id:"blockComment",weight:2})},Sl=function(){sd.registry.register({displayText:t=>t.block.getInputsInline()?Hl.Msg$$module$build$src$core$msg.EXTERNAL_INPUTS:Hl.Msg$$module$build$src$core$msg.INLINE_INPUTS,preconditionFn(t){if(!(t=t.block).isInFlyout&&t.isMovable()&&!t.isCollapsed())for(let e=1;et.block.isCollapsed()?Hl.Msg$$module$build$src$core$msg.EXPAND_BLOCK:Hl.Msg$$module$build$src$core$msg.COLLAPSE_BLOCK,preconditionFn:t=>!(t=t.block).isInFlyout&&t.isMovable()&&t.workspace.options.collapse?"enabled":"hidden",callback(t){t.block.setCollapsed(!t.block.isCollapsed())},scopeType:sd.ScopeType.BLOCK,id:"blockCollapseExpand",weight:4})},yl=function(){sd.registry.register({displayText:t=>t.block.hasDisabledReason(ah)?Hl.Msg$$module$build$src$core$msg.ENABLE_BLOCK:Hl.Msg$$module$build$src$core$msg.DISABLE_BLOCK,preconditionFn(t){if(!(t=t.block).isInFlyout&&t.workspace.options.disable&&t.isEditable()){var e=t.getDisabledReasons();return e=e.size>(e.has(ah)?1:0),t.getInheritedDisabled()||e?"disabled":"enabled"}return"hidden"},callback(t){t=t.block;const e=Hl.getGroup$$module$build$src$core$events$utils();e||Hl.setGroup$$module$build$src$core$events$utils(!0),t.setDisabledReason(!t.hasDisabledReason(ah),ah),Hl.setGroup$$module$build$src$core$events$utils(e)},scopeType:sd.ScopeType.BLOCK,id:"blockDisable",weight:5})},Ol=function(){sd.registry.register({displayText(t){var e=t.block;return t=e.getDescendants(!1).length,(e=e.getNextBlock())&&(t-=e.getDescendants(!1).length),1===t?Hl.Msg$$module$build$src$core$msg.DELETE_BLOCK:Hl.Msg$$module$build$src$core$msg.DELETE_X_BLOCKS.replace("%1",`${t}`)},preconditionFn:t=>!t.block.isInFlyout&&t.block.isDeletable()?"enabled":"hidden",callback(t){t.block&&t.block.checkAndDelete()},scopeType:sd.ScopeType.BLOCK,id:"blockDelete",weight:6})},kl=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.HELP,preconditionFn:t=>("function"==typeof(t=t.block).helpUrl?t.helpUrl():t.helpUrl)?"enabled":"hidden",callback(t){t.block.showHelp()},scopeType:sd.ScopeType.BLOCK,id:"blockHelp",weight:7})},Al=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.REMOVE_COMMENT,preconditionFn(t){let e;return null!=(e=t.comment)&&e.isDeletable()?"enabled":"hidden"},callback(t){let e;Hl.setGroup$$module$build$src$core$events$utils(!0),null==(e=t.comment)||e.dispose(),Hl.setGroup$$module$build$src$core$events$utils(!1)},scopeType:sd.ScopeType.COMMENT,id:"commentDelete",weight:6})},vl=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.DUPLICATE_COMMENT,preconditionFn(t){let e;return null!=(e=t.comment)&&e.isMovable()?"enabled":"hidden"},callback(t){if(t.comment){var e=t.comment.toCopyData();e&&Ur(e,t.comment.workspace)}},scopeType:sd.ScopeType.COMMENT,id:"commentDuplicate",weight:1})},Nl=function(){sd.registry.register({displayText:()=>Hl.Msg$$module$build$src$core$msg.ADD_COMMENT,preconditionFn:t=>{let e;return null!=(e=t.workspace)&&e.isMutator?"hidden":"enabled"},callback:(t,e,s,i)=>{(t=t.workspace)&&(Hl.setGroup$$module$build$src$core$events$utils(!0),(e=new fd(t)).moveTo(oe(t,new _c(i.x,i.y))),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(e),Hl.setGroup$$module$build$src$core$events$utils(!1))},scopeType:sd.ScopeType.WORKSPACE,id:"commentCreate",weight:8})},wl=function(){Il(),Cl(),Sl(),Rl(),yl(),Ol(),kl()},Ll=function(){vl(),Al(),Nl()},Ml=function(){$l(),wl()},Dl=function(t){return t&&"function"==typeof t.paste},xl=function(t){return t&&"function"==typeof t.getSvgRoot},Pl=function(t){return t.isSelectable()},Bl=function(t){At().hideChaff(t)},(Fl=Fl||{}).scope={},Fl.ASSUME_ES5=!1,Fl.ASSUME_ES6=!1,Fl.ASSUME_ES2020=!1,Fl.ASSUME_NO_NATIVE_MAP=!1,Fl.ASSUME_NO_NATIVE_SET=!1,Fl.ISOLATE_POLYFILLS=!1,Fl.FORCE_POLYFILL_PROMISE=!1,Fl.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION=!1,Fl.INSTRUMENT_ASYNC_CONTEXT=!0,Fl.objectCreate=Fl.ASSUME_ES5||"function"==typeof Object.create?Object.create:function(t){var e=function(){};return e.prototype=t,new e},Fl.defineProperty=Fl.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(t,e,s){return t==Array.prototype||t==Object.prototype||(t[e]=s.value),t},Fl.getGlobal=function(t){t=["object"==typeof globalThis&&globalThis,t,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof s.g&&s.g];for(var e=0;e>>0,Fl.propertyToPolyfillSymbol[o]=Fl.IS_SYMBOL_NATIVE?Fl.global.Symbol(o):Fl.POLYFILL_PREFIX+s+"$"+o),Fl.defineProperty(i,Fl.propertyToPolyfillSymbol[o],{configurable:!0,writable:!0,value:e})))},Fl.getConstructImplementation=function(){if(Fl.TRUST_ES6_POLYFILLS&&"undefined"!=typeof Reflect&&Reflect.construct){if(function(){function t(){}return new t,Reflect.construct(t,[],function(){}),new t instanceof t}())return Reflect.construct;var t=Reflect.construct;return function(e,s,i){return e=t(e,s),i&&Reflect.setPrototypeOf(e,i.prototype),e}}return function(t,e,s){return void 0===s&&(s=t),s=Fl.objectCreate(s.prototype||Object.prototype),Function.prototype.apply.call(t,s,e)||s}},Fl.construct=Fl.getConstructImplementation(),Fl.underscoreProtoCanBeSet=function(){var t={};try{return t.__proto__={a:!0},t.a}catch(t){}return!1},Fl.setPrototypeOf=Fl.ASSUME_ES6||Fl.TRUST_ES6_POLYFILLS&&"function"==typeof Object.setPrototypeOf?Object.setPrototypeOf:Fl.underscoreProtoCanBeSet()?function(t,e){if(t.__proto__=e,t.__proto__!==e)throw new TypeError(t+" is not extensible");return t}:null,Fl.inherits=function(t,e){if(t.prototype=Fl.objectCreate(e.prototype),t.prototype.constructor=t,Fl.ASSUME_ES6||Fl.setPrototypeOf){var s=Fl.setPrototypeOf;s(t,e)}else for(s in e)if("prototype"!=s)if(Object.defineProperties){var i=Object.getOwnPropertyDescriptor(e,s);i&&Object.defineProperty(t,s,i)}else t[s]=e[s];t.superClass_=e.prototype},Fl.arrayIteratorImpl=function(t){var e=0;return function(){return e0;){var t=this.properties_.pop();if(t in this.object_)return t}return null},Fl.generator.Context.PropertyIterator.prototype.getNext=Fl.generator.Context.PropertyIterator.prototype.getNext,Fl.generator.Engine_=function(t){this.context_=new Fl.generator.Context,this.program_=t},Fl.generator.Engine_.prototype.next_=function(t){return this.context_.start_(),this.context_.yieldAllIterator_?this.yieldAllStep_(this.context_.yieldAllIterator_.next,t,this.context_.next_):(this.context_.next_(t),this.nextStep_())},Fl.generator.Engine_.prototype.return_=function(t){this.context_.start_();var e=this.context_.yieldAllIterator_;return e?this.yieldAllStep_("return"in e?e.return:function(t){return{value:t,done:!0}},t,this.context_.return):(this.context_.return(t),this.nextStep_())},Fl.generator.Engine_.prototype.throw_=function(t){return this.context_.start_(),this.context_.yieldAllIterator_?this.yieldAllStep_(this.context_.yieldAllIterator_.throw,t,this.context_.next_):(this.context_.throw_(t),this.nextStep_())},Fl.generator.Engine_.prototype.yieldAllStep_=function(t,e,s){try{var i=t.call(this.context_.yieldAllIterator_,e);if(Fl.generator.ensureIteratorResultIsObject_(i),!i.done)return this.context_.stop_(),i;var o=i.value}catch(t){return this.context_.yieldAllIterator_=null,this.context_.throw_(t),this.nextStep_()}return this.context_.yieldAllIterator_=null,s.call(this.context_,o),this.nextStep_()},Fl.generator.Engine_.prototype.nextStep_=function(){for(;this.context_.nextAddress;)try{var t=this.program_(this.context_);if(t)return this.context_.stop_(),{value:t.value,done:!1}}catch(t){this.context_.yieldResult=void 0,this.context_.throw_(t)}if(this.context_.stop_(),this.context_.abruptCompletion_){if(t=this.context_.abruptCompletion_,this.context_.abruptCompletion_=null,t.isException)throw t.exception;return{value:t.return,done:!0}}return{value:void 0,done:!0}},Fl.generator.Generator_=function(t){this.next=function(e){return t.next_(e)},this.throw=function(e){return t.throw_(e)},this.return=function(e){return t.return_(e)},this[Symbol.iterator]=function(){return this}},Fl.generator.createGenerator=function(t,e){return e=new Fl.generator.Generator_(new Fl.generator.Engine_(e)),Fl.setPrototypeOf&&t.prototype&&Fl.setPrototypeOf(e,t.prototype),e},Fl.asyncExecutePromiseGenerator=function(t){function e(e){return t.next(e)}function s(e){return t.throw(e)}return new Promise(function(i,o){!function t(n){n.done?i(n.value):Promise.resolve(n.value).then(e,s).then(t,o)}(t.next())})},Fl.asyncExecutePromiseGeneratorFunction=function(t){return Fl.asyncExecutePromiseGenerator(t())},Fl.asyncExecutePromiseGeneratorProgram=function(t){return Fl.asyncExecutePromiseGenerator(new Fl.generator.Generator_(new Fl.generator.Engine_(t)))},Fl.polyfill("globalThis",function(t){return t||Fl.global},"es_2020","es3"),Fl.polyfill("Array.prototype.includes",function(t){return t||function(t,e){var s=this;s instanceof String&&(s=String(s));var i=s.length;for((e=e||0)<0&&(e=Math.max(e+i,0));e0?(s=Array.prototype.flat.call(s,t-1),e.push.apply(e,s)):e.push(s)}),e}},"es9","es5"),Fl.polyfill("Object.entries",function(t){return t||function(t){var e,s=[];for(e in t)Fl.owns(t,e)&&s.push([e,t[e]]);return s}},"es8","es3"),Fl.polyfill("Object.values",function(t){return t||function(t){var e,s=[];for(e in t)Fl.owns(t,e)&&s.push(t[e]);return s}},"es8","es3");var Gl=Object.create(null),Vl={typeMap:Gl},Wl=Object.create(null),Xl="default",zl=class{constructor(t){this.name=t}toString(){return this.name}};zl.CONNECTION_CHECKER=new zl("connectionChecker"),zl.CONNECTION_PREVIEWER=new zl("connectionPreviewer"),zl.CURSOR=new zl("cursor"),zl.EVENT=new zl("event"),zl.FIELD=new zl("field"),zl.INPUT=new zl("input"),zl.RENDERER=new zl("renderer"),zl.TOOLBOX=new zl("toolbox"),zl.THEME=new zl("theme"),zl.TOOLBOX_ITEM=new zl("toolboxItem"),zl.FLYOUTS_VERTICAL_TOOLBOX=new zl("flyoutsVerticalToolbox"),zl.FLYOUTS_HORIZONTAL_TOOLBOX=new zl("flyoutsHorizontalToolbox"),zl.FLYOUT_INFLATER=new zl("flyoutInflater"),zl.METRICS_MANAGER=new zl("metricsManager"),zl.BLOCK_DRAGGER=new zl("blockDragger"),zl.SERIALIZER=new zl("serializer"),zl.ICON=new zl("icon"),zl.PASTER=new zl("paster"),zl.VARIABLE_MODEL=new zl("variableModel"),zl.VARIABLE_MAP=new zl("variableMap");var Yl={DEFAULT:Xl,TEST_ONLY:Vl};Yl.Type=zl,Yl.getAllItems=a,Yl.getClass=r,Yl.getClassFromOptions=c,Yl.getObject=l,Yl.hasItem=n,Yl.register=t,Yl.unregister=i;var Kl,jl,Jl,ql,Zl,Ql,ta,ea,sa,ia,oa=Object.create(null),na=750,ra="ontouchstart"in globalThis||!!(globalThis.document&&document.documentElement&&"ontouchstart"in document.documentElement)||!(!globalThis.navigator||!globalThis.navigator.maxTouchPoints&&!globalThis.navigator.msMaxTouchPoints),la=null,aa={mousedown:["pointerdown"],mouseenter:["pointerenter"],mouseleave:["pointerleave"],mousemove:["pointermove"],mouseout:["pointerout"],mouseover:["pointerover"],mouseup:["pointerup","pointercancel"],touchend:["pointerup"],touchcancel:["pointercancel"]},ca=0,ha={TOUCH_ENABLED:ra,TOUCH_MAP:aa};ha.checkTouchIdentifier=_,ha.clearTouchIdentifier=d,ha.getTouchIdentifierFromEvent=g,ha.longStart=h,ha.longStop=u,ha.shouldHandleEvent=p,function(t){function e(t){return s.includes(t.toUpperCase())}const s=(Kl=t).toUpperCase();jl=e("JavaFX"),Jl=e("WebKit"),ql=e("Gecko")&&!Jl,Zl=e("Android"),t=globalThis.navigator&&globalThis.navigator.maxTouchPoints,Ql=e("iPad")||e("Macintosh")&&t>0,ta=e("iPhone")&&!Ql,ea=e("Macintosh"),sa=Ql||Zl&&!e("Mobile")||e("Silk"),ia=!sa&&(ta||Zl)}(globalThis.navigator&&globalThis.navigator.userAgent||"");var ua,da=jl,pa=ql,ga=Zl,_a=Ql,Ta=ta,ma=ea,Ea=ia,ba={ANDROID:ga,GECKO:pa,IPAD:_a,IPHONE:Ta,JavaFx:da,MAC:ma,MOBILE:Ea,raw:Kl},fa=40,$a=125,Ia={};Ia.bind=m,Ia.conditionalBind=T,Ia.getScrollDeltaPixels=I,Ia.isRightButton=f,Ia.isTargetInput=b,Ia.mouseToSvg=$,Ia.unbind=E,function(t){t.BLOCK_CREATE="create",t.BLOCK_DELETE="delete",t.BLOCK_CHANGE="change",t.BLOCK_FIELD_INTERMEDIATE_CHANGE="block_field_intermediate_change",t.BLOCK_MOVE="move",t.VAR_CREATE="var_create",t.VAR_DELETE="var_delete",t.VAR_RENAME="var_rename",t.VAR_TYPE_CHANGE="var_type_change",t.UI="ui",t.BLOCK_DRAG="drag",t.SELECTED="selected",t.CLICK="click",t.MARKER_MOVE="marker_move",t.BUBBLE_OPEN="bubble_open",t.TRASHCAN_OPEN="trashcan_open",t.TOOLBOX_ITEM_SELECT="toolbox_item_select",t.THEME_CHANGE="theme_change",t.VIEWPORT_CHANGE="viewport_change",t.COMMENT_CREATE="comment_create",t.COMMENT_DELETE="comment_delete",t.COMMENT_CHANGE="comment_change",t.COMMENT_MOVE="comment_move",t.COMMENT_RESIZE="comment_resize",t.COMMENT_DRAG="comment_drag",t.COMMENT_COLLAPSE="comment_collapse",t.FINISHED_LOADING="finished_loading"}(ua||(ua={}));var Ca=[ua.BLOCK_CREATE,ua.BLOCK_MOVE,ua.COMMENT_CREATE,ua.COMMENT_MOVE];({BUMP_EVENTS:Ca}).EventType=ua;var Sa="!#$%()*+,-./:;=?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",Ra={genUid:()=>{const t=[];for(let e=0;e<20;e++)t[e]=Sa.charAt(88*Math.random());return t.join("")}},ya=0,Oa={TEST_ONLY:Ra};Oa.genUid=S,Oa.getNextUniqueId=C;var ka={};ka.isBlockChange=O,ka.isBlockCreate=R,ka.isBlockDelete=y,ka.isBlockDrag=L,ka.isBlockFieldIntermediateChange=k,ka.isBlockMove=A,ka.isBubbleOpen=x,ka.isClick=D,ka.isCommentChange=V,ka.isCommentCollapse=Y,ka.isCommentCreate=H,ka.isCommentDelete=G,ka.isCommentDrag=z,ka.isCommentMove=W,ka.isCommentResize=X,ka.isFinishedLoading=K,ka.isSelected=M,ka.isThemeChange=F,ka.isToolboxItemSelect=B,ka.isTrashcanOpen=P,ka.isVarCreate=v,ka.isVarDelete=N,ka.isVarRename=w,ka.isViewportChange=U;var Aa="",va=!0,Na=0,wa="ORPHANED_BLOCK",La=[],Ma={FIRE_QUEUE:La,enqueueEvent:Q,fireNow:Z,fireInternal:q,setGroupInternal:it},Da={TEST_ONLY:Ma};Da.clearPendingUndo=et,Da.disable=Hl.disable$$module$build$src$core$events$utils,Da.disableOrphans=lt,Da.enable=Hl.enable$$module$build$src$core$events$utils,Da.filter=tt,Da.fire=J,Da.fromJson=nt,Da.get=rt,Da.getDescendantIds=ot,Da.getGroup=Hl.getGroup$$module$build$src$core$events$utils,Da.getRecordUndo=j,Da.isEnabled=st,Da.setGroup=Hl.setGroup$$module$build$src$core$events$utils,Da.setRecordUndo=Hl.setRecordUndo$$module$build$src$core$events$utils;var xa,Pa="http://www.w3.org/2000/svg",Ba="http://www.w3.org/1999/xhtml",Fa="http://www.w3.org/1999/xlink";!function(t){t[t.ELEMENT_NODE=1]="ELEMENT_NODE",t[t.TEXT_NODE=3]="TEXT_NODE",t[t.COMMENT_NODE=8]="COMMENT_NODE"}(xa||(xa={}));var Ua=null,Ha=0,Ga=null,Va={HTML_NS:Ba};Va.NodeType=xa,Va.SVG_NS=Pa,Va.XLINK_NS=Fa,Va.addClass=ct,Va.createSvgElement=at,Va.getFastTextWidth=bt,Va.getFastTextWidthWithSizeString=ft,Va.getTextWidth=Et,Va.hasClass=dt,Va.insertAfter=gt,Va.measureFontMetrics=$t,Va.removeClass=ut,Va.removeClasses=ht,Va.removeNode=pt,Va.setCssTransform=_t,Va.startTextWidthCache=Tt,Va.stopTextWidthCache=mt;var Wa=class{static findFocusedNode(t){var e=t.getRootFocusableNode();if(!e.canBeFocused())return null;var s=e.getFocusableElement();return dt(s,Wa.ACTIVE_CLASS_NAME)||dt(s,Wa.PASSIVE_CSS_CLASS_NAME)||((e=s.querySelector(this.ACTIVE_FOCUS_NODE_CSS_SELECTOR))instanceof HTMLElement||e instanceof SVGElement)&&(e=Wa.findFocusableNodeFor(e,t))?e:((s=s.querySelector(this.PASSIVE_FOCUS_NODE_CSS_SELECTOR))instanceof HTMLElement||s instanceof SVGElement)&&(t=Wa.findFocusableNodeFor(s,t))?t:null}static findFocusableNodeFor(t,e){if(!t.id||"null"===t.id||-1!==e.getNestedTrees().map(e=>Wa.findFocusableNodeFor(t,e)).findIndex(t=>!!t))return null;var s,i=e.getRootFocusableNode();return i.canBeFocused()&&t===i.getFocusableElement()||(i=null!=(s=e.lookUpFocusableNode(t.id))?s:null)?i:(s=t.parentElement,!i&&s?Wa.findFocusableNodeFor(s,e):null)}};Wa.ACTIVE_CLASS_NAME="blocklyActiveFocus",Wa.PASSIVE_CSS_CLASS_NAME="blocklyPassiveFocus",Wa.ACTIVE_FOCUS_NODE_CSS_SELECTOR=`.${Wa.ACTIVE_CLASS_NAME}`,Wa.PASSIVE_FOCUS_NODE_CSS_SELECTOR=`.${Wa.PASSIVE_CSS_CLASS_NAME}`;var Xa=class{constructor(t,e){this.tree=t,this.rootShouldBeAutoTabbable=e}},za=class{constructor(t){this.previouslyFocusedNode=this.focusedNode=null,this.registeredTrees=[],this.isUpdatingFocusedNode=this.recentlyLostAllFocus=this.lockFocusStateChanges=this.currentlyHoldsEphemeralFocus=!1;const e=t=>{if(!this.isUpdatingFocusedNode){this.recentlyLostAllFocus=!t;var e=null;if(t instanceof HTMLElement||t instanceof SVGElement)for(var s of this.registeredTrees)if(e=Wa.findFocusableNodeFor(t,s.tree))break;if(e&&e.canBeFocused()){let i;t=e.getFocusableTree(),s=null==(i=this.focusedNode)?void 0:i.getFocusableTree(),e===t.getRootFocusableNode()&&t!==s?this.focusTree(t):this.focusNode(e)}else this.defocusCurrentFocusedNode()}};t("focusin",t=>{t instanceof FocusEvent&&e(document.activeElement)}),t("focusout",t=>{t instanceof FocusEvent&&e(t.relatedTarget)})}registerTree(t,e=!1){if(this.ensureManagerIsUnlocked(),this.isRegistered(t))throw Error(`Attempted to re-register already registered tree: ${t}.`);this.registeredTrees.push(new Xa(t,e));const s=t.getRootFocusableNode().getFocusableElement();if(!s.id||"null"===s.id)throw Error(`Attempting to register a tree with a root element that has an invalid ID: ${t}.`);e&&(s.tabIndex=0)}isRegistered(t){return!!this.lookUpRegistration(t)}lookUpRegistration(t){let e;return null!=(e=this.registeredTrees.find(e=>e.tree===t))?e:null}unregisterTree(t){if(this.ensureManagerIsUnlocked(),!this.isRegistered(t))throw Error(`Attempted to unregister not registered tree: ${t}.`);var e=this.registeredTrees.findIndex(e=>e.tree===t);const s=this.registeredTrees[e];this.registeredTrees.splice(e,1),e=Wa.findFocusedNode(t);const i=t.getRootFocusableNode();e&&this.removeHighlight(e),this.focusedNode!==e&&this.focusedNode!==i||this.updateFocusedNode(null),this.removeHighlight(i),s.rootShouldBeAutoTabbable&&t.getRootFocusableNode().getFocusableElement().removeAttribute("tabindex")}getFocusedTree(){let t,e;return null!=(e=null==(t=this.focusedNode)?void 0:t.getFocusableTree())?e:null}getFocusedNode(){return this.focusedNode}focusTree(t){if(this.ensureManagerIsUnlocked(),!this.isRegistered(t))throw Error(`Attempted to focus unregistered tree: ${t}.`);const e=Wa.findFocusedNode(t),s=t.getRestoredFocusableNode(e);let i;t=t.getRootFocusableNode(),this.focusNode(null!=(i=null!=s?s:e)?i:t)}focusNode(t){this.ensureManagerIsUnlocked();const e=!this.currentlyHoldsEphemeralFocus;e&&(this.isUpdatingFocusedNode=!0);var s,i=(null==(s=this.focusedNode)?void 0:s.getFocusableElement())!==document.activeElement;if(this.focusedNode!==t||i)if(t.canBeFocused()){if(s=t.getFocusableTree(),!this.isRegistered(s))throw Error(`Attempted to focus unregistered node: ${t}.`);(i=t.getFocusableElement()).id&&"null"!==i.id||console.warn("Trying to focus a node that has an invalid ID.");var o=Wa.findFocusableNodeFor(i,s);i=Wa.findFocusedNode(s);var n,r=t;o!==t&&(r=s.getRestoredFocusableNode(i),t=s.getRootFocusableNode(),r=null!=(n=null!=r?r:i)?n:t),n=null==(t=this.focusedNode)?void 0:t.getFocusableTree(),t&&this.passivelyFocusNode(t,s),s=s.getRootFocusableNode(),i&&this.removeHighlight(i),s!==r&&this.removeHighlight(s),this.currentlyHoldsEphemeralFocus||this.activelyFocusNode(r,null!=n?n:null),this.updateFocusedNode(r)}else console.warn("Trying to focus a node that can't be focused.");e&&(this.isUpdatingFocusedNode=!1)}takeEphemeralFocus(t){if(this.ensureManagerIsUnlocked(),this.currentlyHoldsEphemeralFocus)throw Error(`Attempted to take ephemeral focus when it's already held, with new element: ${t}.`);this.currentlyHoldsEphemeralFocus=!0,this.focusedNode&&this.passivelyFocusNode(this.focusedNode,null),t.focus({preventScroll:!0});let e=!1;return()=>{if(e)throw Error(`Attempted to finish ephemeral focus twice for element: ${t}.`);if(e=!0,this.currentlyHoldsEphemeralFocus=!1,this.focusedNode){this.activelyFocusNode(this.focusedNode,null);const t=this.focusedNode;setTimeout(()=>{!this.focusedNode&&this.previouslyFocusedNode===t&&this.recentlyLostAllFocus&&this.focusNode(t)},0)}}}ephemeralFocusTaken(){return this.currentlyHoldsEphemeralFocus}ensureManagerIsUnlocked(){if(this.lockFocusStateChanges)throw Error("FocusManager state changes cannot happen in a tree/node focus/blur callback.")}updateFocusedNode(t){this.previouslyFocusedNode=this.focusedNode,this.focusedNode=t}defocusCurrentFocusedNode(){this.focusedNode&&!this.currentlyHoldsEphemeralFocus&&(this.passivelyFocusNode(this.focusedNode,null),this.updateFocusedNode(null))}activelyFocusNode(t,e){this.lockFocusStateChanges=!0;const s=t.getFocusableTree(),i=t.getFocusableElement();let o;const n=null==(o=this.lookUpRegistration(s))?void 0:o.rootShouldBeAutoTabbable;s!==e&&(s.onTreeFocus(t,e),n&&(s.getRootFocusableNode().getFocusableElement().tabIndex=-1)),t.onNodeFocus(),this.lockFocusStateChanges=!1,n&&t===s.getRootFocusableNode()||i.hasAttribute("tabindex")||(i.tabIndex=-1),this.setNodeToVisualActiveFocus(t),i.focus({preventScroll:!0})}passivelyFocusNode(t,e){this.lockFocusStateChanges=!0;const s=t.getFocusableTree();if(s!==e){let t;s.onTreeBlur(e),null!=(t=this.lookUpRegistration(s))&&t.rootShouldBeAutoTabbable&&(s.getRootFocusableNode().getFocusableElement().tabIndex=0)}t.onNodeBlur(),this.lockFocusStateChanges=!1,s!==e&&this.setNodeToVisualPassiveFocus(t)}setNodeToVisualActiveFocus(t){t=t.getFocusableElement(),ct(t,za.ACTIVE_FOCUS_NODE_CSS_CLASS_NAME),ut(t,za.PASSIVE_FOCUS_NODE_CSS_CLASS_NAME)}setNodeToVisualPassiveFocus(t){t=t.getFocusableElement(),ut(t,za.ACTIVE_FOCUS_NODE_CSS_CLASS_NAME),ct(t,za.PASSIVE_FOCUS_NODE_CSS_CLASS_NAME)}removeHighlight(t){t=t.getFocusableElement(),ut(t,za.ACTIVE_FOCUS_NODE_CSS_CLASS_NAME),ut(t,za.PASSIVE_FOCUS_NODE_CSS_CLASS_NAME)}static getFocusManager(){return za.focusManager||(za.focusManager=new za(document.addEventListener)),za.focusManager}};za.ACTIVE_FOCUS_NODE_CSS_CLASS_NAME="blocklyActiveFocus",za.PASSIVE_FOCUS_NODE_CSS_CLASS_NAME="blocklyPassiveFocus",za.focusManager=null;var Ya={};Ya.FocusManager=za,Ya.getFocusManager=Hl.getFocusManager$$module$build$src$core$focus_manager;var Ka={};Ka.deepMerge=St;var ja=class{constructor(){this.shortcuts=new Map,this.keyMap=new Map,this.reset()}reset(){this.shortcuts.clear(),this.keyMap.clear()}register(t,e){if(this.shortcuts.get(t.name)&&!e)throw Error(`Shortcut named "${t.name}" already exists.`);if(this.shortcuts.set(t.name,t),null!=(e=t.keyCodes)&&e.length)for(const s of e)this.addKeyMapping(s,t.name,!!t.allowCollision)}unregister(t){return this.shortcuts.get(t)?(this.removeAllKeyMappings(t),this.shortcuts.delete(t),!0):(console.warn(`Keyboard shortcut named "${t}" not found.`),!1)}addKeyMapping(t,e,s){t=`${t}`;const i=this.keyMap.get(t);if(i&&!s)throw Error(`Shortcut named "${e}" collides with shortcuts "${i}"`);i&&s?i.unshift(e):this.keyMap.set(t,[e])}removeKeyMapping(t,e,s){const i=this.keyMap.get(t);if(!i)return s||console.warn(`No keyboard shortcut named "${e}" registered with key code "${t}"`),!1;const o=i.indexOf(e);return o>-1?(i.splice(o,1),0===i.length&&this.keyMap.delete(t),!0):(s||console.warn(`No keyboard shortcut named "${e}" registered with key code "${t}"`),!1)}removeAllKeyMappings(t){for(const e of this.keyMap.keys())this.removeKeyMapping(e,t,!0)}setKeyMap(t){this.keyMap.clear();for(const e in t)this.keyMap.set(e,t[e])}getKeyMap(){const t=Object.create(null);for(const[e,s]of this.keyMap)t[e]=s;return t}getRegistry(){const t=Object.create(null);for(const[e,s]of this.shortcuts)t[e]=s;return St(Object.create(null),t)}onKeyDown(t,e){var s=this.serializeKeyEvent(e);if(!(s=this.getShortcutNamesByKeyCode(s)))return!1;for(const i of s){let o,n,r,l;if((s=this.shortcuts.get(i))&&(!s.preconditionFn||s.preconditionFn(t,{focusedNode:null!=(o=Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode())?o:void 0}))&&null!=(r=(n=s).callback)&&r.call(n,t,e,s,{focusedNode:null!=(l=Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode())?l:void 0}))return!0}return!1}getShortcutNamesByKeyCode(t){let e;return(null==(e=this.keyMap.get(t))?void 0:e.slice())||[]}getKeyCodesByShortcutName(t){const e=[];for(const[s,i]of this.keyMap)i.indexOf(t)>-1&&e.push(s);return e}serializeKeyEvent(t){let e="";for(const s in ja.modifierKeys)t.getModifierState(s)&&(""!==e&&(e+="+"),e+=s);return""!==e&&t.keyCode?e+="+"+t.keyCode:t.keyCode&&(e=String(t.keyCode)),e}checkModifiers(t){for(const e of t)if(!(e in ja.modifierKeys))throw Error(e+" is not a valid modifier key.")}createSerializedKey(t,e){let s="";if(e){this.checkModifiers(e);for(const t in ja.modifierKeys)e.includes(ja.modifierKeys[t])&&(""!==s&&(s+="+"),s+=t)}return""!==s&&t?s+="+"+t:t&&(s=`${t}`),s}};ja.registry=new ja,function(t){(t=t.modifierKeys||(t.modifierKeys={}))[t.Shift=16]="Shift",t[t.Control=17]="Control",t[t.Alt=18]="Alt",t[t.Meta=91]="Meta"}(ja||(ja={}));var Ja,qa,Za=Object.create(null),Qa=[],tc={defineBlocksWithJsonArrayInternal:Ut},ec={TEST_ONLY:tc};ec.createBlockDefinitionsFromJsonArray=Hl.createBlockDefinitionsFromJsonArray$$module$build$src$core$common,ec.defineBlocks=Hl.defineBlocks$$module$build$src$core$common,ec.defineBlocksWithJsonArray=Ft,ec.draggingConnections=Qa,ec.fireSelectedEvent=Lt,ec.getAllWorkspaces=yt,ec.getBlockTypeCounts=Pt,ec.getMainWorkspace=At,ec.getParentContainer=Mt,ec.getSelected=Nt,ec.getWorkspaceById=Rt,ec.globalShortcutHandler=Ht,ec.registerWorkspace=Ot,ec.setMainWorkspace=vt,ec.setParentContainer=Dt,ec.setSelected=wt,ec.svgResize=xt,ec.unregisterWorkpace=kt;var sc,ic=class{constructor(){this.workspaceId=void 0,this.isUiEvent=!1,this.type="",this.group=Hl.getGroup$$module$build$src$core$events$utils(),this.recordUndo=j()}toJson(){return{type:this.type,group:this.group}}static fromJson(t,e,s){return s.isBlank=!1,s.group=t.group||"",s.workspaceId=e.id,s}isNull(){return!1}run(t){}getEventWorkspace_(){let t;if(this.workspaceId&&(t=Rt(this.workspaceId)),!t)throw Error("Workspace is null. Event must have been generated from real Blockly events.");return t}},oc=class extends ic{constructor(t){super(),this.isBlank=!0,this.recordUndo=!1,this.isUiEvent=!0,this.isBlank=void 0===t,this.workspaceId=t||""}},nc=class extends oc{constructor(t,e,s){null===(e=t?t.workspace.id:e)&&(e=void 0),super(e),this.type=ua.CLICK,this.blockId=t?t.id:void 0,this.targetType=s}toJson(){const t=super.toJson();if(!this.targetType)throw Error("The click target type is undefined. Either pass a block to the constructor, or call fromJson");return t.targetType=this.targetType,t.blockId=this.blockId,t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new nc)).targetType=t.targetType,e.blockId=t.blockId,e}};(function(t){t.BLOCK="block",t.WORKSPACE="workspace",t.ZOOM_CONTROLS="zoom_controls"})(sc||(sc={})),t(zl.EVENT,ua.CLICK,nc);var rc={};rc.Click=nc,rc.ClickTarget=sc;var lc={};lc.removeElem=Gt;var ac=class{constructor(t){this.name=t}toString(){return this.name}};ac.POSITIONABLE=new ac("positionable"),ac.DRAG_TARGET=new ac("drag_target"),ac.DELETE_AREA=new ac("delete_area"),ac.AUTOHIDEABLE=new ac("autohideable");var cc=class{constructor(){this.componentData=new Map,this.capabilityToComponentIds=new Map}addComponent(t,e){const s=t.component.id;var i;if(!e&&this.componentData.has(s))throw Error('Plugin "'+s+'" with capabilities "'+(null==(i=this.componentData.get(s))?void 0:i.capabilities)+'" already added.');for(this.componentData.set(s,t),e=[],i=0;i{e.push(this.componentData.get(t))}),e.sort(function(t,e){return t.weight-e.weight}),e.forEach(function(t){s.push(t.component)})}else t.forEach(t=>{s.push(this.componentData.get(t).component)});return s}};cc.Capability=ac,function(t){(t=t.ComponentWeight||(t.ComponentWeight={}))[t.TOOLBOX_WEIGHT=0]="TOOLBOX_WEIGHT",t[t.FLYOUT_WEIGHT=1]="FLYOUT_WEIGHT",t[t.TRASHCAN_WEIGHT=2]="TRASHCAN_WEIGHT",t[t.ZOOM_CONTROLS_WEIGHT=3]="ZOOM_CONTROLS_WEIGHT"}(cc||(cc={}));var hc=cc.ComponentWeight,uc={};uc.ComponentManager=cc,uc.ComponentWeight=hc;var dc=!1,pc='\n.blocklySvg {\n background-color: #fff;\n outline: none;\n overflow: hidden; /* IE overflows by default. */\n position: absolute;\n display: block;\n}\n\n.blocklyWidgetDiv {\n display: none;\n position: absolute;\n z-index: 99999; /* big value for bootstrap3 compatibility */\n}\n\n.injectionDiv {\n height: 100%;\n position: relative;\n overflow: hidden; /* So blocks in drag surface disappear at edges */\n touch-action: none;\n user-select: none;\n -webkit-user-select: none;\n}\n\n.blocklyBlockCanvas.blocklyCanvasTransitioning,\n.blocklyBubbleCanvas.blocklyCanvasTransitioning {\n transition: transform .5s;\n}\n\n.blocklyEmboss {\n filter: var(--blocklyEmbossFilter);\n}\n\n.blocklyTooltipDiv {\n background-color: #ffffc7;\n border: 1px solid #ddc;\n box-shadow: 4px 4px 20px 1px rgba(0,0,0,.15);\n color: #000;\n display: none;\n font: 9pt sans-serif;\n opacity: .9;\n padding: 2px;\n position: absolute;\n z-index: 100000; /* big value for bootstrap3 compatibility */\n}\n\n.blocklyDropDownDiv {\n position: absolute;\n left: 0;\n top: 0;\n z-index: 1000;\n display: none;\n border: 1px solid;\n border-color: #dadce0;\n background-color: #fff;\n border-radius: 2px;\n padding: 4px;\n box-shadow: 0 0 3px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownDiv:focus {\n box-shadow: 0 0 6px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownContent {\n max-height: 300px; /* @todo: spec for maximum height. */\n}\n\n.blocklyDropDownArrow {\n position: absolute;\n left: 0;\n top: 0;\n width: 16px;\n height: 16px;\n z-index: -1;\n background-color: inherit;\n border-color: inherit;\n border-top: 1px solid;\n border-left: 1px solid;\n border-top-left-radius: 4px;\n border-color: inherit;\n}\n\n.blocklyHighlighted>.blocklyPath {\n filter: var(--blocklyEmbossFilter);\n}\n\n.blocklyHighlightedConnectionPath {\n fill: none;\n stroke: #fc3;\n stroke-width: 4px;\n}\n\n.blocklyPathLight {\n fill: none;\n stroke-linecap: round;\n stroke-width: 1;\n}\n\n.blocklySelected>.blocklyPathLight {\n display: none;\n}\n\n.blocklyDraggable {\n cursor: grab;\n cursor: -webkit-grab;\n}\n\n.blocklyDragging {\n cursor: grabbing;\n cursor: -webkit-grabbing;\n /* Drag surface disables events to not block the toolbox, so we have to\n * reenable them here for the cursor values to work. */\n pointer-events: auto;\n}\n\n /* Changes cursor on mouse down. Not effective in Firefox because of\n https://bugzilla.mozilla.org/show_bug.cgi?id=771241 */\n.blocklyDraggable:active {\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n.blocklyDragging.blocklyDraggingDelete,\n.blocklyDragging.blocklyDraggingDelete .blocklyField {\n cursor: url("<<>>/handdelete.cur"), auto;\n}\n\n.blocklyDragging>.blocklyPath,\n.blocklyDragging>.blocklyPathLight {\n fill-opacity: .8;\n stroke-opacity: .8;\n}\n\n.blocklyDragging>.blocklyPathDark {\n display: none;\n}\n\n.blocklyDisabledPattern>.blocklyPath {\n fill: var(--blocklyDisabledPattern);\n fill-opacity: .5;\n stroke-opacity: .5;\n}\n\n.blocklyDisabled>.blocklyPathLight,\n.blocklyDisabled>.blocklyPathDark {\n display: none;\n}\n\n.blocklyInsertionMarker>.blocklyPath,\n.blocklyInsertionMarker>.blocklyPathLight,\n.blocklyInsertionMarker>.blocklyPathDark {\n fill-opacity: .2;\n stroke: none;\n}\n\n.blocklyNonEditableField>text {\n pointer-events: none;\n}\n\n.blocklyFlyout {\n position: absolute;\n z-index: 20;\n}\n\n.blocklyText text {\n cursor: default;\n}\n\n/*\n Don\'t allow users to select text. It gets annoying when trying to\n drag a block and selected text moves instead.\n*/\n.blocklySvg text {\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n cursor: inherit;\n}\n\n.blocklyIconGroup {\n cursor: default;\n}\n\n.blocklyIconGroup:not(:hover):not(:focus),\n.blocklyIconGroupReadonly {\n opacity: .6;\n}\n\n.blocklyIconShape {\n fill: #00f;\n stroke: #fff;\n stroke-width: 1px;\n}\n\n.blocklyIconSymbol {\n fill: #fff;\n}\n\n.blocklyMinimalBody {\n margin: 0;\n padding: 0;\n height: 100%;\n}\n\n.blocklyHtmlInput {\n border: none;\n border-radius: 4px;\n height: 100%;\n margin: 0;\n outline: none;\n padding: 0;\n width: 100%;\n text-align: center;\n display: block;\n box-sizing: border-box;\n}\n\n/* Remove the increase and decrease arrows on the field number editor */\ninput.blocklyHtmlInput[type=number]::-webkit-inner-spin-button,\ninput.blocklyHtmlInput[type=number]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\ninput[type=number] {\n -moz-appearance: textfield;\n}\n\n.blocklyMainBackground {\n stroke-width: 1;\n stroke: #c6c6c6; /* Equates to #ddd due to border being off-pixel. */\n}\n\n.blocklyMutatorBackground {\n fill: #fff;\n stroke: #ddd;\n stroke-width: 1;\n}\n\n.blocklyFlyoutBackground {\n fill: #ddd;\n fill-opacity: .8;\n}\n\n.blocklyMainWorkspaceScrollbar {\n z-index: 20;\n}\n\n.blocklyFlyoutScrollbar {\n z-index: 30;\n}\n\n.blocklyScrollbarHorizontal,\n.blocklyScrollbarVertical {\n position: absolute;\n outline: none;\n}\n\n.blocklyScrollbarBackground {\n opacity: 0;\n pointer-events: none;\n}\n\n.blocklyScrollbarHandle {\n fill: #ccc;\n}\n\n.blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,\n.blocklyScrollbarHandle:hover {\n fill: #bbb;\n}\n\n/* Darken flyout scrollbars due to being on a grey background. */\n/* By contrast, workspace scrollbars are on a white background. */\n.blocklyFlyout .blocklyScrollbarHandle {\n fill: #bbb;\n}\n\n.blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,\n.blocklyFlyout .blocklyScrollbarHandle:hover {\n fill: #aaa;\n}\n\n.blocklyInvalidInput {\n background: #faa;\n}\n\n.blocklyVerticalMarker {\n stroke-width: 3px;\n fill: rgba(255,255,255,.5);\n pointer-events: none;\n}\n\n.blocklyComputeCanvas {\n position: absolute;\n width: 0;\n height: 0;\n}\n\n.blocklyNoPointerEvents {\n pointer-events: none;\n}\n\n.blocklyContextMenu {\n border-radius: 4px;\n max-height: 100%;\n}\n\n.blocklyDropdownMenu {\n border-radius: 2px;\n padding: 0 !important;\n}\n\n.blocklyDropdownMenu .blocklyMenuItem {\n /* 28px on the left for icon or checkbox. */\n padding-left: 28px;\n}\n\n/* BiDi override for the resting state. */\n.blocklyDropdownMenu .blocklyMenuItemRtl {\n /* Flip left/right padding for BiDi. */\n padding-left: 5px;\n padding-right: 28px;\n}\n\n.blocklyWidgetDiv .blocklyMenu {\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n background: #fff;\n border: 1px solid transparent;\n box-shadow: 0 0 3px 1px rgba(0,0,0,.3);\n font: normal 13px Arial, sans-serif;\n margin: 0;\n outline: none;\n padding: 4px 0;\n position: absolute;\n overflow-y: auto;\n overflow-x: hidden;\n max-height: 100%;\n z-index: 20000; /* Arbitrary, but some apps depend on it... */\n}\n\n.blocklyWidgetDiv .blocklyMenu:focus {\n box-shadow: 0 0 6px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownDiv .blocklyMenu {\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n background: inherit; /* Compatibility with gapi, reset from goog-menu */\n border: inherit; /* Compatibility with gapi, reset from goog-menu */\n font: normal 13px "Helvetica Neue", Helvetica, sans-serif;\n outline: none;\n overflow-y: auto;\n overflow-x: hidden;\n max-height: 100%;\n z-index: 20000; /* Arbitrary, but some apps depend on it... */\n}\n\n/* State: resting. */\n.blocklyMenuItem {\n border: none;\n color: #000;\n cursor: pointer;\n list-style: none;\n margin: 0;\n /* 7em on the right for shortcut. */\n min-width: 7em;\n padding: 6px 15px;\n white-space: nowrap;\n}\n\n/* State: disabled. */\n.blocklyMenuItemDisabled {\n color: #ccc;\n cursor: inherit;\n}\n\n/* State: hover. */\n.blocklyMenuItemHighlight {\n background-color: rgba(0,0,0,.1);\n}\n\n/* State: selected/checked. */\n.blocklyMenuItemSelected .blocklyMenuItemCheckbox {\n background: url(<<>>/sprites.png) no-repeat -48px -16px;\n float: left;\n margin-left: -24px;\n width: 16px;\n height: 16px;\n position: static; /* Scroll with the menu. */\n display: block;\n}\n\n.blocklyMenuItemRtl .blocklyMenuItemCheckbox {\n float: right;\n margin-right: -24px;\n}\n\n.blocklyMenuSeparator {\n background-color: #ccc;\n height: 1px;\n border: 0;\n margin-left: 4px;\n margin-right: 4px;\n}\n\n.blocklyBlockDragSurface, .blocklyAnimationLayer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n overflow: visible !important;\n z-index: 80;\n pointer-events: none;\n}\n\n.blocklyField {\n cursor: default;\n}\n\n.blocklyInputField {\n cursor: text;\n}\n\n.blocklyDragging .blocklyField,\n.blocklyDragging .blocklyIconGroup {\n cursor: grabbing;\n}\n\n.blocklyActiveFocus:is(\n .blocklyFlyout,\n .blocklyWorkspace,\n .blocklyField,\n .blocklyPath,\n .blocklyHighlightedConnectionPath,\n .blocklyComment,\n .blocklyBubble,\n .blocklyIconGroup,\n .blocklyTextarea\n) {\n outline: none;\n}\n',gc={};gc.inject=Wt,gc.register=Vt;var _c=class{constructor(t,e){this.x=t,this.y=e}clone(){return new _c(this.x,this.y)}scale(t){return this.x*=t,this.y*=t,this}translate(t,e){return this.x+=t,this.y+=e,this}static equals(t,e){return t===e||!(!t||!e)&&t.x===e.x&&t.y===e.y}static distance(t,e){const s=t.x-e.x;return t=t.y-e.y,Math.sqrt(s*s+t*t)}static magnitude(t){return Math.sqrt(t.x*t.x+t.y*t.y)}static difference(t,e){return new _c(t.x-e.x,t.y-e.y)}static sum(t,e){return new _c(t.x+e.x,t.y+e.y)}},Tc=class{constructor(t){this.tagName=t}toString(){return this.tagName}};Tc.ANIMATE=new Tc("animate"),Tc.CIRCLE=new Tc("circle"),Tc.CLIPPATH=new Tc("clipPath"),Tc.DEFS=new Tc("defs"),Tc.FECOMPOSITE=new Tc("feComposite"),Tc.FECOMPONENTTRANSFER=new Tc("feComponentTransfer"),Tc.FEFLOOD=new Tc("feFlood"),Tc.FEFUNCA=new Tc("feFuncA"),Tc.FEGAUSSIANBLUR=new Tc("feGaussianBlur"),Tc.FEPOINTLIGHT=new Tc("fePointLight"),Tc.FESPECULARLIGHTING=new Tc("feSpecularLighting"),Tc.FILTER=new Tc("filter"),Tc.FOREIGNOBJECT=new Tc("foreignObject"),Tc.G=new Tc("g"),Tc.IMAGE=new Tc("image"),Tc.LINE=new Tc("line"),Tc.PATH=new Tc("path"),Tc.PATTERN=new Tc("pattern"),Tc.POLYGON=new Tc("polygon"),Tc.RECT=new Tc("rect"),Tc.SVG=new Tc("svg"),Tc.TEXT=new Tc("text"),Tc.TSPAN=new Tc("tspan");var mc=class{constructor(t,e,s,i){this.top=t,this.bottom=e,this.left=s,this.right=i}static from(t){return new mc(t.y,t.y+t.height,t.x,t.x+t.width)}clone(){return new mc(this.top,this.bottom,this.left,this.right)}getHeight(){return this.bottom-this.top}getWidth(){return this.right-this.left}getOrigin(){return new _c(this.left,this.top)}contains(t,e){return t>=this.left&&t<=this.right&&e>=this.top&&e<=this.bottom}intersects(t){return this.left<=t.right&&this.right>=t.left&&this.bottom>=t.top&&this.top<=t.bottom}static equals(t,e){return t===e||!(!t||!e)&&t.top===e.top&&t.bottom===e.bottom&&t.left===e.left&&t.right===e.right}static createFromPoint(t,e,s){const i=t.x;return t=t.y,new mc(t,t+s,i,i+e)}},Ec=class{constructor(t,e){this.width=t,this.height=e}static equals(t,e){return t===e||!(!t||!e)&&t.width===e.width&&t.height===e.height}static max(t,e){return new Ec(Math.max(t.width,e.width),Math.max(t.height,e.height))}static min(t,e){return new Ec(Math.min(t.width,e.width),Math.min(t.height,e.height))}},bc={getSizeInternal:zt},fc={TEST_ONLY:bc};fc.getBorderBox=qt,fc.getComputedStyle=Kt,fc.getContainerOffsetToScrollInto=Qt,fc.getPageOffset=jt,fc.getSize=Xt,fc.getViewportPageOffset=Jt,fc.scrollIntoContainerView=Zt;var $c=/translate\(\s*([-+\d.e]+)([ ,]\s*([-+\d.e]+)\s*)?/,Ic=/transform:\s*translate(?:3d)?\(\s*([-+\d.e]+)\s*px([ ,]\s*([-+\d.e]+)\s*px)?/,Cc={TEST_ONLY:{XY_REGEX:$c,XY_STYLE_REGEX:Ic}};Cc.getDocumentScroll=ie,Cc.getInjectionDivXY=ee,Cc.getRelativeXY=te,Cc.getViewportBBox=se,Cc.screenToWsCoordinates=oe,Cc.wsToScreenCoordinates=ne;var Sc=class{constructor(t,e,s,i,o){this.workspace=t,this.horizontal=e,this.oldHostMetrics=null,this.ratio=1,this.origin=new _c(0,0),this.startDragHandle=this.handlePosition=this.handleLength=this.scrollbarLength=this.startDragMouse=0,this.containerVisible=this.isHandleVisible=!0,this.position=new _c(0,0),this.onMouseMoveWrapper_=this.onMouseUpWrapper_=null,this.pair=s||!1,this.margin=void 0!==o?o:Sc.DEFAULT_SCROLLBAR_MARGIN,t="blocklyScrollbar"+(this.horizontal?"Horizontal":"Vertical"),i&&(t+=" "+i),this.outerSvg=at(Tc.SVG,{class:t}),i=at(Tc.G,{},this.outerSvg),this.svgBackground=at(Tc.RECT,{class:"blocklyScrollbarBackground"},i),t=Math.floor((Sc.scrollbarThickness-5)/2),this.svgHandle=at(Tc.RECT,{class:"blocklyScrollbarHandle",rx:t,ry:t},i),this.workspace.getThemeManager().subscribe(this.svgHandle,"scrollbarColour","fill"),this.workspace.getThemeManager().subscribe(this.svgHandle,"scrollbarOpacity","fill-opacity"),gt(this.outerSvg,this.workspace.getParentSvg()),this.setInitialThickness(),e?(this.lengthAttribute_="width",this.positionAttribute_="x"):(this.lengthAttribute_="height",this.positionAttribute_="y"),this.onMouseDownBarWrapper_=T(this.svgBackground,"pointerdown",this,this.onMouseDownBar),this.onMouseDownHandleWrapper_=T(this.svgHandle,"pointerdown",this,this.onMouseDownHandle)}setInitialThickness(){const t=Sc.scrollbarThickness;this.horizontal?(this.svgBackground.setAttribute("height",String(t)),this.outerSvg.setAttribute("height",String(t)),this.svgHandle.setAttribute("height",String(t-5)),this.svgHandle.setAttribute("y","2.5")):(this.svgBackground.setAttribute("width",String(t)),this.outerSvg.setAttribute("width",String(t)),this.svgHandle.setAttribute("width",String(t-5)),this.svgHandle.setAttribute("x","2.5"))}dispose(){this.cleanUp(),E(this.onMouseDownBarWrapper_),E(this.onMouseDownHandleWrapper_),pt(this.outerSvg),this.workspace.getThemeManager().unsubscribe(this.svgHandle)}constrainHandleLength(t){return t<=0||isNaN(t)?0:Math.min(t,this.scrollbarLength)}setHandleLength(t){this.handleLength=t,this.svgHandle.setAttribute(this.lengthAttribute_,String(this.handleLength))}constrainHandlePosition(t){return t<=0||isNaN(t)?0:Math.min(t,this.scrollbarLength-this.handleLength)}setHandlePosition(t){this.handlePosition=t,this.svgHandle.setAttribute(this.positionAttribute_,String(this.handlePosition))}setScrollbarLength(t){this.scrollbarLength=t,this.outerSvg.setAttribute(this.lengthAttribute_,String(this.scrollbarLength)),this.svgBackground.setAttribute(this.lengthAttribute_,String(this.scrollbarLength))}setPosition(t,e){this.position.x=t,this.position.y=e,_t(this.outerSvg,"translate("+(this.position.x+this.origin.x)+"px,"+(this.position.y+this.origin.y)+"px)")}resize(t){(t||(t=this.workspace.getMetrics()))&&(this.oldHostMetrics&&Sc.metricsAreEquivalent(t,this.oldHostMetrics)||(this.horizontal?this.resizeHorizontal(t):this.resizeVertical(t),this.oldHostMetrics=t,this.updateMetrics()))}requiresViewResize(t){return!this.oldHostMetrics||this.oldHostMetrics.viewWidth!==t.viewWidth||this.oldHostMetrics.viewHeight!==t.viewHeight||this.oldHostMetrics.absoluteLeft!==t.absoluteLeft||this.oldHostMetrics.absoluteTop!==t.absoluteTop}resizeHorizontal(t){this.requiresViewResize(t)?this.resizeViewHorizontal(t):this.resizeContentHorizontal(t)}resizeViewHorizontal(t){var e=t.viewWidth-2*this.margin;this.pair&&(e-=Sc.scrollbarThickness),this.setScrollbarLength(Math.max(0,e)),e=t.absoluteLeft+this.margin,this.pair&&this.workspace.RTL&&(e+=Sc.scrollbarThickness),this.setPosition(e,t.absoluteTop+t.viewHeight-Sc.scrollbarThickness-this.margin),this.resizeContentHorizontal(t)}resizeContentHorizontal(t){if(t.viewWidth>=t.scrollWidth)this.setHandleLength(this.scrollbarLength),this.setHandlePosition(0),this.pair||this.setVisible(!1);else{this.pair||this.setVisible(!0);var e=this.scrollbarLength*t.viewWidth/t.scrollWidth;e=this.constrainHandleLength(e),this.setHandleLength(e),e=t.scrollWidth-t.viewWidth;var s=this.scrollbarLength-this.handleLength;t=(t.viewLeft-t.scrollLeft)/e*s,t=this.constrainHandlePosition(t),this.setHandlePosition(t),this.ratio=s/e}}resizeVertical(t){this.requiresViewResize(t)?this.resizeViewVertical(t):this.resizeContentVertical(t)}resizeViewVertical(t){let e=t.viewHeight-2*this.margin;this.pair&&(e-=Sc.scrollbarThickness),this.setScrollbarLength(Math.max(0,e)),this.setPosition(this.workspace.RTL?t.absoluteLeft+this.margin:t.absoluteLeft+t.viewWidth-Sc.scrollbarThickness-this.margin,t.absoluteTop+this.margin),this.resizeContentVertical(t)}resizeContentVertical(t){if(t.viewHeight>=t.scrollHeight)this.setHandleLength(this.scrollbarLength),this.setHandlePosition(0),this.pair||this.setVisible(!1);else{this.pair||this.setVisible(!0);var e=this.scrollbarLength*t.viewHeight/t.scrollHeight;e=this.constrainHandleLength(e),this.setHandleLength(e),e=t.scrollHeight-t.viewHeight;var s=this.scrollbarLength-this.handleLength;t=(t.viewTop-t.scrollTop)/e*s,t=this.constrainHandlePosition(t),this.setHandlePosition(t),this.ratio=s/e}}isVisible(){return this.isHandleVisible}setContainerVisible(t){const e=t!==this.containerVisible;this.containerVisible=t,e&&this.updateDisplay_()}setVisible(t){if(this.pair)throw Error("Unable to toggle visibility of paired scrollbars.");this.setVisibleInternal(t)}setVisibleInternal(t){const e=t!==this.isVisible();this.isHandleVisible=t,e&&this.updateDisplay_()}updateDisplay_(){this.containerVisible&&this.isVisible()?this.outerSvg.setAttribute("display","block"):this.outerSvg.setAttribute("display","none")}onMouseDownBar(t){if(this.workspace.markFocused(),d(),this.cleanUp(),f(t))t.stopPropagation();else{var e=$(t,this.workspace.getParentSvg(),this.workspace.getInverseScreenCTM());e=this.horizontal?e.x:e.y;var s=ee(this.svgHandle);s=this.horizontal?s.x:s.y;var i=this.handlePosition,o=.95*this.handleLength;e<=s?i-=o:e>=s+this.handleLength&&(i+=o),this.setHandlePosition(this.constrainHandlePosition(i)),this.updateMetrics(),t.stopPropagation(),t.preventDefault()}}onMouseDownHandle(t){this.workspace.markFocused(),this.cleanUp(),f(t)?t.stopPropagation():(this.startDragHandle=this.handlePosition,this.startDragMouse=this.horizontal?t.clientX:t.clientY,this.onMouseUpWrapper_=T(document,"pointerup",this,this.onMouseUpHandle),this.onMouseMoveWrapper_=T(document,"pointermove",this,this.onMouseMoveHandle),t.stopPropagation(),t.preventDefault())}onMouseMoveHandle(t){this.setHandlePosition(this.constrainHandlePosition(this.startDragHandle+((this.horizontal?t.clientX:t.clientY)-this.startDragMouse))),this.updateMetrics()}onMouseUpHandle(){d(),this.cleanUp()}cleanUp(){this.workspace.hideChaff(!0),this.onMouseUpWrapper_&&(E(this.onMouseUpWrapper_),this.onMouseUpWrapper_=null),this.onMouseMoveWrapper_&&(E(this.onMouseMoveWrapper_),this.onMouseMoveWrapper_=null)}getRatio_(){let t=this.handlePosition/(this.scrollbarLength-this.handleLength);return isNaN(t)&&(t=0),t}updateMetrics(){const t=this.getRatio_();this.horizontal?this.workspace.setMetrics({x:t}):this.workspace.setMetrics({y:t})}set(t,e){this.setHandlePosition(this.constrainHandlePosition(t*this.ratio)),(e||void 0===e)&&this.updateMetrics()}setOrigin(t,e){this.origin=new _c(t,e)}static metricsAreEquivalent(t,e){return t.viewWidth===e.viewWidth&&t.viewHeight===e.viewHeight&&t.viewLeft===e.viewLeft&&t.viewTop===e.viewTop&&t.absoluteTop===e.absoluteTop&&t.absoluteLeft===e.absoluteLeft&&t.scrollWidth===e.scrollWidth&&t.scrollHeight===e.scrollHeight&&t.scrollLeft===e.scrollLeft&&t.scrollTop===e.scrollTop}};Sc.scrollbarThickness=ra?25:15,Sc.DEFAULT_SCROLLBAR_MARGIN=.5;var Rc={parseFromString:function(){throw Error("DOMParser was not found in the global scope and was not properly injected using injectDependencies")}},yc={serializeToString:function(){throw Error("XMLSerializer was not foundin the global scope and was not properly injected using injectDependencies")}},{document:Oc,DOMParser:kc,XMLSerializer:Ac}=globalThis;kc&&(Rc=new kc),Ac&&(yc=new Ac);var vc="https://developers.google.com/blockly/xml",Nc=/[\x00-\x09\x0B\x0C\x0E-\x1F]/g,wc={NAME_SPACE:vc};wc.createElement=Hl.createElement$$module$build$src$core$utils$xml,wc.createTextNode=Hl.createTextNode$$module$build$src$core$utils$xml,wc.domToText=le,wc.injectDependencies=re,wc.textToDom=Hl.textToDom$$module$build$src$core$utils$xml;var Lc,Mc="categoryToolbox",Dc="flyoutToolbox";!function(t){t[t.TOP=0]="TOP",t[t.BOTTOM=1]="BOTTOM",t[t.LEFT=2]="LEFT",t[t.RIGHT=3]="RIGHT"}(Lc||(Lc={}));var xc,Pc,Bc,Fc={hasCategoriesInternal:pe},Uc={};Uc.Position=Lc,Uc.TEST_ONLY=Fc,Uc.convertFlyoutDefToJsonArray=ue,Uc.convertToolboxDefToJson=ce,Uc.hasCategories=de,Uc.isCategoryCollapsible=ge,Uc.parseToolboxTree=Ee,function(t){t[t.TOP=0]="TOP",t[t.BOTTOM=1]="BOTTOM"}(xc||(xc={})),function(t){t[t.LEFT=0]="LEFT",t[t.RIGHT=1]="RIGHT"}(Pc||(Pc={})),function(t){t[t.UP=0]="UP",t[t.DOWN=1]="DOWN"}(Bc||(Bc={}));var Hc={};Hc.bumpDirection=Bc,Hc.bumpPositionRect=$e,Hc.getCornerOppositeToolbox=fe,Hc.getStartPositionRect=be,Hc.horizontalPosition=Pc,Hc.verticalPosition=xc;var Gc=96,Vc=124,Wc="sprites.png",Xc=class{constructor(t){this.workspace=t,this.id="zoomControls",this.boundEvents=[],this.zoomResetGroup=this.zoomOutGroup=this.zoomInGroup=null,this.HEIGHT=this.WIDTH=32,this.SMALL_SPACING=2,this.LARGE_SPACING=11,this.MARGIN_HORIZONTAL=this.MARGIN_VERTICAL=20,this.svgGroup=null,this.top=this.left=0,this.initialized=!1}createDom(){this.svgGroup=at(Tc.G,{});const t=String(Math.random()).substring(2);return this.createZoomOutSvg(t),this.createZoomInSvg(t),this.workspace.isMovable()&&this.createZoomResetSvg(t),this.svgGroup}init(){this.workspace.getComponentManager().addComponent({component:this,weight:cc.ComponentWeight.ZOOM_CONTROLS_WEIGHT,capabilities:[cc.Capability.POSITIONABLE]}),this.initialized=!0}dispose(){this.workspace.getComponentManager().removeComponent("zoomControls"),this.svgGroup&&pt(this.svgGroup);for(const t of this.boundEvents)E(t);this.boundEvents.length=0}getBoundingRectangle(){let t=this.SMALL_SPACING+2*this.HEIGHT;return this.zoomResetGroup&&(t+=this.LARGE_SPACING+this.HEIGHT),new mc(this.top,this.top+t,this.left,this.left+this.WIDTH)}position(t,e){if(this.initialized){var s,i=fe(this.workspace,t),o=this.SMALL_SPACING+2*this.HEIGHT;if(this.zoomResetGroup&&(o+=this.LARGE_SPACING+this.HEIGHT),t=be(i,new Ec(this.WIDTH,o),this.MARGIN_HORIZONTAL,this.MARGIN_VERTICAL,t,this.workspace),i=i.vertical,e=$e(t,this.MARGIN_VERTICAL,i===xc.TOP?Bc.DOWN:Bc.UP,e),i===xc.TOP){var n,r=this.SMALL_SPACING+this.HEIGHT;null==(n=this.zoomInGroup)||n.setAttribute("transform","translate(0, "+r+")"),this.zoomResetGroup&&this.zoomResetGroup.setAttribute("transform","translate(0, "+(r+this.LARGE_SPACING+this.HEIGHT)+")")}else{let t;n=this.zoomResetGroup?this.LARGE_SPACING+this.HEIGHT:0,null==(t=this.zoomInGroup)||t.setAttribute("transform","translate(0, "+n+")"),n=n+this.SMALL_SPACING+this.HEIGHT,null==(r=this.zoomOutGroup)||r.setAttribute("transform","translate(0, "+n+")")}this.top=e.top,this.left=e.left,null==(s=this.svgGroup)||s.setAttribute("transform","translate("+this.left+","+this.top+")")}}createZoomOutSvg(t){this.zoomOutGroup=at(Tc.G,{class:"blocklyZoom blocklyZoomOut"},this.svgGroup);const e=at(Tc.CLIPPATH,{id:"blocklyZoomoutClipPath"+t},this.zoomOutGroup);at(Tc.RECT,{width:32,height:32},e),at(Tc.IMAGE,{width:Gc,height:Vc,x:-64,y:-92,"clip-path":"url(#blocklyZoomoutClipPath"+t+")"},this.zoomOutGroup).setAttributeNS(Fa,"xlink:href",this.workspace.options.pathToMedia+Wc),this.boundEvents.push(T(this.zoomOutGroup,"pointerdown",null,this.zoom.bind(this,-1)))}createZoomInSvg(t){this.zoomInGroup=at(Tc.G,{class:"blocklyZoom blocklyZoomIn"},this.svgGroup);const e=at(Tc.CLIPPATH,{id:"blocklyZoominClipPath"+t},this.zoomInGroup);at(Tc.RECT,{width:32,height:32},e),at(Tc.IMAGE,{width:Gc,height:Vc,x:-32,y:-92,"clip-path":"url(#blocklyZoominClipPath"+t+")"},this.zoomInGroup).setAttributeNS(Fa,"xlink:href",this.workspace.options.pathToMedia+Wc),this.boundEvents.push(T(this.zoomInGroup,"pointerdown",null,this.zoom.bind(this,1)))}zoom(t,e){this.workspace.markFocused(),this.workspace.zoomCenter(t),this.fireZoomEvent(),d(),e.stopPropagation(),e.preventDefault()}createZoomResetSvg(t){this.zoomResetGroup=at(Tc.G,{class:"blocklyZoom blocklyZoomReset"},this.svgGroup);const e=at(Tc.CLIPPATH,{id:"blocklyZoomresetClipPath"+t},this.zoomResetGroup);at(Tc.RECT,{width:32,height:32},e),at(Tc.IMAGE,{width:Gc,height:Vc,y:-92,"clip-path":"url(#blocklyZoomresetClipPath"+t+")"},this.zoomResetGroup).setAttributeNS(Fa,"xlink:href",this.workspace.options.pathToMedia+Wc),this.boundEvents.push(T(this.zoomResetGroup,"pointerdown",null,this.resetZoom.bind(this)))}resetZoom(t){this.workspace.markFocused();const e=Math.log(this.workspace.options.zoomOptions.startScale/this.workspace.scale)/Math.log(this.workspace.options.zoomOptions.scaleSpeed);this.workspace.beginCanvasTransition(),this.workspace.zoomCenter(e),this.workspace.scrollCenter(),setTimeout(this.workspace.endCanvasTransition.bind(this.workspace),500),this.fireZoomEvent(),d(),t.stopPropagation(),t.preventDefault()}fireZoomEvent(){const t=new(rt(ua.CLICK))(null,this.workspace.id,"zoom_controls");J(t)}};Vt("\n.blocklyZoom>image, .blocklyZoom>svg>image {\n opacity: .4;\n}\n\n.blocklyZoom>image:hover, .blocklyZoom>svg>image:hover {\n opacity: .6;\n}\n\n.blocklyZoom>image:active, .blocklyZoom>svg>image:active {\n opacity: .8;\n}\n");var zc={BLOCKS:50,PROCEDURES:75,VARIABLES:100,WORKSPACE_COMMENTS:25},Yc={};Yc.register=Ie,Yc.unregister=Ce;var Kc=class{constructor(){this.priority=25}save(t){const e=[];for(const s of t.getTopComments())(t=Se(s,{addCoordinates:!0,saveIds:!0}))&&e.push(t);return e.length?e:null}load(t,e){for(const s of t)Re(s,e,{recordUndo:j()})}clear(t){for(const e of t.getTopComments())e.dispose()}};Ie("workspaceComments",new Kc);var jc={};jc.WorkspaceCommentSerializer=Kc,jc.append=Re,jc.save=Se;var Jc={};Jc.register=ye,Jc.unregister=Oe;var qc=class{paste(t,e,s){let i;t=t.commentState,s&&(t.x=s.x,t.y=s.y),Hl.disable$$module$build$src$core$events$utils();try{i=Re(t,e),ke(i)}finally{Hl.enable$$module$build$src$core$events$utils()}return i?(st()&&J(new(rt(ua.COMMENT_CREATE))(i)),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(i),i):null}};qc.TYPE="workspace-comment",ye(qc.TYPE,new qc),Hl.config$$module$build$src$core$config={dragRadius:5,flyoutDragRadius:10,snapRadius:28,connectingSnapRadius:28,currentConnectionPreference:8,bumpDelay:250},Hl.config$$module$build$src$core$config;var Zc,Qc,th="aria-",eh="role";(function(t){t.GRID="grid",t.GRIDCELL="gridcell",t.GROUP="group",t.LISTBOX="listbox",t.MENU="menu",t.MENUITEM="menuitem",t.MENUITEMCHECKBOX="menuitemcheckbox",t.OPTION="option",t.PRESENTATION="presentation",t.ROW="row",t.TREE="tree",t.TREEITEM="treeitem",t.SEPARATOR="separator",t.STATUS="status"})(Zc||(Zc={})),function(t){t.ACTIVEDESCENDANT="activedescendant",t.COLCOUNT="colcount",t.DISABLED="disabled",t.EXPANDED="expanded",t.INVALID="invalid",t.LABEL="label",t.LABELLEDBY="labelledby",t.LEVEL="level",t.ORIENTATION="orientation",t.POSINSET="posinset",t.ROWCOUNT="rowcount",t.SELECTED="selected",t.SETSIZE="setsize",t.VALUEMAX="valuemax",t.VALUEMIN="valuemin",t.LIVE="live",t.HIDDEN="hidden"}(Qc||(Qc={}));var sh={};sh.Role=Zc,sh.State=Qc,sh.setRole=ve,sh.setState=Ne;var ih=class{constructor(t,e){this.content=t,this.opt_value=e,this.enabled=!0,this.element=null,this.rightToLeft=!1,this.roleName=null,this.highlight=this.checked=this.checkable=!1,this.actionHandler=null}createDom(){const t=document.createElement("div");t.id=C(),this.element=t,t.className="blocklyMenuItem "+(this.enabled?"":"blocklyMenuItemDisabled ")+(this.checked?"blocklyMenuItemSelected ":"")+(this.highlight?"blocklyMenuItemHighlight ":"")+(this.rightToLeft?"blocklyMenuItemRtl ":"");const e=document.createElement("div");e.className="blocklyMenuItemContent";let s=this.content;return"string"==typeof this.content&&(s=document.createTextNode(this.content)),e.appendChild(s),t.appendChild(e),this.checkable&&this.toggleHasCheckbox(!0),this.roleName&&ve(t,this.roleName),Ne(t,Qc.SELECTED,this.checkable&&this.checked||!1),Ne(t,Qc.DISABLED,!this.enabled),t}dispose(){this.element=null}getElement(){return this.element}getId(){return this.element.id}getValue(){let t;return null!=(t=this.opt_value)?t:null}setRightToLeft(t){let e;this.rightToLeft=t,null==(e=this.getElement())||e.classList.toggle("blocklyMenuItemRtl",this.rightToLeft)}setRole(t){this.roleName=t}setCheckable(t){(this.checkable=t)||this.setChecked(!1),this.toggleHasCheckbox(t)}setChecked(t){t&&!this.checkable||(this.checked=t,(t=this.getElement())&&(t.classList.toggle("blocklyMenuItemSelected",this.checked),Ne(t,Qc.SELECTED,this.checked)))}setHighlighted(t){if(this.highlight=t,this.isEnabled()){let t;null==(t=this.getElement())||t.classList.toggle("blocklyMenuItemHighlight",this.highlight)}}isEnabled(){return this.enabled}setEnabled(t){this.enabled=t,(t=this.getElement())&&(t.classList.toggle("blocklyMenuItemDisabled",!this.enabled),Ne(t,Qc.DISABLED,!this.enabled))}performAction(t){this.isEnabled()&&this.actionHandler&&this.actionHandler(this,t)}onAction(t,e){this.actionHandler=t.bind(e)}toggleHasCheckbox(t){if(t){let i;var e,s;null!=(i=this.getElement())&&i.querySelector(".blocklyMenuItemContent .blocklyMenuItemCheckbox")||((t=document.createElement("div")).className="blocklyMenuItemCheckbox ",null==(e=this.getElement())||null==(s=e.querySelector(".blocklyMenuItemContent"))||s.prepend(t))}else{let t,e;null==(t=this.getElement())||null==(e=t.querySelector(".blocklyMenuItemContent .blocklyMenuItemCheckbox"))||e.remove()}}},oh=class{constructor(){this.menuItems=[],this.roleName=this.element=this.onKeyDownHandler=this.pointerLeaveHandler=this.pointerEnterHandler=this.clickHandler=this.pointerMoveHandler=this.highlightedItem=this.openingCoords=null}addChild(t){this.menuItems.push(t)}render(t){const e=document.createElement("div");e.className="blocklyMenu",e.tabIndex=0,this.roleName&&ve(e,this.roleName),this.element=e;for(let t,s=0;t=this.menuItems[s];s++)e.appendChild(t.createDom());return this.pointerMoveHandler=T(e,"pointermove",this,this.handlePointerMove,!0),this.clickHandler=T(e,"pointerup",this,this.handleClick,!0),this.pointerEnterHandler=T(e,"pointerenter",this,this.handlePointerEnter,!0),this.pointerLeaveHandler=T(e,"pointerleave",this,this.handlePointerLeave,!0),this.onKeyDownHandler=T(e,"keydown",this,this.handleKeyEvent),t.appendChild(e),e}getElement(){return this.element}focus(){const t=this.getElement();t&&t.focus({preventScroll:!0})}blur(){const t=this.getElement();t&&t.blur()}setRole(t){this.roleName=t}dispose(){this.pointerMoveHandler&&(E(this.pointerMoveHandler),this.pointerMoveHandler=null),this.clickHandler&&(E(this.clickHandler),this.clickHandler=null),this.pointerEnterHandler&&(E(this.pointerEnterHandler),this.pointerEnterHandler=null),this.pointerLeaveHandler&&(E(this.pointerLeaveHandler),this.pointerLeaveHandler=null),this.onKeyDownHandler&&(E(this.onKeyDownHandler),this.onKeyDownHandler=null);for(let t,e=0;t=this.menuItems[e];e++)t.dispose();this.element=null}getMenuItem(t){const e=this.getElement();for(;t&&t!==e;){if(t.classList.contains("blocklyMenuItem")){const e=this.getMenuItems();for(let s,i=0;s=e[i];i++)if(s.getElement()===t)return s}t=t.parentElement}return null}setHighlighted(t){var e=this.highlightedItem;if(e&&(e.setHighlighted(!1),this.highlightedItem=null),t){t.setHighlighted(!0),this.highlightedItem=t,e=this.getElement();const s=t.getElement();e&&s&&(Zt(s,e),Ne(e,Qc.ACTIVEDESCENDANT,t.getId()))}}highlightNext(){const t=this.highlightedItem?this.getMenuItems().indexOf(this.highlightedItem):-1;this.highlightHelper(t,1)}highlightPrevious(){const t=this.highlightedItem?this.getMenuItems().indexOf(this.highlightedItem):-1;this.highlightHelper(t<0?this.menuItems.length:t,-1)}highlightFirst(){this.highlightHelper(-1,1)}highlightLast(){this.highlightHelper(this.menuItems.length,-1)}highlightHelper(t,e){let s;t+=e;const i=this.getMenuItems();for(;s=i[t];){if(s.isEnabled()){this.setHighlighted(s);break}t+=e}}handlePointerMove(t){0!==Math.max(Math.abs(t.movementX),Math.abs(t.movementY))&&(t=this.getMenuItem(t.target))&&(t.isEnabled()?this.highlightedItem!==t&&this.setHighlighted(t):this.setHighlighted(null))}handleClick(t){var e=this.openingCoords;if(this.openingCoords=null,e&&"number"==typeof t.clientX){const s=new _c(t.clientX,t.clientY);if(_c.distance(e,s)<1)return}(e=this.getMenuItem(t.target))&&e.performAction(t)}handlePointerEnter(t){this.focus()}handlePointerLeave(t){this.getElement()&&this.setHighlighted(null)}handleKeyEvent(t){if(this.menuItems.length&&!(t.shiftKey||t.ctrlKey||t.metaKey||t.altKey)){var e=this.highlightedItem;switch(t.key){case"Enter":case" ":e&&e.performAction(t);break;case"ArrowUp":this.highlightPrevious();break;case"ArrowDown":this.highlightNext();break;case"PageUp":case"Home":this.highlightFirst();break;case"PageDown":case"End":this.highlightLast();break;default:return}t.preventDefault(),t.stopPropagation()}}getSize(){const t=this.getElement(),e=Xt(t);return e.height=t.scrollHeight,e}getMenuItems(){return this.menuItems.filter(t=>t instanceof ih)}},nh=class{constructor(){this.element=null}createDom(){return this.element=document.createElement("hr"),this.element.className="blocklyMenuSeparator",ve(this.element,Zc.SEPARATOR),this.element}dispose(){let t;null==(t=this.element)||t.remove(),this.element=null}},rh="_TEMP_COLLAPSED_INPUT",lh="_TEMP_COLLAPSED_FIELD",ah="MANUALLY_DISABLED",ch={COLLAPSED_FIELD_NAME:lh,COLLAPSED_INPUT_NAME:rh,MANUALLY_DISABLED:ah};(function(t){t[t.VALUE=1]="VALUE",t[t.STATEMENT=3]="STATEMENT",t[t.DUMMY=5]="DUMMY",t[t.CUSTOM=6]="CUSTOM",t[t.END_ROW=7]="END_ROW"})(Hl.inputTypes$$module$build$src$core$inputs$input_types||(Hl.inputTypes$$module$build$src$core$inputs$input_types={})),Hl.inputTypes$$module$build$src$core$inputs$input_types;var hh,uh,dh=new Set,ph=new WeakSet,gh=new WeakMap,_h=null,Th=null,mh=0,Eh={};Eh.finishQueuedRenders=Me,Eh.queueRender=Le,Eh.triggerQueuedRenders=De,Hl.Msg$$module$build$src$core$msg=Object.create(null),hh=function(t){Object.keys(t).forEach(function(e){Hl.Msg$$module$build$src$core$msg[e]=t[e]})},uh={Msg:Hl.Msg$$module$build$src$core$msg,setLocale:hh};var bh="blocklyToast",fh="blocklyToastMessage",$h="blocklyToastCloseButton",Ih=class{static show(t,e){if(e.oncePerSession&&e.id){if(this.shownIds.has(e.id))return;this.shownIds.add(e.id)}this.hide(t);const s=this.createDom(t,e);requestAnimationFrame(()=>{s.style.bottom="2rem"})}static createDom(t,e){const{message:s,duration:i=5,assertiveness:o=Ih.Assertiveness.POLITE}=e,n=document.createElement("div");t.getInjectionDiv().appendChild(n),n.dataset.toastId=e.id,n.className=bh,ve(n,Zc.STATUS),Ne(n,Qc.LIVE,o),(e=n.appendChild(document.createElement("div"))).className=fh,e.innerText=s,(e=n.appendChild(document.createElement("button"))).className=$h,Ne(e,Qc.LABEL,Hl.Msg$$module$build$src$core$msg.CLOSE);var r=at(Tc.SVG,{width:24,height:24,viewBox:"0 0 24 24",fill:"none"},e);let l;return Ne(r,Qc.HIDDEN,!0),at(Tc.RECT,{x:19.7782,y:2.80762,width:2,height:24,transform:"rotate(45, 19.7782, 2.80762)",fill:"black"},r),at(Tc.RECT,{x:2.80762,y:4.22183,width:2,height:24,transform:"rotate(-45, 2.80762, 4.22183)",fill:"black"},r),e.addEventListener("click",()=>{n.remove(),t.markFocused()}),e=()=>{l=setTimeout(()=>n.remove(),1e3*i)},r=()=>clearTimeout(l),n.addEventListener("focusin",r),n.addEventListener("focusout",e),n.addEventListener("mouseenter",r),n.addEventListener("mousemove",r),n.addEventListener("mouseleave",e),e(),n}static hide(t,e){(t=t.getInjectionDiv().querySelector(`.${bh}`))instanceof HTMLElement&&(!e||e===t.dataset.toastId)&&t.remove()}};Ih.shownIds=new Set,function(t){(t=t.Assertiveness||(t.Assertiveness={})).ASSERTIVE="assertive",t.POLITE="polite"}(Ih||(Ih={})),Vt(`\n.${bh} {\n font-size: 1.2rem;\n position: absolute;\n bottom: -10rem;\n right: 2rem;\n padding: 1rem;\n color: black;\n background-color: white;\n border: 2px solid black;\n border-radius: 0.4rem;\n z-index: 999;\n display: flex;\n align-items: center;\n gap: 0.8rem;\n line-height: 1.5;\n transition: bottom 0.3s ease-out;\n}\n\n.${bh} .${fh} {\n maxWidth: 18rem;\n}\n\n.${bh} .${$h} {\n margin: 0;\n padding: 0.2rem;\n background-color: transparent;\n color: black;\n border: none;\n cursor: pointer;\n}\n`);var Ch=function(t,e){window.alert(t),e&&e()},Sh=Ch,Rh=function(t,e){e(window.confirm(t))},yh=Rh,Oh=function(t,e,s){s(window.prompt(t,e))},kh=Oh,Ah=Ih.show.bind(Ih),vh=Ah,Nh={};Nh.alert=Ge,Nh.confirm=We,Nh.prompt=ze,Nh.setAlert=Ve,Nh.setConfirm=Xe,Nh.setPrompt=Ye,Nh.setToast=je,Nh.toast=Ke;var wh={};wh.isLegacyProcedureCallBlock=qe,wh.isLegacyProcedureDefBlock=Je;var Lh=new Set,Mh={};Mh.warn=Qe;var Dh="VARIABLE",xh="ijkmnopqrstuvwxyzabcdefgh",Ph={generateUniqueNameInternal:ls},Bh={CATEGORY_NAME:Dh,TEST_ONLY:Ph,VAR_LETTER_OPTIONS:xh};Bh.allDeveloperVariables=Hl.allDeveloperVariables$$module$build$src$core$variables,Bh.allUsedVarModels=Hl.allUsedVarModels$$module$build$src$core$variables,Bh.compareByName=bs,Bh.createVariableButtonHandler=cs,Bh.deleteVariable=Hl.deleteVariable$$module$build$src$core$variables,Bh.flyoutCategory=es,Bh.flyoutCategoryBlocks=ns,Bh.generateUniqueName=rs,Bh.generateUniqueNameFromOptions=as,Bh.generateVariableFieldDom=Ts,Bh.getAddedVariables=Es,Bh.getOrCreateVariablePackage=Hl.getOrCreateVariablePackage$$module$build$src$core$variables,Bh.getVariable=Hl.getVariable$$module$build$src$core$variables,Bh.getVariableUsesById=fs,Bh.internalFlyoutCategory=ts,Bh.jsonFlyoutCategoryBlocks=is,Bh.nameUsedWithAnyType=ds,Bh.nameUsedWithConflictingParam=ps,Bh.promptName=hs,Bh.renameVariable=Hl.renameVariable$$module$build$src$core$variables;var Fh=class extends Error{},Uh=class extends Fh{constructor(t){super("Expected to find a 'type' property, defining the block type"),this.state=t}},Hh=class extends Fh{constructor(t,e,s){super(`The block ${e.toDevString()} is missing a(n) ${t}\nconnection`),this.block=e,this.state=s}},Gh=class extends Fh{constructor(t,e,s,i){super(`The block ${s.toDevString()} could not connect its\n${e} to its parent, because: ${t}`),this.childBlock=s,this.childState=i}},Vh=class extends Fh{constructor(t){super("Encountered a real block which is defined as a child of a shadow\nblock. It is an invariant of Blockly that shadow blocks only have shadow\nchildren"),this.state=t}},Wh=class extends Fh{constructor(t,e,s){super(`Cannot add an icon of type '${t}' to the block ${e.toDevString()}, because there is no icon registered with type '${t}'. Make sure that all of your icons have been registered.`),this.block=e,this.state=s}},Xh={};Xh.BadConnectionCheck=Gh,Xh.DeserializationError=Fh,Xh.MissingBlockType=Uh,Xh.MissingConnection=Hh,Xh.RealChildOfShadow=Vh,Xh.UnregisteredIcon=Wh;var zh=class{constructor(){this.priority=50}save(t){const e=[];for(const s of t.getTopBlocks(!1))(t=$s(s,{addCoordinates:!0,doFullSerialization:!1}))&&e.push(t);return e.length?{languageVersion:0,blocks:e}:null}load(t,e){t=t.blocks;for(const s of t)vs(s,e,{recordUndo:j()})}clear(t){for(const e of t.getTopBlocks(!1))e.dispose(!1)}};Ie("blocks",new zh);var Yh={};Yh.BlockSerializer=zh,Yh.append=vs,Yh.appendInternal=Ns,Yh.save=$s;var Kh=class{constructor(t){this.name=t}toString(){return this.name}equals(t){return this.name===t.toString()}};Kh.MUTATOR=new Kh("mutator"),Kh.WARNING=new Kh("warning"),Kh.COMMENT=new Kh("comment");var jh=class extends ic{constructor(t){super(),this.isBlank=!0,this.isBlank=!t,t&&(this.blockId=t.id,this.workspaceId=t.workspace.id)}toJson(){const t=super.toJson();if(!this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");return t.blockId=this.blockId,t}static fromJson(t,e,s){return(e=ic.fromJson(t,e,null!=s?s:new jh)).blockId=t.blockId,e}},Jh=class extends jh{constructor(t,e,s,i,o){super(t),this.type=ua.BLOCK_CHANGE,t&&(this.element=e,this.name=s||void 0,this.oldValue=i,this.newValue=o)}toJson(){const t=super.toJson();if(!this.element)throw Error("The changed element is undefined. Either pass an element to the constructor, or call fromJson");return t.element=this.element,t.name=this.name,t.oldValue=this.oldValue,t.newValue=this.newValue,this.disabledReason&&(t.disabledReason=this.disabledReason),t}static fromJson(t,e,s){return(e=jh.fromJson(t,e,null!=s?s:new Jh)).element=t.element,e.name=t.name,e.oldValue=t.oldValue,e.newValue=t.newValue,void 0!==t.disabledReason&&(e.disabledReason=t.disabledReason),e}setDisabledReason(t){if("disabled"!==this.element)throw Error('Cannot set the disabled reason for a BlockChange event if the element is not "disabled".');this.disabledReason=t}isNull(){return this.oldValue===this.newValue}run(t){var e=this.getEventWorkspace_();if(!this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");if(!(e=e.getBlockById(this.blockId)))throw Error("The associated block is undefined. Either pass a block to the constructor, or call fromJson");const s=e.getIcon(Kh.MUTATOR);switch(s&&Ws(s)&&s.bubbleIsVisible()&&s.setBubbleVisible(!1),t=t?this.newValue:this.oldValue,this.element){case"field":(e=e.getField(this.name))?e.setValue(t):console.warn("Can't set non-existent field: "+this.name);break;case"comment":e.setCommentText(null!=t?t:null);break;case"collapsed":e.setCollapsed(!!t);break;case"disabled":var i;e.setDisabledReason(!!t,null!=(i=this.disabledReason)?i:ah);break;case"inline":e.setInputsInline(!!t);break;case"mutation":i=Jh.getExtraBlockState_(e),e.loadExtraState?e.loadExtraState(JSON.parse(t||"{}")):e.domToMutation&&e.domToMutation(Hl.textToDom$$module$build$src$core$utils$xml(t||"")),J(new Jh(e,"mutation",null,i,t));break;default:console.warn("Unknown change type: "+this.element)}}static getExtraBlockState_(t){return t.saveExtraState?(t=t.saveExtraState(!0))?JSON.stringify(t):"":t.mutationToDom&&(t=t.mutationToDom())?Uo(t):""}};t(zl.EVENT,ua.BLOCK_CHANGE,Jh);var qh={};qh.clamp=Ys,qh.toDegrees=zs,qh.toRadians=Xs;var Zh,Qh,tu,eu=16,su=1,iu=12,ou=16,nu=.25,ru=null,lu=null,au="",cu="",hu=null,uu=null,du=null,pu=null,gu=null,_u={getBoundsInfo:function(){const t=jt(hu),e=Xt(hu);return{left:t.x,right:t.x+e.width,top:t.y,bottom:t.y+e.height,width:e.width,height:e.height}},getPositionMetrics:function(t,e,s,i){const o=_u.getBoundsInfo(),n=Xt(Zh);return e+n.heighto.top?li(s,i,o,n):e+n.heightdocument.documentElement.clientTop?li(s,i,o,n):ai(t,o,n)}},Tu={ANIMATION_TIME:nu,ARROW_HORIZONTAL_PADDING:iu,ARROW_SIZE:eu,BORDER_SIZE:su,PADDING_Y:ou,TEST_ONLY:_u};Tu.clearContent=Zs,Tu.createDom=Ks,Tu.getContentDiv=qs,Tu.getOwner=Js,Tu.getPositionX=ci,Tu.hide=di,Tu.hideIfOwner=ui,Tu.hideWithoutAnimation=pi,Tu.isVisible=hi,Tu.repositionForWindowResize=_i,Tu.setBoundsElement=js,Tu.setColour=Qs,Tu.show=ni,Tu.showPositionedByBlock=ti,Tu.showPositionedByField=ei;var mu={};mu.commonWordPrefix=mi,mu.commonWordSuffix=Ei,mu.isNumber=Hl.isNumber$$module$build$src$core$utils$string,mu.shortestStringLength=Ti,mu.wrap=Hl.wrap$$module$build$src$core$utils$string;var Eu=void 0,bu=!1,fu=!1,$u=50,Iu=0,Cu=0,Su=0,Ru=0,yu=null,Ou=null,ku=0,Au=10,vu=10,Nu=750,wu=5,Lu=null,Mu={HOVER_MS:Nu,LIMIT:$u,MARGINS:wu,OFFSET_X:ku,OFFSET_Y:Au,RADIUS_OK:vu};Mu.bindMouseEvents=vi,Mu.block=Pi,Mu.createDom=Ai,Mu.dispose=Di,Mu.getCustomTooltip=Si,Mu.getDiv=yi,Mu.getTooltipOfObject=Oi,Mu.hide=xi,Mu.isVisible=Ri,Mu.setCustomTooltip=Ci,Mu.unbindMouseEvents=Ni,Mu.unblock=Bi;var Du=.45,xu=.65,Pu={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00"},Bu={};Bu.blend=qi,Bu.getHsvSaturation=Vi,Bu.getHsvValue=Xi,Bu.hexToRgb=ji,Bu.hsvToHex=Ji,Bu.hueToHex=Zi,Bu.names=Pu,Bu.parse=Yi,Bu.rgbToHex=Ki,Bu.setHsvSaturation=Wi,Bu.setHsvValue=zi;var Fu={};Fu.checkMessageReferences=so,Fu.parseBlockColour=io,Fu.replaceMessageReferences=eo,Fu.tokenizeInterpolation=to;var Uu=class{get size_(){return this.size}set size_(t){this.size=t}constructor(t,e,s){this.DEFAULT_VALUE=null,this.name=void 0,this.tooltip=this.validator_=null,this.size=new Ec(0,0),this.constants_=this.mouseDownWrapper=this.textContent_=this.textElement_=this.borderRect_=this.fieldGroup_=null,this.disposed=!1,this.maxDisplayLength=50,this.sourceBlock_=null,this.enabled_=this.visible_=this.isDirty_=!0,this.suffixField=this.prefixField=this.clickTarget_=null,this.EDITABLE=!0,this.SERIALIZABLE=!1,this.id_=null,this.value_="DEFAULT_VALUE"in new.target.prototype?new.target.prototype.DEFAULT_VALUE:this.DEFAULT_VALUE,this.size_=new Ec(0,0),t!==Uu.SKIP_SETUP&&(s&&this.configure_(s),this.setValue(t),e&&this.setValidator(e))}configure_(t){t.tooltip&&this.setTooltip(eo(t.tooltip))}setSourceBlock(t){if(this.sourceBlock_)throw Error("Field already bound to a block");if(this.sourceBlock_=t,t.id.includes("_field"))throw Error(`Field ID indicator is contained in block ID. This may cause problems with focus: ${t.id}.`);this.id_=`${t.id}_field_${C()}`}getConstants(){return!this.constants_&&this.sourceBlock_&&!this.sourceBlock_.isDeadOrDying()&&this.sourceBlock_.workspace.rendered&&(this.constants_=this.sourceBlock_.workspace.getRenderer().getConstants()),this.constants_}getSourceBlock(){return this.sourceBlock_}init(){if(!this.fieldGroup_){var t=this.id_;if(!t)throw Error("Expected ID to be defined prior to init.");this.fieldGroup_=at(Tc.G,{id:t}),this.isVisible()||(this.fieldGroup_.style.display="none"),this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_),this.initView(),this.updateEditable(),this.setTooltip(this.tooltip),this.bindEvents_(),this.initModel(),this.applyColour()}}initView(){this.createBorderRect_(),this.createTextElement_(),this.fieldGroup_&&ct(this.fieldGroup_,"blocklyField")}initModel(){}isFullBlockField(){return!this.borderRect_}createBorderRect_(){this.borderRect_=at(Tc.RECT,{rx:this.getConstants().FIELD_BORDER_RECT_RADIUS,ry:this.getConstants().FIELD_BORDER_RECT_RADIUS,x:0,y:0,height:this.size_.height,width:this.size_.width,class:"blocklyFieldRect"},this.fieldGroup_)}createTextElement_(){this.textElement_=at(Tc.TEXT,{class:"blocklyText blocklyFieldText"},this.fieldGroup_),this.getConstants().FIELD_TEXT_BASELINE_CENTER&&this.textElement_.setAttribute("dominant-baseline","central"),this.textContent_=document.createTextNode(""),this.textElement_.appendChild(this.textContent_)}bindEvents_(){const t=this.getClickTarget_();if(!t)throw Error("A click target has not been set.");vi(t),this.mouseDownWrapper=T(t,"pointerdown",this,this.onMouseDown_)}fromXml(t){this.setValue(t.textContent)}toXml(t){return t.textContent=this.getValue(),t}saveState(t){return null!==(t=this.saveLegacyState(Uu))?t:this.getValue()}loadState(t){this.loadLegacyState(Uu,t)||this.setValue(t)}saveLegacyState(t){return t.prototype.saveState===this.saveState&&t.prototype.toXml!==this.toXml?((t=Hl.createElement$$module$build$src$core$utils$xml("field")).setAttribute("name",this.name||""),le(this.toXml(t)).replace(' xmlns="https://developers.google.com/blockly/xml"',"")):null}loadLegacyState(t,e){return t.prototype.loadState===this.loadState&&t.prototype.fromXml!==this.fromXml&&(this.fromXml(Hl.textToDom$$module$build$src$core$utils$xml(e)),!0)}dispose(){let t;ui(this),ho(this),null!=(t=this.getSourceBlock())&&t.isDeadOrDying()||pt(this.fieldGroup_),this.disposed=!0}updateEditable(){const t=this.fieldGroup_,e=this.getSourceBlock();this.EDITABLE&&t&&e&&(this.enabled_&&e.isEditable()?(ct(t,"blocklyEditableField"),ut(t,"blocklyNonEditableField")):(ct(t,"blocklyNonEditableField"),ut(t,"blocklyEditableField")))}setEnabled(t){this.enabled_=t,this.updateEditable()}isEnabled(){return this.enabled_}isClickable(){return this.enabled_&&!!this.sourceBlock_&&this.sourceBlock_.isEditable()&&this.showEditor_!==Uu.prototype.showEditor_}isClickableInFlyout(t){return!t}isCurrentlyEditable(){return this.enabled_&&this.EDITABLE&&!!this.sourceBlock_&&this.sourceBlock_.isEditable()}isSerializable(){let t=!1;return this.name&&(this.SERIALIZABLE?t=!0:this.EDITABLE&&(console.warn("Detected an editable field that was not serializable. Please define SERIALIZABLE property as true on all editable custom fields. Proceeding with serialization."),t=!0)),t}isVisible(){return this.visible_}setVisible(t){if(this.visible_!==t){this.visible_=t;var e=this.fieldGroup_;e&&(e.style.display=t?"block":"none")}}setValidator(t){this.validator_=t}getValidator(){return this.validator_}getSvgRoot(){return this.fieldGroup_}getBorderRect(){if(!this.borderRect_)throw Error(`The border rectangle is ${this.borderRect_}.`);return this.borderRect_}getTextElement(){if(!this.textElement_)throw Error(`The text element is ${this.textElement_}.`);return this.textElement_}getTextContent(){if(!this.textContent_)throw Error(`The text content is ${this.textContent_}.`);return this.textContent_}applyColour(){}render_(){this.textContent_&&(this.textContent_.nodeValue=this.getDisplayText_()),this.updateSize_()}showEditor(t){this.isClickable()&&this.showEditor_(t)}showEditor_(t){}repositionForWindowResize(){return!1}updateSize_(t){const e=this.getConstants();let s=2*(t=void 0!==t?t:this.isFullBlockField()?0:this.getConstants().FIELD_BORDER_RECT_X_PADDING),i=e.FIELD_TEXT_HEIGHT,o=0;this.textElement_&&(o=Et(this.textElement_),s+=o),this.isFullBlockField()||(i=Math.max(i,e.FIELD_BORDER_RECT_HEIGHT)),this.size_=new Ec(s,i),this.positionTextElement_(t,o),this.positionBorderRect_()}positionTextElement_(t,e){if(this.textElement_){var s,i=this.getConstants(),o=this.size_.height/2;this.textElement_.setAttribute("x",String(null!=(s=this.getSourceBlock())&&s.RTL?this.size_.width-e-t:t)),this.textElement_.setAttribute("y",String(i.FIELD_TEXT_BASELINE_CENTER?o:o-i.FIELD_TEXT_HEIGHT/2+i.FIELD_TEXT_BASELINE))}}positionBorderRect_(){this.borderRect_&&(this.borderRect_.setAttribute("width",String(this.size_.width)),this.borderRect_.setAttribute("height",String(this.size_.height)),this.borderRect_.setAttribute("rx",String(this.getConstants().FIELD_BORDER_RECT_RADIUS)),this.borderRect_.setAttribute("ry",String(this.getConstants().FIELD_BORDER_RECT_RADIUS)))}getSize(){return this.isVisible()?(this.isDirty_&&(this.render_(),this.isDirty_=!1),this.size_):new Ec(0,0)}getScaledBBox(){let t;var e=this.getSourceBlock();if(!e)throw new Hu;if(this.isFullBlockField()){var s=this.sourceBlock_.getHeightWidth();const i=e.workspace.scale;t=this.getAbsoluteXY_(),e=(s.width+1)*i,s=(s.height+1)*i,pa?(t.x+=1.5*i,t.y+=1.5*i):(t.x-=.5*i,t.y-=.5*i)}else s=this.borderRect_.getBoundingClientRect(),t=jt(this.borderRect_),e=s.width,s=s.height;return new mc(t.y,t.y+s,t.x,t.x+e)}onLocationChange(t){}getDisplayText_(){let t=this.getText();return t.length>this.maxDisplayLength&&(t=t.substring(0,this.maxDisplayLength-2)+"…"),t=t.replace(/\s/g,Uu.NBSP),this.sourceBlock_&&this.sourceBlock_.RTL&&(t+="‏"),t}getText(){const t=this.getText_();return String(null!==t?t:this.getValue())}getText_(){return null}markDirty(){this.isDirty_=!0,this.constants_=null}forceRerender(){this.isDirty_=!0,this.sourceBlock_&&this.sourceBlock_.rendered&&this.sourceBlock_.queueRender()}setValue(t,e=!0){if(null!==t){var s=Hl.getGroup$$module$build$src$core$events$utils();s||Hl.setGroup$$module$build$src$core$events$utils(!0);try{const s=this.doClassValidation_(t),a=this.processValidation(t,s,e);if(!(a instanceof Error)){var i,o=null==(i=this.getValidator())?void 0:i.call(this,a),n=this.processValidation(a,o,e);if(!(n instanceof Error)){var r=this.sourceBlock_;if(!r||!r.disposed){var l=this.getValue();l===n?this.doValueUpdate_(n):(this.doValueUpdate_(n),e&&r&&st()&&J(new(rt(ua.BLOCK_CHANGE))(r,"field",this.name||null,l,n)),this.isDirty_&&this.forceRerender())}}}}finally{Hl.setGroup$$module$build$src$core$events$utils(s)}}}processValidation(t,e,s){return null===e?(this.doValueInvalid_(t,s),this.isDirty_&&this.forceRerender(),Error()):void 0===e?t:e}getValue(){return this.value_}doClassValidation_(t){return t??null}doValueUpdate_(t){this.value_=t,this.isDirty_=!0}doValueInvalid_(t,e){}onMouseDown_(t){this.sourceBlock_&&!this.sourceBlock_.isDeadOrDying()&&(t=this.sourceBlock_.workspace.getGesture(t))&&t.setStartField(this)}setTooltip(t){t||""===t||(t=this.sourceBlock_);const e=this.getClickTarget_();e?e.tooltip=t:this.tooltip=t}getTooltip(){const t=this.getClickTarget_();return Oi(t||{tooltip:this.tooltip})}getClickTarget_(){return this.clickTarget_||this.getSvgRoot()}getAbsoluteXY_(){return jt(this.getClickTarget_())}referencesVariables(){return!1}refreshVariableName(){}getParentInput(){let t=null;const e=this.getSourceBlock();if(!e)throw new Hu;const s=e.inputList;for(let i=0;i{t.stopPropagation(),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this),d()}),T(this.textArea,"wheel",this,t=>{t.stopPropagation()},!1,{passive:!0}),T(this.textArea,"keydown",this,this.handleKeyDown)}getDom(){return this.foreignObject}getText(){return this.text}setText(t){this.textArea.value=t,this.onTextChange()}onTextChange(){const t=this.text;this.text=this.textArea.value;for(let e=this.textChangeListeners.length-1;e>=0;e--)this.textChangeListeners[e](t,this.text)}handleKeyDown(t){("Escape"===t.key||"Enter"===t.key&&(t.ctrlKey||t.metaKey))&&(this.onFinishEditing&&this.onFinishEditing(),t.stopPropagation())}addTextChangeListener(t){this.textChangeListeners.push(t)}removeTextChangeListener(t){this.textChangeListeners.splice(this.textChangeListeners.indexOf(t),1)}setPlaceholderText(t){this.textArea.placeholder=t}setEditable(t){t?this.textArea.removeAttribute("readonly"):this.textArea.setAttribute("readonly","true")}updateSize(t,e){this.foreignObject.setAttribute("height",""+(t.height-e.height)),this.foreignObject.setAttribute("width",`${t.width}`),this.foreignObject.setAttribute("y",`${e.height}`),this.workspace.RTL&&this.foreignObject.setAttribute("x",""+-t.width)}getFocusableElement(){return this.textArea}getFocusableTree(){return this.workspace}onNodeFocus(){const t=mc.from(this.foreignObject.getBoundingClientRect());this.workspace.scrollBoundsIntoView(mc.createFromPoint(oe(this.workspace,t.getOrigin()),t.getWidth(),t.getHeight()))}onNodeBlur(){}canBeFocused(){return!!this.id}};({COMMENT_EDITOR_FOCUS_IDENTIFIER:gd}).CommentEditor=_d;var Td="_delete_bar_button",md=class extends ud{constructor(t,e,s,i){super(t,e,s,i),this.id=t,this.workspace=e,this.container=s,this.commentView=i,this.icon=at(Tc.IMAGE,{class:"blocklyDeleteIcon",href:`${this.workspace.options.pathToMedia}delete-icon.svg`,id:`${this.id}${Td}`},s),this.bindId=T(this.icon,"pointerdown",this,this.performAction.bind(this))}dispose(){E(this.bindId)}reposition(){const t=this.getMargin();this.icon.setAttribute("x","0");const e=this.container.getBBox();this.icon.setAttribute("y",`${t}`),this.icon.setAttribute("x",""+(e.width-this.getSize(!0).getWidth()))}performAction(t){d(),t&&t instanceof PointerEvent&&f(t)?t.stopPropagation():(this.getCommentView().dispose(),null==t||t.stopPropagation(),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this.workspace))}};({COMMENT_DELETE_BAR_BUTTON_FOCUS_IDENTIFIER:Td}).DeleteCommentBarButton=md;var Ed=class{constructor(t,e){let s;this.workspace=t,this.commentId=e,this.collapsed=!1,this.editable=!0,this.location=new _c(0,0),this.sizeChangeListeners=[],this.disposeListeners=[],this.collapseChangeListeners=[],this.resizePointerMoveListener=this.resizePointerUpListener=null,this.disposed=this.disposing=!1,this.svgRoot=at(Tc.G,{class:"blocklyComment blocklyEditable blocklyDraggable"}),this.highlightRect=this.createHighlightRect(this.svgRoot),({topBarGroup:this.topBarGroup,topBarBackground:this.topBarBackground,deleteButton:this.deleteButton,foldoutButton:this.foldoutButton,textPreview:this.textPreview,textPreviewNode:this.textPreviewNode}=this.createTopBar(this.svgRoot)),this.commentEditor=this.createTextArea(),this.resizeHandle=this.createResizeHandle(this.svgRoot,t),null==(s=t.getLayerManager())||s.append(this,nd),this.size=Ed.defaultCommentSize,this.setSizeWithoutFiringEvents(this.size),this.moveTo(new _c(0,0))}createHighlightRect(t){return at(Tc.RECT,{class:"blocklyCommentHighlight"},t)}createTopBar(t){t=at(Tc.G,{class:"blocklyCommentTopbar"},t);const e=at(Tc.RECT,{class:"blocklyCommentTopbarBackground"},t),s=new md(this.commentId,this.workspace,t,this),i=new pd(this.commentId,this.workspace,t,this);this.addDisposeListener(()=>{s.dispose(),i.dispose()});const o=at(Tc.TEXT,{class:"blocklyCommentPreview blocklyCommentText blocklyText"},t),n=document.createTextNode("");return o.appendChild(n),{topBarGroup:t,topBarBackground:e,deleteButton:s,foldoutButton:i,textPreview:o,textPreviewNode:n}}createTextArea(){const t=new _d(this.workspace,this.commentId,()=>this.svgRoot.focus());return this.svgRoot.appendChild(t.getDom()),t.addTextChangeListener((t,e)=>{this.updateTextPreview(e),this.setSize(this.size)}),t}getEditorFocusableNode(){return this.commentEditor}createResizeHandle(t,e){return t=at(Tc.IMAGE,{class:"blocklyResizeHandle",href:`${e.options.pathToMedia}resize-handle.svg`},t),T(t,"pointerdown",this,this.onResizePointerDown),t}getSvgRoot(){return this.svgRoot}getSize(){return this.collapsed?this.topBarBackground.getBBox():this.size}setSizeWithoutFiringEvents(t){const e=this.topBarBackground.getBBox(),s=this.textPreview.getBBox(),i=this.resizeHandle.getBBox();this.size=t=Ec.max(t,this.calcMinSize(e)),this.svgRoot.setAttribute("height",`${t.height}`),this.svgRoot.setAttribute("width",`${t.width}`),this.updateHighlightRect(t),this.updateTopBarSize(t),this.commentEditor.updateSize(t,e),this.deleteButton.reposition(),this.foldoutButton.reposition(),this.updateTextPreviewSize(t,e,s),this.updateResizeHandlePosition(t,i)}setSize(t){const e=this.preResizeSize||this.size;this.setSizeWithoutFiringEvents(t),this.onSizeChange(e,this.size)}calcMinSize(t){var e;this.updateTextPreview(null!=(e=this.commentEditor.getText())?e:"");let s=e=Et(this.textPreview);return this.foldoutButton.isVisible()?s+=this.foldoutButton.getSize(!0).getWidth():e&&(s+=4),this.deleteButton.isVisible()?s+=this.deleteButton.getSize(!0).getWidth():e&&(s+=4),new Ec(s,t.height+20)}updateHighlightRect(t){this.highlightRect.setAttribute("height",`${t.height}`),this.highlightRect.setAttribute("width",`${t.width}`),this.workspace.RTL&&this.highlightRect.setAttribute("x",""+-t.width)}updateTopBarSize(t){this.topBarBackground.setAttribute("width",`${t.width}`)}updateTextPreviewSize(t,e,s){e=(e.height-s.height)/2;const i=this.foldoutButton.getSize(!0),o=this.deleteButton.getSize(!0);t=t.width-i.getWidth()-o.getWidth(),this.textPreview.setAttribute("x",""+(this.workspace.RTL?-1:1)*i.getWidth()),this.textPreview.setAttribute("y",`${e+s.height/2}`),this.textPreview.setAttribute("width",`${t}`)}updateResizeHandlePosition(t,e){this.resizeHandle.setAttribute("y",""+(t.height-e.height)),this.resizeHandle.setAttribute("x",""+(t.width-e.width))}onSizeChange(t,e){for(let s=this.sizeChangeListeners.length-1;s>=0;s--)this.sizeChangeListeners[s](t,e)}addSizeChangeListener(t){this.sizeChangeListeners.push(t)}removeSizeChangeListener(t){this.sizeChangeListeners.splice(this.sizeChangeListeners.indexOf(t),1)}onResizePointerDown(t){this.isEditable()&&(this.bringToFront(),f(t)||(this.preResizeSize=this.getSize(),vo(this.workspace,t,new _c(this.workspace.RTL?-this.getSize().width:this.getSize().width,this.getSize().height)),this.resizePointerUpListener=T(document,"pointerup",this,this.onResizePointerUp),this.resizePointerMoveListener=T(document,"pointermove",this,this.onResizePointerMove),this.workspace.hideChaff()),t.stopPropagation())}onResizePointerUp(t){d(),this.resizePointerUpListener&&(E(this.resizePointerUpListener),this.resizePointerUpListener=null),this.resizePointerMoveListener&&(E(this.resizePointerMoveListener),this.resizePointerMoveListener=null),this.setSize(this.size),this.preResizeSize=void 0}onResizePointerMove(t){t=No(this.workspace,t),this.setSizeWithoutFiringEvents(new Ec(this.workspace.RTL?-t.x:t.x,t.y))}isCollapsed(){return this.collapsed}setCollapsed(t){(this.collapsed=t)?ct(this.svgRoot,"blocklyCollapsed"):ut(this.svgRoot,"blocklyCollapsed"),this.setSizeWithoutFiringEvents(this.size),this.onCollapse()}onCollapse(){for(let t=this.collapseChangeListeners.length-1;t>=0;t--)this.collapseChangeListeners[t](this.collapsed)}addOnCollapseListener(t){this.collapseChangeListeners.push(t)}removeOnCollapseListener(t){this.collapseChangeListeners.splice(this.collapseChangeListeners.indexOf(t),1)}isEditable(){return this.editable}setEditable(t){(this.editable=t)?(ct(this.svgRoot,"blocklyEditable"),ut(this.svgRoot,"blocklyReadonly")):(ut(this.svgRoot,"blocklyEditable"),ct(this.svgRoot,"blocklyReadonly")),this.commentEditor.setEditable(t)}getRelativeToSurfaceXY(){return this.location}moveTo(t){this.location=t,this.svgRoot.setAttribute("transform",`translate(${t.x}, ${t.y})`)}getText(){return this.commentEditor.getText()}setText(t){this.commentEditor.setText(t)}setPlaceholderText(t){this.commentEditor.setPlaceholderText(t)}addTextChangeListener(t){this.commentEditor.addTextChangeListener(t)}removeTextChangeListener(t){this.commentEditor.removeTextChangeListener(t)}updateTextPreview(t){this.textPreviewNode.textContent=this.truncateText(t)}truncateText(t){return t.length>=12?`${t.substring(0,9)}...`:t}bringToFront(){const t=this.svgRoot.parentNode,e=t.childNodes;e[e.length-1]!==this.svgRoot&&t.appendChild(this.svgRoot)}onDeleteDown(t){d(),f(t)||this.dispose(),t.stopPropagation()}dispose(){this.disposing=!0,pt(this.svgRoot);for(let t=this.disposeListeners.length-1;t>=0;t--)this.disposeListeners[t]();this.disposeListeners.length=0,this.disposed=!0}isDisposed(){return this.disposed}isDeadOrDying(){return this.disposing||this.disposed}addDisposeListener(t){this.disposeListeners.push(t)}removeDisposeListener(t){this.disposeListeners.splice(this.disposeListeners.indexOf(t),1)}getCommentBarButtons(){return[this.foldoutButton,this.deleteButton]}};Ed.defaultCommentSize=new Ec(120,100),Vt("\n.injectionDiv {\n --commentFillColour: #FFFCC7;\n --commentBorderColour: #F2E49B;\n}\n\n.blocklyComment .blocklyTextarea {\n background-color: var(--commentFillColour);\n border: 1px solid var(--commentBorderColour);\n box-sizing: border-box;\n display: block;\n outline: 0;\n padding: 5px;\n resize: none;\n width: 100%;\n height: 100%;\n}\n\n.blocklyReadonly.blocklyComment .blocklyTextarea {\n cursor: inherit;\n}\n\n.blocklyDeleteIcon {\n width: 20px;\n height: 20px;\n display: none;\n cursor: pointer;\n}\n\n.blocklyFoldoutIcon {\n width: 20px;\n height: 20px;\n transform-origin: 12px 12px;\n cursor: pointer;\n}\n.blocklyResizeHandle {\n width: 12px;\n height: 12px;\n cursor: se-resize;\n}\n.blocklyReadonly.blocklyComment .blocklyResizeHandle {\n cursor: inherit;\n}\n\n.blocklyCommentTopbarBackground {\n fill: var(--commentBorderColour);\n height: 24px;\n}\n\n.blocklyComment .blocklyCommentPreview.blocklyText {\n fill: #000;\n dominant-baseline: middle;\n visibility: hidden;\n}\n\n.blocklyCollapsed.blocklyComment .blocklyCommentPreview {\n visibility: visible;\n}\n\n.blocklyCollapsed.blocklyComment .blocklyCommentForeignObject,\n.blocklyCollapsed.blocklyComment .blocklyResizeHandle {\n display: none;\n}\n\n.blocklyCollapsed.blocklyComment .blocklyFoldoutIcon {\n transform: rotate(-90deg);\n}\n\n.blocklyRTL .blocklyCommentTopbar {\n transform: scale(-1, 1);\n}\n\n.blocklyRTL .blocklyCommentForeignObject {\n direction: rtl;\n}\n\n.blocklyRTL .blocklyCommentPreview {\n /* Revert the scale and control RTL using direction instead. */\n transform: scale(-1, 1);\n direction: rtl;\n}\n\n.blocklyRTL .blocklyResizeHandle {\n transform: scale(-1, 1);\n cursor: sw-resize;\n}\n\n.blocklyCommentHighlight {\n fill: none;\n}\n\n.blocklyCommentText.blocklyActiveFocus {\n border-color: #fc3;\n border-width: 2px;\n}\n\n.blocklySelected .blocklyCommentHighlight {\n stroke: #fc3;\n stroke-width: 3px;\n}\n\n.blocklyCollapsed.blocklySelected .blocklyCommentHighlight {\n stroke: none;\n}\n\n.blocklyCollapsed.blocklySelected .blocklyCommentTopbarBackground {\n stroke: #fc3;\n stroke-width: 3px;\n}\n");var bd=class{constructor(t,e){this.workspace=t,this.text="",this.collapsed=!1,this.deletable=this.movable=this.editable=!0,this.location=new _c(0,0),this.disposing=this.disposed=!1,this.id=e&&!t.getCommentById(e)?e:S(),this.size=Ed.defaultCommentSize,t.addTopComment(this),this.fireCreateEvent()}fireCreateEvent(){st()&&J(new(rt(ua.COMMENT_CREATE))(this))}fireDeleteEvent(){st()&&J(new(rt(ua.COMMENT_DELETE))(this))}fireChangeEvent(t,e){st()&&J(new(rt(ua.COMMENT_CHANGE))(this,t,e))}fireCollapseEvent(t){st()&&J(new(rt(ua.COMMENT_COLLAPSE))(this,t))}setText(t){const e=this.text;this.text=t,this.fireChangeEvent(e,t)}getText(){return this.text}setSize(t){const e=new(rt(ua.COMMENT_RESIZE))(this);this.size=t,e.recordCurrentSizeAsNewSize(),J(e)}getSize(){return this.size}setCollapsed(t){this.collapsed=t,this.fireCollapseEvent(t)}isCollapsed(){return this.collapsed}setEditable(t){this.editable=t}isEditable(){return this.isOwnEditable()&&!this.workspace.isReadOnly()}isOwnEditable(){return this.editable}setMovable(t){this.movable=t}isMovable(){return this.isOwnMovable()&&!this.workspace.isReadOnly()&&!this.workspace.isFlyout}isOwnMovable(){return this.movable}setDeletable(t){this.deletable=t}isDeletable(){return this.isOwnDeletable()&&!this.isDeadOrDying()&&!this.workspace.isReadOnly()&&!this.workspace.isFlyout}isOwnDeletable(){return this.deletable}moveTo(t,e){const s=new(rt(ua.COMMENT_MOVE))(this);e&&s.setReason(e),this.location=t,s.recordNew(),J(s)}getRelativeToSurfaceXY(){return this.location}dispose(){this.disposing=!0,this.fireDeleteEvent(),this.workspace.removeTopComment(this),this.disposed=!0}isDisposed(){return this.disposed}isDeadOrDying(){return this.disposing||this.disposed}},fd=class extends bd{constructor(t,e){super(t,e),this.dragStrategy=new ad(this),this.workspace=t,this.view=new Ed(t,this.id),this.view.setSize(this.getSize()),this.view.setEditable(this.isEditable()),this.view.getSvgRoot().setAttribute("data-id",this.id),this.view.getSvgRoot().setAttribute("id",this.id),this.addModelUpdateBindings(),T(this.view.getSvgRoot(),"pointerdown",this,this.startGesture)}addModelUpdateBindings(){this.view.addTextChangeListener((t,e)=>{super.setText(e)}),this.view.addSizeChangeListener((t,e)=>{super.setSize(e)}),this.view.addOnCollapseListener(()=>{super.setCollapsed(this.view.isCollapsed())}),this.view.addDisposeListener(()=>{this.isDeadOrDying()||this.dispose()})}setText(t){this.view.setText(t)}setPlaceholderText(t){this.view.setPlaceholderText(t)}setSize(t){this.view.setSize(t)}setCollapsed(t){this.view.setCollapsed(t)}setEditable(t){super.setEditable(t),this.view.setEditable(this.isEditable())}getSvgRoot(){return this.view.getSvgRoot()}getSize(){return super.getSize()}getBoundingRectangle(){const t=this.getRelativeToSurfaceXY();var e,s;const i=null!=(s=null==(e=this.view)?void 0:e.getSize())?s:this.getSize();return this.workspace.RTL?(e=t.x-i.width,s=t.x):(e=t.x,s=t.x+i.width),new mc(t.y,t.y+i.height,e,s)}moveBy(t,e,s){const i=this.getRelativeToSurfaceXY();t=new _c(i.x+t,i.y+e),this.moveTo(t,s)}moveTo(t,e){super.moveTo(t,e),this.view.moveTo(t)}moveDuringDrag(t){this.location=t,this.view.moveTo(t)}setDragging(t){t?ct(this.getSvgRoot(),"blocklyDragging"):ut(this.getSvgRoot(),"blocklyDragging")}dispose(){this.disposing=!0;const t=Hl.getFocusManager$$module$build$src$core$focus_manager();t.getFocusedNode()===this&&setTimeout(()=>t.focusTree(this.workspace),0),this.view.isDeadOrDying()||this.view.dispose(),super.dispose()}startGesture(t){const e=this.workspace.getGesture(t);e&&(e.handleCommentStart(t,this),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this))}setDeleteStyle(t){t?ct(this.getSvgRoot(),"blocklyDraggingDelete"):ut(this.getSvgRoot(),"blocklyDraggingDelete")}isCopyable(){return this.isOwnMovable()&&this.isOwnDeletable()}isMovable(){return this.dragStrategy.isMovable()}startDrag(){this.dragStrategy.startDrag()}drag(t){this.dragStrategy.drag(t)}endDrag(){this.dragStrategy.endDrag()}revertDrag(){this.dragStrategy.revertDrag()}select(){ct(this.getSvgRoot(),"blocklySelected"),Lt(this)}unselect(){ut(this.getSvgRoot(),"blocklySelected"),Lt(null)}toCopyData(){return{paster:qc.TYPE,commentState:Se(this,{addCoordinates:!0,saveIds:!1})}}showContextMenu(t){const e=sd.registry.getContextMenuOptions({comment:this,focusedNode:this},t);let s;s=t instanceof PointerEvent?new _c(t.clientX,t.clientY):ne(this.workspace,this.getRelativeToSurfaceXY()).translate(10,10),$o(t,e,this.workspace.RTL,this.workspace,s)}snapToGrid(){if(!this.isDeadOrDying()){var t=this.workspace.getGrid();if(null!=t&&t.shouldSnap()){var e=this.getRelativeToSurfaceXY();(t=t.alignXY(e))!==e&&this.moveTo(t,["snap"])}}}getEditorFocusableNode(){return this.view.getEditorFocusableNode()}getFocusableElement(){return this.getSvgRoot()}getFocusableTree(){return this.workspace}onNodeFocus(){let t;this.select(),null==(t=this.getSvgRoot().parentElement)||t.appendChild(this.getSvgRoot()),this.workspace.scrollBoundsIntoView(this.getBoundingRectangle())}onNodeBlur(){this.unselect()}canBeFocused(){return!0}},$d={};$d.appendDomToWorkspace=Wo,$d.blockToDom=Bo,$d.blockToDomWithXY=Do,$d.clearWorkspaceAndLoadFromXml=Go,$d.deleteNext=on,$d.domToBlock=Hl.domToBlock$$module$build$src$core$xml,$d.domToBlockInternal=Xo,$d.domToPrettyText=Ho,$d.domToText=Uo,$d.domToVariables=zo,$d.domToWorkspace=Hl.domToWorkspace$$module$build$src$core$xml,$d.loadWorkspaceComment=Vo,$d.saveWorkspaceComment=Lo,$d.variablesToDom=Mo,$d.workspaceToDom=wo;var Id=class extends jh{constructor(t){super(t),this.type=ua.BLOCK_CREATE,t&&(t.isShadow()&&(this.recordUndo=!1),this.xml=Do(t),this.ids=ot(t),this.json=$s(t,{addCoordinates:!0}))}toJson(){const t=super.toJson();if(!this.xml)throw Error("The block XML is undefined. Either pass a block to the constructor, or call fromJson");if(!this.ids)throw Error("The block IDs are undefined. Either pass a block to the constructor, or call fromJson");if(!this.json)throw Error("The block JSON is undefined. Either pass a block to the constructor, or call fromJson");return t.xml=Uo(this.xml),t.ids=this.ids,t.json=this.json,this.recordUndo||(t.recordUndo=this.recordUndo),t}static fromJson(t,e,s){return(e=jh.fromJson(t,e,null!=s?s:new Id)).xml=Hl.textToDom$$module$build$src$core$utils$xml(t.xml),e.ids=t.ids,e.json=t.json,void 0!==t.recordUndo&&(e.recordUndo=t.recordUndo),e}run(t){const e=this.getEventWorkspace_();if(!this.json)throw Error("The block JSON is undefined. Either pass a block to the constructor, or call fromJson");if(!this.ids)throw Error("The block IDs are undefined. Either pass a block to the constructor, or call fromJson");if(!Cd(e,this.ids))if(t)vs(this.json,e);else for(t=0;tt.getBlockById(e)).filter(t=>t&&t.isShadow()).length===e.length};t(zl.EVENT,ua.BLOCK_CREATE,Id);var Sd=class extends oc{constructor(t,e){super(e),this.type=ua.THEME_CHANGE,this.themeName=t}toJson(){const t=super.toJson();if(!this.themeName)throw Error("The theme name is undefined. Either pass a theme name to the constructor, or call fromJson");return t.themeName=this.themeName,t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new Sd)).themeName=t.themeName,e}};t(zl.EVENT,ua.THEME_CHANGE,Sd);var Rd=class extends oc{constructor(t,e,s,i,o){super(i),this.type=ua.VIEWPORT_CHANGE,this.viewTop=t,this.viewLeft=e,this.scale=s,this.oldScale=o}toJson(){const t=super.toJson();if(void 0===this.viewTop)throw Error("The view top is undefined. Either pass a value to the constructor, or call fromJson");if(void 0===this.viewLeft)throw Error("The view left is undefined. Either pass a value to the constructor, or call fromJson");if(void 0===this.scale)throw Error("The scale is undefined. Either pass a value to the constructor, or call fromJson");if(void 0===this.oldScale)throw Error("The old scale is undefined. Either pass a value to the constructor, or call fromJson");return t.viewTop=this.viewTop,t.viewLeft=this.viewLeft,t.scale=this.scale,t.oldScale=this.oldScale,t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new Rd)).viewTop=t.viewTop,e.viewLeft=t.viewLeft,e.scale=t.scale,e.oldScale=t.oldScale,e}};t(zl.EVENT,ua.VIEWPORT_CHANGE,Rd);var yd={fromJsonInternal:an},Od={TEST_ONLY:yd};Od.fromJson=Hl.fromJson$$module$build$src$core$field_registry,Od.register=rn,Od.unregister=ln;var kd=class extends Uu{constructor(t,e,s){super(Uu.SKIP_SETUP),this.svgArrow=this.arrow=this.imageElement=this.menu_=this.selectedMenuItem=null,this.SERIALIZABLE=!0,this.clickTarget_=this.suffixField=this.prefixField=this.generatedOptions=null,t!==Uu.SKIP_SETUP&&(this.setOptions(t),s&&this.configure_(s),e&&this.setValidator(e))}fromXml(t){this.isOptionListDynamic()&&this.getOptions(!1),this.setValue(t.textContent)}loadState(t){this.loadLegacyState(kd,t)||(this.isOptionListDynamic()&&this.getOptions(!1),this.setValue(t))}initView(){this.shouldAddBorderRect_()?this.createBorderRect_():this.clickTarget_=this.sourceBlock_.getSvgRoot(),this.createTextElement_(),this.imageElement=at(Tc.IMAGE,{},this.fieldGroup_),this.getConstants().FIELD_DROPDOWN_SVG_ARROW?this.createSVGArrow_():this.createTextArrow_(),this.borderRect_&&ct(this.borderRect_,"blocklyDropdownRect"),this.fieldGroup_&&(ct(this.fieldGroup_,"blocklyField"),ct(this.fieldGroup_,"blocklyDropdownField"))}shouldAddBorderRect_(){let t;return!this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW||this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW&&!(null!=(t=this.getSourceBlock())&&t.isShadow())}createTextArrow_(){let t,e;this.arrow=at(Tc.TSPAN,{},this.textElement_),this.arrow.appendChild(document.createTextNode(null!=(t=this.getSourceBlock())&&t.RTL?kd.ARROW_CHAR+" ":" "+kd.ARROW_CHAR)),this.getConstants().FIELD_TEXT_BASELINE_CENTER&&this.arrow.setAttribute("dominant-baseline","central"),null!=(e=this.getSourceBlock())&&e.RTL?this.getTextElement().insertBefore(this.arrow,this.textContent_):this.getTextElement().appendChild(this.arrow)}createSVGArrow_(){this.svgArrow=at(Tc.IMAGE,{height:this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE+"px",width:this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE+"px"},this.fieldGroup_),this.svgArrow.setAttributeNS(Fa,"xlink:href",this.getConstants().FIELD_DROPDOWN_SVG_ARROW_DATAURI)}showEditor_(t){var e=this.getSourceBlock();if(!e)throw new Hu;this.dropdownCreate(),this.menu_&&(this.menu_.openingCoords=t&&"number"==typeof t.clientX?new _c(t.clientX,t.clientY):null,Zs(),t=this.menu_.render(qs()),ct(t,"blocklyDropdownMenu"),this.getConstants().FIELD_DROPDOWN_COLOURED_DIV&&(e=e.getColour(),t=this.sourceBlock_.getColourTertiary(),Qs(e,t)),ei(this,this.dropdownDispose_.bind(this)),qs().style.height=`${this.menu_.getSize().height}px`,this.menu_.focus(),this.selectedMenuItem&&this.menu_.setHighlighted(this.selectedMenuItem),this.applyColour())}dropdownCreate(){const t=this.getSourceBlock();if(!t)throw new Hu;const e=new oh;e.setRole(Zc.LISTBOX),this.menu_=e;const s=this.getOptions(!1);this.selectedMenuItem=null;for(let o=0;oe[1]===t)?t:(this.sourceBlock_&&console.warn("Cannot set the dropdown's value to an unavailable option. Block type: "+this.sourceBlock_.type+", Field name: "+this.name+", Value: "+t),null)}doValueUpdate_(t){super.doValueUpdate_(t),t=this.getOptions(!0);for(let e,s=0;e=t[s];s++)e[1]===this.value_&&(this.selectedOption=e)}applyColour(){const t=this.sourceBlock_;this.borderRect_&&(this.borderRect_.setAttribute("stroke",t.getColourTertiary()),this.menu_?this.borderRect_.setAttribute("fill",t.getColourTertiary()):this.borderRect_.setAttribute("fill","transparent")),t&&this.arrow&&(t.isShadow()?this.arrow.style.fill=t.getColourSecondary():this.arrow.style.fill=t.getColour())}render_(){this.getTextContent().nodeValue="",this.imageElement.style.display="none";const t=this.selectedOption&&this.selectedOption[0];cn(t)?this.renderSelectedImage(t):this.renderSelectedText(),this.positionBorderRect_()}renderSelectedImage(t){const e=this.getSourceBlock();if(!e)throw new Hu;this.imageElement.style.display="",this.imageElement.setAttributeNS(Fa,"xlink:href",t.src),this.imageElement.setAttribute("height",String(t.height)),this.imageElement.setAttribute("width",String(t.width));const s=Number(t.height);t=Number(t.width);var i=!!this.borderRect_;const o=Math.max(i?this.getConstants().FIELD_DROPDOWN_BORDER_RECT_HEIGHT:0,s+kd.IMAGE_Y_PADDING);let n;i=i?this.getConstants().FIELD_BORDER_RECT_X_PADDING:0,n=this.svgArrow?this.positionSVGArrow(t+i,o/2-this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE/2):Et(this.arrow),this.size_=new Ec(t+n+2*i,o);let r=0;e.RTL?this.imageElement.setAttribute("x",`${i+n}`):(r=t+n,this.getTextElement().setAttribute("text-anchor","end"),this.imageElement.setAttribute("x",`${i}`)),this.imageElement.setAttribute("y",String(o/2-s/2)),this.positionTextElement_(r+i,t+n)}renderSelectedText(){this.getTextContent().nodeValue=this.getDisplayText_();var t=this.getTextElement();ct(t,"blocklyDropdownText"),t.setAttribute("text-anchor","start");var e=!!this.borderRect_;t=Math.max(e?this.getConstants().FIELD_DROPDOWN_BORDER_RECT_HEIGHT:0,this.getConstants().FIELD_TEXT_HEIGHT);const s=Et(this.getTextElement());e=e?this.getConstants().FIELD_BORDER_RECT_X_PADDING:0;let i=0;this.svgArrow&&(i=this.positionSVGArrow(s+e,t/2-this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE/2)),this.size_=new Ec(s+i+2*e,t),this.positionTextElement_(e,s)}positionSVGArrow(t,e){if(!this.svgArrow)return 0;const s=this.getSourceBlock();if(!s)throw new Hu;const i=this.borderRect_?this.getConstants().FIELD_BORDER_RECT_X_PADDING:0,o=this.getConstants().FIELD_DROPDOWN_SVG_ARROW_PADDING,n=this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE;return this.svgArrow.setAttribute("transform","translate("+(s.RTL?i:t+o)+","+e+")"),n+o}getText_(){if(!this.selectedOption)return null;const t=this.selectedOption[0];if(cn(t))return t.alt;if("undefined"!=typeof HTMLElement&&t instanceof HTMLElement){let e,s;return null!=(s=null!=(e=t.title)?e:t.ariaLabel)?s:t.innerText}return"string"==typeof t?t:(console.warn("Can't get text for existing dropdown option. If you're using HTMLElement dropdown options in node, ensure you're using jsdom-global or similar."),null)}static fromJson(t){if(!t.options)throw Error("options are required for the dropdown field. The options property must be assigned an array of [humanReadableValue, languageNeutralValue] tuples.");return new this(t.options,void 0,t)}trimOptions(t){let e=!1;const s=t.map(t=>{if(t===kd.SEPARATOR)return e=!0,t;const[s,i]=t;return"string"==typeof s?[eo(s),i]:(e=!0,[cn(s)?Object.assign({},s,{alt:eo(s.alt)}):s,i])});if(e||t.length<2)return{options:s};var i=s.map(([t])=>t),o=Ti(i);t=mi(i,o);const n=Ei(i,o);return!t&&!n||o<=t+n?{options:s}:(o=t?i[0].substring(0,t-1):void 0,i=n?i[0].substr(1-n):void 0,{options:this.applyTrim(s,t,n),prefix:o,suffix:i})}applyTrim(t,e,s){return t.map(([t,i])=>[t.substring(e,t.length-s),i])}validateOptions(t){if(!Array.isArray(t))throw TypeError("FieldDropdown options must be an array.");if(!t.length)throw TypeError("FieldDropdown options must not be an empty array.");let e=!1;for(let s=0;s0&&!!t.snap,e}static parseThemeOptions(t){return"string"==typeof(t=t.theme||Nd)?l(zl.THEME,t):t instanceof vd?t:vd.defineTheme(t.name||"builtin"+C(),t)}},Ld=class{constructor(t,e){this.bubble=t,this.workspace=e,this.startLoc=null}isMovable(){return!0}startDrag(){let t;this.startLoc=this.bubble.getRelativeToSurfaceXY(),this.workspace.setResizesEnabled(!1),null==(t=this.workspace.getLayerManager())||t.moveToDragLayer(this.bubble),this.bubble.setDragging&&this.bubble.setDragging(!0)}drag(t){this.bubble.moveDuringDrag(t)}endDrag(){let t;this.workspace.setResizesEnabled(!0),null==(t=this.workspace.getLayerManager())||t.moveOffDragLayer(this.bubble,rd),this.bubble.setDragging(!1)}revertDrag(){this.startLoc&&this.bubble.moveDuringDrag(this.startLoc)}},Md=class{constructor(t,e,s,i,o){this.workspace=t,this.anchor=e,this.ownerRect=s,this.owner=o,this.size=new Ec(0,0),this.colour="#ffffff",this.disposed=!1,this.relativeLeft=this.relativeTop=0,this.dragStrategy=new Ld(this,this.workspace),this.id=C(),this.svgRoot=at(Tc.G,{class:"blocklyBubble"},t.getBubbleCanvas()),t=at(Tc.G,{class:"blocklyEmboss"},this.svgRoot),this.tail=at(Tc.PATH,{class:"blocklyBubbleTail"},t),this.background=at(Tc.RECT,{class:"blocklyDraggable",x:0,y:0,rx:Ad.BORDER_WIDTH,ry:Ad.BORDER_WIDTH},t),this.contentContainer=at(Tc.G,{},this.svgRoot),this.focusableElement=null!=i?i:this.svgRoot,this.focusableElement.setAttribute("id",this.id),T(this.background,"pointerdown",this,this.onMouseDown),T(this.focusableElement,"keydown",this,this.onKeyDown)}dispose(){pt(this.svgRoot),this.disposed=!0}setAnchorLocation(t,e=!1){this.anchor=t,e?this.positionByRect(this.ownerRect):this.positionRelativeToAnchor(),this.renderTail()}setPositionRelativeToAnchor(t,e){this.relativeLeft=t,this.relativeTop=e,this.positionRelativeToAnchor(),this.renderTail()}getSize(){return this.size}setSize(t,e=!1){t.width=Math.max(t.width,Ad.MIN_SIZE),t.height=Math.max(t.height,Ad.MIN_SIZE),this.size=t,this.background.setAttribute("width",`${t.width}`),this.background.setAttribute("height",`${t.height}`),e?this.positionByRect(this.ownerRect):this.positionRelativeToAnchor(),this.renderTail()}getColour(){return this.colour}setColour(t){this.colour=t,this.tail.setAttribute("fill",t),this.background.setAttribute("fill",t)}onMouseDown(t){let e;null==(e=this.workspace.getGesture(t))||e.handleBubbleStart(t,this),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this)}onKeyDown(t){"Escape"===t.key&&this.owner&&(this.owner.setBubbleVisible(!1),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this.owner))}positionRelativeToAnchor(){let t=this.anchor.x;t=this.workspace.RTL?t-(this.relativeLeft+this.size.width):t+this.relativeLeft,this.moveTo(t,this.relativeTop+this.anchor.y)}moveTo(t,e){this.svgRoot.setAttribute("transform",`translate(${t}, ${e})`)}positionByRect(t=new mc(0,0,0,0)){var e=this.workspace.getMetricsManager().getViewMetrics(!0),s=this.getOptimalRelativeLeft(e),i=this.getOptimalRelativeTop(e);const o={x:s,y:-this.size.height-this.workspace.getRenderer().getConstants().MIN_BLOCK_HEIGHT},n={x:-this.size.width-30,y:i};i={x:t.getWidth(),y:i};var r={x:s,y:t.getHeight()};s=t.getWidth()t.width)return e;if(t=this.getWorkspaceViewRect(t),this.workspace.RTL){var s=this.anchor.x-e;s-this.size.widtht.right&&(e=-(t.right-this.anchor.x))}else{const i=(s=e+this.anchor.x)+this.size.width;st.right&&(e=t.right-this.anchor.x-this.size.width)}return e}getOptimalRelativeTop(t){let e=-this.size.height/4;if(this.size.height>t.height)return e;const s=this.anchor.y+e,i=s+this.size.height;return s<(t=this.getWorkspaceViewRect(t)).top?e=t.top-this.anchor.y:i>t.bottom&&(e=t.bottom-this.anchor.y-this.size.height),e}getWorkspaceViewRect(t){const e=t.top;let s=t.top+t.height,i=t.left;return t=t.left+t.width,s-=this.getScrollbarThickness(),this.workspace.RTL?i-=this.getScrollbarThickness():t-=this.getScrollbarThickness(),new mc(e,s,i,t)}getScrollbarThickness(){return Sc.scrollbarThickness/this.workspace.scale}renderTail(){const t=[];var e=this.size.width/2,s=this.size.height/2,i=-this.relativeLeft,o=-this.relativeTop;if(e===i&&s===o)t.push("M "+e+","+s);else{o-=s,i-=e,this.workspace.RTL&&(i*=-1);var n=Math.sqrt(o*o+i*i),r=Math.acos(i/n);o<0&&(r=2*Math.PI-r);var l=r+Math.PI/2;l>2*Math.PI&&(l-=2*Math.PI);var a=Math.sin(l);const c=Math.cos(l);let h=(this.size.width+this.size.height)/Ad.TAIL_THICKNESS;h=Math.min(h,this.size.width,this.size.height)/4,i=e+(l=1-Ad.ANCHOR_RADIUS/n)*i,o=s+l*o,l=e+h*c;const u=s+h*a;e-=h*c,s-=h*a,(a=r+(a=Xs(this.workspace.RTL?-Ad.TAIL_ANGLE:Ad.TAIL_ANGLE)))>2*Math.PI&&(a-=2*Math.PI),r=Math.sin(a)*n/Ad.TAIL_BEND,n=Math.cos(a)*n/Ad.TAIL_BEND,t.push("M"+l+","+u),t.push("C"+(l+n)+","+(u+r)+" "+i+","+o+" "+i+","+o),t.push("C"+i+","+o+" "+(e+n)+","+(s+r)+" "+e+","+s)}let c;t.push("z"),null==(c=this.tail)||c.setAttribute("d",t.join(" "))}bringToFront(){let t;const e=null==(t=this.svgRoot)?void 0:t.parentNode;return!(!this.svgRoot||(null==e?void 0:e.lastChild)===this.svgRoot||(null==e||e.appendChild(this.svgRoot),0))}getRelativeToSurfaceXY(){return new _c(this.workspace.RTL?-this.relativeLeft+this.anchor.x-this.size.width:this.anchor.x+this.relativeLeft,this.anchor.y+this.relativeTop)}getSvgRoot(){return this.svgRoot}moveDuringDrag(t){this.moveTo(t.x,t.y),this.relativeLeft=this.workspace.RTL?this.anchor.x-t.x-this.size.width:t.x-this.anchor.x,this.relativeTop=t.y-this.anchor.y,this.renderTail()}setDragging(t){}setDeleteStyle(t){}isDeletable(){return!1}showContextMenu(t){}isMovable(){return!0}startDrag(){this.dragStrategy.startDrag()}drag(t){this.dragStrategy.drag(t)}endDrag(){this.dragStrategy.endDrag()}revertDrag(){this.dragStrategy.revertDrag()}select(){Lt(this)}unselect(){Lt(null)}getFocusableElement(){return this.focusableElement}getFocusableTree(){return this.workspace}onNodeFocus(){this.select(),this.bringToFront();var t=this.getRelativeToSurfaceXY();const e=this.getSize();t=new mc(t.y,t.y+e.height,t.x,t.x+e.width),this.workspace.scrollBoundsIntoView(t)}onNodeBlur(){this.unselect()}canBeFocused(){return!0}getOwner(){return this.owner}};Ad=Md,Md.BORDER_WIDTH=6,Md.DOUBLE_BORDER=2*Ad.BORDER_WIDTH,Md.MIN_SIZE=Ad.DOUBLE_BORDER,Md.TAIL_THICKNESS=1,Md.TAIL_ANGLE=20,Md.TAIL_BEND=4,Md.ANCHOR_RADIUS=8;var Dd=class extends Md{constructor(t,e,s,i){let o,n;super(e,s,i),this.workspace=e,this.anchor=s,this.ownerRect=i,this.autoLayout=!0,e=new wd(t),this.validateWorkspaceOptions(e),this.svgDialog=at(Tc.SVG,{x:Md.BORDER_WIDTH,y:Md.BORDER_WIDTH},this.contentContainer),t.parentWorkspace=this.workspace,this.miniWorkspace=this.newWorkspaceSvg(new wd(t)),this.miniWorkspace.internalIsMutator=!0,t=this.miniWorkspace.createDom("blocklyMutatorBackground"),this.svgDialog.appendChild(t),e.languageTree&&(t.insertBefore(this.miniWorkspace.addFlyout(Tc.G),this.miniWorkspace.getCanvas()),null==(t=this.miniWorkspace.getFlyout())||t.init(this.miniWorkspace),null==t||t.show(e.languageTree)),ct(this.svgRoot,"blocklyMiniWorkspaceBubble"),this.miniWorkspace.addChangeListener(this.onWorkspaceChange.bind(this)),null==(o=this.miniWorkspace.getFlyout())||null==(n=o.getWorkspace())||n.addChangeListener(this.onWorkspaceChange.bind(this)),this.updateBubbleSize()}dispose(){this.miniWorkspace.dispose(),super.dispose()}getWorkspace(){return this.miniWorkspace}addWorkspaceChangeListener(t){this.miniWorkspace.addChangeListener(t)}validateWorkspaceOptions(t){if(t.hasCategories)throw Error("The miniworkspace bubble does not support toolboxes with categories");if(t.hasTrashcan)throw Error("The miniworkspace bubble does not support trashcans");if(t.zoomOptions.controls||t.zoomOptions.wheel||t.zoomOptions.pinch)throw Error("The miniworkspace bubble does not support zooming");if(t.moveOptions.scrollbars||t.moveOptions.wheel||t.moveOptions.drag)throw Error("The miniworkspace bubble does not scrolling/moving the workspace");if(t.horizontalLayout)throw Error("The miniworkspace bubble does not support horizontal layouts")}onWorkspaceChange(){this.bumpBlocksIntoBounds(),this.updateBubbleSize()}bumpBlocksIntoBounds(){if(!this.miniWorkspace.isDragging()||this.miniWorkspace.keyboardMoveInProgress)for(const t of this.miniWorkspace.getTopBlocks(!1)){const e=t.getRelativeToSurfaceXY();if(e.y<20&&t.moveBy(0,20-e.y),t.RTL){let s=-20;const i=this.miniWorkspace.getFlyout();i&&(s-=i.getWidth()),e.x>s&&t.moveBy(s-e.x,0)}else e.x<20&&t.moveBy(20-e.x,0)}}updateBubbleSize(){if(!this.miniWorkspace.isDragging()||this.miniWorkspace.keyboardMoveInProgress){this.autoLayout&&(this.autoLayout=!this.miniWorkspace.keyboardMoveInProgress);var t=this.getSize(),e=this.calculateWorkspaceSize();Math.abs(t.width-e.width)({kind:"block",type:t}))}),e}getAnchorLocation(){return _c.sum(this.workspaceLocation,new _c(8.5,8.5))}getBubbleOwnerRect(){const t=this.sourceBlock.getSvgRoot().getBBox();return new mc(t.y,t.y+t.height,t.x,t.x+t.width)}createRootBlock(){if(!this.sourceBlock.decompose)throw Error("Blocks with mutator icons must include a decompose method");for(var t of(this.rootBlock=this.sourceBlock.decompose(this.miniWorkspaceBubble.getWorkspace()),this.rootBlock.getDescendants(!1)))t.queueRender();let e,s,i,o;this.rootBlock.setMovable(!1),this.rootBlock.setDeletable(!1),t=null!=(o=null==(e=this.miniWorkspaceBubble)||null==(s=e.getWorkspace())||null==(i=s.getFlyout())?void 0:i.getWidth())?o:0,this.rootBlock.moveBy(this.rootBlock.RTL?-(t+16):16,16)}addSaveConnectionsListener(){this.sourceBlock.saveConnections&&this.rootBlock&&(this.saveConnectionsListener=()=>{this.sourceBlock.saveConnections&&this.rootBlock&&this.sourceBlock.saveConnections(this.rootBlock)},this.saveConnectionsListener(),this.sourceBlock.workspace.addChangeListener(this.saveConnectionsListener))}createMiniWorkspaceChangeListener(){return t=>{Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon.isIgnorableMutatorEvent(t)||this.updateWorkspacePid||(this.updateWorkspacePid=setTimeout(()=>{this.updateWorkspacePid=null,this.recomposeSourceBlock()},0))}}static isIgnorableMutatorEvent(t){return t.isUiEvent||R(t)||O(t)&&"disabled"===t.element}recomposeSourceBlock(){if(this.rootBlock){if(!this.sourceBlock.compose)throw Error("Blocks with mutator icons must include a compose method");var t=Hl.getGroup$$module$build$src$core$events$utils();t||Hl.setGroup$$module$build$src$core$events$utils(!0);var e=Jh.getExtraBlockState_(this.sourceBlock);this.sourceBlock.compose(this.rootBlock);var s=Jh.getExtraBlockState_(this.sourceBlock);e!==s&&J(new(rt(ua.BLOCK_CHANGE))(this.sourceBlock,"mutation",null,e,s)),Hl.setGroup$$module$build$src$core$events$utils(t)}}getWorkspace(){let t;return null==(t=this.miniWorkspaceBubble)?void 0:t.getWorkspace()}},Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon.TYPE=Kh.MUTATOR,Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon.WEIGHT=1,Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon;var Pd=Object.create(null),Bd={allExtensions:Pd};Hl.register$$module$build$src$core$extensions("parent_tooltip_when_inline",Cn);var Fd,Ud={TEST_ONLY:Bd};Ud.apply=dn,Ud.buildTooltipForDropdown=Hl.buildTooltipForDropdown$$module$build$src$core$extensions,Ud.buildTooltipWithFieldText=Hl.buildTooltipWithFieldText$$module$build$src$core$extensions,Ud.isRegistered=un,Ud.register=Hl.register$$module$build$src$core$extensions,Ud.registerMixin=Hl.registerMixin$$module$build$src$core$extensions,Ud.registerMutator=Hl.registerMutator$$module$build$src$core$extensions,Ud.runAfterPageLoad=$n,Ud.unregister=hn,function(t){t[t.WIN_KEY_FF_LINUX=0]="WIN_KEY_FF_LINUX",t[t.MAC_ENTER=3]="MAC_ENTER",t[t.BACKSPACE=8]="BACKSPACE",t[t.TAB=9]="TAB",t[t.NUM_CENTER=12]="NUM_CENTER",t[t.ENTER=13]="ENTER",t[t.SHIFT=16]="SHIFT",t[t.CTRL=17]="CTRL",t[t.ALT=18]="ALT",t[t.PAUSE=19]="PAUSE",t[t.CAPS_LOCK=20]="CAPS_LOCK",t[t.ESC=27]="ESC",t[t.SPACE=32]="SPACE",t[t.PAGE_UP=33]="PAGE_UP",t[t.PAGE_DOWN=34]="PAGE_DOWN",t[t.END=35]="END",t[t.HOME=36]="HOME",t[t.LEFT=37]="LEFT",t[t.UP=38]="UP",t[t.RIGHT=39]="RIGHT",t[t.DOWN=40]="DOWN",t[t.PLUS_SIGN=43]="PLUS_SIGN",t[t.PRINT_SCREEN=44]="PRINT_SCREEN",t[t.INSERT=45]="INSERT",t[t.DELETE=46]="DELETE",t[t.ZERO=48]="ZERO",t[t.ONE=49]="ONE",t[t.TWO=50]="TWO",t[t.THREE=51]="THREE",t[t.FOUR=52]="FOUR",t[t.FIVE=53]="FIVE",t[t.SIX=54]="SIX",t[t.SEVEN=55]="SEVEN",t[t.EIGHT=56]="EIGHT",t[t.NINE=57]="NINE",t[t.FF_SEMICOLON=59]="FF_SEMICOLON",t[t.FF_EQUALS=61]="FF_EQUALS",t[t.FF_DASH=173]="FF_DASH",t[t.FF_HASH=163]="FF_HASH",t[t.QUESTION_MARK=63]="QUESTION_MARK",t[t.AT_SIGN=64]="AT_SIGN",t[t.A=65]="A",t[t.B=66]="B",t[t.C=67]="C",t[t.D=68]="D",t[t.E=69]="E",t[t.F=70]="F",t[t.G=71]="G",t[t.H=72]="H",t[t.I=73]="I",t[t.J=74]="J",t[t.K=75]="K",t[t.L=76]="L",t[t.M=77]="M",t[t.N=78]="N",t[t.O=79]="O",t[t.P=80]="P",t[t.Q=81]="Q",t[t.R=82]="R",t[t.S=83]="S",t[t.T=84]="T",t[t.U=85]="U",t[t.V=86]="V",t[t.W=87]="W",t[t.X=88]="X",t[t.Y=89]="Y",t[t.Z=90]="Z",t[t.META=91]="META",t[t.WIN_KEY_RIGHT=92]="WIN_KEY_RIGHT",t[t.CONTEXT_MENU=93]="CONTEXT_MENU",t[t.NUM_ZERO=96]="NUM_ZERO",t[t.NUM_ONE=97]="NUM_ONE",t[t.NUM_TWO=98]="NUM_TWO",t[t.NUM_THREE=99]="NUM_THREE",t[t.NUM_FOUR=100]="NUM_FOUR",t[t.NUM_FIVE=101]="NUM_FIVE",t[t.NUM_SIX=102]="NUM_SIX",t[t.NUM_SEVEN=103]="NUM_SEVEN",t[t.NUM_EIGHT=104]="NUM_EIGHT",t[t.NUM_NINE=105]="NUM_NINE",t[t.NUM_MULTIPLY=106]="NUM_MULTIPLY",t[t.NUM_PLUS=107]="NUM_PLUS",t[t.NUM_MINUS=109]="NUM_MINUS",t[t.NUM_PERIOD=110]="NUM_PERIOD",t[t.NUM_DIVISION=111]="NUM_DIVISION",t[t.F1=112]="F1",t[t.F2=113]="F2",t[t.F3=114]="F3",t[t.F4=115]="F4",t[t.F5=116]="F5",t[t.F6=117]="F6",t[t.F7=118]="F7",t[t.F8=119]="F8",t[t.F9=120]="F9",t[t.F10=121]="F10",t[t.F11=122]="F11",t[t.F12=123]="F12",t[t.NUMLOCK=144]="NUMLOCK",t[t.SCROLL_LOCK=145]="SCROLL_LOCK",t[t.FIRST_MEDIA_KEY=166]="FIRST_MEDIA_KEY",t[t.LAST_MEDIA_KEY=183]="LAST_MEDIA_KEY",t[t.SEMICOLON=186]="SEMICOLON",t[t.DASH=189]="DASH",t[t.EQUALS=187]="EQUALS",t[t.COMMA=188]="COMMA",t[t.PERIOD=190]="PERIOD",t[t.SLASH=191]="SLASH",t[t.APOSTROPHE=192]="APOSTROPHE",t[t.TILDE=192]="TILDE",t[t.SINGLE_QUOTE=222]="SINGLE_QUOTE",t[t.OPEN_SQUARE_BRACKET=219]="OPEN_SQUARE_BRACKET",t[t.BACKSLASH=220]="BACKSLASH",t[t.CLOSE_SQUARE_BRACKET=221]="CLOSE_SQUARE_BRACKET",t[t.WIN_KEY=224]="WIN_KEY",t[t.MAC_FF_META=224]="MAC_FF_META",t[t.MAC_WK_CMD_LEFT=91]="MAC_WK_CMD_LEFT",t[t.MAC_WK_CMD_RIGHT=93]="MAC_WK_CMD_RIGHT",t[t.WIN_IME=229]="WIN_IME",t[t.VK_NONAME=252]="VK_NONAME",t[t.PHANTOM=255]="PHANTOM",t[t.CTRL_CMD=ma||Ta||_a?t.MAC_WK_CMD_LEFT:t.CTRL]="CTRL_CMD"}(Fd||(Fd={}));var Hd={};Hd.arc=Nn,Hd.curve=Rn,Hd.line=An,Hd.lineOnAxis=vn,Hd.lineTo=kn,Hd.moveBy=On,Hd.moveTo=yn,Hd.point=Sn;var Gd={};Gd.Coordinate=_c,Gd.KeyCodes=Fd,Gd.Rect=mc,Gd.Size=Ec,Gd.Svg=Tc,Gd.aria=sh,Gd.array=lc,Gd.browserEvents=Ia,Gd.colour=Bu,Gd.deprecation=Mh,Gd.dom=Va,Gd.extensions=Ud,Gd.idGenerator=Oa,Gd.math=qh,Gd.object=Ka,Gd.parsing=Fu,Gd.string=mu,Gd.style=fc,Gd.svgMath=Cc,Gd.svgPaths=Hd,Gd.toolbox=Uc,Gd.userAgent=ba,Gd.xml=wc;var Vd,Wd=class extends Md{constructor(t,e,s,i){super(t,e,s,void 0,i),this.workspace=t,this.anchor=e,this.ownerRect=s,this.owner=i,this.resizePointerMoveListener=this.resizePointerUpListener=null,this.sizeChangeListeners=[],this.locationChangeListeners=[],this.DEFAULT_SIZE=new Ec(160+Md.DOUBLE_BORDER,80+Md.DOUBLE_BORDER),this.MIN_SIZE=new Ec(45+Md.DOUBLE_BORDER,20+Md.DOUBLE_BORDER),this.editable=!0,ct(this.svgRoot,"blocklyTextInputBubble"),this.editor=new _d(t,this.id,()=>{Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this)}),this.contentContainer.appendChild(this.editor.getDom()),this.resizeGroup=this.createResizeHandle(this.svgRoot,t),this.setSize(this.DEFAULT_SIZE,!0)}getText(){return this.editor.getText()}setText(t){this.editor.setText(t)}setEditable(t){this.editable=t,this.editor.setEditable(t)}isEditable(){return this.editable}addTextChangeListener(t){this.editor.addTextChangeListener(t)}addSizeChangeListener(t){this.sizeChangeListeners.push(t)}addLocationChangeListener(t){this.locationChangeListeners.push(t)}createResizeHandle(t,e){return t=at(Tc.IMAGE,{class:"blocklyResizeHandle",href:`${e.options.pathToMedia}resize-handle.svg`},t),T(t,"pointerdown",this,this.onResizePointerDown),t}setSize(t,e=!1){t.width=Math.max(t.width,this.MIN_SIZE.width),t.height=Math.max(t.height,this.MIN_SIZE.height);const s=t.width-Md.DOUBLE_BORDER,i=t.height-Md.DOUBLE_BORDER;this.editor.updateSize(new Ec(s,i),new Ec(0,0)),this.editor.getDom().setAttribute("x",""+Md.DOUBLE_BORDER/2),this.editor.getDom().setAttribute("y",""+Md.DOUBLE_BORDER/2),this.resizeGroup.setAttribute("y",`${i}`),this.workspace.RTL?this.resizeGroup.setAttribute("x",""+-Md.DOUBLE_BORDER):this.resizeGroup.setAttribute("x",`${s}`),super.setSize(t,e),this.onSizeChange()}getSize(){return super.getSize()}moveDuringDrag(t){super.moveDuringDrag(t),this.onLocationChange()}setPositionRelativeToAnchor(t,e){super.setPositionRelativeToAnchor(t,e),this.onLocationChange()}positionByRect(t=new mc(0,0,0,0)){super.positionByRect(t),this.onLocationChange()}onResizePointerDown(t){this.bringToFront(),f(t)||(vo(this.workspace,t,new _c(this.workspace.RTL?-this.getSize().width:this.getSize().width,this.getSize().height)),this.resizePointerUpListener=T(document,"pointerup",this,this.onResizePointerUp),this.resizePointerMoveListener=T(document,"pointermove",this,this.onResizePointerMove),this.workspace.hideChaff()),t.stopPropagation()}onResizePointerUp(t){d(),this.resizePointerUpListener&&(E(this.resizePointerUpListener),this.resizePointerUpListener=null),this.resizePointerMoveListener&&(E(this.resizePointerMoveListener),this.resizePointerMoveListener=null)}onResizePointerMove(t){t=No(this.workspace,t),this.setSize(new Ec(this.workspace.RTL?-t.x:t.x,t.y),!1),this.onSizeChange()}onSizeChange(){for(const t of this.sizeChangeListeners)t()}onLocationChange(){for(const t of this.locationChangeListeners)t()}getEditor(){return this.editor}};Vt("\n.blocklyTextInputBubble .blocklyTextarea {\n background-color: var(--commentFillColour);\n border: 0;\n box-sizing: border-box;\n display: block;\n outline: 0;\n padding: 5px;\n resize: none;\n width: 100%;\n height: 100%;\n}\n"),function(t){t[t.INPUT_VALUE=1]="INPUT_VALUE",t[t.OUTPUT_VALUE=2]="OUTPUT_VALUE",t[t.NEXT_STATEMENT=3]="NEXT_STATEMENT",t[t.PREVIOUS_STATEMENT=4]="PREVIOUS_STATEMENT"}(Vd||(Vd={}));var Xd=class{constructor(t){this.connectionChecker=t,this.connections=[]}addConnection(t,e){e=this.calculateIndexForYPos(e),this.connections.splice(e,0,t)}findIndexOfConnection(t,e){if(!this.connections.length)return-1;const s=this.calculateIndexForYPos(e);if(s>=this.connections.length)return-1;e=t.y;let i=s;for(;i>=0&&this.connections[i].y===e;){if(this.connections[i]===t)return i;i--}for(i=s;it)){e=i;break}s=i}}return e}removeConnection(t,e){if(-1===(t=this.findIndexOfConnection(t,e)))throw Error("Unable to find connection in connectionDB.");this.connections.splice(t,1)}getNeighbours(t,e){function s(t){const s=o-i[t].x,r=n-i[t].y;return Math.sqrt(s*s+r*r)<=e&&a.push(i[t]),r=0&&s(t);)t--;do{r++}while(r=0&&this.isInYRange(a,t.y,e);)r=this.connections[a],this.connectionChecker.canConnect(t,r,!0,l)&&(s=r,l=r.distanceFrom(t)),a--;for(;nthis.fieldRow.length)throw Error("index "+t+" out of bounds.");return e||""===e&&s?("string"==typeof e&&(e=Hl.fromJson$$module$build$src$core$field_registry({type:"field_label",text:e})),e.setSourceBlock(this.sourceBlock),this.sourceBlock.initialized&&this.initField(e),e.name=s,e.setVisible(this.isVisible()),e.prefixField&&(t=this.insertFieldAt(t,e.prefixField)),this.fieldRow.splice(t,0,e),t++,e.suffixField&&(t=this.insertFieldAt(t,e.suffixField)),this.sourceBlock.rendered&&this.sourceBlock.queueRender(),t):t}removeField(t,e){for(let e,s=0;e=this.fieldRow[s];s++)if(e.name===t)return e.dispose(),this.fieldRow.splice(s,1),this.sourceBlock.rendered&&this.sourceBlock.queueRender(),!0;if(e)return!1;throw Error('Field "'+t+'" not found.')}isVisible(){return this.visible}setVisible(t){let e=[];if(this.visible===t)return e;this.visible=t;for(let e,s=0;e=this.fieldRow[s];s++)e.setVisible(t);if(this.connection&&this.connection instanceof ep){t?e=this.connection.startTrackingAll():this.connection.stopTrackingAll();const s=this.connection.targetBlock();s&&(s.getSvgRoot().style.display=t?"block":"none")}return e}markDirty(){for(let t,e=0;t=this.fieldRow[e];e++)t.markDirty()}setCheck(t){if(!this.connection)throw Error("This input does not have a connection.");return this.connection.setCheck(t),this}setAlign(t){return this.align=t,this.sourceBlock.rendered&&this.sourceBlock.queueRender(),this}setShadowDom(t){if(!this.connection)throw Error("This input does not have a connection.");return this.connection.setShadowDom(t),this}getShadowDom(){if(!this.connection)throw Error("This input does not have a connection.");return this.connection.getShadowDom()}init(){for(const t of this.fieldRow)t.init()}initModel(){for(const t of this.fieldRow)t.initModel()}initField(t){this.sourceBlock.rendered?t.init():t.initModel()}dispose(){for(let t,e=0;t=this.fieldRow[e];e++)t.dispose();this.connection&&this.connection.dispose()}makeConnection(t){return this.sourceBlock.makeConnection_(t)}},np=class extends op{constructor(t,e){super(t,e),this.name=t,this.type=Hl.inputTypes$$module$build$src$core$inputs$input_types.DUMMY}},rp=class extends op{constructor(t,e){super(t,e),this.name=t,this.type=Hl.inputTypes$$module$build$src$core$inputs$input_types.END_ROW}},lp=class extends op{constructor(t,e){if(!t)throw Error("Statement inputs must have a non-empty name");super(t,e),this.name=t,this.type=Hl.inputTypes$$module$build$src$core$inputs$input_types.STATEMENT,this.connection=this.makeConnection(Vd.NEXT_STATEMENT)}};Hl.ValueInput$$module$build$src$core$inputs$value_input=class extends op{constructor(t,e){if(!t)throw Error("Value inputs must have a non-empty name");super(t,e),this.name=t,this.type=Hl.inputTypes$$module$build$src$core$inputs$input_types.VALUE,this.connection=this.makeConnection(Vd.INPUT_VALUE)}},Hl.ValueInput$$module$build$src$core$inputs$value_input;var ap=class{constructor(t,e,s){if(this.data=null,this.disposed=!1,this.hue=null,this.colour_="#000000",this.styleName_="",this.suppressPrefixSuffix=!1,this.previousConnection=this.nextConnection=this.outputConnection=null,this.inputList=[],this.icons=[],this.disabledReasons=new Set,this.tooltip="",this.contextMenu=!0,this.parentBlock_=null,this.childBlocks_=[],this.editable=this.movable=this.deletable=!0,this.collapsed_=this.shadow=!1,this.outputShape_=null,this.rendered=this.isInsertionMarker_=this.initialized=this.disposing=!1,this.onchangeWrapper=this.helpUrl=null,this.statementInputCount=0,this.workspace=t,this.id=s&&!t.getBlockById(s)?s:S(),t.setBlockById(this.id,this),this.xy=new _c(0,0),this.isInFlyout=t.isFlyout,this.isInMutator=t.isMutator,this.RTL=t.RTL,e){if(this.type=e,!(s=oa[e])||"object"!=typeof s)throw TypeError("Invalid block definition for type: "+e);Object.assign(this,s)}t.addTopBlock(this),t.addTypedBlock(this),new.target===ap&&this.doInit_()}doInit_(){const t=Hl.getGroup$$module$build$src$core$events$utils();t||Hl.setGroup$$module$build$src$core$events$utils(!0);const e=j();try{"function"==typeof this.init&&(Hl.setRecordUndo$$module$build$src$core$events$utils(!1),this.init(),Hl.setRecordUndo$$module$build$src$core$events$utils(e)),st()&&J(new(rt(ua.BLOCK_CREATE))(this))}finally{Hl.setGroup$$module$build$src$core$events$utils(t),Hl.setRecordUndo$$module$build$src$core$events$utils(e)}this.inputsInlineDefault=this.inputsInline,"function"==typeof this.onchange&&this.setOnChange(this.onchange)}dispose(t=!1){this.disposing=!0,this.onchangeWrapper&&this.workspace.removeChangeListener(this.onchangeWrapper),this.unplug(t),st()&&J(new(rt(ua.BLOCK_DELETE))(this)),this.workspace.removeTopBlock(this),this.disposeInternal()}disposeInternal(){this.disposing=!0,this.onchangeWrapper&&this.workspace.removeChangeListener(this.onchangeWrapper),this.workspace.removeTypedBlock(this),this.workspace.removeBlockById(this.id),"function"==typeof this.destroy&&this.destroy(),this.childBlocks_.forEach(t=>t.disposeInternal()),this.inputList.forEach(t=>t.dispose()),this.inputList.length=0,this.getConnections_(!0).forEach(t=>t.dispose()),this.disposed=!0}isDeadOrDying(){return this.disposing||this.disposed}initModel(){if(!this.initialized){for(const t of this.inputList)t.initModel();this.initialized=!0}}unplug(t){this.outputConnection&&this.unplugFromRow(t),this.previousConnection&&this.unplugFromStack(t)}unplugFromRow(t){let e,s=null;null!=(e=this.outputConnection)&&e.isConnected()&&(s=this.outputConnection.targetConnection,this.outputConnection.disconnect()),s&&t&&(t=this.getOnlyValueConnection())&&t.isConnected()&&!t.targetBlock().isShadow()&&(null==(t=t.targetConnection)||t.disconnect(),this.workspace.connectionChecker.canConnect(t,s,!1)?s.connect(t):null==t||t.onFailedConnect(s))}getOnlyValueConnection(){let t=null;for(let e=0;e1)return!1;return!0}getMatchingConnection(t,e){const s=this.getConnections_(!0);if(t=t.getConnections_(!0),s.length!==t.length)throw Error("Connection lists did not match in length.");for(let i=0;i(t=t+("("===s||")"===e?"":" ")+e,s=e[e.length-1],t),"")).trim()||"???",t&&e.length>t&&(e=e.substring(0,t-3)+"..."),e}toTokens(t="?"){const e=[];for(const i of this.inputList)if(i.name!=rh){for(const t of i.fieldRow)e.push(t.getText());if(i.connection){const o=i.connection.targetBlock();if(o){var s=i.connection;let n=s.getCheck();!n&&s.targetConnection&&(n=s.targetConnection.getCheck()),(s=!!n&&(n.includes("Boolean")||n.includes("Number")))&&e.push("("),e.push(...o.toTokens(t)),s&&e.push(")")}else e.push(t)}}return e}appendValueInput(t){return this.appendInput(new Hl.ValueInput$$module$build$src$core$inputs$value_input(t,this))}appendStatementInput(t){return this.statementInputCount++,this.appendInput(new lp(t,this))}appendDummyInput(t=""){return this.appendInput(new np(t,this))}appendEndRowInput(t=""){return this.appendInput(new rp(t,this))}appendInput(t){return this.inputList.push(t),t}appendInputFromRegistry(t,e){return(t=r(zl.INPUT,t,!1))?this.appendInput(new t(e,this)):null}jsonInit(t){var e=t.type?'Block "'+t.type+'": ':"";if(t.output&&t.previousStatement)throw Error(e+"Must not have both an output and a previousStatement.");for(var s=0;t["args"+s];){if(void 0===t["message"+s])throw Error(e+`args${s} must have a corresponding message (message${s}).`);s++}if(t.style&&t.style.hat&&(this.hat=t.style.hat,t.style=null),t.style&&t.colour)throw Error(e+"Must not have both a colour and a style.");for(t.style?this.jsonInitStyle(t,e):this.jsonInitColour(t,e),s=0;void 0!==t["message"+s];)this.interpolate(t["message"+s],t["args"+s]||[],t["implicitAlign"+s]||t["lastDummyAlign"+s],e),s++;if(void 0!==t.inputsInline&&(Hl.disable$$module$build$src$core$events$utils(),this.setInputsInline(t.inputsInline),Hl.enable$$module$build$src$core$events$utils()),void 0!==t.output&&this.setOutput(!0,t.output),void 0!==t.outputShape&&this.setOutputShape(t.outputShape),void 0!==t.previousStatement&&this.setPreviousStatement(!0,t.previousStatement),void 0!==t.nextStatement&&this.setNextStatement(!0,t.nextStatement),void 0!==t.tooltip&&(s=eo(t.tooltip),this.setTooltip(s)),void 0!==t.enableContextMenu&&(this.contextMenu=!!t.enableContextMenu),void 0!==t.suppressPrefixSuffix&&(this.suppressPrefixSuffix=!!t.suppressPrefixSuffix),void 0!==t.helpUrl&&(s=eo(t.helpUrl),this.setHelpUrl(s)),"string"==typeof t.extensions&&(console.warn(e+"JSON attribute 'extensions' should be an array of strings. Found raw string in JSON for '"+t.type+"' block."),t.extensions=[t.extensions]),void 0!==t.mutator&&dn(t.mutator,this,!0),t=t.extensions,Array.isArray(t))for(e=0;ee)throw Error('Block "'+this.type+'": Message index %'+n+" out of range.");if(s[n])throw Error('Block "'+this.type+'": Message index %'+n+" duplicated.");s[n]=!0,i++}}if(i!==e)throw Error('Block "'+this.type+'": Message does not reference all '+e+" arg(s).")}interpolateArguments(t,e,s){const i=[];for(let n=0;n=this.inputList.length)throw RangeError("Input index "+t+" out of bounds.");if(e>this.inputList.length)throw RangeError("Reference input "+e+" out of bounds.");const s=this.inputList[t];this.inputList.splice(t,1),tt.getWeight()-e.getWeight()),t}removeIcon(t){if(!this.hasIcon(t))return!1;let e;return null==(e=this.getIcon(t))||e.dispose(),this.icons=this.icons.filter(e=>!e.getType().equals(t)),!0}hasIcon(t){return this.icons.some(e=>e.getType().equals(t))}getIcon(t){return t instanceof Kh?this.icons.find(e=>e.getType().equals(t)):this.icons.find(e=>e.getType().toString()===t)}getIcons(){return[...this.icons]}getRelativeToSurfaceXY(){return this.xy}moveBy(t,e,s){if(this.parentBlock_)throw Error("Block has parent");const i=new(rt(ua.BLOCK_MOVE))(this);s&&i.setReason(s),this.xy.translate(t,e),i.recordNew(),J(i)}makeConnection_(t){return new Kd(this,t)}allInputsFilled(t){if(void 0===t&&(t=!0),!t&&this.isShadow())return!1;for(let s,i=0;s=this.inputList[i];i++)if(s.connection){var e=s.connection.targetBlock();if(!e||!e.allInputsFilled(t))return!1}return!(e=this.getNextBlock())||e.allInputsFilled(t)}toDevString(){let t=this.type?'"'+this.type+'" block':"Block";return this.id&&(t+=' (id="'+this.id+'")'),t}};ap.COLLAPSED_INPUT_NAME=rh,ap.COLLAPSED_FIELD_NAME=lh;var cp=null,hp=null,up={};up.connectionUiEffect=Fn,up.disconnectUiEffect=Un,up.disconnectUiStop=Gn,up.disposeUiEffect=Pn;var dp=class{paste(t,e,s){if(!e.isCapacityAvailable(t.typeCounts))return null;let i;s&&(t.blockState.x=s.x,t.blockState.y=s.y),s=s||new _c(t.blockState.x||0,t.blockState.y||0),Hl.disable$$module$build$src$core$events$utils();try{i=vs(t.blockState,e),Vn(i,s)}finally{Hl.enable$$module$build$src$core$events$utils()}if(!i)return i;st()&&!i.isShadow()&&J(new(rt(ua.BLOCK_CREATE))(i));const o=i;return Me().then(()=>Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(o)),i}};dp.TYPE="block",ye(dp.TYPE,new dp);var pp={};pp.BlockPaster=dp,pp.moveBlockToNotConflict=Vn;var gp={};gp.bumpIntoBounds=zn,gp.bumpIntoBoundsHandler=Yn,gp.bumpTopObjectsIntoBounds=jn;var _p=class{constructor(t){this.block=t,this.connectionPreviewer=this.connectionCandidate=this.startLoc=this.startChildConn=this.startParentConn=null,this.dragging=!1,this.dragOffset=new _c(0,0),this.originalEventGroup="",this.workspace=t.workspace}isMovable(){if(this.block.isShadow()){let t,e;return null!=(e=null==(t=this.block.getParent())?void 0:t.isMovable())&&e}return this.block.isOwnMovable()&&!this.block.isDeadOrDying()&&!this.workspace.isReadOnly()&&!this.block.isInFlyout}startDrag(t){var e;this.block.isShadow()?this.startDraggingShadow(t):(this.dragging=!0,this.fireDragStartEvent(),this.startLoc=this.block.getRelativeToSurfaceXY(),this.connectionCandidate=null,this.connectionPreviewer=new(c(zl.CONNECTION_PREVIEWER,this.workspace.options))(this.block),Tt(),this.workspace.setResizesEnabled(!1),Gn(),t=this.shouldHealStack(t),this.shouldDisconnect(t)&&this.disconnectBlock(t),this.block.setDragging(!0),null==(e=this.workspace.getLayerManager())||e.moveToDragLayer(this.block),this.getVisibleBubbles(this.block).forEach(t=>{let e;null==(e=this.workspace.getLayerManager())||e.moveToDragLayer(t,!1)}))}getVisibleBubbles(t){return t.getDescendants(!1).flatMap(t=>t.getIcons()).filter(t=>Ws(t)&&t.bubbleIsVisible()).map(t=>t.getBubble()).filter(t=>!!t).sort((t,e)=>(t=t.getSvgRoot().compareDocumentPosition(e.getSvgRoot()))&Node.DOCUMENT_POSITION_PRECEDING?1:t&Node.DOCUMENT_POSITION_FOLLOWING?-1:0)}shouldHealStack(t){return!!t&&(t.altKey||t.ctrlKey||t.metaKey)}startDraggingShadow(t){const e=this.block.getParent();if(!e)throw Error("Tried to drag a shadow block with no parent. Shadow blocks should always have parents.");this.dragOffset=_c.difference(e.getRelativeToSurfaceXY(),this.block.getRelativeToSurfaceXY()),e.startDrag(t)}shouldDisconnect(t){return!!(this.block.getParent()||t&&this.block.nextConnection&&this.block.nextConnection.targetBlock())}disconnectBlock(t){let e,s,i;if(this.startParentConn=null!=(i=null==(e=this.block.outputConnection)?void 0:e.targetConnection)?i:null==(s=this.block.previousConnection)?void 0:s.targetConnection,t){let t;this.startChildConn=null==(t=this.block.nextConnection)?void 0:t.targetConnection}this.block.unplug(t),Un(this.block)}fireDragStartEvent(){const t=new(rt(ua.BLOCK_DRAG))(this.block,!0,this.block.getDescendants(!1));J(t)}fireDragEndEvent(){const t=new(rt(ua.BLOCK_DRAG))(this.block,!1,this.block.getDescendants(!1));J(t)}fireMoveEvent(){if(!this.block.isDeadOrDying()){var t=new(rt(ua.BLOCK_MOVE))(this.block);t.setReason(["drag"]),t.oldCoordinate=this.startLoc,t.recordNew(),J(t)}}drag(t){if(this.block.isShadow()){let e;null==(e=this.block.getParent())||e.drag(_c.sum(t,this.dragOffset))}else this.block.moveDuringDrag(t),this.updateConnectionPreview(this.block,_c.difference(t,this.startLoc))}updateConnectionPreview(t,e){var s=this.connectionCandidate;const i=this.getConnectionCandidate(t,e);if(i){this.connectionCandidate=e=s&&this.currCandidateIsBetter(s,e,i)?s:i;var o,{local:n,neighbour:r}=e;if(e=n.type===Vd.OUTPUT_VALUE||n.type===Vd.PREVIOUS_STATEMENT,s=r.isConnected()&&!(null!=(o=r.targetBlock())&&o.isInsertionMarker()),e&&s&&!this.orphanCanConnectAtEnd(t,r.targetBlock(),n.type)){let t;null==(t=this.connectionPreviewer)||t.previewReplacement(n,r,r.targetBlock())}else{var l;null==(l=this.connectionPreviewer)||l.previewConnection(n,r)}}else{let t;null==(t=this.connectionPreviewer)||t.hidePreview(),this.connectionCandidate=null}}orphanCanConnectAtEnd(t,e,s){return!!Kd.getConnectionForOrphanedConnection(t,s===Vd.OUTPUT_VALUE?e.outputConnection:e.previousConnection)}currCandidateIsBetter(t,e,s){const{local:i,neighbour:o}=t;t=new _c(i.x,i.y);const n=new _c(o.x,o.y);return e=_c.distance(_c.sum(t,e),n),s.distance>e-Hl.config$$module$build$src$core$config.currentConnectionPreference}getConnectionCandidate(t,e){t=this.getLocalConnections(t);let s=this.getSearchRadius(),i=null;for(const o of t){const{connection:t,radius:n}=o.closest(s,e);t&&(i={local:o,neighbour:t,distance:n},s=n)}return i}getSearchRadius(){return this.connectionCandidate?Hl.config$$module$build$src$core$config.connectingSnapRadius:Hl.config$$module$build$src$core$config.snapRadius}getLocalConnections(t){const e=t.getConnections_(!1),s=t.lastConnectionInStack(!0);return s&&s!==t.nextConnection&&e.push(s),e}endDrag(t){if(this.block.isShadow()){let e;null==(e=this.block.getParent())||e.endDrag(t)}else{var e;if(this.originalEventGroup=Hl.getGroup$$module$build$src$core$events$utils(),this.fireDragEndEvent(),this.fireMoveEvent(),mt(),Gn(),null==(e=this.connectionPreviewer)||e.hidePreview(),!this.block.isDeadOrDying()&&this.dragging){let t;null==(t=this.workspace.getLayerManager())||t.moveOffDragLayer(this.block,nd),this.getVisibleBubbles(this.block).forEach(t=>{let e;return null==(e=this.workspace.getLayerManager())?void 0:e.moveOffDragLayer(t,rd,!1)}),this.block.setDragging(!1)}this.connectionCandidate?(this.applyConnections(this.connectionCandidate),this.disposeStep()):this.block.queueRender().then(()=>this.disposeStep())}}disposeStep(){const t=Hl.getGroup$$module$build$src$core$events$utils();let e;Hl.setGroup$$module$build$src$core$events$utils(this.originalEventGroup),this.block.snapToGrid(),null==(e=this.connectionPreviewer)||e.dispose(),this.workspace.setResizesEnabled(!0),Hl.setGroup$$module$build$src$core$events$utils(t)}applyConnections(t){const{local:e,neighbour:s}=t;e.connect(s);const i=e.isSuperior()?s:e,o=this.block.getRootBlock();Me().then(()=>{Fn(i.getSourceBlock()),setTimeout(()=>{o.bringToFront()},0)})}revertDrag(){if(this.block.isShadow()){let t;null==(t=this.block.getParent())||t.revertDrag()}else{var t,e;if(null==(t=this.connectionPreviewer)||t.hidePreview(),this.connectionCandidate=null,null==(e=this.startChildConn)||e.connect(this.block.nextConnection),this.startParentConn)switch(this.startParentConn.type){case Vd.INPUT_VALUE:this.startParentConn.connect(this.block.outputConnection);break;case Vd.NEXT_STATEMENT:this.startParentConn.connect(this.block.previousConnection)}else{let t;this.block.moveTo(this.startLoc,["drag"]),null==(t=this.workspace.getLayerManager())||t.moveOffDragLayer(this.block,nd),this.getVisibleBubbles(this.block).forEach(t=>{let e;return null==(e=this.workspace.getLayerManager())?void 0:e.moveOffDragLayer(t,rd,!1)}),zn(this.workspace,this.workspace.getMetricsManager().getScrollMetrics(!0),this.block)}this.startParentConn=this.startChildConn=null,this.block.setDragging(!1),this.dragging=!1}}},Tp=class extends Md{constructor(t,e,s,i){super(e,s,i),this.text=t,this.workspace=e,this.anchor=s,this.ownerRect=i,this.paragraph=this.stringToSvg(t,this.contentContainer),this.updateBubbleSize(),ct(this.svgRoot,"blocklyTextBubble")}getText(){return this.text}setText(t){this.text=t,pt(this.paragraph),this.paragraph=this.stringToSvg(t,this.contentContainer),this.updateBubbleSize()}stringToSvg(t,e){return e=this.createParagraph(e),t=this.createTextFragments(e,t),this.workspace.RTL&&this.rightAlignTextFragments(e.getBBox().width,t),e}createParagraph(t){return at(Tc.G,{class:"blocklyText blocklyBubbleText blocklyNoPointerEvents",transform:`translate(0,${Md.BORDER_WIDTH})`,style:"direction: "+(this.workspace.RTL?"rtl":"ltr")},t)}createTextFragments(t,e){let s=1;return e.split("\n").map(e=>{const i=at(Tc.TEXT,{y:`${s}em`,x:Md.BORDER_WIDTH},t);return e=document.createTextNode(e),i.appendChild(e),s+=1,i})}rightAlignTextFragments(t,e){for(const s of e)s.setAttribute("text-anchor","start"),s.setAttribute("x",`${t+Md.BORDER_WIDTH}`)}updateBubbleSize(){const t=this.paragraph.getBBox();this.setSize(new Ec(t.width+2*Md.BORDER_WIDTH,t.height+2*Md.BORDER_WIDTH),!0)}},mp=class extends xd{constructor(t){super(t),this.sourceBlock=t,this.textMap=new Map,this.textBubble=null}getType(){return mp.TYPE}initView(t){this.svgRoot||(super.initView(t),at(Tc.PATH,{class:"blocklyIconShape",d:"M2,15Q-1,15 0.5,12L6.5,1.7Q8,-1 9.5,1.7L15.5,12Q17,15 14,15z"},this.svgRoot),at(Tc.PATH,{class:"blocklyIconSymbol",d:"m7,4.8v3.16l0.27,2.27h1.46l0.27,-2.27v-3.16z"},this.svgRoot),at(Tc.RECT,{class:"blocklyIconSymbol",x:"7",y:"11",height:"2",width:"2"},this.svgRoot),ct(this.svgRoot,"blocklyWarningIcon"))}dispose(){let t;super.dispose(),null==(t=this.textBubble)||t.dispose()}getWeight(){return mp.WEIGHT}getSize(){return new Ec(17,17)}applyColour(){let t;super.applyColour(),null==(t=this.textBubble)||t.setColour(this.sourceBlock.getColour())}updateCollapsed(){}isShownWhenCollapsed(){return!0}onLocationChange(t){let e;super.onLocationChange(t),null==(e=this.textBubble)||e.setAnchorLocation(this.getAnchorLocation())}addMessage(t,e){if(this.textMap.get(e)===t)return this;let s;return t?this.textMap.set(e,t):this.textMap.delete(e),null==(s=this.textBubble)||s.setText(this.getText()),this}getText(){return[...this.textMap.values()].join("\n")}onClick(){super.onClick(),this.setBubbleVisible(!this.bubbleIsVisible())}isClickableInFlyout(){return!1}bubbleIsVisible(){return!!this.textBubble}setBubbleVisible(t){const e=this;return(0,Fl.asyncExecutePromiseGeneratorFunction)(function*(){if(e.bubbleIsVisible()!==t){if(yield Me(),t)e.textBubble=new Tp(e.getText(),e.sourceBlock.workspace,e.getAnchorLocation(),e.getBubbleOwnerRect()),e.applyColour();else{let t;null==(t=e.textBubble)||t.dispose(),e.textBubble=null}J(new(rt(ua.BUBBLE_OPEN))(e.sourceBlock,t,"warning"))}})}getBubble(){return this.textBubble}getAnchorLocation(){return _c.sum(this.workspaceLocation,new _c(8.5,8.5))}getBubbleOwnerRect(){const t=this.sourceBlock.getSvgRoot().getBBox();return new mc(t.y,t.y+t.height,t.x,t.x+t.width)}};mp.TYPE=Kh.WARNING,mp.WEIGHT=2;var Ep=class extends ap{constructor(t,e,s){if(super(t,e,s),this.childlessWidth=this.width=this.height=0,this.warningTextDb=new Map,this.mutator=null,this.rendered=!0,this.visuallyDisabled=!1,this.translation="",this.dragging=!1,this.relativeCoords=new _c(0,0),this.dragStrategy=new _p(this),!t.rendered)throw TypeError("Cannot create a rendered block in a headless workspace");this.workspace=t,this.svgGroup=at(Tc.G,{}),e&&ct(this.svgGroup,e),this.style=t.getRenderer().getConstants().getBlockStyle(null),this.pathObject=t.getRenderer().makePathObject(this.svgGroup,this.style),(t=this.pathObject.svgPath).tooltip=this,vi(t),this.svgGroup.setAttribute("data-id",this.id),t.id=C(),this.doInit_()}initSvg(){if(!this.initialized){for(var t of this.inputList)t.init();for(const t of this.getIcons())t.initView(this.createIconPointerDownListener(t)),t.updateEditable();this.applyColour(),this.pathObject.updateMovable(this.isMovable()||this.isInFlyout),(t=this.getSvgRoot())&&T(t,"pointerdown",this,this.onMouseDown),t.parentNode||this.workspace.getCanvas().appendChild(t),this.initialized=!0}}getColourSecondary(){return this.style.colourSecondary}getColourTertiary(){return this.style.colourTertiary}select(){this.addSelect(),Lt(this)}unselect(){this.removeSelect(),Lt(null)}setParent(t){var e=this.parentBlock_;if(t!==e){Tt(),super.setParent(t),mt();var s=this.getSvgRoot();if(!this.workspace.isClearing&&s){var i,o=this.getRelativeToSurfaceXY(),n=Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode(),r=this.getSvgRoot().contains(null!=(i=null==n?void 0:n.getFocusableElement())?i:null);t?(t.getSvgRoot().appendChild(s),r&&n&&Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(n)):e&&((e=null==(t=this.workspace.getCanvas().querySelector(".blocklyDragging"))?void 0:t.parentElement)===(i=this.workspace.getCanvas())?i.insertBefore(s,t):(i.appendChild(s),r&&n&&Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(n)),this.translate(o.x,o.y)),this.applyColour()}}}getRelativeToSurfaceXY(){const t=this.workspace.getLayerManager();if(!t)throw Error("Cannot calculate position because the workspace has not been appended");let e=0,s=0,i=this.getSvgRoot();if(i)do{const t=te(i);e+=t.x,s+=t.y,i=i.parentNode}while(i&&!t.hasLayer(i));return new _c(e,s)}moveBy(t,e,s){if(this.parentBlock_)throw Error("Block has parent");const i=st();let o=null;i&&(o=new(rt(ua.BLOCK_MOVE))(this),s&&o.setReason(s)),t=new _c(t,e),e=this.getRelativeToSurfaceXY(),t=_c.sum(e,t),this.translate(t.x,t.y),this.updateComponentLocations(t),i&&o&&(o.recordNew(),J(o)),this.workspace.resizeContents()}translate(t,e){this.translation=`translate(${t}, ${e})`,this.relativeCoords=new _c(t,e),this.getSvgRoot().setAttribute("transform",this.getTranslation())}getTranslation(){return this.translation}moveTo(t,e){const s=this.getRelativeToSurfaceXY();this.moveBy(t.x-s.x,t.y-s.y,e)}moveDuringDrag(t){this.translate(t.x,t.y),this.getSvgRoot().setAttribute("transform",this.getTranslation()),this.updateComponentLocations(t)}snapToGrid(){if(!this.isDeadOrDying()&&!this.getParent()&&!this.isInFlyout){var t=this.workspace.getGrid();if(null!=t&&t.shouldSnap()){var e=this.getRelativeToSurfaceXY();(t=t.alignXY(e))!==e&&this.moveTo(t,["snap"])}}}getBoundingRectangle(){return this.getBoundingRectangleWithDimensions(this.getHeightWidth())}getBoundingRectangleWithoutChildren(){return this.getBoundingRectangleWithDimensions({height:this.height,width:this.childlessWidth})}getBoundingRectangleWithDimensions(t){const e=this.getRelativeToSurfaceXY();let s,i;return this.RTL?(s=e.x-t.width,i=e.x):(s=e.x,i=e.x+t.width),new mc(e.y,e.y+t.height,s,i)}markDirty(){this.pathObject.constants=this.workspace.getRenderer().getConstants();for(let t,e=0;t=this.inputList[e];e++)t.markDirty()}setCollapsed(t){this.collapsed_!==t&&(super.setCollapsed(t),this.updateCollapsed())}childHasWarning(){var t=this.getNextBlock();t=t?new Set(t.getDescendants(!1)):null;const e=this.getDescendants(!1);for(const s of e){if(s===this)continue;let e;if((null==(e=t)||!e.has(s))&&s.getIcon(mp.TYPE))return!0}return!1}updateCollapsed(){var t=this.isCollapsed();const e=rh,s=lh;for(let s,i=0;s=this.inputList[i];i++)s.name!==e&&s.setVisible(!t);for(var i of this.getIcons())i.updateCollapsed();t?(ct(this.svgGroup,"blocklyCollapsed"),this.childHasWarning()&&this.setWarningText(Hl.Msg$$module$build$src$core$msg.COLLAPSED_WARNINGS_WARNING,Ep.COLLAPSED_WARNING_ID),t=this.toString(30),(i=this.getField(s))?i.setValue(t):(this.getInput(e)||this.appendDummyInput(e)).appendField(new qd(t),s)):(this.updateDisabled(),this.removeInput(e),ut(this.svgGroup,"blocklyCollapsed"),this.setWarningText(null,Ep.COLLAPSED_WARNING_ID))}onMouseDown(t){if(!this.workspace.isReadOnly()){var e=this.workspace.getGesture(t);e&&e.handleBlockStart(t,this)}}showHelp(){const t="function"==typeof this.helpUrl?this.helpUrl():this.helpUrl;t&&window.open(t)}generateContextMenu(t){return this.workspace.isReadOnly()||!this.contextMenu?null:(t=sd.registry.getContextMenuOptions({block:this,focusedNode:this},t),this.customContextMenu&&this.customContextMenu(t),t)}calculateContextMenuLocation(t){if(t instanceof PointerEvent)return new _c(t.clientX,t.clientY);let e,s;t=ne(this.workspace,this.getRelativeToSurfaceXY());const i=null==(e=this.inputList.filter(t=>t.isVisible()).flatMap(t=>t.fieldRow).find(t=>t.isVisible()))||null==(s=e.getSvgRoot())?void 0:s.getBoundingClientRect();return new _c(this.RTL?t.x-5:t.x+5,(i&&i.height?i.y+i.height:t.y+this.height)+5)}showContextMenu(t){const e=this.generateContextMenu(t),s=this.calculateContextMenuLocation(t);e&&e.length&&($o(t,e,this.RTL,this.workspace,s),fo(this))}updateComponentLocations(t){this.dragging||this.updateConnectionLocations(t),this.updateIconLocations(t),this.updateFieldLocations(t);for(const e of this.getChildren(!1))e.updateComponentLocations(_c.sum(t,e.relativeCoords))}updateConnectionLocations(t){for(const e of this.getConnections_(!1))e.moveToOffset(t)}updateIconLocations(t){for(const e of this.getIcons())e.onLocationChange(t)}updateFieldLocations(t){for(const e of this.inputList)for(const s of e.fieldRow)s.onLocationChange(t)}addClass(t){ct(this.svgGroup,t)}removeClass(t){ut(this.svgGroup,t)}setDragging(t){(this.dragging=t)?(this.translation="",Qa.push(...this.getConnections_(!0)),this.addClass("blocklyDragging")):(Qa.length=0,this.removeClass("blocklyDragging"));for(let e=0;e!t.isDeadOrDying());let e=null,s=Number.MAX_SAFE_INTEGER;const i=this.getRelativeToSurfaceXY();for(const o of t)t=o.getRelativeToSurfaceXY(),(t=Math.sqrt(Math.pow(t.x-i.x,2)+Math.pow(t.y-i.y,2))){this.workspace.rendered&&s.focusTree(this.workspace)},0)}e&&(this.unplug(t),Pn(this)),super.dispose(!!t),pt(this.svgGroup)}disposeInternal(){this.disposing=!0,super.disposeInternal(),Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode()===this&&this.workspace.cancelCurrentGesture(),[...this.warningTextDb.values()].forEach(t=>clearTimeout(t)),this.warningTextDb.clear(),this.getIcons().forEach(t=>t.dispose())}checkAndDelete(){this.workspace.isFlyout||(Hl.setGroup$$module$build$src$core$events$utils(!0),this.workspace.hideChaff(),this.outputConnection?this.dispose(!1,!0):this.dispose(!0,!0),Hl.setGroup$$module$build$src$core$events$utils(!1))}toCopyData(t=!1){return this.isInsertionMarker_?null:{paster:dp.TYPE,blockState:$s(this,{addCoordinates:!0,addNextBlocks:t,saveIds:!1}),typeCounts:Pt(this,!0)}}applyColour(){var t,e;for(null==(e=(t=this.pathObject).applyColour)||e.call(t,this),t=this.getIcons(),e=0;e{this.isDeadOrDying()||(this.warningTextDb.delete(e),this.setWarningText(t,e))},100));else if(this.isInFlyout&&(t=null),s=this.getIcon(mp.TYPE),t){let i=this.getSurroundParent(),o=null;for(;i;)i.isCollapsed()&&(o=i),i=i.getSurroundParent();o&&o.setWarningText(Hl.Msg$$module$build$src$core$msg.COLLAPSED_WARNINGS_WARNING,Ep.COLLAPSED_WARNING_ID),s?s.addMessage(t,e):this.addIcon(new mp(this).addMessage(t,e))}else s&&(e?(s.addMessage("",e),s.getText()||this.removeIcon(mp.TYPE)):this.removeIcon(mp.TYPE))}setMutator(t){this.removeIcon(Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon.TYPE),t&&this.addIcon(t)}addIcon(t){return super.addIcon(t),t instanceof Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon&&(this.mutator=t),t.initView(this.createIconPointerDownListener(t)),t.applyColour(),t.updateEditable(),this.queueRender(),t}createIconPointerDownListener(t){return e=>{!this.isDeadOrDying()&&(e=this.workspace.getGesture(e))&&(this.bringToFront(),e.setStartIcon(t),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(t))}}removeIcon(t){const e=super.removeIcon(t);return t.equals(Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon.TYPE)&&(this.mutator=null),this.queueRender(),e}setDisabledReason(t,e){const s=this.isEnabled();super.setDisabledReason(t,e),this.isEnabled()===s||this.getInheritedDisabled()||this.updateDisabled()}setDeletable(t){super.setDeletable(t),t?ut(this.svgGroup,"blocklyNotDeletable"):ct(this.svgGroup,"blocklyNotDeletable")}setHighlighted(t){this.pathObject.updateHighlighted(t)}addSelect(){this.pathObject.updateSelected(!0)}removeSelect(){this.pathObject.updateSelected(!1)}setDeleteStyle(t){this.pathObject.updateDraggingDelete(t)}getColour(){return this.style.colourPrimary}setColour(t){let e,s;super.setColour(t),t=this.workspace.getRenderer().getConstants().getBlockStyleForColour(this.colour_),null==(s=(e=this.pathObject).setStyle)||s.call(e,t.style),this.style=t.style,this.styleName_=t.name,this.applyColour()}setStyle(t){const e=this.workspace.getRenderer().getConstants().getBlockStyle(t);if(this.styleName_&&ut(this.svgGroup,this.styleName_),!e)throw Error("Invalid style name: "+t);{let s,i;this.hat=e.hat,null==(i=(s=this.pathObject).setStyle)||i.call(s,e),this.colour_=e.colourPrimary,this.style=e,this.applyColour(),ct(this.svgGroup,t),this.styleName_=t}}getStyle(){return this.style}bringToFront(t=!1){const e=Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode();let s=this;if(!s.isDeadOrDying()){do{const e=s.getSvgRoot(),i=e.parentNode,o=i.childNodes;if(o[o.length-1]!==e&&i.appendChild(e),t)break;s=s.getParent()}while(s);e&&Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(e)}}setPreviousStatement(t,e){super.setPreviousStatement(t,e),this.queueRender()}setNextStatement(t,e){super.setNextStatement(t,e),this.queueRender()}setOutput(t,e){super.setOutput(t,e),this.queueRender()}setInputsInline(t){super.setInputsInline(t),this.queueRender()}removeInput(t,e){return t=super.removeInput(t,e),this.queueRender(),t}moveNumberedInputBefore(t,e){super.moveNumberedInputBefore(t,e),this.queueRender()}appendInput(t){return super.appendInput(t),this.queueRender(),t}setConnectionTracking(t){if(this.previousConnection&&this.previousConnection.setTracking(t),this.outputConnection&&this.outputConnection.setTracking(t),this.nextConnection){this.nextConnection.setTracking(t);var e=this.nextConnection.targetBlock();e&&e.setConnectionTracking(t)}if(!this.collapsed_)for(e=0;ee.getElement()===t);return-1===s?null:(s++,s>=e.length&&(s=0),e[s].getElement())}getPreviousSibling(t){const e=this.flyout.getContents();if(!e)return null;let s=e.findIndex(e=>e.getElement()===t);return-1===s?null:(s--,s<0&&(s=e.length-1),e[s].getElement())}isNavigable(t){return this.policy.isNavigable(t)}isApplicable(t){return this.policy.isApplicable(t)}},Op=class{constructor(t,e){this.gap=t,this.axis=e,this.y=this.x=0}getBoundingRectangle(){switch(this.axis){case"x":return new mc(this.y,this.y,this.x,this.x+this.gap);case"y":return new mc(this.y,this.y+this.gap,this.x,this.x)}}moveBy(t,e,s){this.x+=t,this.y+=e}isNavigable(){return!1}getFocusableElement(){throw Error("Cannot be focused")}getFocusableTree(){throw Error("Cannot be focused")}onNodeFocus(){}onNodeBlur(){}canBeFocused(){return!1}},kp=class{getFirstChild(t){return null}getParent(t){return null}getNextSibling(t){return null}getPreviousSibling(t){return null}isNavigable(t){return!1}isApplicable(t){return t instanceof Op}},Ap=class{getFirstChild(t){return t.getEditor()}getParent(t){let e;return null!=(e=t.getOwner())?e:null}getNextSibling(t){return null}getPreviousSibling(t){return null}isNavigable(t){return t.canBeFocused()}isApplicable(t){return t instanceof Wd}},vp=class{getFirstChild(t){return qn(t,!0)[0]}getParent(t){var e;if(null!=(e=t.previousConnection)&&e.targetBlock()){if(e=t.getSurroundParent())return e}else{let e;if(null!=(e=t.outputConnection)&&e.targetBlock())return t.outputConnection.targetBlock()}return t.workspace}getNextSibling(t){let e,s;if(null!=(e=t.nextConnection)&&e.targetBlock()){let e;return null==(e=t.nextConnection)?void 0:e.targetBlock()}return null!=(s=t.outputConnection)&&s.targetBlock()?Qn(t,1):t.getSurroundParent()?Qn(t.getTopStackBlock(),1):this.getParent(t)instanceof Gg?Zn(t,1):null}getPreviousSibling(t){let e,s;if(null!=(e=t.previousConnection)&&e.targetBlock()){let e;return null==(e=t.previousConnection)?void 0:e.targetBlock()}return null!=(s=t.outputConnection)&&s.targetBlock()?Qn(t,-1):this.getParent(t)instanceof Gg?Zn(t,-1):null}isNavigable(t){return t.canBeFocused()}isApplicable(t){return t instanceof Ep}},Np={};Np.BlockNavigationPolicy=vp,Np.navigateBlock=Qn,Np.navigateStacks=Zn;var wp=class{getFirstChild(t){return null}getParent(t){return t.getCommentView().workspace.getCommentById(t.getCommentView().commentId)}getNextSibling(t){const e=t.getCommentView().getCommentBarButtons();return(t=e.indexOf(t))>=0&&t+10?e[t-1]:null}isNavigable(t){return t.canBeFocused()}isApplicable(t){return t instanceof ud}},Lp=class{getFirstChild(t){return null}getParent(t){return null}getNextSibling(t){return null}getPreviousSibling(t){return null}isNavigable(t){return t.canBeFocused()}isApplicable(t){return t instanceof _d}},Mp=class{getFirstChild(t){return t.getParentInput()?t.targetConnection:null}getParent(t){return t.getSourceBlock()}getNextSibling(t){if(t.getParentInput())return Qn(t,1);if(t.type===Vd.NEXT_STATEMENT){const s=t.targetConnection;var e=t.getSourceBlock();if(!s&&e.getRootBlock().lastConnectionInStack(!1)===t){let s;return t=e.workspace.getTopBlocks(!0),(e=t.indexOf(e.getRootBlock())+1)>=t.length&&(e=0),e=t[e],null!=(s=this.getParentConnection(e))?s:e}return s}return t.getSourceBlock()}getPreviousSibling(t){if(t.getParentInput())return Qn(t,-1);if(t.type===Vd.PREVIOUS_STATEMENT||t.type===Vd.OUTPUT_VALUE){const s=t.targetConnection&&!t.targetConnection.getParentInput()?t.targetConnection:null;var e=t.getSourceBlock();if(!s&&this.getParentConnection(e.getRootBlock())===t){let s;return t=e.workspace.getTopBlocks(!0),(e=t.indexOf(e.getRootBlock())-1)<0&&(e=t.length-1),null!=(s=(e=t[e]).lastConnectionInStack(!1))?s:e}return s}return t.type===Vd.NEXT_STATEMENT?t.getSourceBlock():null}getParentConnection(t){let e;return!t.outputConnection||null!=(e=t.previousConnection)&&e.isConnected()?t.previousConnection:t.outputConnection}isNavigable(t){return t.canBeFocused()}isApplicable(t){return t instanceof ep}},Dp=class{getFirstChild(t){return null}getParent(t){return t.getSourceBlock()}getNextSibling(t){return Qn(t,1)}getPreviousSibling(t){return Qn(t,-1)}isNavigable(t){let e;return t.canBeFocused()&&t.isVisible()&&(t.isClickable()||t.isCurrentlyEditable())&&!(null!=(e=t.getSourceBlock())&&e.isSimpleReporter()&&t.isFullBlockField())&&t.getParentInput().isVisible()}isApplicable(t){return t instanceof Uu}},xp={};xp.register=tr,xp.unregister=er;var Pp=class extends xd{constructor(t){super(t),this.sourceBlock=t,this.textInputBubble=null,this.text="",this.bubbleSize=new Ec(160,80),this.bubbleVisiblity=!1}getType(){return Pp.TYPE}initView(t){this.svgRoot||(super.initView(t),at(Tc.CIRCLE,{class:"blocklyIconShape",r:"8",cx:"8",cy:"8"},this.svgRoot),at(Tc.PATH,{class:"blocklyIconSymbol",d:"m6.8,10h2c0.003,-0.617 0.271,-0.962 0.633,-1.266 2.875,-2.4050.607,-5.534 -3.765,-3.874v1.7c3.12,-1.657 3.698,0.118 2.336,1.25-1.201,0.998 -1.201,1.528 -1.204,2.19z"},this.svgRoot),at(Tc.RECT,{class:"blocklyIconSymbol",x:"6.8",y:"10.78",height:"2",width:"2"},this.svgRoot),ct(this.svgRoot,"blocklyCommentIcon"))}dispose(){let t;super.dispose(),null==(t=this.textInputBubble)||t.dispose()}getWeight(){return Pp.WEIGHT}getSize(){return new Ec(17,17)}applyColour(){super.applyColour();const t=this.sourceBlock.getColour();let e;null==(e=this.textInputBubble)||e.setColour(t)}updateEditable(){const t=this,e=()=>super.updateEditable;return(0,Fl.asyncExecutePromiseGeneratorFunction)(function*(){e().call(t),t.bubbleIsVisible()&&(yield t.setBubbleVisible(!1),yield t.setBubbleVisible(!0))})}onLocationChange(t){const e=this.workspaceLocation;let s;super.onLocationChange(t),this.bubbleLocation&&(t=_c.difference(this.workspaceLocation,e),this.bubbleLocation=_c.sum(this.bubbleLocation,t)),t=this.getAnchorLocation(),null==(s=this.textInputBubble)||s.setAnchorLocation(t)}setText(t){const e=this.text;let s;J(new(rt(ua.BLOCK_CHANGE))(this.sourceBlock,"comment",null,e,t)),this.text=t,null==(s=this.textInputBubble)||s.setText(this.text)}getText(){return this.text}setBubbleSize(t){let e;this.bubbleSize=t,null==(e=this.textInputBubble)||e.setSize(this.bubbleSize,!0)}getBubbleSize(){return this.bubbleSize}setBubbleLocation(t){let e;this.bubbleLocation=t,null==(e=this.textInputBubble)||e.moveDuringDrag(t)}getBubbleLocation(){return this.bubbleLocation}saveState(){if(this.text){const t={text:this.text,pinned:this.bubbleIsVisible(),height:this.bubbleSize.height,width:this.bubbleSize.width},e=this.getBubbleLocation();return e&&(t.x=this.sourceBlock.workspace.RTL?this.sourceBlock.workspace.getWidth()-(e.x+this.bubbleSize.width):e.x,t.y=e.y),t}return null}loadState(t){let e,s,i,o;this.text=null!=(e=t.text)?e:"",this.bubbleSize=new Ec(null!=(s=t.width)?s:160,null!=(i=t.height)?i:80),this.bubbleVisiblity=null!=(o=t.pinned)&&o,this.setBubbleVisible(this.bubbleVisiblity);let n=t.x;const r=t.y;Me().then(()=>{n&&r&&(n=this.sourceBlock.workspace.RTL?this.sourceBlock.workspace.getWidth()-(n+this.bubbleSize.width):n,this.setBubbleLocation(new _c(n,r)))})}onClick(){super.onClick(),this.setBubbleVisible(!this.bubbleIsVisible())}isClickableInFlyout(){return!1}onTextChange(){if(this.textInputBubble){var t=this.textInputBubble.getText();this.text!==t&&(J(new(rt(ua.BLOCK_CHANGE))(this.sourceBlock,"comment",null,this.text,t)),this.text=t)}}onSizeChange(){this.textInputBubble&&(this.bubbleSize=this.textInputBubble.getSize())}onBubbleLocationChange(){this.textInputBubble&&(this.bubbleLocation=this.textInputBubble.getRelativeToSurfaceXY())}bubbleIsVisible(){return this.bubbleVisiblity}setBubbleVisible(t){const e=this;return(0,Fl.asyncExecutePromiseGeneratorFunction)(function*(){e.bubbleVisiblity!==t&&(e.bubbleVisiblity=t,yield Me(),!e.sourceBlock.rendered||e.sourceBlock.isInFlyout||e.sourceBlock.isInsertionMarker()||(t?(e.sourceBlock.isEditable()?e.showEditableBubble():e.showNonEditableBubble(),e.applyColour()):e.hideBubble(),J(new(rt(ua.BUBBLE_OPEN))(e.sourceBlock,t,"comment"))))})}getBubble(){return this.textInputBubble}showEditableBubble(){let t,e;this.createBubble(),null==(t=this.textInputBubble)||t.addTextChangeListener(()=>this.onTextChange()),null==(e=this.textInputBubble)||e.addSizeChangeListener(()=>this.onSizeChange())}showNonEditableBubble(){let t;this.createBubble(),null==(t=this.textInputBubble)||t.setEditable(!1)}createBubble(){this.textInputBubble=new Wd(this.sourceBlock.workspace,this.getAnchorLocation(),this.getBubbleOwnerRect(),this),this.textInputBubble.setText(this.getText()),this.textInputBubble.setSize(this.bubbleSize,!0),this.bubbleLocation&&this.textInputBubble.moveDuringDrag(this.bubbleLocation),this.textInputBubble.addTextChangeListener(()=>this.onTextChange()),this.textInputBubble.addSizeChangeListener(()=>this.onSizeChange()),this.textInputBubble.addLocationChangeListener(()=>this.onBubbleLocationChange())}hideBubble(){let t;null==(t=this.textInputBubble)||t.dispose(),this.textInputBubble=null}getAnchorLocation(){return _c.sum(this.workspaceLocation,new _c(8.5,8.5))}getBubbleOwnerRect(){return this.sourceBlock.getBoundingRectangleWithoutChildren()}};Pp.TYPE=Kh.COMMENT,Pp.WEIGHT=3,tr(Pp.TYPE,Pp);var Bp=class{getFirstChild(t){if(t instanceof Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon&&t.bubbleIsVisible()&&Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode()===t){let e,s;return null!=(s=null==(e=t.getBubble())?void 0:e.getWorkspace())?s:null}if(t instanceof Pp&&t.bubbleIsVisible()&&Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode()===t){let e,s;return null!=(s=null==(e=t.getBubble())?void 0:e.getEditor())?s:null}return null}getParent(t){return t.getSourceBlock()}getNextSibling(t){return Qn(t,1)}getPreviousSibling(t){return Qn(t,-1)}isNavigable(t){return t.canBeFocused()}isApplicable(t){return t instanceof xd}},Fp=class{getFirstChild(t){return t.view.getCommentBarButtons()[0]}getParent(t){return t.workspace}getNextSibling(t){return Zn(t,1)}getPreviousSibling(t){return Zn(t,-1)}isNavigable(t){return t.canBeFocused()}isApplicable(t){return t instanceof fd}},Up=class{getFirstChild(t){return(t=t.getTopBlocks(!0)).length?t[0]:null}getParent(t){return null}getNextSibling(t){return null}getPreviousSibling(t){return null}isNavigable(t){return t.canBeFocused()&&!t.isMutator}isApplicable(t){return t instanceof Gg}},Hp=class{constructor(){this.rules=[new vp,new Dp,new Mp,new Up,new Bp,new Fp,new wp,new Ap,new Lp]}addNavigationPolicy(t){this.rules.push(t)}get(t){return this.rules.find(e=>e.isApplicable(t))}getFirstChild(t){let e;const s=null==(e=this.get(t))?void 0:e.getFirstChild(t);if(!s)return null;let i;return null!=(i=this.get(s))&&i.isNavigable(s)?s:this.getFirstChild(s)||this.getNextSibling(s)}getParent(t){let e;const s=null==(e=this.get(t))?void 0:e.getParent(t);if(!s)return null;let i;return null!=(i=this.get(s))&&i.isNavigable(s)?s:this.getParent(s)}getNextSibling(t){let e;const s=null==(e=this.get(t))?void 0:e.getNextSibling(t);if(!s)return null;let i;return null!=(i=this.get(s))&&i.isNavigable(s)?s:this.getNextSibling(s)}getPreviousSibling(t){let e;const s=null==(e=this.get(t))?void 0:e.getPreviousSibling(t);if(!s)return null;let i;return null!=(i=this.get(s))&&i.isNavigable(s)?s:this.getPreviousSibling(s)}},Gp=class extends Hp{constructor(t){super(),this.rules.push(new Rp,new kp),this.rules=this.rules.map(e=>new yp(e,t))}},Vp=class{constructor(t,e,s,i,o){this.workspace=t,this.oldHostMetrics=this.corner_=this.vScroll=this.hScroll=null,s=void 0===s||s;const n=(e=void 0===e||e)&&s;e&&(this.hScroll=new Sc(t,!0,n,i,o)),s&&(this.vScroll=new Sc(t,!1,n,i,o)),n&&(this.corner_=at(Tc.RECT,{height:Sc.scrollbarThickness,width:Sc.scrollbarThickness,class:"blocklyScrollbarBackground"}),gt(this.corner_,t.getBubbleCanvas()))}dispose(){pt(this.corner_),this.oldHostMetrics=this.corner_=null,this.hScroll&&(this.hScroll.dispose(),this.hScroll=null),this.vScroll&&(this.vScroll.dispose(),this.vScroll=null)}resize(){const t=this.workspace.getMetrics();if(t){var e=!1,s=!1;if(this.oldHostMetrics&&this.oldHostMetrics.viewWidth===t.viewWidth&&this.oldHostMetrics.viewHeight===t.viewHeight&&this.oldHostMetrics.absoluteTop===t.absoluteTop&&this.oldHostMetrics.absoluteLeft===t.absoluteLeft?(this.oldHostMetrics&&this.oldHostMetrics.scrollWidth===t.scrollWidth&&this.oldHostMetrics.viewLeft===t.viewLeft&&this.oldHostMetrics.scrollLeft===t.scrollLeft||(e=!0),this.oldHostMetrics&&this.oldHostMetrics.scrollHeight===t.scrollHeight&&this.oldHostMetrics.viewTop===t.viewTop&&this.oldHostMetrics.scrollTop===t.scrollTop||(s=!0)):s=e=!0,e||s){try{Hl.disable$$module$build$src$core$events$utils(),this.hScroll&&e&&this.hScroll.resize(t),this.vScroll&&s&&this.vScroll.resize(t)}finally{Hl.enable$$module$build$src$core$events$utils()}this.workspace.maybeFireViewportChangeEvent()}if(this.hScroll&&this.vScroll){if(!this.oldHostMetrics||this.oldHostMetrics.viewWidth!==t.viewWidth||this.oldHostMetrics.absoluteLeft!==t.absoluteLeft){let t;null==(t=this.corner_)||t.setAttribute("x",String(this.vScroll.position.x))}if(!this.oldHostMetrics||this.oldHostMetrics.viewHeight!==t.viewHeight||this.oldHostMetrics.absoluteTop!==t.absoluteTop){let t;null==(t=this.corner_)||t.setAttribute("y",String(this.hScroll.position.y))}}this.oldHostMetrics=t}}canScrollHorizontally(){return!!this.hScroll}canScrollVertically(){return!!this.vScroll}setOrigin(t,e){this.hScroll&&this.hScroll.setOrigin(t,e),this.vScroll&&this.vScroll.setOrigin(t,e)}set(t,e,s){this.hScroll&&this.hScroll.set(t,!1),this.vScroll&&this.vScroll.set(e,!1),(s||void 0===s)&&(t={},this.hScroll&&(t.x=this.hScroll.getRatio_()),this.vScroll&&(t.y=this.vScroll.getRatio_()),this.workspace.setMetrics(t))}setX(t){this.hScroll&&this.hScroll.set(t,!0)}setY(t){this.vScroll&&this.vScroll.set(t,!0)}setContainerVisible(t){this.hScroll&&this.hScroll.setContainerVisible(t),this.vScroll&&this.vScroll.setContainerVisible(t)}isVisible(){let t=!1;return this.hScroll&&(t=this.hScroll.isVisible()),this.vScroll&&(t=t||this.vScroll.isVisible()),t}setVisible(t){this.hScroll&&this.hScroll.setVisibleInternal(t),this.vScroll&&this.vScroll.setVisibleInternal(t)}resizeContent(t){this.hScroll&&this.hScroll.resizeContentHorizontal(t),this.vScroll&&this.vScroll.resizeContentVertical(t)}resizeView(t){this.hScroll&&this.hScroll.resizeViewHorizontal(t),this.vScroll&&this.vScroll.resizeViewVertical(t)}},Wp="sep",Xp=class{load(t,e){return t=new Op(0,e.horizontalLayout?"x":"y"),new $p(t,Wp)}gapForItem(t,e){let s;return null!=(s=parseInt(String(t.gap)))?s:e}disposeItem(t){}getType(){return Wp}};t(zl.FLYOUT_INFLATER,Wp,Xp),{SEPARATOR_TYPE:Wp}.SeparatorFlyoutInflater=Xp;var zp=class extends fp{constructor(t){super(),this.horizontalLayout=!1,this.boundEvents=[],this.reflowWrapper=null,this.inhibitReflowWrapper=!1,this.contents=[],this.autoClose=!0,this.visible=!1,this.containerVisible=!0,this.CORNER_RADIUS=8,this.SCROLLBAR_MARGIN=2.5,this.height_=this.width_=0,this.dragAngleRange_=70,this.svgGroup_=this.svgBackground_=null,this.inflaters=new Map,t.setMetrics=this.setMetrics_.bind(this),this.workspace_=new Gg(t),this.workspace_.setMetricsManager(new Cp(this.workspace_,this)),this.workspace_.internalIsFlyout=!0,this.workspace_.setVisible(this.visible),this.workspace_.setNavigator(new Gp(this)),this.id=S(),this.RTL=!!t.RTL,this.toolboxPosition_=t.toolboxPosition,this.tabWidth_=this.workspace_.getRenderer().getConstants().TAB_WIDTH,this.MARGIN=this.CORNER_RADIUS,this.GAP_X=3*this.MARGIN,this.GAP_Y=3*this.MARGIN}createDom(t){return this.svgGroup_=at(t,{class:"blocklyFlyout"}),this.svgGroup_.style.display="none",this.svgBackground_=at(Tc.PATH,{class:"blocklyFlyoutBackground"},this.svgGroup_),this.svgGroup_.appendChild(this.workspace_.createDom()),this.workspace_.getThemeManager().subscribe(this.svgBackground_,"flyoutBackgroundColour","fill"),this.workspace_.getThemeManager().subscribe(this.svgBackground_,"flyoutOpacity","fill-opacity"),this.svgGroup_}init(t){this.targetWorkspace=t,this.workspace_.targetWorkspace=t,this.workspace_.scrollbar=new Vp(this.workspace_,this.horizontalLayout,!this.horizontalLayout,"blocklyFlyoutScrollbar",this.SCROLLBAR_MARGIN),this.hide(),this.boundEvents.push(T(this.svgGroup_,"wheel",this,this.wheel_,!1,{passive:!1})),this.boundEvents.push(T(this.svgBackground_,"pointerdown",this,this.onMouseDown)),this.workspace_.getGesture=this.targetWorkspace.getGesture.bind(this.targetWorkspace),this.workspace_.setVariableMap(this.targetWorkspace.getVariableMap()),this.workspace_.createPotentialVariableMap(),t.getComponentManager().addComponent({component:this,weight:cc.ComponentWeight.FLYOUT_WEIGHT,capabilities:[cc.Capability.AUTOHIDEABLE,cc.Capability.DELETE_AREA,cc.Capability.DRAG_TARGET]})}dispose(){this.hide(),this.targetWorkspace.getComponentManager().removeComponent(this.id);for(const t of this.boundEvents)E(t);this.boundEvents.length=0,this.workspace_&&(this.workspace_.getThemeManager().unsubscribe(this.svgBackground_),this.workspace_.dispose()),this.svgGroup_&&pt(this.svgGroup_)}getWidth(){return this.width_}getHeight(){return this.height_}getFlyoutScale(){return this.targetWorkspace.scale}getWorkspace(){return this.workspace_}setAutoClose(t){this.autoClose=t,this.targetWorkspace.recordDragTargets(),this.targetWorkspace.resizeContents()}autoHide(t){!t&&this.targetWorkspace.getFlyout(!0)===this&&this.autoClose&&this.hide()}getTargetWorkspace(){return this.targetWorkspace}isVisible(){return this.visible}setVisible(t){const e=t!==this.isVisible();this.visible=t,e&&(this.autoClose||this.targetWorkspace.recordDragTargets(),this.updateDisplay())}setContainerVisible(t){const e=t!==this.containerVisible;this.containerVisible=t,e&&this.updateDisplay()}getContents(){return this.contents}setContents(t){this.contents=t}updateDisplay(){let t,e;t=!!this.containerVisible&&this.isVisible(),this.svgGroup_&&(this.svgGroup_.style.display=t?"block":"none"),null==(e=this.workspace_.scrollbar)||e.setContainerVisible(t)}positionAt_(t,e,s,i){let o,n;null==(o=this.svgGroup_)||o.setAttribute("width",`${t}`),null==(n=this.svgGroup_)||n.setAttribute("height",`${e}`),this.workspace_.setCachedParentSvgSize(t,e),this.svgGroup_&&_t(this.svgGroup_,"translate("+s+"px,"+i+"px)"),(t=this.workspace_.scrollbar)&&(t.setOrigin(s,i),t.resize(),t.hScroll&&t.hScroll.setPosition(t.hScroll.position.x,t.hScroll.position.y),t.vScroll&&t.vScroll.setPosition(t.vScroll.position.x,t.vScroll.position.y))}hide(){this.isVisible()&&(this.setVisible(!1),this.reflowWrapper&&(this.workspace_.removeChangeListener(this.reflowWrapper),this.reflowWrapper=null))}show(t){this.workspace_.setResizesEnabled(!1),Hl.setRecordUndo$$module$build$src$core$events$utils(!1),this.hide(),this.clearOldBlocks(),"string"==typeof t&&(t=this.getDynamicCategoryContents(t)),this.setVisible(!0),t=ue(t),t=this.createFlyoutInfo(t),De(this.workspace_),this.setContents(t),this.layout_(t),this.horizontalLayout?this.height_=0:this.width_=0,this.reflow(),Hl.setRecordUndo$$module$build$src$core$events$utils(!0),this.workspace_.setResizesEnabled(!0),this.reflowWrapper=t=>{this.inhibitReflowWrapper||t.type!==ua.BLOCK_CHANGE&&t.type!==ua.BLOCK_FIELD_INTERMEDIATE_CHANGE||this.reflow()},this.workspace_.addChangeListener(this.reflowWrapper)}createFlyoutInfo(t){const e=[],s=this.horizontalLayout?this.GAP_X:this.GAP_Y;for(const i of t)"custom"in i&&(t=this.getDynamicCategoryContents(i.custom),t=ue(t),e.push(...this.createFlyoutInfo(t))),t=i.kind.toLowerCase(),(t=this.getInflaterForType(t))&&(e.push(t.load(i,this)),(t=t.gapForItem(i,s))&&e.push(new $p(new Op(t,this.horizontalLayout?"x":"y"),Wp)));return this.normalizeSeparators(e)}normalizeSeparators(t){for(let e=t.length-1;e>0;e--){const s=t[e].getType().toLowerCase(),i=t[e-1].getType().toLowerCase();s===Wp&&i===Wp&&t.splice(e-1,1)}return t}getDynamicCategoryContents(t){if("function"!=typeof(t=this.workspace_.targetWorkspace.getToolboxCategoryCallback(t)))throw TypeError("Couldn't find a callback function when opening a toolbox category.");return t(this.workspace_.targetWorkspace)}clearOldBlocks(){let t;this.getContents().forEach(t=>{let e;null==(e=this.getInflaterForType(t.getType()))||e.disposeItem(t)}),null==(t=this.workspace_.getPotentialVariableMap())||t.clear()}onMouseDown(t){const e=this.targetWorkspace.getGesture(t);e&&e.handleFlyoutStart(t,this)}isBlockCreatable(t){return t.isEnabled()&&!this.getTargetWorkspace().isReadOnly()}createBlock(t){const e=this.targetWorkspace;if(!t.getSvgRoot())throw Error("oldBlock is not rendered");var s=this.serializeBlock(t);return e.setResizesEnabled(!1),s=Ns(s,e,{recordUndo:!0}),this.positionNewBlock(t,s),e.hideChaff(),s}reflow(){this.inhibitReflowWrapper=!0,this.reflowInternal_(),this.inhibitReflowWrapper=!1}isScrollable(){return!!this.workspace_.scrollbar&&this.workspace_.scrollbar.isVisible()}serializeBlock(t){return $s(t)}positionNewBlock(t,e){const s=this.targetWorkspace;var i=s.getOriginOffsetInPixels(),o=this.workspace_.getOriginOffsetInPixels();(t=t.getRelativeToSurfaceXY()).scale(this.workspace_.scale),o=_c.sum(o,t),(i=_c.difference(o,i)).scale(1/s.scale),e.moveTo(new _c(i.x,i.y))}getInflaterForType(t){var e;return this.inflaters.has(t)?null!=(e=this.inflaters.get(t))?e:null:(e=r(zl.FLYOUT_INFLATER,t))?(e=new e,this.inflaters.set(t,e),e):null}getFocusableElement(){throw Error("Flyouts are not directly focusable.")}getFocusableTree(){throw Error("Flyouts are not directly focusable.")}onNodeFocus(){}onNodeBlur(){}canBeFocused(){return!1}getRootFocusableNode(){throw Error("Flyouts are not directly focusable.")}getRestoredFocusableNode(t){throw Error("Flyouts are not directly focusable.")}getNestedTrees(){throw Error("Flyouts are not directly focusable.")}lookUpFocusableNode(t){throw Error("Flyouts are not directly focusable.")}onTreeFocus(t,e){}onTreeBlur(t){throw Error("Flyouts are not directly focusable.")}},Yp=class{constructor(){this.isActive=!1,this.activeClassName="blocklyKeyboardNavigation"}setIsActive(t=!0){this.isActive=t,this.updateActiveVisualization()}getIsActive(){return this.isActive}updateActiveVisualization(){this.isActive?document.body.classList.add(this.activeClassName):document.body.classList.remove(this.activeClassName)}},Kp=new Yp,jp={};jp.KeyboardNavigationController=Yp,jp.keyboardNavigationController=Kp;var Jp=class{constructor(t){this.workspace=t,this.horizontalScrollEnabled=this.workspace.isMovableHorizontally(),this.verticalScrollEnabled=this.workspace.isMovableVertically(),this.startScrollXY_=new _c(t.scrollX,t.scrollY)}startDrag(){}endDrag(t){this.drag(t)}drag(t){if(t=_c.sum(this.startScrollXY_,t),this.horizontalScrollEnabled&&this.verticalScrollEnabled)this.workspace.scroll(t.x,t.y);else if(this.horizontalScrollEnabled)this.workspace.scroll(t.x,this.workspace.scrollY);else{if(!this.verticalScrollEnabled)throw new TypeError("Invalid state.");this.workspace.scroll(this.workspace.scrollX,t.y)}}},qp=class{constructor(t,e){this.creatorWorkspace=e,this.mouseDownXY=new _c(0,0),this.startWorkspace_=this.targetBlock=this.startComment=this.startBlock=this.startIcon=this.startField=this.startBubble=null,this.hasExceededDragRadius=!1,this.boundEvents=[],this.workspaceDragger=this.dragger=null,this.dragging=!1,this.flyout=null,this.multiTouch=this.isEnding_=this.gestureHasStarted=this.calledUpdateIsDragging=!1,this.cachedPoints=new Map,this.startDistance=this.previousScale=0,this.currentDropdownOwner=this.isPinchZoomEnabled=null,this.mostRecentEvent=t,this.currentDragDeltaXY=new _c(0,0)}dispose(){d(),Bi(),this.creatorWorkspace.clearGesture();for(const t of this.boundEvents)E(t);this.boundEvents.length=0}updateFromEvent(t){const e=new _c(t.clientX,t.clientY);this.updateDragDelta(e)&&(this.updateIsDragging(t),u()),this.mostRecentEvent=t}updateDragDelta(t){return this.currentDragDeltaXY=_c.difference(t,this.mouseDownXY),!this.hasExceededDragRadius&&(this.hasExceededDragRadius=_c.magnitude(this.currentDragDeltaXY)>(this.flyout?Hl.config$$module$build$src$core$config.flyoutDragRadius:Hl.config$$module$build$src$core$config.dragRadius))}updateIsDraggingFromFlyout(){let t;if(!this.targetBlock||null==(t=this.flyout)||!t.isBlockCreatable(this.targetBlock))return!1;if(!this.flyout.targetWorkspace)throw Error("Cannot update dragging from the flyout because the ' +\n 'flyout's target workspace is undefined");return this.startWorkspace_=this.flyout.targetWorkspace,this.startWorkspace_.updateScreenCalculationsIfScrolled(),Hl.getGroup$$module$build$src$core$events$utils()||Hl.setGroup$$module$build$src$core$events$utils(!0),this.startBlock=null,this.targetBlock=this.flyout.createBlock(this.targetBlock),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this.targetBlock),!0}updateIsDraggingWorkspace(){if(!this.startWorkspace_)throw Error("Cannot update dragging the workspace because the start workspace is undefined");(this.flyout?this.flyout.isScrollable():this.startWorkspace_&&this.startWorkspace_.isDraggable())&&(this.dragging=!0,this.workspaceDragger=new Jp(this.startWorkspace_),this.workspaceDragger.startDrag())}updateIsDragging(t){if(!this.startWorkspace_)throw Error("Cannot update dragging because the start workspace is undefined");if(this.calledUpdateIsDragging)throw Error("updateIsDragging_ should only be called once per gesture.");this.calledUpdateIsDragging=!0,this.flyout&&this.updateIsDraggingFromFlyout();const e=Nt();e&&ir(e)&&e.isMovable()?(this.dragging=!0,this.dragger=this.createDragger(e,this.startWorkspace_),this.dragger.onDragStart(t),this.dragger.onDrag(t,this.currentDragDeltaXY)):this.updateIsDraggingWorkspace()}createDragger(t,e){return new(c(zl.BLOCK_DRAGGER,this.creatorWorkspace.options,!0))(t,e)}doStart(t){if(!this.startWorkspace_)throw Error("Cannot start the touch gesture becauase the start workspace is undefined");this.isPinchZoomEnabled=this.startWorkspace_.options.zoomOptions&&this.startWorkspace_.options.zoomOptions.pinch,b(t)?this.cancel():(this.gestureHasStarted=!0,Gn(),this.startWorkspace_.updateScreenCalculationsIfScrolled(),this.startWorkspace_.isMutator&&this.startWorkspace_.resize(),this.currentDropdownOwner=Js(),this.startWorkspace_.hideChaff(!!this.flyout),this.startWorkspace_.markFocused(),this.mostRecentEvent=t,Pi(),f(t)?this.handleRightClick(t):("pointerdown"===t.type.toLowerCase()&&"mouse"!==t.pointerType&&h(t,this),this.mouseDownXY=new _c(t.clientX,t.clientY),this.bindMouseEvents(t),this.isEnding_||this.handleTouchStart(t)))}bindMouseEvents(t){this.boundEvents.push(T(document,"pointerdown",null,this.handleStart.bind(this),!0)),this.boundEvents.push(T(document,"pointermove",null,this.handleMove.bind(this),!0)),this.boundEvents.push(T(document,"pointerup",null,this.handleUp.bind(this),!0)),this.boundEvents.push(T(document,"pointercancel",null,this.handleUp.bind(this),!0)),t.preventDefault(),t.stopPropagation()}handleStart(t){this.isDragging()||(this.handleTouchStart(t),this.isMultiTouch()&&u())}handleMove(t){this.isDragging()&&p(t)||!this.isMultiTouch()?(this.updateFromEvent(t),this.workspaceDragger?this.workspaceDragger.drag(this.currentDragDeltaXY):this.dragger&&this.dragger.onDrag(this.mostRecentEvent,this.currentDragDeltaXY),t.preventDefault(),t.stopPropagation()):this.isMultiTouch()&&(this.handleTouchMove(t),u())}handleUp(t){if(this.isDragging()||this.handleTouchEnd(t),!this.isMultiTouch()||this.isDragging()){if(!p(t))return;if(this.updateFromEvent(t),u(),this.isEnding_)return void console.log("Trying to end a gesture recursively.");this.isEnding_=!0,this.dragger?(Kp.setIsActive(!1),this.dragger.onDragEnd(t,this.currentDragDeltaXY)):this.workspaceDragger?(Kp.setIsActive(!1),this.workspaceDragger.endDrag(this.currentDragDeltaXY)):this.isBubbleClick()||this.isCommentClick()||(this.isFieldClick()?this.doFieldClick():this.isIconClick()?this.doIconClick():this.isBlockClick()?this.doBlockClick():this.isWorkspaceClick()&&this.doWorkspaceClick(t))}t.preventDefault(),t.stopPropagation(),this.dispose()}handleTouchStart(t){var e=g(t);this.cachedPoints.set(e,this.getTouchPoint(t));var s=Array.from(this.cachedPoints.keys());2===s.length&&(e=this.cachedPoints.get(s[0]),s=this.cachedPoints.get(s[1]),this.startDistance=_c.distance(e,s),this.multiTouch=!0,t.preventDefault())}handleTouchMove(t){const e=g(t);this.cachedPoints.set(e,this.getTouchPoint(t)),this.isPinchZoomEnabled&&2===this.cachedPoints.size?this.handlePinch(t):(this.updateFromEvent(t),this.workspaceDragger?this.workspaceDragger.drag(this.currentDragDeltaXY):this.dragger&&this.dragger.onDrag(this.mostRecentEvent,this.currentDragDeltaXY),t.preventDefault(),t.stopPropagation())}handlePinch(t){var e=Array.from(this.cachedPoints.keys()),s=this.cachedPoints.get(e[0]);if(e=this.cachedPoints.get(e[1]),s=_c.distance(s,e)/this.startDistance,this.previousScale>0&&this.previousScale<1/0){if(e=(e=s-this.previousScale)>0?5*e:6*e,!this.startWorkspace_)throw Error("Cannot handle a pinch because the start workspace is undefined");const i=this.startWorkspace_,o=$(t,i.getParentSvg(),i.getInverseScreenCTM());i.zoom(o.x,o.y,e)}this.previousScale=s,t.preventDefault()}handleTouchEnd(t){t=g(t),this.cachedPoints.has(t)&&this.cachedPoints.delete(t),this.cachedPoints.size<2&&(this.cachedPoints.clear(),this.previousScale=0)}getTouchPoint(t){return this.startWorkspace_?new _c(t.pageX,t.pageY):null}isMultiTouch(){return this.multiTouch}cancel(){this.isEnding_||(u(),this.dragger?this.dragger.onDragEnd(this.mostRecentEvent,this.currentDragDeltaXY):this.workspaceDragger&&this.workspaceDragger.endDrag(this.currentDragDeltaXY),this.dispose())}handleRightClick(t){const e=Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode();if(sr(e)){let s;null==(s=this.startWorkspace_)||s.hideChaff(!!this.flyout),e.showContextMenu(t)}t.preventDefault(),t.stopPropagation(),Kp.setIsActive(!1),this.dispose()}handleWsStart(t,e){if(this.gestureHasStarted)throw Error("Tried to call gesture.handleWsStart, but the gesture had already been started.");this.setStartWorkspace(e),this.mostRecentEvent=t,this.targetBlock||this.startBubble||this.startComment||this.startIcon||Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(e),this.doStart(t)}fireWorkspaceClick(t){J(new(rt(ua.CLICK))(null,t.id,"workspace"))}handleFlyoutStart(t,e){if(this.gestureHasStarted)throw Error("Tried to call gesture.handleFlyoutStart, but the gesture had already been started.");this.setStartFlyout(e),this.handleWsStart(t,e.getWorkspace())}handleBlockStart(t,e){if(this.gestureHasStarted)throw Error("Tried to call gesture.handleBlockStart, but the gesture had already been started.");this.setStartBlock(e),this.mostRecentEvent=t}handleBubbleStart(t,e){if(this.gestureHasStarted)throw Error("Tried to call gesture.handleBubbleStart, but the gesture had already been started.");this.setStartBubble(e),this.mostRecentEvent=t}handleCommentStart(t,e){if(this.gestureHasStarted)throw Error("Tried to call gesture.handleCommentStart, but the gesture had already been started.");this.setStartComment(e),this.mostRecentEvent=t}doFieldClick(){if(!this.startField)throw Error("Cannot do a field click because the start field is undefined");this.currentDropdownOwner!==this.startField&&this.startField.showEditor(this.mostRecentEvent)}doIconClick(){if(!this.startIcon)throw Error("Cannot do an icon click because the start icon is undefined");this.startIcon.onClick()}doBlockClick(){if(this.flyout&&this.flyout.autoClose){if(!this.targetBlock)throw Error("Cannot do a block click because the target block is undefined");if(this.flyout.isBlockCreatable(this.targetBlock)){Hl.getGroup$$module$build$src$core$events$utils()||Hl.setGroup$$module$build$src$core$events$utils(!0);var t=this.flyout.createBlock(this.targetBlock);t.snapToGrid(),t.bumpNeighbours(),Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(t)}}else{if(!this.startWorkspace_)throw Error("Cannot do a block click because the start workspace is undefined");t=new(rt(ua.CLICK))(this.startBlock,this.startWorkspace_.id,"block"),J(t)}Hl.setGroup$$module$build$src$core$events$utils(!1)}doWorkspaceClick(t){this.fireWorkspaceClick(this.startWorkspace_||this.creatorWorkspace)}setStartField(t){if(this.gestureHasStarted)throw Error("Tried to call gesture.setStartField, but the gesture had already been started.");this.startField||(this.startField=t)}setStartIcon(t){if(this.gestureHasStarted)throw Error("Tried to call gesture.setStartIcon, but the gesture had already been started.");this.startIcon||(this.startIcon=t)}setStartBubble(t){this.startBubble||(this.startBubble=t)}setStartComment(t){this.startComment||(this.startComment=t)}setStartBlock(t){this.startBlock||this.startBubble||this.startIcon||(this.startBlock=t,t.isInFlyout&&t!==t.getRootBlock()?this.setTargetBlock(t.getRootBlock()):this.setTargetBlock(t))}setTargetBlock(t){t.isShadow()?this.setTargetBlock(t.getParent()):(this.targetBlock=t,Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this.targetBlock),this.targetBlock.bringToFront())}setStartWorkspace(t){this.startWorkspace_||(this.startWorkspace_=t)}setStartFlyout(t){this.flyout||(this.flyout=t)}isBubbleClick(){return!!this.startBubble&&!this.hasExceededDragRadius}isCommentClick(){return!!this.startComment&&!this.hasExceededDragRadius}isBlockClick(){return!(!this.startBlock||this.hasExceededDragRadius||this.isFieldClick()||this.isIconClick())}isFieldClick(){return!!this.startField&&this.startField.isClickable()&&!this.hasExceededDragRadius&&(!this.flyout||this.startField.isClickableInFlyout(this.flyout.autoClose))}isIconClick(){if(!this.startIcon)return!1;const t=!this.flyout||!this.startIcon.isClickableInFlyout||this.startIcon.isClickableInFlyout(this.flyout.autoClose);return!this.hasExceededDragRadius&&t}isWorkspaceClick(){return!(this.startBlock||this.startBubble||this.startField||this.hasExceededDragRadius)}getCurrentDragger(){let t,e;return null!=(e=null!=(t=this.workspaceDragger)?t:this.dragger)?e:null}isDragging(){return this.dragging}hasStarted(){return this.gestureHasStarted}static inProgress(){const t=yt();for(let e,s=0;e=t[s];s++)if(e.currentGesture_)return!0;return!1}},Zp=class{constructor(t,e){let s,i,o;this.pattern=t,this.scale=1,this.spacing=null!=(s=e.spacing)?s:0,this.length=null!=(i=e.length)?i:1,this.line2=(this.line1=t.firstChild)&&this.line1.nextSibling,this.snapToGrid=null!=(o=e.snap)&&o}setSpacing(t){this.spacing=t,this.update(this.scale)}getSpacing(){return this.spacing}setLength(t){this.length=t,this.update(this.scale)}getLength(){return this.length}setSnapToGrid(t){this.snapToGrid=t}shouldSnap(){return this.snapToGrid}getPatternId(){return this.pattern.id}update(t){this.scale=t;var e=this.spacing*t;this.pattern.setAttribute("width",`${e}`),this.pattern.setAttribute("height",`${e}`);let s=(e=Math.floor(this.spacing/2)+.5)-this.length/2,i=e+this.length/2;e*=t,s*=t,i*=t,this.setLineAttributes(this.line1,t,s,i,e,e),this.setLineAttributes(this.line2,t,e,e,s,i)}setLineAttributes(t,e,s,i,o,n){t&&(t.setAttribute("stroke-width",`${e}`),t.setAttribute("x1",`${s}`),t.setAttribute("y1",`${o}`),t.setAttribute("x2",`${i}`),t.setAttribute("y2",`${n}`))}moveTo(t,e){this.pattern.setAttribute("x",`${t}`),this.pattern.setAttribute("y",`${e}`)}alignXY(t){var e=this.getSpacing();const s=e/2,i=Math.round(Math.round((t.x-s)/e)*e+s);return e=Math.round(Math.round((t.y-s)/e)*e+s),i===t.x&&e===t.y?t:new _c(i,e)}static createDom(t,e,s,i){let o,n;if(t=at(Tc.PATTERN,{id:"blocklyGridPattern"+t,patternUnits:"userSpaceOnUse"},s),(null!=(o=e.length)?o:1)>0&&(null!=(n=e.spacing)?n:0)>0){let s;at(Tc.LINE,{stroke:e.colour},t),null!=(s=e.length)&&s&&at(Tc.LINE,{stroke:e.colour},t)}else at(Tc.LINE,{},t);return i&&i.style.setProperty("--blocklyGridPattern",`url(#${t.id})`),t}},Qp=class{constructor(t){this.workspace=t,this.layers=new Map,(t=t.getInjectionDiv())&&(this.dragLayer=this.createDragLayer(t),this.animationLayer=this.createAnimationLayer(t)),t=this.createLayer(nd),ct(t,"blocklyBlockCanvas"),t=this.createLayer(rd),ct(t,"blocklyBubbleCanvas")}createDragLayer(t){const e=at(Tc.SVG,{class:"blocklyBlockDragSurface",xmlns:Pa,"xmlns:html":Ba,"xmlns:xlink":Fa,version:"1.1"});return t.append(e),at(Tc.G,{},e)}createAnimationLayer(t){const e=at(Tc.SVG,{class:"blocklyAnimationLayer",xmlns:Pa,"xmlns:html":Ba,"xmlns:xlink":Fa,version:"1.1"});return t.append(e),at(Tc.G,{},e)}appendToAnimationLayer(t){let e;const s=null==(e=this.dragLayer)?void 0:e.getAttribute("transform");if(s){let t;null==(t=this.animationLayer)||t.setAttribute("transform",s)}let i;null==(i=this.animationLayer)||i.appendChild(t.getSvgRoot())}translateLayers(t,e){let s;t=`translate(${t.x}, ${t.y}) scale(${e})`,null==(s=this.dragLayer)||s.setAttribute("transform",t);for(const[,e]of this.layers)e.setAttribute("transform",t)}moveToDragLayer(t,e=!0){let s;null==(s=this.dragLayer)||s.appendChild(t.getSvgRoot()),e&&t.canBeFocused()&&Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(t)}moveOffDragLayer(t,e,s=!0){this.append(t,e),s&&t.canBeFocused()&&Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(t)}append(t,e){let s;if(this.layers.has(e)||this.createLayer(e),t=t.getSvgRoot(),(null==(s=this.layers.get(e))?void 0:s.lastChild)!==t){let s;null==(s=this.layers.get(e))||s.appendChild(t)}}createLayer(t){const e=this.workspace.getSvgGroup(),s=at(Tc.G,{});let i=!1;const o=[...this.layers].sort((t,e)=>t[0]-e[0]);for(const[n,r]of o)if(t{let e;return t instanceof Ep&&!(null!=(e=t.outputConnection)&&e.targetBlock())||t instanceof fd},!0))&&this.setCurNode(t),t):null}in(){var t=this.getCurNode();return t?((t=this.getNextNode(t,()=>!0,!0))&&this.setCurNode(t),t):null}prev(){var t=this.getCurNode();return t?((t=this.getPreviousNode(t,t=>{let e;return t instanceof Ep&&!(null!=(e=t.outputConnection)&&e.targetBlock())||t instanceof fd},!0))&&this.setCurNode(t),t):null}out(){var t=this.getCurNode();return t?((t=this.getPreviousNode(t,()=>!0,!0))&&this.setCurNode(t),t):null}atEndOfLine(){var t=this.getCurNode();return!!t&&this.getNextNode(t,()=>!0,!0)===this.getNextNode(t,t=>{let e;return t instanceof Ep&&!(null!=(e=t.outputConnection)&&e.targetBlock())},!0)}getNextNodeImpl(t,e,s=new Set){if(!t||s.has(t))return null;let i=this.workspace.getNavigator().getFirstChild(t)||this.workspace.getNavigator().getNextSibling(t);for(var o=t;o&&!i&&(o=this.workspace.getNavigator().getParent(o));)i=this.workspace.getNavigator().getNextSibling(o);return e(i)?i:i?(s.add(t),this.getNextNodeImpl(i,e,s)):null}getNextNode(t,e,s){return!t||!s&&this.getLastNode()===t?null:this.getNextNodeImpl(t,e)}getPreviousNodeImpl(t,e,s=new Set){if(!t||s.has(t))return null;const i=this.getRightMostChild(this.workspace.getNavigator().getPreviousSibling(t),t)||this.workspace.getNavigator().getParent(t);return e(i)?i:i?(s.add(t),this.getPreviousNodeImpl(i,e,s)):null}getPreviousNode(t,e,s){return!t||!s&&this.getFirstNode()===t?null:this.getPreviousNodeImpl(t,e)}getRightMostChild(t,e){if(!t)return t;let s=this.workspace.getNavigator().getFirstChild(t);if(!s||s===e)return t;for(t=s;t&&t!==e;t=this.workspace.getNavigator().getNextSibling(s))s=t;return this.getRightMostChild(s,e)}preDelete(t){var e,s=this.getCurNode();let i,o;s=s?[s]:[];const n=null!=(o=null==(e=t.previousConnection)?void 0:e.targetConnection)?o:null==(i=t.outputConnection)?void 0:i.targetConnection;n&&s.push(n),(e=t.getNextBlock())&&s.push(e),(t=t.getParent())&&s.push(t),s.push(this.workspace),this.potentialNodes=s}postDelete(){const t=this.potentialNodes;if(this.potentialNodes=null,!t)throw Error("must call preDelete first");for(const e of t){let t;if(null==(t=this.getSourceBlockFromNode(e))||!t.disposed)return void this.setCurNode(e)}throw Error("no valid nodes in this.potentialNodes")}getCurNode(){return Hl.getFocusManager$$module$build$src$core$focus_manager().getFocusedNode()}setCurNode(t){Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(t)}getFirstNode(){return this.workspace.getNavigator().getFirstChild(this.workspace)}getLastNode(){const t=this.getFirstNode();return this.getPreviousNode(t,()=>!0,!0)}};t(zl.CURSOR,Xl,eg);var sg=class{constructor(t){this.workspace=t,this.markers=new Map,this.cursor=new eg(this.workspace)}registerMarker(t,e){this.markers.has(t)&&this.unregisterMarker(t),this.markers.set(t,e)}unregisterMarker(t){const e=this.markers.get(t);if(!e)throw Error("Marker with ID "+t+" does not exist. Can only unregister markers that exist.");e.dispose(),this.markers.delete(t)}getCursor(){return this.cursor}getMarker(t){return this.markers.get(t)||null}setCursor(t){this.cursor=t}dispose(){const t=Object.keys(this.markers);for(let e,s=0;e=t[s];s++)this.unregisterMarker(e);this.markers.clear(),this.cursor.dispose()}};sg.LOCAL_MARKER="local_marker_1";var ig={};ig.CommentIcon=Pp,ig.Icon=xd,ig.IconType=Kh,ig.MutatorIcon=Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon,ig.WarningIcon=mp,ig.exceptions=Jd,ig.registry=xp,Hl.Names$$module$build$src$core$names=class{constructor(t,e){this.db=new Map,this.dbReverse=new Set,this.variableMap=null,this.variablePrefix=e||"",this.reservedWords=new Set(t?t.split(","):[])}reset(){this.db.clear(),this.dbReverse.clear(),this.variableMap=null}setVariableMap(t){this.variableMap=t}getNameForUserVariable(t){return this.variableMap?(t=this.variableMap.getVariableById(t))?t.getName():null:(console.warn("Deprecated call to Names.prototype.getName without defining a variable map. To fix, add the following code in your generator's init() function:\nBlockly.YourGeneratorName.nameDB_.setVariableMap(workspace.getVariableMap());"),null)}populateVariables(t){t=Hl.allUsedVarModels$$module$build$src$core$variables(t);for(let e=0;e=1}isHat(t){return(t.type&this.HAT)>=1}isIcon(t){return(t.type&this.ICON)>=1}isSpacer(t){return(t.type&this.SPACER)>=1}isInRowSpacer(t){return(t.type&this.IN_ROW_SPACER)>=1}isSpacerRow(t){return(t.type&this.BETWEEN_ROW_SPACER)>=1}isInput(t){return(t.type&this.INPUT)>=1}isExternalInput(t){return(t.type&this.EXTERNAL_VALUE_INPUT)>=1}isInlineInput(t){return(t.type&this.INLINE_INPUT)>=1}isStatementInput(t){return(t.type&this.STATEMENT_INPUT)>=1}isPreviousConnection(t){return(t.type&this.PREVIOUS_CONNECTION)>=1}isNextConnection(t){return(t.type&this.NEXT_CONNECTION)>=1}isPreviousOrNextConnection(t){return this.isPreviousConnection(t)||this.isNextConnection(t)}isRoundCorner(t){return(t.type&this.LEFT_ROUND_CORNER)>=1||(t.type&this.RIGHT_ROUND_CORNER)>=1}isLeftRoundedCorner(t){return this.isRoundCorner(t)&&(t.type&this.LEFT_ROUND_CORNER)>=1}isRightRoundedCorner(t){return this.isRoundCorner(t)&&(t.type&this.RIGHT_ROUND_CORNER)>=1}isLeftSquareCorner(t){return(t.type&this.LEFT_SQUARE_CORNER)>=1}isRightSquareCorner(t){return(t.type&this.RIGHT_SQUARE_CORNER)>=1}isCorner(t){return(t.type&this.CORNER)>=1}isJaggedEdge(t){return(t.type&this.JAGGED_EDGE)>=1}isRow(t){return(t.type&this.ROW)>=1}isBetweenRowSpacer(t){return(t.type&this.BETWEEN_ROW_SPACER)>=1}isTopRow(t){return(t.type&this.TOP_ROW)>=1}isBottomRow(t){return(t.type&this.BOTTOM_ROW)>=1}isTopOrBottomRow(t){return this.isTopRow(t)||this.isBottomRow(t)}isInputRow(t){return(t.type&this.INPUT_ROW)>=1}},ag=class{constructor(t){this.centerline=this.xPos=this.height=this.width=0,this.constants_=t,this.type=lg.NONE,this.notchOffset=this.constants_.NOTCH_OFFSET_LEFT}},cg=class{constructor(t){this.elements=[],this.xPos=this.yPos=this.widthWithConnectedBlocks=this.minWidth=this.minHeight=this.width=this.height=0,this.hasStatement=this.hasExternalInput=!1,this.statementEdge=0,this.hasJaggedEdge=this.hasDummyInput=this.hasInlineInput=!1,this.align=null,this.constants_=t,this.type=lg.ROW,this.notchOffset=this.constants_.NOTCH_OFFSET_LEFT}getLastInput(){for(let t=this.elements.length-1;t>=0;t--){const e=this.elements[t];if(lg.isInput(e))return e}return null}measure(){throw Error("Unexpected attempt to measure a base Row.")}startsWithElemSpacer(){return!0}endsWithElemSpacer(){return!0}getFirstSpacer(){for(let t=0;t=0;t--){const e=this.elements[t];if(lg.isInRowSpacer(e))return e}return null}},hg=class extends cg{constructor(t){super(t),this.hasNextConnection=!1,this.connection=null,this.baseline=this.descenderHeight=0,this.type|=lg.BOTTOM_ROW}hasLeftSquareCorner(t){return!!t.outputConnection||!!t.getNextBlock()}hasRightSquareCorner(t){return!0}measure(){let t=0,e=0,s=0;for(let i=0;irect,`,`${t} .blocklyEditableField>rect {`,`fill: ${this.FIELD_BORDER_RECT_COLOUR};`,"fill-opacity: .6;","stroke: none;","}",`${t} .blocklyNonEditableField>text,`,`${t} .blocklyEditableField>text {`,"fill: #000;","}",`${t} .blocklyFlyoutLabelText {`,"fill: #000;","}",`${t} .blocklyText.blocklyBubbleText {`,"fill: #000;","}",`${t} .blocklyEditableField:not(.blocklyEditing):hover>rect {`,"stroke: #fff;","stroke-width: 2;","}",`${t} .blocklyHtmlInput {`,`font-family: ${this.FIELD_TEXT_FONTFAMILY};`,`font-weight: ${this.FIELD_TEXT_FONTWEIGHT};`,"}",`${t} .blocklySelected>.blocklyPath {`,"stroke: #fc3;","stroke-width: 3px;","}",`${t} .blocklyHighlightedConnectionPath {`,"stroke: #fc3;","}",`${t} .blocklyReplaceable .blocklyPath {`,"fill-opacity: .5;","}",`${t} .blocklyReplaceable .blocklyPathLight,`,`${t} .blocklyReplaceable .blocklyPathDark {`,"display: none;","}",`${t} .blocklyInsertionMarker>.blocklyPath {`,`fill-opacity: ${this.INSERTION_MARKER_OPACITY};`,"stroke: none;","}"]}},vg={};vg.ConstantProvider=Ag,vg.isDynamicShape=br,vg.isNotch=$r,vg.isPuzzleTab=fr;var Ng=class{constructor(t,e){this.inlinePath_=this.outlinePath_="",this.block_=t,this.info_=e,this.topLeft_=t.getRelativeToSurfaceXY(),this.constants_=e.getRenderer().getConstants()}draw(){this.drawOutline_(),this.drawInternals_(),this.updateConnectionHighlights(),this.block_.pathObject.setPath(this.outlinePath_+"\n"+this.inlinePath_),this.info_.RTL&&this.block_.pathObject.flipRTL(),this.recordSizeOnBlock_()}recordSizeOnBlock_(){this.block_.height=this.info_.height,this.block_.width=this.info_.widthWithChildren,this.block_.childlessWidth=this.info_.width}drawOutline_(){this.drawTop_();for(let t=1;t0&&this.addAlignmentPadding_(e,t),lg.isTopOrBottomRow(e)&&(e.widthWithConnectedBlocks=e.width)}}getDesiredRowWidth_(t){return this.width-this.startX}addAlignmentPadding_(t,e){const s=t.getFirstSpacer(),i=t.getLastSpacer();if((t.hasExternalInput||t.hasStatement)&&(t.widthWithConnectedBlocks+=e),t.align===Hl.Align$$module$build$src$core$inputs$align.LEFT&&i)i.width+=e;else if(t.align===Hl.Align$$module$build$src$core$inputs$align.CENTRE&&s&&i)s.width+=e/2,i.width+=e/2;else if(t.align===Hl.Align$$module$build$src$core$inputs$align.RIGHT&&s)s.width+=e;else{if(!i)return;i.width+=e}t.width+=e}alignStatementRow_(t){const e=t.getLastInput();if(e){var s=t.width-e.width,i=this.statementEdge;(s=i-s)>0&&this.addAlignmentPadding_(t,s),s=t.width,i=this.getDesiredRowWidth_(t),e.width+=i-s,e.height=Math.max(e.height,t.height),t.width+=i-s,t.widthWithConnectedBlocks=Math.max(t.width,this.statementEdge+t.connectedBlockWidths)}}addRowSpacing_(){const t=this.rows;this.rows=[];for(let e=0;e=0;e--)s[e].element===t&&s.splice(e,1);s.length||this.componentDB.delete(e)}}dispose(){this.subscribedWorkspaces.length=0,this.componentDB.clear()}},Pg="VARIABLE_DYNAMIC",Bg={CATEGORY_NAME:Pg};Bg.flyoutCategory=Ar,Bg.flyoutCategoryBlocks=Nr,Bg.internalFlyoutCategory=kr,Bg.onCreateVariableButtonClick_Colour=Or,Bg.onCreateVariableButtonClick_Number=yr,Bg.onCreateVariableButtonClick_String=Rr;var Fg=class{canConnect(t,e,s,i){return this.canConnectWithReason(t,e,s,i)===Kd.CAN_CONNECT}canConnectWithReason(t,e,s,i){const o=this.doSafetyChecks(t,e);return o!==Kd.CAN_CONNECT?o:this.doTypeChecks(t,e)?s&&!this.doDragChecks(t,e,i||0)?Kd.REASON_DRAG_CHECKS_FAILED:Kd.CAN_CONNECT:Kd.REASON_CHECKS_FAILED}getErrorMessage(t,e,s){switch(t){case Kd.REASON_SELF_CONNECTION:return"Attempted to connect a block to itself.";case Kd.REASON_DIFFERENT_WORKSPACES:return"Blocks not on same workspace.";case Kd.REASON_WRONG_TYPE:return"Attempt to connect incompatible types.";case Kd.REASON_TARGET_NULL:return"Target connection is null.";case Kd.REASON_CHECKS_FAILED:return"Connection checks failed. "+e+" expected "+e.getCheck()+", found "+s.getCheck();case Kd.REASON_SHADOW_PARENT:return"Connecting non-shadow to shadow block.";case Kd.REASON_DRAG_CHECKS_FAILED:return"Drag checks failed.";case Kd.REASON_PREVIOUS_AND_OUTPUT:return"Block would have an output and a previous connection.";default:return"Unknown connection failure: this should never happen!"}}doSafetyChecks(t,e){if(!t||!e)return Kd.REASON_TARGET_NULL;let s,i,o;return t.isSuperior()?(s=t.getSourceBlock(),i=e.getSourceBlock(),o=e):(i=t.getSourceBlock(),s=e.getSourceBlock(),o=t,t=e),s===i?Kd.REASON_SELF_CONNECTION:o.type!==Zd[t.type]?Kd.REASON_WRONG_TYPE:s.workspace!==i.workspace?Kd.REASON_DIFFERENT_WORKSPACES:s.isShadow()&&!i.isShadow()?Kd.REASON_SHADOW_PARENT:o.type===Vd.OUTPUT_VALUE&&i.previousConnection&&i.previousConnection.isConnected()||o.type===Vd.PREVIOUS_STATEMENT&&i.outputConnection&&i.outputConnection.isConnected()?Kd.REASON_PREVIOUS_AND_OUTPUT:Kd.CAN_CONNECT}doTypeChecks(t,e){if(t=t.getCheck(),e=e.getCheck(),!t||!e)return!0;for(let s=0;ss||e.getSourceBlock().isInsertionMarker())return!1;switch(e.type){case Vd.PREVIOUS_STATEMENT:return this.canConnectToPrevious_(t,e);case Vd.OUTPUT_VALUE:if(e.isConnected()&&!e.targetBlock().isInsertionMarker()||t.isConnected())return!1;break;case Vd.INPUT_VALUE:if(e.isConnected()&&!e.targetBlock().isMovable()&&!e.targetBlock().isShadow())return!1;break;case Vd.NEXT_STATEMENT:if(e.isConnected()&&!t.getSourceBlock().nextConnection&&!e.targetBlock().isShadow()&&e.targetBlock().nextConnection||e.targetBlock()&&!e.targetBlock().isMovable()&&!e.targetBlock().isShadow())return!1;break;default:return!1}return!Qa.includes(e)}canConnectToPrevious_(t,e){return!(t.targetConnection||Qa.includes(e)||e.targetConnection&&(!(t=e.targetBlock()).isInsertionMarker()||t.getPreviousBlock()))}};t(zl.CONNECTION_CHECKER,Xl,Fg);var Ug=class{get isFlyout(){return this.internalIsFlyout}get isMutator(){return this.internalIsMutator}constructor(t){this.isClearing=this.internalIsMutator=this.internalIsFlyout=this.rendered=!1,this.MAX_UNDO=1024,this.connectionDBList=[],this.topBlocks=[],this.topComments=[],this.commentDB=new Map,this.listeners=[],this.undoStack_=[],this.redoStack_=[],this.blockDB=new Map,this.typedBlocksDB=new Map,this.procedureMap=new rg,this.readOnly=!1,this.potentialVariableMap=null,this.id=S(),Ot(this),this.options=t||new wd({}),this.RTL=!!this.options.RTL,this.horizontalLayout=!!this.options.horizontalLayout,this.toolboxPosition=this.options.toolboxPosition,this.connectionChecker=new(c(zl.CONNECTION_CHECKER,this.options,!0))(this),this.variableMap=new(this.getVariableMapClass())(this),this.setIsReadOnly(this.options.readOnly)}dispose(){this.listeners.length=0,this.clear(),kt(this)}sortObjects(t,e){const s=t=>({getBoundingRectangle:()=>{const e=t.getRelativeToSurfaceXY();return new mc(e.y,e.y,e.x,e.x)},moveBy:()=>{}});return this.sortByOrigin(s(t),s(e))}sortByOrigin(t,e){const s=Math.sin(Xs(Ug.SCAN_ANGLE))*(this.RTL?-1:1);return t=t.getBoundingRectangle().getOrigin(),e=e.getBoundingRectangle().getOrigin(),t.y+s*t.x-(e.y+s*e.x)}addTopBlock(t){this.topBlocks.push(t)}removeTopBlock(t){if(!Gt(this.topBlocks,t))throw Error("Block not present in workspace's list of top-most blocks.")}getTopBlocks(t=!1){const e=[].concat(this.topBlocks);return t&&e.length>1&&e.sort(this.sortObjects.bind(this)),e}addTypedBlock(t){this.typedBlocksDB.has(t.type)||this.typedBlocksDB.set(t.type,[]),this.typedBlocksDB.get(t.type).push(t)}removeTypedBlock(t){Gt(this.typedBlocksDB.get(t.type),t),this.typedBlocksDB.get(t.type).length||this.typedBlocksDB.delete(t.type)}getBlocksByType(t,e=!1){return this.typedBlocksDB.has(t)?(t=this.typedBlocksDB.get(t).slice(0),e&&t&&t.length>1&&t.sort(this.sortObjects.bind(this)),t.filter(t=>!t.isInsertionMarker())):[]}addTopComment(t){this.topComments.push(t),this.commentDB.has(t.id)&&console.warn('Overriding an existing comment on this workspace, with id "'+t.id+'"'),this.commentDB.set(t.id,t)}removeTopComment(t){if(!Gt(this.topComments,t))throw Error("Comment not present in workspace's list of top-most comments.");this.commentDB.delete(t.id)}getTopComments(t=!1){const e=[].concat(this.topComments);return t&&e.length>1&&e.sort(this.sortObjects.bind(this)),e}getAllBlocks(t=!1){if(t){var e=this.getTopBlocks(!0);t=[];for(let s=0;s!t.isInsertionMarker())}clear(){this.isClearing=!0;try{const t=Hl.getGroup$$module$build$src$core$events$utils();for(t||Hl.setGroup$$module$build$src$core$events$utils(!0);this.topBlocks.length;)this.topBlocks[0].dispose(!1);for(;this.topComments.length;)this.topComments[this.topComments.length-1].dispose();Hl.setGroup$$module$build$src$core$events$utils(t),this.isFlyout||this.variableMap.clear(),this.potentialVariableMap&&this.potentialVariableMap.clear()}finally{this.isClearing=!1}}renameVariableById(t,e){Qe("Blockly.Workspace.renameVariableById","v12","v13","Blockly.Workspace.getVariableMap().renameVariable"),(t=this.variableMap.getVariableById(t))&&this.variableMap.renameVariable(t,e)}createVariable(t,e,s){return Qe("Blockly.Workspace.createVariable","v12","v13","Blockly.Workspace.getVariableMap().createVariable"),this.variableMap.createVariable(t,null!=e?e:void 0,null!=s?s:void 0)}getVariableUsesById(t){return Qe("Blockly.Workspace.getVariableUsesById","v12","v13","Blockly.Variables.getVariableUsesById"),fs(this,t)}deleteVariableById(t){Qe("Blockly.Workspace.deleteVariableById","v12","v13","Blockly.Workspace.getVariableMap().deleteVariable");const e=this.variableMap.getVariableById(t);e?Hl.deleteVariable$$module$build$src$core$variables(this,e):console.warn(`Can't delete non-existent variable: ${t}`)}getVariable(t,e){return Qe("Blockly.Workspace.getVariable","v12","v13","Blockly.Workspace.getVariableMap().getVariable"),this.variableMap.getVariable(t,e)}getVariableById(t){return Qe("Blockly.Workspace.getVariableById","v12","v13","Blockly.Workspace.getVariableMap().getVariableById"),this.variableMap.getVariableById(t)}getVariablesOfType(t){return Qe("Blockly.Workspace.getVariablesOfType","v12","v13","Blockly.Workspace.getVariableMap().getVariablesOfType"),this.variableMap.getVariablesOfType(null!=t?t:"")}getAllVariables(){return Qe("Blockly.Workspace.getAllVariables","v12","v13","Blockly.Workspace.getVariableMap().getAllVariables"),this.variableMap.getAllVariables()}getAllVariableNames(){return Qe("Blockly.Workspace.getAllVariableNames","v12","v13","Blockly.Workspace.getVariableMap().getAllVariables"),this.variableMap.getAllVariables().map(t=>t.getName())}getWidth(){return 0}newBlock(t,e){throw Error("The implementation of newBlock should be monkey-patched in by blockly.ts")}newComment(t){throw Error("The implementation of newComment should be monkey-patched in by blockly.ts")}remainingCapacity(){return isNaN(this.options.maxBlocks)?1/0:this.options.maxBlocks-this.getAllBlocks(!1).length}remainingCapacityOfType(t){return this.options.maxInstances?(void 0!==this.options.maxInstances[t]?this.options.maxInstances[t]:1/0)-this.getBlocksByType(t,!1).length:1/0}isCapacityAvailable(t){if(!this.hasBlockLimits())return!0;let e=0;for(const s in t){if(t[s]>this.remainingCapacityOfType(s))return!1;e+=t[s]}return!(e>this.remainingCapacity())}hasBlockLimits(){return this.options.maxBlocks!==1/0||!!this.options.maxInstances}getUndoStack(){return this.undoStack_}getRedoStack(){return this.redoStack_}undo(t){var e=t?this.redoStack_:this.undoStack_,s=t?this.undoStack_:this.redoStack_;const i=e.pop();if(i){for(var o=[i];e.length&&i.group&&i.group===e[e.length-1].group;){const t=e.pop();t&&o.push(t)}for(e=0;ethis.MAX_UNDO&&this.MAX_UNDO>=0;)this.undoStack_.shift();for(let e=0;e{s.sounds.set(e,t)})}})}play(t,e){const s=this;return(0,Fl.asyncExecutePromiseGeneratorFunction)(function*(){if(!s.muted&&0!==e&&s.context){var i=s.sounds.get(t);if(i){const t=new Date;if(!(null!==s.lastSound&&t.getTime()-s.lastSound.getTime()<100)){s.lastSound=t,"suspended"===s.context.state&&(yield s.context.resume());var o=s.context.createBufferSource(),n=s.context.createGain();n.gain.value=null!=e?e:1,n.connect(s.context.destination),o.buffer=i,o.connect(n),o.addEventListener("ended",()=>{o.disconnect(),n.disconnect()}),o.start()}}else s.parentWorkspace&&s.parentWorkspace.getAudioManager().play(t,e)}})}setMuted(t){this.muted=t}getMuted(){return this.muted}},Gg=class extends Ug{constructor(t){let e;super(t),this.resizeHandlerWrapper=null,this.resizesEnabled=this.visible=this.rendered=!0,this.startScrollY=this.startScrollX=this.scrollY=this.scrollX=0,this.oldScale=this.scale=1,this.oldLeft=this.oldTop=0,this.inverseScreenCTM=this.targetWorkspace=this.dummyWheelListener=this.configureContextMenu=this.lastRecordedPageScroll=this.injectionDiv=this.currentGesture_=this.toolbox=this.flyout=this.scrollbar=this.trashcan=null,this.inverseScreenCTMDirty=!0,this.highlightedBlocks=[],this.toolboxCategoryCallbacks=new Map,this.flyoutButtonCallbacks=new Map,this.cachedParentSvg=null,this.keyboardMoveInProgress=this.keyboardAccessibilityMode=!1,this.topBoundedElements=[],this.dragTargetAreas=[],this.zoomControls_=this.layerManager=null,this.navigator=new Hp,this.metricsManager=new(c(zl.METRICS_MANAGER,t,!0))(this),this.getMetrics=t.getMetrics||this.metricsManager.getMetrics.bind(this.metricsManager),this.setMetrics=t.setMetrics||Gg.setTopLevelWorkspaceMetrics,this.componentManager=new cc,this.connectionDBList=Xd.init(this.connectionChecker),this.audioManager=new Hg(t.parentWorkspace),this.grid=this.options.gridPattern?new Zp(this.options.gridPattern,t.gridOptions):null,this.markerManager=new sg(this),Bh&&ts&&this.registerToolboxCategoryCallback(Dh,ts),Bg&&kr&&this.registerToolboxCategoryCallback(Pg,kr),ng&&dr&&(this.registerToolboxCategoryCallback(og,dr),this.addChangeListener(_r)),this.addChangeListener(this.variableChangeCallback.bind(this)),this.themeManager_=this.options.parentWorkspace?this.options.parentWorkspace.getThemeManager():new xg(this,this.options.theme||Nd),this.themeManager_.subscribeWorkspace(this),this.renderer=Sr(this.options.renderer||"geras",this.getTheme(),null!=(e=this.options.rendererOverrides)?e:void 0),this.cachedParentSvgSize=new Ec(0,0)}getMarkerManager(){return this.markerManager}getMetricsManager(){return this.metricsManager}setMetricsManager(t){this.metricsManager=t,this.getMetrics=this.metricsManager.getMetrics.bind(this.metricsManager)}getComponentManager(){return this.componentManager}getMarker(t){return this.markerManager.getMarker(t)}getCursor(){return this.markerManager.getCursor()}getRenderer(){return this.renderer}getThemeManager(){return this.themeManager_}getTheme(){return this.themeManager_.getTheme()}setTheme(t){t||(t=Nd),this.themeManager_.setTheme(t)}refreshTheme(){if(this.svgGroup_){var t=null===this.options.parentWorkspace;this.renderer.refreshDom(this.svgGroup_,this.getTheme(),t?this.getInjectionDiv():void 0)}this.updateBlockStyles(this.getAllBlocks(!1).filter(t=>!!t.getStyleName())),this.refreshToolboxSelection(),this.toolbox&&this.toolbox.refreshTheme(),this.isVisible()&&this.setVisible(!0),t=new(rt(ua.THEME_CHANGE))(this.getTheme().name,this.id),J(t)}updateBlockStyles(t){for(let e,s=0;e=t[s];s++){const t=e.getStyleName();t&&e.setStyle(t)}}getInverseScreenCTM(){if(this.inverseScreenCTMDirty){const t=this.getParentSvg().getScreenCTM();t&&(this.inverseScreenCTM=t.inverse(),this.inverseScreenCTMDirty=!1)}return this.inverseScreenCTM}updateInverseScreenCTM(){this.inverseScreenCTMDirty=!0}isVisible(){return this.visible}getSvgXY(t){let e=0,s=0,i=1;(this.getCanvas().contains(t)||this.getBubbleCanvas().contains(t))&&(i=this.scale);do{const o=te(t);t!==this.getCanvas()&&t!==this.getBubbleCanvas()||(i=1),e+=o.x*i,s+=o.y*i,t=t.parentNode}while(t&&t!==this.getParentSvg()&&t!==this.getInjectionDiv());return new _c(e,s)}getCachedParentSvgSize(){const t=this.cachedParentSvgSize;return new Ec(t.width,t.height)}getOriginOffsetInPixels(){return ee(this.getCanvas())}getInjectionDiv(){if(!this.injectionDiv){let t=this.svgGroup_;for(;t;){if((" "+(t.getAttribute("class")||"")+" ").includes(" injectionDiv ")){this.injectionDiv=t;break}t=t.parentNode}}return this.injectionDiv}getSvgGroup(){return this.svgGroup_}getBlockCanvas(){return this.getCanvas()}setResizeHandlerWrapper(t){this.resizeHandlerWrapper=t}createDom(t,e){return this.injectionDiv||(this.injectionDiv=null!=e?e:null),this.svgGroup_=at(Tc.G,{class:"blocklyWorkspace",id:this.id}),e&&Ne(this.svgGroup_,Qc.LABEL,Hl.Msg$$module$build$src$core$msg.WORKSPACE_ARIA_LABEL),t&&(this.svgBackground_=at(Tc.RECT,{height:"100%",width:"100%",class:t},this.svgGroup_),"blocklyMainBackground"===t&&this.grid?this.svgBackground_.style.fill="var(--blocklyGridPattern)":this.themeManager_.subscribe(this.svgBackground_,"workspaceBackgroundColour","fill")),this.layerManager=new Qp(this),this.svgBlockCanvas_=this.layerManager.getBlockLayer(),this.svgBubbleCanvas_=this.layerManager.getBubbleLayer(),this.isFlyout||(T(this.svgGroup_,"pointerdown",this,this.onMouseDown,!1),this.dummyWheelListener=()=>{},document.body.addEventListener("wheel",this.dummyWheelListener,{passive:!0}),T(this.svgGroup_,"wheel",this,this.onMouseWheel,!1,{passive:!1})),this.options.hasCategories&&(this.toolbox=new(c(zl.TOOLBOX,this.options,!0))(this)),this.grid&&this.grid.update(this.scale),this.recordDragTargets(),(t=c(zl.CURSOR,this.options))&&this.markerManager.setCursor(new t(this)),t=null===this.options.parentWorkspace,this.renderer.createDom(this.svgGroup_,this.getTheme(),t?this.getInjectionDiv():void 0),Hl.getFocusManager$$module$build$src$core$focus_manager().registerTree(this,!!this.injectionDiv||this.isFlyout),this.svgGroup_}dispose(){if(this.rendered=!1,this.currentGesture_&&this.currentGesture_.cancel(),this.svgGroup_&&pt(this.svgGroup_),this.toolbox&&(this.toolbox.dispose(),this.toolbox=null),this.flyout&&(this.flyout.dispose(),this.flyout=null),this.trashcan&&(this.trashcan.dispose(),this.trashcan=null),this.scrollbar&&(this.scrollbar.dispose(),this.scrollbar=null),this.zoomControls_&&this.zoomControls_.dispose(),this.audioManager&&this.audioManager.dispose(),this.grid&&(this.grid=null),this.renderer.dispose(),this.markerManager.dispose(),super.dispose(),this.themeManager_&&(this.themeManager_.unsubscribeWorkspace(this),this.themeManager_.unsubscribe(this.svgBackground_),this.options.parentWorkspace||this.themeManager_.dispose()),this.connectionDBList.length=0,this.toolboxCategoryCallbacks.clear(),this.flyoutButtonCallbacks.clear(),!this.options.parentWorkspace){const t=this.getParentSvg();t&&t.parentNode&&pt(t.parentNode)}this.resizeHandlerWrapper&&(E(this.resizeHandlerWrapper),this.resizeHandlerWrapper=null),this.dummyWheelListener&&(document.body.removeEventListener("wheel",this.dummyWheelListener),this.dummyWheelListener=null),Hl.getFocusManager$$module$build$src$core$focus_manager().isRegistered(this)&&Hl.getFocusManager$$module$build$src$core$focus_manager().unregisterTree(this)}addTrashcan(){this.trashcan=Gg.newTrashcan(this);const t=this.trashcan.createDom();this.svgGroup_.insertBefore(t,this.getCanvas())}static newTrashcan(t){throw Error("The implementation of newTrashcan should be monkey-patched in by blockly.ts")}addZoomControls(){this.zoomControls_=new Xc(this);const t=this.zoomControls_.createDom();this.svgGroup_.appendChild(t)}copyOptionsForFlyout(){return new wd({parentWorkspace:this,rtl:this.RTL,oneBasedIndex:this.options.oneBasedIndex,horizontalLayout:this.horizontalLayout,renderer:this.options.renderer,rendererOverrides:this.options.rendererOverrides,plugins:this.options.plugins,modalInputs:this.options.modalInputs,move:{scrollbars:!0}})}addFlyout(t){const e=this.copyOptionsForFlyout();return e.toolboxPosition=this.options.toolboxPosition,this.flyout=this.horizontalLayout?new(c(zl.FLYOUTS_HORIZONTAL_TOOLBOX,this.options,!0))(e):new(c(zl.FLYOUTS_VERTICAL_TOOLBOX,this.options,!0))(e),this.flyout.autoClose=!1,this.flyout.getWorkspace().setVisible(!0),this.flyout.createDom(t)}getFlyout(t){return this.flyout||t?this.flyout:this.toolbox?this.toolbox.getFlyout():null}getToolbox(){return this.toolbox}updateScreenCalculations(){this.updateInverseScreenCTM(),this.recordDragTargets()}resizeContents(){this.resizesEnabled&&this.rendered&&(this.scrollbar&&this.scrollbar.resize(),this.updateInverseScreenCTM())}resize(){this.toolbox?this.toolbox.position():this.flyout&&this.flyout.position();const t=this.componentManager.getComponents(cc.Capability.POSITIONABLE,!0),e=this.getMetricsManager().getUiMetrics(),s=[];for(let i,o=0;i=t[o];o++){i.position(e,s);const t=i.getBoundingRectangle();t&&s.push(t)}this.scrollbar&&this.scrollbar.resize(),this.updateScreenCalculations()}updateScreenCalculationsIfScrolled(){const t=ie();_c.equals(this.lastRecordedPageScroll,t)||(this.lastRecordedPageScroll=t,this.updateScreenCalculations())}getLayerManager(){return this.layerManager}getCanvas(){return this.layerManager.getBlockLayer()}setCachedParentSvgSize(t,e){const s=this.getParentSvg();null!=t&&(this.cachedParentSvgSize.width=t,s.setAttribute("data-cached-width",`${t}`)),null!=e&&(this.cachedParentSvgSize.height=e,s.setAttribute("data-cached-height",`${e}`))}getBubbleCanvas(){return this.layerManager.getBubbleLayer()}getParentSvg(){if(!this.cachedParentSvg){let t=this.svgGroup_;for(;t;){if("svg"===t.tagName){this.cachedParentSvg=t;break}t=t.parentNode}}return this.cachedParentSvg}maybeFireViewportChangeEvent(){if(st()){var t=this.scale,e=-this.scrollY,s=-this.scrollX;if(!(t===this.oldScale&&Math.abs(e-this.oldTop)<1&&Math.abs(s-this.oldLeft)<1)){var i=new(rt(ua.VIEWPORT_CHANGE))(e,s,t,this.id,this.oldScale);this.oldScale=t,this.oldTop=e,this.oldLeft=s,J(i)}}}translate(t,e){let s,i;null==(s=this.layerManager)||s.translateLayers(new _c(t,e),this.scale),null==(i=this.grid)||i.moveTo(t,e),this.maybeFireViewportChangeEvent()}getWidth(){const t=this.getMetrics();return t?t.viewWidth/this.scale:0}setVisible(t){this.visible=t,this.svgGroup_&&(this.scrollbar&&this.scrollbar.setContainerVisible(t),this.getFlyout()&&this.getFlyout().setContainerVisible(t),this.getParentSvg().style.display=t?"block":"none",this.toolbox&&this.toolbox.setVisible(t),t||this.hideChaff(!0))}render(){const t=this.getAllBlocks(!1);for(let e=t.length-1;e>=0;e--)t[e].queueRender();this.getTopBlocks().flatMap(t=>t.getDescendants(!1)).filter(t=>t.isInsertionMarker()).forEach(t=>t.queueRender())}highlightBlock(t,e){if(void 0===e){for(let t,e=0;t=this.highlightedBlocks[e];e++)t.setHighlighted(!1);this.highlightedBlocks.length=0}(t=t?this.getBlockById(t):null)&&((e=void 0===e||e)?this.highlightedBlocks.includes(t)||this.highlightedBlocks.push(t):Gt(this.highlightedBlocks,t),t.setHighlighted(e))}variableChangeCallback(t){switch(t.type){case ua.VAR_CREATE:case ua.VAR_DELETE:case ua.VAR_RENAME:case ua.VAR_TYPE_CHANGE:this.refreshToolboxSelection()}}refreshToolboxSelection(){const t=this.isFlyout?this.targetWorkspace:this;t&&!t.currentGesture_&&t.toolbox&&t.toolbox.getFlyout()&&t.toolbox.refreshSelection()}recordDragTargets(){const t=this.componentManager.getComponents(cc.Capability.DRAG_TARGET,!0);this.dragTargetAreas=[];for(let e,s=0;e=t[s];s++){const t=e.getClientRect();t&&this.dragTargetAreas.push({component:e,clientRect:t})}}newBlock(t,e){throw Error("The implementation of newBlock should be monkey-patched in by blockly.ts")}newComment(t){throw Error("The implementation of newComment should be monkey-patched in by blockly.ts")}getDragTarget(t){for(let e,s=0;e=this.dragTargetAreas[s];s++)if(e.clientRect.contains(t.clientX,t.clientY))return e.component;return null}onMouseDown(t){const e=this.getGesture(t);e&&e.handleWsStart(t,this)}startDrag(t,e){vo(this,t,e)}moveDrag(t){return No(this,t)}setKeyboardMoveInProgress(t){this.keyboardMoveInProgress=t}isDragging(){return this.keyboardMoveInProgress||null!==this.currentGesture_&&this.currentGesture_.isDragging()}isDraggable(){return this.options.moveOptions&&this.options.moveOptions.drag}isMovable(){return this.options.moveOptions&&!!this.options.moveOptions.scrollbars||this.options.moveOptions&&this.options.moveOptions.wheel||this.options.moveOptions&&this.options.moveOptions.drag||this.options.zoomOptions&&this.options.zoomOptions.wheel||this.options.zoomOptions&&this.options.zoomOptions.pinch}isMovableHorizontally(){const t=!!this.scrollbar;return this.isMovable()&&(!t||t&&this.scrollbar.canScrollHorizontally())}isMovableVertically(){const t=!!this.scrollbar;return this.isMovable()&&(!t||t&&this.scrollbar.canScrollVertically())}onMouseWheel(t){if(qp.inProgress())t.preventDefault(),t.stopPropagation();else{var e=this.options.zoomOptions&&this.options.zoomOptions.wheel,s=this.options.moveOptions&&this.options.moveOptions.wheel;if(e||s){var i=I(t);if(ma)var o=t.metaKey;e&&(t.ctrlKey||o||!s)?(i=-i.y/50,e=$(t,this.getParentSvg(),this.getInverseScreenCTM()),this.zoom(e.x,e.y,i)):(e=this.scrollX-i.x,s=this.scrollY-i.y,t.shiftKey&&!i.x&&(e=this.scrollX-i.y,s=this.scrollY),this.scroll(e,s)),t.preventDefault()}}}getBlocksBoundingBox(){const t=this.getTopBoundedElements();if(!t.length)return new mc(0,0,0,0);const e=t[0].getBoundingRectangle();for(let i=1;ie.bottom&&(e.bottom=s.bottom),s.lefte.right&&(e.right=s.right))}return e}cleanUp(){this.setResizesEnabled(!1);const t=Hl.getGroup$$module$build$src$core$events$utils();t||Hl.setGroup$$module$build$src$core$events$utils(!0);var e=this.getTopBlocks(!0),s=e.filter(t=>t.isMovable());const i=e.filter(t=>!t.isMovable()).map(t=>t.getBoundingRectangle());e=function(t){for(const e of i)if(t.intersects(e))return e;return null};var o=0;const n=this.renderer.getConstants().MIN_BLOCK_HEIGHT;for(const t of s){for(s=t.getBoundingRectangle(),t.moveBy(-s.left,o-s.top,["cleanup"]),t.snapToGrid(),o=e(s=t.getBoundingRectangle());null!=o;)o=o.top+o.getHeight()+n,t.moveBy(0,o-s.top,["cleanup"]),t.snapToGrid(),o=e(s=t.getBoundingRectangle());o=t.getRelativeToSurfaceXY().y+t.getHeightWidth().height+n}Hl.setGroup$$module$build$src$core$events$utils(t),this.setResizesEnabled(!0)}showContextMenu(t){if(!this.isReadOnly()&&!this.isFlyout){var e=sd.registry.getContextMenuOptions({workspace:this,focusedNode:this},t);this.configureContextMenu&&this.configureContextMenu(e,t);var s=t instanceof PointerEvent?new _c(t.clientX,t.clientY):ne(this,new _c(5,5));$o(t,e,this.RTL,this,s)}}updateToolbox(t){if(t=ce(t)){if(!this.options.languageTree)throw Error("Existing toolbox is null. Can't create new toolbox.");if(de(t)){if(!this.toolbox)throw Error("Existing toolbox has no categories. Can't change mode.");this.options.languageTree=t,this.toolbox.render(t)}else{if(!this.flyout)throw Error("Existing toolbox has categories. Can't change mode.");this.options.languageTree=t,this.flyout.show(t)}}else if(this.options.languageTree)throw Error("Can't nullify an existing toolbox.")}markFocused(){this.options.parentWorkspace?this.options.parentWorkspace.markFocused():(vt(this),this.getParentSvg().focus({preventScroll:!0}))}zoom(t,e,s){s=Math.pow(this.options.zoomOptions.scaleSpeed,s);const i=this.scale*s;if(this.scale!==i){i>this.options.zoomOptions.maxScale?s=this.options.zoomOptions.maxScale/this.scale:ithis.options.zoomOptions.maxScale?t=this.options.zoomOptions.maxScale:this.options.zoomOptions.minScale&&t{if(t.isFlyout){let e;const s=null==(e=t.targetWorkspace)?void 0:e.getFlyout();if(s instanceof zp)return s.getFlyoutScale()}return t.getScale()},e=(s,i)=>s.options.parentWorkspace&&s.options.parentWorkspace.getSvgGroup().contains(s.getSvgGroup())?e(s.options.parentWorkspace,i*t(s)):i*t(s);return e(this,1)}scroll(t,e){this.hideChaff(!0);const s=this.getMetrics();t=Math.min(t,-s.scrollLeft),e=Math.min(e,-s.scrollTop);const i=s.scrollTop+Math.max(0,s.scrollHeight-s.viewHeight);t=Math.max(t,-(s.scrollLeft+Math.max(0,s.scrollWidth-s.viewWidth))),e=Math.max(e,-i),this.scrollX=t,this.scrollY=e,this.scrollbar&&this.scrollbar.set(-(t+s.scrollLeft),-(e+s.scrollTop),!1),t+=s.absoluteLeft,e+=s.absoluteTop,this.translate(t,e)}getBlockById(t){return super.getBlockById(t)}getAllBlocks(t=!1){return super.getAllBlocks(t)}getTopBlocks(t=!1){return super.getTopBlocks(t)}addTopBlock(t){this.addTopBoundedElement(t),super.addTopBlock(t)}removeTopBlock(t){this.removeTopBoundedElement(t),super.removeTopBlock(t)}addTopComment(t){this.addTopBoundedElement(t),super.addTopComment(t)}removeTopComment(t){this.removeTopBoundedElement(t),super.removeTopComment(t)}getTopComments(t=!1){return super.getTopComments(t)}getCommentById(t){return super.getCommentById(t)}getRootWorkspace(){return super.getRootWorkspace()}addTopBoundedElement(t){this.topBoundedElements.push(t)}removeTopBoundedElement(t){Gt(this.topBoundedElements,t)}getTopBoundedElements(t=!1){const e=[].concat(this.topBoundedElements);return t&&e.sort(this.sortByOrigin.bind(this)),e}setResizesEnabled(t){const e=!this.resizesEnabled&&t;this.resizesEnabled=t,e&&this.resizeContents()}clear(){this.setResizesEnabled(!1),super.clear(),this.topBoundedElements=[],this.setResizesEnabled(!0)}registerButtonCallback(t,e){if("function"!=typeof e)throw TypeError("Button callbacks must be functions.");this.flyoutButtonCallbacks.set(t,e)}getButtonCallback(t){let e;return null!=(e=this.flyoutButtonCallbacks.get(t))?e:null}removeButtonCallback(t){this.flyoutButtonCallbacks.delete(t)}registerToolboxCategoryCallback(t,e){if("function"!=typeof e)throw TypeError("Toolbox category callbacks must be functions.");this.toolboxCategoryCallbacks.set(t,e)}getToolboxCategoryCallback(t){return this.toolboxCategoryCallbacks.get(t)||null}removeToolboxCategoryCallback(t){this.toolboxCategoryCallbacks.delete(t)}getGesture(t){if(this.keyboardMoveInProgress)return null==t||t.preventDefault(),null==t||t.stopPropagation(),null;const e="pointerdown"===(null==t?void 0:t.type);let s;return e&&null!=(s=this.currentGesture_)&&s.hasStarted()&&(console.warn("Tried to start the same gesture twice."),this.currentGesture_.cancel()),!this.currentGesture_&&e&&(this.currentGesture_=new qp(t,this)),this.currentGesture_}clearGesture(){this.currentGesture_=null}cancelCurrentGesture(){this.currentGesture_&&this.currentGesture_.cancel()}getAudioManager(){return this.audioManager}getGrid(){return this.grid}hideChaff(t=!1){xi(),uo(this),pi(),this.hideComponents(t)}hideComponents(t=!1){this.getComponentManager().getComponents(cc.Capability.AUTOHIDEABLE,!0).forEach(e=>e.autoHide(t))}static setTopLevelWorkspaceMetrics(t){const e=this.getMetrics();"number"==typeof t.x&&(this.scrollX=-(e.scrollLeft+(e.scrollWidth-e.viewWidth)*t.x)),"number"==typeof t.y&&(this.scrollY=-(e.scrollTop+(e.scrollHeight-e.viewHeight)*t.y)),this.translate(this.scrollX+e.absoluteLeft,this.scrollY+e.absoluteTop)}addClass(t){this.injectionDiv&&ct(this.injectionDiv,t)}removeClass(t){this.injectionDiv&&ut(this.injectionDiv,t)}setIsReadOnly(t){super.setIsReadOnly(t),t?this.addClass("blocklyReadOnly"):this.removeClass("blocklyReadOnly")}scrollBoundsIntoView(t,e=10){if(!qp.inProgress()){var s=this.getScale(),i=this.getMetricsManager().getViewMetrics(!0);if(i=new mc(i.top,i.top+i.height,i.left,i.left+i.width),!(t.left>=i.left&&t.top>=i.top&&t.right<=i.right&&t.bottom<=i.bottom)){(t=t.clone()).top-=e,t.bottom+=e,t.left-=e,t.right+=e;var o=e=0;t.lefti.right&&(e=this.RTL?i.right-t.right:Math.max(i.right-t.right,i.left-t.left)),t.topi.bottom&&(o=Math.max(i.bottom-t.bottom,i.top-t.top)),this.scroll(this.scrollX+e*s,this.scrollY+o*s)}}}getFocusableElement(){return this.svgGroup_}getFocusableTree(){return this.isMutator&&this.options.parentWorkspace||this}onNodeFocus(){}onNodeBlur(){}canBeFocused(){return!0}getRootFocusableNode(){return this}getRestoredFocusableNode(t){if(t)return null;let e,s;if(t=null==(e=this.targetWorkspace)?void 0:e.getFlyout(),this.isFlyout&&t){let e,s;return null!=(s=null==(e=t.getContents().find(t=>(t=t.getElement(),It(t)&&t.canBeFocused())))?void 0:e.getElement())?s:null}return null!=(s=this.getTopBlocks(!0)[0])?s:null}getNestedTrees(){const t=this.getAllBlocks().map(t=>t.getIcons()).flat().filter(t=>t instanceof Hl.MutatorIcon$$module$build$src$core$icons$mutator_icon&&t.bubbleIsVisible()).map(t=>{let e;return null==(e=t.getBubble())?void 0:e.getWorkspace()}).filter(t=>!!t),e=this.getFlyout(!0);return e&&t.push(e.getWorkspace()),t}searchForWorkspaceComment(t){for(const e of this.getTopComments())if(e instanceof fd&&e.canBeFocused()&&e.getFocusableElement().id===t)return e}lookUpFocusableNode(t){var e;const s=null==(e=this.targetWorkspace)?void 0:e.getFlyout();if(this.isFlyout&&s)for(var i of s.getContents())if(e=i.getElement(),It(e)&&e.canBeFocused()&&e.getFocusableElement().id===t)return e;if(i=t.indexOf("_field_"),e=t.indexOf("_connection_"),-1!==i){var o=t.substring(0,i);if(o=this.getBlockById(o))for(var n of o.getFields())if(n.canBeFocused()&&n.getFocusableElement().id===t)return n;return null}if(-1!==e){if(o=t.substring(0,e),o=this.getBlockById(o))for(const e of o.getConnections_(!0))if(e.id===t)return e;return null}var r;if(-1!==(n=Math.max(t.indexOf(gd),t.indexOf(dd),t.indexOf(Td)))&&(n=t.substring(0,n),n=this.searchForWorkspaceComment(n)))return t.indexOf(gd)>-1?n.getEditorFocusableNode():null!=(r=n.view.getCommentBarButtons().find(e=>e.getFocusableElement().id.includes(t)))?r:null;if((r=this.getAllBlocks(!1).find(e=>e.getFocusableElement().id===t))||(r=this.searchForWorkspaceComment(t)))return r;for(o of r=this.getAllBlocks().map(t=>t.getIcons()).flat()){if(o.canBeFocused()&&o.getFocusableElement().id===t)return o;if(Ws(o)){if((r=o.getBubble())&&r.canBeFocused()&&r.getFocusableElement().id===t)return r;if(r instanceof Wd&&r.getEditor().getFocusableElement().id===t)return r.getEditor()}}return null}onTreeFocus(t,e){}onTreeBlur(t){if(this.isFlyout&&this.targetWorkspace&&!Hl.getFocusManager$$module$build$src$core$focus_manager().ephemeralFocusTaken()){var e=this.targetWorkspace.getToolbox();e&&t===e||or(e)&&e.autoHide(!1)}}getNavigator(){return this.navigator}setNavigator(t){this.navigator=t}},Vg={};Vg.WorkspaceSvg=Gg,Vg.resizeSvgContents=wr;var Wg=class extends ic{constructor(t){super(),this.isBlank=!0,this.isBlank=void 0===t,t&&(this.varId=t.getId(),this.workspaceId=t.getWorkspace().id)}toJson(){const t=super.toJson();if(!this.varId)throw Error("The var ID is undefined. Either pass a variable to the constructor, or call fromJson");return t.varId=this.varId,t}static fromJson(t,e,s){return(e=ic.fromJson(t,e,null!=s?s:new Wg)).varId=t.varId,e}},Xg=class extends Wg{constructor(t){super(t),this.type=ua.VAR_CREATE,t&&(this.varType=t.getType(),this.varName=t.getName())}toJson(){const t=super.toJson();if(void 0===this.varType)throw Error("The var type is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.varName)throw Error("The var name is undefined. Either pass a variable to the constructor, or call fromJson");return t.varType=this.varType,t.varName=this.varName,t}static fromJson(t,e,s){return(e=Wg.fromJson(t,e,null!=s?s:new Xg)).varType=t.varType,e.varName=t.varName,e}run(t){var e=this.getEventWorkspace_();if(!this.varId)throw Error("The var ID is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.varName)throw Error("The var name is undefined. Either pass a variable to the constructor, or call fromJson");e=e.getVariableMap(),t?e.createVariable(this.varName,this.varType,this.varId):(t=e.getVariableById(this.varId))&&e.deleteVariable(t)}};t(zl.EVENT,ua.VAR_CREATE,Xg);var zg=class{constructor(t,e,s,i){this.workspace=t,this.name=e,this.type=s||"",this.id=i||S()}getId(){return this.id}getName(){return this.name}setName(t){return this.name=t,this}getType(){return this.type}setType(t){return this.type=t,this}getWorkspace(){return this.workspace}save(){const t={name:this.getName(),id:this.getId()},e=this.getType();return e&&(t.type=e),t}static load(t,e){t=new this(e,t.name,t.type,t.id),e.getVariableMap().addVariable(t),J(new(rt(ua.VAR_CREATE))(t))}};t(zl.VARIABLE_MODEL,Xl,zg);var Yg=class extends Wg{constructor(t){super(t),this.type=ua.VAR_DELETE,t&&(this.varType=t.getType(),this.varName=t.getName())}toJson(){const t=super.toJson();if(void 0===this.varType)throw Error("The var type is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.varName)throw Error("The var name is undefined. Either pass a variable to the constructor, or call fromJson");return t.varType=this.varType,t.varName=this.varName,t}static fromJson(t,e,s){return(e=Wg.fromJson(t,e,null!=s?s:new Yg)).varType=t.varType,e.varName=t.varName,e}run(t){var e=this.getEventWorkspace_();if(!this.varId)throw Error("The var ID is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.varName)throw Error("The var name is undefined. Either pass a variable to the constructor, or call fromJson");e=e.getVariableMap(),t?(t=e.getVariableById(this.varId))&&e.deleteVariable(t):e.createVariable(this.varName,this.varType,this.varId)}};t(zl.EVENT,ua.VAR_DELETE,Yg);var Kg=class extends Wg{constructor(t,e){super(t),this.type=ua.VAR_RENAME,t&&(this.oldName=t.getName(),this.newName=void 0===e?"":e)}toJson(){const t=super.toJson();if(!this.oldName)throw Error("The old var name is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.newName)throw Error("The new var name is undefined. Either pass a value to the constructor, or call fromJson");return t.oldName=this.oldName,t.newName=this.newName,t}static fromJson(t,e,s){return(e=Wg.fromJson(t,e,null!=s?s:new Kg)).oldName=t.oldName,e.newName=t.newName,e}run(t){var e=this.getEventWorkspace_();if(!this.varId)throw Error("The var ID is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.oldName)throw Error("The old var name is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.newName)throw Error("The new var name is undefined. Either pass a value to the constructor, or call fromJson");const s=(e=e.getVariableMap()).getVariableById(this.varId);t?s&&e.renameVariable(s,this.newName):s&&e.renameVariable(s,this.oldName)}};t(zl.EVENT,ua.VAR_RENAME,Kg);var jg=class{constructor(t,e=!1){this.workspace=t,this.potentialMap=e,this.variableMap=new Map}clear(){for(const t of this.variableMap.values())for(const e of t.values())this.deleteVariable(e);if(0!==this.variableMap.size)throw Error("Non-empty variable map")}renameVariable(t,e){if(t.getName()===e)return t;var s=t.getType();s=this.getVariable(e,s);const i=this.workspace.getAllBlocks(!1);let o="";this.potentialMap||(o=Hl.getGroup$$module$build$src$core$events$utils())||Hl.setGroup$$module$build$src$core$events$utils(!0);try{s&&s.getId()!==t.getId()?this.renameVariableWithConflict(t,e,s,i):this.renameVariableAndUses(t,e,i)}finally{this.potentialMap||Hl.setGroup$$module$build$src$core$events$utils(o)}return t}changeVariableType(t,e){const s=t.getType();if(s===e)return t;var i=this.variableMap.get(s);let o;return null==i||i.delete(t.getId()),0===(null==i?void 0:i.size)&&this.variableMap.delete(s),t.setType(e),(i=null!=(o=this.variableMap.get(e))?o:new Map).set(t.getId(),t),this.variableMap.has(e)||this.variableMap.set(e,i),J(new(rt(ua.VAR_TYPE_CHANGE))(t,s,e)),t}renameVariableById(t,e){Qe("VariableMap.renameVariableById","v12","v13","VariableMap.renameVariable");const s=this.getVariableById(t);if(!s)throw Error("Tried to rename a variable that didn't exist. ID: "+t);this.renameVariable(s,e)}renameVariableAndUses(t,e,s){for(this.potentialMap||J(new(rt(ua.VAR_RENAME))(t,e)),t.setName(e),e=0;eHl.Names$$module$build$src$core$names.equals(e.getName(),t)))?s:null}getVariableById(t){for(const e of this.variableMap.values())if(e.has(t)){let s;return null!=(s=e.get(t))?s:null}return null}getVariablesOfType(t){return(t=this.variableMap.get(t||""))?[...t.values()]:[]}getTypes(){return[...this.variableMap.keys()]}getAllVariables(){let t=[];for(const e of this.variableMap.values())t=t.concat(...e.values());return t}getAllVariableNames(){Qe("VariableMap.getAllVariableNames","v12","v13","Blockly.Variables.getAllVariables");const t=[];for(const e of this.variableMap.values())for(const s of e.values())t.push(s.getName());return t}getVariableUsesById(t){return Qe("VariableMap.getVariableUsesById","v12","v13","Blockly.Variables.getVariableUsesById"),fs(this.workspace,t)}};t(zl.VARIABLE_MAP,Xl,jg);var Jg=class extends oc{constructor(t,e){super(e),this.type=ua.TRASHCAN_OPEN,this.isOpen=t}toJson(){const t=super.toJson();if(void 0===this.isOpen)throw Error("Whether this is already open or not is undefined. Either pass a value to the constructor, or call fromJson");return t.isOpen=this.isOpen,t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new Jg)).isOpen=t.isOpen,e}};t(zl.EVENT,ua.TRASHCAN_OPEN,Jg);var qg=class extends fp{constructor(t){super(),this.workspace=t,this.id="trashcan",this.contents=[],this.flyout=null,this.isLidOpen=!1,this.minOpenness=0,this.lidTask=this.svgLid=this.svgGroup=null,this.top=this.left=this.lidOpen=0,this.initialized=!1,this.workspace.options.maxTrashcanContents<=0||(t=this.workspace.copyOptionsForFlyout(),this.workspace.horizontalLayout?(t.toolboxPosition=this.workspace.toolboxPosition===Lc.TOP?Lc.BOTTOM:Lc.TOP,this.flyout=new(c(zl.FLYOUTS_HORIZONTAL_TOOLBOX,this.workspace.options,!0))(t)):(t.toolboxPosition=this.workspace.toolboxPosition===Lc.RIGHT?Lc.LEFT:Lc.RIGHT,this.flyout=new(c(zl.FLYOUTS_VERTICAL_TOOLBOX,this.workspace.options,!0))(t)),this.workspace.addChangeListener(this.onDelete.bind(this)))}createDom(){let t;this.svgGroup=at(Tc.G,{class:"blocklyTrash"});const e=String(Math.random()).substring(2);t=at(Tc.CLIPPATH,{id:"blocklyTrashBodyClipPath"+e},this.svgGroup),at(Tc.RECT,{width:Zg,height:Qg,y:t_},t);const s=at(Tc.IMAGE,{width:Gc,x:-o_,height:Vc,y:-n_,"clip-path":"url(#blocklyTrashBodyClipPath"+e+")"},this.svgGroup);return s.setAttributeNS(Fa,"xlink:href",this.workspace.options.pathToMedia+Wc),t=at(Tc.CLIPPATH,{id:"blocklyTrashLidClipPath"+e},this.svgGroup),at(Tc.RECT,{width:Zg,height:t_},t),this.svgLid=at(Tc.IMAGE,{width:Gc,x:-o_,height:Vc,y:-n_,"clip-path":"url(#blocklyTrashLidClipPath"+e+")"},this.svgGroup),this.svgLid.setAttributeNS(Fa,"xlink:href",this.workspace.options.pathToMedia+Wc),m(this.svgGroup,"pointerdown",this,this.blockMouseDownWhenOpenable),m(this.svgGroup,"pointerup",this,this.click),m(s,"pointerover",this,this.mouseOver),m(s,"pointerout",this,this.mouseOut),this.animateLid(),this.svgGroup}init(){if(this.workspace.options.maxTrashcanContents>0){const t=this.flyout.createDom(Tc.SVG);ct(t,"blocklyTrashcanFlyout"),gt(t,this.workspace.getParentSvg()),this.flyout.init(this.workspace)}this.workspace.getComponentManager().addComponent({component:this,weight:cc.ComponentWeight.TRASHCAN_WEIGHT,capabilities:[cc.Capability.AUTOHIDEABLE,cc.Capability.DELETE_AREA,cc.Capability.DRAG_TARGET,cc.Capability.POSITIONABLE]}),this.initialized=!0,this.setLidOpen(!1)}dispose(){this.workspace.getComponentManager().removeComponent("trashcan"),this.svgGroup&&pt(this.svgGroup),this.lidTask&&clearTimeout(this.lidTask)}hasContents(){return!!this.contents.length}contentsIsOpen(){return!!this.flyout&&this.flyout.isVisible()}openFlyout(){if(!this.contentsIsOpen()){var t=this.contents.map(function(t){return JSON.parse(t)}),e=this.workspace.getParentSvg().style;e.cursor="wait",setTimeout(()=>{let s,i;null==(s=this.flyout)||s.show(t),e.cursor="",null==(i=this.workspace.scrollbar)||i.setVisible(!1)},10),this.fireUiEvent(!0)}}closeFlyout(){var t,e;this.contentsIsOpen()&&(null==(t=this.flyout)||t.hide(),null==(e=this.workspace.scrollbar)||e.setVisible(!0),this.fireUiEvent(!1),this.workspace.recordDragTargets())}autoHide(t){!t&&this.flyout&&this.closeFlyout()}emptyContents(){this.hasContents()&&(this.contents.length=0,this.setMinOpenness(0),this.closeFlyout())}position(t,e){if(this.initialized){var s,i,o=fe(this.workspace,t);t=be(o,new Ec(Zg,Qg+t_),s_,e_,t,this.workspace),e=$e(t,e_,o.vertical===xc.TOP?Bc.DOWN:Bc.UP,e),this.top=e.top,this.left=e.left,null==(s=this.svgGroup)||s.setAttribute("transform","translate("+this.left+","+this.top+")"),null==(i=this.flyout)||i.position()}}getBoundingRectangle(){return new mc(this.top,this.top+Qg+t_,this.left,this.left+Zg)}getClientRect(){if(!this.svgGroup)return null;var t=this.svgGroup.getBoundingClientRect();const e=t.top+n_-i_;return t=t.left+o_-i_,new mc(e,e+t_+Qg+2*i_,t,t+Zg+2*i_)}onDragOver(t){this.setLidOpen(this.wouldDelete_)}onDragExit(t){this.setLidOpen(!1)}onDrop(t){setTimeout(this.setLidOpen.bind(this,!1),100)}setLidOpen(t){this.isLidOpen!==t&&(this.lidTask&&clearTimeout(this.lidTask),this.isLidOpen=t,this.animateLid())}animateLid(){const t=a_;var e=1/(t+1);this.lidOpen+=this.isLidOpen?e:-e,this.lidOpen=Math.min(Math.max(this.lidOpen,this.minOpenness),1),this.setLidAngle(this.lidOpen*u_),e=c_+this.lidOpen*(h_-c_),this.svgGroup&&(this.svgGroup.style.opacity=`${e}`),this.lidOpen>this.minOpenness&&this.lidOpen<1&&(this.lidTask=setTimeout(this.animateLid.bind(this),l_/t))}setLidAngle(t){const e=this.workspace.toolboxPosition===Lc.RIGHT||this.workspace.horizontalLayout&&this.workspace.RTL;let s;null==(s=this.svgLid)||s.setAttribute("transform","rotate("+(e?-t:t)+","+(e?4:Zg-4)+","+(t_-2)+")")}setMinOpenness(t){this.minOpenness=t,this.isLidOpen||this.setLidAngle(t*u_)}closeLid(){this.setLidOpen(!1)}click(){this.hasContents()&&!this.workspace.isDragging()&&this.openFlyout()}fireUiEvent(t){t=new(rt(ua.TRASHCAN_OPEN))(t,this.workspace.id),J(t)}blockMouseDownWhenOpenable(t){!this.contentsIsOpen()&&this.hasContents()&&t.stopPropagation()}mouseOver(){this.hasContents()&&this.setLidOpen(!0)}mouseOut(){this.setLidOpen(!1)}onDelete(t){if(!(this.workspace.options.maxTrashcanContents<=0||!y(t)||t.wasShadow)){if(!t.oldJson)throw Error("Encountered a delete event without proper oldJson");if(t=JSON.stringify(this.cleanBlockJson(t.oldJson)),!this.contents.includes(t)){for(this.contents.unshift(t);this.contents.length>this.workspace.options.maxTrashcanContents;)this.contents.pop();this.setMinOpenness(r_)}}}cleanBlockJson(t){return function t(e){if(e){if(delete e.id,delete e.x,delete e.y,delete e.enabled,delete e.disabledReasons,e.icons&&e.icons.comment){var s=e.icons.comment;delete s.height,delete s.width,delete s.pinned}for(var i in s=e.inputs){var o=s[i];const e=o.block;o=o.shadow,e&&t(e),o&&t(o)}e.next&&(e=(i=e.next).block,i=i.shadow,e&&t(e),i&&t(i))}}(t=JSON.parse(JSON.stringify(t))),Object.assign({},{kind:"BLOCK"},t)}},Zg=47,Qg=44,t_=16,e_=20,s_=20,i_=10,o_=0,n_=32,r_=.1,l_=80,a_=4,c_=.4,h_=.8,u_=45,d_=null,p_=null,g_=void 0,__={};__.BlockPaster=dp,__.copy=Lr,__.getLastCopiedData=Mr,__.getLastCopiedLocation=Br,__.getLastCopiedWorkspace=xr,__.paste=Ur,__.registry=Jc,__.setLastCopiedData=Dr,__.setLastCopiedLocation=Fr,__.setLastCopiedWorkspace=Pr;var T_,m_={};m_.CollapseCommentBarButton=pd,m_.CommentBarButton=ud,m_.CommentEditor=_d,m_.CommentView=Ed,m_.DeleteCommentBarButton=md,m_.RenderedWorkspaceComment=fd,m_.WorkspaceComment=bd,function(t){t.ESCAPE="escape",t.DELETE="delete",t.COPY="copy",t.CUT="cut",t.PASTE="paste",t.UNDO="undo",t.REDO="redo",t.MENU="menu"}(T_||(T_={})),Qr();var E_={};E_.names=T_,E_.registerCopy=Yr,E_.registerCut=Kr,E_.registerDefaultShortcuts=Qr,E_.registerDelete=Wr,E_.registerEscape=Vr,E_.registerPaste=jr,E_.registerRedo=qr,E_.registerShowContextMenu=Zr,E_.registerUndo=Jr;var b_={ProcedureSerializer:class{constructor(t,e){this.procedureModelClass=t,this.parameterModelClass=e,this.priority=75}save(t){return(t=t.getProcedureMap().getProcedures().map(t=>tl(t))).length?t:null}load(t,e){const s=e.getProcedureMap();for(const i of t)s.add(el(this.procedureModelClass,this.parameterModelClass,i,e))}clear(t){t.getProcedureMap().clear()}}};b_.loadProcedure=el,b_.saveProcedure=tl;var f_=class{constructor(){this.priority=100}save(t){return(t=t.getVariableMap().getAllVariables().map(t=>t.save())).length?t:null}load(t,e){const s=l(zl.VARIABLE_MODEL,Xl);t.forEach(t=>{null==s||s.load(t,e)})}clear(t){t.getVariableMap().clear()}};Ie("variables",new f_);var $_={};$_.VariableSerializer=f_;var I_={};I_.load=il,I_.save=sl;var C_={blocks:Yh,exceptions:Xh,priorities:zc,procedures:b_,registry:Yc,variables:$_,workspaceComments:jc,workspaces:I_};"Blockly"in globalThis||(globalThis.Blockly={Msg:uh});var S_="label",R_=class{load(t,e){return(t=new Sp(e.getWorkspace(),e.targetWorkspace,t,!0)).show(),new $p(t,S_)}gapForItem(t,e){return e}disposeItem(t){(t=t.getElement())instanceof Sp&&t.dispose()}getType(){return S_}};t(zl.FLYOUT_INFLATER,S_,R_);var y_=class extends Ag{constructor(t){super(),this.GRID_UNIT=4,this.CURSOR_COLOUR="#ffa200",this.CURSOR_RADIUS=5,this.JAGGED_TEETH_WIDTH=this.JAGGED_TEETH_HEIGHT=0,this.START_HAT_HEIGHT=22,this.START_HAT_WIDTH=96,this.SHAPES={HEXAGONAL:1,ROUND:2,SQUARE:3,PUZZLE:4,NOTCH:5},this.SHAPE_IN_SHAPE_PADDING={1:{0:5*this.GRID_UNIT,1:2*this.GRID_UNIT,2:5*this.GRID_UNIT,3:5*this.GRID_UNIT},2:{0:3*this.GRID_UNIT,1:3*this.GRID_UNIT,2:1*this.GRID_UNIT,3:2*this.GRID_UNIT},3:{0:2*this.GRID_UNIT,1:2*this.GRID_UNIT,2:2*this.GRID_UNIT,3:2*this.GRID_UNIT}},this.FULL_BLOCK_FIELDS=!0,this.FIELD_TEXT_FONTWEIGHT="bold",this.FIELD_TEXT_FONTFAMILY='"Helvetica Neue", "Segoe UI", Helvetica, sans-serif',this.FIELD_COLOUR_FULL_BLOCK=this.FIELD_TEXTINPUT_BOX_SHADOW=this.FIELD_DROPDOWN_SVG_ARROW=this.FIELD_DROPDOWN_COLOURED_DIV=this.FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW=!0,this.SELECTED_GLOW_COLOUR="#fff200",this.SELECTED_GLOW_SIZE=.5,this.REPLACEMENT_GLOW_COLOUR="#fff200",this.REPLACEMENT_GLOW_SIZE=2,this.selectedGlowFilterId="",this.selectedGlowFilter=null,this.replacementGlowFilterId="",this.SQUARED=this.ROUNDED=this.HEXAGONAL=this.replacementGlowFilter=null,t&&(this.GRID_UNIT=t),this.SMALL_PADDING=this.GRID_UNIT,this.MEDIUM_PADDING=2*this.GRID_UNIT,this.MEDIUM_LARGE_PADDING=3*this.GRID_UNIT,this.LARGE_PADDING=4*this.GRID_UNIT,this.CORNER_RADIUS=1*this.GRID_UNIT,this.NOTCH_WIDTH=9*this.GRID_UNIT,this.NOTCH_HEIGHT=2*this.GRID_UNIT,this.STATEMENT_INPUT_NOTCH_OFFSET=this.NOTCH_OFFSET_LEFT=3*this.GRID_UNIT,this.MIN_BLOCK_WIDTH=2*this.GRID_UNIT,this.MIN_BLOCK_HEIGHT=12*this.GRID_UNIT,this.EMPTY_STATEMENT_INPUT_HEIGHT=6*this.GRID_UNIT,this.TOP_ROW_MIN_HEIGHT=this.CORNER_RADIUS,this.TOP_ROW_PRECEDES_STATEMENT_MIN_HEIGHT=this.LARGE_PADDING,this.BOTTOM_ROW_MIN_HEIGHT=this.CORNER_RADIUS,this.BOTTOM_ROW_AFTER_STATEMENT_MIN_HEIGHT=6*this.GRID_UNIT,this.STATEMENT_BOTTOM_SPACER=-this.NOTCH_HEIGHT,this.STATEMENT_INPUT_SPACER_MIN_WIDTH=40*this.GRID_UNIT,this.STATEMENT_INPUT_PADDING_LEFT=4*this.GRID_UNIT,this.EMPTY_INLINE_INPUT_PADDING=4*this.GRID_UNIT,this.EMPTY_INLINE_INPUT_HEIGHT=8*this.GRID_UNIT,this.DUMMY_INPUT_MIN_HEIGHT=8*this.GRID_UNIT,this.DUMMY_INPUT_SHADOW_MIN_HEIGHT=6*this.GRID_UNIT,this.CURSOR_WS_WIDTH=20*this.GRID_UNIT,this.FIELD_TEXT_FONTSIZE=3*this.GRID_UNIT,this.FIELD_BORDER_RECT_RADIUS=this.CORNER_RADIUS,this.FIELD_BORDER_RECT_X_PADDING=2*this.GRID_UNIT,this.FIELD_BORDER_RECT_Y_PADDING=1.625*this.GRID_UNIT,this.FIELD_BORDER_RECT_HEIGHT=8*this.GRID_UNIT,this.FIELD_DROPDOWN_BORDER_RECT_HEIGHT=8*this.GRID_UNIT,this.FIELD_DROPDOWN_SVG_ARROW_PADDING=this.FIELD_BORDER_RECT_X_PADDING,this.FIELD_COLOUR_DEFAULT_WIDTH=6*this.GRID_UNIT,this.FIELD_COLOUR_DEFAULT_HEIGHT=8*this.GRID_UNIT,this.FIELD_CHECKBOX_X_OFFSET=1*this.GRID_UNIT,this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH=12*this.GRID_UNIT}setFontConstants_(t){super.setFontConstants_(t),this.FIELD_DROPDOWN_BORDER_RECT_HEIGHT=this.FIELD_BORDER_RECT_HEIGHT=this.FIELD_TEXT_HEIGHT+2*this.FIELD_BORDER_RECT_Y_PADDING}init(){super.init(),this.HEXAGONAL=this.makeHexagonal(),this.ROUNDED=this.makeRounded(),this.SQUARED=this.makeSquared(),this.STATEMENT_INPUT_NOTCH_OFFSET=this.NOTCH_OFFSET_LEFT+this.INSIDE_CORNERS.rightWidth}setDynamicProperties_(t){super.setDynamicProperties_(t),this.SELECTED_GLOW_COLOUR=t.getComponentStyle("selectedGlowColour")||this.SELECTED_GLOW_COLOUR;const e=Number(t.getComponentStyle("selectedGlowSize"));this.SELECTED_GLOW_SIZE=e&&!isNaN(e)?e:this.SELECTED_GLOW_SIZE,this.REPLACEMENT_GLOW_COLOUR=t.getComponentStyle("replacementGlowColour")||this.REPLACEMENT_GLOW_COLOUR,this.REPLACEMENT_GLOW_SIZE=(t=Number(t.getComponentStyle("replacementGlowSize")))&&!isNaN(t)?t:this.REPLACEMENT_GLOW_SIZE}dispose(){super.dispose(),this.selectedGlowFilter&&pt(this.selectedGlowFilter),this.replacementGlowFilter&&pt(this.replacementGlowFilter)}makeStartHat(){const t=this.START_HAT_HEIGHT,e=this.START_HAT_WIDTH;return{height:.75*t,width:e,path:Rn("c",[Sn(25,-t),Sn(71,-t),Sn(e,0)])}}makeHexagonal(){function t(t,s,i){var o=t/2;return kn(-(i=i?-1:1)*(o=o>e?e:o),t=(s?-1:1)*t/2)+kn(i*o,t)}const e=this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH;return{type:this.SHAPES.HEXAGONAL,isDynamic:!0,width:t=>(t/=2)>e?e:t,height:t=>t,connectionOffsetY:t=>t/2,connectionOffsetX:t=>-t,pathDown:e=>t(e,!1,!1),pathUp:e=>t(e,!0,!1),pathRightDown:e=>t(e,!1,!0),pathRightUp:e=>t(e,!1,!0)}}makeRounded(){function t(t,e,i){const o=t>s?t-s:0,n=i===e?"0":"1";return Nn("a","0 0,"+n,t=(t>s?s:t)/2,Sn((i?1:-1)*t,(e?-1:1)*t))+vn("v",(e?-1:1)*o)+Nn("a","0 0,"+n,t,Sn((i?-1:1)*t,(e?-1:1)*t))}const e=this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH,s=2*e;return{type:this.SHAPES.ROUND,isDynamic:!0,width:t=>(t/=2)>e?e:t,height:t=>t,connectionOffsetY:t=>t/2,connectionOffsetX:t=>-t,pathDown:e=>t(e,!1,!1),pathUp:e=>t(e,!0,!1),pathRightDown:e=>t(e,!1,!0),pathRightUp:e=>t(e,!1,!0)}}makeSquared(){function t(t,s,i){t-=2*e;const o=i===s?"0":"1";return Nn("a","0 0,"+o,e,Sn((i?1:-1)*e,(s?-1:1)*e))+vn("v",(s?-1:1)*t)+Nn("a","0 0,"+o,e,Sn((i?-1:1)*e,(s?-1:1)*e))}const e=this.CORNER_RADIUS;return{type:this.SHAPES.SQUARE,isDynamic:!0,width:t=>e,height:t=>t,connectionOffsetY:t=>t/2,connectionOffsetX:t=>-t,pathDown:e=>t(e,!1,!1),pathUp:e=>t(e,!0,!1),pathRightDown:e=>t(e,!1,!0),pathRightUp:e=>t(e,!1,!0)}}shapeFor(t){let e=t.getCheck();switch(!e&&t.targetConnection&&(e=t.targetConnection.getCheck()),t.type){case Vd.INPUT_VALUE:case Vd.OUTPUT_VALUE:if(null!==(t=t.getSourceBlock().getOutputShape()))switch(t){case this.SHAPES.HEXAGONAL:return this.HEXAGONAL;case this.SHAPES.ROUND:return this.ROUNDED;case this.SHAPES.SQUARE:return this.SQUARED}return e&&e.includes("Boolean")?this.HEXAGONAL:(e&&e.includes("Number")||e&&e.includes("String"),this.ROUNDED);case Vd.PREVIOUS_STATEMENT:case Vd.NEXT_STATEMENT:return this.NOTCH;default:throw Error("Unknown type")}}makeNotch(){function t(t){return Rn("c",[Sn(t*o/2,0),Sn(t*o*3/4,r/2),Sn(t*o,r)])+An([Sn(t*o,n)])+Rn("c",[Sn(t*o/4,r/2),Sn(t*o/2,r),Sn(t*o,r)])+vn("h",t*i)+Rn("c",[Sn(t*o/2,0),Sn(t*o*3/4,-r/2),Sn(t*o,-r)])+An([Sn(t*o,-n)])+Rn("c",[Sn(t*o/4,-r/2),Sn(t*o/2,-r),Sn(t*o,-r)])}const e=this.NOTCH_WIDTH,s=this.NOTCH_HEIGHT,i=e/3,o=i/3,n=s/2,r=n/2,l=t(1),a=t(-1);return{type:this.SHAPES.NOTCH,width:e,height:s,pathLeft:l,pathRight:a}}makeInsideCorners(){const t=this.CORNER_RADIUS,e=Nn("a","0 0,0",t,Sn(-t,t)),s=Nn("a","0 0,1",t,Sn(-t,t));return{width:t,height:t,pathTop:e,pathBottom:Nn("a","0 0,0",t,Sn(t,t)),rightWidth:t,rightHeight:t,pathTopRight:s,pathBottomRight:Nn("a","0 0,1",t,Sn(t,t))}}generateSecondaryColour_(t){return qi("#000",t,.15)||t}generateTertiaryColour_(t){return qi("#000",t,.25)||t}createDom(t,e,s,i){super.createDom(t,e,s,i),t=at(Tc.DEFS,{},t),e=at(Tc.FILTER,{id:"blocklySelectedGlowFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%",x:"-40%"},t),at(Tc.FEGAUSSIANBLUR,{in:"SourceGraphic",stdDeviation:this.SELECTED_GLOW_SIZE},e),s=at(Tc.FECOMPONENTTRANSFER,{result:"outBlur"},e),at(Tc.FEFUNCA,{type:"table",tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},s),at(Tc.FEFLOOD,{"flood-color":this.SELECTED_GLOW_COLOUR,"flood-opacity":1,result:"outColor"},e),at(Tc.FECOMPOSITE,{in:"outColor",in2:"outBlur",operator:"in",result:"outGlow"},e),this.selectedGlowFilterId=e.id,this.selectedGlowFilter=e,t=at(Tc.FILTER,{id:"blocklyReplacementGlowFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%",x:"-40%"},t),at(Tc.FEGAUSSIANBLUR,{in:"SourceGraphic",stdDeviation:this.REPLACEMENT_GLOW_SIZE},t),e=at(Tc.FECOMPONENTTRANSFER,{result:"outBlur"},t),at(Tc.FEFUNCA,{type:"table",tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},e),at(Tc.FEFLOOD,{"flood-color":this.REPLACEMENT_GLOW_COLOUR,"flood-opacity":1,result:"outColor"},t),at(Tc.FECOMPOSITE,{in:"outColor",in2:"outBlur",operator:"in",result:"outGlow"},t),at(Tc.FECOMPOSITE,{in:"SourceGraphic",in2:"outGlow",operator:"over"},t),this.replacementGlowFilterId=t.id,this.replacementGlowFilter=t,i&&(i.style.setProperty("--blocklySelectedGlowFilter",`url(#${this.selectedGlowFilterId})`),i.style.setProperty("--blocklyReplacementGlowFilter",`url(#${this.replacementGlowFilterId})`))}getCSS_(t){return[`${t} .blocklyText,`,`${t} .blocklyFlyoutLabelText {`,`font: ${this.FIELD_TEXT_FONTWEIGHT} ${this.FIELD_TEXT_FONTSIZE}pt ${this.FIELD_TEXT_FONTFAMILY};`,"}",`${t} .blocklyTextInputBubble textarea {`,"font-weight: normal;","}",`${t} .blocklyText {`,"fill: #fff;","}",`${t} .blocklyNonEditableField>rect:not(.blocklyDropdownRect),`,`${t} .blocklyEditableField>rect:not(.blocklyDropdownRect) {`,`fill: ${this.FIELD_BORDER_RECT_COLOUR};`,"}",`${t} .blocklyNonEditableField>text,`,`${t} .blocklyEditableField>text,`,`${t} .blocklyNonEditableField>g>text,`,`${t} .blocklyEditableField>g>text {`,"fill: #575E75;","}",`${t} .blocklyFlyoutLabelText {`,"fill: #575E75;","}",`${t} .blocklyText.blocklyBubbleText {`,"fill: #575E75;","}",`${t} .blocklyDraggable:not(.blocklyDisabled)`," .blocklyEditableField:not(.blocklyEditing):hover>rect,",`${t} .blocklyDraggable:not(.blocklyDisabled)`," .blocklyEditableField:not(.blocklyEditing):hover>.blocklyPath {","stroke: #fff;","stroke-width: 2;","}",`${t} .blocklyHtmlInput {`,`font-family: ${this.FIELD_TEXT_FONTFAMILY};`,`font-weight: ${this.FIELD_TEXT_FONTWEIGHT};`,"color: #575E75;","}",`${t} .blocklyDropdownText {`,"fill: #fff !important;","}",`${t}.blocklyWidgetDiv .blocklyMenuItem,`,`${t}.blocklyDropDownDiv .blocklyMenuItem {`,`font-family: ${this.FIELD_TEXT_FONTFAMILY};`,"}",`${t}.blocklyDropDownDiv .blocklyMenuItemContent {`,"color: #fff;","}",`${t} .blocklyHighlightedConnectionPath {`,`stroke: ${this.SELECTED_GLOW_COLOUR};`,"}",`${t} .blocklyDisabledPattern > .blocklyOutlinePath {`,"fill: var(--blocklyDisabledPattern)","}",`${t} .blocklyInsertionMarker>.blocklyPath {`,`fill-opacity: ${this.INSERTION_MARKER_OPACITY};`,"stroke: none;","}",`${t} .blocklySelected>.blocklyPath.blocklyPathSelected {`,"fill: none;","filter: var(--blocklySelectedGlowFilter);","}",`${t} .blocklyReplaceable>.blocklyPath {`,"filter: var(--blocklyReplacementGlowFilter);","}"]}},O_=class extends Ng{constructor(t,e){super(t,e)}draw(){const t=this.block_.pathObject;t.beginDrawing(),this.drawOutline_(),this.drawInternals_(),this.updateConnectionHighlights(),t.setPath(this.outlinePath_+"\n"+this.inlinePath_),this.info_.RTL&&t.flipRTL(),this.recordSizeOnBlock_(),this.info_.outputConnection&&(t.outputShapeType=this.info_.outputConnection.shape.type),t.endDrawing()}drawOutline_(){this.info_.outputConnection&&this.info_.outputConnection.isDynamicShape&&!this.info_.hasStatementInput&&!this.info_.bottomRow.hasNextConnection?(this.drawFlatTop_(),this.drawRightDynamicConnection_(),this.drawFlatBottom_(),this.drawLeftDynamicConnection_()):super.drawOutline_()}drawLeft_(){this.info_.outputConnection&&this.info_.outputConnection.isDynamicShape?this.drawLeftDynamicConnection_():super.drawLeft_()}drawRightSideRow_(t){if(!(t.height<=0)){if(lg.isSpacer(t)){const i=t.precedesStatement;var e=t.followsStatement;if(i||e){const o=this.constants_.INSIDE_CORNERS;var s=o.rightHeight;return s=t.height-(i?s:0),e=e?o.pathBottomRight:"",t=s>0?vn("V",t.yPos+s):"",void(this.outlinePath_+=e+t+(i?o.pathTopRight:""))}}this.outlinePath_+=vn("V",t.yPos+t.height)}}drawRightDynamicConnection_(){if(!this.info_.outputConnection)throw Error("Cannot draw the output connection of a block that doesn't have one");this.outlinePath_+=this.info_.outputConnection.shape.pathRightDown(this.info_.outputConnection.height)}drawLeftDynamicConnection_(){if(!this.info_.outputConnection)throw Error("Cannot draw the output connection of a block that doesn't have one");this.positionOutputConnection_(),this.outlinePath_+=this.info_.outputConnection.shape.pathUp(this.info_.outputConnection.height),this.outlinePath_+="z"}drawFlatTop_(){const t=this.info_.topRow;this.positionPreviousConnection_(),this.outlinePath_+=On(t.xPos,this.info_.startY),this.outlinePath_+=vn("h",t.width)}drawFlatBottom_(){const t=this.info_.bottomRow;this.positionNextConnection_(),this.outlinePath_+=vn("V",t.baseline),this.outlinePath_+=vn("h",-t.width)}drawInlineInput_(t){this.positionInlineInputConnection_(t);const e=t.input.name;t.connectedBlock||this.info_.isInsertionMarker||(t=yn(t.xPos+t.connectionWidth,t.centerline-t.height/2)+this.getInlineInputPath(t),this.block_.pathObject.setOutlinePath(e,t))}getInlineInputPath(t){const e=t.width-2*t.connectionWidth,s=t.height;return vn("h",e)+t.shape.pathRightDown(s)+vn("h",-e)+t.shape.pathUp(s)+"z"}drawStatementInput_(t){var e=t.getLastInput();const s=e.xPos+e.notchOffset+e.shape.width,i=this.constants_.INSIDE_CORNERS,o=e.shape.pathRight+vn("h",-(e.notchOffset-i.width))+i.pathTop,n=t.height-2*i.height;e=i.pathBottom+vn("h",e.notchOffset-i.width)+(e.connectedBottomNextConnection?"":e.shape.pathLeft),this.outlinePath_+=vn("H",s)+o+vn("v",n)+e+vn("H",t.xPos+t.width),this.positionStatementInputConnection_(t)}drawConnectionHighlightPath(t){const e=t.connectionModel;if(e.type===Vd.NEXT_STATEMENT||e.type===Vd.PREVIOUS_STATEMENT||e.type===Vd.OUTPUT_VALUE&&!t.isDynamicShape)return super.drawConnectionHighlightPath(t);t=e.type===Vd.INPUT_VALUE?yn(t.connectionWidth,-t.height/2)+this.getInlineInputPath(t):yn(t.width,-t.height/2)+t.shape.pathDown(t.height);const s=e.getSourceBlock();let i,o;return null==(o=(i=s.pathObject).addConnectionHighlight)?void 0:o.call(i,e,t,e.getOffsetInBlock(),s.RTL)}},k_=class extends Uu{constructor(t,e,s,i,o,n,r){if(super(Uu.SKIP_SETUP),this.imageElement=this.clickHandler=null,this.flipRtl=this.isDirty_=this.EDITABLE=!1,this.altText="",s=Number(eo(s)),e=Number(eo(e)),isNaN(s)||isNaN(e))throw Error("Height and width values of an image field must cast to numbers.");if(s<=0||e<=0)throw Error("Height and width values of an image field must be greater than 0.");this.size_=new Ec(e,s+k_.Y_PADDING),this.imageHeight=s,"function"==typeof o&&(this.clickHandler=o),t!==Uu.SKIP_SETUP&&(r?this.configure_(r):(this.flipRtl=!!n,this.altText=eo(i)||""),this.setValue(eo(t)))}configure_(t){super.configure_(t),t.flipRtl&&(this.flipRtl=t.flipRtl),t.alt&&(this.altText=eo(t.alt))}initView(){this.imageElement=at(Tc.IMAGE,{height:this.imageHeight+"px",width:this.size_.width+"px",alt:this.altText},this.fieldGroup_),this.imageElement.setAttributeNS(Fa,"xlink:href",this.value_),this.fieldGroup_&&ct(this.fieldGroup_,"blocklyImageField"),this.clickHandler&&(this.imageElement.style.cursor="pointer")}updateSize_(){}doClassValidation_(t){return"string"!=typeof t?null:t}doValueUpdate_(t){this.value_=t,this.imageElement&&this.imageElement.setAttributeNS(Fa,"xlink:href",this.value_)}getFlipRtl(){return this.flipRtl}setAlt(t){t!==this.altText&&(this.altText=t||"",this.imageElement&&this.imageElement.setAttribute("alt",this.altText))}isClickable(){return super.isClickable()&&!!this.clickHandler}showEditor_(){this.clickHandler&&this.clickHandler(this)}setOnClickHandler(t){this.clickHandler=t}getText_(){return this.altText}static fromJson(t){if(!t.src||!t.width||!t.height)throw Error("src, width, and height values for an image field arerequired. The width and height must be non-zero.");return new this(t.src,t.width,t.height,void 0,void 0,void 0,t)}};k_.Y_PADDING=1,rn("field_image",k_),k_.prototype.DEFAULT_VALUE="";var A_=class extends Uu{set size_(t){super.size_=t}get size_(){const t=super.size_;return t.width<14&&(t.width=14),t}constructor(t,e,s){super(Uu.SKIP_SETUP),this.spellcheck_=!0,this.htmlInput_=null,this.isTextValid_=this.isBeingEdited_=!1,this.onInputWrapper=this.onKeyDownWrapper=this.valueWhenEditorWasOpened_=null,this.fullBlockClickTarget_=!1,this.workspace_=null,this.SERIALIZABLE=!0,t!==Uu.SKIP_SETUP&&(s&&this.configure_(s),this.setValue(t),e&&this.setValidator(e))}configure_(t){super.configure_(t),void 0!==t.spellcheck&&(this.spellcheck_=t.spellcheck)}initView(){if(!this.getSourceBlock())throw new Hu;super.initView(),this.isFullBlockField()&&(this.clickTarget_=this.sourceBlock_.getSvgRoot()),this.fieldGroup_&&ct(this.fieldGroup_,"blocklyInputField")}isFullBlockField(){const t=this.getSourceBlock();if(!t)throw new Hu;let e;return this.fullBlockClickTarget_=!(null==(e=this.getConstants())||!e.FULL_BLOCK_FIELDS)&&t.isSimpleReporter()}doValueInvalid_(t,e=!0){this.isBeingEdited_&&(this.isDirty_=!0,this.isTextValid_=!1,t=this.value_,this.value_=this.valueWhenEditorWasOpened_,this.sourceBlock_&&st()&&this.value_!==t&&e&&J(new(rt(ua.BLOCK_CHANGE))(this.sourceBlock_,"field",this.name||null,t,this.value_)))}doValueUpdate_(t){this.isTextValid_=this.isDirty_=!0,this.value_=t}applyColour(){const t=this.getSourceBlock();if(!t)throw new Hu;this.getConstants().FULL_BLOCK_FIELDS&&this.fieldGroup_&&(!this.isFullBlockField()&&this.borderRect_?(this.borderRect_.style.display="block",this.borderRect_.setAttribute("stroke",t.getColourTertiary())):(this.borderRect_.style.display="none",t.pathObject.svgPath.setAttribute("fill",this.getConstants().FIELD_BORDER_RECT_COLOUR)))}getSize(){let t;return null!=(t=this.getConstants())&&t.FULL_BLOCK_FIELDS&&(this.render_(),this.isDirty_=!1),super.getSize()}onLocationChange(){this.isBeingEdited_&&this.resizeEditor_()}render_(){if(super.render_(),this.isBeingEdited_){var t=this.htmlInput_;this.isTextValid_?(ut(t,"blocklyInvalidInput"),Ne(t,Qc.INVALID,!1)):(ct(t,"blocklyInvalidInput"),Ne(t,Qc.INVALID,!0))}if(!(t=this.getSourceBlock()))throw new Hu;this.getConstants().FULL_BLOCK_FIELDS&&t.applyColour()}setSpellcheck(t){t!==this.spellcheck_&&(this.spellcheck_=t,this.htmlInput_&&this.htmlInput_.setAttribute("spellcheck",this.spellcheck_))}showEditor_(t,e=!1,s=!0){this.workspace_=this.sourceBlock_.workspace,!e&&this.workspace_.options.modalInputs&&(Ea||ga||_a)?this.showPromptEditor():this.showInlineEditor(e,s)}showPromptEditor(){ze(Hl.Msg$$module$build$src$core$msg.CHANGE_VALUE_TITLE,this.getText(),t=>{null!==t&&this.setValue(this.getValueFromEditorText_(t)),this.onFinishEditing_(this.value_)})}showInlineEditor(t,e){const s=this.getSourceBlock();if(!s)throw new Hu;lo(this,s.RTL,this.widgetDispose_.bind(this),this.workspace_,e),this.htmlInput_=this.widgetCreate_(),this.isBeingEdited_=!0,this.valueWhenEditorWasOpened_=this.value_,t||(this.htmlInput_.focus({preventScroll:!0}),this.htmlInput_.select())}widgetCreate_(){var t=this.getSourceBlock();if(!t)throw new Hu;Hl.setGroup$$module$build$src$core$events$utils(!0);const e=oo();var s=this.getClickTarget_();if(!s)throw Error("A click target has not been set.");ct(s,"blocklyEditing"),(s=document.createElement("input")).className="blocklyHtmlInput",s.setAttribute("spellcheck",this.spellcheck_);const i=this.workspace_.getAbsoluteScale();var o=this.getConstants().FIELD_TEXT_FONTSIZE*i+"pt";return e.style.fontSize=o,s.style.fontSize=o,o=A_.BORDERRADIUS*i+"px",this.isFullBlockField()&&(o=((o=this.getScaledBBox()).bottom-o.top)/2+"px",t=t.getParent()?t.getParent().getColourTertiary():this.sourceBlock_.getColourTertiary(),s.style.border=1*i+"px solid "+t,e.style.borderRadius=o,e.style.transition="box-shadow 0.25s ease 0s",this.getConstants().FIELD_TEXTINPUT_BOX_SHADOW&&(e.style.boxShadow="rgba(255, 255, 255, 0.3) 0 0 0 "+4*i+"px")),s.style.borderRadius=o,e.appendChild(s),s.value=s.defaultValue=this.getEditorText_(this.value_),s.setAttribute("data-untyped-default-value",String(this.value_)),this.resizeEditor_(),this.bindInputEvents_(s),s}widgetDispose_(){this.isBeingEdited_=!1,this.isTextValid_=!0,this.forceRerender(),this.onFinishEditing_(this.value_),this.sourceBlock_&&st()&&null!==this.valueWhenEditorWasOpened_&&this.valueWhenEditorWasOpened_!==this.value_&&(J(new(rt(ua.BLOCK_CHANGE))(this.sourceBlock_,"field",this.name||null,this.valueWhenEditorWasOpened_,this.value_)),this.valueWhenEditorWasOpened_=null),Hl.setGroup$$module$build$src$core$events$utils(!1),this.unbindInputEvents_();var t=oo().style;if(t.width="auto",t.height="auto",t.fontSize="",t.transition="",t.boxShadow="",this.htmlInput_=null,!(t=this.getClickTarget_()))throw Error("A click target has not been set.");ut(t,"blocklyEditing")}onFinishEditing_(t){}bindInputEvents_(t){this.onKeyDownWrapper=T(t,"keydown",this,this.onHtmlInputKeyDown_),this.onInputWrapper=T(t,"input",this,this.onHtmlInputChange)}unbindInputEvents_(){this.onKeyDownWrapper&&(E(this.onKeyDownWrapper),this.onKeyDownWrapper=null),this.onInputWrapper&&(E(this.onInputWrapper),this.onInputWrapper=null)}onHtmlInputKeyDown_(t){if("Enter"===t.key)ho(this),pi();else if("Escape"===t.key)this.setValue(this.htmlInput_.getAttribute("data-untyped-default-value"),!1),ho(this),pi();else if("Tab"===t.key){t.preventDefault();var e,s=null==(e=this.workspace_)?void 0:e.getCursor();e=t=>(t instanceof A_||t instanceof Ep&&t.isSimpleReporter())&&t!==this.getSourceBlock(),(t=(t=t.shiftKey?null==s?void 0:s.getPreviousNode(this,e,!1):null==s?void 0:s.getNextNode(this,e,!1))instanceof Ep&&t.isSimpleReporter()?t.getFields().next().value:t)instanceof A_&&(ho(this),pi(),s=t.getSourceBlock(),t.isFullBlockField()&&s&&s instanceof Ep?Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(s):Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(t),t.showEditor())}}onHtmlInputChange(t){t=this.value_,this.setValue(this.getValueFromEditorText_(this.htmlInput_.value),!1),this.sourceBlock_&&st()&&this.value_!==t&&J(new(rt(ua.BLOCK_FIELD_INTERMEDIATE_CHANGE))(this.sourceBlock_,this.name||null,t,this.value_))}setEditorValue_(t,e=!0){this.isDirty_=!0,this.isBeingEdited_&&(this.htmlInput_.value=this.getEditorText_(t)),this.setValue(t,e)}resizeEditor_(){Me().then(()=>{const t=this.getSourceBlock();if(!t)throw new Hu;const e=oo(),s=this.getScaledBBox();e.style.width=s.right-s.left+"px",e.style.height=s.bottom-s.top+"px";const i=s.top;e.style.left=`${t.RTL?s.right-e.offsetWidth:s.left}px`,e.style.top=`${i}px`})}repositionForWindowResize(){let t;const e=null==(t=this.getSourceBlock())?void 0:t.getRootBlock();return e instanceof Ep&&(zn(this.workspace_,this.workspace_.getMetricsManager().getViewMetrics(!0),e)||this.resizeEditor_(),!0)}positionTextElement_(t,e){const s=2*t+e;super.positionTextElement_(t+(s<14?(14-s)/2:0),e)}getText_(){return this.isBeingEdited_&&this.htmlInput_?this.htmlInput_.value:null}getEditorText_(t){return`${t}`}getValueFromEditorText_(t){return t}};A_.BORDERRADIUS=4,Hl.FieldTextInput$$module$build$src$core$field_textinput=class extends A_{constructor(t,e,s){super(t,e,s)}initView(){super.initView(),this.fieldGroup_&&ct(this.fieldGroup_,"blocklyTextInputField")}doClassValidation_(t){return void 0===t?null:`${t}`}static fromJson(t){return new this(eo(t.text),void 0,t)}},rn("field_input",Hl.FieldTextInput$$module$build$src$core$field_textinput),Hl.FieldTextInput$$module$build$src$core$field_textinput.prototype.DEFAULT_VALUE="",Hl.FieldTextInput$$module$build$src$core$field_textinput;var v_=class extends hg{constructor(t){super(t)}endsWithElemSpacer(){return!1}hasLeftSquareCorner(t){return!!t.outputConnection}hasRightSquareCorner(t){return!!t.outputConnection&&!t.statementInputCount&&!t.nextConnection}},N_=class extends Og{constructor(t,e){if(super(t,e),this.connectedBottomNextConnection=!1,this.connectedBlock){for(t=this.connectedBlock;e=t.getNextBlock();)t=e;t.nextConnection||(this.height=this.connectedBlockHeight,this.connectedBottomNextConnection=!0)}}},w_=class extends ag{constructor(t){super(t),this.width=this.height=0,this.type|=lg.getType("RIGHT_CONNECTION")}},L_=class extends kg{constructor(t){super(t)}endsWithElemSpacer(){return!1}hasLeftSquareCorner(t){const e=(t.hat?"cap"===t.hat:this.constants_.ADD_START_HATS)&&!t.outputConnection&&!t.previousConnection;return!!t.outputConnection||e}hasRightSquareCorner(t){return!!t.outputConnection&&!t.statementInputCount&&!t.nextConnection}},M_=class extends wg{constructor(t,e){super(t,e),this.isInline=!0,this.renderer_=t,this.constants_=this.renderer_.getConstants(),this.topRow=new L_(this.constants_),this.bottomRow=new v_(this.constants_),this.isMultiRow=!e.getInputsInline()||e.isCollapsed(),this.hasStatementInput=e.statementInputCount>0,this.rightSide=this.outputConnection?new w_(this.constants_):null,this.rightAlignedDummyInputs=new WeakMap}getRenderer(){return this.renderer_}measure(){this.createRows_(),this.addElemSpacing_(),this.addRowSpacing_(),this.adjustXPosition_(),this.computeBounds_(),this.alignRowElements_(),this.finalize_()}shouldStartNewRow_(t,e){return!!e&&(e instanceof rp||t instanceof lp||e instanceof lp||(t instanceof Hl.ValueInput$$module$build$src$core$inputs$value_input||t instanceof np||t instanceof rp)&&(!this.isInline||this.isMultiRow))}getDesiredRowWidth_(t){return t.hasStatement?this.width-this.startX-(this.constants_.INSIDE_CORNERS.rightWidth||0):super.getDesiredRowWidth_(t)}getInRowSpacing_(t,e){return t&&e||!this.outputConnection||!this.outputConnection.isDynamicShape||this.hasStatementInput||this.bottomRow.hasNextConnection?!t&&e&&lg.isStatementInput(e)?this.constants_.STATEMENT_INPUT_PADDING_LEFT:t&&lg.isLeftRoundedCorner(t)&&e&&(lg.isPreviousConnection(e)||lg.isNextConnection(e))?e.notchOffset-this.constants_.CORNER_RADIUS:t&&lg.isLeftSquareCorner(t)&&e&&lg.isHat(e)||t&&lg.isField(t)&&0===t.width?this.constants_.NO_PADDING:this.constants_.MEDIUM_PADDING:this.constants_.NO_PADDING}getSpacerRowHeight_(t,e){if(lg.isTopRow(t)&&lg.isBottomRow(e))return this.constants_.EMPTY_BLOCK_SPACER_HEIGHT;const s=lg.isInputRow(t)&&t.hasStatement,i=lg.isInputRow(e)&&e.hasStatement;return i||s?(t=Math.max(this.constants_.NOTCH_HEIGHT,this.constants_.INSIDE_CORNERS.rightHeight||0),i&&s?Math.max(t,this.constants_.DUMMY_INPUT_MIN_HEIGHT):t):lg.isTopRow(t)?t.hasPreviousConnection||this.outputConnection&&!this.hasStatementInput?this.constants_.NO_PADDING:Math.abs(this.constants_.NOTCH_HEIGHT-this.constants_.CORNER_RADIUS):lg.isBottomRow(e)?this.outputConnection?!e.hasNextConnection&&this.hasStatementInput?Math.abs(this.constants_.NOTCH_HEIGHT-this.constants_.CORNER_RADIUS):this.constants_.NO_PADDING:Math.max(this.topRow.minHeight,Math.max(this.constants_.NOTCH_HEIGHT,this.constants_.CORNER_RADIUS))-this.constants_.CORNER_RADIUS:this.constants_.MEDIUM_PADDING}getSpacerRowWidth_(t,e){const s=this.width-this.startX;return lg.isInputRow(t)&&t.hasStatement||lg.isInputRow(e)&&e.hasStatement?Math.max(s,this.constants_.STATEMENT_INPUT_SPACER_MIN_WIDTH):s}getElemCenterline_(t,e){if(t.hasStatement&&!lg.isSpacer(e)&&!lg.isStatementInput(e))return t.yPos+this.constants_.EMPTY_STATEMENT_INPUT_HEIGHT/2;if(lg.isInlineInput(e)){const s=e.connectedBlock;if(s&&s.outputConnection&&s.nextConnection)return t.yPos+s.height/2}return super.getElemCenterline_(t,e)}addInput_(t,e){if((t instanceof np||t instanceof rp)&&e.hasDummyInput&&e.align===Hl.Align$$module$build$src$core$inputs$align.LEFT&&t.align===Hl.Align$$module$build$src$core$inputs$align.RIGHT)this.rightAlignedDummyInputs.set(e,t);else if(t instanceof lp)return e.elements.push(new N_(this.constants_,t)),e.hasStatement=!0,void(null===e.align&&(e.align=t.align));super.addInput_(t,e)}addAlignmentPadding_(t,e){if(this.rightAlignedDummyInputs.get(t)){let s;for(let e=0;e=this.rows.length-1?!!this.bottomRow.hasNextConnection:!!i.precedesStatement,lg.isInputRow(n)&&n.hasStatement){let s,i;n.measure(),e=n.width-(null!=(i=null==(s=n.getLastInput())?void 0:s.width)?i:0)+t}else if(s&&(2===o||i)&&lg.isInputRow(n)&&!n.hasStatement){i=n.xPos,s=null;for(let t=0;t1)return s===i.SHAPES.ROUND?(s=this.constants_.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH,e-(s=this.height/2>s?s:this.height/2)*(1-Math.sin(Math.acos((s-this.constants_.SMALL_PADDING)/s)))):0;if(lg.isInlineInput(t)){const o=t.connectedBlock;return null==(t=o?o.pathObject.outputShapeType:t.shape.type)||o&&o.outputConnection&&(o.statementInputCount||o.nextConnection)||s===i.SHAPES.HEXAGONAL&&s!==t?0:e-this.constants_.SHAPE_IN_SHAPE_PADDING[s][t]}return lg.isField(t)?s===i.SHAPES.ROUND&&t.field instanceof Hl.FieldTextInput$$module$build$src$core$field_textinput?e-2.75*i.GRID_UNIT:e-this.constants_.SHAPE_IN_SHAPE_PADDING[s][0]:lg.isIcon(t)?this.constants_.SMALL_PADDING:0}finalizeVerticalAlignment_(){if(!this.outputConnection)for(let i=2;i=this.rows.length-1?!!this.bottomRow.hasNextConnection:!!r.precedesStatement;if(t?this.topRow.hasPreviousConnection:o.followsStatement){var s=n.elements[1];if(s=3===n.elements.length&&s instanceof gg&&(s.field instanceof qd||s.field instanceof k_),!t&&s)o.height-=this.constants_.SMALL_PADDING,r.height-=this.constants_.SMALL_PADDING,n.height-=this.constants_.MEDIUM_PADDING;else if(t||e){if(e){for(t=!1,e=0;e=40){t=!0;break}t&&(o.height-=this.constants_.SMALL_PADDING,r.height-=this.constants_.SMALL_PADDING)}}else o.height+=this.constants_.SMALL_PADDING}}}finalize_(){this.finalizeOutputConnection_(),this.finalizeHorizontalAlignment_(),this.finalizeVerticalAlignment_(),super.finalize_(),this.rightSide&&(this.widthWithChildren+=this.rightSide.width)}},D_=class extends Lg{constructor(t,e,s){super(t,e,s),this.svgPathSelected=null,this.outlines=new Map,this.remainingOutlines=new Set,this.outputShapeType=null,this.constants=s}setPath(t){super.setPath(t),this.svgPathSelected&&this.svgPathSelected.setAttribute("d",t)}applyColour(t){super.applyColour(t);const e=t.getParent();t.isShadow()&&e&&this.svgPath.setAttribute("stroke",e.getColourTertiary());for(const t of this.outlines.values())t.setAttribute("fill",this.style.colourTertiary)}flipRTL(){super.flipRTL();for(const t of this.outlines.values())t.setAttribute("transform","scale(-1 1)")}updateSelected(t){this.setClass_("blocklySelected",t),t?this.svgPathSelected||(this.svgPathSelected=this.svgPath.cloneNode(!0),this.svgPathSelected.classList.add("blocklyPathSelected"),ut(this.svgPathSelected,za.ACTIVE_FOCUS_NODE_CSS_CLASS_NAME),ut(this.svgPathSelected,za.PASSIVE_FOCUS_NODE_CSS_CLASS_NAME),this.svgPathSelected.removeAttribute("tabindex"),this.svgPathSelected.removeAttribute("id"),this.svgRoot.appendChild(this.svgPathSelected)):this.svgPathSelected&&(this.svgRoot.removeChild(this.svgPathSelected),this.svgPathSelected=null)}updateReplacementFade(t){this.setClass_("blocklyReplaceable",t)}updateShapeForInputHighlight(t,e){t=t.getParentInput().name,(t=this.getOutlinePath(t))&&(e?t.setAttribute("filter","url(#"+this.constants.replacementGlowFilterId+")"):t.removeAttribute("filter"))}beginDrawing(){this.remainingOutlines.clear();for(const t of this.outlines.keys())this.remainingOutlines.add(t)}endDrawing(){if(this.remainingOutlines.size)for(const t of this.remainingOutlines)this.removeOutlinePath(t);this.remainingOutlines.clear()}setOutlinePath(t,e){(t=this.getOutlinePath(t)).setAttribute("d",e),t.setAttribute("fill",this.style.colourTertiary)}getOutlinePath(t){return this.outlines.has(t)||this.outlines.set(t,at(Tc.PATH,{class:"blocklyOutlinePath",d:""},this.svgRoot)),this.remainingOutlines.delete(t),this.outlines.get(t)}removeOutlinePath(t){let e,s;null==(e=this.outlines.get(t))||null==(s=e.parentNode)||s.removeChild(this.outlines.get(t)),this.outlines.delete(t)}},x_=class extends Mg{constructor(t){super(t)}makeConstants_(){return new y_}makeRenderInfo_(t){return new M_(this,t)}makeDrawer_(t,e){return new O_(t,e)}makePathObject(t,e){return new D_(t,e,this.getConstants())}getConstants(){return this.constants_}};Ir("zelos",x_);var P_=class{constructor(t){this.staticConn=this.draggedConn=this.markerConn=this.fadedBlock=null,this.workspace=t.workspace}previewReplacement(t,e,s){Hl.disable$$module$build$src$core$events$utils();try{this.hidePreview(),this.fadedBlock=s,s.fadeForReplacement(!0),this.workspace.getRenderer().shouldHighlightConnection(e)&&(e.highlight(),this.staticConn=e)}finally{Hl.enable$$module$build$src$core$events$utils()}}previewConnection(t,e){if(t!==this.draggedConn||e!==this.staticConn){Hl.disable$$module$build$src$core$events$utils();try{this.hidePreview(),this.shouldUseMarkerPreview(t,e)&&(this.markerConn=this.previewMarker(t,e)),this.workspace.getRenderer().shouldHighlightConnection(e)&&e.highlight(),this.draggedConn=t,this.staticConn=e}finally{Hl.enable$$module$build$src$core$events$utils()}}}shouldUseMarkerPreview(t,e){return e.type===Vd.PREVIOUS_STATEMENT||e.type===Vd.NEXT_STATEMENT||!(this.workspace.getRenderer()instanceof x_)}previewMarker(t,e){const s=t.getSourceBlock(),i=this.createInsertionMarker(s),o=this.getMatchingConnection(s,i,t);if(!o)return null;i.queueRender(),De(),o.connect(e);const n={x:e.x-o.x,y:e.y-o.y},r=o.getOffsetInBlock().clone();return Me().then(()=>{if(!i.isDeadOrDying()){Hl.disable$$module$build$src$core$events$utils();try{null==i||i.positionNearConnection(o,n,r),null==i||i.getSvgRoot().setAttribute("visibility","visible")}finally{Hl.enable$$module$build$src$core$events$utils()}}}),o}serializeBlockToInsertionMarker(t){const e=$s(t,{addCoordinates:!1,addInputBlocks:!1,addNextBlocks:!1,doFullSerialization:!1});if(!e)throw Error(`Failed to serialize source block. ${t.toDevString()}`);return e}createInsertionMarker(t){t=this.serializeBlockToInsertionMarker(t),t=vs(t,this.workspace);for(const e of t.getDescendants(!1))e.setInsertionMarker(!0);return t.initSvg(),t.getSvgRoot().setAttribute("visibility","hidden"),t}getMatchingConnection(t,e,s){if(t=t.getConnections_(!0),e=e.getConnections_(!0),t.length!==e.length)return null;for(let i=0;i-e||t<-180+e||t>180-e}getClientRect(){if(!this.svgGroup_||this.autoClose||!this.isVisible())return null;const t=this.svgGroup_.getBoundingClientRect(),e=t.left;return this.toolboxPosition_===Lc.LEFT?new mc(-1e9,1e9,-1e9,e+t.width):new mc(-1e9,1e9,e,1e9)}reflowInternal_(){this.workspace_.scale=this.getFlyoutScale();let t=this.getContents().reduce((t,e)=>Math.max(t,e.getElement().getBoundingRectangle().getWidth()),0);if(t+=1.5*this.MARGIN+this.tabWidth_,t*=this.workspace_.scale,t+=Sc.scrollbarThickness,this.getWidth()!==t){if(this.RTL)for(const e of this.getContents()){const s=e.getElement().getBoundingRectangle().left,i=t/this.workspace_.scale-e.getElement().getBoundingRectangle().getWidth()-this.MARGIN-this.tabWidth_;e.getElement().moveBy(i-s,0)}this.targetWorkspace.scrollbar||this.autoClose||this.targetWorkspace.getFlyout()!==this||this.toolboxPosition_!==Lc.LEFT||this.targetWorkspace.translate(this.targetWorkspace.scrollX+t,this.targetWorkspace.scrollY),this.width_=t,this.position(),this.targetWorkspace.resizeContents(),this.targetWorkspace.recordDragTargets()}}};U_.registryName="verticalFlyout",t(zl.FLYOUTS_VERTICAL_TOOLBOX,Xl,U_);var H_=class extends zp{constructor(t){super(t),this.horizontalLayout=!0}setMetrics_(t){if(this.isVisible()){var e=this.workspace_.getMetricsManager(),s=e.getScrollMetrics(),i=e.getViewMetrics();e=e.getAbsoluteMetrics(),"number"==typeof t.x&&(this.workspace_.scrollX=-(s.left+(s.width-i.width)*t.x)),this.workspace_.translate(this.workspace_.scrollX+e.left,this.workspace_.scrollY+e.top)}}getX(){return 0}getY(){if(!this.isVisible())return 0;var t=this.targetWorkspace.getMetricsManager();const e=t.getAbsoluteMetrics(),s=t.getViewMetrics();t=t.getToolboxMetrics();const i=this.toolboxPosition_===Lc.TOP;return this.targetWorkspace.toolboxPosition===this.toolboxPosition_?this.targetWorkspace.getToolbox()?i?t.height:s.height-this.getHeight():i?0:s.height:i?0:s.height+e.top-this.getHeight()}position(){if(this.isVisible()&&this.targetWorkspace.isVisible()){var t=this.targetWorkspace.getMetricsManager().getViewMetrics();this.width_=t.width,t=t.width-2*this.CORNER_RADIUS;var e=this.getHeight()-this.CORNER_RADIUS;this.setBackgroundPath(t,e),t=this.getX(),e=this.getY(),this.positionAt_(this.getWidth(),this.getHeight(),t,e)}}setBackgroundPath(t,e){const s=this.toolboxPosition_===Lc.TOP,i=["M 0,"+(s?0:this.CORNER_RADIUS)];s?(i.push("h",t+2*this.CORNER_RADIUS),i.push("v",e),i.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,-this.CORNER_RADIUS,this.CORNER_RADIUS),i.push("h",-t),i.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,-this.CORNER_RADIUS,-this.CORNER_RADIUS)):(i.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,this.CORNER_RADIUS,-this.CORNER_RADIUS),i.push("h",t),i.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,this.CORNER_RADIUS,this.CORNER_RADIUS),i.push("v",e),i.push("h",-t-2*this.CORNER_RADIUS)),i.push("z"),this.svgBackground_.setAttribute("d",i.join(" "))}scrollToStart(){let t;null==(t=this.workspace_.scrollbar)||t.setX(this.RTL?1/0:0)}wheel_(t){var e=I(t);if(e=e.x||e.y){const t=this.workspace_.getMetricsManager(),s=t.getScrollMetrics();let i;e=t.getViewMetrics().left-s.left+e,null==(i=this.workspace_.scrollbar)||i.setX(e),uo(this.workspace_),pi()}t.preventDefault(),t.stopPropagation()}layout_(t){this.workspace_.scale=this.targetWorkspace.scale;const e=this.MARGIN;let s=e+this.tabWidth_;this.RTL&&(t=t.reverse());for(const i of t)t=i.getElement().getBoundingRectangle(),t=this.RTL?s+t.getWidth():s,i.getElement().moveBy(t,e),s+=i.getElement().getBoundingRectangle().getWidth()}isDragTowardWorkspace(t){t=Math.atan2(t.y,t.x)/Math.PI*180;const e=this.dragAngleRange_;return t<90+e&&t>90-e||t>-90-e&&t<-90+e}getClientRect(){if(!this.svgGroup_||this.autoClose||!this.isVisible())return null;const t=this.svgGroup_.getBoundingClientRect(),e=t.top;return this.toolboxPosition_===Lc.TOP?new mc(-1e9,e+t.height,-1e9,1e9):new mc(e,1e9,-1e9,1e9)}reflowInternal_(){this.workspace_.scale=this.getFlyoutScale();let t=this.getContents().reduce((t,e)=>Math.max(t,e.getElement().getBoundingRectangle().getHeight()),0);t+=1.5*this.MARGIN,t*=this.workspace_.scale,t+=Sc.scrollbarThickness,this.getHeight()!==t&&(this.targetWorkspace.scrollbar||this.autoClose||this.targetWorkspace.getFlyout()!==this||this.toolboxPosition_!==Lc.TOP||this.targetWorkspace.translate(this.targetWorkspace.scrollX,this.targetWorkspace.scrollY+t),this.height_=t,this.position(),this.targetWorkspace.resizeContents(),this.targetWorkspace.recordDragTargets())}};t(zl.FLYOUTS_HORIZONTAL_TOOLBOX,Xl,H_);var G_=class extends kd{constructor(t,e,s,i,o){super(Uu.SKIP_SETUP),this.defaultType="",this.variableTypes=[],this.variable=null,this.SERIALIZABLE=!0,this.menuGenerator_=G_.dropdownCreate,this.defaultVariableName="string"==typeof t?t:"",this.size_=new Ec(0,0),t!==Uu.SKIP_SETUP&&(o?this.configure_(o):this.setTypes(s,i),e&&this.setValidator(e))}configure_(t){super.configure_(t),this.setTypes(t.variableTypes,t.defaultType)}initModel(){var t=this.getSourceBlock();if(!t)throw new Hu;this.variable||(t=Hl.getOrCreateVariablePackage$$module$build$src$core$variables(t.workspace,null,this.defaultVariableName,this.defaultType),this.doValueUpdate_(t.getId()))}initView(){super.initView(),ct(this.fieldGroup_,"blocklyVariableField")}shouldAddBorderRect_(){const t=this.getSourceBlock();if(!t)throw new Hu;return super.shouldAddBorderRect_()&&(!this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW||"variables_get"!==t.type)}fromXml(t){var e=this.getSourceBlock();if(!e)throw new Hu;const s=t.getAttribute("id"),i=t.textContent,o=t.getAttribute("variabletype")||t.getAttribute("variableType")||"";if(e=Hl.getOrCreateVariablePackage$$module$build$src$core$variables(e.workspace,s,i,o),null!==o&&o!==e.getType())throw Error("Serialized variable type with id '"+e.getId()+"' had type "+e.getType()+", and does not match variable field that references it: "+Uo(t)+".");this.setValue(e.getId())}toXml(t){return this.initModel(),t.id=this.variable.getId(),t.textContent=this.variable.getName(),this.variable.getType()&&t.setAttribute("variabletype",this.variable.getType()),t}saveState(t){var e=this.saveLegacyState(G_);return null!==e||(this.initModel(),e={id:this.variable.getId()},t&&(e.name=this.variable.getName(),e.type=this.variable.getType())),e}loadState(t){const e=this.getSourceBlock();if(!e)throw new Hu;this.loadLegacyState(G_,t)||(t=Hl.getOrCreateVariablePackage$$module$build$src$core$variables(e.workspace,t.id||null,t.name,t.type||""),this.setValue(t.getId()))}setSourceBlock(t){if(t.isShadow())throw Error("Variable fields are not allowed to exist on shadow blocks.");super.setSourceBlock(t)}getValue(){return this.variable?this.variable.getId():null}getText(){return this.variable?this.variable.getName():""}getVariable(){return this.variable}getDefaultType(){return this.defaultType}getValidator(){return this.variable?this.validator_:null}doClassValidation_(t){if(null===t)return null;var e=this.getSourceBlock();if(!e)throw new Hu;return(e=Hl.getVariable$$module$build$src$core$variables(e.workspace,t))?(e=e.getType(),this.typeIsAllowed(e)?t:(console.warn("Variable type doesn't match this field! Type was "+e),null)):(console.warn("Variable id doesn't point to a real variable! ID was "+t),null)}doValueUpdate_(t){const e=this.getSourceBlock();if(!e)throw new Hu;this.variable=Hl.getVariable$$module$build$src$core$variables(e.workspace,t),super.doValueUpdate_(t)}typeIsAllowed(t){const e=this.getVariableTypes();if(!e)return!0;for(let s=0;s-1/0&&(t.min=`${this.min_}`,Ne(t,Qc.VALUEMIN,this.min_)),this.max_<1/0&&(t.max=`${this.max_}`,Ne(t,Qc.VALUEMAX,this.max_)),t}initView(){super.initView(),this.fieldGroup_&&ct(this.fieldGroup_,"blocklyNumberField")}static fromJson(t){return new this(t.value,void 0,void 0,void 0,void 0,t)}};rn("field_number",V_),V_.prototype.DEFAULT_VALUE=0;var W_=class extends qd{constructor(t,e,s){super(String(null!=t?t:""),e,s),this.EDITABLE=!1,this.SERIALIZABLE=!0}static fromJson(t){return new this(eo(t.text),void 0,t)}};rn("field_label_serializable",W_);var X_=class extends Uu{constructor(t,e,s){super(Uu.SKIP_SETUP),this.SERIALIZABLE=!0,this.value_=this.value_,this.checkChar=X_.CHECK_CHAR,t!==Uu.SKIP_SETUP&&(s&&this.configure_(s),this.setValue(t),e&&this.setValidator(e))}configure_(t){super.configure_(t),t.checkCharacter&&(this.checkChar=t.checkCharacter)}saveState(){const t=this.saveLegacyState(X_);return null!==t?t:this.getValueBoolean()}initView(){super.initView();const t=this.getTextElement();ct(this.fieldGroup_,"blocklyCheckboxField"),t.style.display=this.value_?"block":"none"}render_(){this.textContent_&&(this.textContent_.nodeValue=this.getDisplayText_()),this.updateSize_(this.getConstants().FIELD_CHECKBOX_X_OFFSET)}getDisplayText_(){return this.checkChar}setCheckCharacter(t){this.checkChar=t||X_.CHECK_CHAR,this.forceRerender()}showEditor_(){this.setValue(!this.value_)}doClassValidation_(t){return!0===t||"TRUE"===t?"TRUE":!1===t||"FALSE"===t?"FALSE":null}doValueUpdate_(t){this.value_=this.convertValueToBool(t),this.textElement_&&(this.textElement_.style.display=this.value_?"block":"none")}getValue(){return this.value_?"TRUE":"FALSE"}getValueBoolean(){return this.value_}getText(){return String(this.convertValueToBool(this.value_))}convertValueToBool(t){return"string"==typeof t?"TRUE"===t:!!t}static fromJson(t){return new this(t.checked,void 0,t)}};X_.CHECK_CHAR="✓",rn("field_checkbox",X_),X_.prototype.DEFAULT_VALUE=!1;var z_=class{constructor(t,e){this.draggable=t,this.workspace=e,this.dragTarget=null,this.startLoc=t.getRelativeToSurfaceXY()}onDragStart(t){Hl.getGroup$$module$build$src$core$events$utils()||Hl.setGroup$$module$build$src$core$events$utils(!0),this.draggable.startDrag(t)}onDrag(t,e){this.moveDraggable(t,e),e=this.getRoot(this.draggable),Jn(e)&&e.setDeleteStyle(this.wouldDeleteDraggable(t,e)),this.updateDragTarget(t)}updateDragTarget(t){t=this.workspace.getDragTarget(t);const e=this.getRoot(this.draggable);if(this.dragTarget!==t){let s;null==(s=this.dragTarget)||s.onDragExit(e),null==t||t.onDragEnter(e)}null==t||t.onDragOver(e),this.dragTarget=t}moveDraggable(t,e){e=this.pixelsToWorkspaceUnits(e),e=_c.sum(this.startLoc,e),this.draggable.drag(e,t)}wouldDeleteDraggable(t,e){return!(!(t=this.workspace.getDragTarget(t))||!this.workspace.getComponentManager().hasCapability(t.id,cc.Capability.DELETE_AREA))&&t.wouldDelete(e)}onDragEnd(t){const e=Hl.getGroup$$module$build$src$core$events$utils();var s=this.workspace.getDragTarget(t);const i=this.getRoot(this.draggable);if(s){let t;null==(t=this.dragTarget)||t.onDrop(i)}this.shouldReturnToStart(t,i)&&this.draggable.revertDrag(),(s=Jn(i)&&this.wouldDeleteDraggable(t,i))&&this.draggable instanceof Ep&&Pn(this.draggable.getRootBlock()),this.draggable.endDrag(t),s&&Jn(i)&&(Hl.setGroup$$module$build$src$core$events$utils(e),i.dispose()),Hl.setGroup$$module$build$src$core$events$utils(!1),!s&&It(this.draggable)&&Hl.getFocusManager$$module$build$src$core$focus_manager().focusNode(this.draggable)}getRoot(t){return t instanceof Ep?t.getRootBlock():t}shouldReturnToStart(t,e){return!!(t=this.workspace.getDragTarget(t))&&t.shouldPreventMove(e)}pixelsToWorkspaceUnits(t){return t=new _c(t.x/this.workspace.scale,t.y/this.workspace.scale),this.workspace.isMutator&&t.scale(1/this.workspace.options.parentWorkspace.scale),t}};t(zl.BLOCK_DRAGGER,Xl,z_);var Y_={};Y_.BlockDragStrategy=_p,Y_.BubbleDragStrategy=Ld,Y_.CommentDragStrategy=ad,Y_.Dragger=z_;var K_=class extends oc{constructor(t,e,s){super(t?t.workspace.id:void 0),this.type=ua.BLOCK_DRAG,t&&(this.blockId=t.id,this.isStart=e,this.blocks=s)}toJson(){const t=super.toJson();if(void 0===this.isStart)throw Error("Whether this event is the start of a drag is undefined. Either pass the value to the constructor, or call fromJson");if(void 0===this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");return t.isStart=this.isStart,t.blockId=this.blockId,t.blocks=this.blocks,t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new K_)).isStart=t.isStart,e.blockId=t.blockId,e.blocks=t.blocks,e}};t(zl.EVENT,ua.BLOCK_DRAG,K_);var j_=class extends jh{constructor(t,e,s,i){super(t),this.type=ua.BLOCK_FIELD_INTERMEDIATE_CHANGE,this.recordUndo=!1,t&&(this.name=e,this.oldValue=s,this.newValue=i)}toJson(){const t=super.toJson();if(!this.name)throw Error("The changed field name is undefined. Either pass a name to the constructor, or call fromJson.");return t.name=this.name,t.oldValue=this.oldValue,t.newValue=this.newValue,t}static fromJson(t,e,s){return(e=jh.fromJson(t,e,null!=s?s:new j_)).name=t.name,e.oldValue=t.oldValue,e.newValue=t.newValue,e}isNull(){return this.oldValue===this.newValue}run(t){var e=this.getEventWorkspace_();if(!this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");if(!(e=e.getBlockById(this.blockId)))throw Error("The associated block is undefined. Either pass a block to the constructor, or call fromJson");t=t?this.newValue:this.oldValue,(e=e.getField(this.name))?e.setValue(t):console.warn("Can't set non-existent field: "+this.name)}};t(zl.EVENT,ua.BLOCK_FIELD_INTERMEDIATE_CHANGE,j_);var J_=class extends jh{constructor(t){super(t),this.type=ua.BLOCK_MOVE,t&&(t.isShadow()&&(this.recordUndo=!1),t=this.currentLocation(),this.oldParentId=t.parentId,this.oldInputName=t.inputName,this.oldCoordinate=t.coordinate)}toJson(){const t=super.toJson();return t.oldParentId=this.oldParentId,t.oldInputName=this.oldInputName,this.oldCoordinate&&(t.oldCoordinate=`${Math.round(this.oldCoordinate.x)}, ${Math.round(this.oldCoordinate.y)}`),t.newParentId=this.newParentId,t.newInputName=this.newInputName,this.newCoordinate&&(t.newCoordinate=`${Math.round(this.newCoordinate.x)}, ${Math.round(this.newCoordinate.y)}`),this.reason&&(t.reason=this.reason),this.recordUndo||(t.recordUndo=this.recordUndo),t}static fromJson(t,e,s){return(e=jh.fromJson(t,e,null!=s?s:new J_)).oldParentId=t.oldParentId,e.oldInputName=t.oldInputName,t.oldCoordinate&&(s=t.oldCoordinate.split(","),e.oldCoordinate=new _c(Number(s[0]),Number(s[1]))),e.newParentId=t.newParentId,e.newInputName=t.newInputName,t.newCoordinate&&(s=t.newCoordinate.split(","),e.newCoordinate=new _c(Number(s[0]),Number(s[1]))),void 0!==t.reason&&(e.reason=t.reason),void 0!==t.recordUndo&&(e.recordUndo=t.recordUndo),e}recordNew(){const t=this.currentLocation();this.newParentId=t.parentId,this.newInputName=t.inputName,this.newCoordinate=t.coordinate}setReason(t){this.reason=t}currentLocation(){var t=this.getEventWorkspace_();if(!this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");var e=t.getBlockById(this.blockId);if(!e)throw Error("The block associated with the block move event could not be found");t={};const s=e.getParent();return s?(t.parentId=s.id,(e=s.getInputWithBlock(e))&&(t.inputName=e.name)):t.coordinate=e.getRelativeToSurfaceXY(),t}isNull(){return this.oldParentId===this.newParentId&&this.oldInputName===this.newInputName&&_c.equals(this.oldCoordinate,this.newCoordinate)}run(t){var e=this.getEventWorkspace_();if(!this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");var s=e.getBlockById(this.blockId);if(s){var i=t?this.newParentId:this.oldParentId,o=t?this.newInputName:this.oldInputName;if(t=t?this.newCoordinate:this.oldCoordinate,i){var n=e.getBlockById(i);if(!n)return void console.warn("Can't connect to non-existent block: "+i)}if(s.getParent()&&s.unplug(),t)o=s.getRelativeToSurfaceXY(),s.moveBy(t.x-o.x,t.y-o.y,this.reason);else{let t,i;(!(e=s.outputConnection)||s.previousConnection&&s.previousConnection.isConnected())&&(e=s.previousConnection),s=null==(i=e)?void 0:i.type,o?(s=n.getInput(o))&&(t=s.connection):s===Vd.PREVIOUS_STATEMENT&&(t=n.nextConnection),t&&e?e.connect(t):console.warn("Can't connect to non-existent input: "+o)}}else console.warn("Can't move non-existent block: "+this.blockId)}};t(zl.EVENT,ua.BLOCK_MOVE,J_);var q_,Z_=class extends oc{constructor(t,e,s){super(t?t.workspace.id:void 0),this.type=ua.BUBBLE_OPEN,t&&(this.blockId=t.id,this.isOpen=e,this.bubbleType=s)}toJson(){const t=super.toJson();if(void 0===this.isOpen)throw Error("Whether this event is for opening the bubble is undefined. Either pass the value to the constructor, or call fromJson");if(!this.bubbleType)throw Error("The type of bubble is undefined. Either pass the value to the constructor, or call fromJson");return t.isOpen=this.isOpen,t.bubbleType=this.bubbleType,t.blockId=this.blockId||"",t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new Z_)).isOpen=t.isOpen,e.bubbleType=t.bubbleType,e.blockId=t.blockId,e}};(function(t){t.MUTATOR="mutator",t.COMMENT="comment",t.WARNING="warning"})(q_||(q_={})),t(zl.EVENT,ua.BUBBLE_OPEN,Z_);var Q_={};Q_.BubbleOpen=Z_,Q_.BubbleType=q_;var tT=class extends ic{constructor(t){super(),this.isBlank=!0,this.isBlank=!t,t&&(this.commentId=t.id,this.workspaceId=t.workspace.id,this.group=Hl.getGroup$$module$build$src$core$events$utils(),this.recordUndo=j())}toJson(){const t=super.toJson();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");return t.commentId=this.commentId,t}static fromJson(t,e,s){return(e=ic.fromJson(t,e,null!=s?s:new tT)).commentId=t.commentId,e}static CommentCreateDeleteHelper(t,e){const s=t.getEventWorkspace_();if(e){if(!t.json)throw Error("Encountered a comment event without proper json");Re(t.json,s)}else{if(!t.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");(e=s.getCommentById(t.commentId))?e.dispose():console.warn("Can't delete non-existent comment: "+t.commentId)}}},eT=class extends tT{constructor(t,e,s){super(t),this.type=ua.COMMENT_CHANGE,t&&(this.oldContents_=void 0===e?"":e,this.newContents_=void 0===s?"":s)}toJson(){const t=super.toJson();if(!this.oldContents_)throw Error("The old contents is undefined. Either pass a value to the constructor, or call fromJson");if(!this.newContents_)throw Error("The new contents is undefined. Either pass a value to the constructor, or call fromJson");return t.oldContents=this.oldContents_,t.newContents=this.newContents_,t}static fromJson(t,e,s){return(e=tT.fromJson(t,e,null!=s?s:new eT)).oldContents_=t.oldContents,e.newContents_=t.newContents,e}isNull(){return this.oldContents_===this.newContents_}run(t){var e=this.getEventWorkspace_();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");if(e=e.getCommentById(this.commentId)){var s=t?this.newContents_:this.oldContents_;if(void 0===s){if(t)throw Error("The new contents is undefined. Either pass a value to the constructor, or call fromJson");throw Error("The old contents is undefined. Either pass a value to the constructor, or call fromJson")}e.setText(s)}else console.warn("Can't change non-existent comment: "+this.commentId)}};t(zl.EVENT,ua.COMMENT_CHANGE,eT);var sT=class extends tT{constructor(t,e){super(t),this.newCollapsed=e,this.type=ua.COMMENT_COLLAPSE}toJson(){const t=super.toJson();if(void 0===this.newCollapsed)throw Error("The new collapse value undefined. Either call recordNew, or call fromJson");return t.newCollapsed=this.newCollapsed,t}static fromJson(t,e,s){return(e=tT.fromJson(t,e,null!=s?s:new sT)).newCollapsed=t.newCollapsed,e}run(t){var e=this.getEventWorkspace_();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");(e=e.getCommentById(this.commentId))?e.setCollapsed(t?!!this.newCollapsed:!this.newCollapsed):console.warn("Can't collapse or uncollapse non-existent comment: "+this.commentId)}};t(zl.EVENT,ua.COMMENT_COLLAPSE,sT);var iT=class extends tT{constructor(t){super(t),this.type=ua.COMMENT_CREATE,t&&(this.xml=Lo(t),this.json=Se(t,{addCoordinates:!0}))}toJson(){const t=super.toJson();if(!this.xml)throw Error("The comment XML is undefined. Either pass a comment to the constructor, or call fromJson");if(!this.json)throw Error("The comment JSON is undefined. Either pass a block to the constructor, or call fromJson");return t.xml=Uo(this.xml),t.json=this.json,t}static fromJson(t,e,s){return(e=tT.fromJson(t,e,null!=s?s:new iT)).xml=Hl.textToDom$$module$build$src$core$utils$xml(t.xml),e.json=t.json,e}run(t){tT.CommentCreateDeleteHelper(this,t)}};t(zl.EVENT,ua.COMMENT_CREATE,iT);var oT=class extends tT{constructor(t){super(t),this.type=ua.COMMENT_DELETE,t&&(this.xml=Lo(t),this.json=Se(t,{addCoordinates:!0}))}run(t){tT.CommentCreateDeleteHelper(this,!t)}toJson(){const t=super.toJson();if(!this.xml)throw Error("The comment XML is undefined. Either pass a comment to the constructor, or call fromJson");if(!this.json)throw Error("The comment JSON is undefined. Either pass a block to the constructor, or call fromJson");return t.xml=Uo(this.xml),t.json=this.json,t}static fromJson(t,e,s){return(e=tT.fromJson(t,e,null!=s?s:new oT)).xml=Hl.textToDom$$module$build$src$core$utils$xml(t.xml),e.json=t.json,e}};t(zl.EVENT,ua.COMMENT_DELETE,oT);var nT=class extends oc{constructor(t,e){super(t?t.workspace.id:void 0),this.type=ua.COMMENT_DRAG,t&&(this.commentId=t.id,this.isStart=e)}toJson(){const t=super.toJson();if(void 0===this.isStart)throw Error("Whether this event is the start of a drag is undefined. Either pass the value to the constructor, or call fromJson");if(void 0===this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");return t.isStart=this.isStart,t.commentId=this.commentId,t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new nT)).isStart=t.isStart,e.commentId=t.commentId,e}};t(zl.EVENT,ua.COMMENT_DRAG,nT);var rT=class extends tT{constructor(t){super(t),this.type=ua.COMMENT_MOVE,t&&(this.comment_=t,this.oldCoordinate_=t.getRelativeToSurfaceXY())}recordNew(){if(this.newCoordinate_)throw Error("Tried to record the new position of a comment on the same event twice.");if(!this.comment_)throw Error("The comment is undefined. Pass a comment to the constructor if you want to use the record functionality");this.newCoordinate_=this.comment_.getRelativeToSurfaceXY()}setReason(t){this.reason=t}setOldCoordinate(t){this.oldCoordinate_=t}toJson(){const t=super.toJson();if(!this.oldCoordinate_)throw Error("The old comment position is undefined. Either pass a comment to the constructor, or call fromJson");if(!this.newCoordinate_)throw Error("The new comment position is undefined. Either call recordNew, or call fromJson");return t.oldCoordinate=`${Math.round(this.oldCoordinate_.x)}, ${Math.round(this.oldCoordinate_.y)}`,t.newCoordinate=Math.round(this.newCoordinate_.x)+","+Math.round(this.newCoordinate_.y),t}static fromJson(t,e,s){return e=tT.fromJson(t,e,null!=s?s:new rT),s=t.oldCoordinate.split(","),e.oldCoordinate_=new _c(Number(s[0]),Number(s[1])),s=t.newCoordinate.split(","),e.newCoordinate_=new _c(Number(s[0]),Number(s[1])),e}isNull(){return _c.equals(this.oldCoordinate_,this.newCoordinate_)}run(t){var e=this.getEventWorkspace_();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");if(e=e.getCommentById(this.commentId)){if(!(t=t?this.newCoordinate_:this.oldCoordinate_))throw Error("Either oldCoordinate_ or newCoordinate_ is undefined. Either pass a comment to the constructor and call recordNew, or call fromJson");e.moveTo(t)}else console.warn("Can't move non-existent comment: "+this.commentId)}};t(zl.EVENT,ua.COMMENT_MOVE,rT);var lT=class extends tT{constructor(t){super(t),this.type=ua.COMMENT_RESIZE,t&&(this.oldSize=t.getSize())}recordCurrentSizeAsNewSize(){if(this.newSize)throw Error("Tried to record the new size of a comment on the same event twice.");var t=this.getEventWorkspace_();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");if(!(t=t.getCommentById(this.commentId)))throw Error("The comment associated with the comment resize event could not be found");this.newSize=t.getSize()}toJson(){const t=super.toJson();if(!this.oldSize)throw Error("The old comment size is undefined. Either pass a comment to the constructor, or call fromJson");if(!this.newSize)throw Error("The new comment size is undefined. Either call recordCurrentSizeAsNewSize, or call fromJson");return t.oldWidth=Math.round(this.oldSize.width),t.oldHeight=Math.round(this.oldSize.height),t.newWidth=Math.round(this.newSize.width),t.newHeight=Math.round(this.newSize.height),t}static fromJson(t,e,s){return(e=tT.fromJson(t,e,null!=s?s:new lT)).oldSize=new Ec(t.oldWidth,t.oldHeight),e.newSize=new Ec(t.newWidth,t.newHeight),e}isNull(){return Ec.equals(this.oldSize,this.newSize)}run(t){var e=this.getEventWorkspace_();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");if(e=e.getCommentById(this.commentId)){if(!(t=t?this.newSize:this.oldSize))throw Error("Either oldSize or newSize is undefined. Either pass a comment to the constructor and call recordCurrentSizeAsNewSize, or call fromJson");e.setSize(t)}else console.warn("Can't resize non-existent comment: "+this.commentId)}};t(zl.EVENT,ua.COMMENT_RESIZE,lT);var aT=class extends oc{constructor(t,e,s){super(s),this.type=ua.TOOLBOX_ITEM_SELECT,this.oldItem=null!=t?t:void 0,this.newItem=null!=e?e:void 0}toJson(){const t=super.toJson();return t.oldItem=this.oldItem,t.newItem=this.newItem,t}static fromJson(t,e,s){return(e=oc.fromJson(t,e,null!=s?s:new aT)).oldItem=t.oldItem,e.newItem=t.newItem,e}};t(zl.EVENT,ua.TOOLBOX_ITEM_SELECT,aT);var cT=class extends Wg{constructor(t,e,s){super(t),this.oldType=e,this.newType=s,this.type=ua.VAR_TYPE_CHANGE}toJson(){const t=super.toJson();if(!this.oldType||!this.newType)throw Error("The variable's types are undefined. Either pass them to the constructor, or call fromJson");return t.oldType=this.oldType,t.newType=this.newType,t}static fromJson(t,e,s){return(e=Wg.fromJson(t,e,null!=s?s:new cT)).oldType=t.oldType,e.newType=t.newType,e}run(t){const e=this.getEventWorkspace_();if(!this.varId)throw Error("The var ID is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.oldType||!this.newType)throw Error("The variable's types are undefined. Either pass them to the constructor, or call fromJson");const s=e.getVariableMap().getVariableById(this.varId);s&&(t?e.getVariableMap().changeVariableType(s,this.newType):e.getVariableMap().changeVariableType(s,this.oldType))}};t(zl.EVENT,ua.VAR_TYPE_CHANGE,cT);var hT,uT,dT,pT,gT,_T,TT,mT,ET,bT,fT,$T,IT,CT,ST,RT,yT,OT,kT,AT,vT,NT,wT,LT,MT,DT=class extends ic{constructor(t){super(),this.isBlank=!0,this.recordUndo=!1,this.type=ua.FINISHED_LOADING,this.isBlank=!!t,t&&(this.workspaceId=t.id)}};t(zl.EVENT,ua.FINISHED_LOADING,DT),Hl.BLOCK_CHANGE$$module$build$src$core$events$events=ua.BLOCK_CHANGE,Hl.BLOCK_CREATE$$module$build$src$core$events$events=ua.BLOCK_CREATE,Hl.BLOCK_DELETE$$module$build$src$core$events$events=ua.BLOCK_DELETE,hT=ua.BLOCK_DRAG,Hl.BLOCK_MOVE$$module$build$src$core$events$events=ua.BLOCK_MOVE,uT=ua.BLOCK_FIELD_INTERMEDIATE_CHANGE,dT=ua.BUBBLE_OPEN,pT=ua.BLOCK_CHANGE,gT=ua.CLICK,_T=ua.COMMENT_CHANGE,TT=ua.COMMENT_CREATE,mT=ua.COMMENT_DELETE,ET=ua.COMMENT_MOVE,bT=ua.COMMENT_RESIZE,fT=ua.COMMENT_DRAG,$T=ua.BLOCK_CREATE,IT=ua.BLOCK_DELETE,CT=ua.FINISHED_LOADING,ST=ua.BLOCK_MOVE,RT=ua.SELECTED,yT=ua.THEME_CHANGE,OT=ua.TOOLBOX_ITEM_SELECT,kT=ua.TRASHCAN_OPEN,AT=ua.UI,vT=ua.VAR_CREATE,NT=ua.VAR_DELETE,wT=ua.VAR_RENAME,LT=ua.VIEWPORT_CHANGE,(MT={}).Abstract=ic,MT.BLOCK_CHANGE=Hl.BLOCK_CHANGE$$module$build$src$core$events$events,MT.BLOCK_CREATE=Hl.BLOCK_CREATE$$module$build$src$core$events$events,MT.BLOCK_DELETE=Hl.BLOCK_DELETE$$module$build$src$core$events$events,MT.BLOCK_DRAG=hT,MT.BLOCK_FIELD_INTERMEDIATE_CHANGE=uT,MT.BLOCK_MOVE=Hl.BLOCK_MOVE$$module$build$src$core$events$events,MT.BUBBLE_OPEN=dT,MT.BUMP_EVENTS=Ca,MT.BlockBase=jh,MT.BlockChange=Jh,MT.BlockCreate=Id,MT.BlockDelete=Yd,MT.BlockDrag=K_,MT.BlockFieldIntermediateChange=j_,MT.BlockMove=J_,MT.BubbleOpen=Z_,MT.BubbleType=q_,MT.CHANGE=pT,MT.CLICK=gT,MT.COMMENT_CHANGE=_T,MT.COMMENT_CREATE=TT,MT.COMMENT_DELETE=mT,MT.COMMENT_DRAG=fT,MT.COMMENT_MOVE=ET,MT.COMMENT_RESIZE=bT,MT.CREATE=$T,MT.Click=nc,MT.ClickTarget=sc,MT.CommentBase=tT,MT.CommentChange=eT,MT.CommentCollapse=sT,MT.CommentCreate=iT,MT.CommentDelete=oT,MT.CommentDrag=nT,MT.CommentMove=rT,MT.CommentResize=lT,MT.DELETE=IT,MT.FINISHED_LOADING=CT,MT.FinishedLoading=DT,MT.MOVE=ST,MT.SELECTED=RT,MT.Selected=zd,MT.THEME_CHANGE=yT,MT.TOOLBOX_ITEM_SELECT=OT,MT.TRASHCAN_OPEN=kT,MT.ThemeChange=Sd,MT.ToolboxItemSelect=aT,MT.TrashcanOpen=Jg,MT.UI=AT,MT.UiBase=oc,MT.VAR_CREATE=vT,MT.VAR_DELETE=NT,MT.VAR_RENAME=wT,MT.VIEWPORT_CHANGE=LT,MT.VarBase=Wg,MT.VarCreate=Xg,MT.VarDelete=Yg,MT.VarRename=Kg,MT.VarTypeChange=cT,MT.ViewportChange=Rd,MT.clearPendingUndo=et,MT.disable=Hl.disable$$module$build$src$core$events$utils,MT.disableOrphans=lt,MT.enable=Hl.enable$$module$build$src$core$events$utils,MT.filter=tt,MT.fire=J,MT.fromJson=nt,MT.get=rt,MT.getDescendantIds=ot,MT.getGroup=Hl.getGroup$$module$build$src$core$events$utils,MT.getRecordUndo=j,MT.isEnabled=st,MT.setGroup=Hl.setGroup$$module$build$src$core$events$utils,MT.setRecordUndo=Hl.setRecordUndo$$module$build$src$core$events$utils;var xT={};xT.BottomRow=v_,xT.ConstantProvider=y_,xT.Drawer=O_,xT.PathObject=D_,xT.RenderInfo=M_,xT.Renderer=x_,xT.RightConnectionShape=w_,xT.StatementInput=N_,xT.TopRow=L_,Ml();var PT={};PT.registerCleanup=pl,PT.registerCollapse=_l,PT.registerCollapseExpandBlock=Rl,PT.registerComment=Cl,PT.registerCommentCreate=Nl,PT.registerCommentDelete=Al,PT.registerCommentDuplicate=vl,PT.registerCommentOptions=Ll,PT.registerDefaultOptions=Ml,PT.registerDelete=Ol,PT.registerDeleteAll=fl,PT.registerDisable=yl,PT.registerDuplicate=Il,PT.registerExpand=Tl,PT.registerHelp=kl,PT.registerInline=Sl,PT.registerRedo=dl,PT.registerUndo=ul;var BT="button",FT=class{load(t,e){return(t=new Sp(e.getWorkspace(),e.targetWorkspace,t,!1)).show(),new $p(t,BT)}gapForItem(t,e){return e}disposeItem(t){(t=t.getElement())instanceof Sp&&t.dispose()}getType(){return BT}};t(zl.FLYOUT_INFLATER,BT,FT);var UT={};UT.Bubble=Md,UT.MiniWorkspaceBubble=Dd,UT.TextBubble=Tp,UT.TextInputBubble=Wd;var HT="block",GT=class{constructor(){this.permanentlyDisabledBlocks=new Set,this.listeners=new Map,this.capacityWrapper=this.filterFlyoutBasedOnCapacity.bind(this)}load(t,e){return this.setFlyout(e),(t=this.createBlock(t,e.getWorkspace())).isEnabled()?this.updateStateBasedOnCapacity(t):this.permanentlyDisabledBlocks.add(t),t.getDescendants(!1).forEach(t=>t.isInFlyout=!0),this.addBlockListeners(t),new $p(t,HT)}createBlock(t,e){return t.blockxml?(t="string"==typeof t.blockxml?Hl.textToDom$$module$build$src$core$utils$xml(t.blockxml):t.blockxml,e=Xo(t,e)):(void 0===t.enabled&&(t.enabled="true"!==t.disabled&&!0!==t.disabled),void 0===t.disabledReasons&&!1===t.enabled&&(t.disabledReasons=[ah]),"x"in t&&delete t.x,"y"in t&&delete t.y,e=Ns(t,e)),e}gapForItem(t,e){let s;return t.gap?s=parseInt(String(t.gap)):t.blockxml&&(t="string"==typeof t.blockxml?Hl.textToDom$$module$build$src$core$utils$xml(t.blockxml):t.blockxml,s=parseInt(t.getAttribute("gap"))),!s||isNaN(s)?e:s}disposeItem(t){(t=t.getElement())instanceof Ep&&(this.removeListeners(t.id),t.dispose(!1,!1))}removeListeners(t){let e;(null!=(e=this.listeners.get(t))?e:[]).forEach(t=>E(t)),this.listeners.delete(t)}setFlyout(t){if(this.flyout!==t){if(this.flyout){let t;null==(t=this.flyout.targetWorkspace)||t.removeChangeListener(this.capacityWrapper)}var e;this.flyout=t,null==(e=this.flyout.targetWorkspace)||e.addChangeListener(this.capacityWrapper)}}updateStateBasedOnCapacity(t){let e,s;const i=null==(e=this.flyout)||null==(s=e.targetWorkspace)?void 0:s.isCapacityAvailable(Pt(t));for(;t;)t.setDisabledReason(!i,"WORKSPACE_AT_BLOCK_CAPACITY"),t=t.getNextBlock()}addBlockListeners(t){const e=[];e.push(T(t.getSvgRoot(),"pointerdown",t,e=>{let s,i;const o=null==(s=this.flyout)||null==(i=s.targetWorkspace)?void 0:i.getGesture(e);o&&this.flyout&&(o.setStartBlock(t),o.handleFlyoutStart(e,this.flyout))})),e.push(m(t.getSvgRoot(),"pointermove",null,()=>{let e,s;null!=(e=this.flyout)&&null!=(s=e.targetWorkspace)&&s.isDragging()||t.addSelect()})),e.push(m(t.getSvgRoot(),"pointerleave",null,()=>{let e,s;null!=(e=this.flyout)&&null!=(s=e.targetWorkspace)&&s.isDragging()||t.removeSelect()})),this.listeners.set(t.id,e)}filterFlyoutBasedOnCapacity(t){!this.flyout||t&&t.type!==ua.BLOCK_CREATE&&t.type!==ua.BLOCK_DELETE||this.flyout.getWorkspace().getTopBlocks(!1).forEach(t=>{this.permanentlyDisabledBlocks.has(t)||this.updateStateBasedOnCapacity(t)})}getType(){return HT}};t(zl.FLYOUT_INFLATER,HT,GT);var VT=class extends Ag{constructor(){super(),this.FIELD_TEXT_BASELINE_CENTER=!1,this.DARK_PATH_OFFSET=1,this.MAX_BOTTOM_WIDTH=30,this.STATEMENT_BOTTOM_SPACER=-this.NOTCH_HEIGHT/2}getCSS_(t){return super.getCSS_(t).concat([`${t} .blocklyInsertionMarker>.blocklyPathLight,`,`${t} .blocklyInsertionMarker>.blocklyPathDark {`,`fill-opacity: ${this.INSERTION_MARKER_OPACITY};`,"stroke: none;","}"])}},WT=class{constructor(t){this.inlineSteps_=this.steps_="",this.info_=t,this.RTL_=this.info_.RTL,t=t.getRenderer(),this.constants_=t.getConstants(),this.highlightConstants_=t.getHighlightConstants(),this.highlightOffset=this.highlightConstants_.OFFSET,this.outsideCornerPaths_=this.highlightConstants_.OUTSIDE_CORNER,this.insideCornerPaths_=this.highlightConstants_.INSIDE_CORNER,this.puzzleTabPaths_=this.highlightConstants_.PUZZLE_TAB,this.notchPaths_=this.highlightConstants_.NOTCH,this.startPaths_=this.highlightConstants_.START_HAT,this.jaggedTeethPaths_=this.highlightConstants_.JAGGED_TEETH}getPath(){return this.steps_+"\n"+this.inlineSteps_}drawTopCorner(t){this.steps_+=On(t.xPos,this.info_.startY);for(let e,s=0;e=t.elements[s];s++)lg.isLeftSquareCorner(e)?this.steps_+=this.highlightConstants_.START_POINT:lg.isLeftRoundedCorner(e)?this.steps_+=this.outsideCornerPaths_.topLeft(this.RTL_):lg.isPreviousConnection(e)?this.steps_+=this.notchPaths_.pathLeft:lg.isHat(e)?this.steps_+=this.startPaths_.path(this.RTL_):lg.isSpacer(e)&&0!==e.width&&(this.steps_+=vn("H",e.xPos+e.width-this.highlightOffset));this.steps_+=vn("H",t.xPos+t.width-this.highlightOffset)}drawJaggedEdge_(t){this.info_.RTL&&(this.steps_+=this.jaggedTeethPaths_.pathLeft+vn("v",t.height-this.jaggedTeethPaths_.height-this.highlightOffset))}drawValueInput(t){const e=t.getLastInput();if(this.RTL_){const s=t.height-e.connectionHeight;this.steps_+=yn(e.xPos+e.width-this.highlightOffset,t.yPos)+this.puzzleTabPaths_.pathDown(this.RTL_)+vn("v",s)}else this.steps_+=yn(e.xPos+e.width,t.yPos)+this.puzzleTabPaths_.pathDown(this.RTL_)}drawStatementInput(t){const e=t.getLastInput();if(e)if(this.RTL_){const s=t.height-2*this.insideCornerPaths_.height;this.steps_+=yn(e.xPos,t.yPos)+this.insideCornerPaths_.pathTop(this.RTL_)+vn("v",s)+this.insideCornerPaths_.pathBottom(this.RTL_)+kn(t.width-e.xPos-this.insideCornerPaths_.width,0)}else this.steps_+=yn(e.xPos,t.yPos+t.height)+this.insideCornerPaths_.pathBottom(this.RTL_)+kn(t.width-e.xPos-this.insideCornerPaths_.width,0)}drawRightSideRow(t){const e=t.xPos+t.width-this.highlightOffset;t instanceof Rg&&t.followsStatement&&(this.steps_+=vn("H",e)),this.RTL_&&(this.steps_+=vn("H",e),t.height>this.highlightOffset&&(this.steps_+=vn("V",t.yPos+t.height-this.highlightOffset)))}drawBottomRow(t){if(this.RTL_)this.steps_+=vn("V",t.baseline-this.highlightOffset);else{const e=this.info_.bottomRow.elements[0];lg.isLeftSquareCorner(e)?this.steps_+=yn(t.xPos+this.highlightOffset,t.baseline-this.highlightOffset):lg.isLeftRoundedCorner(e)&&(this.steps_+=yn(t.xPos,t.baseline),this.steps_+=this.outsideCornerPaths_.bottomLeft())}}drawLeft(){var t=this.info_.outputConnection;t&&(t=t.connectionOffsetY+t.height,this.RTL_?this.steps_+=yn(this.info_.startX,t):(this.steps_+=yn(this.info_.startX+this.highlightOffset,this.info_.bottomRow.baseline-this.highlightOffset),this.steps_+=vn("V",t)),this.steps_+=this.puzzleTabPaths_.pathUp(this.RTL_)),this.RTL_||(t=this.info_.topRow,lg.isLeftRoundedCorner(t.elements[0])?this.steps_+=vn("V",this.outsideCornerPaths_.height):this.steps_+=vn("V",t.capline+this.highlightOffset))}drawInlineInput(t){const e=this.highlightOffset,s=t.xPos+t.connectionWidth;var i=t.centerline-t.height/2;const o=t.width-t.connectionWidth,n=i+e;this.RTL_?(i=t.connectionOffsetY-e,t=t.height-(t.connectionOffsetY+t.connectionHeight)+e,this.inlineSteps_+=yn(s-e,n)+vn("v",i)+this.puzzleTabPaths_.pathDown(this.RTL_)+vn("v",t)+vn("h",o)):this.inlineSteps_+=yn(t.xPos+t.width+e,n)+vn("v",t.height)+vn("h",-o)+yn(s,i+t.connectionOffsetY)+this.puzzleTabPaths_.pathDown(this.RTL_)}},XT=class extends Ng{constructor(t,e){super(t,e),this.highlighter_=new WT(e)}draw(){this.drawOutline_(),this.drawInternals_(),this.updateConnectionHighlights();const t=this.block_.pathObject;t.setPath(this.outlinePath_+"\n"+this.inlinePath_),t.setHighlightPath(this.highlighter_.getPath()),this.info_.RTL&&t.flipRTL(),this.recordSizeOnBlock_()}drawTop_(){this.highlighter_.drawTopCorner(this.info_.topRow),this.highlighter_.drawRightSideRow(this.info_.topRow),super.drawTop_()}drawJaggedEdge_(t){this.highlighter_.drawJaggedEdge_(t),super.drawJaggedEdge_(t)}drawValueInput_(t){this.highlighter_.drawValueInput(t),super.drawValueInput_(t)}drawStatementInput_(t){this.highlighter_.drawStatementInput(t),super.drawStatementInput_(t)}drawRightSideRow_(t){this.highlighter_.drawRightSideRow(t),this.outlinePath_+=vn("H",t.xPos+t.width)+vn("V",t.yPos+t.height)}drawBottom_(){this.highlighter_.drawBottomRow(this.info_.bottomRow),super.drawBottom_()}drawLeft_(){this.highlighter_.drawLeft(),super.drawLeft_()}drawInlineInput_(t){this.highlighter_.drawInlineInput(t),super.drawInlineInput_(t)}positionInlineInputConnection_(t){const e=t.centerline-t.height/2;if(t.connectionModel){let s=t.xPos+t.connectionWidth+this.constants_.DARK_PATH_OFFSET;this.info_.RTL&&(s*=-1),t.connectionModel.setOffsetInBlock(s,e+t.connectionOffsetY+this.constants_.DARK_PATH_OFFSET)}}positionStatementInputConnection_(t){const e=t.getLastInput();if(null!=e&&e.connectionModel){let s=t.xPos+t.statementEdge+e.notchOffset;s=this.info_.RTL?-1*s:s+this.constants_.DARK_PATH_OFFSET,e.connectionModel.setOffsetInBlock(s,t.yPos+this.constants_.DARK_PATH_OFFSET)}}positionExternalValueConnection_(t){const e=t.getLastInput();if(e&&e.connectionModel){let s=t.xPos+t.width+this.constants_.DARK_PATH_OFFSET;this.info_.RTL&&(s*=-1),e.connectionModel.setOffsetInBlock(s,t.yPos)}}positionNextConnection_(){const t=this.info_.bottomRow;if(t.connection){const e=t.connection,s=e.xPos;e.connectionModel.setOffsetInBlock((this.info_.RTL?-s:s)+this.constants_.DARK_PATH_OFFSET/2,t.baseline+this.constants_.DARK_PATH_OFFSET)}}},zT=class{constructor(t){this.OFFSET=.5,this.constantProvider=t,this.START_POINT=On(this.OFFSET,this.OFFSET)}init(){this.INSIDE_CORNER=this.makeInsideCorner(),this.OUTSIDE_CORNER=this.makeOutsideCorner(),this.PUZZLE_TAB=this.makePuzzleTab(),this.NOTCH=this.makeNotch(),this.JAGGED_TEETH=this.makeJaggedTeeth(),this.START_HAT=this.makeStartHat()}makeInsideCorner(){const t=this.constantProvider.CORNER_RADIUS,e=this.OFFSET,s=(1-Math.SQRT1_2)*(t+e)-e,i=On(s,s)+Nn("a","0 0,0",t,Sn(-s-e,t-s)),o=Nn("a","0 0,0",t+e,Sn(t+e,t+e)),n=On(s,-s)+Nn("a","0 0,0",t+e,Sn(t-s,s+e));return{width:t+e,height:t,pathTop:t=>t?i:"",pathBottom:t=>t?o:n}}makeOutsideCorner(){const t=this.constantProvider.CORNER_RADIUS,e=this.OFFSET,s=(1-Math.SQRT1_2)*(t-e)+e,i=On(s,s)+Nn("a","0 0,1",t-e,Sn(t-s,-s+e)),o=On(e,t)+Nn("a","0 0,1",t-e,Sn(t,-t+e)),n=-s,r=On(s,n)+Nn("a","0 0,1",t-e,Sn(-s+e,-n-t));return{height:t,topLeft:t=>t?i:o,bottomLeft:()=>r}}makePuzzleTab(){const t=this.constantProvider.TAB_WIDTH,e=this.constantProvider.TAB_HEIGHT,s=On(-2,2.5-e+.9)+kn(-.45*t,-2.1),i=vn("v",2.5)+On(.97*-t,2.5)+Rn("q",[Sn(.05*-t,10),Sn(.3*t,9.5)])+On(.67*t,-1.9)+vn("v",2.5),o=vn("v",-1.5)+On(-.92*t,-.5)+Rn("q",[Sn(-.19*t,-5.5),Sn(0,-11)])+On(.92*t,1),n=On(-5,e-.7)+kn(.46*t,-2.1);return{width:t,height:e,pathUp:t=>t?s:o,pathDown:t=>t?i:n}}makeNotch(){return{pathLeft:vn("h",this.OFFSET)+this.constantProvider.NOTCH.pathLeft}}makeJaggedTeeth(){return{pathLeft:kn(5.1,2.6)+On(-10.2,6.8)+kn(5.1,2.6),height:12,width:10.2}}makeStartHat(){const t=this.constantProvider.START_HAT.height,e=On(25,-8.7)+Rn("c",[Sn(29.7,-6.2),Sn(57.2,-.5),Sn(75,8.7)]),s=Rn("c",[Sn(17.8,-9.2),Sn(45.3,-14.9),Sn(75,-8.7)])+yn(100.5,t+.5);return{path:t=>t?e:s}}},YT=class extends Eg{constructor(t,e){super(t,e),this.constants_=t,this.connectedBlock&&(this.width+=this.constants_.DARK_PATH_OFFSET,this.height+=this.constants_.DARK_PATH_OFFSET)}},KT=class extends Og{constructor(t,e){super(t,e),this.constants_=t,this.connectedBlock&&(this.height+=this.constants_.DARK_PATH_OFFSET)}},jT=class extends wg{constructor(t,e){super(t,e),this.renderer_=t}getRenderer(){return this.renderer_}populateBottomRow_(){super.populateBottomRow_(),this.block_.inputList.length&&this.block_.inputList[this.block_.inputList.length-1]instanceof lp||(this.bottomRow.minHeight=this.constants_.MEDIUM_PADDING-this.constants_.DARK_PATH_OFFSET)}addInput_(t,e){this.isInline&&t instanceof Hl.ValueInput$$module$build$src$core$inputs$value_input?(e.elements.push(new YT(this.constants_,t)),e.hasInlineInput=!0):t instanceof lp?(e.elements.push(new KT(this.constants_,t)),e.hasStatement=!0):t instanceof Hl.ValueInput$$module$build$src$core$inputs$value_input?(e.elements.push(new pg(this.constants_,t)),e.hasExternalInput=!0):(t instanceof np||t instanceof rp)&&(e.minHeight=Math.max(e.minHeight,this.constants_.DUMMY_INPUT_MIN_HEIGHT),e.hasDummyInput=!0),this.isInline||null!==e.align||(e.align=t.align)}addElemSpacing_(){let t=!1;for(let e,s=0;e=this.rows[s];s++)e.hasExternalInput&&(t=!0);for(let s,i=0;s=this.rows[i];i++){var e=s.elements;if(s.elements=[],s.startsWithElemSpacer()&&s.elements.push(new mg(this.constants_,this.getInRowSpacing_(null,e[0]))),e.length){for(let t=0;t0&&this.addAlignmentPadding_(i,t),t=i.width)}else super.alignRowElements_()}getDesiredRowWidth_(t){return this.isInline&&t.hasStatement?this.statementEdge+this.constants_.MAX_BOTTOM_WIDTH+this.startX:super.getDesiredRowWidth_(t)}finalize_(){let t=0,e=0;for(let i,o=0;i=this.rows[o];o++){i.yPos=e,i.xPos=this.startX,e+=i.height,t=Math.max(t,i.widthWithConnectedBlocks);var s=e-this.topRow.ascenderHeight;i===this.bottomRow&&s>>/sprites.png);\n height: 16px;\n vertical-align: middle;\n visibility: hidden;\n width: 16px;\n}\n\n.blocklyToolboxCategoryIconClosed {\n background-position: -32px -1px;\n}\n\n.blocklyToolbox[dir="RTL"] .blocklyToolboxCategoryIconClosed {\n background-position: 0 -1px;\n}\n\n.blocklyToolboxSelected>.blocklyToolboxCategoryIconClosed {\n background-position: -32px -17px;\n}\n\n.blocklyToolbox[dir="RTL"] .blocklyToolboxSelected>.blocklyToolboxCategoryIconClosed {\n background-position: 0 -17px;\n}\n\n.blocklyToolboxCategoryIconOpen {\n background-position: -16px -1px;\n}\n\n.blocklyToolboxSelected>.blocklyToolboxCategoryIconOpen {\n background-position: -16px -17px;\n}\n\n.blocklyToolboxCategoryLabel {\n cursor: default;\n font: 16px sans-serif;\n padding: 0 3px;\n vertical-align: middle;\n}\n\n.blocklyToolboxDelete .blocklyToolboxCategoryLabel {\n cursor: url("<<>>/handdelete.cur"), auto;\n}\n\n.blocklyToolboxSelected .blocklyToolboxCategoryLabel {\n color: #fff;\n}\n'),t(zl.TOOLBOX_ITEM,nm.registrationName,nm);var rm=class extends om{constructor(t,e){super(t,e),this.cssConfig_={container:"blocklyTreeSeparator"},this.htmlDiv=null,Object.assign(this.cssConfig_,t.cssconfig||t.cssConfig)}init(){this.createDom_()}createDom_(){const t=document.createElement("div");t.tabIndex=-1,t.id=this.getId();const e=this.cssConfig_.container;return e&&ct(t,e),this.htmlDiv=t}getDiv(){return this.htmlDiv}dispose(){pt(this.htmlDiv)}};rm.registrationName="sep",Vt('\n.blocklyTreeSeparator {\n border-bottom: solid #e5e5e5 1px;\n height: 0;\n margin: 5px 0;\n}\n\n.blocklyToolbox[layout="h"] .blocklyTreeSeparator {\n border-right: solid #e5e5e5 1px;\n border-bottom: none;\n height: auto;\n margin: 0 5px 0 5px;\n padding: 5px 0;\n width: 0;\n}\n'),t(zl.TOOLBOX_ITEM,rm.registrationName,rm);var lm=class extends nm{constructor(t,e,s){super(t,e,s),this.subcategoriesDiv_=null,this.expanded_=!1,this.toolboxItems_=[]}makeDefaultCssConfig_(){const t=super.makeDefaultCssConfig_();return t.contents="blocklyToolboxCategoryGroup",t}parseContents_(t){if("custom"in t)this.flyoutItems_=t.custom;else{const e=t.contents;if(e){this.flyoutItems_=[],t=!0;for(let s=0;s{this.mouseDown=!1}),this.boundEvents_.push(t),e=T(e,"keydown",this,this.onKeyDown_,!1),this.boundEvents_.push(e)}onClick_(t){if(this.mouseDown=!0,f(t)||t.target===this.HtmlDiv)At().hideChaff(!1);else{var e=t.target.getAttribute("id");e&&null!=(e=this.getToolboxItemById(e))&&e.isSelectable()&&(this.setSelectedItem(e),e.onClick(t)),At().hideChaff(!0)}d()}onKeyDown_(t){let e=!1;switch(t.key){case"ArrowDown":e=this.selectNext();break;case"ArrowUp":e=this.selectPrevious();break;case"ArrowLeft":e=this.selectParent();break;case"ArrowRight":e=this.selectChild();break;case"Enter":case" ":this.selectedItem_&&this.selectedItem_.isCollapsible()&&(this.selectedItem_.toggleExpanded(),e=!0);break;default:e=!1}!e&&this.selectedItem_&&this.selectedItem_.onKeyDown&&(e=this.selectedItem_.onKeyDown(t)),e&&t.preventDefault()}createFlyout_(){const t=this.workspace_,e=t.copyOptionsForFlyout();return e.toolboxPosition=t.options.toolboxPosition,new(t.horizontalLayout?c(zl.FLYOUTS_HORIZONTAL_TOOLBOX,t.options,!0):c(zl.FLYOUTS_VERTICAL_TOOLBOX,t.options,!0))(e)}render(t){this.toolboxDef_=t,this.contents.forEach(t=>t.dispose()),this.contents.clear(),this.renderContents_(t.contents),this.position(),this.handleToolboxItemResize()}renderContents_(t){const e=document.createDocumentFragment();for(let s=0;s{t.refreshTheme&&t.refreshTheme()})}refreshSelection(){if(this.selectedItem_&&this.selectedItem_.isSelectable()&&this.selectedItem_.getContents().length){let t;null==(t=this.flyout)||t.show(this.selectedItem_.getContents())}}setVisible(t){this.isVisible_!==t&&(this.HtmlDiv&&(this.HtmlDiv.style.display=t?"block":"none"),this.isVisible_=t,this.workspace_.recordDragTargets())}autoHide(t){!t&&this.flyout&&this.flyout.autoClose&&this.clearSelection()}setSelectedItem(t){const e=this.selectedItem_;!t&&!e||t&&!Pl(t)||(this.shouldDeselectItem_(e,t)&&null!==e&&this.deselectItem_(e),this.shouldSelectItem_(e,t)&&null!==t&&this.selectItem_(e,t),this.updateFlyout_(e,t),this.fireSelectEvent(e,t))}shouldDeselectItem_(t,e){return null!==t&&(!t.isCollapsible()||t!==e)}shouldSelectItem_(t,e){return null!==e&&e!==t}deselectItem_(t){this.selectedItem_=null,this.previouslySelectedItem_=t,t.setSelected(!1),Ne(this.contentsDiv_,Qc.ACTIVEDESCENDANT,"")}selectItem_(t,e){this.selectedItem_=e,this.previouslySelectedItem_=t,e.setSelected(!0),Ne(this.contentsDiv_,Qc.ACTIVEDESCENDANT,e.getId())}selectItemByPosition(t){(t=this.getToolboxItems()[t])&&this.setSelectedItem(t)}updateFlyout_(t,e){if(e&&(t!==e||e.isCollapsible())&&e.getContents().length){let t,s;null==(t=this.flyout)||t.show(e.getContents()),null==(s=this.flyout)||s.scrollToStart()}else{let t;null==(t=this.flyout)||t.hide()}}fireSelectEvent(t,e){const s=t&&t.getName();let i=e&&e.getName();t===e&&(i=null),t=new(rt(ua.TOOLBOX_ITEM_SELECT))(s,i,this.workspace_.id),J(t)}selectParent(){if(!this.selectedItem_)return!1;if(this.selectedItem_.isCollapsible()&&this.selectedItem_.isExpanded())return this.selectedItem_.toggleExpanded(),!0;let t;return!(null==(t=this.selectedItem_.getParent())||!t.isSelectable()||(this.setSelectedItem(this.selectedItem_.getParent()),0))}selectChild(){if(!this.selectedItem_||!this.selectedItem_.isCollapsible())return!1;const t=this.selectedItem_;return t.isExpanded()?this.selectNext():t.toggleExpanded(),!0}selectNext(){if(!this.selectedItem_)return!1;const t=[...this.contents.values()];let e=t.indexOf(this.selectedItem_)+1;if(e>-1&&e-1&&et.dispose()),t=0;tt.isSelectable()))?t:null}return null}getNestedTrees(){return[]}lookUpFocusableNode(t){return this.getToolboxItemById(t)}onTreeFocus(t,e){t!==this?this.getSelectedItem()===t||this.mouseDown||this.setSelectedItem(t):this.clearSelection()}onTreeBlur(t){let e;t&&t===(null==(e=this.flyout)?void 0:e.getWorkspace())||this.autoHide(!1)}};Vt('\n.blocklyToolboxDelete {\n cursor: url("<<>>/handdelete.cur"), auto;\n}\n\n.blocklyToolboxGrab {\n cursor: url("<<>>/handclosed.cur"), auto;\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n/* Category tree in Toolbox. */\n.blocklyToolbox {\n box-sizing: border-box;\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n background-color: #ddd;\n overflow-x: visible;\n overflow-y: auto;\n padding: 4px 0 4px 0;\n position: absolute;\n z-index: 70; /* so blocks go under toolbox when dragging */\n -webkit-tap-highlight-color: transparent; /* issue #1345 */\n}\n\n.blocklyToolboxCategoryGroup {\n display: flex;\n flex-wrap: wrap;\n flex-direction: column;\n}\n\n.blocklyToolboxCategoryGroup:focus {\n outline: none;\n}\n'),t(zl.TOOLBOX,Xl,am);var cm=Vd.INPUT_VALUE,hm=Vd.OUTPUT_VALUE,um=Vd.NEXT_STATEMENT,dm=Vd.PREVIOUS_STATEMENT,pm=Lc.TOP,gm=Lc.BOTTOM,_m=Lc.LEFT,Tm=Lc.RIGHT;Ug.prototype.newBlock=function(t,e){return new ap(this,t,e)},Gg.prototype.newBlock=function(t,e){return new Ep(this,t,e)},Ug.prototype.newComment=function(t){return new bd(this,t)},Gg.prototype.newComment=function(t){return new fd(this,t)},Gg.newTrashcan=function(t){return new qg(t)},Dd.prototype.newWorkspaceSvg=function(t){return new Gg(t)},Hl.Names$$module$build$src$core$names.prototype.populateProcedures=function(t){t=(t=lr(t))[0].concat(t[1]);for(let e=0;e0,text:i.replace("%1",r.getText()),callback:e.callbackFactory$$module$build$src$core$contextmenu(this,s)})}},onchange:function(t){t=this.getFieldValue("VAR"),t=e.getVariable$$module$build$src$core$variables(this.workspace,t),"variables_get_dynamic"===this.type?this.outputConnection.setCheck(t.getType()):this.getInput("VALUE").connection.setCheck(t.getType())}},o=function(t){return function(){const s=t.workspace,i=t.getField("VAR").getVariable();e.renameVariable$$module$build$src$core$variables(s,i)}},n=function(t){return function(){const s=t.getField("VAR").getVariable();s&&e.deleteVariable$$module$build$src$core$variables(s.getWorkspace(),s,t)}};e.registerMixin$$module$build$src$core$extensions("contextMenu_variableDynamicSetterGetter",i),e.defineBlocks$$module$build$src$core$common(s);var r={blocks:s},l=e.createBlockDefinitionsFromJsonArray$$module$build$src$core$common([{type:"variables_get",message0:"%1",args0:[{type:"field_variable",name:"VAR",variable:"%{BKY_VARIABLES_DEFAULT_NAME}"}],output:null,style:"variable_blocks",helpUrl:"%{BKY_VARIABLES_GET_HELPURL}",tooltip:"%{BKY_VARIABLES_GET_TOOLTIP}",extensions:["contextMenu_variableSetterGetter"]},{type:"variables_set",message0:"%{BKY_VARIABLES_SET}",args0:[{type:"field_variable",name:"VAR",variable:"%{BKY_VARIABLES_DEFAULT_NAME}"},{type:"input_value",name:"VALUE"}],previousStatement:null,nextStatement:null,style:"variable_blocks",tooltip:"%{BKY_VARIABLES_SET_TOOLTIP}",helpUrl:"%{BKY_VARIABLES_SET_HELPURL}",extensions:["contextMenu_variableSetterGetter"]}]),a={customContextMenu:function(t){if(this.isInFlyout)"variables_get"!==this.type&&"variables_get_reporter"!==this.type||(i={text:e.Msg$$module$build$src$core$msg.RENAME_VARIABLE,enabled:!0,callback:c(this)},o=this.getField("VAR").getText(),o={text:e.Msg$$module$build$src$core$msg.DELETE_VARIABLE.replace("%1",o),enabled:!0,callback:h(this)},t.unshift(i),t.unshift(o));else{if("variables_get"===this.type)var s="variables_set",i=e.Msg$$module$build$src$core$msg.VARIABLES_GET_CREATE_SET;else s="variables_get",i=e.Msg$$module$build$src$core$msg.VARIABLES_SET_CREATE_GET;var o=this.getField("VAR");s={type:s,fields:{VAR:o.saveState(!0)}},t.push({enabled:this.workspace.remainingCapacity()>0,text:i.replace("%1",o.getText()),callback:e.callbackFactory$$module$build$src$core$contextmenu(this,s)})}}},c=function(t){return function(){const s=t.workspace,i=t.getField("VAR").getVariable();e.renameVariable$$module$build$src$core$variables(s,i)}},h=function(t){return function(){const s=t.getField("VAR").getVariable();s&&e.deleteVariable$$module$build$src$core$variables(s.getWorkspace(),s,t)}};e.registerMixin$$module$build$src$core$extensions("contextMenu_variableSetterGetter",a),e.defineBlocks$$module$build$src$core$common(l);var u={blocks:l},d=e.createBlockDefinitionsFromJsonArray$$module$build$src$core$common([{type:"text",message0:"%1",args0:[{type:"field_input",name:"TEXT",text:""}],output:"String",style:"text_blocks",helpUrl:"%{BKY_TEXT_TEXT_HELPURL}",tooltip:"%{BKY_TEXT_TEXT_TOOLTIP}",extensions:["text_quotes","parent_tooltip_when_inline"]},{type:"text_join",message0:"",output:"String",style:"text_blocks",helpUrl:"%{BKY_TEXT_JOIN_HELPURL}",tooltip:"%{BKY_TEXT_JOIN_TOOLTIP}",mutator:"text_join_mutator"},{type:"text_create_join_container",message0:"%{BKY_TEXT_CREATE_JOIN_TITLE_JOIN} %1 %2",args0:[{type:"input_dummy"},{type:"input_statement",name:"STACK"}],style:"text_blocks",tooltip:"%{BKY_TEXT_CREATE_JOIN_TOOLTIP}",enableContextMenu:!1},{type:"text_create_join_item",message0:"%{BKY_TEXT_CREATE_JOIN_ITEM_TITLE_ITEM}",previousStatement:null,nextStatement:null,style:"text_blocks",tooltip:"%{BKY_TEXT_CREATE_JOIN_ITEM_TOOLTIP}",enableContextMenu:!1},{type:"text_append",message0:"%{BKY_TEXT_APPEND_TITLE}",args0:[{type:"field_variable",name:"VAR",variable:"%{BKY_TEXT_APPEND_VARIABLE}"},{type:"input_value",name:"TEXT"}],previousStatement:null,nextStatement:null,style:"text_blocks",extensions:["text_append_tooltip"]},{type:"text_length",message0:"%{BKY_TEXT_LENGTH_TITLE}",args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Number",style:"text_blocks",tooltip:"%{BKY_TEXT_LENGTH_TOOLTIP}",helpUrl:"%{BKY_TEXT_LENGTH_HELPURL}"},{type:"text_isEmpty",message0:"%{BKY_TEXT_ISEMPTY_TITLE}",args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Boolean",style:"text_blocks",tooltip:"%{BKY_TEXT_ISEMPTY_TOOLTIP}",helpUrl:"%{BKY_TEXT_ISEMPTY_HELPURL}"},{type:"text_indexOf",message0:"%{BKY_TEXT_INDEXOF_TITLE}",args0:[{type:"input_value",name:"VALUE",check:"String"},{type:"field_dropdown",name:"END",options:[["%{BKY_TEXT_INDEXOF_OPERATOR_FIRST}","FIRST"],["%{BKY_TEXT_INDEXOF_OPERATOR_LAST}","LAST"]]},{type:"input_value",name:"FIND",check:"String"}],output:"Number",style:"text_blocks",helpUrl:"%{BKY_TEXT_INDEXOF_HELPURL}",inputsInline:!0,extensions:["text_indexOf_tooltip"]},{type:"text_charAt",message0:"%{BKY_TEXT_CHARAT_TITLE}",args0:[{type:"input_value",name:"VALUE",check:"String"},{type:"field_dropdown",name:"WHERE",options:[["%{BKY_TEXT_CHARAT_FROM_START}","FROM_START"],["%{BKY_TEXT_CHARAT_FROM_END}","FROM_END"],["%{BKY_TEXT_CHARAT_FIRST}","FIRST"],["%{BKY_TEXT_CHARAT_LAST}","LAST"],["%{BKY_TEXT_CHARAT_RANDOM}","RANDOM"]]}],output:"String",style:"text_blocks",helpUrl:"%{BKY_TEXT_CHARAT_HELPURL}",inputsInline:!0,mutator:"text_charAt_mutator"}]),p={init:function(){this.WHERE_OPTIONS_1=[[e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_START_FROM_START,"FROM_START"],[e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_START_FROM_END,"FROM_END"],[e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_START_FIRST,"FIRST"]],this.WHERE_OPTIONS_2=[[e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_END_FROM_START,"FROM_START"],[e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_END_FROM_END,"FROM_END"],[e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_END_LAST,"LAST"]],this.setHelpUrl(e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_HELPURL),this.setStyle("text_blocks"),this.appendValueInput("STRING").setCheck("String").appendField(e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT);const t=t=>{const s=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:this["WHERE_OPTIONS_"+t]});return s.setValidator(function(e){const s=this.getValue();(e="FROM_START"===e||"FROM_END"===e)!=("FROM_START"===s||"FROM_END"===s)&&this.getSourceBlock().updateAt_(t,e)}),s};this.appendDummyInput("WHERE1_INPUT").appendField(t(1),"WHERE1"),this.appendDummyInput("AT1"),this.appendDummyInput("WHERE2_INPUT").appendField(t(2),"WHERE2"),this.appendDummyInput("AT2"),e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_TAIL&&this.appendDummyInput("TAIL").appendField(e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_TAIL),this.setInputsInline(!0),this.setOutput(!0,"String"),this.updateAt_(1,!0),this.updateAt_(2,!0),this.setTooltip(e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_TOOLTIP)},mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation");var s=this.getInput("AT1")instanceof e.ValueInput$$module$build$src$core$inputs$value_input;return t.setAttribute("at1",`${s}`),s=this.getInput("AT2")instanceof e.ValueInput$$module$build$src$core$inputs$value_input,t.setAttribute("at2",`${s}`),t},domToMutation:function(t){const e="true"===t.getAttribute("at1");t="true"===t.getAttribute("at2"),this.updateAt_(1,e),this.updateAt_(2,t)},updateAt_:function(t,s){this.removeInput("AT"+t),this.removeInput("ORDINAL"+t,!0),s?(this.appendValueInput("AT"+t).setCheck("Number"),e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX&&this.appendDummyInput("ORDINAL"+t).appendField(e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX)):this.appendDummyInput("AT"+t),2===t&&e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_TAIL&&(this.removeInput("TAIL",!0),this.appendDummyInput("TAIL").appendField(e.Msg$$module$build$src$core$msg.TEXT_GET_SUBSTRING_TAIL)),1===t&&(this.moveInputBefore("AT1","WHERE2_INPUT"),this.getInput("ORDINAL1")&&this.moveInputBefore("ORDINAL1","WHERE2_INPUT"))}};d.text_getSubstring=p,d.text_changeCase={init:function(){const t=[[e.Msg$$module$build$src$core$msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE,"UPPERCASE"],[e.Msg$$module$build$src$core$msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE,"LOWERCASE"],[e.Msg$$module$build$src$core$msg.TEXT_CHANGECASE_OPERATOR_TITLECASE,"TITLECASE"]];this.setHelpUrl(e.Msg$$module$build$src$core$msg.TEXT_CHANGECASE_HELPURL),this.setStyle("text_blocks"),this.appendValueInput("TEXT").setCheck("String").appendField(e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:t}),"CASE"),this.setOutput(!0,"String"),this.setTooltip(e.Msg$$module$build$src$core$msg.TEXT_CHANGECASE_TOOLTIP)}},d.text_trim={init:function(){const t=[[e.Msg$$module$build$src$core$msg.TEXT_TRIM_OPERATOR_BOTH,"BOTH"],[e.Msg$$module$build$src$core$msg.TEXT_TRIM_OPERATOR_LEFT,"LEFT"],[e.Msg$$module$build$src$core$msg.TEXT_TRIM_OPERATOR_RIGHT,"RIGHT"]];this.setHelpUrl(e.Msg$$module$build$src$core$msg.TEXT_TRIM_HELPURL),this.setStyle("text_blocks"),this.appendValueInput("TEXT").setCheck("String").appendField(e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:t}),"MODE"),this.setOutput(!0,"String"),this.setTooltip(e.Msg$$module$build$src$core$msg.TEXT_TRIM_TOOLTIP)}},d.text_print={init:function(){this.jsonInit({message0:e.Msg$$module$build$src$core$msg.TEXT_PRINT_TITLE,args0:[{type:"input_value",name:"TEXT"}],previousStatement:null,nextStatement:null,style:"text_blocks",tooltip:e.Msg$$module$build$src$core$msg.TEXT_PRINT_TOOLTIP,helpUrl:e.Msg$$module$build$src$core$msg.TEXT_PRINT_HELPURL})}};var g={updateType_:function(t){this.outputConnection.setCheck("NUMBER"===t?"Number":"String")},mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation");return t.setAttribute("type",this.getFieldValue("TYPE")),t},domToMutation:function(t){this.updateType_(t.getAttribute("type"))}};d.text_prompt_ext=Object.assign({},g,{init:function(){var t=[[e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TYPE_TEXT,"TEXT"],[e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TYPE_NUMBER,"NUMBER"]];this.setHelpUrl(e.Msg$$module$build$src$core$msg.TEXT_PROMPT_HELPURL),this.setStyle("text_blocks"),(t=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:t})).setValidator(t=>{this.updateType_(t)}),this.appendValueInput("TEXT").appendField(t,"TYPE"),this.setOutput(!0,"String"),this.setTooltip(()=>"TEXT"===this.getFieldValue("TYPE")?e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TOOLTIP_TEXT:e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TOOLTIP_NUMBER)}}),d.text_prompt=Object.assign({},g,{init:function(){this.mixin(_);var t=[[e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TYPE_TEXT,"TEXT"],[e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TYPE_NUMBER,"NUMBER"]];this.setHelpUrl(e.Msg$$module$build$src$core$msg.TEXT_PROMPT_HELPURL),this.setStyle("text_blocks"),(t=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:t})).setValidator(t=>{this.updateType_(t)}),this.appendDummyInput().appendField(t,"TYPE").appendField(this.newQuote_(!0)).appendField(e.fromJson$$module$build$src$core$field_registry({type:"field_input",text:""}),"TEXT").appendField(this.newQuote_(!1)),this.setOutput(!0,"String"),this.setTooltip(()=>"TEXT"===this.getFieldValue("TYPE")?e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TOOLTIP_TEXT:e.Msg$$module$build$src$core$msg.TEXT_PROMPT_TOOLTIP_NUMBER)}}),d.text_count={init:function(){this.jsonInit({message0:e.Msg$$module$build$src$core$msg.TEXT_COUNT_MESSAGE0,args0:[{type:"input_value",name:"SUB",check:"String"},{type:"input_value",name:"TEXT",check:"String"}],output:"Number",inputsInline:!0,style:"text_blocks",tooltip:e.Msg$$module$build$src$core$msg.TEXT_COUNT_TOOLTIP,helpUrl:e.Msg$$module$build$src$core$msg.TEXT_COUNT_HELPURL})}},d.text_replace={init:function(){this.jsonInit({message0:e.Msg$$module$build$src$core$msg.TEXT_REPLACE_MESSAGE0,args0:[{type:"input_value",name:"FROM",check:"String"},{type:"input_value",name:"TO",check:"String"},{type:"input_value",name:"TEXT",check:"String"}],output:"String",inputsInline:!0,style:"text_blocks",tooltip:e.Msg$$module$build$src$core$msg.TEXT_REPLACE_TOOLTIP,helpUrl:e.Msg$$module$build$src$core$msg.TEXT_REPLACE_HELPURL})}},d.text_reverse={init:function(){this.jsonInit({message0:e.Msg$$module$build$src$core$msg.TEXT_REVERSE_MESSAGE0,args0:[{type:"input_value",name:"TEXT",check:"String"}],output:"String",inputsInline:!0,style:"text_blocks",tooltip:e.Msg$$module$build$src$core$msg.TEXT_REVERSE_TOOLTIP,helpUrl:e.Msg$$module$build$src$core$msg.TEXT_REVERSE_HELPURL})}};var _={QUOTE_IMAGE_LEFT_DATAURI:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC",QUOTE_IMAGE_RIGHT_DATAURI:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==",QUOTE_IMAGE_WIDTH:12,QUOTE_IMAGE_HEIGHT:12,quoteField_:function(t){for(let e,s=0;e=this.inputList[s];s++)for(let s,i=0;s=e.fieldRow[i];i++)if(t===s.name)return e.insertFieldAt(i,this.newQuote_(!0)),void e.insertFieldAt(i+2,this.newQuote_(!1));console.warn('field named "'+t+'" not found in '+this.toDevString())},newQuote_:function(t){return t=this.RTL?!t:t,e.fromJson$$module$build$src$core$field_registry({type:"field_image",src:t?this.QUOTE_IMAGE_LEFT_DATAURI:this.QUOTE_IMAGE_RIGHT_DATAURI,width:this.QUOTE_IMAGE_WIDTH,height:this.QUOTE_IMAGE_HEIGHT,alt:t?"“":"”"})}},T={itemCount_:0,mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation");return t.setAttribute("items",`${this.itemCount_}`),t},domToMutation:function(t){this.itemCount_=parseInt(t.getAttribute("items"),10),this.updateShape_()},saveExtraState:function(){return{itemCount:this.itemCount_}},loadExtraState:function(t){this.itemCount_=t.itemCount,this.updateShape_()},decompose:function(t){const e=t.newBlock("text_create_join_container");e.initSvg();let s=e.getInput("STACK").connection;for(let e=0;ee.Msg$$module$build$src$core$msg.TEXT_INDEXOF_TOOLTIP.replace("%1",this.workspace.options.oneBasedIndex?"0":"-1"))}),e.register$$module$build$src$core$extensions("text_quotes",function(){this.mixin(_),this.quoteField_("TEXT")}),e.registerMixin$$module$build$src$core$extensions("quote_image_mixin",_),e.registerMutator$$module$build$src$core$extensions("text_join_mutator",T,function(){this.mixin(_),this.itemCount_=2,this.updateShape_(),this.setMutator(new e.MutatorIcon$$module$build$src$core$icons$mutator_icon(["text_create_join_item"],this))}),e.registerMutator$$module$build$src$core$extensions("text_charAt_mutator",m,function(){this.getField("WHERE").setValidator(function(t){t="FROM_START"===t||"FROM_END"===t;const e=this.getSourceBlock();t!==e.isAt_&&e.updateAt_(t)}),this.updateAt_(!0),this.setTooltip(()=>{var t=this.getFieldValue("WHERE");let s=e.Msg$$module$build$src$core$msg.TEXT_CHARAT_TOOLTIP;return("FROM_START"===t||"FROM_END"===t)&&(t="FROM_START"===t?e.Msg$$module$build$src$core$msg.LISTS_INDEX_FROM_START_TOOLTIP:e.Msg$$module$build$src$core$msg.LISTS_INDEX_FROM_END_TOOLTIP)&&(s+=" "+t.replace("%1",this.workspace.options.oneBasedIndex?"#1":"#0")),s})}),e.defineBlocks$$module$build$src$core$common(d);var E={blocks:d},b={},f={setStatements_:function(t){this.hasStatements_!==t&&(t?(this.appendStatementInput("STACK").appendField(e.Msg$$module$build$src$core$msg.PROCEDURES_DEFNORETURN_DO),this.getInput("RETURN")&&this.moveInputBefore("STACK","RETURN")):this.removeInput("STACK",!0),this.hasStatements_=t)},updateParams_:function(){let t="";this.arguments_.length&&(t=e.Msg$$module$build$src$core$msg.PROCEDURES_BEFORE_PARAMS+" "+this.arguments_.join(", ")),e.disable$$module$build$src$core$events$utils();try{this.setFieldValue(t,"PARAMS")}finally{e.enable$$module$build$src$core$events$utils()}},mutationToDom:function(t){const s=e.createElement$$module$build$src$core$utils$xml("mutation");t&&s.setAttribute("name",this.getFieldValue("NAME"));for(let i=0;i","GT"],["‏≥","GTE"]]},{type:"input_value",name:"B"}],inputsInline:!0,output:"Boolean",style:"logic_blocks",helpUrl:"%{BKY_LOGIC_COMPARE_HELPURL}",extensions:["logic_compare","logic_op_tooltip"]},{type:"logic_operation",message0:"%1 %2 %3",args0:[{type:"input_value",name:"A",check:"Boolean"},{type:"field_dropdown",name:"OP",options:[["%{BKY_LOGIC_OPERATION_AND}","AND"],["%{BKY_LOGIC_OPERATION_OR}","OR"]]},{type:"input_value",name:"B",check:"Boolean"}],inputsInline:!0,output:"Boolean",style:"logic_blocks",helpUrl:"%{BKY_LOGIC_OPERATION_HELPURL}",extensions:["logic_op_tooltip"]},{type:"logic_negate",message0:"%{BKY_LOGIC_NEGATE_TITLE}",args0:[{type:"input_value",name:"BOOL",check:"Boolean"}],output:"Boolean",style:"logic_blocks",tooltip:"%{BKY_LOGIC_NEGATE_TOOLTIP}",helpUrl:"%{BKY_LOGIC_NEGATE_HELPURL}"},{type:"logic_null",message0:"%{BKY_LOGIC_NULL}",output:null,style:"logic_blocks",tooltip:"%{BKY_LOGIC_NULL_TOOLTIP}",helpUrl:"%{BKY_LOGIC_NULL_HELPURL}"},{type:"logic_ternary",message0:"%{BKY_LOGIC_TERNARY_CONDITION} %1",args0:[{type:"input_value",name:"IF",check:"Boolean"}],message1:"%{BKY_LOGIC_TERNARY_IF_TRUE} %1",args1:[{type:"input_value",name:"THEN"}],message2:"%{BKY_LOGIC_TERNARY_IF_FALSE} %1",args2:[{type:"input_value",name:"ELSE"}],output:null,style:"logic_blocks",tooltip:"%{BKY_LOGIC_TERNARY_TOOLTIP}",helpUrl:"%{BKY_LOGIC_TERNARY_HELPURL}",extensions:["logic_ternary"]},{type:"controls_if_if",message0:"%{BKY_CONTROLS_IF_IF_TITLE_IF}",nextStatement:null,enableContextMenu:!1,style:"logic_blocks",tooltip:"%{BKY_CONTROLS_IF_IF_TOOLTIP}"},{type:"controls_if_elseif",message0:"%{BKY_CONTROLS_IF_ELSEIF_TITLE_ELSEIF}",previousStatement:null,nextStatement:null,enableContextMenu:!1,style:"logic_blocks",tooltip:"%{BKY_CONTROLS_IF_ELSEIF_TOOLTIP}"},{type:"controls_if_else",message0:"%{BKY_CONTROLS_IF_ELSE_TITLE_ELSE}",previousStatement:null,enableContextMenu:!1,style:"logic_blocks",tooltip:"%{BKY_CONTROLS_IF_ELSE_TOOLTIP}"}]);e.register$$module$build$src$core$extensions("logic_op_tooltip",e.buildTooltipForDropdown$$module$build$src$core$extensions("OP",{EQ:"%{BKY_LOGIC_COMPARE_TOOLTIP_EQ}",NEQ:"%{BKY_LOGIC_COMPARE_TOOLTIP_NEQ}",LT:"%{BKY_LOGIC_COMPARE_TOOLTIP_LT}",LTE:"%{BKY_LOGIC_COMPARE_TOOLTIP_LTE}",GT:"%{BKY_LOGIC_COMPARE_TOOLTIP_GT}",GTE:"%{BKY_LOGIC_COMPARE_TOOLTIP_GTE}",AND:"%{BKY_LOGIC_OPERATION_TOOLTIP_AND}",OR:"%{BKY_LOGIC_OPERATION_TOOLTIP_OR}"}));var B={elseifCount_:0,elseCount_:0,mutationToDom:function(){if(!this.elseifCount_&&!this.elseCount_)return null;const t=e.createElement$$module$build$src$core$utils$xml("mutation");return this.elseifCount_&&t.setAttribute("elseif",String(this.elseifCount_)),this.elseCount_&&t.setAttribute("else","1"),t},domToMutation:function(t){this.elseifCount_=parseInt(t.getAttribute("elseif"),10)||0,this.elseCount_=parseInt(t.getAttribute("else"),10)||0,this.rebuildShape_()},saveExtraState:function(){if(!this.elseifCount_&&!this.elseCount_)return null;const t=Object.create(null);return this.elseifCount_&&(t.elseIfCount=this.elseifCount_),this.elseCount_&&(t.hasElse=!0),t},loadExtraState:function(t){this.elseifCount_=t.elseIfCount||0,this.elseCount_=t.hasElse?1:0,this.updateShape_()},decompose:function(t){const e=t.newBlock("controls_if_if");e.initSvg();let s=e.nextConnection;for(let e=1;e<=this.elseifCount_;e++){const e=t.newBlock("controls_if_elseif");e.initSvg(),s.connect(e.previousConnection),s=e.nextConnection}return this.elseCount_&&((t=t.newBlock("controls_if_else")).initSvg(),s.connect(t.previousConnection)),e},compose:function(t){t=t.nextConnection.targetBlock(),this.elseCount_=this.elseifCount_=0;const e=[null],s=[null];let i=null;for(;t;){if(!t.isInsertionMarker())switch(t.type){case"controls_if_elseif":this.elseifCount_++,e.push(t.valueConnection_),s.push(t.statementConnection_);break;case"controls_if_else":this.elseCount_++,i=t.statementConnection_;break;default:throw TypeError("Unknown block type: "+t.type)}t=t.getNextBlock()}this.updateShape_(),this.reconnectChildBlocks_(e,s,i)},saveConnections:function(t){t=t.nextConnection.targetBlock();let e=1;for(;t;){if(!t.isInsertionMarker())switch(t.type){case"controls_if_elseif":var s=this.getInput("IF"+e);const i=this.getInput("DO"+e);t.valueConnection_=s&&s.connection.targetConnection,t.statementConnection_=i&&i.connection.targetConnection,e++;break;case"controls_if_else":s=this.getInput("ELSE"),t.statementConnection_=s&&s.connection.targetConnection;break;default:throw TypeError("Unknown block type: "+t.type)}t=t.getNextBlock()}},rebuildShape_:function(){const t=[null],e=[null];let s=null;this.getInput("ELSE")&&(s=this.getInput("ELSE").connection.targetConnection);for(let s=1;this.getInput("IF"+s);s++){const i=this.getInput("IF"+s),o=this.getInput("DO"+s);t.push(i.connection.targetConnection),e.push(o.connection.targetConnection)}this.updateShape_(),this.reconnectChildBlocks_(t,e,s)},updateShape_:function(){this.getInput("ELSE")&&this.removeInput("ELSE");for(var t=1;this.getInput("IF"+t);t++)this.removeInput("IF"+t),this.removeInput("DO"+t);for(t=1;t<=this.elseifCount_;t++)this.appendValueInput("IF"+t).setCheck("Boolean").appendField(e.Msg$$module$build$src$core$msg.CONTROLS_IF_MSG_ELSEIF),this.appendStatementInput("DO"+t).appendField(e.Msg$$module$build$src$core$msg.CONTROLS_IF_MSG_THEN);this.elseCount_&&this.appendStatementInput("ELSE").appendField(e.Msg$$module$build$src$core$msg.CONTROLS_IF_MSG_ELSE)},reconnectChildBlocks_:function(t,e,s){for(let s=1;s<=this.elseifCount_;s++){let i,o;null==(i=t[s])||i.reconnect(this,"IF"+s),null==(o=e[s])||o.reconnect(this,"DO"+s)}null==s||s.reconnect(this,"ELSE")}};e.registerMutator$$module$build$src$core$extensions("controls_if_mutator",B,null,["controls_if_elseif","controls_if_else"]);e.register$$module$build$src$core$extensions("controls_if_tooltip",function(){this.setTooltip(function(){return this.elseifCount_||this.elseCount_?!this.elseifCount_&&this.elseCount_?e.Msg$$module$build$src$core$msg.CONTROLS_IF_TOOLTIP_2:this.elseifCount_&&!this.elseCount_?e.Msg$$module$build$src$core$msg.CONTROLS_IF_TOOLTIP_3:this.elseifCount_&&this.elseCount_?e.Msg$$module$build$src$core$msg.CONTROLS_IF_TOOLTIP_4:"":e.Msg$$module$build$src$core$msg.CONTROLS_IF_TOOLTIP_1}.bind(this))});var F={onchange:function(t){this.prevBlocks_||(this.prevBlocks_=[null,null]);var s=this.getInputTargetBlock("A");const i=this.getInputTargetBlock("B");s&&i&&!this.workspace.connectionChecker.doTypeChecks(s.outputConnection,i.outputConnection)&&(e.setGroup$$module$build$src$core$events$utils(t.group),(t=this.prevBlocks_[0])!==s&&(s.unplug(),!t||t.isDisposed()||t.isShadow()||this.getInput("A").connection.connect(t.outputConnection)),(s=this.prevBlocks_[1])!==i&&(i.unplug(),!s||s.isDisposed()||s.isShadow()||this.getInput("B").connection.connect(s.outputConnection)),this.bumpNeighbours(),e.setGroup$$module$build$src$core$events$utils(!1)),this.prevBlocks_[0]=this.getInputTargetBlock("A"),this.prevBlocks_[1]=this.getInputTargetBlock("B")}};e.register$$module$build$src$core$extensions("logic_compare",function(){this.mixin(F)});var U={prevParentConnection_:null,onchange:function(t){const s=this.getInputTargetBlock("THEN"),i=this.getInputTargetBlock("ELSE"),o=this.outputConnection.targetConnection;if((s||i)&&o)for(let n=0;n<2;n++){const r=1===n?s:i;r&&!r.workspace.connectionChecker.doTypeChecks(r.outputConnection,o)&&(e.setGroup$$module$build$src$core$events$utils(t.group),o===this.prevParentConnection_?(this.unplug(),o.getSourceBlock().bumpNeighbours()):(r.unplug(),r.bumpNeighbours()),e.setGroup$$module$build$src$core$events$utils(!1))}this.prevParentConnection_=o}};e.registerMixin$$module$build$src$core$extensions("logic_ternary",U),e.defineBlocks$$module$build$src$core$common(P);var H={blocks:P},G=e.createBlockDefinitionsFromJsonArray$$module$build$src$core$common([{type:"lists_create_empty",message0:"%{BKY_LISTS_CREATE_EMPTY_TITLE}",output:"Array",style:"list_blocks",tooltip:"%{BKY_LISTS_CREATE_EMPTY_TOOLTIP}",helpUrl:"%{BKY_LISTS_CREATE_EMPTY_HELPURL}"},{type:"lists_repeat",message0:"%{BKY_LISTS_REPEAT_TITLE}",args0:[{type:"input_value",name:"ITEM"},{type:"input_value",name:"NUM",check:"Number"}],output:"Array",style:"list_blocks",tooltip:"%{BKY_LISTS_REPEAT_TOOLTIP}",helpUrl:"%{BKY_LISTS_REPEAT_HELPURL}"},{type:"lists_reverse",message0:"%{BKY_LISTS_REVERSE_MESSAGE0}",args0:[{type:"input_value",name:"LIST",check:"Array"}],output:"Array",inputsInline:!0,style:"list_blocks",tooltip:"%{BKY_LISTS_REVERSE_TOOLTIP}",helpUrl:"%{BKY_LISTS_REVERSE_HELPURL}"},{type:"lists_isEmpty",message0:"%{BKY_LISTS_ISEMPTY_TITLE}",args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Boolean",style:"list_blocks",tooltip:"%{BKY_LISTS_ISEMPTY_TOOLTIP}",helpUrl:"%{BKY_LISTS_ISEMPTY_HELPURL}"},{type:"lists_length",message0:"%{BKY_LISTS_LENGTH_TITLE}",args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Number",style:"list_blocks",tooltip:"%{BKY_LISTS_LENGTH_TOOLTIP}",helpUrl:"%{BKY_LISTS_LENGTH_HELPURL}"}]),V={init:function(){this.setHelpUrl(e.Msg$$module$build$src$core$msg.LISTS_CREATE_WITH_HELPURL),this.setStyle("list_blocks"),this.itemCount_=3,this.updateShape_(),this.setOutput(!0,"Array"),this.setMutator(new e.MutatorIcon$$module$build$src$core$icons$mutator_icon(["lists_create_with_item"],this)),this.setTooltip(e.Msg$$module$build$src$core$msg.LISTS_CREATE_WITH_TOOLTIP)},mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation");return t.setAttribute("items",String(this.itemCount_)),t},domToMutation:function(t){if(!(t=t.getAttribute("items")))throw new TypeError("element did not have items");this.itemCount_=parseInt(t,10),this.updateShape_()},saveExtraState:function(){return{itemCount:this.itemCount_}},loadExtraState:function(t){this.itemCount_=t.itemCount,this.updateShape_()},decompose:function(t){const e=t.newBlock("lists_create_with_container");e.initSvg();let s=e.getInput("STACK").connection;for(let e=0;ee.Msg$$module$build$src$core$msg.LISTS_INDEX_OF_TOOLTIP.replace("%1",this.workspace.options.oneBasedIndex?"0":"-1"))}};G.lists_indexOf=z;var Y={init:function(){var t=[[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_GET,"GET"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_GET_REMOVE,"GET_REMOVE"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_REMOVE,"REMOVE"]];this.WHERE_OPTIONS=[[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_FROM_START,"FROM_START"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_FROM_END,"FROM_END"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_FIRST,"FIRST"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_LAST,"LAST"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_RANDOM,"RANDOM"]],this.setHelpUrl(e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_HELPURL),this.setStyle("list_blocks"),(t=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:t})).setValidator(function(t){t="REMOVE"===t,this.getSourceBlock().updateStatement_(t)}),this.appendValueInput("VALUE").setCheck("Array").appendField(e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_INPUT_IN_LIST),this.appendDummyInput().appendField(t,"MODE").appendField("","SPACE"),(t=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:this.WHERE_OPTIONS})).setValidator(function(t){const e=this.getValue();(t="FROM_START"===t||"FROM_END"===t)!=("FROM_START"===e||"FROM_END"===e)&&this.getSourceBlock().updateAt_(t)}),this.appendDummyInput().appendField(t,"WHERE"),this.appendDummyInput("AT"),e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TAIL&&this.appendDummyInput("TAIL").appendField(e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TAIL),this.setInputsInline(!0),this.setOutput(!0),this.updateAt_(!0),this.setTooltip(()=>{const t=this.getFieldValue("MODE"),s=this.getFieldValue("WHERE");let i="";switch(t+" "+s){case"GET FROM_START":case"GET FROM_END":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM;break;case"GET FIRST":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST;break;case"GET LAST":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST;break;case"GET RANDOM":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM;break;case"GET_REMOVE FROM_START":case"GET_REMOVE FROM_END":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM;break;case"GET_REMOVE FIRST":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST;break;case"GET_REMOVE LAST":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST;break;case"GET_REMOVE RANDOM":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM;break;case"REMOVE FROM_START":case"REMOVE FROM_END":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM;break;case"REMOVE FIRST":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST;break;case"REMOVE LAST":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST;break;case"REMOVE RANDOM":i=e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM}return"FROM_START"!==s&&"FROM_END"!==s||(i+=" "+("FROM_START"===s?e.Msg$$module$build$src$core$msg.LISTS_INDEX_FROM_START_TOOLTIP:e.Msg$$module$build$src$core$msg.LISTS_INDEX_FROM_END_TOOLTIP).replace("%1",this.workspace.options.oneBasedIndex?"#1":"#0")),i})},mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation");t.setAttribute("statement",String(!this.outputConnection));const s=this.getInput("AT")instanceof e.ValueInput$$module$build$src$core$inputs$value_input;return t.setAttribute("at",String(s)),t},domToMutation:function(t){const e="true"===t.getAttribute("statement");this.updateStatement_(e),t="false"!==t.getAttribute("at"),this.updateAt_(t)},saveExtraState:function(){return this.outputConnection?null:{isStatement:!0}},loadExtraState:function(t){t.isStatement?this.updateStatement_(!0):"string"==typeof t&&this.domToMutation(e.textToDom$$module$build$src$core$utils$xml(t))},updateStatement_:function(t){t!==!this.outputConnection&&(this.unplug(!0,!0),t?(this.setOutput(!1),this.setPreviousStatement(!0),this.setNextStatement(!0)):(this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0)))},updateAt_:function(t){this.removeInput("AT"),this.removeInput("ORDINAL",!0),t?(this.appendValueInput("AT").setCheck("Number"),e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX&&this.appendDummyInput("ORDINAL").appendField(e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX)):this.appendDummyInput("AT"),e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_TAIL&&this.moveInputBefore("TAIL",null)}};G.lists_getIndex=Y;var K={init:function(){var t=[[e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_SET,"SET"],[e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_INSERT,"INSERT"]];this.WHERE_OPTIONS=[[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_FROM_START,"FROM_START"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_FROM_END,"FROM_END"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_FIRST,"FIRST"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_LAST,"LAST"],[e.Msg$$module$build$src$core$msg.LISTS_GET_INDEX_RANDOM,"RANDOM"]],this.setHelpUrl(e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_HELPURL),this.setStyle("list_blocks"),this.appendValueInput("LIST").setCheck("Array").appendField(e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_INPUT_IN_LIST),t=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:t}),this.appendDummyInput().appendField(t,"MODE").appendField("","SPACE"),(t=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:this.WHERE_OPTIONS})).setValidator(function(t){const e=this.getValue();(t="FROM_START"===t||"FROM_END"===t)!=("FROM_START"===e||"FROM_END"===e)&&this.getSourceBlock().updateAt_(t)}),this.appendDummyInput().appendField(t,"WHERE"),this.appendDummyInput("AT"),this.appendValueInput("TO").appendField(e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_INPUT_TO),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP),this.updateAt_(!0),this.setTooltip(()=>{const t=this.getFieldValue("MODE"),s=this.getFieldValue("WHERE");let i="";switch(t+" "+s){case"SET FROM_START":case"SET FROM_END":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM;break;case"SET FIRST":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST;break;case"SET LAST":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST;break;case"SET RANDOM":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM;break;case"INSERT FROM_START":case"INSERT FROM_END":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM;break;case"INSERT FIRST":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST;break;case"INSERT LAST":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST;break;case"INSERT RANDOM":i=e.Msg$$module$build$src$core$msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM}return"FROM_START"!==s&&"FROM_END"!==s||(i+=" "+e.Msg$$module$build$src$core$msg.LISTS_INDEX_FROM_START_TOOLTIP.replace("%1",this.workspace.options.oneBasedIndex?"#1":"#0")),i})},mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation"),s=this.getInput("AT")instanceof e.ValueInput$$module$build$src$core$inputs$value_input;return t.setAttribute("at",String(s)),t},domToMutation:function(t){t="false"!==t.getAttribute("at"),this.updateAt_(t)},saveExtraState:function(){return null},loadExtraState:function(){},updateAt_:function(t){this.removeInput("AT"),this.removeInput("ORDINAL",!0),t?(this.appendValueInput("AT").setCheck("Number"),e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX&&this.appendDummyInput("ORDINAL").appendField(e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX)):this.appendDummyInput("AT"),this.moveInputBefore("AT","TO"),this.getInput("ORDINAL")&&this.moveInputBefore("ORDINAL","TO")}};G.lists_setIndex=K;var j={init:function(){this.WHERE_OPTIONS_1=[[e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_START_FROM_START,"FROM_START"],[e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_START_FROM_END,"FROM_END"],[e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_START_FIRST,"FIRST"]],this.WHERE_OPTIONS_2=[[e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_END_FROM_START,"FROM_START"],[e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_END_FROM_END,"FROM_END"],[e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_END_LAST,"LAST"]],this.setHelpUrl(e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_HELPURL),this.setStyle("list_blocks"),this.appendValueInput("LIST").setCheck("Array").appendField(e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_INPUT_IN_LIST);const t=t=>{const s=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:this["WHERE_OPTIONS_"+t]});return s.setValidator(function(e){const s=this.getValue();(e="FROM_START"===e||"FROM_END"===e)!=("FROM_START"===s||"FROM_END"===s)&&this.getSourceBlock().updateAt_(t,e)}),s};this.appendDummyInput("WHERE1_INPUT").appendField(t(1),"WHERE1"),this.appendDummyInput("AT1"),this.appendDummyInput("WHERE2_INPUT").appendField(t(2),"WHERE2"),this.appendDummyInput("AT2"),e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_TAIL&&this.appendDummyInput("TAIL").appendField(e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_TAIL),this.setInputsInline(!0),this.setOutput(!0,"Array"),this.updateAt_(1,!0),this.updateAt_(2,!0),this.setTooltip(e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_TOOLTIP)},mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation");var s=this.getInput("AT1")instanceof e.ValueInput$$module$build$src$core$inputs$value_input;return t.setAttribute("at1",String(s)),s=this.getInput("AT2")instanceof e.ValueInput$$module$build$src$core$inputs$value_input,t.setAttribute("at2",String(s)),t},domToMutation:function(t){const e="true"===t.getAttribute("at1");t="true"===t.getAttribute("at2"),this.updateAt_(1,e),this.updateAt_(2,t)},saveExtraState:function(){return null},loadExtraState:function(){},updateAt_:function(t,s){this.removeInput("AT"+t),this.removeInput("ORDINAL"+t,!0),s?(this.appendValueInput("AT"+t).setCheck("Number"),e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX&&this.appendDummyInput("ORDINAL"+t).appendField(e.Msg$$module$build$src$core$msg.ORDINAL_NUMBER_SUFFIX)):this.appendDummyInput("AT"+t),1===t&&(this.moveInputBefore("AT1","WHERE2_INPUT"),this.getInput("ORDINAL1")&&this.moveInputBefore("ORDINAL1","WHERE2_INPUT")),e.Msg$$module$build$src$core$msg.LISTS_GET_SUBLIST_TAIL&&this.moveInputBefore("TAIL",null)}};G.lists_getSublist=j,G.lists_sort={init:function(){this.jsonInit({message0:"%{BKY_LISTS_SORT_TITLE}",args0:[{type:"field_dropdown",name:"TYPE",options:[["%{BKY_LISTS_SORT_TYPE_NUMERIC}","NUMERIC"],["%{BKY_LISTS_SORT_TYPE_TEXT}","TEXT"],["%{BKY_LISTS_SORT_TYPE_IGNORECASE}","IGNORE_CASE"]]},{type:"field_dropdown",name:"DIRECTION",options:[["%{BKY_LISTS_SORT_ORDER_ASCENDING}","1"],["%{BKY_LISTS_SORT_ORDER_DESCENDING}","-1"]]},{type:"input_value",name:"LIST",check:"Array"}],output:"Array",style:"list_blocks",tooltip:"%{BKY_LISTS_SORT_TOOLTIP}",helpUrl:"%{BKY_LISTS_SORT_HELPURL}"})}},G.lists_split={init:function(){const t=e.fromJson$$module$build$src$core$field_registry({type:"field_dropdown",options:[[e.Msg$$module$build$src$core$msg.LISTS_SPLIT_LIST_FROM_TEXT,"SPLIT"],[e.Msg$$module$build$src$core$msg.LISTS_SPLIT_TEXT_FROM_LIST,"JOIN"]]});if(!t)throw Error("field_dropdown not found");t.setValidator(t=>{this.updateType_(t)}),this.setHelpUrl(e.Msg$$module$build$src$core$msg.LISTS_SPLIT_HELPURL),this.setStyle("list_blocks"),this.appendValueInput("INPUT").setCheck("String").appendField(t,"MODE"),this.appendValueInput("DELIM").setCheck("String").appendField(e.Msg$$module$build$src$core$msg.LISTS_SPLIT_WITH_DELIMITER),this.setInputsInline(!0),this.setOutput(!0,"Array"),this.setTooltip(()=>{const t=this.getFieldValue("MODE");if("SPLIT"===t)return e.Msg$$module$build$src$core$msg.LISTS_SPLIT_TOOLTIP_SPLIT;if("JOIN"===t)return e.Msg$$module$build$src$core$msg.LISTS_SPLIT_TOOLTIP_JOIN;throw Error("Unknown mode: "+t)})},updateType_:function(t){if(this.getFieldValue("MODE")!==t){const t=this.getInput("INPUT").connection;t.setShadowDom(null);const e=t.targetBlock();e&&(t.disconnect(),e.isShadow()?e.dispose(!1):this.bumpNeighbours())}"SPLIT"===t?(this.outputConnection.setCheck("Array"),this.getInput("INPUT").setCheck("String")):(this.outputConnection.setCheck("String"),this.getInput("INPUT").setCheck("Array"))},mutationToDom:function(){const t=e.createElement$$module$build$src$core$utils$xml("mutation");return t.setAttribute("mode",this.getFieldValue("MODE")),t},domToMutation:function(t){this.updateType_(t.getAttribute("mode"))},saveExtraState:function(){return{mode:this.getFieldValue("MODE")}},loadExtraState:function(t){this.updateType_(t.mode)}},e.defineBlocks$$module$build$src$core$common(G);var J={blocks:G},q={blocks:Object.assign({},G,P,w,k,b,d,l,s),lists:J,logic:H,loops:x,math:N,procedures:O,texts:E,variables:u,variablesDynamic:r};return q.__namespace__=e,q},void 0===(n=i.apply(e,o))||(t.exports=n)},548(t,e,s){var i,o,n;o=[s(500),s(955),s(822)],void 0===(n="function"==typeof(i=function(t,e,s){"use strict";return t.setLocale(e),t})?i.apply(e,o):i)||(t.exports=n)},449(t,e,s){var i,o,n;o=[s(500)],void 0===(n="function"==typeof(i=function(t){var e,s,i=t.__namespace__,o=function(t,s){var i=0;let o="";s.STATEMENT_PREFIX&&(o+=s.injectId(s.STATEMENT_PREFIX,t));do{const n=s.valueToCode(t,"IF"+i,e.NONE)||"false";let r=s.statementToCode(t,"DO"+i);s.STATEMENT_SUFFIX&&(r=s.prefixLines(s.injectId(s.STATEMENT_SUFFIX,t),s.INDENT)+r),o+=(i>0?" else ":"")+"if ("+n+") {\n"+r+"}",i++}while(t.getInput("IF"+i));return(t.getInput("ELSE")||s.STATEMENT_SUFFIX)&&(i=t.getInput("ELSE")?s.statementToCode(t,"ELSE"):"",s.STATEMENT_SUFFIX&&(i=s.prefixLines(s.injectId(s.STATEMENT_SUFFIX,t),s.INDENT)+i),o+=" else {\n"+i+"}"),o+"\n"},n=function(t,s){let o;o=t.getField("TIMES")?String(Number(t.getFieldValue("TIMES"))):s.valueToCode(t,"TIMES",e.ASSIGNMENT)||"0";let n=s.statementToCode(t,"DO");n=s.addLoopTrap(n,t),t="";const r=s.nameDB_.getDistinctName("count",i.NameType$$module$build$src$core$names.VARIABLE);let l=o;return o.match(/^\w+$/)||i.isNumber$$module$build$src$core$utils$string(o)||(l=s.nameDB_.getDistinctName("repeat_end",i.NameType$$module$build$src$core$names.VARIABLE),t+="var "+l+" = "+o+";\n"),t+"for (var "+r+" = 0; "+r+" < "+l+"; "+r+"++) {\n"+n+"}\n"},r=function(t,s){const i=t.getFieldValue("OP");let o;if("NEG"===i)return"-"===(t=s.valueToCode(t,"NUM",e.UNARY_NEGATION)||"0")[0]&&(t=" "+t),["-"+t,e.UNARY_NEGATION];switch(t="SIN"===i||"COS"===i||"TAN"===i?s.valueToCode(t,"NUM",e.DIVISION)||"0":s.valueToCode(t,"NUM",e.NONE)||"0",i){case"ABS":o="Math.abs("+t+")";break;case"ROOT":o="Math.sqrt("+t+")";break;case"LN":o="Math.log("+t+")";break;case"EXP":o="Math.exp("+t+")";break;case"POW10":o="Math.pow(10,"+t+")";break;case"ROUND":o="Math.round("+t+")";break;case"ROUNDUP":o="Math.ceil("+t+")";break;case"ROUNDDOWN":o="Math.floor("+t+")";break;case"SIN":o="Math.sin("+t+" / 180 * Math.PI)";break;case"COS":o="Math.cos("+t+" / 180 * Math.PI)";break;case"TAN":o="Math.tan("+t+" / 180 * Math.PI)"}if(o)return[o,e.FUNCTION_CALL];switch(i){case"LOG10":o="Math.log("+t+") / Math.log(10)";break;case"ASIN":o="Math.asin("+t+") / Math.PI * 180";break;case"ACOS":o="Math.acos("+t+") / Math.PI * 180";break;case"ATAN":o="Math.atan("+t+") / Math.PI * 180";break;default:throw Error("Unknown math operator: "+i)}return[o,e.DIVISION]},l=function(t,s){const i=s.getProcedureName(t.getFieldValue("NAME"));var o="";s.STATEMENT_PREFIX&&(o+=s.injectId(s.STATEMENT_PREFIX,t)),s.STATEMENT_SUFFIX&&(o+=s.injectId(s.STATEMENT_SUFFIX,t)),o&&(o=s.prefixLines(o,s.INDENT));let n="";s.INFINITE_LOOP_TRAP&&(n=s.prefixLines(s.injectId(s.INFINITE_LOOP_TRAP,t),s.INDENT));let r="";t.getInput("STACK")&&(r=s.statementToCode(t,"STACK"));let l="";t.getInput("RETURN")&&(l=s.valueToCode(t,"RETURN",e.NONE)||"");let a="";r&&l&&(a=o),l&&(l=s.INDENT+"return "+l+";\n");const c=[],h=t.getVars();for(let t=0;t0?a=e.ADDITION:o<0?a=e.SUBTRACTION:n&&(a=e.UNARY_NEGATION),t=this.valueToCode(t,s,a)||l,0!==o||n?i.isNumber$$module$build$src$core$utils$string(t)?(t=String(Number(t)+o),n&&(t=String(-Number(t))),t):(o>0?t=`${t} + ${o}`:o<0&&(t=`${t} - ${-o}`),n&&(t=o?`-(${t})`:`-${t}`),Math.floor(r)>=Math.floor(a)&&(t=`(${t})`),t):t}},d={};d.JavascriptGenerator=u,d.Order=e;var p=function(t,e,s){return"FIRST"===e?"0":"FROM_END"===e?t+".length - 1 - "+s:"LAST"===e?t+".length - 1":s},g={lists_create_empty:function(t,s){return["[]",e.ATOMIC]},lists_create_with:function(t,s){const i=Array(t.itemCount_);for(let o=0;o String(b) ? 1 : -1; },\n 'IGNORE_CASE': function(a, b) {\n return String(a).toLowerCase() > String(b).toLowerCase() ? 1 : -1; },\n };\n var compare = compareFuncs[type];\n return function(a, b) { return compare(a, b) * direction; };\n}\n `))+'("'+t+'", '+o+"))",e.FUNCTION_CALL]},lists_split:function(t,s){let i=s.valueToCode(t,"INPUT",e.MEMBER);if(s=s.valueToCode(t,"DELIM",e.NONE)||"''","SPLIT"===(t=t.getFieldValue("MODE")))i||(i="''"),t="split";else{if("JOIN"!==t)throw Error("Unknown mode: "+t);i||(i="[]"),t="join"}return[i+"."+t+"("+s+")",e.FUNCTION_CALL]}},_={};_.controls_if=o,_.controls_ifelse=o,_.logic_boolean=function(t,s){return["TRUE"===t.getFieldValue("BOOL")?"true":"false",e.ATOMIC]},_.logic_compare=function(t,s){const i={EQ:"==",NEQ:"!=",LT:"<",LTE:"<=",GT:">",GTE:">="}[t.getFieldValue("OP")],o="=="===i||"!="===i?e.EQUALITY:e.RELATIONAL;return[(s.valueToCode(t,"A",o)||"0")+" "+i+" "+(t=s.valueToCode(t,"B",o)||"0"),o]},_.logic_negate=function(t,s){const i=e.LOGICAL_NOT;return["!"+(s.valueToCode(t,"BOOL",i)||"true"),i]},_.logic_null=function(t,s){return["null",e.ATOMIC]},_.logic_operation=function(t,s){const i="AND"===t.getFieldValue("OP")?"&&":"||",o="&&"===i?e.LOGICAL_AND:e.LOGICAL_OR;let n=s.valueToCode(t,"A",o);return t=s.valueToCode(t,"B",o),n||t?(s="&&"===i?"true":"false",n||(n=s),t||(t=s)):t=n="false",[n+" "+i+" "+t,o]},_.logic_ternary=function(t,s){return[(s.valueToCode(t,"IF",e.CONDITIONAL)||"false")+" ? "+(s.valueToCode(t,"THEN",e.CONDITIONAL)||"null")+" : "+(t=s.valueToCode(t,"ELSE",e.CONDITIONAL)||"null"),e.CONDITIONAL]};var T={controls_flow_statements:function(t,e){let s="";if(e.STATEMENT_PREFIX&&(s+=e.injectId(e.STATEMENT_PREFIX,t)),e.STATEMENT_SUFFIX&&(s+=e.injectId(e.STATEMENT_SUFFIX,t)),e.STATEMENT_PREFIX){const i=t.getSurroundLoop();i&&!i.suppressPrefixSuffix&&(s+=e.injectId(e.STATEMENT_PREFIX,i))}switch(t.getFieldValue("FLOW")){case"BREAK":return s+"break;\n";case"CONTINUE":return s+"continue;\n"}throw Error("Unknown flow statement.")},controls_for:function(t,s){var o=s.getVariableName(t.getFieldValue("VAR")),n=s.valueToCode(t,"FROM",e.ASSIGNMENT)||"0",r=s.valueToCode(t,"TO",e.ASSIGNMENT)||"0";const l=s.valueToCode(t,"BY",e.ASSIGNMENT)||"1";let a=s.statementToCode(t,"DO");if(a=s.addLoopTrap(a,t),i.isNumber$$module$build$src$core$utils$string(n)&&i.isNumber$$module$build$src$core$utils$string(r)&&i.isNumber$$module$build$src$core$utils$string(l))t="for ("+o+" = "+n+"; "+o+((s=Number(n)<=Number(r))?" <= ":" >= ")+r+"; "+o,t=1===(o=Math.abs(Number(l)))?t+(s?"++":"--"):t+(s?" += ":" -= ")+o,t+=") {\n"+a+"}\n";else{t="";let e=n;n.match(/^\w+$/)||i.isNumber$$module$build$src$core$utils$string(n)||(e=s.nameDB_.getDistinctName(o+"_start",i.NameType$$module$build$src$core$names.VARIABLE),t+="var "+e+" = "+n+";\n"),n=r,r.match(/^\w+$/)||i.isNumber$$module$build$src$core$utils$string(r)||(t+="var "+(n=s.nameDB_.getDistinctName(o+"_end",i.NameType$$module$build$src$core$names.VARIABLE))+" = "+r+";\n"),t+="var "+(r=s.nameDB_.getDistinctName(o+"_inc",i.NameType$$module$build$src$core$names.VARIABLE))+" = ",t=i.isNumber$$module$build$src$core$utils$string(l)?t+(Math.abs(Number(l))+";\n"):t+"Math.abs("+l+");\n",t+="if ("+e+" > "+n+") {\n",t=(t+=s.INDENT+r+" = -"+r+";\n")+"}\nfor ("+o+" = "+e+"; "+r+" >= 0 ? "+o+" <= "+n+" : "+o+" >= "+n+"; "+o+" += "+r+") {\n"+a+"}\n"}return t},controls_forEach:function(t,s){const o=s.getVariableName(t.getFieldValue("VAR"));var n=s.valueToCode(t,"LIST",e.ASSIGNMENT)||"[]";let r=s.statementToCode(t,"DO");r=s.addLoopTrap(r,t),t="";let l=n;return n.match(/^\w+$/)||(l=s.nameDB_.getDistinctName(o+"_list",i.NameType$$module$build$src$core$names.VARIABLE),t+="var "+l+" = "+n+";\n"),n=s.nameDB_.getDistinctName(o+"_index",i.NameType$$module$build$src$core$names.VARIABLE),r=s.INDENT+o+" = "+l+"["+n+"];\n"+r,t+"for (var "+n+" in "+l+") {\n"+r+"}\n"}};T.controls_repeat=n,T.controls_repeat_ext=n,T.controls_whileUntil=function(t,s){const i="UNTIL"===t.getFieldValue("MODE");let o=s.valueToCode(t,"BOOL",i?e.LOGICAL_NOT:e.NONE)||"false",n=s.statementToCode(t,"DO");return n=s.addLoopTrap(n,t),i&&(o="!"+o),"while ("+o+") {\n"+n+"}\n"};var m={math_arithmetic:function(t,s){var i={ADD:[" + ",e.ADDITION],MINUS:[" - ",e.SUBTRACTION],MULTIPLY:[" * ",e.MULTIPLICATION],DIVIDE:[" / ",e.DIVISION],POWER:[null,e.NONE]}[t.getFieldValue("OP")];const o=i[0];i=i[1];const n=s.valueToCode(t,"A",i)||"0";return t=s.valueToCode(t,"B",i)||"0",o?[n+o+t,i]:["Math.pow("+n+", "+t+")",e.FUNCTION_CALL]},math_atan2:function(t,s){const i=s.valueToCode(t,"X",e.NONE)||"0";return["Math.atan2("+(s.valueToCode(t,"Y",e.NONE)||"0")+", "+i+") / Math.PI * 180",e.DIVISION]},math_change:function(t,s){const i=s.valueToCode(t,"DELTA",e.ADDITION)||"0";return(t=s.getVariableName(t.getFieldValue("VAR")))+" = (typeof "+t+" === 'number' ? "+t+" : 0) + "+i+";\n"},math_constant:function(t,s){return{PI:["Math.PI",e.MEMBER],E:["Math.E",e.MEMBER],GOLDEN_RATIO:["(1 + Math.sqrt(5)) / 2",e.DIVISION],SQRT2:["Math.SQRT2",e.MEMBER],SQRT1_2:["Math.SQRT1_2",e.MEMBER],INFINITY:["Infinity",e.ATOMIC]}[t.getFieldValue("CONSTANT")]},math_constrain:function(t,s){return["Math.min(Math.max("+(s.valueToCode(t,"VALUE",e.NONE)||"0")+", "+(s.valueToCode(t,"LOW",e.NONE)||"0")+"), "+(t=s.valueToCode(t,"HIGH",e.NONE)||"Infinity")+")",e.FUNCTION_CALL]},math_modulo:function(t,s){return[(s.valueToCode(t,"DIVIDEND",e.MODULUS)||"0")+" % "+(t=s.valueToCode(t,"DIVISOR",e.MODULUS)||"0"),e.MODULUS]},math_number:function(t,s){return t=Number(t.getFieldValue("NUM")),[String(t),t>=0?e.ATOMIC:e.UNARY_NEGATION]},math_number_property:function(t,s){var i={EVEN:[" % 2 === 0",e.MODULUS,e.EQUALITY],ODD:[" % 2 === 1",e.MODULUS,e.EQUALITY],WHOLE:[" % 1 === 0",e.MODULUS,e.EQUALITY],POSITIVE:[" > 0",e.RELATIONAL,e.RELATIONAL],NEGATIVE:[" < 0",e.RELATIONAL,e.RELATIONAL],DIVISIBLE_BY:[null,e.MODULUS,e.EQUALITY],PRIME:[null,e.NONE,e.FUNCTION_CALL]};const o=t.getFieldValue("PROPERTY"),[n,r,l]=i[o];return i=s.valueToCode(t,"NUMBER_TO_CHECK",r)||"0",[t="PRIME"===o?s.provideFunction_("mathIsPrime",`\nfunction ${s.FUNCTION_NAME_PLACEHOLDER_}(n) {\n // https://en.wikipedia.org/wiki/Primality_test#Naive_methods\n if (n == 2 || n == 3) {\n return true;\n }\n // False if n is NaN, negative, is 1, or not whole.\n // And false if n is divisible by 2 or 3.\n if (isNaN(n) || n <= 1 || n % 1 !== 0 || n % 2 === 0 || n % 3 === 0) {\n return false;\n }\n // Check all the numbers of form 6k +/- 1, up to sqrt(n).\n for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {\n if (n % (x - 1) === 0 || n % (x + 1) === 0) {\n return false;\n }\n }\n return true;\n}\n`)+"("+i+")":"DIVISIBLE_BY"===o?i+" % "+(t=s.valueToCode(t,"DIVISOR",e.MODULUS)||"0")+" === 0":i+n,l]},math_on_list:function(t,s){var i=t.getFieldValue("OP");switch(i){case"SUM":t=s.valueToCode(t,"LIST",e.MEMBER)||"[]",t+=".reduce(function(x, y) {return x + y;}, 0)";break;case"MIN":t="Math.min.apply(null, "+(t=s.valueToCode(t,"LIST",e.NONE)||"[]")+")";break;case"MAX":t="Math.max.apply(null, "+(t=s.valueToCode(t,"LIST",e.NONE)||"[]")+")";break;case"AVERAGE":t=(i=s.provideFunction_("mathMean",`\nfunction ${s.FUNCTION_NAME_PLACEHOLDER_}(myList) {\n return myList.reduce(function(x, y) {return x + y;}, 0) / myList.length;\n}\n`))+"("+(t=s.valueToCode(t,"LIST",e.NONE)||"[]")+")";break;case"MEDIAN":t=(i=s.provideFunction_("mathMedian",`\nfunction ${s.FUNCTION_NAME_PLACEHOLDER_}(myList) {\n var localList = myList.filter(function (x) {return typeof x === 'number';});\n if (!localList.length) return null;\n localList.sort(function(a, b) {return b - a;});\n if (localList.length % 2 === 0) {\n return (localList[localList.length / 2 - 1] + localList[localList.length / 2]) / 2;\n } else {\n return localList[(localList.length - 1) / 2];\n }\n}\n`))+"("+(t=s.valueToCode(t,"LIST",e.NONE)||"[]")+")";break;case"MODE":t=(i=s.provideFunction_("mathModes",`\nfunction ${s.FUNCTION_NAME_PLACEHOLDER_}(values) {\n var modes = [];\n var counts = [];\n var maxCount = 0;\n for (var i = 0; i < values.length; i++) {\n var value = values[i];\n var found = false;\n var thisCount;\n for (var j = 0; j < counts.length; j++) {\n if (counts[j][0] === value) {\n thisCount = ++counts[j][1];\n found = true;\n break;\n }\n }\n if (!found) {\n counts.push([value, 1]);\n thisCount = 1;\n }\n maxCount = Math.max(thisCount, maxCount);\n }\n for (var j = 0; j < counts.length; j++) {\n if (counts[j][1] === maxCount) {\n modes.push(counts[j][0]);\n }\n }\n return modes;\n}\n`))+"("+(t=s.valueToCode(t,"LIST",e.NONE)||"[]")+")";break;case"STD_DEV":t=(i=s.provideFunction_("mathStandardDeviation",`\nfunction ${s.FUNCTION_NAME_PLACEHOLDER_}(numbers) {\n var n = numbers.length;\n if (!n) return null;\n var mean = numbers.reduce(function(x, y) {return x + y;}) / n;\n var variance = 0;\n for (var j = 0; j < n; j++) {\n variance += Math.pow(numbers[j] - mean, 2);\n }\n variance /= n;\n return Math.sqrt(variance);\n}\n`))+"("+(t=s.valueToCode(t,"LIST",e.NONE)||"[]")+")";break;case"RANDOM":t=(i=s.provideFunction_("mathRandomList",`\nfunction ${s.FUNCTION_NAME_PLACEHOLDER_}(list) {\n var x = Math.floor(Math.random() * list.length);\n return list[x];\n}\n`))+"("+(t=s.valueToCode(t,"LIST",e.NONE)||"[]")+")";break;default:throw Error("Unknown operator: "+i)}return[t,e.FUNCTION_CALL]},math_random_float:function(t,s){return["Math.random()",e.FUNCTION_CALL]},math_random_int:function(t,s){const i=s.valueToCode(t,"FROM",e.NONE)||"0";return t=s.valueToCode(t,"TO",e.NONE)||"0",[s.provideFunction_("mathRandomInt",`\nfunction ${s.FUNCTION_NAME_PLACEHOLDER_}(a, b) {\n if (a > b) {\n // Swap a and b to ensure a is smaller.\n var c = a;\n a = b;\n b = c;\n }\n return Math.floor(Math.random() * (b - a + 1) + a);\n}\n`)+"("+i+", "+t+")",e.FUNCTION_CALL]}};m.math_round=r,m.math_single=r,m.math_trig=r;var E={procedures_callnoreturn:function(t,e){return e.forBlock.procedures_callreturn(t,e)[0]+";\n"},procedures_callreturn:function(t,s){const i=s.getProcedureName(t.getFieldValue("NAME")),o=[],n=t.getVars();for(let i=0;iKe,sV:()=>A,sh:()=>_e});var i=s(500);const{Block:o,BlockFlyoutInflater:n,BlockNavigationPolicy:r,BlockSvg:l,Blocks:a,ButtonFlyoutInflater:c,COLLAPSED_FIELD_NAME:h,COLLAPSED_INPUT_NAME:u,COLLAPSE_CHARS:d,CodeGenerator:p,CollapsibleToolboxCategory:g,ComponentManager:_,Connection:T,ConnectionChecker:m,ConnectionDB:E,ConnectionNavigationPolicy:b,ConnectionType:f,ContextMenu:$,ContextMenuItems:I,ContextMenuRegistry:C,Css:S,DELETE_VARIABLE_ID:R,DeleteArea:y,DragTarget:O,DropDownDiv:k,Events:A,Extensions:v,Field:N,FieldCheckbox:w,FieldDropdown:L,FieldImage:M,FieldLabel:D,FieldLabelSerializable:x,FieldNavigationPolicy:P,FieldNumber:B,FieldTextInput:F,FieldVariable:U,Flyout:H,FlyoutButton:G,FlyoutButtonNavigationPolicy:V,FlyoutItem:W,FlyoutMetricsManager:X,FlyoutNavigationPolicy:z,FlyoutNavigator:Y,FlyoutSeparator:K,FlyoutSeparatorNavigationPolicy:j,FocusManager:J,FocusableTreeTraverser:q,Generator:Z,Gesture:Q,Grid:tt,HorizontalFlyout:et,INPUT_VALUE:st,Input:it,InsertionMarkerPreviewer:ot,KeyboardNavigationController:nt,LabelFlyoutInflater:rt,LineCursor:lt,Marker:at,MarkerManager:ct,Menu:ht,MenuItem:ut,MetricsManager:dt,Msg:pt,NEXT_STATEMENT:gt,Names:_t,Navigator:Tt,OPPOSITE_TYPE:mt,OUTPUT_VALUE:Et,Options:bt,PREVIOUS_STATEMENT:ft,PROCEDURE_CATEGORY_NAME:$t,Procedures:It,RENAME_VARIABLE_ID:Ct,RenderedConnection:St,Scrollbar:Rt,ScrollbarPair:yt,SeparatorFlyoutInflater:Ot,ShortcutItems:kt,ShortcutRegistry:At,TOOLBOX_AT_BOTTOM:vt,TOOLBOX_AT_LEFT:Nt,TOOLBOX_AT_RIGHT:wt,TOOLBOX_AT_TOP:Lt,Theme:Mt,ThemeManager:Dt,Themes:xt,Toast:Pt,Toolbox:Bt,ToolboxCategory:Ft,ToolboxItem:Ut,ToolboxSeparator:Ht,Tooltip:Gt,Touch:Vt,Trashcan:Wt,UnattachedFieldError:Xt,VARIABLE_CATEGORY_NAME:zt,VARIABLE_DYNAMIC_CATEGORY_NAME:Yt,VERSION:Kt,VariableMap:jt,VariableModel:Jt,Variables:qt,VariablesDynamic:Zt,VerticalFlyout:Qt,WidgetDiv:te,Workspace:ee,WorkspaceAudio:se,WorkspaceDragger:ie,WorkspaceNavigationPolicy:oe,WorkspaceSvg:ne,Xml:re,ZoomControls:le,blockAnimations:ae,blockRendering:ce,browserEvents:he,bubbles:ue,bumpObjects:de,clipboard:pe,comments:ge,common:_e,config:Te,constants:me,defineBlocksWithJsonArray:Ee,dialog:be,dragging:fe,fieldRegistry:$e,geras:Ie,getFocusManager:Ce,getMainWorkspace:Se,getSelected:Re,hasBubble:ye,hideChaff:Oe,icons:ke,inject:Ae,inputs:ve,isCopyable:Ne,isDeletable:we,isDraggable:Le,isIcon:Me,isObservable:De,isPaster:xe,isRenderedElement:Pe,isSelectable:Be,isSerializable:Fe,isVariableBackedParameterModel:Ue,keyboardNavigationController:He,layers:Ge,navigateBlock:Ve,navigateStacks:We,procedures:Xe,registry:ze,renderManagement:Ye,serialization:Ke,setLocale:je,setParentContainer:Je,svgResize:qe,thrasos:Ze,uiPosition:Qe,utils:ts,zelos:es}=i},501(t,e,s){"use strict";s.d(e,{WQ:()=>Ae,sV:()=>A,sh:()=>_e});var i=s(548);const{Block:o,BlockFlyoutInflater:n,BlockNavigationPolicy:r,BlockSvg:l,Blocks:a,ButtonFlyoutInflater:c,COLLAPSED_FIELD_NAME:h,COLLAPSED_INPUT_NAME:u,COLLAPSE_CHARS:d,CodeGenerator:p,CollapsibleToolboxCategory:g,ComponentManager:_,Connection:T,ConnectionChecker:m,ConnectionDB:E,ConnectionNavigationPolicy:b,ConnectionType:f,ContextMenu:$,ContextMenuItems:I,ContextMenuRegistry:C,Css:S,DELETE_VARIABLE_ID:R,DeleteArea:y,DragTarget:O,DropDownDiv:k,Events:A,Extensions:v,Field:N,FieldCheckbox:w,FieldDropdown:L,FieldImage:M,FieldLabel:D,FieldLabelSerializable:x,FieldNavigationPolicy:P,FieldNumber:B,FieldTextInput:F,FieldVariable:U,Flyout:H,FlyoutButton:G,FlyoutButtonNavigationPolicy:V,FlyoutItem:W,FlyoutMetricsManager:X,FlyoutNavigationPolicy:z,FlyoutNavigator:Y,FlyoutSeparator:K,FlyoutSeparatorNavigationPolicy:j,FocusManager:J,FocusableTreeTraverser:q,Generator:Z,Gesture:Q,Grid:tt,HorizontalFlyout:et,INPUT_VALUE:st,Input:it,InsertionMarkerPreviewer:ot,KeyboardNavigationController:nt,LabelFlyoutInflater:rt,LineCursor:lt,Marker:at,MarkerManager:ct,Menu:ht,MenuItem:ut,MetricsManager:dt,Msg:pt,NEXT_STATEMENT:gt,Names:_t,Navigator:Tt,OPPOSITE_TYPE:mt,OUTPUT_VALUE:Et,Options:bt,PREVIOUS_STATEMENT:ft,PROCEDURE_CATEGORY_NAME:$t,Procedures:It,RENAME_VARIABLE_ID:Ct,RenderedConnection:St,Scrollbar:Rt,ScrollbarPair:yt,SeparatorFlyoutInflater:Ot,ShortcutItems:kt,ShortcutRegistry:At,TOOLBOX_AT_BOTTOM:vt,TOOLBOX_AT_LEFT:Nt,TOOLBOX_AT_RIGHT:wt,TOOLBOX_AT_TOP:Lt,Theme:Mt,ThemeManager:Dt,Themes:xt,Toast:Pt,Toolbox:Bt,ToolboxCategory:Ft,ToolboxItem:Ut,ToolboxSeparator:Ht,Tooltip:Gt,Touch:Vt,Trashcan:Wt,UnattachedFieldError:Xt,VARIABLE_CATEGORY_NAME:zt,VARIABLE_DYNAMIC_CATEGORY_NAME:Yt,VERSION:Kt,VariableMap:jt,VariableModel:Jt,Variables:qt,VariablesDynamic:Zt,VerticalFlyout:Qt,WidgetDiv:te,Workspace:ee,WorkspaceAudio:se,WorkspaceDragger:ie,WorkspaceNavigationPolicy:oe,WorkspaceSvg:ne,Xml:re,ZoomControls:le,blockAnimations:ae,blockRendering:ce,browserEvents:he,bubbles:ue,bumpObjects:de,clipboard:pe,comments:ge,common:_e,config:Te,constants:me,defineBlocksWithJsonArray:Ee,dialog:be,dragging:fe,fieldRegistry:$e,geras:Ie,getFocusManager:Ce,getMainWorkspace:Se,getSelected:Re,hasBubble:ye,hideChaff:Oe,icons:ke,inject:Ae,inputs:ve,isCopyable:Ne,isDeletable:we,isDraggable:Le,isIcon:Me,isObservable:De,isPaster:xe,isRenderedElement:Pe,isSelectable:Be,isSerializable:Fe,isVariableBackedParameterModel:Ue,keyboardNavigationController:He,layers:Ge,navigateBlock:Ve,navigateStacks:We,procedures:Xe,registry:ze,renderManagement:Ye,serialization:Ke,setLocale:je,setParentContainer:Je,svgResize:qe,thrasos:Ze,uiPosition:Qe,utils:ts,zelos:es}=i},290(t,e,s){"use strict";s.d(e,{bw:()=>r,pH:()=>n});var i=s(449);const{JavascriptGenerator:o,Order:n,javascriptGenerator:r}=i}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var s=__webpack_module_cache__[t]={id:t,exports:{}};return __webpack_modules__[t].call(s.exports,s,s.exports,__webpack_require__),s.exports}__webpack_require__.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return __webpack_require__.d(e,{a:e}),e},__webpack_require__.d=(t,e)=>{for(var s in e)__webpack_require__.o(e,s)&&!__webpack_require__.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:e[s]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),__webpack_require__.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),__webpack_require__.nc=void 0;var __webpack_exports__={};(()=>{"use strict";var blockly__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(501),_blocks_text__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(780),_generators_javascript__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(352),blockly_javascript__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(290),_serialization__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(952),_toolbox__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(336),_index_css__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(216);blockly__WEBPACK_IMPORTED_MODULE_0__.sh.defineBlocks(_blocks_text__WEBPACK_IMPORTED_MODULE_1__.B),Object.assign(blockly_javascript__WEBPACK_IMPORTED_MODULE_3__.bw.forBlock,_generators_javascript__WEBPACK_IMPORTED_MODULE_2__.J);const codeDiv=document.getElementById("generatedCode").firstChild,outputDiv=document.getElementById("output"),blocklyDiv=document.getElementById("blocklyDiv"),ws=blockly__WEBPACK_IMPORTED_MODULE_0__.WQ(blocklyDiv,{toolbox:_toolbox__WEBPACK_IMPORTED_MODULE_5__.M}),runCode=()=>{const code=blockly_javascript__WEBPACK_IMPORTED_MODULE_3__.bw.workspaceToCode(ws);codeDiv.innerText=code,outputDiv.innerHTML="",eval(code)};(0,_serialization__WEBPACK_IMPORTED_MODULE_4__.H)(ws),runCode(),ws.addChangeListener(t=>{t.isUiEvent||(0,_serialization__WEBPACK_IMPORTED_MODULE_4__.U)(ws)}),ws.addChangeListener(t=>{t.isUiEvent||t.type==blockly__WEBPACK_IMPORTED_MODULE_0__.sV.FINISHED_LOADING||ws.isDragging()||runCode()})})()})(); \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js.LICENSE.txt b/packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js.LICENSE.txt deleted file mode 100644 index 4edc2251c46..00000000000 --- a/packages/docs/docs/codelabs/getting-started/starter-code/dist/bundle.js.LICENSE.txt +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @license - * Copyright 2019 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @license - * Copyright 2023 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/dist/index.html b/packages/docs/docs/codelabs/getting-started/starter-code/dist/index.html deleted file mode 100644 index aea1aefef6e..00000000000 --- a/packages/docs/docs/codelabs/getting-started/starter-code/dist/index.html +++ /dev/null @@ -1 +0,0 @@ -Blockly Sample App
\ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/blocks/text.js b/packages/docs/docs/codelabs/getting-started/starter-code/src/blocks/text.js index a84680bc6b2..e69de29bb2d 100644 --- a/packages/docs/docs/codelabs/getting-started/starter-code/src/blocks/text.js +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/blocks/text.js @@ -1,35 +0,0 @@ -/** - * @license - * Copyright 2023 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -import * as Blockly from 'blockly/core'; - -// Create a custom block called 'add_text' that adds -// text to the output div on the sample app. -// This is just an example and you should replace this with your -// own custom blocks. -const addText = { - type: 'add_text', - message0: 'Add text %1', - args0: [ - { - type: 'input_value', - name: 'TEXT', - check: 'String', - }, - ], - previousStatement: null, - nextStatement: null, - colour: 160, - tooltip: '', - helpUrl: '', -}; - -// Create the block definitions for the JSON-only blocks. -// This does not register their definitions with Blockly. -// This file has no side effects! -export const blocks = Blockly.common.createBlockDefinitionsFromJsonArray([ - addText, -]); diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/generators/javascript.js b/packages/docs/docs/codelabs/getting-started/starter-code/src/generators/javascript.js index 0315d9504d6..e69de29bb2d 100644 --- a/packages/docs/docs/codelabs/getting-started/starter-code/src/generators/javascript.js +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/generators/javascript.js @@ -1,30 +0,0 @@ -/** - * @license - * Copyright 2023 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -import {Order} from 'blockly/javascript'; - -// Export all the code generators for our custom blocks, -// but don't register them with Blockly yet. -// This file has no side effects! -export const forBlock = Object.create(null); - -forBlock['add_text'] = function (block, generator) { - const text = generator.valueToCode(block, 'TEXT', Order.NONE) || "''"; - const addText = generator.provideFunction_( - 'addText', - `function ${generator.FUNCTION_NAME_PLACEHOLDER_}(text) { - - // Add text to the output area. - const outputDiv = document.getElementById('output'); - const textEl = document.createElement('p'); - textEl.innerText = text; - outputDiv.appendChild(textEl); -}`, - ); - // Generate the function call for this block. - const code = `${addText}(${text});\n`; - return code; -}; diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/index.html b/packages/docs/docs/codelabs/getting-started/starter-code/src/index.html index 36d8eeacd99..e69de29bb2d 100644 --- a/packages/docs/docs/codelabs/getting-started/starter-code/src/index.html +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/index.html @@ -1,16 +0,0 @@ - - - - - Blockly Sample App - - -
-
-
-
-
-
-
- - diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/index.js b/packages/docs/docs/codelabs/getting-started/starter-code/src/index.js index 36abfb6dd82..e69de29bb2d 100644 --- a/packages/docs/docs/codelabs/getting-started/starter-code/src/index.js +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/index.js @@ -1,62 +0,0 @@ -/** - * @license - * Copyright 2023 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -import * as Blockly from 'blockly'; -import {blocks} from './blocks/text'; -import {forBlock} from './generators/javascript'; -import {javascriptGenerator} from 'blockly/javascript'; -import {save, load} from './serialization'; -import {toolbox} from './toolbox'; -import './index.css'; - -// Register the blocks and generator with Blockly -Blockly.common.defineBlocks(blocks); -Object.assign(javascriptGenerator.forBlock, forBlock); - -// Set up UI elements and inject Blockly -const codeDiv = document.getElementById('generatedCode').firstChild; -const outputDiv = document.getElementById('output'); -const blocklyDiv = document.getElementById('blocklyDiv'); -const ws = Blockly.inject(blocklyDiv, {toolbox}); - -// This function resets the code and output divs, shows the -// generated code from the workspace, and evals the code. -// In a real application, you probably shouldn't use `eval`. -const runCode = () => { - const code = javascriptGenerator.workspaceToCode(ws); - codeDiv.innerText = code; - - outputDiv.innerHTML = ''; - - eval(code); -}; - -// Load the initial state from storage and run the code. -load(ws); -runCode(); - -// Every time the workspace changes state, save the changes to storage. -ws.addChangeListener((e) => { - // UI events are things like scrolling, zooming, etc. - // No need to save after one of these. - if (e.isUiEvent) return; - save(ws); -}); - -// Whenever the workspace changes meaningfully, run the code again. -ws.addChangeListener((e) => { - // Don't run the code when the workspace finishes loading; we're - // already running it once when the application starts. - // Don't run the code during drags; we might have invalid state. - if ( - e.isUiEvent || - e.type == Blockly.Events.FINISHED_LOADING || - ws.isDragging() - ) { - return; - } - runCode(); -}); diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/serialization.js b/packages/docs/docs/codelabs/getting-started/starter-code/src/serialization.js index 1fe1b420336..e69de29bb2d 100644 --- a/packages/docs/docs/codelabs/getting-started/starter-code/src/serialization.js +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/serialization.js @@ -1,32 +0,0 @@ -/** - * @license - * Copyright 2023 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -import * as Blockly from 'blockly/core'; - -const storageKey = 'getting-started-app/mainWorkspace'; - -/** - * Saves the state of the workspace to browser's local storage. - * @param {Blockly.Workspace} workspace Blockly workspace to save. - */ -export const save = function (workspace) { - const data = Blockly.serialization.workspaces.save(workspace); - window.localStorage?.setItem(storageKey, JSON.stringify(data)); -}; - -/** - * Loads saved state from local storage into the given workspace. - * @param {Blockly.Workspace} workspace Blockly workspace to load into. - */ -export const load = function (workspace) { - const data = window.localStorage?.getItem(storageKey); - if (!data) return; - - // Don't emit events during loading. - Blockly.Events.disable(); - Blockly.serialization.workspaces.load(JSON.parse(data), workspace, false); - Blockly.Events.enable(); -}; diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js b/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js index 1e1f8e6c931..47964dbb672 100644 --- a/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js @@ -1,629 +1,37 @@ -/** - * @license - * Copyright 2023 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/* -This toolbox contains nearly every single built-in block that Blockly offers, -in addition to the custom block 'add_text' this sample app adds. -You probably don't need every single block, and should consider either rewriting -your toolbox from scratch, or carefully choosing whether you need each block -listed here. -*/ - export const toolbox = { - kind: 'categoryToolbox', + kind: 'flyoutToolbox', contents: [ { - kind: 'category', - name: 'Logic', - categorystyle: 'logic_category', - contents: [ - { - kind: 'block', - type: 'controls_if', - }, - { - kind: 'block', - type: 'logic_compare', - }, - { - kind: 'block', - type: 'logic_operation', - }, - { - kind: 'block', - type: 'logic_negate', - }, - { - kind: 'block', - type: 'logic_boolean', - }, - { - kind: 'block', - type: 'logic_null', - }, - { - kind: 'block', - type: 'logic_ternary', - }, - ], - }, - { - kind: 'category', - name: 'Loops', - categorystyle: 'loop_category', - contents: [ - { - kind: 'block', - type: 'controls_repeat_ext', - inputs: { - TIMES: { - shadow: { - type: 'math_number', - fields: { - NUM: 10, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'controls_whileUntil', - }, - { - kind: 'block', - type: 'controls_for', - inputs: { - FROM: { - shadow: { - type: 'math_number', - fields: { - NUM: 1, - }, - }, - }, - TO: { - shadow: { - type: 'math_number', - fields: { - NUM: 10, - }, - }, - }, - BY: { - shadow: { - type: 'math_number', - fields: { - NUM: 1, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'controls_forEach', - }, - { - kind: 'block', - type: 'controls_flow_statements', - }, - ], - }, - { - kind: 'category', - name: 'Math', - categorystyle: 'math_category', - contents: [ - { - kind: 'block', - type: 'math_number', - fields: { - NUM: 123, - }, - }, - { - kind: 'block', - type: 'math_arithmetic', - inputs: { - A: { - shadow: { - type: 'math_number', - fields: { - NUM: 1, - }, - }, - }, - B: { - shadow: { - type: 'math_number', - fields: { - NUM: 1, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'math_single', - inputs: { - NUM: { - shadow: { - type: 'math_number', - fields: { - NUM: 9, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'math_trig', - inputs: { - NUM: { - shadow: { - type: 'math_number', - fields: { - NUM: 45, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'math_constant', - }, - { - kind: 'block', - type: 'math_number_property', - inputs: { - NUMBER_TO_CHECK: { - shadow: { - type: 'math_number', - fields: { - NUM: 0, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'math_round', - fields: { - OP: 'ROUND', - }, - inputs: { - NUM: { - shadow: { - type: 'math_number', - fields: { - NUM: 3.1, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'math_on_list', - fields: { - OP: 'SUM', - }, - }, - { - kind: 'block', - type: 'math_modulo', - inputs: { - DIVIDEND: { - shadow: { - type: 'math_number', - fields: { - NUM: 64, - }, - }, - }, - DIVISOR: { - shadow: { - type: 'math_number', - fields: { - NUM: 10, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'math_constrain', - inputs: { - VALUE: { - shadow: { - type: 'math_number', - fields: { - NUM: 50, - }, - }, - }, - LOW: { - shadow: { - type: 'math_number', - fields: { - NUM: 1, - }, - }, - }, - HIGH: { - shadow: { - type: 'math_number', - fields: { - NUM: 100, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'math_random_int', - inputs: { - FROM: { - shadow: { - type: 'math_number', - fields: { - NUM: 1, - }, - }, - }, - TO: { - shadow: { - type: 'math_number', - fields: { - NUM: 100, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'math_random_float', - }, - { - kind: 'block', - type: 'math_atan2', - inputs: { - X: { - shadow: { - type: 'math_number', - fields: { - NUM: 1, - }, - }, - }, - Y: { - shadow: { - type: 'math_number', - fields: { - NUM: 1, - }, - }, - }, - }, - }, - ], - }, - { - kind: 'category', - name: 'Text', - categorystyle: 'text_category', - contents: [ - { - kind: 'block', - type: 'text', - }, - { - kind: 'block', - type: 'text_join', - }, - { - kind: 'block', - type: 'text_append', - inputs: { - TEXT: { - shadow: { - type: 'text', - fields: { - TEXT: '', - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'text_length', - inputs: { - VALUE: { - shadow: { - type: 'text', - fields: { - TEXT: 'abc', - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'text_isEmpty', - inputs: { - VALUE: { - shadow: { - type: 'text', - fields: { - TEXT: '', - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'text_indexOf', - inputs: { - VALUE: { - block: { - type: 'variables_get', - }, - }, - FIND: { - shadow: { - type: 'text', - fields: { - TEXT: 'abc', - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'text_charAt', - inputs: { - VALUE: { - block: { - type: 'variables_get', - }, - }, - }, - }, - { - kind: 'block', - type: 'text_getSubstring', - inputs: { - STRING: { - block: { - type: 'variables_get', - }, - }, - }, - }, - { - kind: 'block', - type: 'text_changeCase', - inputs: { - TEXT: { - shadow: { - type: 'text', - fields: { - TEXT: 'abc', - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'text_trim', - inputs: { - TEXT: { - shadow: { - type: 'text', - fields: { - TEXT: 'abc', - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'text_count', - inputs: { - SUB: { - shadow: { - type: 'text', - }, - }, - TEXT: { - shadow: { - type: 'text', - }, - }, - }, - }, - { - kind: 'block', - type: 'text_replace', - inputs: { - FROM: { - shadow: { - type: 'text', - }, - }, - TO: { - shadow: { - type: 'text', - }, - }, - TEXT: { - shadow: { - type: 'text', - }, - }, - }, - }, - { - kind: 'block', - type: 'text_reverse', - inputs: { - TEXT: { - shadow: { - type: 'text', - }, + kind: 'block', + type: 'controls_repeat_ext', + inputs: { + TIMES: { + shadow: { + type: 'math_number', + fields: { + NUM: 3, }, }, }, - { - kind: 'block', - type: 'add_text', - inputs: { - TEXT: { - shadow: { - type: 'text', - fields: { - TEXT: 'abc', - }, - }, - }, - }, - }, - ], + }, }, { - kind: 'category', - name: 'Lists', - categorystyle: 'list_category', - contents: [ - { - kind: 'block', - type: 'lists_create_with', - }, - { - kind: 'block', - type: 'lists_create_with', - }, - { - kind: 'block', - type: 'lists_repeat', - inputs: { - NUM: { - shadow: { - type: 'math_number', - fields: { - NUM: 5, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'lists_length', - }, - { - kind: 'block', - type: 'lists_isEmpty', - }, - { - kind: 'block', - type: 'lists_indexOf', - inputs: { - VALUE: { - block: { - type: 'variables_get', - }, - }, - }, - }, - { - kind: 'block', - type: 'lists_getIndex', - inputs: { - VALUE: { - block: { - type: 'variables_get', - }, - }, - }, - }, - { - kind: 'block', - type: 'lists_setIndex', - inputs: { - LIST: { - block: { - type: 'variables_get', - }, - }, - }, - }, - { - kind: 'block', - type: 'lists_getSublist', - inputs: { - LIST: { - block: { - type: 'variables_get', - }, - }, - }, - }, - { - kind: 'block', - type: 'lists_split', - inputs: { - DELIM: { - shadow: { - type: 'text', - fields: { - TEXT: ',', - }, - }, + kind: 'block', + type: 'add_text', + inputs: { + TEXT: { + shadow: { + type: 'text', + fields: { + TEXT: 'abc', }, }, }, - { - kind: 'block', - type: 'lists_sort', - }, - { - kind: 'block', - type: 'lists_reverse', - }, - ], - }, - { - kind: 'sep', - }, - { - kind: 'category', - name: 'Variables', - categorystyle: 'variable_category', - custom: 'VARIABLE', + }, }, { - kind: 'category', - name: 'Functions', - categorystyle: 'procedure_category', - custom: 'PROCEDURE', + kind: 'block', + type: 'text', }, - ], -}; + ] +}; \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/the-end.mdx b/packages/docs/docs/codelabs/getting-started/the-end.mdx index 3ef945ecccc..914a4359d91 100644 --- a/packages/docs/docs/codelabs/getting-started/the-end.mdx +++ b/packages/docs/docs/codelabs/getting-started/the-end.mdx @@ -7,7 +7,21 @@ description: Summary of the "Getting started with Blockly" codelab. ## 10. The End -And with that, you're done with the Blockly codelab! If you'd like to continue playing with the app, we suggest adding or changing the available blocks. There are sample sound files in the `sounds` folder - try hooking them up to a new block! +And with that, you're done with your first Blockly codelab! + +### Sample app + +We provide a [sample app](https://www.npmjs.com/package/@blockly/create-package) through npm as a to help you get started with your Blockly project. What you've built today is almost identical to the sample app. + +In the future, you can use this codelab as a basis for future apps, or you can create a new sample app using the instructions on the [Blockly sample app]() page. +TODO: need a new home for the sample app + +If you're ever using the sample app in another codelab and you don't understand the code, you can consult this codelab for a walkthrough of the code in it. + +### Next steps + + +If you'd like to continue playing with the app, we suggest adding or changing the available blocks. For more documentation, visit the [Blockly developer site](/guides/get-started/what-is-blockly). diff --git a/packages/docs/package.json b/packages/docs/package.json index 3028db8e4f4..cae6c4657f5 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -27,7 +27,7 @@ "js-yaml": "^4.2.0", "prism-react-renderer": "^2.4.1", "react": "^19.2.7", - "react-dom": "^19.2.6", + "react-dom": "^19.2.7", "remark-directive": "^4.0.0" }, "devDependencies": { diff --git a/packages/docs/sidebars.js b/packages/docs/sidebars.js index b3f73202050..57cea134fad 100644 --- a/packages/docs/sidebars.js +++ b/packages/docs/sidebars.js @@ -46,13 +46,13 @@ const sidebars = { }, { type: 'doc', - label: '3. Explore the app', - id: 'codelabs/getting-started/explore-the-app', + label: '3. Add Blockly libraries', + id: 'codelabs/getting-started/add-blockly-libraries', }, { type: 'doc', - label: '4. Add Blockly libraries', - id: 'codelabs/getting-started/add-blockly-libraries', + label: '4. Add basic HTML and CS', + id: 'codelabs/getting-started/create-base-app', }, { type: 'doc', From 59c43c855fe05d01f21bbefb7d284a79b4f873d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Spriggs?= Date: Wed, 24 Jun 2026 14:15:05 -0400 Subject: [PATCH 3/8] docs: edit codelab --- .../getting-started/add-blockly-libraries.mdx | 10 ++-- .../getting-started/codelab-overview.mdx | 1 + .../create-a-blockly-workspace.mdx | 46 ++++++++++++++--- .../getting-started/create-a-custom-block.mdx | 49 +++++++++++++++---- .../getting-started/create-base-app.mdx | 13 +++-- .../generate-javaScript-code.mdx | 18 ++++--- .../getting-started/run-generated-code.mdx | 21 ++++---- .../getting-started/save-load-workspace.mdx | 36 +++++++++----- .../starter-code/src/toolbox.js | 14 +----- .../docs/codelabs/getting-started/the-end.mdx | 12 +++-- 10 files changed, 144 insertions(+), 76 deletions(-) diff --git a/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx b/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx index 466fbcb3ffb..c2181996fe4 100644 --- a/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx +++ b/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx @@ -8,8 +8,8 @@ description: How to add Blockly libraries to an app. To start, you'll need to add Blockly dependencies to your app. -Blockly releases are [published on npm](https://www.npmjs.com/package/blockly) on a quarterly basis. -There are multiple ways to import Blockly into your project, but for this codelab you will be using npm. +Blockly releases are [published on npm](https://www.npmjs.com/package/blockly) regularly. +There are multiple ways to use Blockly in your project, but for this codelab you will be installing Blockly with npm. ### Install dependencies and run your app @@ -18,7 +18,7 @@ For this codelab, you'll use npm to run your app. Use the following instructions 1. Install [node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) if you haven't already. 2. Navigate to the starter code folder `packages/docs/docs/codelabs/getting-started/starter-code` in your terminal. -3. Run `npm install` in your terminal. npm install will install the necessary dependencies that are defined in package.json, which includes Blockly. +3. Run `npm install` in your terminal. npm install will install the necessary dependencies that are defined in package.json, including Blockly. 4. Run `npm start` in your terminal. After following these steps, a browser page should open automatically, or you can copy-paste the address that includes `localhost` into your browser. @@ -26,6 +26,4 @@ The page should be blank. Don't worry, we'll add in our Blockly workspace in the ### Alternate imports -There are many ways to import a library in JavaScript, and this tutorial does not cover all of them. For samples that show how to integrate Blockly in your project, look at the `examples` folder in [blockly-samples](https://github.com/RaspberryPiFoundation/blockly-samples). - -You can also define your imports more carefully to get [different generators](https://www.npmjs.com/package/blockly#blockly-generators) and [locales](https://www.npmjs.com/package/blockly#blockly-languages). \ No newline at end of file +There are many ways to import a library in JavaScript, and this tutorial does not cover all of them. For samples that show how to integrate Blockly in your project, look at the `examples` folder in [blockly-samples](https://github.com/RaspberryPiFoundation/blockly-samples). \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx b/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx index 7d1e9c55840..37a8595fcd5 100644 --- a/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx +++ b/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx @@ -24,6 +24,7 @@ Blockly includes everything you need for defining and rendering blocks in a drag ### What you'll build A version of Blockly's sample app, built from scratch. +TODO: add screenshot! ### What you'll need diff --git a/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx b/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx index 8d67a46cc5c..230d73f469c 100644 --- a/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx +++ b/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx @@ -24,6 +24,8 @@ TODO: change image and fix alt className="codelabImage" /> +Users can drag blocks out of the toolbox and into their workspace to assemble a program. + The toolbox may be organized into categories, and may contain both single blocks or groups of blocks. A well-organized toolbox helps the user to explore the available blocks and understand the capabilities of the underlying system. A toolbox is defined as a JavaScript object and passed into the workspace constructor through an options struct. @@ -37,10 +39,32 @@ Find the file in your `src/` folder called `toolbox.js`. This is where you'll de Add the following toolbox definition to `toolbox.js`: ```js -// TODO: toolbox def +export const toolbox = { + kind: 'flyoutToolbox', + contents: [ + { + kind: 'block', + type: 'controls_repeat_ext', + inputs: { + TIMES: { + shadow: { + type: 'math_number', + fields: { + NUM: 3, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'text', + }, + ] +}; ``` -This JavaScript object defines a toolbox with a single "repeat loop" block. +This JavaScript object defines a toolbox with a "repeat loop" block and a "text" block. ### Injection @@ -59,12 +83,18 @@ For this codelab we will inject into a div with the id `"blocklyDiv"`, which was ### Create the workspace -Now add code to inject the Blockly editor in `src/index.js`. You'll first import Blockly, then set up each div from the `index.html`. -Finally, you'll inject Blockly using the toolbox you just created. +Now add code to inject the Blockly editor in `src/index.js`. Since npm has already installed Blockly, we can import Blockly using: +```js +import * as Blockly from 'blockly'; +``` +You'll also import the toolbox you just created, and make variables for each major div in `index.html`. Finally, you'll inject Blockly using the toolbox you just created. + +Copy and paste the full code into your `index.js`: ```js import * as Blockly from 'blockly'; import {toolbox} from './toolbox'; +import './index.css' // Set up UI elements and inject Blockly const codeDiv = document.getElementById('generatedCode').firstChild; @@ -89,7 +119,9 @@ You can also pass options to set Blockly's theme, modify scrolling behaviour, se ### Check your work -Make sure both `toolbox.js` and `index.js` are saved, then refresh your `localhost` page. -You should now see your blockly workspace. +Make sure that all the files you've added code to (`index.html`, `toolbox.js`, and `index.js`) are saved. You may also need to refresh your `localhost` page. + +You should now see your Blockly workspace. -TODO: add screenshot. +TODO: add the screenshot. +workspace_with_toolbox diff --git a/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx b/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx index ea718e20bff..645d306526f 100644 --- a/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx +++ b/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx @@ -13,7 +13,7 @@ Let's add a custom block to the workspace. In Blockly, a _block definition_ describes how a block looks and behaves. This includes its text, colour, and shape. It may also include which other blocks it can connect to. Blocks can be defined in either JavaScript or JSON. The developer site has a full article on [how to define a block](/guides/create-custom-blocks/define/block-definitions#how-to-create-block-definitions). -There are also more opinionated guides on things like [block design](/guides/design/blocks) and [block appearance](guides/design/apperance) that reflect recommended best practices when creating blocks. +There are also opinionated guides on topics such as [block design](/guides/design/blocks) and [block appearance](guides/design/apperance) that reflect recommended best practices when creating blocks. In this codelab we will simply provide the block definition for you to copy and use. @@ -22,8 +22,6 @@ In this codelab we will simply provide the block definition for you to copy and Imagine you want to build a block that adds text to the output div of this workspace. We'll start with the block definition, and then add the ability to generate JavaScript code with that block. -The [Anatomy of a block](/guides/create-custom-blocks/define/block-anatomy/) page describes the parts of a block in detail. - Find the `text.js` file in `src/blocks/`. Here you'll specify your block definition. Add the following code to `text.js`: ```js import * as Blockly from 'blockly/core'; @@ -50,8 +48,7 @@ const addText = { The page on [Block structure in JSON](/guides/create-custom-blocks/define/structure-json) is also a good resource for understanding the parts of a JSON block definition. -The block definition for `add_text` includes the following -Note that not all of these are required for a block definition. +The block definition for `add_text` includes the following parts, but note that there are more options and not all of these are required for a block definition. For example, `previousStatement` and `nextStatement` should be left out of a block definition if the block does not allow statements to be stacked above or below itself. - `type`: The name for this block. @@ -69,7 +66,7 @@ For example, `previousStatement` and `nextStatement` should be left out of a blo ### Create Block Definition After defining the JSON definition for the block, we'll need to create the block definition. -Add the following code to the end of `text.js` in `src/blocks/`, after your `addText` object. +Add the following code to the end of `text.js`, after your `addText` object. ```js // Create the block definitions for the JSON-only blocks. @@ -86,20 +83,52 @@ The block is all set up, now we just need to register it. Add the following impo ```js import {blocks} from './blocks/text'; +``` +Just after the import statements, insert the following code, which adds your custom block to the list of available blocks. + +```js Blockly.common.defineBlocks(blocks); ``` ### Add the custom block to the toolbox -Now we can update the toolbox to include the new block, by adding `{'kind': 'block', 'type': 'add_text'}` to our `toolbox` definition: +Now we can update the toolbox to include the new block, by adding `{'kind': 'block', 'type': 'add_text'}` to our `toolbox` definition. The full toolbox should now be: ```js -// TODO: toolbox def with custom block +export const toolbox = { + kind: 'flyoutToolbox', + contents: [ + { + kind: 'block', + type: 'controls_repeat_ext', + inputs: { + TIMES: { + shadow: { + type: 'math_number', + fields: { + NUM: 3, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'text', + }, + { + kind: 'block', + type: 'add_text', + }, + ] +}; ``` -Refresh the page. -TODO: it might glitch out bc no generator def :/ +Again, ensure that your files are saved, then check your `localhost` Blockly page. You should now see your custom `add_text` block in your toolbox! + +TODO: add screenshot + ### The block factory diff --git a/packages/docs/docs/codelabs/getting-started/create-base-app.mdx b/packages/docs/docs/codelabs/getting-started/create-base-app.mdx index 941f6d12bc8..cb791e24a40 100644 --- a/packages/docs/docs/codelabs/getting-started/create-base-app.mdx +++ b/packages/docs/docs/codelabs/getting-started/create-base-app.mdx @@ -4,9 +4,9 @@ description: How to set up the base for your app. # Getting started with Blockly -## 4. Add basic HTML and CS +## 4. Add basic HTML and CSS -### Create HTML for your page +### Create HTML Open `starter-code/src/` and find the file called `index.html`. In this file, you'll specify some basic structure for your app. You'll also make a div (here called `blocklyDiv`) that you'll later inject Blockly into. @@ -31,10 +31,9 @@ Copy and paste the following HTML into your `index.html` file. ``` -### Examine the CSS for your page +### Examine the CSS -The css for the app is already included in `index.css`. This codelab just includes basic styling for the webpage itself. +The css for the app is already included in `index.css`. This codelab includes basic styling for the webpage. -If you would like to change the theme of Blockly, you can check out the [customizing your themes codelab](/codelabs/theme-extension-identifier/codelab-overview/) for an overview. - -There is also a [css codelab](codelabs/css/codelab-overview/) that offers a walkthrough of more fine-grained styling. \ No newline at end of file +If you would like to change the theme of Blockly, you can check out the [customizing your themes codelab](/codelabs/theme-extension-identifier/codelab-overview/). +For more fine-grained styling of components and blocks, you can consult the [CSS codelab](codelabs/css/codelab-overview/). \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx b/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx index 08c3a6418c3..74eb35c76c5 100644 --- a/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx +++ b/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx @@ -16,11 +16,8 @@ This generated code will be run by the browser, effectively executing the blocks A _language generator_ defines the rules for generating a specific language (such as indentation). -Blockly can generate code from blocks for five different languages: Dart, JavaScript, Lua, PHP, and Python. -You can also create a custom code generator to generate code in a different language, which the [custom generator codelab]() walks through. - -TODO: gotta figure out the imports stuff -As previously mentioned, you can define your imports more carefully to get a [different generator](https://www.npmjs.com/package/blockly#blockly-generators). +By default, Blockly can generate code from blocks for five languages: Dart, JavaScript, Lua, PHP, and Python. +You can also create a custom language generator to generate code in a different language, which the [custom generator codelab](/codelabs/custom-generator/codelab-overview/) describes. ### Add a block generator @@ -28,16 +25,19 @@ When Blockly generates JavaScript code for blocks in a workspace, it translates Find the `javascript.js` file in `src/generators/`. This is where you will tell Blockly's JavaScript generator how to generate code for the add text block. -Add the following code to the bottom of `src/sound_blocks.js`: +The block generator for `add_text`, will first recursively generate the code for the input `'TEXT'`. +Then, it provides the function that will add the text to the output area. Finally, it creates the function call that will be generated for this block. -TODO: explain this code a bit +Add the following code to the bottom of `src/generators/javascript.js`: ```js import {Order} from 'blockly/javascript'; export const forBlock = Object.create(null); forBlock['add_text'] = function (block, generator) { + // Generate the code for the input block. const text = generator.valueToCode(block, 'TEXT', Order.NONE) || "''"; + // Create the function for this block. const addText = generator.provideFunction_( 'addText', `function ${generator.FUNCTION_NAME_PLACEHOLDER_}(text) { @@ -57,7 +57,7 @@ forBlock['add_text'] = function (block, generator) { The code that this generates is a JavaScript function which adds text to the output area. -With this translation function, the following `add_text` block: +With this translation function, the following `add_text` block with a string input: TODO: update image!! { }; ``` -### Automatically run the code +### Run the code Now, we need to actually call this `runCode` function. First let's consider the scenario where there's some state that needs to be loaded up. We'll want to load that state right away, and run the code as well. @@ -67,12 +67,16 @@ load(ws); runCode(); ``` -Since this code is simply declared in `index.js`, it'll only run once, upon load of the workspace. +Since this code is simply declared in `index.js`, it'll only run whenever the workspace is loaded (or reloaded). We want the code to run any time a block is added or changed in the workspace. This sounds like another job for change listeners! +### Add a change listener + Similar to our last change listener, we'll want to exclude certain types of events. This time, in addition to ignoring UI Events, we'll ignore an event that fires when the workspace has finished loading, since this would be redundant with the code we just added. We'll also disregard anything that fires when a block is currently being dragged so that we don't save an invalid state. -For all other events, this change listener will call `runCode()` +For all other events, this change listener will call `runCode()`. + +Copy and paste the following code at the bottom of `index.js`: ```js // Whenever the workspace changes meaningfully, run the code again. @@ -91,8 +95,7 @@ ws.addChangeListener((e) => { }); ``` - -TODO: add a try catch to sample app? this would be good!!!!!! +{/* TODO: add a try catch to sample app? this would be good!!!!!! Finally, execute the script with the `eval` function. Wrap it in a `try/catch` so that any runtime errors are logged to the console, instead of failing quietly: ```js @@ -101,7 +104,7 @@ try { } catch (error) { console.log(error); } -``` +``` */} ### A note on eval diff --git a/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx b/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx index 8b3d21efa2d..e67e63d525f 100644 --- a/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx +++ b/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx @@ -6,9 +6,8 @@ description: How to save and load your workspace. ## 7. Save/load workspace -You now have a Blockly workspace. However, if you reload the page, you'll find that all your blocks disappear! -Your users likely won't want their blocks to vanish, so let's add some serialization. -In this case, we'll save the state of the workspace to local browser storage, so that if you reload or close the tab, +You now have a Blockly workspace. However, if you reload the page, you'll find that any blocks you've dragged into the workspace will disappear! +Your users likely won't want their blocks to vanish, so let's save the state of the workspace in local browser storage. ### Add the save method @@ -33,7 +32,7 @@ export const save = function (workspace) { ### Add the load method -Similarly, when a user opens or reloads the page, the blocks in local storage should be loaded back into the workspace. +When a user opens or reloads the page, the blocks in local storage should be loaded back into the workspace. In the `src/serialization.js `file, add the `load` function. `load` checks for items in local storage and loads them into the workspace. @@ -53,28 +52,38 @@ export const load = function (workspace) { }; ``` -TODO: assess whether this needs to be split into a new page ### Events You may have noticed that the `load` function disables events from emitting while loading the workspace. -Every change on the workspace triggers an event. For example, when a user drags a block into the workspace or connects two blocks, these actions will trigger events. +Every change on the workspace, like dragging a block or connecting blocks, triggers an *event*. You can listen in to the *event stream* to run code when certain events happen. -In this case, disabling events while loading will help prevent unexpected behavior, since some parts of Blockly listen to the event stream to know when to execute. +For the `load` function, disabling events while loading will help prevent unexpected behavior, since some parts of Blockly listen to the event stream to know when to execute. -We can take advantage of the events stream to know when to call the `save` and `load` functions that you just implemented. +We can take advantage of the event stream to know when to call the `save` and `load` functions. ### Add a Change Listener -In `src/index.js`, add the following import statement so that you can use the `save` and `load` functions from `serialization.js`. +In `src/index.js`, add the following import statement. ```js import {save, load} from './serialization'; ``` -Now, you'll add a `ChangeListener` to listen to the event stream. Every time an event fires, this function will trigger and save the workspace. +Now, you'll add a `ChangeListener` at the bottom of `index.js` to listen to the event stream. +In the code below, every time an event fires, this function will trigger and save the workspace. -There are some types of events that we don't need to save after. -Whenever the user changes something about the UI by scrolling, zooming, or opening toolbox categories, we don't want to save the workspace because these changes don't actually the data of the workspace. -These types of events are called UI Events, so we'll ignore UI events in the `ChangeListener`. +```js +// Every time the workspace changes state, save the changes to storage. +ws.addChangeListener((e) => { + save(ws); +}); +``` + +This change listener is not yet complete because there are some types of events that we shouldn't save after. +UI changes (e.g. scrolling, zooming, or opening toolbox categories) change how the workspace *looks* but don't change the state of the blocks. +Because we're only saving the blocks, we won't save after these types of events. +These types of events are called UI events, so we'll add a check to ignore UI events in the `ChangeListener`. + +Here's the full code: ```js // Every time the workspace changes state, save the changes to storage. @@ -89,4 +98,5 @@ ws.addChangeListener((e) => { To learn more about the events stream, see the [Events documentation](/guides/configure/events/). ### Testing the changes + Now, test the code. Add some blocks, then reload the page. The workspace should still contain the blocks you added. diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js b/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js index 47964dbb672..6baaacfdbbd 100644 --- a/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js @@ -17,21 +17,11 @@ export const toolbox = { }, { kind: 'block', - type: 'add_text', - inputs: { - TEXT: { - shadow: { - type: 'text', - fields: { - TEXT: 'abc', - }, - }, - }, - }, + type: 'text', }, { kind: 'block', - type: 'text', + type: 'add_text', }, ] }; \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/the-end.mdx b/packages/docs/docs/codelabs/getting-started/the-end.mdx index 914a4359d91..9462d7993f6 100644 --- a/packages/docs/docs/codelabs/getting-started/the-end.mdx +++ b/packages/docs/docs/codelabs/getting-started/the-end.mdx @@ -13,13 +13,17 @@ And with that, you're done with your first Blockly codelab! We provide a [sample app](https://www.npmjs.com/package/@blockly/create-package) through npm as a to help you get started with your Blockly project. What you've built today is almost identical to the sample app. -In the future, you can use this codelab as a basis for future apps, or you can create a new sample app using the instructions on the [Blockly sample app]() page. -TODO: need a new home for the sample app +In the future, you can use this codelab as a basis for future Blockly projects, or you can create a new sample app using the instructions on the [Blockly sample app]() page. +TODO: need a new home for the sample app page -If you're ever using the sample app in another codelab and you don't understand the code, you can consult this codelab for a walkthrough of the code in it. +One key difference to note between this codelab and the sample app is that the sample app's toolbox includes *all* of Blockly's built-in blocks. +Keep in mind that we strongly recommend against using every built-in block in your Blockly project, you should instead carefully select the blocks that your users may actually need. -### Next steps +### Updating Blockly with npm + +TODO: Add this section? +### Next steps If you'd like to continue playing with the app, we suggest adding or changing the available blocks. From 7f78d1b5a76ca60e22e2f6d991810832bd68a937 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Spriggs?= Date: Thu, 25 Jun 2026 16:00:33 -0400 Subject: [PATCH 4/8] docs: continue editing new getting-started, add images --- .../getting-started/add-blockly-libraries.mdx | 2 +- .../getting-started/codelab-overview.mdx | 7 ++- .../create-a-blockly-workspace.mdx | 26 +++++---- .../getting-started/create-a-custom-block.mdx | 39 +++++-------- .../getting-started/create-base-app.mdx | 4 +- .../generate-javaScript-code.mdx | 16 +++--- .../getting-started/run-generated-code.mdx | 33 ++++++----- .../getting-started/save-load-workspace.mdx | 16 +++--- .../docs/codelabs/getting-started/setup.mdx | 2 +- .../getting-started/starter-code/package.json | 2 +- .../starter-code/src/toolbox.js | 27 --------- .../docs/codelabs/getting-started/the-end.mdx | 14 ++--- .../get-started/sample-app-overview.mdx | 53 ++++++++++++++++++ packages/docs/sidebars.js | 5 ++ .../d4_three_times.png | Bin .../edit_mode_unimplemented.png | Bin .../{ => REMOVE OLD PHOTOS}/play_mode.png | Bin .../play_sound_block.png | Bin .../toolbox_two_blocks.png | Bin .../workspace_with_loop.png | Bin .../workspace_with_loops.png | Bin .../workspace_with_toolbox.png | Bin 0 -> 7539 bytes .../getting-started/add_text_block.png | Bin 0 -> 16614 bytes .../getting-started/full_page_finished.png | Bin 0 -> 230381 bytes .../full_page_first_toolbox.png | Bin 0 -> 102964 bytes .../full_page_second_toolbox.png | Bin 0 -> 114222 bytes .../workspace_with_toolbox.png | Bin 7539 -> 66366 bytes 27 files changed, 135 insertions(+), 111 deletions(-) create mode 100644 packages/docs/docs/guides/get-started/sample-app-overview.mdx rename packages/docs/static/images/codelabs/getting-started/{ => REMOVE OLD PHOTOS}/d4_three_times.png (100%) rename packages/docs/static/images/codelabs/getting-started/{ => REMOVE OLD PHOTOS}/edit_mode_unimplemented.png (100%) rename packages/docs/static/images/codelabs/getting-started/{ => REMOVE OLD PHOTOS}/play_mode.png (100%) rename packages/docs/static/images/codelabs/getting-started/{ => REMOVE OLD PHOTOS}/play_sound_block.png (100%) rename packages/docs/static/images/codelabs/getting-started/{ => REMOVE OLD PHOTOS}/toolbox_two_blocks.png (100%) rename packages/docs/static/images/codelabs/getting-started/{ => REMOVE OLD PHOTOS}/workspace_with_loop.png (100%) rename packages/docs/static/images/codelabs/getting-started/{ => REMOVE OLD PHOTOS}/workspace_with_loops.png (100%) create mode 100644 packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_toolbox.png create mode 100644 packages/docs/static/images/codelabs/getting-started/add_text_block.png create mode 100644 packages/docs/static/images/codelabs/getting-started/full_page_finished.png create mode 100644 packages/docs/static/images/codelabs/getting-started/full_page_first_toolbox.png create mode 100644 packages/docs/static/images/codelabs/getting-started/full_page_second_toolbox.png diff --git a/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx b/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx index c2181996fe4..87c4c4e5182 100644 --- a/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx +++ b/packages/docs/docs/codelabs/getting-started/add-blockly-libraries.mdx @@ -16,7 +16,7 @@ There are multiple ways to use Blockly in your project, but for this codelab you For this codelab, you'll use npm to run your app. Use the following instructions 1. Install [node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) if you haven't already. -2. Navigate to the starter code folder `packages/docs/docs/codelabs/getting-started/starter-code` +2. Navigate to the starter code folder `packages/docs/docs/codelabs/getting-started/starter-code/` in your terminal. 3. Run `npm install` in your terminal. npm install will install the necessary dependencies that are defined in package.json, including Blockly. 4. Run `npm start` in your terminal. diff --git a/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx b/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx index 37a8595fcd5..61fd99a7dbb 100644 --- a/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx +++ b/packages/docs/docs/codelabs/getting-started/codelab-overview.mdx @@ -24,7 +24,12 @@ Blockly includes everything you need for defining and rendering blocks in a drag ### What you'll build A version of Blockly's sample app, built from scratch. -TODO: add screenshot! + +Blockly workspace with a toolbox, blocks, and a code preview window that shows code generated from blocks in the workspace. ### What you'll need diff --git a/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx b/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx index 230d73f469c..03d4b93fea0 100644 --- a/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx +++ b/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx @@ -14,23 +14,24 @@ In this section you will learn how to add a workspace to your app, including how A Blockly workspace has two main components: -- The area where the user assembles their blocks (the white area). - A toolbox that contains all blocks that are available to the user (the grey area). +- The area where the user assembles their blocks (the white area). -TODO: change image and fix alt A Blockly workspace with two blocks +/> Users can drag blocks out of the toolbox and into their workspace to assemble a program. -The toolbox may be organized into categories, and may contain both single blocks or groups of blocks. A well-organized toolbox helps the user to explore the available blocks and understand the capabilities of the underlying system. +The toolbox may be organized into categories (a *category* toolbox) or have all blocks visible at all times (a *flyout* toolbox). Toolboxes may contain both single blocks or groups of blocks. +A well-organized toolbox helps the user to explore the available blocks and understand the capabilities of the underlying system. A toolbox is defined as a JavaScript object and passed into the workspace constructor through an options struct. -For more information on this JSON format and toolbox configuration, including category creation, please see our toolbox documentation. +For more information on this JSON format and toolbox configuration, including category creation, please see our [toolbox documentation](/guides/configure/toolboxes/toolbox). +If you'd like to customize the appearance of your toolbox, you can consult the [toolbox customization codelab](/codelabs/custom-toolbox/codelab-overview/). ### Define the toolbox @@ -64,7 +65,7 @@ export const toolbox = { }; ``` -This JavaScript object defines a toolbox with a "repeat loop" block and a "text" block. +This JavaScript object defines a flyout toolbox with a "repeat loop" block and a "text" block. ### Injection @@ -115,7 +116,7 @@ For example: - `toolboxPosition`: Whether to show the toolbox at the top or bottom of the workspace. - `maxBlocks`: The maximum number of blocks that may be created in the workspace. -You can also pass options to set Blockly's theme, modify scrolling behaviour, set the renderer, and more. For more information, head over to Blockly's developer site and check out the [configuration](/guides/configure/configuration_struct#the-options-dictionary) section. +You can also pass options to set Blockly's theme, modify scrolling behaviour, set the renderer, and more. For more information, see the [configuration](/guides/configure/configuration_struct#the-options-dictionary) documentation. ### Check your work @@ -123,5 +124,8 @@ Make sure that all the files you've added code to (`index.html`, `toolbox.js`, a You should now see your Blockly workspace. -TODO: add the screenshot. -workspace_with_toolbox +A webpage with a space for generated code, a Blockly toolbox with two blocks in it, and a Blockly workspace. \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx b/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx index 645d306526f..d14fc694121 100644 --- a/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx +++ b/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx @@ -8,21 +8,21 @@ import Image from '@site/src/components/Image'; ## 6. Create a custom block -Let's add a custom block to the workspace. +Now, you'll add a custom block to the workspace. In Blockly, a _block definition_ describes how a block looks and behaves. This includes its text, colour, and shape. It may also include which other blocks it can connect to. Blocks can be defined in either JavaScript or JSON. The developer site has a full article on [how to define a block](/guides/create-custom-blocks/define/block-definitions#how-to-create-block-definitions). There are also opinionated guides on topics such as [block design](/guides/design/blocks) and [block appearance](guides/design/apperance) that reflect recommended best practices when creating blocks. -In this codelab we will simply provide the block definition for you to copy and use. +In this codelab we will provide the block definition for you to copy and use. ### Define the add_text block -Imagine you want to build a block that adds text to the output div of this workspace. -We'll start with the block definition, and then add the ability to generate JavaScript code with that block. +Imagine you want to build a block that adds text to the output div of this workspace. You'll start with the block definition and then add the ability to generate JavaScript code with that block. Find the `text.js` file in `src/blocks/`. Here you'll specify your block definition. Add the following code to `text.js`: + ```js import * as Blockly from 'blockly/core'; @@ -46,22 +46,10 @@ const addText = { }; ``` -The page on [Block structure in JSON](/guides/create-custom-blocks/define/structure-json) is also a good resource for understanding the parts of a JSON block definition. - -The block definition for `add_text` includes the following parts, but note that there are more options and not all of these are required for a block definition. -For example, `previousStatement` and `nextStatement` should be left out of a block definition if the block does not allow statements to be stacked above or below itself. +This block definition defines a block called `add_text` that has one `string` value input called `TEXT`. There is a message on the block that says "Add text" before the input. +The `add_text` block also has a previous connection and a next connection, allowing it to be stacked vertically. -- `type`: The name for this block. -- `message0`: The label for the block. -- `args0`: The inputs to the block. - - `type`: The type of input. - - `name`: The unique name of the input. - - `check`: The expected type of the input. -- `previousStatement`: Include if other statements can be stacked above this block. -- `nextStatement`: Include if other statements can be stacked below this block. -- `colour`: The color of the block. -- `tooltip`: A message that displays when the user hovers their mouse over the block. -- `helpUrl`: The URL that a user is sent to after right-clicking the block and selecting 'Help'. +The page on [Block structure in JSON](/guides/create-custom-blocks/define/structure-json) is a good resource for understanding the parts of a JSON block definition. ### Create Block Definition @@ -79,13 +67,13 @@ export const blocks = Blockly.common.createBlockDefinitionsFromJsonArray([ ### Register the custom block -The block is all set up, now we just need to register it. Add the following import statement and code to the top of `src/index.js` +The block is set up, now you need to register it. Add the following import statement and code to the top of the `index.js` file: ```js import {blocks} from './blocks/text'; ``` -Just after the import statements, insert the following code, which adds your custom block to the list of available blocks. +Just after the import statements, insert the following code in `index.js`, which adds your custom block to the list of available blocks. ```js Blockly.common.defineBlocks(blocks); @@ -93,7 +81,7 @@ Blockly.common.defineBlocks(blocks); ### Add the custom block to the toolbox -Now we can update the toolbox to include the new block, by adding `{'kind': 'block', 'type': 'add_text'}` to our `toolbox` definition. The full toolbox should now be: +Now you can update the toolbox to include the new block, by adding `{'kind': 'block', 'type': 'add_text'}` to the `toolbox` definition. The full toolbox should now be: ```js export const toolbox = { @@ -127,8 +115,11 @@ export const toolbox = { Again, ensure that your files are saved, then check your `localhost` Blockly page. You should now see your custom `add_text` block in your toolbox! -TODO: add screenshot - +A webpage with a space for generated code, a Blockly toolbox with three blocks in it, and a Blockly workspace. ### The block factory diff --git a/packages/docs/docs/codelabs/getting-started/create-base-app.mdx b/packages/docs/docs/codelabs/getting-started/create-base-app.mdx index cb791e24a40..37fb715c597 100644 --- a/packages/docs/docs/codelabs/getting-started/create-base-app.mdx +++ b/packages/docs/docs/codelabs/getting-started/create-base-app.mdx @@ -7,7 +7,7 @@ description: How to set up the base for your app. ## 4. Add basic HTML and CSS ### Create HTML -Open `starter-code/src/` and find the file called `index.html`. In this file, you'll specify some basic structure for your app. +Open the `src/` folder and find the file called `index.html`. In this file, you'll specify some basic structure for your app. You'll also make a div (here called `blocklyDiv`) that you'll later inject Blockly into. Copy and paste the following HTML into your `index.html` file. @@ -33,7 +33,7 @@ Copy and paste the following HTML into your `index.html` file. ### Examine the CSS -The css for the app is already included in `index.css`. This codelab includes basic styling for the webpage. +The css for the app is already included in the `index.css` file. This codelab includes basic styling for the webpage. If you would like to change the theme of Blockly, you can check out the [customizing your themes codelab](/codelabs/theme-extension-identifier/codelab-overview/). For more fine-grained styling of components and blocks, you can consult the [CSS codelab](codelabs/css/codelab-overview/). \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx b/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx index 74eb35c76c5..05dfb605a53 100644 --- a/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx +++ b/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx @@ -25,10 +25,11 @@ When Blockly generates JavaScript code for blocks in a workspace, it translates Find the `javascript.js` file in `src/generators/`. This is where you will tell Blockly's JavaScript generator how to generate code for the add text block. -The block generator for `add_text`, will first recursively generate the code for the input `'TEXT'`. -Then, it provides the function that will add the text to the output area. Finally, it creates the function call that will be generated for this block. +The block generator for `add_text` will first recursively generate the code for the input `TEXT`. +Then, it provides the function that will add text to the output area. Finally, it creates the function call that will be generated for this block. Add the following code to the bottom of `src/generators/javascript.js`: + ```js import {Order} from 'blockly/javascript'; @@ -55,14 +56,11 @@ forBlock['add_text'] = function (block, generator) { }; ``` -The code that this generates is a JavaScript function which adds text to the output area. - -With this translation function, the following `add_text` block with a string input: +With this translation function, the `add_text` block with a string input of "Hello, World!": -TODO: update image!! image @@ -77,7 +75,7 @@ addText(text) { outputDiv.appendChild(textEl); }; -addText("Hello, world!"); +addText("Hello, World!"); ``` For more information on block generators, read the [generating code](/guides/create-custom-blocks/code-generation/overview#block-code-generators) page on the developer site. \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/run-generated-code.mdx b/packages/docs/docs/codelabs/getting-started/run-generated-code.mdx index 7166ee439c4..ec88a3e0a16 100644 --- a/packages/docs/docs/codelabs/getting-started/run-generated-code.mdx +++ b/packages/docs/docs/codelabs/getting-started/run-generated-code.mdx @@ -8,16 +8,16 @@ import Image from '@site/src/components/Image'; ## 9. Run generated code -Although you now have the generator to make code for your new block, the code doesn't get displayed or executed. -In the following step, we will add logic to display the generated code and automatically execute the code. +Now you have the block generator to make code for the `add_text` block, but the block generator must be registered and used for you to see or run your code. +In the following steps, you'll add logic to display the generated code and automatically run it. -Add the following imports to `index.js`: +Add the following imports to the `index.js` file: ```js import {forBlock} from './generators/javascript'; import {javascriptGenerator} from 'blockly/javascript'; ``` -Your `index.js` should now have 7 total import statements: +The `index.js` file should now have 7 total import statements: ```js import * as Blockly from 'blockly'; import {blocks} from './blocks/text'; @@ -37,9 +37,11 @@ Object.assign(javascriptGenerator.forBlock, forBlock); ### Write the function -The following function uses Blockly's javascriptGenerator to generate the code for the blocks on the workspace. +The `runCode` function uses Blockly's javascriptGenerator to generate the code for the blocks on the workspace. Then it displays the code in the codeDiv, resets the outputDiv, and evaluates the JavaScript code. +Paste the following code into `index.js`, right below your Blockly injection: + ```js // This function resets the code and output divs, shows the // generated code from the workspace, and evals the code. @@ -57,9 +59,9 @@ const runCode = () => { ### Run the code Now, we need to actually call this `runCode` function. -First let's consider the scenario where there's some state that needs to be loaded up. We'll want to load that state right away, and run the code as well. +First, consider the scenario when your app is first loading up. You'll want load in any saved data (if it exists) and run the code automatically. -Add the following lines of code to `index.js` beneath your `runCode` function. +Add the following lines of code to `index.js` beneath your `runCode` function: ```js // Load the initial state from storage and run the code. @@ -67,13 +69,13 @@ load(ws); runCode(); ``` -Since this code is simply declared in `index.js`, it'll only run whenever the workspace is loaded (or reloaded). -We want the code to run any time a block is added or changed in the workspace. This sounds like another job for change listeners! +Since this code is simply declared in the `index.js` file and isn't a part of any function, it'll only run whenever the workspace is loaded (or reloaded). +You also want the code to run any time a block is added or changed in the workspace. This sounds like another job for change listeners. ### Add a change listener -Similar to our last change listener, we'll want to exclude certain types of events. This time, in addition to ignoring UI Events, we'll ignore an event that fires when the workspace has finished loading, since this would be redundant with the code we just added. -We'll also disregard anything that fires when a block is currently being dragged so that we don't save an invalid state. +Similar to the last change listener, you'll want to exclude certain types of events. This time, in addition to ignoring UI Events, we'll ignore the event that fires when the workspace has finished loading, since this would be redundant with the code we just added. +We'll also disregard anything that fires when a block is currently being dragged, so that we don't save an invalid state. For all other events, this change listener will call `runCode()`. Copy and paste the following code at the bottom of `index.js`: @@ -112,13 +114,10 @@ Executing scripts with eval is not always the safest option - we use it here for ### Test it -Run the app and try it out! Try making a simple program by putting the add text block into a loop. - -You can set the text, and it should display in the output window as seen below. +Run the app and try it out! Try making a simple program by putting the add text block, with a text input, into a loop. -TODO: update image! image \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx b/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx index e67e63d525f..574f73b9e42 100644 --- a/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx +++ b/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx @@ -6,14 +6,14 @@ description: How to save and load your workspace. ## 7. Save/load workspace -You now have a Blockly workspace. However, if you reload the page, you'll find that any blocks you've dragged into the workspace will disappear! +You now have a Blockly workspace. However, if you reload the page, you'll find that any blocks you've dragged into the workspace will disappear. Your users likely won't want their blocks to vanish, so let's save the state of the workspace in local browser storage. ### Add the save method -Open `src/serialization.js`. We'll set a unique storage key for this codelab. `save` takes the Blockly workspace, exports its state to a JavaScript object, then saves that object to local storage. +Open `src/serialization.js`. You'll set a unique storage key for this codelab. Then you'll add a function `save` which takes the Blockly workspace, exports its state to a JavaScript object, then saves that object to local storage. -Add the following code to `serialization.js`: +Add the following code to the `serialization.js` file: ```js import * as Blockly from 'blockly/core'; @@ -34,7 +34,7 @@ export const save = function (workspace) { When a user opens or reloads the page, the blocks in local storage should be loaded back into the workspace. -In the `src/serialization.js `file, add the `load` function. `load` checks for items in local storage and loads them into the workspace. +In the `serialization.js` file, add the following `load` function. `load` checks for items in local storage and loads them into the workspace. ```js /** @@ -59,7 +59,7 @@ Every change on the workspace, like dragging a block or connecting blocks, trigg For the `load` function, disabling events while loading will help prevent unexpected behavior, since some parts of Blockly listen to the event stream to know when to execute. -We can take advantage of the event stream to know when to call the `save` and `load` functions. +You can take advantage of the event stream to know when to call the `save` and `load` functions. ### Add a Change Listener In `src/index.js`, add the following import statement. @@ -68,7 +68,7 @@ In `src/index.js`, add the following import statement. import {save, load} from './serialization'; ``` -Now, you'll add a `ChangeListener` at the bottom of `index.js` to listen to the event stream. +Now, you'll add a change listener at the bottom of `index.js` to listen to the event stream. In the code below, every time an event fires, this function will trigger and save the workspace. ```js @@ -81,9 +81,9 @@ ws.addChangeListener((e) => { This change listener is not yet complete because there are some types of events that we shouldn't save after. UI changes (e.g. scrolling, zooming, or opening toolbox categories) change how the workspace *looks* but don't change the state of the blocks. Because we're only saving the blocks, we won't save after these types of events. -These types of events are called UI events, so we'll add a check to ignore UI events in the `ChangeListener`. +These types of events are called UI events, so we'll add a check to ignore UI events in the change listener. -Here's the full code: +Here's the full change listener code: ```js // Every time the workspace changes state, save the changes to storage. diff --git a/packages/docs/docs/codelabs/getting-started/setup.mdx b/packages/docs/docs/codelabs/getting-started/setup.mdx index 0c8a2be57a1..f9d30aeecd4 100644 --- a/packages/docs/docs/codelabs/getting-started/setup.mdx +++ b/packages/docs/docs/codelabs/getting-started/setup.mdx @@ -20,7 +20,7 @@ git clone https://github.com/RaspberryPiFoundation/blockly.git If you downloaded the source as a zip, unpacking it should give you a root folder named `blockly-main`. -The relevant files are in `packages/docs/docs/codelabs/getting-started`. There are two versions of the app: +The relevant files are in the `packages/docs/docs/codelabs/getting-started/` folder. There are two versions of the app: - `starter-code/`: The starter code that you'll build upon in this codelab. - `complete-code/`: The code after completing the codelab, in case you get lost or want to compare to your version. diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/package.json b/packages/docs/docs/codelabs/getting-started/starter-code/package.json index f4d9397180c..2551514c792 100644 --- a/packages/docs/docs/codelabs/getting-started/starter-code/package.json +++ b/packages/docs/docs/codelabs/getting-started/starter-code/package.json @@ -24,6 +24,6 @@ "webpack-dev-server": "^5.0.4" }, "dependencies": { - "blockly": "^12.0.0" + "blockly": "^13.0.0" } } \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js b/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js index 6baaacfdbbd..e69de29bb2d 100644 --- a/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js +++ b/packages/docs/docs/codelabs/getting-started/starter-code/src/toolbox.js @@ -1,27 +0,0 @@ -export const toolbox = { - kind: 'flyoutToolbox', - contents: [ - { - kind: 'block', - type: 'controls_repeat_ext', - inputs: { - TIMES: { - shadow: { - type: 'math_number', - fields: { - NUM: 3, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'text', - }, - { - kind: 'block', - type: 'add_text', - }, - ] -}; \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/the-end.mdx b/packages/docs/docs/codelabs/getting-started/the-end.mdx index 9462d7993f6..46d8993fdbf 100644 --- a/packages/docs/docs/codelabs/getting-started/the-end.mdx +++ b/packages/docs/docs/codelabs/getting-started/the-end.mdx @@ -11,22 +11,18 @@ And with that, you're done with your first Blockly codelab! ### Sample app -We provide a [sample app](https://www.npmjs.com/package/@blockly/create-package) through npm as a to help you get started with your Blockly project. What you've built today is almost identical to the sample app. +We provide a [sample app](https://www.npmjs.com/package/@blockly/create-package) through npm as a way to help you get started with your Blockly project. What you've built today is almost identical to the sample app. -In the future, you can use this codelab as a basis for future Blockly projects, or you can create a new sample app using the instructions on the [Blockly sample app]() page. +In the future, you can use this codelab as a basis for future Blockly projects, or you can create a new sample app using the instructions on the [Blockly sample app](/guides/get-started/sample-app-overview) page. TODO: need a new home for the sample app page One key difference to note between this codelab and the sample app is that the sample app's toolbox includes *all* of Blockly's built-in blocks. -Keep in mind that we strongly recommend against using every built-in block in your Blockly project, you should instead carefully select the blocks that your users may actually need. - -### Updating Blockly with npm - -TODO: Add this section? +We strongly recommend against using every built-in block in your Blockly project. Instead, you should carefully select the blocks that your users may need. ### Next steps If you'd like to continue playing with the app, we suggest adding or changing the available blocks. -For more documentation, visit the [Blockly developer site](/guides/get-started/what-is-blockly). +For more documentation and codelabs, visit the [Blockly developer site](/). -Additionally, Blockly has an active [developer forum](https://groups.google.com/g/blockly). Please drop by and say hello. We're happy to answer any questions or give advice on best practices for building an app with Blockly. Feel free to show us your prototypes early; collectively we have a lot of experience and can offer hints which will save you time. +Additionally, Blockly has an active [developer forum](https://groups.google.com/g/blockly). Please drop by and say hello. We're happy to answer any questions or give advice on best practices for building an app with Blockly. Feel free to show us your prototypes early; collectively we have a lot of experience and can offer help. diff --git a/packages/docs/docs/guides/get-started/sample-app-overview.mdx b/packages/docs/docs/guides/get-started/sample-app-overview.mdx new file mode 100644 index 00000000000..2b37a8c7775 --- /dev/null +++ b/packages/docs/docs/guides/get-started/sample-app-overview.mdx @@ -0,0 +1,53 @@ +# Blockly Sample App + +## Purpose + +The Blockly sample app illustrates how to use Blockly together with common programming tools like node/npm, webpack, typescript, eslint, and others. You can use it as the starting point for your own application and modify it as much as you'd like. It contains basic infrastructure for running, building, testing, etc. that you can use even if you don't understand how to configure the related tool yet. When your needs outgrow the functionality provided here, you can replace the provided configuration or tool with your own. + +## Quick Start + +1. [Install](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) npm if you haven't before. +2. Run [`npx @blockly/create-package app `](https://www.npmjs.com/package/@blockly/create-package) to clone this application to your own machine. +3. Run `npm install` to install the required dependencies. +4. Run `npm run start` to run the development server and see the app in action. +5. If you make any changes to the source code, just save your changes and refresh the browser while the server is running to see them. + +## Tooling + +The application uses many of the same tools that the Blockly team uses to develop Blockly itself. Following is a brief overview, and you can read more about them on our [developer site](https://developers.google.com/blockly/guides/contribute/get-started/development_tools). + +- Structure: The application is built as an npm package. You can use npm to manage the dependencies of the application. +- Modules: ES6 modules to handle imports to/exports from other files. +- Building/bundling: Webpack to build the source code and bundle it into one file for serving. +- Development server: webpack-dev-server to run locally while in development. +- Testing: Mocha to run unit tests. +- Linting: Eslint to lint the code and ensure it conforms with a standard style. +- UI Framework: Does not use a framework. For more complex applications, you may wish to integrate a UI framework like React or Angular. + +You can disable, reconfigure, or replace any of these tools at any time, but they are preconfigured to get you started developing your Blockly application quickly. + +## Structure + +- `package.json` contains basic information about the app. This is where the scripts to run, build, etc. are listed. +- `package-lock.json` is used by npm to manage dependencies +- `webpack.config.js` is the configuration for webpack. This handles bundling the application and running our development server. +- `src/` contains the rest of the source code. +- `dist/` contains the packaged output (that you could host on a server, for example). This is ignored by git and will only appear after you run `npm run build` or `npm run start`. + +### Source Code + +To get an in-depth overview of the sample app's source code, see the [getting started codelab](/codelabs/getting-started) which goes through the process of creating this app. +Here is a briefer overview of the files in the source code: + +- `index.html` contains the skeleton HTML for the page. This file is modified during the build to import the bundled source code output by webpack. +- `index.js` is the entry point of the app. It configures Blockly and sets up the page to show the blocks, the generated code, and the output of running the code in JavaScript. +- `serialization.js` has code to save and load the workspace using the browser's local storage. This is how your workspace is saved even after refreshing or leaving the page. You could replace this with code that saves the user's data to a cloud database instead. +- `toolbox.js` contains the toolbox definition for the app. The current toolbox contains nearly every block that Blockly provides out of the box. You probably want to replace this definition with your own toolbox that uses your custom blocks and only includes the default blocks that are relevant to your application. +- `blocks/text.js` has code for a custom text block, just as an example of creating your own blocks. You probably want to delete this block, and add your own blocks in this directory. +- `generators/javascript.js` contains the JavaScript generator for the custom text block. You'll need to include block generators for any custom blocks you create, in whatever programming language(s) your application will use. + +## Serving + +To run your app locally, run `npm run start` to run the development server. This mode generates source maps and ingests the source maps created by Blockly, so that you can debug using unminified code. + +To deploy your app so that others can use it, run `npm run build` to run a production build. This will bundle your code and minify it to reduce its size. You can then host the contents of the `dist` directory on a web server of your choosing. If you're just getting started, try using [GitHub Pages](https://pages.github.com/). diff --git a/packages/docs/sidebars.js b/packages/docs/sidebars.js index 57cea134fad..30672fcbe00 100644 --- a/packages/docs/sidebars.js +++ b/packages/docs/sidebars.js @@ -479,6 +479,11 @@ const sidebars = { label: 'Get started codelab', href: '/codelabs/getting-started/codelab-overview', }, + { + type: 'doc', + label: 'Blockly Sample App', + id: 'guides/get-started/sample-app-overview', + }, { type: 'link', label: 'Blockly Playground', diff --git a/packages/docs/static/images/codelabs/getting-started/d4_three_times.png b/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/d4_three_times.png similarity index 100% rename from packages/docs/static/images/codelabs/getting-started/d4_three_times.png rename to packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/d4_three_times.png diff --git a/packages/docs/static/images/codelabs/getting-started/edit_mode_unimplemented.png b/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/edit_mode_unimplemented.png similarity index 100% rename from packages/docs/static/images/codelabs/getting-started/edit_mode_unimplemented.png rename to packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/edit_mode_unimplemented.png diff --git a/packages/docs/static/images/codelabs/getting-started/play_mode.png b/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/play_mode.png similarity index 100% rename from packages/docs/static/images/codelabs/getting-started/play_mode.png rename to packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/play_mode.png diff --git a/packages/docs/static/images/codelabs/getting-started/play_sound_block.png b/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/play_sound_block.png similarity index 100% rename from packages/docs/static/images/codelabs/getting-started/play_sound_block.png rename to packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/play_sound_block.png diff --git a/packages/docs/static/images/codelabs/getting-started/toolbox_two_blocks.png b/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/toolbox_two_blocks.png similarity index 100% rename from packages/docs/static/images/codelabs/getting-started/toolbox_two_blocks.png rename to packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/toolbox_two_blocks.png diff --git a/packages/docs/static/images/codelabs/getting-started/workspace_with_loop.png b/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_loop.png similarity index 100% rename from packages/docs/static/images/codelabs/getting-started/workspace_with_loop.png rename to packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_loop.png diff --git a/packages/docs/static/images/codelabs/getting-started/workspace_with_loops.png b/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_loops.png similarity index 100% rename from packages/docs/static/images/codelabs/getting-started/workspace_with_loops.png rename to packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_loops.png diff --git a/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_toolbox.png b/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_toolbox.png new file mode 100644 index 0000000000000000000000000000000000000000..5272b95a94a04842d3b0094726f3e78d76f21a21 GIT binary patch literal 7539 zcmeHsX;2eLw|3AGbwn9w1X)C86hXkSF9HH8DiSs!>|w{S1qge92yq2LmJz|Qqhf#% zAnXwm$RGj=N!Zu0$P)Gh5RwQXaJhBst@^6I?|%3Ht+%SXy1Gx-^W!0c#&1pol2P43^Z1^@&QhrRp6k;4^InPti0a5U_;iOq=&@+}ZCAmjcP?v*wcWm1VD>WmxsZvsTH{vmB5iN~=5P09Eh%z;&G2`h8F{lN8s*-Q z!lYZcuBO*S!GJ$IbO%oX+@BYz0Ulb318Pcz0FE|-kFO~ly(yY0@aL;8z~6VFfUh48 z%~#ryv)@~vS(JpSoImzY)xy?Ju|@tkd-GFfh;IHLvSxof%K*^F8nXUt_x}L)Z}b0? zIT4ZVtFgl6K}ApgbAP}{X|}Ta&ZV>2F9cN7+F#w9=-RGQJ`QL~ zI-gR|kQJase>}bZj{Du@z{G9TM`4S^t(DE3&$!N{6}U~6YoiADtjyX4Nr3CXV$Vju z#@bG*#aaN}U-+0s!}CW{D|@Y{MIrrPR!!6I>BPiEFP=}K+77)Py|TOGl%C$gnQS*| zKG$YRdaV>Ip**0>vt%CpobTMPnoiDXz5gKJjqp-@bE#l0W3BzoY+Mq2gzU18hjX+c z6+#ju2RmE@iXYc(elVOl4f-ksF_=V@HObC%jZl$<4IM}xCQ2?&*Ls$ofB5`I34^H zf<=p_y5`nI$qJuMY#EKH*_t;w`1VC6UpaZ6U%2g2F%Z zrczUTEYB%H{1F9&{uMpfkvd{cQDb9m`hU~!v>*yi`|6K;Fl0Xaa&jhKbehBz30b#6Px!Ei}u z^rHX4?Ss$W)i0=3%JZ;If{cH3d{Vn-qDvW3QYn6Fwr|z4E_Q09M|*Akh9lCqZiF5^ z`@G#>(`e>#PYKc@QAtM0{3MPN#AP+y%=O@`_t=1q!EeYW?HP9+;~%=gS2u@Ya=`n8 z6Qo;ditz0ja00b-j5pYpgybeX0SBtqqU35KG_)d0y)m9$o>oVb;P-CD?dKUHyXKEOjsZChT+dz=05T8f9O$I!+=V!gr+fxgrh}tip&N z#qwih9?i5&wdn8#gy**+ynWoNuX>=4&Wh*1(PuA6!uE+be)k5u-1&TF_Ks~GSyAnB z&o{d^4|C}i%%=yG^v6#jne9TSIg5HRw>jTQR_Xd zTu11e$=9iA-$9M!sKWIu#Swj1=O~Wp<%!v#I3FYfmXIuO_%q0n_GCyhP59~q+S;be z#VvdC&R%govMfzwXD$1#`uWP1#Y*@hy(iy&#EUy28Rx!k=z^XoM9_zc+gU)k2>leMAm@o~q-V)sKUTmf_HlC^aDiw8Q zodt838XiKD)Z6`Q6)+#XHEd0Z?rOP1v*E?M)|!wsua59ZU)TusDr%FaLW)BSEa$hi zXrs`zOReP}uCYsME#)xEq%c}POwBpRx(UC4Ko-Q|Y9BHyx^EDN141N0*ugz%LtQY6 zRZl&TL^C?mVtTjTQD=a(S1pj*b>VZ~b1*in2)asI zj^7KD?k3L_YUS;q1~_tVp#7P6y_`6^DJaEmWz=d$*kFLHyNyndu$4^|zi@ep7XWk$ z*&4@)JCPPoPiAH78+s~01|uL-)3H8lQuzfm#m+eXgr75QutjE}Tf5FlO)W;pWATyG zCW#IEH7vur@^cMP8@;f-*naeFsa3Ro|2<&L1_zi6A_OQ*a<-!93H{uQxS>!`F(k7;X)&40(zl}zWCCuO$7N>gXwhnoQG9$) zNreLBH=l%%-OR=vc^`7k!yXD%{HI^c68d$W(p>OpU6h_U^`(vhuv3G)*P0}snIFn{ zHewLn`fykYVj}125X!flGOVSmM{lY}^u(^?r0tB$T(EI#$Y9?yA`d|F{COI+H4;AU z7L8TklQtm0N+9x={g(s?`0nE~Vzo=O<*<^`)9?~{Mcsg0pP+;SM+BdxeoL>6nlDir zQ@(f$={T0X;)}DyhFL;R)HlT6gUXJOw|i-8H6@jjxC}hcp04g~9yYi>WR9^J&vJah zAJ(RKJa!5i7PAS!4x<_lQSFzn8mlep>Ej)Vn95h!h5lRy57*KpQL^jiOTG6 zZrS}~vjNdBI;CGSO7xlJcTS$g$hy^f_`kIVVSTAVgeKyULDOAB>)4ee$2q zE&Bx6$bMV`;rqVr3r7$`IU9jWjPYqx#MzTu*!Mer98Y?s!N@{V`KJPjTBMp#MmJ2W zFdRtQEtc=vT0rLFjxaNcBjM)B)}Zzb{cls$x#ph(3AW$ld4(h%&ot;@l~=I;Pi|g6 z4>qf_ySy7no#|+k9A2xufoS`u!1klmSk=Oirlr;=(b(F$?>{><@s*A!GsWyUaEo+S}C0v#7;e~b;0_|mL1Rxocff}-KiOb3}kenyCcIz-_r6{lMY&*)wBtUIr@)Vn|R9?-yKsGYfpQ|$oqEZ!n}LJ;sUc@p#BnlGP_fa2`&j3u1-K=u$_ znnymcGhAF}W$7#?^gP?U*eQBFrZ17${rsRgjAYiUOmXVJJoLHQc5G=BX`wFnUCU5*#f{ z=?Nxp?&cal17UNdcreo>)1)$g7^l+BXP9`J%Ai<#xQt2pH4lfnlYQkl%s>-y1hx6# z$G{`Ep^n16`36+DZGdxc8+`lbbH1iXiYsRDtfg1f2f~NGqKwc&e^psxe?{uk&*C}A ztp-8DdmH}iA4!VC)WR&=KCC46#TEOvViB6Q#1R|W$R|yIyvjNscIG}$lC0|-wK$QI zoALg5>RMpwkeukegDu$R?hO$hWoKl^b+2^wtp!>bxJ4J%&nCrg75j`BObwQ;jU8rI z1I`zhX__4fnkvO++<9+?423O>QmiIF%EUUwB`P-3MZ}fpvfjN4UQ4Y5xNRl$WL(51 z7?RXufFYFlcj0Y5O(GWnAGJ$y8P#6*8ZR_Fg=)hcIYW>9U9>P5>Q$gCWPUK5OzaDm z9~xby3vcwJqPeVcm-p7z8P*ExZWnigX_Lw%rppHZ7oUz^y`CVytd8u-8zp3yGiZHa z;2u90M9!IbvtXUj5LB+<64_qE!#h=l53J178*ye3_pBr@vbXPeP8FZS7vC2w)z|MX!5zryzm5;dIne?8S~Z! z`_3Aa`#l`%-i>`+oLkSpm!r7bt$si`Lt8|yx*Y|g)xg@U$B)EhhMMgrlr)u#BcRoe zmlhsZKFkY^l$3|g+U~sP%f*7Od{XmC>X(|7JVUsEe8lXmkGBT-Dfy&|mX74z^$XOK zM#bX#L%q!)(Wnr=z{xq0kcITWfyMLT_SXJMppE>-JlbBlswv(Q7mKMRQYTV7WHq-| zp0{{$DZvhKMu3U@vp5+&C&`;m%^*j= zCw5`wU388|CcLYE>{N*_$PX;qqX^L^$e8L}(1QL#kHBd7ge=!x;$@pZGV=4v*QsQs zLLq^}?lQESIX_A832wy|NiJ%~w#oz5tgdW0^?I;H#f))3_wP5qbAyrRW2n^<74Paa z?;4Q7{*VX>Z!5wbuikouxU|_rw(%0fWF{ZO1 z=+rXIUw4m&EZ#6lj)B3LtMJgWk9ninrJG ze=JE>LK?0$z2uWSUdKy#(N@@77Y-&yR_m_9`3osnMLXJLmAozXF|jP>Fd?}Rg2r;H zW5!Z)?eg|7+6Cc~$hsMaZXMk80@u{$KY5I=9?7qZ^%X-iRxVeU7H1^2TdZRf zUzkq@@%$gU*m;j`nUH3ODV+Q)(2kcvZjt zkCka@@2bho)g|L7`d*z~L)*76KP)L!7# zL9+grC;vbZCi!<^(l_iHOLobq{D(Q;Oia!{cdQ*t-wj?&eCa2F4leUlC{9b~jF6;cZ8WpvptxT144fpGjtpg?SwHd$3+pHEM44s{~a9vE3FWp_ENO;B4J zI3MTdKVG!RP0p!y|Jtie7Re5SE-W6lh^;R*5Q81OTfJ>;`XHn7$zSTTo4g9Y)OPNE zEN4*hxR-p$$#-g#C*m))#s%rlIM>DnLm=Pkkp)v3G2Ucb4NQ)cTwAII9m4tCEF zFGu*Ie|whLb@R?W*7No>gCBj$gxHovOAz*@c)biAe?XTOaUMue%@A`e75XK1E}`U%1U09hrN}OE)`IaAq36GksZAIm7h*y#`5qQ+0y8u*Sux zmfh&p(o@58_ zJjSznG|LLjx|;_0q8=~|&9K%w#nlpwFT6F*!(q_nSzul5w)Z@L|06lN`eL@-ZVsf- zpiAI`ftzy4pfMpYWlVP`}0)f)24xIxgo}gLIM>%Uuer2y+_Ozs1(d3M(Uw?S)+MD$V*U6LA88~H&9_P~D&qv=w#DPE z+^S1R9j?x5Eo34L;JhLTW&G97IDu?-E2#0Q`$+=HLlKy<@U#PpZ2B@gUP>wTPl3y{ zcQ&$1Lrkw)i)kT<-*UZ0pu2 zN1t@N4Ol#^OnFv2XbjIiS$h6MuzBho*K@)B9tCYd+U`YM1PxviShD-f>Gl;3%yPl! z{uTGnyZa8%esI53&Sk5xqbi;<?jAJ!k|?xmRy3JD|& zC0r9(07xNM;!i5-4i$?iYqGVeXe^u24~QrTAYR`lll|aMg1z0X9&P#OpH#GD5R)1 z|D*T58yf7U2^O{b6RR|>)W?^XHNxlKW)rS8#w7OE2#A@zjgk|PGK_N`_yx~);ooI* zj?#hO+?dZa!;1z6ve5;Io;_rTUT1f+Cg5behgpsWc6H7u^5OtxBKz*#s{;PdF(Wx) z>;Tf_$O>nc-uQ=>%4eamCW>Pao_>Bq9@C-I3B9f+I3p!+|I_?1l-3o(nEw+q`v+fx7F}Nhb`{S38o`U2fH4Ga-mYr@<^NI&{~L^d f35owQA4q$U&J5vB$NfB%O#vo%E$&p_c7OUG2e^Nm literal 0 HcmV?d00001 diff --git a/packages/docs/static/images/codelabs/getting-started/add_text_block.png b/packages/docs/static/images/codelabs/getting-started/add_text_block.png new file mode 100644 index 0000000000000000000000000000000000000000..f3c7dd07843fd7a0c0010ac3622feda90f0354d4 GIT binary patch literal 16614 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

sH1h%qYUKu5!#X;n%MrF_m2Etgl|mmC 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

2+KqiMee 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 literal 0 HcmV?d00001 diff --git a/packages/docs/static/images/codelabs/getting-started/full_page_first_toolbox.png b/packages/docs/static/images/codelabs/getting-started/full_page_first_toolbox.png new file mode 100644 index 0000000000000000000000000000000000000000..dca5bf69154184d4826b94618a418164a1a49d10 GIT binary patch literal 102964 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

y+5o>y)GH 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 literal 7539 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 From 8fb3e10b0bf1fdad62fabbc6163e6642b42bc9f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Spriggs?= Date: Fri, 26 Jun 2026 11:32:28 -0400 Subject: [PATCH 5/8] docs: finish new getting-started, delete old, add sample app to docs --- .../add-blockly-libraries.mdx | 46 - .../OLD-getting-started/codelab-overview.mdx | 46 - .../complete-code/index.html | 63 - .../complete-code/scripts/main.js | 102 - .../complete-code/scripts/music_maker.js | 21 - .../complete-code/scripts/sound_blocks.js | 34 - .../complete-code/sounds/c4.m4a | Bin 8833 -> 0 bytes .../complete-code/sounds/c5.m4a | Bin 8635 -> 0 bytes .../complete-code/sounds/d4.m4a | Bin 8509 -> 0 bytes .../complete-code/sounds/e4.m4a | Bin 8454 -> 0 bytes .../complete-code/sounds/f4.m4a | Bin 8530 -> 0 bytes .../complete-code/sounds/g4.m4a | Bin 8306 -> 0 bytes .../complete-code/styles/index.css | 75 - .../create-a-blockly-workspace.mdx | 107 - .../create-a-custom-block.mdx | 112 - .../OLD-getting-started/explore-the-app.mdx | 33 - .../generate-javaScript-code.mdx | 50 - .../run-generated-code.mdx | 73 - .../save-load-workspace.mdx | 53 - .../codelabs/OLD-getting-started/setup.mdx | 35 - .../starter-code/index.html | 58 - .../starter-code/scripts/main.js | 48 - .../starter-code/scripts/music_maker.js | 21 - .../starter-code/sounds/c4.m4a | Bin 8833 -> 0 bytes .../starter-code/sounds/c5.m4a | Bin 8635 -> 0 bytes .../starter-code/sounds/d4.m4a | Bin 8509 -> 0 bytes .../starter-code/sounds/e4.m4a | Bin 8454 -> 0 bytes .../starter-code/sounds/f4.m4a | Bin 8530 -> 0 bytes .../starter-code/sounds/g4.m4a | Bin 8306 -> 0 bytes .../starter-code/styles/index.css | 75 - .../codelabs/OLD-getting-started/the-end.mdx | 14 - .../getting-started/complete-code/index.html | 63 - .../complete-code/package-lock.json | 5779 +++++++++++++++++ .../complete-code/package.json | 29 + .../complete-code/scripts/main.js | 102 - .../complete-code/scripts/music_maker.js | 21 - .../complete-code/scripts/sound_blocks.js | 34 - .../complete-code/sounds/c4.m4a | Bin 8833 -> 0 bytes .../complete-code/sounds/c5.m4a | Bin 8635 -> 0 bytes .../complete-code/sounds/d4.m4a | Bin 8509 -> 0 bytes .../complete-code/sounds/e4.m4a | Bin 8454 -> 0 bytes .../complete-code/sounds/f4.m4a | Bin 8530 -> 0 bytes .../complete-code/sounds/g4.m4a | Bin 8306 -> 0 bytes .../complete-code/src/blocks/text.js | 35 + .../src/generators/javascript.js | 30 + .../complete-code/src/index.css | 40 + .../complete-code/src/index.html | 16 + .../complete-code/src/index.js | 62 + .../complete-code/src/serialization.js | 32 + .../complete-code/src/toolbox.js | 27 + .../complete-code/styles/index.css | 75 - .../complete-code/webpack.config.js | 59 + .../create-a-blockly-workspace.mdx | 6 +- .../getting-started/create-a-custom-block.mdx | 2 +- .../getting-started/create-base-app.mdx | 2 +- .../generate-javaScript-code.mdx | 2 +- .../getting-started/run-generated-code.mdx | 22 +- .../getting-started/save-load-workspace.mdx | 11 +- .../starter-code/package-lock.json | 435 +- .../docs/codelabs/getting-started/the-end.mdx | 6 +- packages/docs/sidebars.js | 2 +- 61 files changed, 6419 insertions(+), 1539 deletions(-) delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/add-blockly-libraries.mdx delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/codelab-overview.mdx delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/complete-code/index.html delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/main.js delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/music_maker.js delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/sound_blocks.js delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/c4.m4a delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/c5.m4a delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/d4.m4a delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/e4.m4a delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/f4.m4a delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/g4.m4a delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/complete-code/styles/index.css delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/create-a-blockly-workspace.mdx delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/create-a-custom-block.mdx delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/explore-the-app.mdx delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/generate-javaScript-code.mdx delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/run-generated-code.mdx delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/save-load-workspace.mdx delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/setup.mdx delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/index.html delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/scripts/main.js delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/scripts/music_maker.js delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/c4.m4a delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/c5.m4a delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/d4.m4a delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/e4.m4a delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/f4.m4a delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/g4.m4a delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/starter-code/styles/index.css delete mode 100644 packages/docs/docs/codelabs/OLD-getting-started/the-end.mdx delete mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/index.html create mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/package-lock.json create mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/package.json delete mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/scripts/main.js delete mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/scripts/music_maker.js delete mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/scripts/sound_blocks.js delete mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/sounds/c4.m4a delete mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/sounds/c5.m4a delete mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/sounds/d4.m4a delete mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/sounds/e4.m4a delete mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/sounds/f4.m4a delete mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/sounds/g4.m4a create mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/src/blocks/text.js create mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/src/generators/javascript.js create mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/src/index.css create mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/src/index.html create mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/src/index.js create mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/src/serialization.js create mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/src/toolbox.js delete mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/styles/index.css create mode 100644 packages/docs/docs/codelabs/getting-started/complete-code/webpack.config.js diff --git a/packages/docs/docs/codelabs/OLD-getting-started/add-blockly-libraries.mdx b/packages/docs/docs/codelabs/OLD-getting-started/add-blockly-libraries.mdx deleted file mode 100644 index 6603041dbee..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/add-blockly-libraries.mdx +++ /dev/null @@ -1,46 +0,0 @@ ---- -description: How to add Blockly libraries to an app. ---- - -# Getting started with Blockly - -## 4. Add Blockly libraries - -Now that you know what you'll be building, you need to add Blockly dependencies to your app. - -Blockly releases are [published on npm](https://www.npmjs.com/package/blockly) on a quarterly basis. For this codelab you will import blockly using [unpkg](https://unpkg.com), which lets you import all of the files you need with a single script tag. - -### Add the script tag - -Open `starter-code/index.html` in a text editor and scroll to the end. You can see two script tags: - -```html - - -``` - -Add Blockly just before these two scripts. The order is important, because you will use Blockly objects later in `main.js`. Your imports should now look like this: - -```html - - - - - - -``` - -### Default imports - -Importing Blockly this way loads four default modules. - -- Blockly core: The main Blockly library, which defines the basic Blockly UI and logic. -- Built-in block definitions: Common blocks such as loops, logic, math, and string manipulation. -- The JavaScript generator: Converts blocks into JavaScript, and contains block generators for all built-in blocks. -- English language files: String tables for all messages on built-in blocks and the Blockly UI, in English. - -### Alternate imports - -There are many ways to import a library in JavaScript, and this tutorial does not cover all of them. For samples that show how to integrate Blockly in your project, look at the `examples` folder in [blockly-samples](https://github.com/RaspberryPiFoundation/blockly-samples). - -You can also define your imports more carefully to get [different generators](https://www.npmjs.com/package/blockly#blockly-generators) and [locales](https://www.npmjs.com/package/blockly#blockly-languages). diff --git a/packages/docs/docs/codelabs/OLD-getting-started/codelab-overview.mdx b/packages/docs/docs/codelabs/OLD-getting-started/codelab-overview.mdx deleted file mode 100644 index 72d6ea81606..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/codelab-overview.mdx +++ /dev/null @@ -1,46 +0,0 @@ ---- -pagination_prev: null -description: Overview of the "Getting started with Blockly" codelab. ---- - -import Image from '@site/src/components/Image'; - -# Getting started with Blockly - -## 1. Codelab overview - -### What you'll learn - -This codelab will teach you how to modify a simple web app to include the [Blockly](/blockly) visual programming library. - -### What is Blockly? - -Blockly is a library for building block programming apps. - -Block programming allows users to create scripts and programs by using visual blocks, even if they do not know any programming language. - -Blockly includes everything you need for defining and rendering blocks in a drag-n-drop editor. Each block represents a chunk of code that can be easily stacked and translated into code. - -### What you'll build - -MusicMaker, a web app where you can program buttons to play different sounds, using Blockly. - -image - -image - -### What you'll need - -- A browser -- A text editor -- Basic knowledge of HTML, CSS and JavaScript - -This codelab is focused on Blockly. The app structure, non-relevant concepts and code are glossed over and are provided for you to simply copy and paste. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/index.html b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/index.html deleted file mode 100644 index a6c95524da4..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/index.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - Blockly for the Web Codelab - - - - - - -

-

Music Maker

-

Music Maker Configuration

-
- -
- - - -

- Tap any button to edit its code.
When complete, press Done. -

- -
-
-
1
-
2
-
3
-
-
-
4
-
5
-
6
-
-
-
7
-
8
-
9
-
-
- -
-
-
-
- - - - - - - - - - diff --git a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/main.js b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/main.js deleted file mode 100644 index e1a54cd71d2..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/main.js +++ /dev/null @@ -1,102 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ -(function () { - let currentButton; - - function handlePlay(event) { - loadWorkspace(event.target); - let code = javascript.javascriptGenerator.workspaceToCode( - Blockly.getMainWorkspace(), - ); - code += 'MusicMaker.play();'; - // Eval can be dangerous. For more controlled execution, check - // https://github.com/NeilFraser/JS-Interpreter. - try { - eval(code); - } catch (error) { - console.log(error); - } - } - - function loadWorkspace(button) { - const workspace = Blockly.getMainWorkspace(); - if (button.blocklySave) { - Blockly.serialization.workspaces.load(button.blocklySave, workspace); - } else { - workspace.clear(); - } - } - - function save(button) { - button.blocklySave = Blockly.serialization.workspaces.save( - Blockly.getMainWorkspace(), - ); - } - - function handleSave() { - document.body.setAttribute('mode', 'edit'); - save(currentButton); - } - - function enableEditMode() { - document.body.setAttribute('mode', 'edit'); - document.querySelectorAll('.button').forEach((btn) => { - btn.removeEventListener('click', handlePlay); - btn.addEventListener('click', enableBlocklyMode); - }); - } - - function enableMakerMode() { - document.body.setAttribute('mode', 'maker'); - document.querySelectorAll('.button').forEach((btn) => { - btn.addEventListener('click', handlePlay); - btn.removeEventListener('click', enableBlocklyMode); - }); - } - - function enableBlocklyMode(e) { - document.body.setAttribute('mode', 'blockly'); - currentButton = e.target; - loadWorkspace(currentButton); - } - - document.querySelector('#edit').addEventListener('click', enableEditMode); - document.querySelector('#done').addEventListener('click', enableMakerMode); - document.querySelector('#save').addEventListener('click', handleSave); - - enableMakerMode(); - - const toolbox = { - kind: 'flyoutToolbox', - contents: [ - { - kind: 'block', - type: 'controls_repeat_ext', - inputs: { - TIMES: { - shadow: { - type: 'math_number', - fields: { - NUM: 5, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'play_sound', - }, - ], - }; - - Blockly.inject('blocklyDiv', { - toolbox: toolbox, - scrollbars: false, - horizontalLayout: true, - toolboxPosition: 'end', - }); -})(); diff --git a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/music_maker.js b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/music_maker.js deleted file mode 100644 index 7959de10a83..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/music_maker.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ -const MusicMaker = { - queue_: [], - player_: new Audio(), - queueSound: function (soundUrl) { - this.queue_.push(soundUrl); - }, - play: function () { - const next = this.queue_.shift(); - if (next) { - this.player_.src = next; - this.player_.play(); - } - }, -}; - -MusicMaker.player_.addEventListener('ended', MusicMaker.play.bind(MusicMaker)); diff --git a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/sound_blocks.js b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/sound_blocks.js deleted file mode 100644 index 81101c1051f..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/scripts/sound_blocks.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -Blockly.defineBlocksWithJsonArray([ - // Block for colour picker. - { - type: 'play_sound', - message0: 'Play %1', - args0: [ - { - type: 'field_dropdown', - name: 'VALUE', - options: [ - ['C4', 'sounds/c4.m4a'], - ['D4', 'sounds/d4.m4a'], - ['E4', 'sounds/e4.m4a'], - ['F4', 'sounds/f4.m4a'], - ['G4', 'sounds/g4.m4a'], - ], - }, - ], - previousStatement: null, - nextStatement: null, - colour: 355, - }, -]); - -javascript.javascriptGenerator.forBlock['play_sound'] = function (block) { - const value = "'" + block.getFieldValue('VALUE') + "'"; - return 'MusicMaker.queueSound(' + value + ');\n'; -}; diff --git a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/c4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/c4.m4a deleted file mode 100644 index 33941cfae1550c1971a1713664e5f41cbd74531c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8833 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 C(LC1x diff --git a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/c5.m4a b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/c5.m4a deleted file mode 100644 index 49721cd31dfcb6154563e05a4ddfb4c3c7c03fa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8635 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
-``` - -### Create the workspace - -Now add code to inject the Blockly editor just after the code you used to define your toolbox: - -```js -Blockly.inject('blocklyDiv', { - toolbox: toolbox, - scrollbars: false, - horizontalLayout: true, - toolboxPosition: 'end', -}); -``` - -Let's look at the options we used to initialize your blockly editor: - -- `toolbox`: A JavaScript object which defines the toolbox for the editor. -- `scrollbars`: Whether to show scrollbars in the workspace. -- `horizontalLayout`: Whether to display the toolbox horizontally or vertically in the workspace. -- `toolboxPosition`: Whether to show the toolbox at the top or bottom of the workspace. - -The `options` struct gives you significant control over your Blockly instance. You can pass options to set Blockly's theme, modify scrolling behaviour, set the renderer, and more. For more information, head over to Blockly's developer site and check out the [configuration](/guides/configure/configuration_struct#the-options-dictionary) section. - -### Check your work - -Now refresh the page. Select the EDIT mode, then tap on one of the buttons. You should see a Blockly editor: - -image - -Drag and drop the available loop block to the workspace to test it out. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/create-a-custom-block.mdx b/packages/docs/docs/codelabs/OLD-getting-started/create-a-custom-block.mdx deleted file mode 100644 index 3b1787d33cb..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/create-a-custom-block.mdx +++ /dev/null @@ -1,112 +0,0 @@ ---- -description: How to create a custom block. ---- - -import Image from '@site/src/components/Image'; - -# Getting started with Blockly - -## 6. Create a custom block - -Since this is a music maker app, we want a block that plays sounds. We could create one block per sound, but instead we will create a single block with a dropdown to select which note to play: - -image - -In Blockly, a _block definition_ describes how a block looks and behaves. This includes its text, colour, and shape. It may also include which other blocks it can connect to. - -Blocks can be defined in either JavaScript or JSON. The developer site has a full article on [how to define a block](/guides/create-custom-blocks/define/block-definitions#how-to-create-block-definitions). - -In this codelab we will simply provide the block definition for you to copy and use. - -### Define the sound block - -Create a JS file to define a new "play sound" block: - -1. Add `sound_blocks.js` file in the `scripts` directory. -1. Add the following code to `sound_blocks.js`: - -```js -Blockly.common.defineBlocksWithJsonArray([ - { - type: 'play_sound', - message0: 'Play %1', - args0: [ - { - type: 'field_dropdown', - name: 'VALUE', - options: [ - ['C4', 'sounds/c4.m4a'], - ['D4', 'sounds/d4.m4a'], - ['E4', 'sounds/e4.m4a'], - ['F4', 'sounds/f4.m4a'], - ['G4', 'sounds/g4.m4a'], - ], - }, - ], - previousStatement: null, - nextStatement: null, - colour: 355, - }, -]); -``` - -Add a script tag to `index.html` to include your new block definition: - -```html - -``` - -Your sound block definitions must come after importing Blockly and before the other imports, since you will use Blockly functions in this file, and you will be using functions from this file in later files. Your imports should now look like this: - -```html - - - - -``` - -### Add the sound block to the toolbox - -Now we can update the toolbox to include the new sound block, by adding `{'kind': 'block', 'type': 'play_sound'}` to our `toolbox` definition: - -```js -const toolbox = { - kind: 'flyoutToolbox', - contents: [ - { - kind: 'block', - type: 'controls_repeat_ext', - inputs: { - TIMES: { - shadow: { - type: 'math_number', - fields: { - NUM: 5, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'play_sound', - }, - ], -}; -``` - -Run the app one more time, and play around with the new `Play (sound)` block. It should look like this: - -image - -### The block factory - -This step discussed how to manually define custom blocks in Blockly. Once you've completed the entire codelab, we recommend that you check out our [block factory tool](/guides/create-custom-blocks/blockly-developer-tools), which helps automate part of this process. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/explore-the-app.mdx b/packages/docs/docs/codelabs/OLD-getting-started/explore-the-app.mdx deleted file mode 100644 index ef864e56e69..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/explore-the-app.mdx +++ /dev/null @@ -1,33 +0,0 @@ ---- -description: Explore Blockly's getting started app. ---- - -import Image from '@site/src/components/Image'; - -# Getting started with Blockly - -## 3. Explore the app - -To run the app, simply open `starter-code/index.html` in a browser. - -### Play Mode - -By default, the app launches in "**Play Mode**". In this mode, you can see 9 buttons. None of them can do anything yet. The idea is to let the user define custom behaviors for each button, using Blockly. - -image - -### Edit mode - -By tapping the **EDIT** button, you can switch to edit mode. In this mode, tapping a button will display an editor, which is where you can program how sounds should play for that button. For now, the editor screen is empty. - -image - -You can go back to the play mode by tapping **SAVE** and then **DONE** buttons. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/generate-javaScript-code.mdx b/packages/docs/docs/codelabs/OLD-getting-started/generate-javaScript-code.mdx deleted file mode 100644 index ad874d7a640..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/generate-javaScript-code.mdx +++ /dev/null @@ -1,50 +0,0 @@ ---- -description: How to generate JavaScript code. ---- - -import Image from '@site/src/components/Image'; - -# Getting started with Blockly - -## 8. Generate JavaScript code - -Now that each button can be configured with its own Blockly workspace, the next thing we want to do is to generate JavaScript code from each workspace. - -This generated code will be run by the browser, effectively executing the blocks set up in the Blockly workspace. - -### The language generator - -Blockly can generate code from blocks for different languages, e.g. JavaScript, Python, or PHP. - -A _language generator_ defines the rules for generating a specific language (such as indentation). Because we are using the default imports, we don't need to add any new code to get the JavaScript generator. - -As previously mentioned, you can define your imports more carefully to get a [different generator](https://www.npmjs.com/package/blockly#blockly-generators). - -### Add a block generator - -When Blockly generates JavaScript code for blocks in a workspace, it translates each block into code. By default, it knows how to translate all library-provided default blocks into JavaScript code. However, for any custom blocks, we need to specify our own translation functions. These are called _block generators_. - -Add the following code to the bottom of `scripts/sound_blocks.js`: - -```js -javascript.javascriptGenerator.forBlock['play_sound'] = function (block) { - let value = "'" + block.getFieldValue('VALUE') + "'"; - return 'MusicMaker.queueSound(' + value + ');\n'; -}; -``` - -With this translation function, the following `play_sound` block: - -image - -translates into the JavaScript code: - -```javascript -MusicMaker.queueSound('Sounds/c4.m4a'); -``` - -For more information on block generators, read the [generating code](/guides/create-custom-blocks/code-generation/overview#block-code-generators) page on the developer site. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/run-generated-code.mdx b/packages/docs/docs/codelabs/OLD-getting-started/run-generated-code.mdx deleted file mode 100644 index 52a6986dd3a..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/run-generated-code.mdx +++ /dev/null @@ -1,73 +0,0 @@ ---- -description: How to run generated code. ---- - -import Image from '@site/src/components/Image'; - -# Getting started with Blockly - -## 9. Run generated code - -Most of your work so far has been in the **Edit** mode. Now you will update the **Play** mode to actually execute the custom code associated with each block. - -The function `handlePlay` is already defined in `scripts/main.js`, but it's empty. Load the workspace content associated with the pressed button: - -```js -loadWorkspace(event.target); -``` - -Next, you need to generate the code out of that workspace, which you can do with a call to `javascript.javascriptGenerator.workspaceToCode`. - -The user's code will consist of many `MusicMaker.queueSound` calls. At the end of our generated script, add a call to `MusicMaker.play` to play all the sounds added to the queue: - -```js -let code = javascript.javascriptGenerator.workspaceToCode( - Blockly.getMainWorkspace(), -); -code += 'MusicMaker.play();'; -``` - -Finally, execute the script with the `eval` function. Wrap it in a `try/catch` so that any runtime errors are logged to the console, instead of failing quietly: - -```js -try { - eval(code); -} catch (error) { - console.log(error); -} -``` - -### The full code - -The end result should look like this: - -```js -function handlePlay(event) { - loadWorkspace(event.target); - let code = javascript.javascriptGenerator.workspaceToCode( - Blockly.getMainWorkspace(), - ); - code += 'MusicMaker.play();'; - try { - eval(code); - } catch (error) { - console.log(error); - } -} -``` - -### A note on eval - -Executing scripts with eval is not always the safest option - we use it here for simplicity. If you intend to run the user's blocks in production, check out the JS Interpreter project. This project is separate from Blockly, but was specifically written for Blockly. - -### Test it - -Run the app and try it out! Edit one of the buttons to play a D4 sound 3 times: - -image - -Save and exit the edit mode. Now if you tap this button, you should hear the D4 sound played 3 times. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/save-load-workspace.mdx b/packages/docs/docs/codelabs/OLD-getting-started/save-load-workspace.mdx deleted file mode 100644 index 039ea389558..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/save-load-workspace.mdx +++ /dev/null @@ -1,53 +0,0 @@ ---- -description: How to save and load your workspace. ---- - -# Getting started with Blockly - -## 7. Save/load workspace - -You now have a Blockly workspace that appears when editing a button. The user can use this to write code, but there's no link between the code the user has written and an individual button on the page. - -Once the button behavior is defined by the user, it needs to be saved for later use. The saved code must be per button, since buttons can be programmed to play different sounds. - -### Add the save method - -Open `scripts/main.js`. Add the following code to the `save()` method: - -```js -button.blocklySave = Blockly.serialization.workspaces.save( - Blockly.getMainWorkspace(), -); -``` - -`workspaces.save` takes the Blockly workspace, exports its state to a JavaScript object and stores it in a `blocklySave` property on the button. This way the exported state for the block sequence gets associated with a particular button. - -### Add the load method - -Similarly, when a user opens the editor, the blocks previously associated with this button should get loaded into the workspace. - -In the `scripts/main.js `file, add `loadWorkspace` function: - -``` -function loadWorkspace(button) { - const workspace = Blockly.getMainWorkspace(); - if (button.blocklySave) { - Blockly.serialization.workspaces.load(button.blocklySave, workspace); - } else { - workspace.clear(); - } -} -``` - -This loads the blocks stored on the button that was clicked back into the workspace. - -Call this function from the end of the function `enableBlocklyMode`: - -``` -function enableBlocklyMode(e) { - ... - loadWorkspace(currentButton); -} -``` - -Now, test the code. Edit the workspace for one of the buttons, add some blocks, save it, and reopen it. The workspace should still contain the blocks you added. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/setup.mdx b/packages/docs/docs/codelabs/OLD-getting-started/setup.mdx deleted file mode 100644 index bb1b653ee7d..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/setup.mdx +++ /dev/null @@ -1,35 +0,0 @@ ---- -description: Setting up the "Getting started with Blockly" codelab. ---- - -# Getting started with Blockly - -## 2. Setup - -### Download the sample code - -You can get the sample code for this code by either downloading the zip here: - -[Download zip](https://github.com/RaspberryPiFoundation/blockly/archive/main.zip) - -or by cloning this git repo: - -```bash -git clone https://github.com/RaspberryPiFoundation/blockly.git -``` - -If you downloaded the source as a zip, unpacking it should give you a root folder named `blockly-main`. - -The relevant files are in `docs/docs/codelabs/getting-started`. There are two versions of the app: - -- `starter-code/`: The starter code that you'll build upon in this codelab. -- `complete-code/`: The code after completing the codelab, in case you get lost or want to compare to your version. - -Each folder contains: - -- `scripts/` - - `main.js` - The main logic for the app. In the starter project it has all the code needed to navigate and switch between views in the basic app. - - `music_maker.js` - A small library to play sounds. We will use it to actually play sounds in the browser. -- `sounds/` - Sound files for various notes -- `styles/` - The app's CSS -- `index.html` - The app's index page. diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/index.html b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/index.html deleted file mode 100644 index cf38875fe4e..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/index.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - Blockly for the Web Codelab - - - - - - -
-

Music Maker

-

Music Maker Configuration

-
- -
- - - -

- Tap any button to edit its code.
When complete, press Done. -

- -
-
-
1
-
2
-
3
-
-
-
4
-
5
-
6
-
-
-
7
-
8
-
9
-
-
- -
-
-
-
- - - - - diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/scripts/main.js b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/scripts/main.js deleted file mode 100644 index 33cf91446d2..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/scripts/main.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ -(function () { - let currentButton; - - function handlePlay(event) { - // Add code for playing sound. - } - - function save(button) { - // Add code for saving the behavior of a button. - } - - function handleSave() { - document.body.setAttribute('mode', 'edit'); - save(currentButton); - } - - function enableEditMode() { - document.body.setAttribute('mode', 'edit'); - document.querySelectorAll('.button').forEach((btn) => { - btn.removeEventListener('click', handlePlay); - btn.addEventListener('click', enableBlocklyMode); - }); - } - - function enableMakerMode() { - document.body.setAttribute('mode', 'maker'); - document.querySelectorAll('.button').forEach((btn) => { - btn.addEventListener('click', handlePlay); - btn.removeEventListener('click', enableBlocklyMode); - }); - } - - function enableBlocklyMode(e) { - document.body.setAttribute('mode', 'blockly'); - currentButton = e.target; - } - - document.querySelector('#edit').addEventListener('click', enableEditMode); - document.querySelector('#done').addEventListener('click', enableMakerMode); - document.querySelector('#save').addEventListener('click', handleSave); - - enableMakerMode(); -})(); diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/scripts/music_maker.js b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/scripts/music_maker.js deleted file mode 100644 index 7959de10a83..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/scripts/music_maker.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ -const MusicMaker = { - queue_: [], - player_: new Audio(), - queueSound: function (soundUrl) { - this.queue_.push(soundUrl); - }, - play: function () { - const next = this.queue_.shift(); - if (next) { - this.player_.src = next; - this.player_.play(); - } - }, -}; - -MusicMaker.player_.addEventListener('ended', MusicMaker.play.bind(MusicMaker)); diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/c4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/c4.m4a deleted file mode 100644 index 33941cfae1550c1971a1713664e5f41cbd74531c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8833 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 C(LC1x diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/c5.m4a b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/c5.m4a deleted file mode 100644 index 49721cd31dfcb6154563e05a4ddfb4c3c7c03fa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8635 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

xg=QnTcLx$HKyyHsf>6T3T9C?@=D(8NpNtf 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 J68=Ax{|DjmhLr#S diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/e4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/e4.m4a deleted file mode 100644 index d910052ef9fe9dbededf8bb949e813d2491c608e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8454 zcmbt)bzD@>yZ_Ry3oNjtu+rTn;L_ca(kvw%OM`TGi=cE!cL+##N~5$$NC*fjDBgp7 zKKFZn_jUjKJ-hFHo_S{GOuc8$oH+{ufvBuKd|XudC22u`+-gS`eqK9wXGb82?PZ6s z0)eQ(jtFxPI$AWiEft;Gt`yeRFDcwvsbK20tE+f1-#^KfRA7hOgD$CbQ+l!lDR-L4Sz`u0cKS4#!b^%4YPJeXS7igs zRiM&yj8f!9*!vPwIv>=dCX_rInCWdaN+rlCP2&~RZAkP-`&QvFg~I;m zedFhPdh8V;Bv+8%>%wL_#bMpDdqYV3TiN$WLQ40g zMuTjj3Af;2%;lWx8crn#XW9;e_lr0zVY&b|Gh8uB1^2x<=)F9?*QBm=?=ws;V=aog8G-80A` zgBm>CyJs%v)7Xm*GGQLTqT^;O3*j@dbL#%2bZ*BoI3Y6|Ef){!1RH zci)Wy@zI7LAPBq^GR%bodT%F0A-Q2b0a7puX zBj^h#uJq>CK@L%8%4|{o{5vuNDWw7m@5gDS=rV<;{uz#rMh_ib{Gd2nIRZ}~M9Xl^{CvpVF2#tPT7G&9QeNo^xImCpk zWC;f;9XiM62dvTBdd@ULeG_P>PTt?ExZ=e!#IM*oMYqiO!nm0e8NjPoMfIw>fkYGW z{hMn_41-t^P=Z9%;_}xjg=qcR9bsU zFym>lO=Abq(t^;toA39#0KJ);Cu{DyWECQdgFTJO=DjN}w%Dr^bD2=`%0%M>(rCls zTjONpdr8P|WV1^hmc}9?j|`5MkO;?j|C87ds~P2}g$=!+p$T7n`{PSK&C3fr%rETg zQ`bl(zJ*SgffSYR&L1L`%B7xhFe0~^8saKsHA}5vkGqnmN-+vio?BgcUVnyv<>=%K z_o0eKcqT-HpL%!h6xxZecB$*E!j-f!@qpO~e0u)Uz$Cu&521{Ytj%=nmflPCEpzSL{Je<$@!CO>gHIXhcK!CT=BHUoszO4Fu*@N-3WS)#45evI zgy*3d!A~8ja$Hs;Ny*pJSD2umktgktEZpxw5PiJ&aF4)11B;oh?JQhslGj|E(i#P% zFDV<(37;i3WN$GQyL~YI5PKn0xL`~dQT>i49aitCK5HySjDHSaYeagculTN$A9-?w zu|OR0%ZC)Oqe6xs6Lte+2nU#(qHp9t56h831qUyDo#-;6mU(MKwy0J)2RT8LIeus8 zG6J@G%kS6ra8z>jbtXf!TWb(T*nvrKR?3Y(v6;~%UGIhXXAb)-vYiVLt^|e@D)zdH zJfiJCD=LB|*s8Xa!kmhNAB@V~3O@5a4RIpoBr&B_7;oarn_T&UQ~YN1s^kkp*}y?} z2T@#?fC5`mI<(SB!)QRGtpb;ot}UThg=LcfJ1dr1K7c8S5G0AXV?}s!Bmy+8AxJKQ z6B4GGG)*fBCYN{4ovkV4@+vRs%*wrt7##}~Mwr;$qFSj|VF zsfS#Rq<&m^^&l869{BHKmJZN4tyX~@0t*`jm=a@+_>R=8a$4{>?<;QN;W=6Ia%V4F zWR>R?s~*DHdNnPwE0;{-ff+=Rm{32D-=Dqyf&UGW_fbOro_fP~0;1BVEjK$QIR}q* ze?Oo#kKx>w=sW%~;;V1X?=e{ypn)KePvEqeF3};=P6@5PbFA+={>)BDYm4I~LAD{J+{mH1PpnsVT)IUWZ z5l12tFM|dSUWQzBZ3W=)+O(*(3m9|TScyV}|i5DoUtL$KzHew7l&2w@c zDBvr3h9usHcsmm77Nq>n0 zF2@F;cE>c{F}%1^+MIR?;mJZwpk;}Q4WAMb<9nyhSw-LBgX~KX>Y;p0`@Hf=t=%x6 z_a=k70~h~UoYia*W9}0WE>Rm-5`r{w)S$HwZ19N-K{oo!(Na94oQxDBsQz){0}vVO zNV?l|nG)3U4b^Uw;Lbdk9)8oFFH&6YX764#BBpH45 zZ8qAfT}{BNqFq04r!4QvuYhyYec{MXu1pN=+(wQN$sZ8}HFi^X?W2%={`0WF*6zAC z?wnEdb)kOjkNdASG?i2(==E`pQuwx?vn2^WHCt0GnB-a-l^C^DjoR5tR+P+J_O>%Qr|QiWG{O^uzbrma^P;M@&#-U8cMiVbDu}a+6E`7672NR9 zt?=5~E$ay^UL_#A)- zN%!;+g_?F>XGZs~S@Ca;SluKS{vIYB!{SMKeSf*{;GfdiWh%u=*-_g!0uR~69uHP& z2(kM_M+CcKqz?anA@n-l6%(w>vx+KqOt6XCn^Cwl+UAwChjSsYhicrtQ98RY*@t2sFg*N7AkZu+qi}Zobi-6Wj?@J*l!toiA6selw zWkZ?f^^F9qz)-Q7_T6AQ_FSMwHTp!slGKV(RMA1JeZv4*b<9Y zh`v2BEF(A@wU33v`rbc;>eAn8t7fBfT1q;@6Z$)x#8zdWP00<^q4QCLi%QZAJcA(uMgt zU6-lPb^e{x7v?YcQ~O#wpyFo?%V;Y{yc=|w%kK(`%4t9Lv|VIM?tg!Brkspd9WB-i ziLGm@*s4dDghjxU|JiYcH-=inhYc{zEOxG^)YT*J;f0@anP@7}dU_p>Jkol*?YJQG z^ND4NL~wN;3dNB=2t=c4iv0u@XRtqBLYh7uqC65U<8K~GK5=Z7#uNHd-r^zZsd}0~ z}~-=%UEy?)EiP>~s!#QXD=qDHQoxQ!0vsW14$J`1I#* z4d=rBlLie>D6!E(V_`xb!*ZFy6i+E3jtXO;^9*qICkBd9xn-v#?~~)r?$#b;H5M>| zZ^t2rl&QVTvG*$4k>P6>=MI9KqsAlC&J#ZzI?+#J@M|J@-sVs#)P8T@OjJZ>j@eW+ z&fMKY9o@`Wq-8q6wJc$11}8hA@Z$23-L6v zFMKJVQgwe~OoP%#B2du7S=_9Gq|mISdv`Om>5VqF7DN^fXukH!k=DoRtICx7dH!;H zb1lD7PDr3QRcjtshOEYy*WZ1pB4sX%U<*B^0;U48OWp!Lou$A?92R0h2MxA#IoL z_^6p-2EK-8H$(w4o|6rYGAp&X=6I#Xn)s-!H3U1il!M}w$3!_ceaRjlMl&z$ea_sD zBg+{iGs)hpf&)3AWg0bsxh6BqGZ?SO zI&yACH_C@_(lsX65c|(H3RQy+7D$T2ts1;tjG9b;y*5M6W0u@!S0_G*@5goI7AN@3 z=g+Po-n#vtYgYVyGqa5e;C2=U-SF4&tK5EIz5IrcGJ&a#*jT`Zle0l1SWNOI8ro9j zEJq|d#fb$`$q|8=R==k#YR?#PU~lhWwx8&qdw5R5w6PYCsN1yBg?!7t>I-nMkSY2} zee~>ab~+Znc~nrrEr-gW5YlnCoj`Uenup|NDe=&95AYr4in0x7FJumMi(sy(WNw|c z+fHtbrkJYZs<7$aGaNd0h3MaNLvp-Cr;3)m5j|s-pevGWU^@#S5A9kxZM+XVt%Gw8os~5z%jdiX)p474_wY zi$yyX441npl0Fb>VYZ}iOG+DuE`?FaRCORNFJ019!;*!<_NFv`M4?c~3G-E)(r-zZ zGy0o)rMz8u36CO!pke7#d!u1O|4;rJd{iE(`;*va+n~1EeEy!IKWG)pg@jmT%H>8P zh?sX_Cd{Z6v1Kb_)`^MlxTfp0$EWFKQQq0f+{jC zA2~p^krF3j9@2rGvoN($qrII#Hzd$ON30nzRAVsc{+zE+gIXb6hyB;&rm!KW&RS`H za=y{?r(}|c^9`d=tkm6-mQZ!it_Qi7LbbNaZ_>A#VFCsOFdiA%iR&Jg{a9B1GNu&e z5ZUJ92oL(`^gZ>V@a0(8@u{C25k}9#Ovq^vzHY$`r@*UstX1+JKg%h=$AkA?CCI?5 z?%ISL#IQtwRq}?gma5kl*;DrWB8`;_$%5&x?@h*4$bG)yeO-Te-!7?2$Yv+CjipS3 zUlQ?ycQlJa7hK0ZvahLB(2r!h$rmjf8$-ux(>H_J(*1ax1(nQ5Lu{$+iiJt53hXz- zHYaI?*LSqf$TyqB!YL+Q(EOsP=}>I-j%cyl||UIy59AQ z(&5WMez)A$Hl1fv`hJK4dXM4#^>&IY!@({k9r`0kpW0mSPQ|R)@eAu~MuJ$ZunJxV zY56dUI`XW1>>Mr;jf>K)9f5gm3%xL1b)$XnMMO-0noYq*o!Q@K&ijA<`~iW`!&ehz zctXa!)I87jJe)2LJ*FW9qDX2&tU?h^@99q_#*K)|FjoaW1_8}c_JU%P1Hy4(w5BIg z9^&<01x62g2yr6tkK;M28ysb+gakS zGdgrEG%S_S@}-Oin{Kg$+N7rz%8wa1gA|wxIFFW_t@-VZmH6}{Zt{S0Z#w+jR&|5W zbKm0*XcD5+w)Cv2ZfhwL2hSQSpifG_*sAMwwZ1G83Wja1Vy&r_l-leNC-UJ^)h)9r z)^S05d20*)V%SHcj!KwTViSx&BI<+$BMe5!SsU zy!X48ok{EM%ST;w_>JoxxRRGDfmX@My_=-!LVlLak}vo_jg=VkreUF#QlAiwt3fA2 zH1V78d%8Elq3yw8R-`;{m6G}R^VAh9j|?)7oQQJ+q=K547FQiLzfzi)&wJ%(9pk zW~5-84|pjFFE(Q(N?X=dti>js3soCRH^jsX;0)G~B_x8wcZr{(#S2*aYY565e(npv zi%wIkA^T*KN%5O@iLqzPZJuST}3Crr@?arJNy*G&3p5OctZ&vCC4Ivgy%ah4UsUI_rqJbd%4oCVq>X zQCBZ*3(Lx7Gi)Hzn4?zdI5zFofa0ArA)jb>3P@{VdqRouYt=(vd2AOQd%uUomJo0o zD)P50mwr0llGN{(7<_fZ!d9|vRN+vcRdmu|olOGUPaw&)sd*v1PD7&P9FF$5SQA;U7@<_?7BFfxq4-ARB=I!^d*iY+WL#0^C@H6- z?jGl^QDs#;;TPGZp%26m|NYW-ao_FXIHMMO!Ug7XBehq;PYLW$Wb;`VLkuc{d13Vj zWQRXrX!_^6Ukp!je=|wF7!lPfhmSqh^?G7%5PAPeo}XckP`u-4d`F=EjQ^toV>8u| zt@MUgHoh)wotKnZ6x()`R*bsMOxW)|o)YeE*qs+}*?X5Pql`;tdQeo1r@m^H;PM8c z+@28z0Jqru?kILCXcFn?Z&T9y%yJb=`$v-@bs;FokVT!7mrrV7_(E(pXr_GE@0Y(Rgnj#xH3Y0j@&1U?HngfTMF4wPvaYA>;;jB9&3!>SkqHWTc*qob* z9`FH$(+3esX2c9hto0i6q-f!NU?$>6J#%vW%yKCTl9KJep;o$-eja4J=|oo-QMK`0 z&<_wZ+b8V}vEyzd_ehQCu@ChQc8Jmrm>4ZfO=iSD5FV<`WbVDWjIpwDt8l=+d%|aj z6nEj6hty76@Pc{XygdIhYq+&fZ;Y%i9)l#oZuFK{Ru}1)5m72I?q88}Oz}SL;tQM$ z3(X5dkK$YRqexR+YQ9NV^Y~`3tQ#}amf`TN9rPLwJ~urE7e)_ZW<+h9h|C%#;dBSv z3N?484AO{bz&C~+zOsTO2vm8`Thcy5IY^J7Rhyu1@jKkbbo9*zkBQU89+8&YaNkq@ zlyOce>Tfp-YA5o` zB@^JJ;2$mM=NT+}8TP^MEW<{%N1zd?%5{a;L23#nmj&@Gg zfB|-Qyu0viLO|#dcYZ2_o7HXnt=v`_AL-^mduOBAyL(tT0Je?0hx^~ozVn0hfEU%b zmA#e!G!qpBzIEIV10Z}>?g;l=11%^h2nJ|$KttdpASjUM+h1S+9#kSQCZJG⪚9^ zJv{zq0qon$G6R_a1)>6qx4bm~x%K}O_g6OpalU_J?tXwgAWQ%y0Ga^Q0_Xrx3?Lss z6@XjcZMYRc+dt?A^sT=gz}tWD4$!ypJpe`lbOGoEFb-fEzyN?T0CNB){;?MTy$awq z{S<&%080RF(@z5M0RVCLu)H0cTe)ouJAf-B!owWUXO32XHDH2Z|8uMXe*E{i-$wqG zeme(u55Vf+00hufj#lP>8DZ({$Z784;$X#T_XO!=b=#{DCv!*O9|a)Ltw&o`Lkcj% ofIk=9mU>$Y5H0sVa%TwhbN}Pv=l}1h+Y}-~Lel^3`2RHi3zKjz?*IS* diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/f4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/f4.m4a deleted file mode 100644 index c80a0bfd3b28a1cfe18f5eaab27a7829b78b48c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8530 zcmbt)bzD@>_xD}OC8bNyW$BWX5|CKByJP9@6#;>zLsYs11f)TvyE_C#LJ$xEX%VCZ z44w;qKHu-}`MsY1p7Y|p=iGBzcy-JkcSvKrbPz5T#;NpyzP535p{m^&2R7VUu)yrBSBfk+atlm zecuT*i2F`ilHSv5C^||oq+d3ofwPHn-{%L;>6IaG-aNYBqP0e{Z|`JGy6=&G!9tZ zscFl4%r@fBauOGygC!jXc|;lER~8>E`g@b0x9xK0E%j-;C5L1>{ue)L<>SN2{nbe7 z)5(~E#6G)Vz=IUoVnR$Oe#XzmPeAcwEp>%nwq~;f2dne;6AFMZ7bs`9)MmvRQ3}0` z2iVYtcU90O03O8dPV{GRIG+~EArt3pL+=sCVZkwpb{-!471f#L@#srrD;wmh+-H<; zusAeULKwgID##D%9OBHZ2a=t3J{f4~y~X6Vn75?b6@XXz5YR~h{C|E{QEmMorTOz5 z=C@J#G-K8{``m@)Lb4XuVY(h~Cev!0F^y04V+_@!{c%3znk|gOvPoB>WwDa4!wM^?Ll0*he&BU&9vYE zFh2ko31n(h2-bn*glPTxKmxfE45H1ClP#+x9|iWGZ{O6e~1~AX{RBepC!K zsuTL*v0Zk6Hz$3l5p5Ld=6&SE8;Py~JBdaHudt4up@zr8204P5^IOT1COz247QsWD z4@w{=_kZc$>r|n@8=Wp`&RAm^SxB=oEb;Xk@NY~RcixGyyEWDrJ9FaW^u5yk!~BwO zy2d6w#?cJ@X8`z!%}ym#C<(en2qOg`THF76H&djBOe&?8m%)ohV3LH;uHCnHv)73J zY% zG1evQwm-`I<&VfvmiNJ>N{-0tiVnQGxR}x|W`2s})4s)H5^gSdpQY*u(Vsxx&oJQ? z6&-8~&LRMl4WR0dU%)Xg1~OEcf0JW(E5!pyo1f9q|U;mkmjBk8NKRsA(yK#xyZ1ft{sORB(Y3vOSYP8;d#7Q27%ew9` zZZOX$*4fegf z(alA|bkqgckN+$QY-W#n99hRerjPB%X!&2~BLoF>7xEsPY6NFV@KvglX=c{H(Pd z?F{U~cn?%rLn5yRBJzjtH0*ib@v+%|-s z3oDqObUwQ+DBUcWamui*=JIuBV&znY+}#$74-c)OS$+?cn#!`8*=p%_3G3MgtRJh3 z=PnPN8DM5p67s1$xur9uPe@4q<6v|gAQ*A(_)N;ws%L0*f?pH*EjirXB%I++)r=!) z1=7=!jRJ@-p@du~+t-!GJ<{w@WfE#~87$SKBaNg{HQZhWs`8nG$b~+`S%;rr93e8>wzxJ=q{|ncnx^V&hHMV&V7;bkTVmF)3cW8}QLZsrk`(C=d^ZgMO(3OtC--=v#equ;9oO@_m$qX{Or_p>|h zsxf<{i8U9FwyI79$=*H7wcJTzSwudlEqPwS$mX3j!AX8D#b71;XE9ld>XPu8ay(bY>vb%_+v}myR!mbY3bHuF4q)OCP-g5ZG(_vUz zRs~;&_`%Y@ht?O@Z9^=f0D*rv#MJd3&stHgOj4w-_T}!}gcP0_5vM0{q$jg^v zL>6RB6pRR?*&ck|O2}G%b-=`rzJ%ohIU3)HDa;pQEk{k}E43Sct7s*w38wI%t$>gp zQ_kU<(k|~mbwQ6$C#QPf&!~%HU^VQvR7h3XKsQd@&X#gIT?CkwFlczSE2~>8&$1%R z(vY=cl>KY;TubMYGBXUt2S8!&bvnU9|C>$<`mH_ZOyenUMPTItB?x60TR4GEkid~^ zfMXt0yCa>aNMUCPW_C6=ec>RX>ug0XUfE;4O?<<86Ty#<^u=Dvq&wQ)IkuA$`o;Qk zaYP2<6rD>>(s$X+$kVu~ILfmMWx9jqFOxhgsWC7e5vfqTgtC%H;OB9EBMJMhB>957 zk=j--kyv|%(6T}L*O*U~QvBn`eCy%y(B$1;TZo7>XE1v7*!g&yqn{t)BL-&TxODM} zuQ$J^HHN*?Y(wfK#KiJgWZf1;O^3^JPG39=cQ&E!54Z>)9H)F%aND$b{$8jQ%i7hTZm5O+c7vd6Mi1u@KF%!`c%d`&7$c_&gabCKt*=u(1T7E z5V&859$fdi6-(iIl1HKOqBKErZSzSut1D@vvy^ccQx$l`F#Q|tfi)^fFHJ)aa?Z~FXwf|$@4R#vbH{6E z9vn;~+i^{N!Ul)S4suvCf-%Y8k8JoYooJuJ3)Yg|r2sCuBm)v?G={6shx3?H#k&S1 zdEDJ>K%Qc)w`h{duROL-Lh}G=GOa^dpMi@EB1I@;K(5Em*a`~T@oL(mGo5oSxKS! z^6S!qX(3n^J?ywM9411X7%;zxa3}OaM-XGJ zimdUWg(Lz7O1znlk%p6b>k*dd zv5R>7grWNn(^#uHol#NP8^h_Xg8_PPTh@jNfOD!=8T_AOVcV?y+&n|G0Up8CPkDD}ji} z;wwd;s8xy5@_P{i3!OI8{pGfD5tWv5X<;1Q6b70QKl5*5am*q}w4AUo$HXJ{vRm1C zGn?4DdWimoz2#a0pQ)%%&TvgG8Yw^%AGpo}fi-egu=(_HBr&lJ4%_CG@TSQJIwEet zjyj$j58zMV*7R-ebbXavk{)&w=VVZW)a8?9sj%r_L-Y@rhOD0uKQCM7jXS!>e&D_` z*mSNuD>Xp$7_w_g>wt#CDcS1_q)?2KoA?yQFr?Al>TblauefJZN+p>nOt`cY5>FiOdm{pVs*n5<g`f*(mq8m!CC)Qd!M(_yG(&P;LP6tMvZGjw8YR>eb2pN4}0ZC}wSjYVEufmGe zskg1$MzBvfGr8M#UnEPjnD<2ehywv(j_ zVjOt_w&{8KILx@`=Nq}Xmbq`B1WeiDyiM*+YmzPqr<%HJ2@CkmYRSdMQ?(`?s^L~MuVde;_%vgc zU@M@7V`bPnwM_8Kw?7guW2%pWBINoI0E-wKw{HebrT)4_T{&Ceko@T0R17Ss)$yVCZ!-LxB`bba=Z7)00wgb$Jr)}U ziDxI@w|yC-hJ-a*hv7*cYHoZp^e3k4N)FcCLVrKNu~@Wxg?x6RzI(15D7rPE@B!~tg+?Wp zXNYWAjwE)b56z)osJtvEkItX>qJZ|AAB-1xBr_om#Po-z)lJgkOz(Z*raNbuf5`30 z1#qK&uEas}Ujc_$737B9|Cj7G%MSxG{iCWa(kkkY+IEs=}y=D&dCJI#doVDqH z#%!q5tKHTS((!q(Q(CAv2^}Ejh?L8|J6`OL(kqpz5AkB8!fQO!#f_aF3=B3J8;9#% zbS6h)!c?0{H{$jBsY@IcSLchYGNaRjMbc?$6?m_U+ioJbZb- z=whjOt$s7#q(aoHC%q(rAQ$=Tgj-M}Y-AcQ%gN^3&N^OtOH-*Vm#!)e>+N@O@gpB} ztKvyVY4p(S)ET zHqI79;5=aHbX^*ptonj&BF?CwqtABuRoNo%j#o@n_NVY8Ae0|+`L@8(^`v%XYch9$ zfKTDVJ_{RyOol6_E)-5v6h<%pvd|=peL?D^ z?nT?3mK^?B>heq{G0ulLH%MC>bQn2!NqPNUOI*nrNFM}sK@B|kgkG#htriU7~CnM#!|dd*03I(@Tea&?+V9%94A@xyqeX zx@yLS8{hwo_idhINStRDkGVs&$AE?hyz~f02|Wy3EOU>2M{xQ2EUn;eaKggkpv;7B zQHhQ@zGz#W-sT%Nm-ZQ*=R_sIzHfEW<+5JE&d2O{wi9m5q$M2;NjjS`#(N z>}ioZ;AI53$Ky4vbVqWUIfiM7WF(gcR_*ia9%j^xr;rR#V-)w)-u(?Hd7G<~o8wsP zN;XSbzuEo=QQsM=qhYM8#jSs+RG9DC(^}MB`l|U=x2~Rads20RRCGx1E9L1TvbZIy zB5~C*vs>0&wa)MpQCar)0s&(^!|{e&x|BdBxv8%5`x1(k>+FXrk+p@*Im8PwhQGt3 zh;SiXRr6$KCGnDB*akF5Dp%f#A-b=A{b5Ju+znIF zxwo=Z?XiazQcg^)bncNV%*qb5m^DK02B-zN1{EZjsO*!sBdZjjg?T47l%*m(Y2&_0 zOJUg6En|@ zP$Z2H%_G4W^*RxkET(~f@$^S=%DjTeXreG4W7WMSt7i378I399NPp$2QLjkO&7#H1 z-bVA(!A67q1)a1b!wGVP2rq)<7@(_O|2n86^JT~or4xTM7OqkDMiiR$N>C$2gKZcJ zO;i7*Xc)I7JlGm>;Jwz8eH5^?6yeKCAY&G`^8$Ea=~h6s>_7TF0XK;^3>n zhWT3iFUO{4dnP|4lV3el&c3P{#OXOzA}?KMDu=pMcu9HVpYE+4WTs&?Ahc-e`QEx@I&X> z$G>KT7^yI8CM*&wq~;@Fd|2$S%{oM-A4txo6r}L-hz^W?C!scu4KffDJtm|w<@Te* z==z)G3&Cj2>zaEez{cHguhaO^b7rXKcsB8jO$UR1%(r(78%v{8_`9O`ZCGmCR1*5flAbtuWNjdU{1o$6SM_<_0I`K3skW0%q!B%d zWi`~1LEcJ{y&oS4O5;MDU&g4@=m`4l^hO%Owo6XJeeWgic ztIEOnY+1TVE%DQJX@I|_U0%?h8JgVRe$P@*Tnmh=-&uk5lRsMZP@^q|M z&Pud9OuOyjSm52BmZZX+4ONyKT+4DjcIUxW8o9ZQCRDGo@wZn$F)zn0jg)cuA zG4`Utbv7_QVt5j{ytJoq|H&J+=s0|X&E`ikcu%RJ6a87=yuJlQbS3v~%42OgL;_Bv zqM3yy(%D-2{;2*E>dh_k2xAWQFbc*5`xh*?;7uDX&r965G{hV9dW=@)lR^KykJey3|(K2^J;UF&H~DJL0y+n&vrp(B9bD)cAm?Tefw5eeXo&*Lt;#5IjYUP?Eu9pfx(@ z+hDW)8p$XFZM#K^abDGSfs##-Nl+~tqHOgMU0+~<^=E6Ga~W2Xk~`ug?6(_Qf>wxj zj3R%Pv%g6~n5kWUc)fxUHyQo;$O-=>+}Fl$w|OQ$bHz+uhH_L?={CNRdM`=Xy7zeL z2zy!V1XcT5k^R!wPrmsB&QdXTZ>bC)8b_Dpkzv2pO3ckCd6BilVjx_|WZ*JwW*Azn z4N$UQ9|F0^BZ|_ntid<*MYhF{e@s4+)FGNf5+Hks0OZ6#WG zxunfM^pT6?DJ}Kr24c_O+v``t=X@VHT2iRO*iyyqP5bUsC=(2-G&YzN@uo`zaAT%{ z>OWPCBZs1$^=QLTCqbyg*R|CaQ^PgeGjpQ z{4_2uKk1Rrlm*_dh6AH~1gVy{xT+j|2B_{NrgAIP#%ydDZ%qGar?)MvaQKt`up?z- z_rL_`%}@RIqw_|R!vZxnpKSW1=Cf6u!IIlps+Kq;5H#d%TJ|$e9JlYhEb>PObZ;ms z9J5}&Z#X3)%T0I`U`tORV(*xxU2DxZLLxjZtem_w!&S|=tgq?U)@@j8He;LU+xJ|x zE9ym`NG;iX)aM6KdjDxDEdN6`;ARtp<<-|z0Kk0j>hAs!{MPE?`q04!zOWq%&wV^>My#6Y}3S|GgX7?*E|c zCjM7D|Cao>nAE?*HOBy4Z5)xH2y?ahfAuRD(CfP{$md|=;`MJ;Z+Dd2zw#BAb@#G` zso8>ef=Q!n9Nj?`q}bKb%?=cZyqtS4XV}YDpiUObp z>l|ML8`NNs661gj0**64?d{`pT?Le{Zp#K%0vSLDHgA0;fOMt*$9B!@K%4)ykUHs_vC<EYpGd)HAH36k6#t*X{{bas BFa`hs diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/g4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/sounds/g4.m4a deleted file mode 100644 index 45ea4483021bdee6827f4f2cdaea22e5983979d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8306 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 BLdyUE diff --git a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/styles/index.css b/packages/docs/docs/codelabs/OLD-getting-started/starter-code/styles/index.css deleted file mode 100644 index 988bb49ecb8..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/starter-code/styles/index.css +++ /dev/null @@ -1,75 +0,0 @@ -main { - width: 400px; - position: relative; - margin: 0 auto; - overflow: hidden; - height: 600px; -} - -header { - background-color: green; - width: 100%; -} - -h1 { - width: 400px; - position: relative; - margin: 0 auto; - color: #fff; - font-size: 1.8em; - line-height: 2.4em; -} - -.mode-edit, -.mode-maker, -.mode-blockly { - display: none; -} - -[mode='maker'] .mode-maker, -[mode='edit'] .mode-edit, -[mode='blockly'] .mode-blockly { - display: block; -} - -.blockly-editor { - position: absolute; - top: 64px; - left: -400px; - transition: left 0.4s; - height: 460px; - width: 400px; - background-color: #eee; -} - -[mode='blockly'] .blockly-editor { - left: 0; -} - -.maker { - display: flex; - flex-flow: column; - justify-content: space-between; - height: 460px; - width: 400px; -} - -.maker > div { - display: flex; - justify-content: space-between; -} - -.button { - width: 120px; - height: 140px; - color: #fff; - font-size: 3em; - text-align: center; - vertical-align: middle; - line-height: 140px; -} - -.mdl-button { - margin: 1em 0; - float: right; -} diff --git a/packages/docs/docs/codelabs/OLD-getting-started/the-end.mdx b/packages/docs/docs/codelabs/OLD-getting-started/the-end.mdx deleted file mode 100644 index 3ef945ecccc..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/the-end.mdx +++ /dev/null @@ -1,14 +0,0 @@ ---- -pagination_next: null -description: Summary of the "Getting started with Blockly" codelab. ---- - -# Getting started with Blockly - -## 10. The End - -And with that, you're done with the Blockly codelab! If you'd like to continue playing with the app, we suggest adding or changing the available blocks. There are sample sound files in the `sounds` folder - try hooking them up to a new block! - -For more documentation, visit the [Blockly developer site](/guides/get-started/what-is-blockly). - -Additionally, Blockly has an active [developer forum](https://groups.google.com/g/blockly). Please drop by and say hello. We're happy to answer any questions or give advice on best practices for building an app with Blockly. Feel free to show us your prototypes early; collectively we have a lot of experience and can offer hints which will save you time. diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/index.html b/packages/docs/docs/codelabs/getting-started/complete-code/index.html deleted file mode 100644 index a6c95524da4..00000000000 --- a/packages/docs/docs/codelabs/getting-started/complete-code/index.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - Blockly for the Web Codelab - - - - - - -

-

Music Maker

-

Music Maker Configuration

-
- -
- - - -

- Tap any button to edit its code.
When complete, press Done. -

- -
-
-
1
-
2
-
3
-
-
-
4
-
5
-
6
-
-
-
7
-
8
-
9
-
-
- -
-
-
-
- - - - - - - - - - diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/package-lock.json b/packages/docs/docs/codelabs/getting-started/complete-code/package-lock.json new file mode 100644 index 00000000000..d25fdc9f9e2 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/complete-code/package-lock.json @@ -0,0 +1,5779 @@ +{ + "name": "getting-started-app", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "getting-started-app", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "blockly": "^13.0.0" + }, + "devDependencies": { + "css-loader": "^6.7.1", + "html-webpack-plugin": "^5.5.0", + "source-map-loader": "^4.0.1", + "style-loader": "^3.3.1", + "webpack": "^5.93.0", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.0.4" + } + }, + "node_modules/@acemir/cssom": { + "version": "0.9.31", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", + "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "license": "MIT", + "peer": true + }, + "node_modules/@asamuzakjp/css-color": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.2.tgz", + "integrity": "sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@csstools/css-calc": "^3.0.0", + "@csstools/css-color-parser": "^4.0.1", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0", + "lru-cache": "^11.2.5" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz", + "integrity": "sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.6" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "license": "MIT", + "peer": true + }, + "node_modules/@csstools/color-helpers": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.0.tgz", + "integrity": "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peer": true, + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", + "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.9.tgz", + "integrity": "sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@csstools/color-helpers": "^6.1.0", + "@csstools/css-calc": "^3.2.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.5.tgz", + "integrity": "sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peer": true, + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.7.tgz", + "integrity": "sha512-GDKuYHjP7vAI1kjBo73V+STKr9XIMZknW/xirpRW/EcShX0IKSev/ALafeRfC8Q331nodrXUFu04PugPB0MAhw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.7", + "@jsonjoy.com/fs-node-utils": "4.57.7", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.7.tgz", + "integrity": "sha512-1rWsah2nZtRbNeP+c61QcfGfVrJXBmBD0Hm7Akvv4C9MKEasXnbiOS//iH3T3HwUSSBATGrfSp0Xi8nlNhATeQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.7", + "@jsonjoy.com/fs-node-builtins": "4.57.7", + "@jsonjoy.com/fs-node-utils": "4.57.7", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.7.tgz", + "integrity": "sha512-xhnyeyEVTiIOibFvda/5n89nChMLCPKHHM2WQ+GGDf6+U/IrQBW3Qx6x+Uq1bkDbxBkybLOdIGoBtVBrE8Nngg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.7", + "@jsonjoy.com/fs-node-builtins": "4.57.7", + "@jsonjoy.com/fs-node-utils": "4.57.7", + "@jsonjoy.com/fs-print": "4.57.7", + "@jsonjoy.com/fs-snapshot": "4.57.7", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.7.tgz", + "integrity": "sha512-LWqfY1m+uAosjwM1RrKhMkUnP9jcq1RUczHsNO779ovm1E9v8I/pmj04eBAcoBjhC7ltcPbNFGyRJ5JqSJ7Jdg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.7.tgz", + "integrity": "sha512-9T0zC9LKcAWXDoTLRdLMoJ0seOvJ5bgDKq1tSBoQAFQpPDstQUeV1Oe7PLypdu7F2D3ddRstmwgeNUEN/VaZ4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.57.7", + "@jsonjoy.com/fs-node-builtins": "4.57.7", + "@jsonjoy.com/fs-node-utils": "4.57.7" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.7.tgz", + "integrity": "sha512-jjWSDOsfcog2cZnUCwX5AHmlIq6b6wx5Pz/2LAcNjJ62Rajwg89Fy7ubN+lDHew0/1reLDa9Z5urybYadhh37g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.7" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.7.tgz", + "integrity": "sha512-mFM4P4Gjq0QQHkLnXzPYPEMFrAoe6a5Myedgb6+CmL+nGd3MKvTxYPuD7N1dLIH9RBy1fLdzxd80qvuK8xrx3Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-utils": "4.57.7", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.7.tgz", + "integrity": "sha512-1GS3+plfm2giB3PqokiqyydyqYTPLcCQIKSkp0TdMNRh3KVk7rqRM6U785FLlVRG7XLmkc0KWr215OY+22K3QA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.57.7", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/util": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.8.0.tgz", + "integrity": "sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "@peculiar/asn1-x509-attr": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.8.0.tgz", + "integrity": "sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.8.0.tgz", + "integrity": "sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.8.0.tgz", + "integrity": "sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.8.0", + "@peculiar/asn1-pkcs8": "^2.8.0", + "@peculiar/asn1-rsa": "^2.8.0", + "@peculiar/asn1-schema": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.8.0.tgz", + "integrity": "sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.8.0.tgz", + "integrity": "sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.8.0", + "@peculiar/asn1-pfx": "^2.8.0", + "@peculiar/asn1-pkcs8": "^2.8.0", + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "@peculiar/asn1-x509-attr": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.8.0.tgz", + "integrity": "sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.8.0.tgz", + "integrity": "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.8.0.tgz", + "integrity": "sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.8.0.tgz", + "integrity": "sha512-tHjkfS/qhMnmrlB2J9NhflQlQ7In3khO3CfmVrriOlpTeErY9ZIKOso1hQ5JQiyrJ7ShvqVPk7E5fQmbclkSKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.3.tgz", + "integrity": "sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.37", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.37.tgz", + "integrity": "sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "license": "MIT", + "peer": true, + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/blockly": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-13.0.0.tgz", + "integrity": "sha512-A5sj35fOgVAaEGqgrZftcKv0LxFKOnAQ7BA9uAlXrEQAiJuaKer59QJzmjwhYXiJzrR4fZfF6CQ6gpRr7PIcaQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "jsdom": "^27.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.4.1.tgz", + "integrity": "sha512-9KM4QMPKnaJqaja1v7gYO/+TXZGLtzPA05NmUTqDAJjcsWeVoOXKMvU9g0gfuuoYTQqJZ924hivICd5R/bCJbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "peer": true, + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssstyle": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.7.tgz", + "integrity": "sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@asamuzakjp/css-color": "^4.1.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.21", + "css-tree": "^3.1.0", + "lru-cache": "^11.2.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/data-urls": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.1.tgz", + "integrity": "sha512-euIQENZg6x8mj3fO6o9+fOW8MimUI4PpD/fZBhJfeioZVy9TUpM4UY7KjQNVZFlqwJ0UdzRDzkycB997HEq1BQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^15.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=20" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT", + "peer": true + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.375", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.375.tgz", + "integrity": "sha512-ZWP5eB4BVPW/ZYo9252hQZHZ5XavtsTgpbhcmMmRwymavC5AsLWQWBPaKMeNd2LW0KGby5HPXvj7+sr4ta5j/Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.0.tgz", + "integrity": "sha512-SkE2t82KlkkxQRVMVLAGKxLfORGQfrkx5dkj+vlgXRVNEdPc4eZcR+J/Fvj8C+yKSFH5L0q3NFlyufOVQnCcYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/html-encoding-sniffer/node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.7", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", + "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "peer": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "peer": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", + "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT", + "peer": true + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jsdom": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.4.0.tgz", + "integrity": "sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@acemir/cssom": "^0.9.28", + "@asamuzakjp/dom-selector": "^6.7.6", + "@exodus/bytes": "^1.6.0", + "cssstyle": "^5.3.4", + "data-urls": "^6.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^8.0.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.0", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^15.1.0", + "ws": "^8.18.3", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.4" + } + }, + "node_modules/loader-runner": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "license": "BlueOak-1.0.0", + "peer": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0", + "peer": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.57.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.7.tgz", + "integrity": "sha512-YZPphUQZSRGk6ddPlsNuMbztrLwsbUATFNZcqKscSbSJZ4g0+Y3vSZLJ/rfnGZaB1FFhC7SrywZXev6i8lnHgg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.7", + "@jsonjoy.com/fs-fsa": "4.57.7", + "@jsonjoy.com/fs-node": "4.57.7", + "@jsonjoy.com/fs-node-builtins": "4.57.7", + "@jsonjoy.com/fs-node-to-fsa": "4.57.7", + "@jsonjoy.com/fs-node-utils": "4.57.7", + "@jsonjoy.com/fs-print": "4.57.7", + "@jsonjoy.com/fs-snapshot": "4.57.7", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-releases": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "license": "MIT", + "peer": true, + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/qs": { + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "license": "ISC", + "peer": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", + "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.2.tgz", + "integrity": "sha512-oYwAqCuL0OZhBoSgmdrLa7mv9MjommVMiQIWgcztf+eS4+8BfcUee6nenFnDhKOhzAVnk5gpZdfnz1iiBv+5sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT", + "peer": true + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", + "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/thingies": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", + "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tldts": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.4.tgz", + "integrity": "sha512-kFXFK7O4WPextIUAOk8qtnw9dxR9UIXP9CjuH1cTBVBZMDeQcUPgr/IazGiw1B0Yiw5L75gHLWeW4iD793r90g==", + "license": "MIT", + "peer": true, + "dependencies": { + "tldts-core": "^7.4.4" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.4.tgz", + "integrity": "sha512-vwVLJVvvpslm7vqAH7+XNj/neA/Ynq7DT2EEcMuwc5YzN5XaMyRAqxwU+uX3azZ1FQtB2gvrvnLnAEkvYlVdfg==", + "license": "MIT", + "peer": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "license": "MIT", + "peer": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "license": "MIT", + "peer": true, + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/watchpack": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=20" + } + }, + "node_modules/webpack": { + "version": "5.107.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", + "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.22.0", + "es-module-lexer": "^2.1.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "loader-runner": "^4.3.2", + "mime-db": "^1.54.0", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.5.0", + "watchpack": "^2.5.1", + "webpack-sources": "^3.5.0" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.5.tgz", + "integrity": "sha512-4wZtCquSuv9CKX8oybo+mqxtxZqWz47uM1Ch94lxowBztOhWCbhqvRbfC/mODOwxgV2brY+JGZpHq58/SuVFYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.25", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.8.1", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.22.1", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^5.5.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", + "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.5.tgz", + "integrity": "sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", + "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", + "license": "MIT", + "peer": true, + "dependencies": { + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT", + "peer": true + } + } +} diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/package.json b/packages/docs/docs/codelabs/getting-started/complete-code/package.json new file mode 100644 index 00000000000..2551514c792 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/complete-code/package.json @@ -0,0 +1,29 @@ +{ + "name": "getting-started-app", + "version": "1.0.0", + "description": "A sample app using Blockly", + "main": "index.js", + "private": true, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "webpack --mode production", + "start": "webpack serve --open --mode development" + }, + "keywords": [ + "blockly" + ], + "author": "", + "license": "Apache-2.0", + "devDependencies": { + "css-loader": "^6.7.1", + "html-webpack-plugin": "^5.5.0", + "source-map-loader": "^4.0.1", + "style-loader": "^3.3.1", + "webpack": "^5.93.0", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.0.4" + }, + "dependencies": { + "blockly": "^13.0.0" + } +} \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/scripts/main.js b/packages/docs/docs/codelabs/getting-started/complete-code/scripts/main.js deleted file mode 100644 index e1a54cd71d2..00000000000 --- a/packages/docs/docs/codelabs/getting-started/complete-code/scripts/main.js +++ /dev/null @@ -1,102 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ -(function () { - let currentButton; - - function handlePlay(event) { - loadWorkspace(event.target); - let code = javascript.javascriptGenerator.workspaceToCode( - Blockly.getMainWorkspace(), - ); - code += 'MusicMaker.play();'; - // Eval can be dangerous. For more controlled execution, check - // https://github.com/NeilFraser/JS-Interpreter. - try { - eval(code); - } catch (error) { - console.log(error); - } - } - - function loadWorkspace(button) { - const workspace = Blockly.getMainWorkspace(); - if (button.blocklySave) { - Blockly.serialization.workspaces.load(button.blocklySave, workspace); - } else { - workspace.clear(); - } - } - - function save(button) { - button.blocklySave = Blockly.serialization.workspaces.save( - Blockly.getMainWorkspace(), - ); - } - - function handleSave() { - document.body.setAttribute('mode', 'edit'); - save(currentButton); - } - - function enableEditMode() { - document.body.setAttribute('mode', 'edit'); - document.querySelectorAll('.button').forEach((btn) => { - btn.removeEventListener('click', handlePlay); - btn.addEventListener('click', enableBlocklyMode); - }); - } - - function enableMakerMode() { - document.body.setAttribute('mode', 'maker'); - document.querySelectorAll('.button').forEach((btn) => { - btn.addEventListener('click', handlePlay); - btn.removeEventListener('click', enableBlocklyMode); - }); - } - - function enableBlocklyMode(e) { - document.body.setAttribute('mode', 'blockly'); - currentButton = e.target; - loadWorkspace(currentButton); - } - - document.querySelector('#edit').addEventListener('click', enableEditMode); - document.querySelector('#done').addEventListener('click', enableMakerMode); - document.querySelector('#save').addEventListener('click', handleSave); - - enableMakerMode(); - - const toolbox = { - kind: 'flyoutToolbox', - contents: [ - { - kind: 'block', - type: 'controls_repeat_ext', - inputs: { - TIMES: { - shadow: { - type: 'math_number', - fields: { - NUM: 5, - }, - }, - }, - }, - }, - { - kind: 'block', - type: 'play_sound', - }, - ], - }; - - Blockly.inject('blocklyDiv', { - toolbox: toolbox, - scrollbars: false, - horizontalLayout: true, - toolboxPosition: 'end', - }); -})(); diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/scripts/music_maker.js b/packages/docs/docs/codelabs/getting-started/complete-code/scripts/music_maker.js deleted file mode 100644 index 7959de10a83..00000000000 --- a/packages/docs/docs/codelabs/getting-started/complete-code/scripts/music_maker.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ -const MusicMaker = { - queue_: [], - player_: new Audio(), - queueSound: function (soundUrl) { - this.queue_.push(soundUrl); - }, - play: function () { - const next = this.queue_.shift(); - if (next) { - this.player_.src = next; - this.player_.play(); - } - }, -}; - -MusicMaker.player_.addEventListener('ended', MusicMaker.play.bind(MusicMaker)); diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/scripts/sound_blocks.js b/packages/docs/docs/codelabs/getting-started/complete-code/scripts/sound_blocks.js deleted file mode 100644 index 81101c1051f..00000000000 --- a/packages/docs/docs/codelabs/getting-started/complete-code/scripts/sound_blocks.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -Blockly.defineBlocksWithJsonArray([ - // Block for colour picker. - { - type: 'play_sound', - message0: 'Play %1', - args0: [ - { - type: 'field_dropdown', - name: 'VALUE', - options: [ - ['C4', 'sounds/c4.m4a'], - ['D4', 'sounds/d4.m4a'], - ['E4', 'sounds/e4.m4a'], - ['F4', 'sounds/f4.m4a'], - ['G4', 'sounds/g4.m4a'], - ], - }, - ], - previousStatement: null, - nextStatement: null, - colour: 355, - }, -]); - -javascript.javascriptGenerator.forBlock['play_sound'] = function (block) { - const value = "'" + block.getFieldValue('VALUE') + "'"; - return 'MusicMaker.queueSound(' + value + ');\n'; -}; diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/sounds/c4.m4a b/packages/docs/docs/codelabs/getting-started/complete-code/sounds/c4.m4a deleted file mode 100644 index 33941cfae1550c1971a1713664e5f41cbd74531c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8833 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 C(LC1x diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/sounds/c5.m4a b/packages/docs/docs/codelabs/getting-started/complete-code/sounds/c5.m4a deleted file mode 100644 index 49721cd31dfcb6154563e05a4ddfb4c3c7c03fa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8635 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

xg=QnTcLx$HKyyHsf>6T3T9C?@=D(8NpNtf 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 J68=Ax{|DjmhLr#S diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/sounds/e4.m4a b/packages/docs/docs/codelabs/getting-started/complete-code/sounds/e4.m4a deleted file mode 100644 index d910052ef9fe9dbededf8bb949e813d2491c608e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8454 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⪚9^ zJv{zq0qon$G6R_a1)>6qx4bm~x%K}O_g6OpalU_J?tXwgAWQ%y0Ga^Q0_Xrx3?Lss z6@XjcZMYRc+dt?A^sT=gz}tWD4$!ypJpe`lbOGoEFb-fEzyN?T0CNB){;?MTy$awq z{S<&%080RF(@z5M0RVCLu)H0cTe)ouJAf-B!owWUXO32XHDH2Z|8uMXe*E{i-$wqG zeme(u55Vf+00hufj#lP>8DZ({$Z784;$X#T_XO!=b=#{DCv!*O9|a)Ltw&o`Lkcj% ofIk=9mU>$Y5H0sVa%TwhbN}Pv=l}1h+Y}-~Lel^3`2RHi3zKjz?*IS* diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/sounds/f4.m4a b/packages/docs/docs/codelabs/getting-started/complete-code/sounds/f4.m4a deleted file mode 100644 index c80a0bfd3b28a1cfe18f5eaab27a7829b78b48c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8530 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 BFa`hs diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/sounds/g4.m4a b/packages/docs/docs/codelabs/getting-started/complete-code/sounds/g4.m4a deleted file mode 100644 index 45ea4483021bdee6827f4f2cdaea22e5983979d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8306 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 BLdyUE diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/src/blocks/text.js b/packages/docs/docs/codelabs/getting-started/complete-code/src/blocks/text.js new file mode 100644 index 00000000000..a84680bc6b2 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/complete-code/src/blocks/text.js @@ -0,0 +1,35 @@ +/** + * @license + * Copyright 2023 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as Blockly from 'blockly/core'; + +// Create a custom block called 'add_text' that adds +// text to the output div on the sample app. +// This is just an example and you should replace this with your +// own custom blocks. +const addText = { + type: 'add_text', + message0: 'Add text %1', + args0: [ + { + type: 'input_value', + name: 'TEXT', + check: 'String', + }, + ], + previousStatement: null, + nextStatement: null, + colour: 160, + tooltip: '', + helpUrl: '', +}; + +// Create the block definitions for the JSON-only blocks. +// This does not register their definitions with Blockly. +// This file has no side effects! +export const blocks = Blockly.common.createBlockDefinitionsFromJsonArray([ + addText, +]); diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/src/generators/javascript.js b/packages/docs/docs/codelabs/getting-started/complete-code/src/generators/javascript.js new file mode 100644 index 00000000000..0315d9504d6 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/complete-code/src/generators/javascript.js @@ -0,0 +1,30 @@ +/** + * @license + * Copyright 2023 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import {Order} from 'blockly/javascript'; + +// Export all the code generators for our custom blocks, +// but don't register them with Blockly yet. +// This file has no side effects! +export const forBlock = Object.create(null); + +forBlock['add_text'] = function (block, generator) { + const text = generator.valueToCode(block, 'TEXT', Order.NONE) || "''"; + const addText = generator.provideFunction_( + 'addText', + `function ${generator.FUNCTION_NAME_PLACEHOLDER_}(text) { + + // Add text to the output area. + const outputDiv = document.getElementById('output'); + const textEl = document.createElement('p'); + textEl.innerText = text; + outputDiv.appendChild(textEl); +}`, + ); + // Generate the function call for this block. + const code = `${addText}(${text});\n`; + return code; +}; diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/src/index.css b/packages/docs/docs/codelabs/getting-started/complete-code/src/index.css new file mode 100644 index 00000000000..f282700701f --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/complete-code/src/index.css @@ -0,0 +1,40 @@ +body { + margin: 0; + max-width: 100vw; +} + +pre, +code { + overflow: auto; +} + +#pageContainer { + display: flex; + width: 100%; + max-width: 100vw; + height: 100vh; +} + +#blocklyDiv { + flex-basis: 100%; + height: 100%; + min-width: 600px; +} + +#outputPane { + display: flex; + flex-direction: column; + width: 400px; + flex: 0 0 400px; + overflow: auto; + margin: 1rem; +} + +#generatedCode { + height: 50%; + background-color: rgb(247, 240, 228); +} + +#output { + height: 50%; +} diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/src/index.html b/packages/docs/docs/codelabs/getting-started/complete-code/src/index.html new file mode 100644 index 00000000000..36d8eeacd99 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/complete-code/src/index.html @@ -0,0 +1,16 @@ + + + + + Blockly Sample App + + +

+
+
+
+
+
+
+ + diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/src/index.js b/packages/docs/docs/codelabs/getting-started/complete-code/src/index.js new file mode 100644 index 00000000000..36abfb6dd82 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/complete-code/src/index.js @@ -0,0 +1,62 @@ +/** + * @license + * Copyright 2023 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as Blockly from 'blockly'; +import {blocks} from './blocks/text'; +import {forBlock} from './generators/javascript'; +import {javascriptGenerator} from 'blockly/javascript'; +import {save, load} from './serialization'; +import {toolbox} from './toolbox'; +import './index.css'; + +// Register the blocks and generator with Blockly +Blockly.common.defineBlocks(blocks); +Object.assign(javascriptGenerator.forBlock, forBlock); + +// Set up UI elements and inject Blockly +const codeDiv = document.getElementById('generatedCode').firstChild; +const outputDiv = document.getElementById('output'); +const blocklyDiv = document.getElementById('blocklyDiv'); +const ws = Blockly.inject(blocklyDiv, {toolbox}); + +// This function resets the code and output divs, shows the +// generated code from the workspace, and evals the code. +// In a real application, you probably shouldn't use `eval`. +const runCode = () => { + const code = javascriptGenerator.workspaceToCode(ws); + codeDiv.innerText = code; + + outputDiv.innerHTML = ''; + + eval(code); +}; + +// Load the initial state from storage and run the code. +load(ws); +runCode(); + +// Every time the workspace changes state, save the changes to storage. +ws.addChangeListener((e) => { + // UI events are things like scrolling, zooming, etc. + // No need to save after one of these. + if (e.isUiEvent) return; + save(ws); +}); + +// Whenever the workspace changes meaningfully, run the code again. +ws.addChangeListener((e) => { + // Don't run the code when the workspace finishes loading; we're + // already running it once when the application starts. + // Don't run the code during drags; we might have invalid state. + if ( + e.isUiEvent || + e.type == Blockly.Events.FINISHED_LOADING || + ws.isDragging() + ) { + return; + } + runCode(); +}); diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/src/serialization.js b/packages/docs/docs/codelabs/getting-started/complete-code/src/serialization.js new file mode 100644 index 00000000000..1fe1b420336 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/complete-code/src/serialization.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2023 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as Blockly from 'blockly/core'; + +const storageKey = 'getting-started-app/mainWorkspace'; + +/** + * Saves the state of the workspace to browser's local storage. + * @param {Blockly.Workspace} workspace Blockly workspace to save. + */ +export const save = function (workspace) { + const data = Blockly.serialization.workspaces.save(workspace); + window.localStorage?.setItem(storageKey, JSON.stringify(data)); +}; + +/** + * Loads saved state from local storage into the given workspace. + * @param {Blockly.Workspace} workspace Blockly workspace to load into. + */ +export const load = function (workspace) { + const data = window.localStorage?.getItem(storageKey); + if (!data) return; + + // Don't emit events during loading. + Blockly.Events.disable(); + Blockly.serialization.workspaces.load(JSON.parse(data), workspace, false); + Blockly.Events.enable(); +}; diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/src/toolbox.js b/packages/docs/docs/codelabs/getting-started/complete-code/src/toolbox.js new file mode 100644 index 00000000000..6baaacfdbbd --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/complete-code/src/toolbox.js @@ -0,0 +1,27 @@ +export const toolbox = { + kind: 'flyoutToolbox', + contents: [ + { + kind: 'block', + type: 'controls_repeat_ext', + inputs: { + TIMES: { + shadow: { + type: 'math_number', + fields: { + NUM: 3, + }, + }, + }, + }, + }, + { + kind: 'block', + type: 'text', + }, + { + kind: 'block', + type: 'add_text', + }, + ] +}; \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/styles/index.css b/packages/docs/docs/codelabs/getting-started/complete-code/styles/index.css deleted file mode 100644 index 988bb49ecb8..00000000000 --- a/packages/docs/docs/codelabs/getting-started/complete-code/styles/index.css +++ /dev/null @@ -1,75 +0,0 @@ -main { - width: 400px; - position: relative; - margin: 0 auto; - overflow: hidden; - height: 600px; -} - -header { - background-color: green; - width: 100%; -} - -h1 { - width: 400px; - position: relative; - margin: 0 auto; - color: #fff; - font-size: 1.8em; - line-height: 2.4em; -} - -.mode-edit, -.mode-maker, -.mode-blockly { - display: none; -} - -[mode='maker'] .mode-maker, -[mode='edit'] .mode-edit, -[mode='blockly'] .mode-blockly { - display: block; -} - -.blockly-editor { - position: absolute; - top: 64px; - left: -400px; - transition: left 0.4s; - height: 460px; - width: 400px; - background-color: #eee; -} - -[mode='blockly'] .blockly-editor { - left: 0; -} - -.maker { - display: flex; - flex-flow: column; - justify-content: space-between; - height: 460px; - width: 400px; -} - -.maker > div { - display: flex; - justify-content: space-between; -} - -.button { - width: 120px; - height: 140px; - color: #fff; - font-size: 3em; - text-align: center; - vertical-align: middle; - line-height: 140px; -} - -.mdl-button { - margin: 1em 0; - float: right; -} diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/webpack.config.js b/packages/docs/docs/codelabs/getting-started/complete-code/webpack.config.js new file mode 100644 index 00000000000..1a095648fd7 --- /dev/null +++ b/packages/docs/docs/codelabs/getting-started/complete-code/webpack.config.js @@ -0,0 +1,59 @@ +const path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); + +// Base config that applies to either development or production mode. +const config = { + entry: './src/index.js', + output: { + // Compile the source files into a bundle. + filename: 'bundle.js', + path: path.resolve(__dirname, 'dist'), + clean: true, + }, + // Enable webpack-dev-server to get hot refresh of the app. + devServer: { + static: './build', + }, + module: { + rules: [ + { + // Load CSS files. They can be imported into JS files. + test: /\.css$/i, + use: ['style-loader', 'css-loader'], + }, + ], + }, + plugins: [ + // Generate the HTML index page based on our template. + // This will output the same index page with the bundle we + // created above added in a script tag. + new HtmlWebpackPlugin({ + template: 'src/index.html', + }), + ], +}; + +module.exports = (env, argv) => { + if (argv.mode === 'development') { + // Set the output path to the `build` directory + // so we don't clobber production builds. + config.output.path = path.resolve(__dirname, 'build'); + + // Generate source maps for our code for easier debugging. + // Not suitable for production builds. If you want source maps in + // production, choose a different one from https://webpack.js.org/configuration/devtool + config.devtool = 'eval-cheap-module-source-map'; + + // Include the source maps for Blockly for easier debugging Blockly code. + config.module.rules.push({ + test: /(blockly[/\\].*\.js)$/, + use: [require.resolve('source-map-loader')], + enforce: 'pre', + }); + + // Ignore spurious warnings from source-map-loader + // It can't find source maps for some Closure modules and that is expected + config.ignoreWarnings = [/Failed to parse source map.*blockly/]; + } + return config; +}; diff --git a/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx b/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx index 03d4b93fea0..c75eb5019d1 100644 --- a/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx +++ b/packages/docs/docs/codelabs/getting-started/create-a-blockly-workspace.mdx @@ -14,8 +14,8 @@ In this section you will learn how to add a workspace to your app, including how A Blockly workspace has two main components: -- A toolbox that contains all blocks that are available to the user (the grey area). -- The area where the user assembles their blocks (the white area). +- A toolbox that contains all blocks that are available to the user (the grey area on the left). +- The area where the user assembles their blocks (the white area on the right). { outputDiv.innerHTML = ''; - eval(code); + // Wrap `eval` in a `try/catch` so that any runtime errors are + // logged to the console, instead of failing quietly. + try { + eval(code); + } catch (error) { + console.log(error); + } }; ``` @@ -97,17 +102,6 @@ ws.addChangeListener((e) => { }); ``` -{/* TODO: add a try catch to sample app? this would be good!!!!!! -Finally, execute the script with the `eval` function. Wrap it in a `try/catch` so that any runtime errors are logged to the console, instead of failing quietly: - -```js -try { - eval(code); -} catch (error) { - console.log(error); -} -``` */} - ### A note on eval Executing scripts with eval is not always the safest option - we use it here for simplicity. If you intend to run the user's blocks in production, check out the JS Interpreter project. This project is separate from Blockly, but was specifically written for Blockly. diff --git a/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx b/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx index 574f73b9e42..4a780bc5641 100644 --- a/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx +++ b/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx @@ -7,7 +7,7 @@ description: How to save and load your workspace. ## 7. Save/load workspace You now have a Blockly workspace. However, if you reload the page, you'll find that any blocks you've dragged into the workspace will disappear. -Your users likely won't want their blocks to vanish, so let's save the state of the workspace in local browser storage. +Your users likely won't want their blocks to vanish, but you can fix this by saving the state of the workspace in local browser storage. ### Add the save method @@ -32,9 +32,9 @@ export const save = function (workspace) { ### Add the load method -When a user opens or reloads the page, the blocks in local storage should be loaded back into the workspace. +When a user opens or reloads the page, the blocks in local storage should be loaded back into the workspace. The following `load` function handles this by checking for items in local storage and loading them into the workspace. -In the `serialization.js` file, add the following `load` function. `load` checks for items in local storage and loads them into the workspace. +In the `serialization.js` file, add this code: ```js /** @@ -78,10 +78,9 @@ ws.addChangeListener((e) => { }); ``` -This change listener is not yet complete because there are some types of events that we shouldn't save after. +This change listener is not yet complete, since there are some types of events that you shouldn't save after. UI changes (e.g. scrolling, zooming, or opening toolbox categories) change how the workspace *looks* but don't change the state of the blocks. -Because we're only saving the blocks, we won't save after these types of events. -These types of events are called UI events, so we'll add a check to ignore UI events in the change listener. +Since we're only saving the blocks, we won't save after these types of events. Here's the full change listener code: diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/package-lock.json b/packages/docs/docs/codelabs/getting-started/starter-code/package-lock.json index dc1ef9c8442..d25fdc9f9e2 100644 --- a/packages/docs/docs/codelabs/getting-started/starter-code/package-lock.json +++ b/packages/docs/docs/codelabs/getting-started/starter-code/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "blockly": "^12.0.0" + "blockly": "^13.0.0" }, "devDependencies": { "css-loader": "^6.7.1", @@ -21,23 +21,52 @@ "webpack-dev-server": "^5.0.4" } }, + "node_modules/@acemir/cssom": { + "version": "0.9.31", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", + "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "license": "MIT", + "peer": true + }, "node_modules/@asamuzakjp/css-color": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", - "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.2.tgz", + "integrity": "sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg==", "license": "MIT", + "peer": true, "dependencies": { - "@csstools/css-calc": "^2.1.3", - "@csstools/css-color-parser": "^3.0.9", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^10.4.3" + "@csstools/css-calc": "^3.0.0", + "@csstools/css-color-parser": "^4.0.1", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0", + "lru-cache": "^11.2.5" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz", + "integrity": "sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.6" } }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "license": "MIT", + "peer": true + }, "node_modules/@csstools/color-helpers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", - "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.0.tgz", + "integrity": "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==", "funding": [ { "type": "github", @@ -49,14 +78,15 @@ } ], "license": "MIT-0", + "peer": true, "engines": { - "node": ">=18" + "node": ">=20.19.0" } }, "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", + "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", "funding": [ { "type": "github", @@ -68,18 +98,19 @@ } ], "license": "MIT", + "peer": true, "engines": { - "node": ">=18" + "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, "node_modules/@csstools/css-color-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", - "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.9.tgz", + "integrity": "sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==", "funding": [ { "type": "github", @@ -91,22 +122,23 @@ } ], "license": "MIT", + "peer": true, "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "@csstools/css-calc": "^2.1.4" + "@csstools/color-helpers": "^6.1.0", + "@csstools/css-calc": "^3.2.1" }, "engines": { - "node": ">=18" + "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", "funding": [ { "type": "github", @@ -118,17 +150,43 @@ } ], "license": "MIT", + "peer": true, "engines": { - "node": ">=18" + "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.5.tgz", + "integrity": "sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peer": true, + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } } }, "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", "funding": [ { "type": "github", @@ -140,8 +198,9 @@ } ], "license": "MIT", + "peer": true, "engines": { - "node": ">=18" + "node": ">=20.19.0" } }, "node_modules/@discoveryjs/json-ext": { @@ -1307,6 +1366,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 14" } @@ -1438,6 +1498,16 @@ "dev": true, "license": "MIT" }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "license": "MIT", + "peer": true, + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -1452,15 +1522,15 @@ } }, "node_modules/blockly": { - "version": "12.5.1", - "resolved": "https://registry.npmjs.org/blockly/-/blockly-12.5.1.tgz", - "integrity": "sha512-etXLpUtEkcRibHGwIJ4BsvnIzMJJs0C0yPIjE/W0NCtj8ACha/a7Q9n7Ib6+j7N4EzQ0p28YPZMnypi5pNIj1g==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-13.0.0.tgz", + "integrity": "sha512-A5sj35fOgVAaEGqgrZftcKv0LxFKOnAQ7BA9uAlXrEQAiJuaKer59QJzmjwhYXiJzrR4fZfF6CQ6gpRr7PIcaQ==", "license": "Apache-2.0", - "dependencies": { - "jsdom": "26.1.0" - }, "engines": { - "node": ">=18" + "node": ">=22" + }, + "peerDependencies": { + "jsdom": "^27.4.0" } }, "node_modules/body-parser": { @@ -1943,6 +2013,20 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "peer": true, + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/css-what": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", @@ -1970,29 +2054,43 @@ } }, "node_modules/cssstyle": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", - "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.7.tgz", + "integrity": "sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==", "license": "MIT", + "peer": true, "dependencies": { - "@asamuzakjp/css-color": "^3.2.0", - "rrweb-cssom": "^0.8.0" + "@asamuzakjp/css-color": "^4.1.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.21", + "css-tree": "^3.1.0", + "lru-cache": "^11.2.4" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.1.tgz", + "integrity": "sha512-euIQENZg6x8mj3fO6o9+fOW8MimUI4PpD/fZBhJfeioZVy9TUpM4UY7KjQNVZFlqwJ0UdzRDzkycB997HEq1BQ==", "license": "MIT", + "peer": true, "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^15.1.0" }, "engines": { - "node": ">=18" + "node": ">=20" + } + }, + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=20" } }, "node_modules/debug": { @@ -2016,7 +2114,8 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/default-browser": { "version": "5.5.0", @@ -2246,12 +2345,13 @@ } }, "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", "license": "BSD-2-Clause", + "peer": true, "engines": { - "node": ">=0.12" + "node": ">=20.19.0" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" @@ -2847,15 +2947,34 @@ } }, "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", "license": "MIT", + "peer": true, "dependencies": { - "whatwg-encoding": "^3.1.1" + "@exodus/bytes": "^1.6.0" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/html-encoding-sniffer/node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } } }, "node_modules/html-minifier-terser": { @@ -2998,6 +3117,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "license": "MIT", + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -3036,6 +3156,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", + "peer": true, "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -3058,6 +3179,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -3266,7 +3388,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/is-wsl": { "version": "3.1.1", @@ -3324,34 +3447,35 @@ } }, "node_modules/jsdom": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", - "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", - "license": "MIT", - "dependencies": { - "cssstyle": "^4.2.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.5.0", - "html-encoding-sniffer": "^4.0.0", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.4.0.tgz", + "integrity": "sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@acemir/cssom": "^0.9.28", + "@asamuzakjp/dom-selector": "^6.7.6", + "@exodus/bytes": "^1.6.0", + "cssstyle": "^5.3.4", + "data-urls": "^6.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.16", - "parse5": "^7.2.1", - "rrweb-cssom": "^0.8.0", + "parse5": "^8.0.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^5.1.1", + "tough-cookie": "^6.0.0", "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", + "webidl-conversions": "^8.0.0", "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.1", - "ws": "^8.18.0", + "whatwg-url": "^15.1.0", + "ws": "^8.18.3", "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { "canvas": "^3.0.0" @@ -3362,6 +3486,24 @@ } } }, + "node_modules/jsdom/node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -3435,10 +3577,14 @@ } }, "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "license": "BlueOak-1.0.0", + "peer": true, + "engines": { + "node": "20 || >=22" + } }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -3450,6 +3596,13 @@ "node": ">= 0.4" } }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0", + "peer": true + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -3684,12 +3837,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/nwsapi": { - "version": "2.2.24", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.24.tgz", - "integrity": "sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==", - "license": "MIT" - }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -3821,12 +3968,13 @@ } }, "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", "license": "MIT", + "peer": true, "dependencies": { - "entities": "^6.0.0" + "entities": "^8.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -4098,6 +4246,7 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -4253,7 +4402,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4321,12 +4469,6 @@ "node": ">= 4" } }, - "node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "license": "MIT" - }, "node_modules/run-applescript": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", @@ -4365,6 +4507,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, "license": "MIT" }, "node_modules/saxes": { @@ -4372,6 +4515,7 @@ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "license": "ISC", + "peer": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -4726,7 +4870,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -4879,7 +5022,8 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/tapable": { "version": "2.3.3", @@ -5007,22 +5151,24 @@ "license": "MIT" }, "node_modules/tldts": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.4.tgz", + "integrity": "sha512-kFXFK7O4WPextIUAOk8qtnw9dxR9UIXP9CjuH1cTBVBZMDeQcUPgr/IazGiw1B0Yiw5L75gHLWeW4iD793r90g==", "license": "MIT", + "peer": true, "dependencies": { - "tldts-core": "^6.1.86" + "tldts-core": "^7.4.4" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "license": "MIT" + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.4.tgz", + "integrity": "sha512-vwVLJVvvpslm7vqAH7+XNj/neA/Ynq7DT2EEcMuwc5YzN5XaMyRAqxwU+uX3azZ1FQtB2gvrvnLnAEkvYlVdfg==", + "license": "MIT", + "peer": true }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -5048,27 +5194,29 @@ } }, "node_modules/tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { - "tldts": "^6.1.32" + "tldts": "^7.0.5" }, "engines": { "node": ">=16" } }, "node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", "license": "MIT", + "peer": true, "dependencies": { "punycode": "^2.3.1" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/tree-dump": { @@ -5227,6 +5375,7 @@ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "license": "MIT", + "peer": true, "dependencies": { "xml-name-validator": "^5.0.0" }, @@ -5258,12 +5407,13 @@ } }, "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", "license": "BSD-2-Clause", + "peer": true, "engines": { - "node": ">=12" + "node": ">=20" } }, "node_modules/webpack": { @@ -5524,39 +5674,28 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/whatwg-mimetype": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "license": "MIT", + "peer": true, "engines": { "node": ">=18" } }, "node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", + "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", "license": "MIT", + "peer": true, "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/which": { @@ -5624,6 +5763,7 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=18" } @@ -5632,7 +5772,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "license": "MIT" + "license": "MIT", + "peer": true } } } diff --git a/packages/docs/docs/codelabs/getting-started/the-end.mdx b/packages/docs/docs/codelabs/getting-started/the-end.mdx index 46d8993fdbf..e03069e0944 100644 --- a/packages/docs/docs/codelabs/getting-started/the-end.mdx +++ b/packages/docs/docs/codelabs/getting-started/the-end.mdx @@ -11,10 +11,8 @@ And with that, you're done with your first Blockly codelab! ### Sample app -We provide a [sample app](https://www.npmjs.com/package/@blockly/create-package) through npm as a way to help you get started with your Blockly project. What you've built today is almost identical to the sample app. - -In the future, you can use this codelab as a basis for future Blockly projects, or you can create a new sample app using the instructions on the [Blockly sample app](/guides/get-started/sample-app-overview) page. -TODO: need a new home for the sample app page +What you've built today is almost identical to Blocky's sample app. +To make your own Blockly project, you can follow the instructions to install the sample app from the [sample app overview](/guides/get-started/sample-app-overview) or continue building off this codelab. One key difference to note between this codelab and the sample app is that the sample app's toolbox includes *all* of Blockly's built-in blocks. We strongly recommend against using every built-in block in your Blockly project. Instead, you should carefully select the blocks that your users may need. diff --git a/packages/docs/sidebars.js b/packages/docs/sidebars.js index 30672fcbe00..61a6884618c 100644 --- a/packages/docs/sidebars.js +++ b/packages/docs/sidebars.js @@ -51,7 +51,7 @@ const sidebars = { }, { type: 'doc', - label: '4. Add basic HTML and CS', + label: '4. Add basic HTML and CSS', id: 'codelabs/getting-started/create-base-app', }, { From 6ace1ac232d71d9bccf596a3be3f5ccdd6b4d02e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Spriggs?= Date: Fri, 26 Jun 2026 12:04:09 -0400 Subject: [PATCH 6/8] docs: typo fixes and rm old images --- .../getting-started/complete-code/src/index.js | 8 +++++++- .../getting-started/create-a-custom-block.mdx | 2 +- .../getting-started/create-base-app.mdx | 2 +- .../generate-javaScript-code.mdx | 6 +++--- .../getting-started/run-generated-code.mdx | 6 ++++-- .../getting-started/save-load-workspace.mdx | 9 +++++++-- .../REMOVE OLD PHOTOS/d4_three_times.png | Bin 12379 -> 0 bytes .../edit_mode_unimplemented.png | Bin 7416 -> 0 bytes .../REMOVE OLD PHOTOS/play_mode.png | Bin 11308 -> 0 bytes .../REMOVE OLD PHOTOS/play_sound_block.png | Bin 2126 -> 0 bytes .../REMOVE OLD PHOTOS/toolbox_two_blocks.png | Bin 7515 -> 0 bytes .../REMOVE OLD PHOTOS/workspace_with_loop.png | Bin 5700 -> 0 bytes .../REMOVE OLD PHOTOS/workspace_with_loops.png | Bin 7177 -> 0 bytes .../workspace_with_toolbox.png | Bin 7539 -> 0 bytes 14 files changed, 23 insertions(+), 10 deletions(-) delete mode 100644 packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/d4_three_times.png delete mode 100644 packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/edit_mode_unimplemented.png delete mode 100644 packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/play_mode.png delete mode 100644 packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/play_sound_block.png delete mode 100644 packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/toolbox_two_blocks.png delete mode 100644 packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_loop.png delete mode 100644 packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_loops.png delete mode 100644 packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_toolbox.png diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/src/index.js b/packages/docs/docs/codelabs/getting-started/complete-code/src/index.js index 36abfb6dd82..97cfaddf512 100644 --- a/packages/docs/docs/codelabs/getting-started/complete-code/src/index.js +++ b/packages/docs/docs/codelabs/getting-started/complete-code/src/index.js @@ -31,7 +31,13 @@ const runCode = () => { outputDiv.innerHTML = ''; - eval(code); + // Wrap `eval` in a `try/catch` so that any runtime errors are + // logged to the console, instead of failing quietly. + try { + eval(code); + } catch (error) { + console.log(error); + } }; // Load the initial state from storage and run the code. diff --git a/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx b/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx index 825fa330619..23e43ded82a 100644 --- a/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx +++ b/packages/docs/docs/codelabs/getting-started/create-a-custom-block.mdx @@ -13,7 +13,7 @@ Now, you'll add a custom block to the workspace. In Blockly, a _block definition_ describes how a block looks and behaves. This includes its text, colour, and shape. It may also include which other blocks it can connect to. Blocks can be defined in either JavaScript or JSON. The developer site has a full article on [how to define a block](/guides/create-custom-blocks/define/block-definitions#how-to-create-block-definitions). -There are also opinionated guides on topics such as [block design](/guides/design/blocks) and [block appearance](guides/design/apperance) that reflect recommended best practices when creating blocks. +There are also opinionated guides on topics such as [block design](/guides/design/blocks) and [block appearance](/guides/design/appearance) that reflect recommended best practices when creating blocks. In this codelab we will provide the block definition for you to copy and use. diff --git a/packages/docs/docs/codelabs/getting-started/create-base-app.mdx b/packages/docs/docs/codelabs/getting-started/create-base-app.mdx index 7372da3e6a7..f29dbcb2e4e 100644 --- a/packages/docs/docs/codelabs/getting-started/create-base-app.mdx +++ b/packages/docs/docs/codelabs/getting-started/create-base-app.mdx @@ -36,4 +36,4 @@ Copy and paste the following HTML into your `index.html` file. The css for the app is already included in the `index.css` file. This codelab includes basic styling for the webpage. If you would like to change the theme of Blockly, you can check out the [customizing your themes codelab](/codelabs/theme-extension-identifier/codelab-overview/). -For more fine-grained styling of components and blocks, you can consult the [CSS codelab](codelabs/css/codelab-overview/). \ No newline at end of file +For more fine-grained styling of components and blocks, you can consult the [CSS codelab](/codelabs/css/codelab-overview/). \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx b/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx index 4203879daf5..07a445918ae 100644 --- a/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx +++ b/packages/docs/docs/codelabs/getting-started/generate-javaScript-code.mdx @@ -67,15 +67,15 @@ With this translation function, the `add_text` block with a string input of "Hel translates into the JavaScript code: ```javascript -addText(text) { +function addText(text) { // Add text to the output area. const outputDiv = document.getElementById('output'); const textEl = document.createElement('p'); textEl.innerText = text; outputDiv.appendChild(textEl); -}; +} -addText("Hello, World!"); +addText('Hello, World!'); ``` For more information on block generators, read the [generating code](/guides/create-custom-blocks/code-generation/overview#block-code-generators) page on the developer site. \ No newline at end of file diff --git a/packages/docs/docs/codelabs/getting-started/run-generated-code.mdx b/packages/docs/docs/codelabs/getting-started/run-generated-code.mdx index bc454083177..ae4c884f2a4 100644 --- a/packages/docs/docs/codelabs/getting-started/run-generated-code.mdx +++ b/packages/docs/docs/codelabs/getting-started/run-generated-code.mdx @@ -64,9 +64,11 @@ const runCode = () => { ### Run the code Now, we need to actually call this `runCode` function. -First, consider the scenario when your app is first loading up. You'll want load in any saved data (if it exists) and run the code automatically. +First, consider the scenario when your app is first loading up. After loading in the saved data, you'll also run the code automatically. -Add the following lines of code to `index.js` beneath your `runCode` function: +Add a call to `runCode` just after your call to `load`. + +Now your `index.js` file should have: ```js // Load the initial state from storage and run the code. diff --git a/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx b/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx index 4a780bc5641..f4b853ec77d 100644 --- a/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx +++ b/packages/docs/docs/codelabs/getting-started/save-load-workspace.mdx @@ -69,9 +69,12 @@ import {save, load} from './serialization'; ``` Now, you'll add a change listener at the bottom of `index.js` to listen to the event stream. -In the code below, every time an event fires, this function will trigger and save the workspace. +You'll also add a call to `load` outside of the change listener, so that your app finds the saved blocks on initial load. +In the code below, every time an event fires, this change listener will trigger and save the workspace. ```js +load(ws); + // Every time the workspace changes state, save the changes to storage. ws.addChangeListener((e) => { save(ws); @@ -82,9 +85,11 @@ This change listener is not yet complete, since there are some types of events t UI changes (e.g. scrolling, zooming, or opening toolbox categories) change how the workspace *looks* but don't change the state of the blocks. Since we're only saving the blocks, we won't save after these types of events. -Here's the full change listener code: +Here's the full change listener code, including the call to `load` outside of the change listener: ```js +load(ws); + // Every time the workspace changes state, save the changes to storage. ws.addChangeListener((e) => { // UI events are things like scrolling, zooming, etc. diff --git a/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/d4_three_times.png b/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/d4_three_times.png deleted file mode 100644 index 095e597799f17071be1eab1ab78d09af62a58b94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12379 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 diff --git a/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/play_mode.png b/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/play_mode.png deleted file mode 100644 index 399991303e2cc79a85060285a5a2bff0dab6a543..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11308 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 a3;{0e#Tls?eD3ih0Fe47@ETqF$bSJZ{StZr diff --git a/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/toolbox_two_blocks.png b/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/toolbox_two_blocks.png deleted file mode 100644 index 9552a1f7b2c06d2daa8059b832df69fbb2d5e563..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7515 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 diff --git a/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_loop.png b/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_loop.png deleted file mode 100644 index 431562c08bc399fa7a0b84a8aa9efe15be4d5339..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5700 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 V6hcbzI@N&zMtYBQtF@hD{sr4z;o|@R diff --git a/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_loops.png b/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_loops.png deleted file mode 100644 index ac9ea1f6bc4727d6f06a6e1340e1840f143dfe96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7177 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 diff --git a/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_toolbox.png b/packages/docs/static/images/codelabs/getting-started/REMOVE OLD PHOTOS/workspace_with_toolbox.png deleted file mode 100644 index 5272b95a94a04842d3b0094726f3e78d76f21a21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7539 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 From add085389c4bfa80c07079542cb5eaf4be09cee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Spriggs?= Date: Fri, 26 Jun 2026 12:36:55 -0400 Subject: [PATCH 7/8] chore: rm .vscode and add to .gitignore --- .gitignore | 1 + .vscode/settings.json | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index e1b599dfef6..80585fd70eb 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ build-debug.log *.komodoproject /nbproject/private/ tsdoc-metadata.json +.vscode \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index b5fcce1c73a..00000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "mdx-preview.framework": "docusaurus" -} \ No newline at end of file From 581fbd575c4094d145bb1da859e376810ac503cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Spriggs?= Date: Fri, 26 Jun 2026 12:50:48 -0400 Subject: [PATCH 8/8] chore: formatting --- .../getting-started/complete-code/package.json | 2 +- .../complete-code/src/generators/javascript.js | 2 +- .../getting-started/complete-code/src/index.js | 14 +++++++------- .../getting-started/complete-code/src/toolbox.js | 4 ++-- .../getting-started/starter-code/package.json | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/package.json b/packages/docs/docs/codelabs/getting-started/complete-code/package.json index 2551514c792..6c4abe366ca 100644 --- a/packages/docs/docs/codelabs/getting-started/complete-code/package.json +++ b/packages/docs/docs/codelabs/getting-started/complete-code/package.json @@ -26,4 +26,4 @@ "dependencies": { "blockly": "^13.0.0" } -} \ No newline at end of file +} diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/src/generators/javascript.js b/packages/docs/docs/codelabs/getting-started/complete-code/src/generators/javascript.js index 0315d9504d6..d058603e0de 100644 --- a/packages/docs/docs/codelabs/getting-started/complete-code/src/generators/javascript.js +++ b/packages/docs/docs/codelabs/getting-started/complete-code/src/generators/javascript.js @@ -4,7 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import {Order} from 'blockly/javascript'; +import { Order } from 'blockly/javascript'; // Export all the code generators for our custom blocks, // but don't register them with Blockly yet. diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/src/index.js b/packages/docs/docs/codelabs/getting-started/complete-code/src/index.js index 97cfaddf512..867a56bf3c0 100644 --- a/packages/docs/docs/codelabs/getting-started/complete-code/src/index.js +++ b/packages/docs/docs/codelabs/getting-started/complete-code/src/index.js @@ -5,11 +5,11 @@ */ import * as Blockly from 'blockly'; -import {blocks} from './blocks/text'; -import {forBlock} from './generators/javascript'; -import {javascriptGenerator} from 'blockly/javascript'; -import {save, load} from './serialization'; -import {toolbox} from './toolbox'; +import { blocks } from './blocks/text'; +import { forBlock } from './generators/javascript'; +import { javascriptGenerator } from 'blockly/javascript'; +import { save, load } from './serialization'; +import { toolbox } from './toolbox'; import './index.css'; // Register the blocks and generator with Blockly @@ -20,7 +20,7 @@ Object.assign(javascriptGenerator.forBlock, forBlock); const codeDiv = document.getElementById('generatedCode').firstChild; const outputDiv = document.getElementById('output'); const blocklyDiv = document.getElementById('blocklyDiv'); -const ws = Blockly.inject(blocklyDiv, {toolbox}); +const ws = Blockly.inject(blocklyDiv, { toolbox }); // This function resets the code and output divs, shows the // generated code from the workspace, and evals the code. @@ -31,7 +31,7 @@ const runCode = () => { outputDiv.innerHTML = ''; - // Wrap `eval` in a `try/catch` so that any runtime errors are + // Wrap `eval` in a `try/catch` so that any runtime errors are // logged to the console, instead of failing quietly. try { eval(code); diff --git a/packages/docs/docs/codelabs/getting-started/complete-code/src/toolbox.js b/packages/docs/docs/codelabs/getting-started/complete-code/src/toolbox.js index 6baaacfdbbd..1b461568086 100644 --- a/packages/docs/docs/codelabs/getting-started/complete-code/src/toolbox.js +++ b/packages/docs/docs/codelabs/getting-started/complete-code/src/toolbox.js @@ -23,5 +23,5 @@ export const toolbox = { kind: 'block', type: 'add_text', }, - ] -}; \ No newline at end of file + ], +}; diff --git a/packages/docs/docs/codelabs/getting-started/starter-code/package.json b/packages/docs/docs/codelabs/getting-started/starter-code/package.json index 2551514c792..6c4abe366ca 100644 --- a/packages/docs/docs/codelabs/getting-started/starter-code/package.json +++ b/packages/docs/docs/codelabs/getting-started/starter-code/package.json @@ -26,4 +26,4 @@ "dependencies": { "blockly": "^13.0.0" } -} \ No newline at end of file +}

xg=QnTcLx$HKyyHsf>6T3T9C?@=D(8NpNtf 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 J68=Ax{|DjmhLr#S diff --git a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/e4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/e4.m4a deleted file mode 100644 index d910052ef9fe9dbededf8bb949e813d2491c608e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8454 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⪚9^ zJv{zq0qon$G6R_a1)>6qx4bm~x%K}O_g6OpalU_J?tXwgAWQ%y0Ga^Q0_Xrx3?Lss z6@XjcZMYRc+dt?A^sT=gz}tWD4$!ypJpe`lbOGoEFb-fEzyN?T0CNB){;?MTy$awq z{S<&%080RF(@z5M0RVCLu)H0cTe)ouJAf-B!owWUXO32XHDH2Z|8uMXe*E{i-$wqG zeme(u55Vf+00hufj#lP>8DZ({$Z784;$X#T_XO!=b=#{DCv!*O9|a)Ltw&o`Lkcj% ofIk=9mU>$Y5H0sVa%TwhbN}Pv=l}1h+Y}-~Lel^3`2RHi3zKjz?*IS* diff --git a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/f4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/f4.m4a deleted file mode 100644 index c80a0bfd3b28a1cfe18f5eaab27a7829b78b48c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8530 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 BFa`hs diff --git a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/g4.m4a b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/sounds/g4.m4a deleted file mode 100644 index 45ea4483021bdee6827f4f2cdaea22e5983979d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8306 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 BLdyUE diff --git a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/styles/index.css b/packages/docs/docs/codelabs/OLD-getting-started/complete-code/styles/index.css deleted file mode 100644 index 988bb49ecb8..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/complete-code/styles/index.css +++ /dev/null @@ -1,75 +0,0 @@ -main { - width: 400px; - position: relative; - margin: 0 auto; - overflow: hidden; - height: 600px; -} - -header { - background-color: green; - width: 100%; -} - -h1 { - width: 400px; - position: relative; - margin: 0 auto; - color: #fff; - font-size: 1.8em; - line-height: 2.4em; -} - -.mode-edit, -.mode-maker, -.mode-blockly { - display: none; -} - -[mode='maker'] .mode-maker, -[mode='edit'] .mode-edit, -[mode='blockly'] .mode-blockly { - display: block; -} - -.blockly-editor { - position: absolute; - top: 64px; - left: -400px; - transition: left 0.4s; - height: 460px; - width: 400px; - background-color: #eee; -} - -[mode='blockly'] .blockly-editor { - left: 0; -} - -.maker { - display: flex; - flex-flow: column; - justify-content: space-between; - height: 460px; - width: 400px; -} - -.maker > div { - display: flex; - justify-content: space-between; -} - -.button { - width: 120px; - height: 140px; - color: #fff; - font-size: 3em; - text-align: center; - vertical-align: middle; - line-height: 140px; -} - -.mdl-button { - margin: 1em 0; - float: right; -} diff --git a/packages/docs/docs/codelabs/OLD-getting-started/create-a-blockly-workspace.mdx b/packages/docs/docs/codelabs/OLD-getting-started/create-a-blockly-workspace.mdx deleted file mode 100644 index 8bb02afa643..00000000000 --- a/packages/docs/docs/codelabs/OLD-getting-started/create-a-blockly-workspace.mdx +++ /dev/null @@ -1,107 +0,0 @@ ---- -description: How to add a workspace to your app. ---- - -import Image from '@site/src/components/Image'; - -# Getting started with Blockly - -## 5. Create a Blockly workspace - -In this section you will learn how to add a workspace to your app, including how to define a toolbox. - -### Parts of Blockly - -A Blockly workspace has two main components: - -- The area where the user assembles their blocks (the white area). -- A toolbox that contains all blocks that are available to the user (the grey area). - -image - -The toolbox may be organized into categories, and may contain both single blocks and groups of blocks. A well-organized toolbox helps the user to explore the available blocks and understand the capabilities of the underlying system. - -A toolbox is defined as a JavaScript object and passed into the workspace constructor through an options struct. - -For more information on this JSON format and toolbox configuration, including category creation, please see our toolbox documentation. - -### Define the toolbox - -Open up `scripts/main.js` and scroll down to the end of the file. Then add the code for your `toolbox` definition just after the call to `enableMakerMode()`: - -```js -const toolbox = { - kind: 'flyoutToolbox', - contents: [ - { - kind: 'block', - type: 'controls_repeat_ext', - inputs: { - TIMES: { - shadow: { - type: 'math_number', - fields: { - NUM: 5, - }, - }, - }, - }, - }, - ], -}; -``` - -This JavaScript object defines a toolbox with a single "repeat loop" block. - -### Injection - -Adding a Blockly workspace to a page is called _injection_, because the workspace is injected into a `div` that already exists on the page. - -To do this you call the function `Blockly.inject(container, options)`, which takes two arguments: - -- `container` is where the Blockly workspace should be placed on the page. It can be an `Element`, an ID string, or a CSS selector. -- `options` is a dictionary of configuration options. - -For this codelab we will inject into a div with the id `"blocklyDiv"`, which you can find in `index.html`: - -```html -