diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e190bfa..d591190b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The format is loosely inspired by Keep a Changelog. ### Added +- **Web 0.13.9, flowchart in lesson 1 explained in more detail:** the old step „Andere Darstellungen: PAP und Pseudocode“ is now three steps. „Andere Darstellungen: Der PAP“ shows the tea Struktogramm again, then the same algorithm as PAP, its symbols and advantages (easy to read, flowcharts are used outside programming too). „Nachteile des PAP: Sprünge“ shows the tea example as a program with line numbers and GOTO, what goes wrong when one line is inserted, jumps out of loops and spaghetti code (Dijkstra moved here). „Pseudocode und Vergleich“ keeps pseudocode and the comparison. New checklist lines and a quiz question on GOTO; de/en/pt. - **Web 0.13.8, loop in lesson 1 is a „gekipptes L“:** lesson 1 no longer calls the loop shape in the Struktogramm a „Klammer links“ but a „gekipptes L“ (condition on top, strip on the left), in the text, the comparison and the quiz (en „upside-down L“, pt „L invertido“). - **Web 0.13.7, statements without class are coloured too:** when Programmieren shows the code without `class` and `main` (e.g. „Aufstehen;“, „Zähne putzen;“ in lesson 1), the statements now sit in a yellow block like a method, matching the yellow statements in the Struktogramm; loops and branches inside keep their own colours. Statements are now always yellow, also inside a loop or branch (own yellow stripe in the code, yellow box in the Struktogramm and in lesson 1); only the empty ø takes the colour of its block. A loop with pseudocode condition (`while (Tee noch zu heiß) {`) is coloured up to its closing brace. - **Web 0.13.6, lesson header pinned at the top:** in a lesson step the header (← Alle Lektionen, lesson title, step numbers, step title) stays at the top of the lesson column with its own ← Zurück / Weiter → buttons next to „Alle Lektionen“; only the step content below scrolls. The buttons at the end of the step stay as well. diff --git a/web/lessons/de/01-was-ist-ein-struktogramm.md b/web/lessons/de/01-was-ist-ein-struktogramm.md index 73ad3d27..a8c02664 100644 --- a/web/lessons/de/01-was-ist-ein-struktogramm.md +++ b/web/lessons/de/01-was-ist-ein-struktogramm.md @@ -102,27 +102,85 @@ Die Kästen können auch **ineinander geschachtelt** werden: In einer Schleife o Trostpflaster für alle mit einer verpatzten Arbeit: Die berühmte Fachzeitschrift *Communications of the ACM* hat den Struktogramm-Artikel abgelehnt. Laut Nassi meinte der Gutachter sogar, sie sollten alle Exemplare einsammeln und verbrennen. Autsch! Er erschien 1973 dann in einem kleineren Heft und wird heute tausendfach zitiert. Ätsch! ::: -## Andere Darstellungen: PAP und Pseudocode +## Andere Darstellungen: Der PAP -Ein Struktogramm ist nicht die einzige Art, einen Algorithmus aufzuschreiben. Zwei weitere wirst du im Unterricht treffen. Hier siehst du das Tee-Beispiel aus „Alle drei zusammen“ in allen drei Formen. +Es gibt noch zwei weitere Arten, Algorithmen darzustellen: den **Programmablaufplan**, kurz **PAP**, und den **Pseudocode**. Beide wirst du im Unterricht treffen. -### Struktogramm +Hier siehst du noch einmal unser Struktogramm zum Teetrinken aus „Alle drei zusammen“. Als Nächstes schauen wir uns den PAP an, und zwar mit demselben Beispiel. ::: diagramm l1-grundbausteine.visustruct Das Tee-Beispiel als Struktogramm: erst die Tasse, dann die Verzweigung für den Zucker, dann die Schleife. ::: -### Programmablaufplan (PAP) - -Der **Programmablaufplan**, kurz **PAP**, besteht aus Symbolen, die mit **Pfeilen** verbunden sind. Er ist nach DIN 66001 genormt. Eine Raute ist eine Verzweigung mit den Ausgängen ja und nein. Eine Schleife erkennst du daran, dass ein Pfeil **zurück nach oben** führt. +### Derselbe Algorithmus als PAP ::: grafik l01-pap.svg Das Tee-Beispiel als Programmablaufplan. Der Pfeil von „1 Minute warten“ zurück nach oben bildet die Schleife. ::: -### Pseudocode +### Die Elemente + +Ein PAP besteht aus wenigen Symbolen, die mit **Pfeilen** verbunden sind. Er ist nach DIN 66001 genormt. + +- **Oval:** Start oder Ende. Jeder PAP hat genau einen Start und ein Ende. +- **Rechteck:** eine Anweisung, zum Beispiel *Tasse auf den Tisch stellen*. +- **Raute:** eine Verzweigung. In der Raute steht eine Frage, heraus führen zwei Pfeile: **ja** und **nein**. +- **Parallelogramm:** eine Ein- oder Ausgabe. Im Tee-Beispiel kommt sie nicht vor. +- **Pfeil:** zeigt, welcher Schritt als Nächstes kommt. + +Eine Schleife hat im PAP kein eigenes Symbol. Du erkennst sie daran, dass ein Pfeil **zurück nach oben** führt. + +### Die Vorteile + +- **Sehr gut lesbar**, auch für Leute, die noch nie einen PAP gesehen haben. Man folgt einfach den Pfeilen mit dem Finger. +- Solche Pläne heißen allgemein **Flussdiagramm**, auf Englisch *flowchart*. Man benutzt sie nicht nur beim Programmieren, sondern überall, wo ein Ablauf erklärt wird: in Bedienungsanleitungen, bei der Fehlersuche („Leuchtet die Lampe? Nein: Steckt der Stecker?“) oder in Firmen für Arbeitsabläufe. + +## Nachteile des PAP: Sprünge + +Ein Pfeil im PAP darf von jedem Symbol zu jedem anderen führen. Das klingt praktisch, ist aber gefährlich. -**Pseudocode** ist Text, der wie ein Programm aussieht, aber in normaler Sprache geschrieben ist. Feste Wörter wie WENN und SOLANGE zeigen die Bausteine, die **Einrückung** zeigt, was dazugehört. +Früher hat man Programme genau so geschrieben. Jede Zeile hatte eine **Nummer**, und der Befehl **GOTO**, auf Deutsch „gehe zu“, sprang zu einer Zeilennummer. Jedes GEHE ZU ist ein Pfeil aus dem PAP. Unser Tee-Beispiel sähe so aus: + +``` +10 Tasse auf den Tisch stellen +20 WENN kein Zucker gewünscht, GEHE ZU 40 +30 Zucker hineingeben +40 WENN Tee nicht zu heiß, GEHE ZU 70 +50 1 Minute warten +60 GEHE ZU 40 +70 Tee trinken +``` + +### Eine Zeile mehr, und schon springt es falsch + +Jetzt verbesserst du den Algorithmus: Nach dem Zucker soll der Teebeutel heraus. Du fügst die neue Zeile 40 ein, und alle Zeilen darunter rutschen eine Nummer weiter. Die Sprünge zeigen aber noch auf die alten Nummern: + +``` +10 Tasse auf den Tisch stellen +20 WENN kein Zucker gewünscht, GEHE ZU 40 +30 Zucker hineingeben +40 Teebeutel herausnehmen +50 WENN Tee nicht zu heiß, GEHE ZU 70 +60 1 Minute warten +70 GEHE ZU 40 +80 Tee trinken +``` + +Spiel es durch: Zeile 70 schickt dich nicht mehr zur Prüfung in Zeile 50, sondern zum Teebeutel. Und wenn der Tee kühl genug ist, springt Zeile 50 zu Zeile 70 und nicht mehr zu *Tee trinken*. Du nimmst also immer wieder den Teebeutel heraus und trinkst nie. Bei jeder Änderung musst du jedes GEHE ZU prüfen. In einem großen Programm mit Hunderten Sprüngen geht dabei leicht etwas schief. + +### Kreuz und quer: Spaghetticode + +Mit Pfeilen kann man auch mitten aus einer Schleife herausspringen oder von außen mitten in eine Schleife hinein. Solche **Aussprünge** und Einsprünge machen den Plan schnell unübersichtlich. Bei vielen Sprüngen kreuzen sich die Pfeile, bis der Plan aussieht wie ein Teller Spaghetti. Deshalb nennt man das **Spaghetticode**. Den Ablauf kann man kaum noch verfolgen, und Fehler verstecken sich gut. + +Im Struktogramm gibt es keine Pfeile. Fügst du einen Kasten ein, rutscht alles darunter einfach mit, und kein Sprung kann auf die falsche Stelle zeigen. Für das vorzeitige Verlassen einer Schleife gibt es dort einen eigenen, ordentlichen Kasten, den Aussprung. Den lernst du in Lektion 18 kennen. + +::: angeberwissen +1968 schrieb der Informatiker Edsger Dijkstra einen berühmten Brief: „Go To Statement Considered Harmful“, auf Deutsch „GOTO gilt als schädlich“. Seitdem baut man Programme nur noch aus Sequenz, Verzweigung und Wiederholung. In Java ist `goto` bis heute ein reserviertes Wort, benutzen darf man es aber nicht. Mäh, Spaghetti esse ich lieber, als sie zu programmieren. +::: + +## Pseudocode und Vergleich + +**Pseudocode** ist Text, der wie ein Programm aussieht, aber in normaler Sprache geschrieben ist. Feste Wörter wie WENN und SOLANGE zeigen die Bausteine, die **Einrückung** zeigt, was dazugehört. Sprünge gibt es auch hier nicht. Das ist unser Tee-Beispiel: ``` Tasse auf den Tisch stellen @@ -138,7 +196,7 @@ Tee trinken ### Im Vergleich - **Struktogramm:** Kästen ineinander, die Schleife ist ein gekipptes L. Die Struktur siehst du auf einen Blick, wilde Sprünge sind unmöglich. -- **PAP:** Symbole mit Pfeilen, die Schleife ist ein Pfeil zurück nach oben. Sehr anschaulich, aber bei großen Plänen schnell unübersichtlich. +- **PAP:** Symbole mit Pfeilen, die Schleife ist ein Pfeil zurück nach oben. Sehr anschaulich, aber bei großen Plänen schnell unübersichtlich, und Sprünge kreuz und quer sind möglich. - **Pseudocode:** Text mit Einrückung, die Schleife steht zwischen SOLANGE und ENDE SOLANGE. Schnell geschrieben und schon nah am Programmcode. > Alle drei beschreiben denselben Algorithmus. Wenn du eine Form lesen kannst, lernst du die anderen schnell. @@ -156,10 +214,6 @@ Beim Programmieren passieren zwei Dinge gleichzeitig: Du musst dir den Ablauf ü Mit der **Simulation** kannst du dein Struktogramm außerdem Schritt für Schritt ausführen und prüfen, ob es wirklich tut, was es soll. -::: angeberwissen -Programme, die kreuz und quer springen, heißen **Spaghetticode**: Wer einem Faden folgen will, verheddert sich wie in einem Teller Spaghetti. Schuld war früher der Befehl GOTO, also „springe zu Zeile …“. 1968 schrieb der Informatiker Edsger Dijkstra deshalb einen berühmten Brief: „Go To Statement Considered Harmful“, auf Deutsch „GOTO gilt als schädlich“. Seitdem baut man Programme nur noch aus Sequenz, Verzweigung und Wiederholung. In Java ist `goto` bis heute ein reserviertes Wort, benutzen darf man es aber nicht. Mäh, Spaghetti esse ich lieber, als sie zu programmieren. -::: - ## Spiel: Welcher Baustein? ::: spiel frage @@ -215,7 +269,9 @@ richtig: Verzweigung - Ich weiß, dass ein Struktogramm von oben nach unten gelesen wird. → So liest du ein Struktogramm - Ich kenne die drei Grundbausteine Sequenz, Verzweigung und Wiederholung. → Baustein 1: Die Sequenz - Ich erkenne jeden Baustein im Struktogramm an seiner Form. → Alle drei zusammen -- Ich kann einen einfachen Algorithmus auch als PAP und als Pseudocode lesen. → Andere Darstellungen: PAP und Pseudocode +- Ich kenne die Elemente eines PAP und kann einen einfachen PAP lesen. → Andere Darstellungen: Der PAP +- Ich kann erklären, warum Sprünge mit GOTO zu Fehlern und Spaghetticode führen. → Nachteile des PAP: Sprünge +- Ich kann einen einfachen Algorithmus auch als Pseudocode lesen. → Pseudocode und Vergleich ::: ## Wissenstest @@ -265,6 +321,12 @@ richtig: Verzweigung = Parallelogramm -> Ein- oder Ausgabe > Die Raute hat zwei Ausgänge: ja und nein. +? Du fügst in ein Programm mit GOTO eine neue Zeile ein. Was kann passieren? +- [x] Die Sprünge zeigen auf die falschen Zeilen, weil sich die Nummern verschoben haben +- [ ] Nichts, die Sprünge passen sich von selbst an +- [ ] Das Programm wird automatisch schneller +> Jedes GEHE ZU zeigt auf eine feste Zeilennummer. Rutschen die Zeilen weiter, springt das Programm an die falsche Stelle. + ? Was zeigt im Pseudocode, welche Zeilen zu einer Schleife gehören? - [ ] Die Farbe - [x] Die Einrückung und das ENDE SOLANGE diff --git a/web/lessons/en/01-was-ist-ein-struktogramm.md b/web/lessons/en/01-was-ist-ein-struktogramm.md index 88b8546b..c40da6ee 100644 --- a/web/lessons/en/01-was-ist-ein-struktogramm.md +++ b/web/lessons/en/01-was-ist-ein-struktogramm.md @@ -102,27 +102,85 @@ The boxes can also be **nested** inside each other: a loop or a path can contain Comfort for anyone who has messed up a test: the famous journal *Communications of the ACM* rejected the structure chart article. According to Nassi, the reviewer even said they should collect every copy and burn it. Ouch! It then appeared in 1973 in a smaller journal and today it is quoted thousands of times. Ha! ::: -## Other ways to draw it: flowchart and pseudocode +## Other ways to draw it: the flowchart -A structure chart is not the only way to write down an algorithm. You will meet two more in class. Here you see the tea example from “All three together” in all three forms. +There are two more ways to show an algorithm: the **flowchart** and **pseudocode**. You will meet both in class. -### Structure chart +Here you see our structure chart for drinking tea from “All three together” once more. Next we look at the flowchart, using the same example. ::: diagramm l1-grundbausteine.visustruct The tea example as a structure chart: first the cup, then the branch for the sugar, then the loop. ::: -### Flowchart - -A **flowchart** is made of symbols joined by **arrows**. It is standardised as DIN 66001 (ISO 5807). A diamond is a decision with the exits yes and no. You recognise a loop by an arrow that leads **back up**. +### The same algorithm as a flowchart ::: grafik l01-pap.svg The tea example as a flowchart. The arrow from “Wait 1 minute” back up forms the loop. ::: -### Pseudocode +### The symbols + +A flowchart is made of a few symbols joined by **arrows**. It is standardised as DIN 66001 (ISO 5807). + +- **Oval:** start or end. Every flowchart has exactly one start and one end. +- **Rectangle:** a statement, for example *Put a cup on the table*. +- **Diamond:** a decision. The diamond holds a question, and two arrows lead out of it: **yes** and **no**. +- **Parallelogram:** an input or output. The tea example does not have one. +- **Arrow:** shows which step comes next. + +A loop has no symbol of its own in a flowchart. You recognise it by an arrow that leads **back up**. + +### The advantages + +- **Very easy to read**, even for people who have never seen a flowchart. You simply follow the arrows with your finger. +- Flowcharts are not only used in programming but wherever a process is explained: in user manuals, for troubleshooting (“Is the lamp on? No: is it plugged in?”) or in companies for work processes. + +## Drawbacks of the flowchart: jumps + +An arrow in a flowchart may lead from any symbol to any other. That sounds handy, but it is dangerous. -**Pseudocode** is text that looks like a program but is written in plain language. Fixed words such as IF and WHILE show the building blocks, and the **indentation** shows what belongs to them. +In the old days, programs were written exactly like that. Every line had a **number**, and the command **GOTO** jumped to a line number. Every GOTO is an arrow from the flowchart. Our tea example would look like this: + +``` +10 Put a cup on the table +20 IF no sugar wanted, GOTO 40 +30 Add sugar +40 IF tea not too hot, GOTO 70 +50 Wait 1 minute +60 GOTO 40 +70 Drink the tea +``` + +### One more line, and the jumps go wrong + +Now you improve the algorithm: after the sugar, the tea bag should come out. You insert the new line 40, and all lines below move down one number. But the jumps still point to the old numbers: + +``` +10 Put a cup on the table +20 IF no sugar wanted, GOTO 40 +30 Add sugar +40 Take out the tea bag +50 IF tea not too hot, GOTO 70 +60 Wait 1 minute +70 GOTO 40 +80 Drink the tea +``` + +Play it through: line 70 no longer sends you to the check in line 50 but to the tea bag. And when the tea is cool enough, line 50 jumps to line 70 instead of *Drink the tea*. So you keep taking out the tea bag and never drink. With every change you have to check every GOTO. In a big program with hundreds of jumps, something easily goes wrong. + +### All over the place: spaghetti code + +With arrows you can also jump out of the middle of a loop, or from outside into the middle of a loop. Such jumps quickly make the chart confusing. With many jumps the arrows cross until the chart looks like a plate of spaghetti. That is why it is called **spaghetti code**. You can hardly follow the flow any more, and mistakes hide well. + +A structure chart has no arrows. If you insert a box, everything below simply moves down with it, and no jump can point to the wrong place. For leaving a loop early there is a separate, tidy box, the break. You will meet it in lesson 18. + +::: angeberwissen +In 1968 the computer scientist Edsger Dijkstra wrote a famous letter: “Go To Statement Considered Harmful”. Since then, programs are built only from sequence, branch and loop. In Java, `goto` is still a reserved word today, but you are not allowed to use it. Baah, I would rather eat spaghetti than program it. +::: + +## Pseudocode and comparison + +**Pseudocode** is text that looks like a program but is written in plain language. Fixed words such as IF and WHILE show the building blocks, and the **indentation** shows what belongs to them. There are no jumps here either. This is our tea example: ``` Put a cup on the table @@ -138,7 +196,7 @@ Drink the tea ### Compared - **Structure chart:** boxes inside boxes, the loop is an upside-down L. You see the structure at a glance, and wild jumps are impossible. -- **Flowchart:** symbols with arrows, the loop is an arrow back up. Very easy to picture, but big charts quickly get confusing. +- **Flowchart:** symbols with arrows, the loop is an arrow back up. Very easy to picture, but big charts quickly get confusing, and jumps all over the place are possible. - **Pseudocode:** text with indentation, the loop sits between WHILE and END WHILE. Quick to write and already close to program code. > All three describe the same algorithm. Once you can read one form, you learn the others quickly. @@ -156,10 +214,6 @@ When you program, two things happen at once: you have to think about the steps a With the **simulation** you can also run your structure chart step by step and check whether it really does what it should. -::: angeberwissen -Programs that jump all over the place are called **spaghetti code**: if you try to follow one thread, you get tangled up like in a plate of spaghetti. In the old days the culprit was the GOTO command, meaning “jump to line …”. So in 1968 the computer scientist Edsger Dijkstra wrote a famous letter: “Go To Statement Considered Harmful”. Since then, programs are built only from sequence, branch and loop. In Java, `goto` is still a reserved word today, but you are not allowed to use it. Baah, I would rather eat spaghetti than program it. -::: - ## Game: Which building block? ::: spiel frage @@ -215,7 +269,9 @@ richtig: branch - I know that a structure chart is read from top to bottom. → How to read a structure chart - I know the three basic building blocks: sequence, branch and loop. → Building block 1: the sequence - I can recognise every building block in a structure chart by its shape. → All three together -- I can also read a simple algorithm as a flowchart and as pseudocode. → Other ways to draw it: flowchart and pseudocode +- I know the symbols of a flowchart and can read a simple flowchart. → Other ways to draw it: the flowchart +- I can explain why jumps with GOTO lead to mistakes and spaghetti code. → Drawbacks of the flowchart: jumps +- I can also read a simple algorithm as pseudocode. → Pseudocode and comparison ::: ## Quiz @@ -265,6 +321,12 @@ richtig: branch = Parallelogram -> Input or output > The diamond has two exits: yes and no. +? You insert a new line into a program with GOTO. What can happen? +- [x] The jumps point to the wrong lines because the numbers have moved +- [ ] Nothing, the jumps adjust by themselves +- [ ] The program automatically gets faster +> Every GOTO points to a fixed line number. If the lines move down, the program jumps to the wrong place. + ? In pseudocode, what shows which lines belong to a loop? - [ ] The colour - [x] The indentation and the END WHILE diff --git a/web/lessons/pt/01-was-ist-ein-struktogramm.md b/web/lessons/pt/01-was-ist-ein-struktogramm.md index 07b82256..96b64848 100644 --- a/web/lessons/pt/01-was-ist-ein-struktogramm.md +++ b/web/lessons/pt/01-was-ist-ein-struktogramm.md @@ -102,27 +102,85 @@ Os blocos também podem ser **encaixados** uns dentro dos outros: um ciclo ou um Consolo para quem correu mal um teste: a famosa revista *Communications of the ACM* rejeitou o artigo sobre estrutogramas. Segundo Nassi, o revisor até disse que deviam juntar todas as cópias e queimá-las. Ai! O artigo saiu em 1973 numa revista mais pequena e hoje é citado milhares de vezes. Ha! ::: -## Outras formas de desenhar: fluxograma e pseudocódigo +## Outras formas de desenhar: o fluxograma -Um estrutograma não é a única forma de escrever um algoritmo. Nas aulas vais conhecer mais duas. Aqui vês o exemplo do chá de “Os três juntos” nas três formas. +Há mais duas formas de representar um algoritmo: o **fluxograma** e o **pseudocódigo**. Vais conhecer as duas nas aulas. -### Estrutograma +Aqui vês outra vez o nosso estrutograma para beber chá de “Os três juntos”. A seguir vamos ver o fluxograma, com o mesmo exemplo. ::: diagramm l1-grundbausteine.visustruct O exemplo do chá como estrutograma: primeiro a chávena, depois a decisão para o açúcar e depois o ciclo. ::: -### Fluxograma - -Um **fluxograma** é feito de símbolos ligados por **setas**. Está normalizado como DIN 66001 (ISO 5807). Um losango é uma decisão com as saídas sim e não. Reconheces um ciclo por uma seta que volta **para cima**. +### O mesmo algoritmo como fluxograma ::: grafik l01-pap.svg O exemplo do chá como fluxograma. A seta de “Esperar 1 minuto” para cima forma o ciclo. ::: -### Pseudocódigo +### Os símbolos + +Um fluxograma é feito de poucos símbolos ligados por **setas**. Está normalizado como DIN 66001 (ISO 5807). + +- **Oval:** início ou fim. Cada fluxograma tem exatamente um início e um fim. +- **Retângulo:** uma instrução, por exemplo *Pôr uma chávena na mesa*. +- **Losango:** uma decisão. No losango está uma pergunta, e dele saem duas setas: **sim** e **não**. +- **Paralelogramo:** uma entrada ou saída. No exemplo do chá não aparece. +- **Seta:** mostra qual é o passo seguinte. + +Um ciclo não tem símbolo próprio no fluxograma. Reconheces um ciclo por uma seta que volta **para cima**. + +### As vantagens + +- **Muito fácil de ler**, mesmo para quem nunca viu um fluxograma. Basta seguir as setas com o dedo. +- Os fluxogramas (em inglês *flowchart*) não se usam só na programação, mas em todo o lado onde se explica um processo: em manuais de instruções, na procura de avarias (“A lâmpada acende? Não: a ficha está ligada?”) ou nas empresas para os processos de trabalho. + +## Desvantagens do fluxograma: saltos + +Uma seta num fluxograma pode ir de qualquer símbolo para qualquer outro. Parece prático, mas é perigoso. -**Pseudocódigo** é texto que parece um programa, mas está escrito em linguagem corrente. Palavras fixas como SE e ENQUANTO mostram os blocos, e a **indentação** mostra o que pertence a eles. +Antigamente, os programas escreviam-se exatamente assim. Cada linha tinha um **número**, e o comando **GOTO**, em português “ir para”, saltava para um número de linha. Cada IR PARA é uma seta do fluxograma. O nosso exemplo do chá ficava assim: + +``` +10 Pôr uma chávena na mesa +20 SE não quer açúcar, IR PARA 40 +30 Juntar açúcar +40 SE chá não demasiado quente, IR PARA 70 +50 Esperar 1 minuto +60 IR PARA 40 +70 Beber o chá +``` + +### Mais uma linha, e os saltos ficam errados + +Agora melhoras o algoritmo: depois do açúcar, o saquinho de chá deve sair. Acrescentas a nova linha 40, e todas as linhas abaixo avançam um número. Mas os saltos continuam a apontar para os números antigos: + +``` +10 Pôr uma chávena na mesa +20 SE não quer açúcar, IR PARA 40 +30 Juntar açúcar +40 Tirar o saquinho de chá +50 SE chá não demasiado quente, IR PARA 70 +60 Esperar 1 minuto +70 IR PARA 40 +80 Beber o chá +``` + +Experimenta: a linha 70 já não te manda para a verificação da linha 50, mas para o saquinho. E quando o chá já está frio o suficiente, a linha 50 salta para a linha 70 em vez de *Beber o chá*. Ou seja, tiras o saquinho vezes sem conta e nunca bebes. A cada alteração tens de verificar todos os IR PARA. Num programa grande, com centenas de saltos, é fácil algo correr mal. + +### Para todo o lado: código esparguete + +Com setas também se pode saltar do meio de um ciclo para fora, ou de fora para o meio de um ciclo. Estes saltos tornam o fluxograma confuso muito depressa. Com muitos saltos, as setas cruzam-se até o fluxograma parecer um prato de esparguete. Por isso chama-se **código esparguete**. Mal se consegue seguir o fluxo, e os erros escondem-se bem. + +Um estrutograma não tem setas. Se acrescentares um bloco, tudo o que está abaixo desce com ele, e nenhum salto pode apontar para o sítio errado. Para sair de um ciclo mais cedo existe lá um bloco próprio e arrumado, a interrupção. Vais conhecê-la na lição 18. + +::: angeberwissen +Em 1968, o informático Edsger Dijkstra escreveu uma carta famosa: “Go To Statement Considered Harmful”, ou seja, “o GOTO é considerado prejudicial”. Desde então, os programas são construídos só com sequência, decisão e ciclo. Em Java, `goto` ainda hoje é uma palavra reservada, mas não a podes usar. Mééé, prefiro comer esparguete a programá-lo. +::: + +## Pseudocódigo e comparação + +**Pseudocódigo** é texto que parece um programa, mas está escrito em linguagem corrente. Palavras fixas como SE e ENQUANTO mostram os blocos, e a **indentação** mostra o que pertence a eles. Aqui também não há saltos. Este é o nosso exemplo do chá: ``` Pôr uma chávena na mesa @@ -138,7 +196,7 @@ Beber o chá ### Comparação - **Estrutograma:** blocos dentro de blocos, o ciclo é um L invertido. Vês a estrutura num relance, e saltos malucos são impossíveis. -- **Fluxograma:** símbolos com setas, o ciclo é uma seta que volta para cima. Muito fácil de imaginar, mas os fluxogramas grandes ficam depressa confusos. +- **Fluxograma:** símbolos com setas, o ciclo é uma seta que volta para cima. Muito fácil de imaginar, mas os fluxogramas grandes ficam depressa confusos, e são possíveis saltos para todo o lado. - **Pseudocódigo:** texto com indentação, o ciclo fica entre ENQUANTO e FIM ENQUANTO. Rápido de escrever e já perto do código de um programa. > Os três descrevem o mesmo algoritmo. Quando sabes ler uma das formas, aprendes as outras depressa. @@ -156,10 +214,6 @@ Quando programas, acontecem duas coisas ao mesmo tempo: tens de pensar nos passo Com a **simulação** também podes executar o teu estrutograma passo a passo e verificar se ele faz mesmo o que deve. -::: angeberwissen -Programas que saltam para todo o lado chamam-se **código esparguete**: se tentares seguir um fio, ficas todo enrolado, como num prato de esparguete. Antigamente, o culpado era o comando GOTO, que quer dizer “salta para a linha …”. Por isso, em 1968, o informático Edsger Dijkstra escreveu uma carta famosa: “Go To Statement Considered Harmful”. Desde então, os programas são construídos só com sequência, decisão e ciclo. Em Java, `goto` ainda hoje é uma palavra reservada, mas não a podes usar. Mééé, prefiro comer esparguete a programá-lo. -::: - ## Jogo: Que bloco básico? ::: spiel frage @@ -215,7 +269,9 @@ richtig: decisão - Sei que um estrutograma se lê de cima para baixo. → Como se lê um estrutograma - Conheço os três blocos básicos: sequência, decisão e ciclo. → Bloco básico 1: a sequência - Reconheço cada bloco básico num estrutograma pela sua forma. → Os três juntos -- Também consigo ler um algoritmo simples como fluxograma e como pseudocódigo. → Outras formas de desenhar: fluxograma e pseudocódigo +- Conheço os símbolos de um fluxograma e sei ler um fluxograma simples. → Outras formas de desenhar: o fluxograma +- Sei explicar porque é que os saltos com GOTO levam a erros e a código esparguete. → Desvantagens do fluxograma: saltos +- Também consigo ler um algoritmo simples em pseudocódigo. → Pseudocódigo e comparação ::: ## Teste de conhecimentos @@ -265,6 +321,12 @@ richtig: decisão = Paralelogramo -> Entrada ou saída > O losango tem duas saídas: sim e não. +? Acrescentas uma nova linha a um programa com GOTO. O que pode acontecer? +- [x] Os saltos apontam para as linhas erradas, porque os números mudaram +- [ ] Nada, os saltos ajustam-se sozinhos +- [ ] O programa fica automaticamente mais rápido +> Cada IR PARA aponta para um número de linha fixo. Se as linhas descem, o programa salta para o sítio errado. + ? No pseudocódigo, o que mostra que linhas pertencem a um ciclo? - [ ] A cor - [x] A indentação e o FIM ENQUANTO diff --git a/web/package-lock.json b/web/package-lock.json index 57bf80fc..df5666f0 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "visustruct-web", - "version": "0.13.8", + "version": "0.13.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "visustruct-web", - "version": "0.13.8", + "version": "0.13.9", "dependencies": { "@codemirror/autocomplete": "^6.20.4", "@codemirror/commands": "^6.11.1", diff --git a/web/package.json b/web/package.json index 7462aca0..5607b41f 100644 --- a/web/package.json +++ b/web/package.json @@ -1,7 +1,7 @@ { "name": "visustruct-web", "private": true, - "version": "0.13.8", + "version": "0.13.9", "type": "module", "scripts": { "dev": "vite", diff --git a/website/app/assets/index-Bx-6trOD.js b/website/app/assets/index-DBapwQYk.js similarity index 99% rename from website/app/assets/index-Bx-6trOD.js rename to website/app/assets/index-DBapwQYk.js index 3c302fd3..8339834e 100644 --- a/website/app/assets/index-Bx-6trOD.js +++ b/website/app/assets/index-DBapwQYk.js @@ -394,27 +394,85 @@ Die Kästen können auch **ineinander geschachtelt** werden: In einer Schleife o Trostpflaster für alle mit einer verpatzten Arbeit: Die berühmte Fachzeitschrift *Communications of the ACM* hat den Struktogramm-Artikel abgelehnt. Laut Nassi meinte der Gutachter sogar, sie sollten alle Exemplare einsammeln und verbrennen. Autsch! Er erschien 1973 dann in einem kleineren Heft und wird heute tausendfach zitiert. Ätsch! ::: -## Andere Darstellungen: PAP und Pseudocode +## Andere Darstellungen: Der PAP -Ein Struktogramm ist nicht die einzige Art, einen Algorithmus aufzuschreiben. Zwei weitere wirst du im Unterricht treffen. Hier siehst du das Tee-Beispiel aus „Alle drei zusammen“ in allen drei Formen. +Es gibt noch zwei weitere Arten, Algorithmen darzustellen: den **Programmablaufplan**, kurz **PAP**, und den **Pseudocode**. Beide wirst du im Unterricht treffen. -### Struktogramm +Hier siehst du noch einmal unser Struktogramm zum Teetrinken aus „Alle drei zusammen“. Als Nächstes schauen wir uns den PAP an, und zwar mit demselben Beispiel. ::: diagramm l1-grundbausteine.visustruct Das Tee-Beispiel als Struktogramm: erst die Tasse, dann die Verzweigung für den Zucker, dann die Schleife. ::: -### Programmablaufplan (PAP) - -Der **Programmablaufplan**, kurz **PAP**, besteht aus Symbolen, die mit **Pfeilen** verbunden sind. Er ist nach DIN 66001 genormt. Eine Raute ist eine Verzweigung mit den Ausgängen ja und nein. Eine Schleife erkennst du daran, dass ein Pfeil **zurück nach oben** führt. +### Derselbe Algorithmus als PAP ::: grafik l01-pap.svg Das Tee-Beispiel als Programmablaufplan. Der Pfeil von „1 Minute warten“ zurück nach oben bildet die Schleife. ::: -### Pseudocode +### Die Elemente + +Ein PAP besteht aus wenigen Symbolen, die mit **Pfeilen** verbunden sind. Er ist nach DIN 66001 genormt. + +- **Oval:** Start oder Ende. Jeder PAP hat genau einen Start und ein Ende. +- **Rechteck:** eine Anweisung, zum Beispiel *Tasse auf den Tisch stellen*. +- **Raute:** eine Verzweigung. In der Raute steht eine Frage, heraus führen zwei Pfeile: **ja** und **nein**. +- **Parallelogramm:** eine Ein- oder Ausgabe. Im Tee-Beispiel kommt sie nicht vor. +- **Pfeil:** zeigt, welcher Schritt als Nächstes kommt. + +Eine Schleife hat im PAP kein eigenes Symbol. Du erkennst sie daran, dass ein Pfeil **zurück nach oben** führt. + +### Die Vorteile + +- **Sehr gut lesbar**, auch für Leute, die noch nie einen PAP gesehen haben. Man folgt einfach den Pfeilen mit dem Finger. +- Solche Pläne heißen allgemein **Flussdiagramm**, auf Englisch *flowchart*. Man benutzt sie nicht nur beim Programmieren, sondern überall, wo ein Ablauf erklärt wird: in Bedienungsanleitungen, bei der Fehlersuche („Leuchtet die Lampe? Nein: Steckt der Stecker?“) oder in Firmen für Arbeitsabläufe. + +## Nachteile des PAP: Sprünge + +Ein Pfeil im PAP darf von jedem Symbol zu jedem anderen führen. Das klingt praktisch, ist aber gefährlich. -**Pseudocode** ist Text, der wie ein Programm aussieht, aber in normaler Sprache geschrieben ist. Feste Wörter wie WENN und SOLANGE zeigen die Bausteine, die **Einrückung** zeigt, was dazugehört. +Früher hat man Programme genau so geschrieben. Jede Zeile hatte eine **Nummer**, und der Befehl **GOTO**, auf Deutsch „gehe zu“, sprang zu einer Zeilennummer. Jedes GEHE ZU ist ein Pfeil aus dem PAP. Unser Tee-Beispiel sähe so aus: + +\`\`\` +10 Tasse auf den Tisch stellen +20 WENN kein Zucker gewünscht, GEHE ZU 40 +30 Zucker hineingeben +40 WENN Tee nicht zu heiß, GEHE ZU 70 +50 1 Minute warten +60 GEHE ZU 40 +70 Tee trinken +\`\`\` + +### Eine Zeile mehr, und schon springt es falsch + +Jetzt verbesserst du den Algorithmus: Nach dem Zucker soll der Teebeutel heraus. Du fügst die neue Zeile 40 ein, und alle Zeilen darunter rutschen eine Nummer weiter. Die Sprünge zeigen aber noch auf die alten Nummern: + +\`\`\` +10 Tasse auf den Tisch stellen +20 WENN kein Zucker gewünscht, GEHE ZU 40 +30 Zucker hineingeben +40 Teebeutel herausnehmen +50 WENN Tee nicht zu heiß, GEHE ZU 70 +60 1 Minute warten +70 GEHE ZU 40 +80 Tee trinken +\`\`\` + +Spiel es durch: Zeile 70 schickt dich nicht mehr zur Prüfung in Zeile 50, sondern zum Teebeutel. Und wenn der Tee kühl genug ist, springt Zeile 50 zu Zeile 70 und nicht mehr zu *Tee trinken*. Du nimmst also immer wieder den Teebeutel heraus und trinkst nie. Bei jeder Änderung musst du jedes GEHE ZU prüfen. In einem großen Programm mit Hunderten Sprüngen geht dabei leicht etwas schief. + +### Kreuz und quer: Spaghetticode + +Mit Pfeilen kann man auch mitten aus einer Schleife herausspringen oder von außen mitten in eine Schleife hinein. Solche **Aussprünge** und Einsprünge machen den Plan schnell unübersichtlich. Bei vielen Sprüngen kreuzen sich die Pfeile, bis der Plan aussieht wie ein Teller Spaghetti. Deshalb nennt man das **Spaghetticode**. Den Ablauf kann man kaum noch verfolgen, und Fehler verstecken sich gut. + +Im Struktogramm gibt es keine Pfeile. Fügst du einen Kasten ein, rutscht alles darunter einfach mit, und kein Sprung kann auf die falsche Stelle zeigen. Für das vorzeitige Verlassen einer Schleife gibt es dort einen eigenen, ordentlichen Kasten, den Aussprung. Den lernst du in Lektion 18 kennen. + +::: angeberwissen +1968 schrieb der Informatiker Edsger Dijkstra einen berühmten Brief: „Go To Statement Considered Harmful“, auf Deutsch „GOTO gilt als schädlich“. Seitdem baut man Programme nur noch aus Sequenz, Verzweigung und Wiederholung. In Java ist \`goto\` bis heute ein reserviertes Wort, benutzen darf man es aber nicht. Mäh, Spaghetti esse ich lieber, als sie zu programmieren. +::: + +## Pseudocode und Vergleich + +**Pseudocode** ist Text, der wie ein Programm aussieht, aber in normaler Sprache geschrieben ist. Feste Wörter wie WENN und SOLANGE zeigen die Bausteine, die **Einrückung** zeigt, was dazugehört. Sprünge gibt es auch hier nicht. Das ist unser Tee-Beispiel: \`\`\` Tasse auf den Tisch stellen @@ -430,7 +488,7 @@ Tee trinken ### Im Vergleich - **Struktogramm:** Kästen ineinander, die Schleife ist ein gekipptes L. Die Struktur siehst du auf einen Blick, wilde Sprünge sind unmöglich. -- **PAP:** Symbole mit Pfeilen, die Schleife ist ein Pfeil zurück nach oben. Sehr anschaulich, aber bei großen Plänen schnell unübersichtlich. +- **PAP:** Symbole mit Pfeilen, die Schleife ist ein Pfeil zurück nach oben. Sehr anschaulich, aber bei großen Plänen schnell unübersichtlich, und Sprünge kreuz und quer sind möglich. - **Pseudocode:** Text mit Einrückung, die Schleife steht zwischen SOLANGE und ENDE SOLANGE. Schnell geschrieben und schon nah am Programmcode. > Alle drei beschreiben denselben Algorithmus. Wenn du eine Form lesen kannst, lernst du die anderen schnell. @@ -448,10 +506,6 @@ Beim Programmieren passieren zwei Dinge gleichzeitig: Du musst dir den Ablauf ü Mit der **Simulation** kannst du dein Struktogramm außerdem Schritt für Schritt ausführen und prüfen, ob es wirklich tut, was es soll. -::: angeberwissen -Programme, die kreuz und quer springen, heißen **Spaghetticode**: Wer einem Faden folgen will, verheddert sich wie in einem Teller Spaghetti. Schuld war früher der Befehl GOTO, also „springe zu Zeile …“. 1968 schrieb der Informatiker Edsger Dijkstra deshalb einen berühmten Brief: „Go To Statement Considered Harmful“, auf Deutsch „GOTO gilt als schädlich“. Seitdem baut man Programme nur noch aus Sequenz, Verzweigung und Wiederholung. In Java ist \`goto\` bis heute ein reserviertes Wort, benutzen darf man es aber nicht. Mäh, Spaghetti esse ich lieber, als sie zu programmieren. -::: - ## Spiel: Welcher Baustein? ::: spiel frage @@ -507,7 +561,9 @@ richtig: Verzweigung - Ich weiß, dass ein Struktogramm von oben nach unten gelesen wird. → So liest du ein Struktogramm - Ich kenne die drei Grundbausteine Sequenz, Verzweigung und Wiederholung. → Baustein 1: Die Sequenz - Ich erkenne jeden Baustein im Struktogramm an seiner Form. → Alle drei zusammen -- Ich kann einen einfachen Algorithmus auch als PAP und als Pseudocode lesen. → Andere Darstellungen: PAP und Pseudocode +- Ich kenne die Elemente eines PAP und kann einen einfachen PAP lesen. → Andere Darstellungen: Der PAP +- Ich kann erklären, warum Sprünge mit GOTO zu Fehlern und Spaghetticode führen. → Nachteile des PAP: Sprünge +- Ich kann einen einfachen Algorithmus auch als Pseudocode lesen. → Pseudocode und Vergleich ::: ## Wissenstest @@ -557,6 +613,12 @@ richtig: Verzweigung = Parallelogramm -> Ein- oder Ausgabe > Die Raute hat zwei Ausgänge: ja und nein. +? Du fügst in ein Programm mit GOTO eine neue Zeile ein. Was kann passieren? +- [x] Die Sprünge zeigen auf die falschen Zeilen, weil sich die Nummern verschoben haben +- [ ] Nichts, die Sprünge passen sich von selbst an +- [ ] Das Programm wird automatisch schneller +> Jedes GEHE ZU zeigt auf eine feste Zeilennummer. Rutschen die Zeilen weiter, springt das Programm an die falsche Stelle. + ? Was zeigt im Pseudocode, welche Zeilen zu einer Schleife gehören? - [ ] Die Farbe - [x] Die Einrückung und das ENDE SOLANGE @@ -11476,27 +11538,85 @@ The boxes can also be **nested** inside each other: a loop or a path can contain Comfort for anyone who has messed up a test: the famous journal *Communications of the ACM* rejected the structure chart article. According to Nassi, the reviewer even said they should collect every copy and burn it. Ouch! It then appeared in 1973 in a smaller journal and today it is quoted thousands of times. Ha! ::: -## Other ways to draw it: flowchart and pseudocode +## Other ways to draw it: the flowchart -A structure chart is not the only way to write down an algorithm. You will meet two more in class. Here you see the tea example from “All three together” in all three forms. +There are two more ways to show an algorithm: the **flowchart** and **pseudocode**. You will meet both in class. -### Structure chart +Here you see our structure chart for drinking tea from “All three together” once more. Next we look at the flowchart, using the same example. ::: diagramm l1-grundbausteine.visustruct The tea example as a structure chart: first the cup, then the branch for the sugar, then the loop. ::: -### Flowchart - -A **flowchart** is made of symbols joined by **arrows**. It is standardised as DIN 66001 (ISO 5807). A diamond is a decision with the exits yes and no. You recognise a loop by an arrow that leads **back up**. +### The same algorithm as a flowchart ::: grafik l01-pap.svg The tea example as a flowchart. The arrow from “Wait 1 minute” back up forms the loop. ::: -### Pseudocode +### The symbols + +A flowchart is made of a few symbols joined by **arrows**. It is standardised as DIN 66001 (ISO 5807). + +- **Oval:** start or end. Every flowchart has exactly one start and one end. +- **Rectangle:** a statement, for example *Put a cup on the table*. +- **Diamond:** a decision. The diamond holds a question, and two arrows lead out of it: **yes** and **no**. +- **Parallelogram:** an input or output. The tea example does not have one. +- **Arrow:** shows which step comes next. + +A loop has no symbol of its own in a flowchart. You recognise it by an arrow that leads **back up**. + +### The advantages -**Pseudocode** is text that looks like a program but is written in plain language. Fixed words such as IF and WHILE show the building blocks, and the **indentation** shows what belongs to them. +- **Very easy to read**, even for people who have never seen a flowchart. You simply follow the arrows with your finger. +- Flowcharts are not only used in programming but wherever a process is explained: in user manuals, for troubleshooting (“Is the lamp on? No: is it plugged in?”) or in companies for work processes. + +## Drawbacks of the flowchart: jumps + +An arrow in a flowchart may lead from any symbol to any other. That sounds handy, but it is dangerous. + +In the old days, programs were written exactly like that. Every line had a **number**, and the command **GOTO** jumped to a line number. Every GOTO is an arrow from the flowchart. Our tea example would look like this: + +\`\`\` +10 Put a cup on the table +20 IF no sugar wanted, GOTO 40 +30 Add sugar +40 IF tea not too hot, GOTO 70 +50 Wait 1 minute +60 GOTO 40 +70 Drink the tea +\`\`\` + +### One more line, and the jumps go wrong + +Now you improve the algorithm: after the sugar, the tea bag should come out. You insert the new line 40, and all lines below move down one number. But the jumps still point to the old numbers: + +\`\`\` +10 Put a cup on the table +20 IF no sugar wanted, GOTO 40 +30 Add sugar +40 Take out the tea bag +50 IF tea not too hot, GOTO 70 +60 Wait 1 minute +70 GOTO 40 +80 Drink the tea +\`\`\` + +Play it through: line 70 no longer sends you to the check in line 50 but to the tea bag. And when the tea is cool enough, line 50 jumps to line 70 instead of *Drink the tea*. So you keep taking out the tea bag and never drink. With every change you have to check every GOTO. In a big program with hundreds of jumps, something easily goes wrong. + +### All over the place: spaghetti code + +With arrows you can also jump out of the middle of a loop, or from outside into the middle of a loop. Such jumps quickly make the chart confusing. With many jumps the arrows cross until the chart looks like a plate of spaghetti. That is why it is called **spaghetti code**. You can hardly follow the flow any more, and mistakes hide well. + +A structure chart has no arrows. If you insert a box, everything below simply moves down with it, and no jump can point to the wrong place. For leaving a loop early there is a separate, tidy box, the break. You will meet it in lesson 18. + +::: angeberwissen +In 1968 the computer scientist Edsger Dijkstra wrote a famous letter: “Go To Statement Considered Harmful”. Since then, programs are built only from sequence, branch and loop. In Java, \`goto\` is still a reserved word today, but you are not allowed to use it. Baah, I would rather eat spaghetti than program it. +::: + +## Pseudocode and comparison + +**Pseudocode** is text that looks like a program but is written in plain language. Fixed words such as IF and WHILE show the building blocks, and the **indentation** shows what belongs to them. There are no jumps here either. This is our tea example: \`\`\` Put a cup on the table @@ -11512,7 +11632,7 @@ Drink the tea ### Compared - **Structure chart:** boxes inside boxes, the loop is an upside-down L. You see the structure at a glance, and wild jumps are impossible. -- **Flowchart:** symbols with arrows, the loop is an arrow back up. Very easy to picture, but big charts quickly get confusing. +- **Flowchart:** symbols with arrows, the loop is an arrow back up. Very easy to picture, but big charts quickly get confusing, and jumps all over the place are possible. - **Pseudocode:** text with indentation, the loop sits between WHILE and END WHILE. Quick to write and already close to program code. > All three describe the same algorithm. Once you can read one form, you learn the others quickly. @@ -11530,10 +11650,6 @@ When you program, two things happen at once: you have to think about the steps a With the **simulation** you can also run your structure chart step by step and check whether it really does what it should. -::: angeberwissen -Programs that jump all over the place are called **spaghetti code**: if you try to follow one thread, you get tangled up like in a plate of spaghetti. In the old days the culprit was the GOTO command, meaning “jump to line …”. So in 1968 the computer scientist Edsger Dijkstra wrote a famous letter: “Go To Statement Considered Harmful”. Since then, programs are built only from sequence, branch and loop. In Java, \`goto\` is still a reserved word today, but you are not allowed to use it. Baah, I would rather eat spaghetti than program it. -::: - ## Game: Which building block? ::: spiel frage @@ -11589,7 +11705,9 @@ richtig: branch - I know that a structure chart is read from top to bottom. → How to read a structure chart - I know the three basic building blocks: sequence, branch and loop. → Building block 1: the sequence - I can recognise every building block in a structure chart by its shape. → All three together -- I can also read a simple algorithm as a flowchart and as pseudocode. → Other ways to draw it: flowchart and pseudocode +- I know the symbols of a flowchart and can read a simple flowchart. → Other ways to draw it: the flowchart +- I can explain why jumps with GOTO lead to mistakes and spaghetti code. → Drawbacks of the flowchart: jumps +- I can also read a simple algorithm as pseudocode. → Pseudocode and comparison ::: ## Quiz @@ -11639,6 +11757,12 @@ richtig: branch = Parallelogram -> Input or output > The diamond has two exits: yes and no. +? You insert a new line into a program with GOTO. What can happen? +- [x] The jumps point to the wrong lines because the numbers have moved +- [ ] Nothing, the jumps adjust by themselves +- [ ] The program automatically gets faster +> Every GOTO points to a fixed line number. If the lines move down, the program jumps to the wrong place. + ? In pseudocode, what shows which lines belong to a loop? - [ ] The colour - [x] The indentation and the END WHILE @@ -22554,27 +22678,85 @@ Os blocos também podem ser **encaixados** uns dentro dos outros: um ciclo ou um Consolo para quem correu mal um teste: a famosa revista *Communications of the ACM* rejeitou o artigo sobre estrutogramas. Segundo Nassi, o revisor até disse que deviam juntar todas as cópias e queimá-las. Ai! O artigo saiu em 1973 numa revista mais pequena e hoje é citado milhares de vezes. Ha! ::: -## Outras formas de desenhar: fluxograma e pseudocódigo +## Outras formas de desenhar: o fluxograma -Um estrutograma não é a única forma de escrever um algoritmo. Nas aulas vais conhecer mais duas. Aqui vês o exemplo do chá de “Os três juntos” nas três formas. +Há mais duas formas de representar um algoritmo: o **fluxograma** e o **pseudocódigo**. Vais conhecer as duas nas aulas. -### Estrutograma +Aqui vês outra vez o nosso estrutograma para beber chá de “Os três juntos”. A seguir vamos ver o fluxograma, com o mesmo exemplo. ::: diagramm l1-grundbausteine.visustruct O exemplo do chá como estrutograma: primeiro a chávena, depois a decisão para o açúcar e depois o ciclo. ::: -### Fluxograma - -Um **fluxograma** é feito de símbolos ligados por **setas**. Está normalizado como DIN 66001 (ISO 5807). Um losango é uma decisão com as saídas sim e não. Reconheces um ciclo por uma seta que volta **para cima**. +### O mesmo algoritmo como fluxograma ::: grafik l01-pap.svg O exemplo do chá como fluxograma. A seta de “Esperar 1 minuto” para cima forma o ciclo. ::: -### Pseudocódigo +### Os símbolos + +Um fluxograma é feito de poucos símbolos ligados por **setas**. Está normalizado como DIN 66001 (ISO 5807). + +- **Oval:** início ou fim. Cada fluxograma tem exatamente um início e um fim. +- **Retângulo:** uma instrução, por exemplo *Pôr uma chávena na mesa*. +- **Losango:** uma decisão. No losango está uma pergunta, e dele saem duas setas: **sim** e **não**. +- **Paralelogramo:** uma entrada ou saída. No exemplo do chá não aparece. +- **Seta:** mostra qual é o passo seguinte. + +Um ciclo não tem símbolo próprio no fluxograma. Reconheces um ciclo por uma seta que volta **para cima**. + +### As vantagens + +- **Muito fácil de ler**, mesmo para quem nunca viu um fluxograma. Basta seguir as setas com o dedo. +- Os fluxogramas (em inglês *flowchart*) não se usam só na programação, mas em todo o lado onde se explica um processo: em manuais de instruções, na procura de avarias (“A lâmpada acende? Não: a ficha está ligada?”) ou nas empresas para os processos de trabalho. + +## Desvantagens do fluxograma: saltos + +Uma seta num fluxograma pode ir de qualquer símbolo para qualquer outro. Parece prático, mas é perigoso. + +Antigamente, os programas escreviam-se exatamente assim. Cada linha tinha um **número**, e o comando **GOTO**, em português “ir para”, saltava para um número de linha. Cada IR PARA é uma seta do fluxograma. O nosso exemplo do chá ficava assim: + +\`\`\` +10 Pôr uma chávena na mesa +20 SE não quer açúcar, IR PARA 40 +30 Juntar açúcar +40 SE chá não demasiado quente, IR PARA 70 +50 Esperar 1 minuto +60 IR PARA 40 +70 Beber o chá +\`\`\` -**Pseudocódigo** é texto que parece um programa, mas está escrito em linguagem corrente. Palavras fixas como SE e ENQUANTO mostram os blocos, e a **indentação** mostra o que pertence a eles. +### Mais uma linha, e os saltos ficam errados + +Agora melhoras o algoritmo: depois do açúcar, o saquinho de chá deve sair. Acrescentas a nova linha 40, e todas as linhas abaixo avançam um número. Mas os saltos continuam a apontar para os números antigos: + +\`\`\` +10 Pôr uma chávena na mesa +20 SE não quer açúcar, IR PARA 40 +30 Juntar açúcar +40 Tirar o saquinho de chá +50 SE chá não demasiado quente, IR PARA 70 +60 Esperar 1 minuto +70 IR PARA 40 +80 Beber o chá +\`\`\` + +Experimenta: a linha 70 já não te manda para a verificação da linha 50, mas para o saquinho. E quando o chá já está frio o suficiente, a linha 50 salta para a linha 70 em vez de *Beber o chá*. Ou seja, tiras o saquinho vezes sem conta e nunca bebes. A cada alteração tens de verificar todos os IR PARA. Num programa grande, com centenas de saltos, é fácil algo correr mal. + +### Para todo o lado: código esparguete + +Com setas também se pode saltar do meio de um ciclo para fora, ou de fora para o meio de um ciclo. Estes saltos tornam o fluxograma confuso muito depressa. Com muitos saltos, as setas cruzam-se até o fluxograma parecer um prato de esparguete. Por isso chama-se **código esparguete**. Mal se consegue seguir o fluxo, e os erros escondem-se bem. + +Um estrutograma não tem setas. Se acrescentares um bloco, tudo o que está abaixo desce com ele, e nenhum salto pode apontar para o sítio errado. Para sair de um ciclo mais cedo existe lá um bloco próprio e arrumado, a interrupção. Vais conhecê-la na lição 18. + +::: angeberwissen +Em 1968, o informático Edsger Dijkstra escreveu uma carta famosa: “Go To Statement Considered Harmful”, ou seja, “o GOTO é considerado prejudicial”. Desde então, os programas são construídos só com sequência, decisão e ciclo. Em Java, \`goto\` ainda hoje é uma palavra reservada, mas não a podes usar. Mééé, prefiro comer esparguete a programá-lo. +::: + +## Pseudocódigo e comparação + +**Pseudocódigo** é texto que parece um programa, mas está escrito em linguagem corrente. Palavras fixas como SE e ENQUANTO mostram os blocos, e a **indentação** mostra o que pertence a eles. Aqui também não há saltos. Este é o nosso exemplo do chá: \`\`\` Pôr uma chávena na mesa @@ -22590,7 +22772,7 @@ Beber o chá ### Comparação - **Estrutograma:** blocos dentro de blocos, o ciclo é um L invertido. Vês a estrutura num relance, e saltos malucos são impossíveis. -- **Fluxograma:** símbolos com setas, o ciclo é uma seta que volta para cima. Muito fácil de imaginar, mas os fluxogramas grandes ficam depressa confusos. +- **Fluxograma:** símbolos com setas, o ciclo é uma seta que volta para cima. Muito fácil de imaginar, mas os fluxogramas grandes ficam depressa confusos, e são possíveis saltos para todo o lado. - **Pseudocódigo:** texto com indentação, o ciclo fica entre ENQUANTO e FIM ENQUANTO. Rápido de escrever e já perto do código de um programa. > Os três descrevem o mesmo algoritmo. Quando sabes ler uma das formas, aprendes as outras depressa. @@ -22608,10 +22790,6 @@ Quando programas, acontecem duas coisas ao mesmo tempo: tens de pensar nos passo Com a **simulação** também podes executar o teu estrutograma passo a passo e verificar se ele faz mesmo o que deve. -::: angeberwissen -Programas que saltam para todo o lado chamam-se **código esparguete**: se tentares seguir um fio, ficas todo enrolado, como num prato de esparguete. Antigamente, o culpado era o comando GOTO, que quer dizer “salta para a linha …”. Por isso, em 1968, o informático Edsger Dijkstra escreveu uma carta famosa: “Go To Statement Considered Harmful”. Desde então, os programas são construídos só com sequência, decisão e ciclo. Em Java, \`goto\` ainda hoje é uma palavra reservada, mas não a podes usar. Mééé, prefiro comer esparguete a programá-lo. -::: - ## Jogo: Que bloco básico? ::: spiel frage @@ -22667,7 +22845,9 @@ richtig: decisão - Sei que um estrutograma se lê de cima para baixo. → Como se lê um estrutograma - Conheço os três blocos básicos: sequência, decisão e ciclo. → Bloco básico 1: a sequência - Reconheço cada bloco básico num estrutograma pela sua forma. → Os três juntos -- Também consigo ler um algoritmo simples como fluxograma e como pseudocódigo. → Outras formas de desenhar: fluxograma e pseudocódigo +- Conheço os símbolos de um fluxograma e sei ler um fluxograma simples. → Outras formas de desenhar: o fluxograma +- Sei explicar porque é que os saltos com GOTO levam a erros e a código esparguete. → Desvantagens do fluxograma: saltos +- Também consigo ler um algoritmo simples em pseudocódigo. → Pseudocódigo e comparação ::: ## Teste de conhecimentos @@ -22717,6 +22897,12 @@ richtig: decisão = Paralelogramo -> Entrada ou saída > O losango tem duas saídas: sim e não. +? Acrescentas uma nova linha a um programa com GOTO. O que pode acontecer? +- [x] Os saltos apontam para as linhas erradas, porque os números mudaram +- [ ] Nada, os saltos ajustam-se sozinhos +- [ ] O programa fica automaticamente mais rápido +> Cada IR PARA aponta para um número de linha fixo. Se as linhas descem, o programa salta para o sítio errado. + ? No pseudocódigo, o que mostra que linhas pertencem a um ciclo? - [ ] A cor - [x] A indentação e o FIM ENQUANTO @@ -48927,7 +49113,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;82;101;105;104;101;32;49;44;32;80;108;97;116;122;32;50;32;118;101;114;107;97;117;102;116;63;32;34;32;43;32;115;105;116;122;101;91;49;93;91;50;93; -`,e8=` +`,ek=` 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; @@ -48942,7 +49128,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;32;43;32;34;32;115;34; -`,t8=` +`,tk=` 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; @@ -48957,7 +49143,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;32;43;32;34;32;115;34; -`,n8=` +`,nk=` 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; @@ -48975,7 +49161,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;114;246;223;101;58;32;34;32;43;32;103;114;111;101;115;115;101;32;43;32;34;32;109;34; -`,i8=` +`,ik=` 105;110;116;32;122;97;104;108;32;61;32;51; @@ -48990,7 +49176,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;122;97;104;108; -`,a8=` +`,ak=` 105;110;116;32;122;97;104;108;32;61;32;50; @@ -49005,7 +49191,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;122;97;104;108; -`,s8=` +`,sk=` 111;117;116;112;117;116;58;32;122;97;104;108; @@ -49020,7 +49206,7 @@ lösung: vb-wald-loesung.visustruct 122;97;104;108;32;61;32;122;97;104;108;32;43;32;51; -`,r8=` +`,rk=` 83;116;114;105;110;103;32;108;105;110;107;115;32;61;32;34;83;97;102;116;34; @@ -49044,7 +49230,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;82;101;99;104;116;115;58;32;34;32;43;32;114;101;99;104;116;115; -`,o8=` +`,ok=` 83;116;114;105;110;103;32;108;105;110;107;115;32;61;32;34;83;97;102;116;34; @@ -49059,7 +49245,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;82;101;99;104;116;115;58;32;34;32;43;32;114;101;99;104;116;115; -`,l8=` +`,lk=` 105;110;116;32;97;32;61;32;53; @@ -49083,7 +49269,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; -`,u8=` +`,uk=` 105;110;116;32;97;108;116;101;114;32;61;32;49;52; @@ -49101,7 +49287,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;114;246;223;101;58;32;34;32;43;32;103;114;111;101;115;115;101;32;43;32;34;32;109;34; -`,m8=` +`,mk=` 105;110;116;32;109;105;110;117;116;101;110;32;61;32;49;51;53; @@ -49116,7 +49302,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;116;117;110;100;101;110;32;43;32;34;32;83;116;117;110;100;101;110;32;117;110;100;32;34;32;43;32;114;101;115;116;32;43;32;34;32;77;105;110;117;116;101;110;34; -`,c8=` +`,ck=` 105;110;116;32;97;110;122;97;104;108;32;61;32;51; @@ -49131,7 +49317,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116;80;114;101;105;115;32;43;32;34;32;69;117;114;111;34; -`,d8=` +`,dk=` 105;110;116;32;103;117;116;104;97;98;101;110;32;61;32;50;48; @@ -49146,7 +49332,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;220;98;114;105;103;58;32;34;32;43;32;103;117;116;104;97;98;101;110; -`,h8=` +`,hk=` 105;110;116;32;103;117;116;104;97;98;101;110;32;61;32;50;48; @@ -49161,7 +49347,7 @@ lösung: vb-wald-loesung.visustruct 103;117;116;104;97;98;101;110;32;61;32;103;117;116;104;97;98;101;110;32;45;32;112;114;101;105;115; -`,g8=` +`,gk=` 105;110;116;32;112;114;101;105;115;32;61;32;57; @@ -49176,7 +49362,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; -`,p8=` +`,pk=` 105;110;116;32;108;97;101;110;103;101;32;61;32;55; @@ -49197,7 +49383,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;85;109;102;97;110;103;58;32;34;32;43;32;117;109;102;97;110;103; -`,f8=` +`,fk=` 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; @@ -49212,7 +49398,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;77;105;110;117;116;101;110;32;117;110;100;32;34;32;43;32;114;101;115;116;32;43;32;34;32;83;101;107;117;110;100;101;110;34; -`,x8=` +`,xk=` 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; @@ -49221,7 +49407,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;77;105;110;117;116;101;110;32;117;110;100;32;34;32;43;32;114;101;115;116;32;43;32;34;32;83;101;107;117;110;100;101;110;34; -`,b8=` +`,bk=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;109;101;32;34;87;105;101;32;104;101;105;223;116;32;100;117;63;34; @@ -49230,7 +49416,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;97;108;108;111;32;34;32;43;32;110;97;109;101;32;43;32;34;33;34; -`,v8=` +`,vk=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -49245,7 +49431,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; -`,y8=` +`,yk=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -49257,7 +49443,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;40;97;32;43;32;98;41; -`,w8=` +`,wk=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -49269,7 +49455,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;97;32;43;32;98; -`,z8=` +`,zk=` 105;110;112;117;116;58;32;105;110;116;32;106;97;104;114;101;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; @@ -49281,7 +49467,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;97;115;32;115;105;110;100;32;101;116;119;97;32;34;32;43;32;116;97;103;101;32;43;32;34;32;84;97;103;101;46;34; -`,I8=` +`,Ik=` 105;110;112;117;116;58;32;100;111;117;98;108;101;32;120;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -49296,7 +49482,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;105;116;116;101;108;119;101;114;116;58;32;34;32;43;32;109;105;116;116;101;108; -`,k8=` +`,kk=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -49317,7 +49503,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;114;111;100;117;107;116;58;32;34;32;43;32;112;114;111;100;117;107;116; -`,S8=` +`,Sk=` 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; @@ -49336,7 +49522,7 @@ lösung: vb-wald-loesung.visustruct -`,_8=` +`,_k=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;63;34; @@ -49358,7 +49544,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;122;97;104;108; -`,T8=` +`,Tk=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;63;34; @@ -49377,7 +49563,7 @@ lösung: vb-wald-loesung.visustruct -`,O8=` +`,Ok=` 105;110;116;32;112;117;110;107;116;101;32;61;32;48; @@ -49395,7 +49581,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;117;110;107;116;101;58;32;34;32;43;32;112;117;110;107;116;101; -`,A8=` +`,Ak=` 105;110;116;32;112;117;110;107;116;101;32;61;32;48; @@ -49413,7 +49599,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;117;110;107;116;101;58;32;34;32;43;32;112;117;110;107;116;101; -`,P8=` +`,Pk=` 105;110;116;32;112;114;101;105;115;32;61;32;56; @@ -49431,7 +49617,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; -`,j8=` +`,jk=` 105;110;116;32;112;114;101;105;115;32;61;32;56; @@ -49449,7 +49635,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; -`,C8=` +`,Ck=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -49471,7 +49657,7 @@ lösung: vb-wald-loesung.visustruct -`,B8=` +`,Bk=` 105;110;112;117;116;58;32;100;111;117;98;108;101;32;112;114;101;105;115;32;34;80;114;101;105;115;32;105;110;32;69;117;114;111;63;34; @@ -49493,7 +49679,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;90;117;32;122;97;104;108;101;110;58;32;34;32;43;32;112;114;101;105;115;32;43;32;34;32;69;117;114;111;34; -`,D8=` +`,Dk=` 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101;32;34;78;111;116;101;63;34; @@ -49512,7 +49698,7 @@ lösung: vb-wald-loesung.visustruct -`,Z8=` +`,Zk=` 105;110;112;117;116;58;32;105;110;116;32;112;117;110;107;116;101;32;34;87;105;101;32;118;105;101;108;101;32;80;117;110;107;116;101;63;34; @@ -49531,7 +49717,7 @@ lösung: vb-wald-loesung.visustruct -`,M8=` +`,Mk=` 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; @@ -49550,7 +49736,7 @@ lösung: vb-wald-loesung.visustruct -`,L8=` +`,Lk=` 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; @@ -49569,7 +49755,7 @@ lösung: vb-wald-loesung.visustruct -`,W8=` +`,Wk=` 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; @@ -49588,7 +49774,7 @@ lösung: vb-wald-loesung.visustruct -`,E8=` +`,Ek=` 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101;32;34;78;111;116;101;63;34; @@ -49607,7 +49793,7 @@ lösung: vb-wald-loesung.visustruct -`,N8=` +`,Nk=` 105;110;112;117;116;58;32;105;110;116;32;106;97;104;114;32;34;74;97;104;114;63;34; @@ -49626,7 +49812,7 @@ lösung: vb-wald-loesung.visustruct -`,F8=` +`,Fk=` 105;110;112;117;116;58;32;105;110;116;32;116;97;103;32;34;84;97;103;32;40;49;32;98;105;115;32;55;41;63;34; @@ -49645,7 +49831,7 @@ lösung: vb-wald-loesung.visustruct -`,J8=` +`,Jk=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;97;114;98;101;32;34;87;101;108;99;104;101;32;70;97;114;98;101;32;104;97;116;32;100;105;101;32;65;109;112;101;108;63;34; @@ -49674,7 +49860,7 @@ lösung: vb-wald-loesung.visustruct -`,R8=` +`,Rk=` 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;87;97;115;115;101;114;44;32;50;32;83;97;102;116;44;32;51;32;75;97;107;97;111;34; @@ -49703,7 +49889,7 @@ lösung: vb-wald-loesung.visustruct -`,G8=` +`,Gk=` 105;110;112;117;116;58;32;105;110;116;32;116;97;103;32;34;87;101;108;99;104;101;114;32;84;97;103;32;40;49;32;98;105;115;32;55;41;63;34; @@ -49722,7 +49908,7 @@ lösung: vb-wald-loesung.visustruct -`,H8=` +`,Hk=` 105;110;112;117;116;58;32;105;110;116;32;116;97;103;32;34;87;101;108;99;104;101;114;32;84;97;103;32;40;49;32;98;105;115;32;55;41;63;34; @@ -49741,7 +49927,7 @@ lösung: vb-wald-loesung.visustruct -`,V8=` +`,Vk=` 105;110;112;117;116;58;32;105;110;116;32;115;116;117;110;100;101;32;34;87;105;101;32;115;112;228;116;32;105;115;116;32;101;115;32;40;110;117;114;32;100;105;101;32;83;116;117;110;100;101;41;63;34; @@ -49760,7 +49946,7 @@ lösung: vb-wald-loesung.visustruct -`,Q8=` +`,Qk=` 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101;32;34;87;101;108;99;104;101;32;78;111;116;101;63;34; @@ -49804,7 +49990,7 @@ lösung: vb-wald-loesung.visustruct -`,q8=` +`,qk=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;34; @@ -49851,7 +50037,7 @@ lösung: vb-wald-loesung.visustruct -`,U8=` +`,Uk=` 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;87;97;115;115;101;114;44;32;50;32;83;97;102;116;44;32;51;32;75;97;107;97;111;34; @@ -49890,7 +50076,7 @@ lösung: vb-wald-loesung.visustruct -`,$8=` +`,$k=` 84;97;115;115;101;32;97;117;102;32;100;101;110;32;84;105;115;99;104;32;115;116;101;108;108;101;110; @@ -49920,7 +50106,7 @@ lösung: vb-wald-loesung.visustruct 84;101;101;32;116;114;105;110;107;101;110; -`,Y8=` +`,Yk=` 65;117;102;115;116;101;104;101;110; @@ -49935,7 +50121,7 @@ lösung: vb-wald-loesung.visustruct 70;114;252;104;115;116;252;99;107;101;110; -`,X8=` +`,Xk=` 87;97;115;115;101;114;32;105;110;32;100;101;110;32;87;97;115;115;101;114;107;111;99;104;101;114;32;102;252;108;108;101;110; @@ -49956,7 +50142,7 @@ lösung: vb-wald-loesung.visustruct 84;101;101;98;101;117;116;101;108;32;104;101;114;97;117;115;110;101;104;109;101;110; -`,K8=` +`,Kk=` 82;101;103;110;101;116;32;101;115;63; @@ -49975,7 +50161,7 @@ lösung: vb-wald-loesung.visustruct 76;111;115;103;101;104;101;110; -`,ek=` +`,e8=` 84;101;108;108;101;114;32;110;105;99;104;116;32;108;101;101;114; @@ -49989,7 +50175,7 @@ lösung: vb-wald-loesung.visustruct 84;101;108;108;101;114;32;97;98;114;228;117;109;101;110; -`,tk=` +`,t8=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;119;111;104;105;110;32;122;228;104;108;101;110;63;34; @@ -50009,7 +50195,7 @@ lösung: vb-wald-loesung.visustruct -`,nk=` +`,n8=` 105;110;116;32;122;97;104;108;32;61;32;51; @@ -50029,7 +50215,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; -`,ik=` +`,i8=` 105;110;116;32;122;97;104;108;32;61;32;51; @@ -50046,7 +50232,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; -`,ak=` +`,a8=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;70;97;107;117;108;116;228;116;32;118;111;110;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; @@ -50072,7 +50258,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;32;43;32;34;33;32;61;32;34;32;43;32;102;97;107;117;108;116;97;101;116; -`,sk=` +`,s8=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -50107,7 +50293,7 @@ lösung: vb-wald-loesung.visustruct -`,rk=` +`,r8=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -50142,7 +50328,7 @@ lösung: vb-wald-loesung.visustruct -`,ok=` +`,o8=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;90;97;104;108;63;34; @@ -50171,7 +50357,7 @@ lösung: vb-wald-loesung.visustruct -`,lk=` +`,l8=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;34; @@ -50194,7 +50380,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;99;104;114;105;116;116;101; -`,uk=` +`,u8=` 105;110;116;32;122;97;104;108;32;61;32;48; @@ -50211,7 +50397,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;97;110;107;101;33;34; -`,mk=` +`,m8=` 105;110;116;32;105;32;61;32;49;48; @@ -50228,7 +50414,7 @@ lösung: vb-wald-loesung.visustruct -`,ck=` +`,c8=` 105;110;112;117;116;58;32;105;110;116;32;122;105;101;108;32;34;83;112;97;114;122;105;101;108;63;34; @@ -50254,7 +50440,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;87;111;99;104;101;110;58;32;34;32;43;32;119;111;99;104;101;110; -`,dk=` +`,d8=` 105;110;112;117;116;58;32;105;110;116;32;122;105;101;108;32;34;83;112;97;114;122;105;101;108;63;34; @@ -50280,7 +50466,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;87;111;99;104;101;110;58;32;34;32;43;32;119;111;99;104;101;110; -`,hk=` +`,h8=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;119;111;104;105;110;63;34; @@ -50300,7 +50486,7 @@ lösung: vb-wald-loesung.visustruct -`,gk=` +`,g8=` 105;110;116;32;110;111;116;101;32;61;32;48; @@ -50317,7 +50503,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;101;105;110;101;32;78;111;116;101;58;32;34;32;43;32;110;111;116;101; -`,pk=` +`,p8=` 105;110;116;32;115;117;109;109;101;32;61;32;48; @@ -50340,7 +50526,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;117;109;109;101; -`,fk=` +`,f8=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;83;116;97;114;116;122;97;104;108;34; @@ -50359,7 +50545,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;76;111;115;33;34; -`,xk=` +`,x8=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; @@ -50378,7 +50564,7 @@ lösung: vb-wald-loesung.visustruct -`,bk=` +`,b8=` 105;110;116;32;105;32;61;32;49; @@ -50391,7 +50577,7 @@ lösung: vb-wald-loesung.visustruct -`,vk=` +`,v8=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; @@ -50408,7 +50594,7 @@ lösung: vb-wald-loesung.visustruct -`,yk=` +`,y8=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; @@ -50425,7 +50611,7 @@ lösung: vb-wald-loesung.visustruct -`,wk=` +`,w8=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; @@ -50442,7 +50628,7 @@ lösung: vb-wald-loesung.visustruct -`,zk=` +`,z8=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; @@ -50464,7 +50650,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;117;109;109;101; -`,Ik=` +`,I8=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;87;105;101;32;118;105;101;108;101;32;90;101;105;108;101;110;63;34; @@ -50493,7 +50679,7 @@ lösung: vb-wald-loesung.visustruct -`,kk=` +`,k8=` 105;110;116;32;97;110;122;97;104;108;32;61;32;48; @@ -50525,7 +50711,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;97;110;122;97;104;108; -`,Sk=` +`,S8=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; @@ -50557,7 +50743,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;97;110;122;97;104;108; -`,_k=` +`,_8=` 105;110;112;117;116;58;32;105;110;116;32;114;101;105;104;101;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; @@ -50573,7 +50759,7 @@ lösung: vb-wald-loesung.visustruct -`,Tk=` +`,T8=` 105;110;112;117;116;58;32;105;110;116;32;114;101;105;104;101;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; @@ -50589,7 +50775,7 @@ lösung: vb-wald-loesung.visustruct -`,Ok=` +`,O8=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; @@ -50605,7 +50791,7 @@ lösung: vb-wald-loesung.visustruct -`,Ak=` +`,A8=` 105;110;112;117;116;58;32;105;110;116;32;98;114;101;105;116;101;32;34;66;114;101;105;116;101;34; @@ -50637,7 +50823,7 @@ lösung: vb-wald-loesung.visustruct -`,Pk=` +`,P8=` 105;110;116;91;93;32;122;97;104;108;101;110;32;61;32;123;50;44;32;52;44;32;54;44;32;56;44;32;49;48;125; @@ -50653,7 +50839,7 @@ lösung: vb-wald-loesung.visustruct -`,jk=` +`,j8=` 105;110;116;91;93;32;119;101;114;116;101;32;61;32;123;52;44;32;56;44;32;49;53;44;32;49;54;44;32;50;51;44;32;52;50;125; @@ -50668,7 +50854,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;119;101;114;116;101;46;108;101;110;103;116;104; -`,Ck=` +`,C8=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; @@ -50700,7 +50886,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;65;110;122;97;104;108;58;32;34;32;43;32;97;110;122;97;104;108; -`,Bk=` +`,B8=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; @@ -50732,7 +50918,7 @@ lösung: vb-wald-loesung.visustruct -`,Dk=` +`,D8=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;87;105;101;32;118;105;101;108;101;32;83;116;117;102;101;110;63;34; @@ -50761,7 +50947,7 @@ lösung: vb-wald-loesung.visustruct -`,Zk=` +`,Z8=` 83;116;114;105;110;103;91;93;32;110;97;109;101;110;32;61;32;110;101;119;32;83;116;114;105;110;103;91;51;93; @@ -50780,7 +50966,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;69;114;115;116;101;114;32;78;97;109;101;58;32;34;32;43;32;110;97;109;101;110;91;48;93; -`,Mk=` +`,M8=` 105;110;116;91;93;32;122;97;104;108;101;110;32;61;32;110;101;119;32;105;110;116;91;52;93; @@ -50806,7 +50992,7 @@ lösung: vb-wald-loesung.visustruct -`,Lk=` +`,L8=` 105;110;116;91;93;32;122;97;104;108;101;110;32;61;32;110;101;119;32;105;110;116;91;53;93; @@ -50857,7 +51043,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;97;120;105;109;117;109;58;32;34;32;43;32;109;97;120; -`,Wk=` +`,W8=` 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;49;50;44;32;55;44;32;49;57;44;32;52;125; @@ -50898,7 +51084,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;97;120;105;109;117;109;58;32;34;32;43;32;109;97;120; -`,Ek=` +`,E8=` 105;110;116;32;115;117;109;109;101;32;61;32;48; @@ -50921,7 +51107,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; -`,Nk=` +`,N8=` 105;110;116;32;115;117;109;109;101;32;61;32;48; @@ -50951,7 +51137,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; -`,Fk=` +`,F8=` 105;110;112;117;116;58;32;105;110;116;32;108;97;101;110;103;101;32;34;76;228;110;103;101;63;34; @@ -50966,13 +51152,13 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;70;108;228;99;104;101;58;32;34;32;43;32;102; -`,Jk=` +`,J8=` 114;101;116;117;114;110;32;97;32;42;32;98; -`,Rk=` +`,R8=` 122;101;105;103;101;66;101;103;114;117;101;115;115;117;110;103;40;41; @@ -50984,7 +51170,7 @@ lösung: vb-wald-loesung.visustruct 122;101;105;103;101;69;114;103;101;98;110;105;115;40;41; -`,Gk=` +`,G8=` 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;101;110;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; @@ -51016,7 +51202,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;246;99;104;115;116;101;32;84;101;109;112;101;114;97;116;117;114;58;32;34;32;43;32;109;97;120; -`,Hk=` +`,H8=` 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;101;110;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; @@ -51048,7 +51234,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;246;99;104;115;116;101;32;84;101;109;112;101;114;97;116;117;114;58;32;34;32;43;32;109;97;120; -`,Vk=` +`,V8=` 105;110;116;91;93;32;110;111;116;101;110;32;61;32;123;50;44;32;51;44;32;49;44;32;52;125; @@ -51070,7 +51256,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; -`,Qk=` +`,Q8=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;90;97;104;108;63;34; @@ -51082,7 +51268,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;97;115;32;81;117;97;100;114;97;116;32;105;115;116;32;34;32;43;32;113; -`,qk=` +`,q8=` 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;120;32;42;32;120; @@ -51091,7 +51277,7 @@ lösung: vb-wald-loesung.visustruct 114;101;116;117;114;110;32;101;114;103;101;98;110;105;115; -`,Uk=` +`,U8=` 122;101;105;103;101;84;105;116;101;108;40;41; @@ -51103,7 +51289,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;97;108;108;111;32;34;32;43;32;110;97;109;101; -`,$k=` +`,$8=` 111;117;116;112;117;116;58;32;34;87;105;108;108;107;111;109;109;101;110;32;122;117;109;32;81;117;105;122;33;34; @@ -51112,7 +51298,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;117;32;98;101;107;111;109;109;115;116;32;100;114;101;105;32;70;114;97;103;101;110;46;34; -`,Yk=` +`,Y8=` 122;101;105;103;101;83;117;109;109;101;40;51;44;32;52;41; @@ -51124,7 +51310,7 @@ lösung: vb-wald-loesung.visustruct 122;101;105;103;101;83;117;109;109;101;40;120;44;32;120;32;43;32;49;41; -`,Xk=` +`,X8=` 105;110;116;32;115;117;109;109;101;32;61;32;97;32;43;32;98; @@ -51133,7 +51319,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;97;32;43;32;34;32;43;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;115;117;109;109;101; -`,Kk=` +`,K8=` 105;110;112;117;116;58;32;105;110;116;32;115;116;97;114;116;32;34;83;116;97;114;116;119;101;114;116;34; @@ -60277,7 +60463,7 @@ raster: 3 `).trim(),tip:!0});break;case"caesar":{const d=c?Number(c):3;if(!Number.isInteger(d)||d<0||d>25)throw new te(`${e}: „::: caesar“ braucht einen Schlüssel von 0 bis 25.`);t.push({kind:"caesar",key:d,text:l.join(" ").trim()});break}case"mbot2":{const d={kind:"robotModel",focus:[]};for(const h of l.filter(g=>g.trim())){const g=/^\s*(fokus|focus|ansicht|view|drehen|spin):\s*(.*)$/i.exec(h);if(!g)throw new te(`${e}: „::: mbot2“ kennt nur Zeilen „fokus:“, „ansicht:“ und „drehen:“.`);const f=g[1].toLowerCase();f==="fokus"||f==="focus"?d.focus=Du(g[2],e):f==="ansicht"||f==="view"?d.view=g[2].trim().toLowerCase():d.spin=/^(ja|yes|true|sim)$/i.test(g[2].trim())}t.push(d);break}case"mbot2quiz":{const d={kind:"robotQuiz",tasks:[]};for(const h of l.filter(g=>g.trim())){const g=/^\s*-\s*(\w+)\s*:\s*(.+)$/.exec(h),f=/^\s*(fertig|done):\s*(.+)$/i.exec(h);if(g)d.tasks.push({part:Du(g[1],e)[0],question:g[2].trim()});else if(f)d.done=f[2].trim();else throw new te(`${e}: „::: mbot2quiz“ braucht Zeilen „- teil: Frage“ und optional „fertig: Text“.`)}if(!d.tasks.length)throw new te(`${e}: „::: mbot2quiz“ hat keine Fragen.`);t.push(d);break}case"datei":{if(!/^[\w.-]+\.(txt|csv|json)$/u.test(c))throw new te(`${e}: „::: datei“ braucht einen Dateinamen wie brief.txt, liste.csv oder daten.json.`);for(;l.length&&l[0].trim()==="";)l.shift();for(;l.length&&l[l.length-1].trim()==="";)l.pop();t.push({kind:"textFile",name:c,content:l.join(` `)});break}default:throw new te(`${e}: Unbekannter Block „::: ${o[1]}“.`)}r=u}return s(),t}function RB(i){const e=/^(.*?)\s+→\s+(.+)$/.exec(i);return e?{text:e[1],ref:e[2].trim()}:{text:i}}function GB(i,e){const t=new Map(i.map((n,a)=>[n.title.toLowerCase(),a]));for(const n of i.flatMap(a=>a.blocks))if(n.kind==="checklist"){for(const a of n.items)if(a.ref!==void 0&&(a.step=t.get(a.ref.toLowerCase()),a.step===void 0))throw new te(`${e}: Checkliste verweist auf unbekannten Schritt „${a.ref}“.`)}}function HB(i,e){var c;const{meta:t,body:n}=Nh(i,e),a=e.replace(/^.*\//,"").replace(/\.md$/,""),s=Number((c=/^(\d+)/.exec(a))==null?void 0:c[1]);if(!Number.isFinite(s))throw new te(`${e}: Dateiname muss mit der Nummer beginnen (z. B. 01-…).`);const r=[];let o=[],l;const u=()=>{l&&r.push({title:l.title,blocks:Jh(l.lines.join(` `),e)})};for(const d of n.split(` -`)){const h=/^##\s+(.*)$/.exec(d);h?(u(),l={title:h[1].trim(),lines:[]}):l?l.lines.push(d):o.push(d)}if(u(),r.length===0)throw new te(`${e}: Keine Schritte (## Überschrift) gefunden.`);GB(r,e);const m=t.get("titel");if(!m)throw new te(`${e}: „titel:“ fehlt.`);return{id:a,number:s,title:m,section:t.get("bereich")??"",summary:t.get("kurz")??o.join(" ").trim(),steps:r}}function VB(i,e){const{meta:t,body:n}=Nh(i,e),a=t.get("titel");if(!a)throw new te(`${e}: „titel:“ fehlt.`);const s=t.get("nach");return{id:e.replace(/^.*\//,"").replace(/\.md$/,""),title:a,after:s?Number(s):void 0,level:Number(t.get("stufe")??"1")||1,blocks:Jh(n,e)}}function Du(i,e){const t=i.split(/\s*,\s*/).map(n=>n.trim()).filter(Boolean);for(const n of t)if(!l3(n))throw new te(`${e}: Unbekanntes Teil „${n}“. Bekannt: ${ah.join(", ")}.`);return t}const QB=Object.assign({"../../lessons/de/01-was-ist-ein-struktogramm.md":Xx,"../../lessons/de/02-der-editor.md":Kx,"../../lessons/de/03-speichern-oeffnen-exportieren.md":eb,"../../lessons/de/04-variablen-und-datentypen.md":tb,"../../lessons/de/05-sequenz.md":nb,"../../lessons/de/06-eingabe-und-ausgabe.md":ib,"../../lessons/de/07-simulation-und-schreibtischtest.md":ab,"../../lessons/de/08-verzweigung.md":sb,"../../lessons/de/09-bedingungen-verknuepfen.md":rb,"../../lessons/de/10-fallauswahl.md":ob,"../../lessons/de/11-while-schleife.md":lb,"../../lessons/de/12-do-while-schleife.md":ub,"../../lessons/de/13-for-schleife.md":mb,"../../lessons/de/14-verschachteln.md":cb,"../../lessons/de/15-arrays.md":db,"../../lessons/de/16-zweidimensionale-arrays.md":hb,"../../lessons/de/17-zeichenketten.md":gb,"../../lessons/de/18-aufruf-und-aussprung.md":pb,"../../lessons/de/19-suchen-und-sortieren.md":fb,"../../lessons/de/20-java.md":xb,"../../lessons/de/21-python-und-javascript.md":bb,"../../lessons/de/22-try-und-catch.md":vb,"../../lessons/de/23-text-einlesen-und-speichern.md":yb,"../../lessons/de/24-zeile-fuer-zeile.md":wb,"../../lessons/de/25-tabellen-als-csv.md":zb,"../../lessons/de/26-json.md":Ib,"../../lessons/de/27-formate-im-vergleich.md":kb,"../../lessons/de/28-erstes-fenster.md":Sb,"../../lessons/de/29-knopf-im-fenster.md":_b,"../../lessons/de/30-der-knopf-reagiert.md":Tb,"../../lessons/de/31-zahl-verdoppeln.md":Ob,"../../lessons/de/32-klickzaehler.md":Ab,"../../lessons/de/33-ampel.md":Pb,"../../lessons/de/34-notenrechner.md":jb,"../../lessons/de/35-taschenrechner.md":Cb,"../../lessons/de/36-zahlenraten.md":Bb,"../../lessons/de/37-viele-knoepfe-ein-zuhoerer.md":Db,"../../lessons/de/38-innere-klassen.md":Zb,"../../lessons/de/39-zwei-reiter.md":Mb,"../../lessons/de/40-model-view-controller.md":Lb,"../../lessons/de/begriffe.md":Wb,"../../lessons/de/nachschlagen.md":Eb,"../../lessons/en/01-was-ist-ein-struktogramm.md":Nb,"../../lessons/en/02-der-editor.md":Fb,"../../lessons/en/03-speichern-oeffnen-exportieren.md":Jb,"../../lessons/en/04-variablen-und-datentypen.md":Rb,"../../lessons/en/05-sequenz.md":Gb,"../../lessons/en/06-eingabe-und-ausgabe.md":Hb,"../../lessons/en/07-simulation-und-schreibtischtest.md":Vb,"../../lessons/en/08-verzweigung.md":Qb,"../../lessons/en/09-bedingungen-verknuepfen.md":qb,"../../lessons/en/10-fallauswahl.md":Ub,"../../lessons/en/11-while-schleife.md":$b,"../../lessons/en/12-do-while-schleife.md":Yb,"../../lessons/en/13-for-schleife.md":Xb,"../../lessons/en/14-verschachteln.md":Kb,"../../lessons/en/15-arrays.md":e4,"../../lessons/en/16-zweidimensionale-arrays.md":t4,"../../lessons/en/17-zeichenketten.md":n4,"../../lessons/en/18-aufruf-und-aussprung.md":i4,"../../lessons/en/19-suchen-und-sortieren.md":a4,"../../lessons/en/20-java.md":s4,"../../lessons/en/21-python-und-javascript.md":r4,"../../lessons/en/22-try-und-catch.md":o4,"../../lessons/en/23-text-einlesen-und-speichern.md":l4,"../../lessons/en/24-zeile-fuer-zeile.md":u4,"../../lessons/en/25-tabellen-als-csv.md":m4,"../../lessons/en/26-json.md":c4,"../../lessons/en/27-formate-im-vergleich.md":d4,"../../lessons/en/28-erstes-fenster.md":h4,"../../lessons/en/29-knopf-im-fenster.md":g4,"../../lessons/en/30-der-knopf-reagiert.md":p4,"../../lessons/en/31-zahl-verdoppeln.md":f4,"../../lessons/en/32-klickzaehler.md":x4,"../../lessons/en/33-ampel.md":b4,"../../lessons/en/34-notenrechner.md":v4,"../../lessons/en/35-taschenrechner.md":y4,"../../lessons/en/36-zahlenraten.md":w4,"../../lessons/en/37-viele-knoepfe-ein-zuhoerer.md":z4,"../../lessons/en/38-innere-klassen.md":I4,"../../lessons/en/39-zwei-reiter.md":k4,"../../lessons/en/40-model-view-controller.md":S4,"../../lessons/en/begriffe.md":_4,"../../lessons/en/nachschlagen.md":T4,"../../lessons/pt/01-was-ist-ein-struktogramm.md":O4,"../../lessons/pt/02-der-editor.md":A4,"../../lessons/pt/03-speichern-oeffnen-exportieren.md":P4,"../../lessons/pt/04-variablen-und-datentypen.md":j4,"../../lessons/pt/05-sequenz.md":C4,"../../lessons/pt/06-eingabe-und-ausgabe.md":B4,"../../lessons/pt/07-simulation-und-schreibtischtest.md":D4,"../../lessons/pt/08-verzweigung.md":Z4,"../../lessons/pt/09-bedingungen-verknuepfen.md":M4,"../../lessons/pt/10-fallauswahl.md":L4,"../../lessons/pt/11-while-schleife.md":W4,"../../lessons/pt/12-do-while-schleife.md":E4,"../../lessons/pt/13-for-schleife.md":N4,"../../lessons/pt/14-verschachteln.md":F4,"../../lessons/pt/15-arrays.md":J4,"../../lessons/pt/16-zweidimensionale-arrays.md":R4,"../../lessons/pt/17-zeichenketten.md":G4,"../../lessons/pt/18-aufruf-und-aussprung.md":H4,"../../lessons/pt/19-suchen-und-sortieren.md":V4,"../../lessons/pt/20-java.md":Q4,"../../lessons/pt/21-python-und-javascript.md":q4,"../../lessons/pt/22-try-und-catch.md":U4,"../../lessons/pt/23-text-einlesen-und-speichern.md":$4,"../../lessons/pt/24-zeile-fuer-zeile.md":Y4,"../../lessons/pt/25-tabellen-als-csv.md":X4,"../../lessons/pt/26-json.md":K4,"../../lessons/pt/27-formate-im-vergleich.md":ev,"../../lessons/pt/28-erstes-fenster.md":tv,"../../lessons/pt/29-knopf-im-fenster.md":nv,"../../lessons/pt/30-der-knopf-reagiert.md":iv,"../../lessons/pt/31-zahl-verdoppeln.md":av,"../../lessons/pt/32-klickzaehler.md":sv,"../../lessons/pt/33-ampel.md":rv,"../../lessons/pt/34-notenrechner.md":ov,"../../lessons/pt/35-taschenrechner.md":lv,"../../lessons/pt/36-zahlenraten.md":uv,"../../lessons/pt/37-viele-knoepfe-ein-zuhoerer.md":mv,"../../lessons/pt/38-innere-klassen.md":cv,"../../lessons/pt/39-zwei-reiter.md":dv,"../../lessons/pt/40-model-view-controller.md":hv,"../../lessons/pt/begriffe.md":gv,"../../lessons/pt/nachschlagen.md":pv}),qB=Object.assign({"../../lessons/de/aufgaben/alter-unterprogramm.md":fv,"../../lessons/de/aufgaben/ballwurf.md":xv,"../../lessons/de/aufgaben/bestenliste.md":bv,"../../lessons/de/aufgaben/binaerzahl.md":vv,"../../lessons/de/aufgaben/caesar.md":yv,"../../lessons/de/aufgaben/collatz.md":wv,"../../lessons/de/aufgaben/einheitenrechner.md":zv,"../../lessons/de/aufgaben/fibonacci.md":Iv,"../../lessons/de/aufgaben/gerade-ungerade.md":kv,"../../lessons/de/aufgaben/mehrwertsteuer.md":Sv,"../../lessons/de/aufgaben/notendurchschnitt.md":_v,"../../lessons/de/aufgaben/pin-pruefen.md":Tv,"../../lessons/de/aufgaben/schiffe-versenken.md":Ov,"../../lessons/de/aufgaben/speisekarte.md":Av,"../../lessons/de/aufgaben/summe-bilden.md":Pv,"../../lessons/de/aufgaben/tafeldienst.md":jv,"../../lessons/de/aufgaben/taschenrechner.md":Cv,"../../lessons/de/aufgaben/verleih-menue.md":Bv,"../../lessons/de/aufgaben/vokabeltrainer.md":Dv,"../../lessons/de/aufgaben/volljaehrig.md":Zv,"../../lessons/de/aufgaben/wuerfel-mvc.md":Mv,"../../lessons/de/aufgaben/zahl-verdoppeln.md":Lv,"../../lessons/en/aufgaben/alter-unterprogramm.md":Wv,"../../lessons/en/aufgaben/ballwurf.md":Ev,"../../lessons/en/aufgaben/bestenliste.md":Nv,"../../lessons/en/aufgaben/binaerzahl.md":Fv,"../../lessons/en/aufgaben/caesar.md":Jv,"../../lessons/en/aufgaben/collatz.md":Rv,"../../lessons/en/aufgaben/einheitenrechner.md":Gv,"../../lessons/en/aufgaben/fibonacci.md":Hv,"../../lessons/en/aufgaben/gerade-ungerade.md":Vv,"../../lessons/en/aufgaben/mehrwertsteuer.md":Qv,"../../lessons/en/aufgaben/notendurchschnitt.md":qv,"../../lessons/en/aufgaben/pin-pruefen.md":Uv,"../../lessons/en/aufgaben/schiffe-versenken.md":$v,"../../lessons/en/aufgaben/speisekarte.md":Yv,"../../lessons/en/aufgaben/summe-bilden.md":Xv,"../../lessons/en/aufgaben/tafeldienst.md":Kv,"../../lessons/en/aufgaben/taschenrechner.md":ey,"../../lessons/en/aufgaben/verleih-menue.md":ty,"../../lessons/en/aufgaben/vokabeltrainer.md":ny,"../../lessons/en/aufgaben/volljaehrig.md":iy,"../../lessons/en/aufgaben/wuerfel-mvc.md":ay,"../../lessons/en/aufgaben/zahl-verdoppeln.md":sy,"../../lessons/pt/aufgaben/alter-unterprogramm.md":ry,"../../lessons/pt/aufgaben/ballwurf.md":oy,"../../lessons/pt/aufgaben/bestenliste.md":ly,"../../lessons/pt/aufgaben/binaerzahl.md":uy,"../../lessons/pt/aufgaben/caesar.md":my,"../../lessons/pt/aufgaben/collatz.md":cy,"../../lessons/pt/aufgaben/einheitenrechner.md":dy,"../../lessons/pt/aufgaben/fibonacci.md":hy,"../../lessons/pt/aufgaben/gerade-ungerade.md":gy,"../../lessons/pt/aufgaben/mehrwertsteuer.md":py,"../../lessons/pt/aufgaben/notendurchschnitt.md":fy,"../../lessons/pt/aufgaben/pin-pruefen.md":xy,"../../lessons/pt/aufgaben/schiffe-versenken.md":by,"../../lessons/pt/aufgaben/speisekarte.md":vy,"../../lessons/pt/aufgaben/summe-bilden.md":yy,"../../lessons/pt/aufgaben/tafeldienst.md":wy,"../../lessons/pt/aufgaben/taschenrechner.md":zy,"../../lessons/pt/aufgaben/verleih-menue.md":Iy,"../../lessons/pt/aufgaben/vokabeltrainer.md":ky,"../../lessons/pt/aufgaben/volljaehrig.md":Sy,"../../lessons/pt/aufgaben/wuerfel-mvc.md":_y,"../../lessons/pt/aufgaben/zahl-verdoppeln.md":Ty}),Zu=Object.assign({"../../lessons/de/visubot/01-der-mbot2.md":Oy,"../../lessons/de/visubot/02-das-quadrat.md":Ay,"../../lessons/de/visubot/03-variablen-und-ausgabe.md":Py,"../../lessons/de/visubot/04-sensoren.md":jy,"../../lessons/de/visubot/05-bis-zur-wand.md":Cy,"../../lessons/de/visubot/06-abstand.md":By,"../../lessons/de/visubot/07-linie.md":Dy,"../../lessons/de/visubot/08-farben.md":Zy,"../../lessons/de/visubot/09-fallauswahl.md":My,"../../lessons/de/visubot/10-tasten-joystick.md":Ly,"../../lessons/de/visubot/11-licht.md":Wy,"../../lessons/de/visubot/12-lautstaerke.md":Ey,"../../lessons/de/visubot/13-neigung.md":Ny,"../../lessons/de/visubot/14-leds.md":Fy,"../../lessons/de/visubot/15-einzelne-leds.md":Jy,"../../lessons/de/visubot/16-lautsprecher.md":Ry,"../../lessons/de/visubot/17-arrays-melodie.md":Gy,"../../lessons/de/visubot/18-bildschirm.md":Hy,"../../lessons/de/visubot/19-zeichenketten.md":Vy,"../../lessons/de/visubot/20-motoren.md":Qy,"../../lessons/de/visubot/21-stoppuhr-akku.md":qy,"../../lessons/de/visubot/22-eigene-methoden.md":Uy,"../../lessons/de/visubot/nachschlagen.md":$y,"../../lessons/en/visubot/01-der-mbot2.md":Yy,"../../lessons/en/visubot/02-das-quadrat.md":Xy,"../../lessons/en/visubot/03-variablen-und-ausgabe.md":Ky,"../../lessons/en/visubot/04-sensoren.md":e9,"../../lessons/en/visubot/05-bis-zur-wand.md":t9,"../../lessons/en/visubot/06-abstand.md":n9,"../../lessons/en/visubot/07-linie.md":i9,"../../lessons/en/visubot/08-farben.md":a9,"../../lessons/en/visubot/09-fallauswahl.md":s9,"../../lessons/en/visubot/10-tasten-joystick.md":r9,"../../lessons/en/visubot/11-licht.md":o9,"../../lessons/en/visubot/12-lautstaerke.md":l9,"../../lessons/en/visubot/13-neigung.md":u9,"../../lessons/en/visubot/14-leds.md":m9,"../../lessons/en/visubot/15-einzelne-leds.md":c9,"../../lessons/en/visubot/16-lautsprecher.md":d9,"../../lessons/en/visubot/17-arrays-melodie.md":h9,"../../lessons/en/visubot/18-bildschirm.md":g9,"../../lessons/en/visubot/19-zeichenketten.md":p9,"../../lessons/en/visubot/20-motoren.md":f9,"../../lessons/en/visubot/21-stoppuhr-akku.md":x9,"../../lessons/en/visubot/22-eigene-methoden.md":b9,"../../lessons/en/visubot/nachschlagen.md":v9}),UB=Object.assign({"../../lessons/de/visubot/aufgaben/alarmanlage.md":y9,"../../lessons/de/visubot/aufgaben/ausgang.md":w9,"../../lessons/de/visubot/aufgaben/binaer-zaehlen.md":z9,"../../lessons/de/visubot/aufgaben/dreieck.md":I9,"../../lessons/de/visubot/aufgaben/einparken.md":k9,"../../lessons/de/visubot/aufgaben/hindernis.md":S9,"../../lessons/de/visubot/aufgaben/knight-rider.md":_9,"../../lessons/de/visubot/aufgaben/labyrinth.md":T9,"../../lessons/de/visubot/aufgaben/linienfolger-stopp.md":O9,"../../lessons/de/visubot/aufgaben/morsen.md":A9,"../../lessons/de/visubot/aufgaben/nachtwaechter.md":P9,"../../lessons/de/visubot/aufgaben/slalom.md":j9,"../../lessons/de/visubot/aufgaben/spirale.md":C9,"../../lessons/de/visubot/aufgaben/treppe.md":B9,"../../lessons/de/visubot/aufgaben/tunnel.md":D9,"../../lessons/de/visubot/aufgaben/wald.md":Z9,"../../lessons/en/visubot/aufgaben/alarmanlage.md":M9,"../../lessons/en/visubot/aufgaben/ausgang.md":L9,"../../lessons/en/visubot/aufgaben/binaer-zaehlen.md":W9,"../../lessons/en/visubot/aufgaben/dreieck.md":E9,"../../lessons/en/visubot/aufgaben/einparken.md":N9,"../../lessons/en/visubot/aufgaben/hindernis.md":F9,"../../lessons/en/visubot/aufgaben/knight-rider.md":J9,"../../lessons/en/visubot/aufgaben/labyrinth.md":R9,"../../lessons/en/visubot/aufgaben/linienfolger-stopp.md":G9,"../../lessons/en/visubot/aufgaben/morsen.md":H9,"../../lessons/en/visubot/aufgaben/nachtwaechter.md":V9,"../../lessons/en/visubot/aufgaben/slalom.md":Q9,"../../lessons/en/visubot/aufgaben/spirale.md":q9,"../../lessons/en/visubot/aufgaben/treppe.md":U9,"../../lessons/en/visubot/aufgaben/tunnel.md":$9,"../../lessons/en/visubot/aufgaben/wald.md":Y9}),$B=Object.assign({"../../lessons/diagramme/aufgabe-alter-haupt-loesung.visustruct":X9,"../../lessons/diagramme/aufgabe-alter-unterprogramm-loesung.visustruct":K9,"../../lessons/diagramme/aufgabe-ballwurf-loesung.visustruct":ew,"../../lessons/diagramme/aufgabe-ballwurf-start.visustruct":tw,"../../lessons/diagramme/aufgabe-bestenliste-loesung.visustruct":nw,"../../lessons/diagramme/aufgabe-binaer-loesung.visustruct":iw,"../../lessons/diagramme/aufgabe-caesar-array-loesung.visustruct":aw,"../../lessons/diagramme/aufgabe-caesar-array-start.visustruct":sw,"../../lessons/diagramme/aufgabe-caesar-ascii-loesung.visustruct":rw,"../../lessons/diagramme/aufgabe-caesar-entschluesseln-loesung.visustruct":ow,"../../lessons/diagramme/aufgabe-collatz-loesung.visustruct":lw,"../../lessons/diagramme/aufgabe-durchschnitt-loesung.visustruct":uw,"../../lessons/diagramme/aufgabe-fibonacci-loesung.visustruct":mw,"../../lessons/diagramme/aufgabe-gerade-loesung.visustruct":cw,"../../lessons/diagramme/aufgabe-mehrwertsteuer-loesung.visustruct":dw,"../../lessons/diagramme/aufgabe-pin-java-loesung.visustruct":hw,"../../lessons/diagramme/aufgabe-pin-loesung.visustruct":gw,"../../lessons/diagramme/aufgabe-rechner-loesung.visustruct":pw,"../../lessons/diagramme/aufgabe-schiffe-loesung.visustruct":fw,"../../lessons/diagramme/aufgabe-schiffe-start.visustruct":xw,"../../lessons/diagramme/aufgabe-speisekarte-loesung.visustruct":bw,"../../lessons/diagramme/aufgabe-summe-loesung.visustruct":vw,"../../lessons/diagramme/aufgabe-tafeldienst-loesung.visustruct":yw,"../../lessons/diagramme/aufgabe-verdoppeln-loesung.visustruct":ww,"../../lessons/diagramme/aufgabe-verleih-java-loesung.visustruct":zw,"../../lessons/diagramme/aufgabe-verleih-loesung.visustruct":Iw,"../../lessons/diagramme/aufgabe-vokabeln-loesung.visustruct":kw,"../../lessons/diagramme/aufgabe-vokabeln-start.visustruct":Sw,"../../lessons/diagramme/aufgabe-volljaehrig-loesung.visustruct":_w,"../../lessons/diagramme/dt-buffered.visustruct":Tw,"../../lessons/diagramme/dt-csv.visustruct":Ow,"../../lessons/diagramme/dt-json.visustruct":Aw,"../../lessons/diagramme/dt-lesen.visustruct":Pw,"../../lessons/diagramme/en/aufgabe-alter-haupt-loesung.visustruct":jw,"../../lessons/diagramme/en/aufgabe-alter-unterprogramm-loesung.visustruct":Cw,"../../lessons/diagramme/en/aufgabe-ballwurf-loesung.visustruct":Bw,"../../lessons/diagramme/en/aufgabe-ballwurf-start.visustruct":Dw,"../../lessons/diagramme/en/aufgabe-bestenliste-loesung.visustruct":Zw,"../../lessons/diagramme/en/aufgabe-binaer-loesung.visustruct":Mw,"../../lessons/diagramme/en/aufgabe-caesar-array-loesung.visustruct":Lw,"../../lessons/diagramme/en/aufgabe-caesar-array-start.visustruct":Ww,"../../lessons/diagramme/en/aufgabe-caesar-ascii-loesung.visustruct":Ew,"../../lessons/diagramme/en/aufgabe-caesar-entschluesseln-loesung.visustruct":Nw,"../../lessons/diagramme/en/aufgabe-collatz-loesung.visustruct":Fw,"../../lessons/diagramme/en/aufgabe-durchschnitt-loesung.visustruct":Jw,"../../lessons/diagramme/en/aufgabe-fibonacci-loesung.visustruct":Rw,"../../lessons/diagramme/en/aufgabe-gerade-loesung.visustruct":Gw,"../../lessons/diagramme/en/aufgabe-mehrwertsteuer-loesung.visustruct":Hw,"../../lessons/diagramme/en/aufgabe-pin-java-loesung.visustruct":Vw,"../../lessons/diagramme/en/aufgabe-pin-loesung.visustruct":Qw,"../../lessons/diagramme/en/aufgabe-rechner-loesung.visustruct":qw,"../../lessons/diagramme/en/aufgabe-schiffe-loesung.visustruct":Uw,"../../lessons/diagramme/en/aufgabe-schiffe-start.visustruct":$w,"../../lessons/diagramme/en/aufgabe-speisekarte-loesung.visustruct":Yw,"../../lessons/diagramme/en/aufgabe-summe-loesung.visustruct":Xw,"../../lessons/diagramme/en/aufgabe-tafeldienst-loesung.visustruct":Kw,"../../lessons/diagramme/en/aufgabe-verdoppeln-loesung.visustruct":e5,"../../lessons/diagramme/en/aufgabe-verleih-java-loesung.visustruct":t5,"../../lessons/diagramme/en/aufgabe-verleih-loesung.visustruct":n5,"../../lessons/diagramme/en/aufgabe-vokabeln-loesung.visustruct":i5,"../../lessons/diagramme/en/aufgabe-vokabeln-start.visustruct":a5,"../../lessons/diagramme/en/aufgabe-volljaehrig-loesung.visustruct":s5,"../../lessons/diagramme/en/dt-buffered.visustruct":r5,"../../lessons/diagramme/en/dt-csv.visustruct":o5,"../../lessons/diagramme/en/dt-json.visustruct":l5,"../../lessons/diagramme/en/dt-lesen.visustruct":u5,"../../lessons/diagramme/en/kino-einmaleins-loesung.visustruct":m5,"../../lessons/diagramme/en/kino-frei-loesung.visustruct":c5,"../../lessons/diagramme/en/kino-frei-start.visustruct":d5,"../../lessons/diagramme/en/kino-karte-loesung.visustruct":h5,"../../lessons/diagramme/en/kino-karte-start.visustruct":g5,"../../lessons/diagramme/en/kino-saalplan.visustruct":p5,"../../lessons/diagramme/en/kino-verkaufen.visustruct":f5,"../../lessons/diagramme/en/l04-java-fehler-loesung.visustruct":x5,"../../lessons/diagramme/en/l04-java-fehler-start.visustruct":b5,"../../lessons/diagramme/en/l04-java-steckbrief-loesung.visustruct":v5,"../../lessons/diagramme/en/l04-rechnen.visustruct":y5,"../../lessons/diagramme/en/l04-reihenfolge-loesung.visustruct":w5,"../../lessons/diagramme/en/l04-reihenfolge-start.visustruct":z5,"../../lessons/diagramme/en/l04-tauschen-loesung.visustruct":I5,"../../lessons/diagramme/en/l04-tauschen-start.visustruct":k5,"../../lessons/diagramme/en/l04-tauschen.visustruct":S5,"../../lessons/diagramme/en/l05-datentypen.visustruct":_5,"../../lessons/diagramme/en/l05-division.visustruct":T5,"../../lessons/diagramme/en/l05-einkauf-loesung.visustruct":O5,"../../lessons/diagramme/en/l05-java-fehler-loesung.visustruct":A5,"../../lessons/diagramme/en/l05-java-fehler-start.visustruct":P5,"../../lessons/diagramme/en/l05-java-kino-loesung.visustruct":j5,"../../lessons/diagramme/en/l05-rechteck-loesung.visustruct":C5,"../../lessons/diagramme/en/l05-sekunden-loesung.visustruct":B5,"../../lessons/diagramme/en/l05-sekunden-start.visustruct":D5,"../../lessons/diagramme/en/l06-begruessung-loesung.visustruct":Z5,"../../lessons/diagramme/en/l06-eva.visustruct":M5,"../../lessons/diagramme/en/l06-java-fehler-loesung.visustruct":L5,"../../lessons/diagramme/en/l06-java-fehler-start.visustruct":W5,"../../lessons/diagramme/en/l06-java-tage-loesung.visustruct":E5,"../../lessons/diagramme/en/l06-mittelwert-loesung.visustruct":N5,"../../lessons/diagramme/en/l06-rechner-loesung.visustruct":F5,"../../lessons/diagramme/en/l07-alter-pruefen.visustruct":J5,"../../lessons/diagramme/en/l07-betrag-loesung.visustruct":R5,"../../lessons/diagramme/en/l07-gerade-loesung.visustruct":G5,"../../lessons/diagramme/en/l07-java-fehler-loesung.visustruct":H5,"../../lessons/diagramme/en/l07-java-fehler-start.visustruct":V5,"../../lessons/diagramme/en/l07-java-pizza-loesung.visustruct":Q5,"../../lessons/diagramme/en/l07-java-pizza-start.visustruct":q5,"../../lessons/diagramme/en/l07-maximum-loesung.visustruct":U5,"../../lessons/diagramme/en/l07-rabatt.visustruct":$5,"../../lessons/diagramme/en/l08-gueltig-loesung.visustruct":Y5,"../../lessons/diagramme/en/l08-java-bestanden-loesung.visustruct":X5,"../../lessons/diagramme/en/l08-java-fehler-loesung.visustruct":K5,"../../lessons/diagramme/en/l08-java-fehler-start.visustruct":e6,"../../lessons/diagramme/en/l08-jugendticket.visustruct":t6,"../../lessons/diagramme/en/l08-note.visustruct":n6,"../../lessons/diagramme/en/l08-schaltjahr-loesung.visustruct":i6,"../../lessons/diagramme/en/l08-wochenende-loesung.visustruct":a6,"../../lessons/diagramme/en/l09-ampel.visustruct":s6,"../../lessons/diagramme/en/l09-automat.visustruct":r6,"../../lessons/diagramme/en/l09-java-fehler-loesung.visustruct":o6,"../../lessons/diagramme/en/l09-java-fehler-start.visustruct":l6,"../../lessons/diagramme/en/l09-java-schule-loesung.visustruct":u6,"../../lessons/diagramme/en/l09-note-loesung.visustruct":m6,"../../lessons/diagramme/en/l09-rechner-loesung.visustruct":c6,"../../lessons/diagramme/en/l09-verschachtelt.visustruct":d6,"../../lessons/diagramme/en/l1-grundbausteine.visustruct":h6,"../../lessons/diagramme/en/l1-sequenz.visustruct":g6,"../../lessons/diagramme/en/l1-tee.visustruct":p6,"../../lessons/diagramme/en/l1-verzweigung.visustruct":f6,"../../lessons/diagramme/en/l1-wiederholung.visustruct":x6,"../../lessons/diagramme/en/l10-bis-n-loesung.visustruct":b6,"../../lessons/diagramme/en/l10-countdown.visustruct":v6,"../../lessons/diagramme/en/l10-endlos.visustruct":y6,"../../lessons/diagramme/en/l10-fakultaet.visustruct":w6,"../../lessons/diagramme/en/l10-java-fehler-loesung.visustruct":z6,"../../lessons/diagramme/en/l10-java-fehler-start.visustruct":I6,"../../lessons/diagramme/en/l10-java-wuerfel-loesung.visustruct":k6,"../../lessons/diagramme/en/l10-verdoppeln-loesung.visustruct":S6,"../../lessons/diagramme/en/l11-eingabe-pruefen.visustruct":_6,"../../lessons/diagramme/en/l11-einmal.visustruct":T6,"../../lessons/diagramme/en/l11-java-fehler-loesung.visustruct":O6,"../../lessons/diagramme/en/l11-java-fehler-start.visustruct":A6,"../../lessons/diagramme/en/l11-java-gerade-loesung.visustruct":P6,"../../lessons/diagramme/en/l11-note-loesung.visustruct":j6,"../../lessons/diagramme/en/l11-summe-loesung.visustruct":C6,"../../lessons/diagramme/en/l12-countdown-loesung.visustruct":B6,"../../lessons/diagramme/en/l12-einmaleins-loesung.visustruct":D6,"../../lessons/diagramme/en/l12-eins-bis-fuenf.visustruct":Z6,"../../lessons/diagramme/en/l12-java-fehler-loesung.visustruct":M6,"../../lessons/diagramme/en/l12-java-fehler-start.visustruct":L6,"../../lessons/diagramme/en/l12-java-verdoppeln-loesung.visustruct":W6,"../../lessons/diagramme/en/l12-summe.visustruct":E6,"../../lessons/diagramme/en/l13-dreieck.visustruct":N6,"../../lessons/diagramme/en/l13-gerade-eingaben-loesung.visustruct":F6,"../../lessons/diagramme/en/l13-gerade-zaehlen.visustruct":J6,"../../lessons/diagramme/en/l13-java-fehler-loesung.visustruct":R6,"../../lessons/diagramme/en/l13-java-fehler-start.visustruct":G6,"../../lessons/diagramme/en/l13-java-quadrate-loesung.visustruct":H6,"../../lessons/diagramme/en/l13-rechteck-loesung.visustruct":V6,"../../lessons/diagramme/en/l14-array-durchlaufen.visustruct":Q6,"../../lessons/diagramme/en/l14-erster-letzter-loesung.visustruct":q6,"../../lessons/diagramme/en/l14-java-fehler-loesung.visustruct":U6,"../../lessons/diagramme/en/l14-java-fehler-start.visustruct":$6,"../../lessons/diagramme/en/l14-java-treppe-loesung.visustruct":Y6,"../../lessons/diagramme/en/l14-namen-eingeben.visustruct":X6,"../../lessons/diagramme/en/l14-rueckwaerts-loesung.visustruct":K6,"../../lessons/diagramme/en/l14-summe-max-loesung.visustruct":ez,"../../lessons/diagramme/en/l14-summe-maximum.visustruct":tz,"../../lessons/diagramme/en/l15-bis-null-loesung.visustruct":nz,"../../lessons/diagramme/en/l15-endlos-aussprung.visustruct":iz,"../../lessons/diagramme/en/l15-flaeche-loesung.visustruct":az,"../../lessons/diagramme/en/l15-flaeche-unterprogramm-loesung.visustruct":sz,"../../lessons/diagramme/en/l15-hauptprogramm.visustruct":rz,"../../lessons/diagramme/en/l15-java-fehler-loesung.visustruct":oz,"../../lessons/diagramme/en/l15-java-fehler-start.visustruct":lz,"../../lessons/diagramme/en/l15-java-noten-loesung.visustruct":uz,"../../lessons/diagramme/en/l15-quadrat-haupt.visustruct":mz,"../../lessons/diagramme/en/l15-quadrat.visustruct":cz,"../../lessons/diagramme/en/l15-titel-loesung.visustruct":dz,"../../lessons/diagramme/en/l15-unterprogramm.visustruct":hz,"../../lessons/diagramme/en/l15-zeige-summe-haupt.visustruct":gz,"../../lessons/diagramme/en/l15-zeige-summe.visustruct":pz,"../../lessons/diagramme/en/l16-countdown-loesung.visustruct":fz,"../../lessons/diagramme/en/l16-countdown-start.visustruct":xz,"../../lessons/diagramme/en/l16-java-fehler-loesung.visustruct":bz,"../../lessons/diagramme/en/l16-java-fehler-start.visustruct":vz,"../../lessons/diagramme/en/l16-java-punkte-loesung.visustruct":yz,"../../lessons/diagramme/en/l16-schreibtisch.visustruct":wz,"../../lessons/diagramme/en/l16-summe-loesung.visustruct":zz,"../../lessons/diagramme/en/l16-summe-start.visustruct":Iz,"../../lessons/diagramme/en/l17-beispiel.visustruct":kz,"../../lessons/diagramme/en/l17-fakultaet-loesung.visustruct":Sz,"../../lessons/diagramme/en/l17-java-brief-loesung.visustruct":_z,"../../lessons/diagramme/en/l17-java-brief-start.visustruct":Tz,"../../lessons/diagramme/en/l17-java-fehler-loesung.visustruct":Oz,"../../lessons/diagramme/en/l17-java-fehler-start.visustruct":Az,"../../lessons/diagramme/en/l17-java-passwort-loesung.visustruct":Pz,"../../lessons/diagramme/en/l17-ticket-loesung.visustruct":jz,"../../lessons/diagramme/en/l18-beispiel.visustruct":Cz,"../../lessons/diagramme/en/l18-java-fehler-loesung.visustruct":Bz,"../../lessons/diagramme/en/l18-java-fehler-start.visustruct":Dz,"../../lessons/diagramme/en/l18-java-kasse-loesung.visustruct":Zz,"../../lessons/diagramme/en/l18-js-loesung.visustruct":Mz,"../../lessons/diagramme/en/l18-python-loesung.visustruct":Lz,"../../lessons/diagramme/en/l19-java-fehler-loesung.visustruct":Wz,"../../lessons/diagramme/en/l19-java-fehler-start.visustruct":Ez,"../../lessons/diagramme/en/l19-java-zaehlen-loesung.visustruct":Nz,"../../lessons/diagramme/en/l2-ausgabe.visustruct":Fz,"../../lessons/diagramme/en/l2-hallo-loesung.visustruct":Jz,"../../lessons/diagramme/en/l2-zwei-zeilen-loesung.visustruct":Rz,"../../lessons/diagramme/en/l23-java-ergaenzen-loesung.visustruct":Gz,"../../lessons/diagramme/en/l23-java-ergaenzen-start.visustruct":Hz,"../../lessons/diagramme/en/l23-java-nummern-loesung.visustruct":Vz,"../../lessons/diagramme/en/l23-java-nummern-start.visustruct":Qz,"../../lessons/diagramme/en/l24-java-fuchs-loesung.visustruct":qz,"../../lessons/diagramme/en/l24-java-fuchs-start.visustruct":Uz,"../../lessons/diagramme/en/l24-java-laengster-loesung.visustruct":$z,"../../lessons/diagramme/en/l24-java-laengster-start.visustruct":Yz,"../../lessons/diagramme/en/l25-java-beste-loesung.visustruct":Xz,"../../lessons/diagramme/en/l25-java-beste-start.visustruct":Kz,"../../lessons/diagramme/en/l25-java-schnitt-loesung.visustruct":e7,"../../lessons/diagramme/en/l25-java-schnitt-start.visustruct":t7,"../../lessons/diagramme/en/l26-java-namen-loesung.visustruct":n7,"../../lessons/diagramme/en/l26-java-namen-start.visustruct":i7,"../../lessons/diagramme/en/l26-java-schreiben-loesung.visustruct":a7,"../../lessons/diagramme/en/l26-java-schreiben-start.visustruct":s7,"../../lessons/diagramme/en/l27-java-json-loesung.visustruct":r7,"../../lessons/diagramme/en/l27-java-json-start.visustruct":o7,"../../lessons/diagramme/en/l27-java-saetze-loesung.visustruct":l7,"../../lessons/diagramme/en/l27-java-saetze-start.visustruct":u7,"../../lessons/diagramme/en/sim-kino-loesung.visustruct":m7,"../../lessons/diagramme/en/sim-kino-start.visustruct":c7,"../../lessons/diagramme/en/sim-tausch-loesung.visustruct":d7,"../../lessons/diagramme/en/sim-tausch-start.visustruct":h7,"../../lessons/diagramme/en/sim-tausch.visustruct":g7,"../../lessons/diagramme/en/ss-absteigend-loesung.visustruct":p7,"../../lessons/diagramme/en/ss-absteigend-start.visustruct":f7,"../../lessons/diagramme/en/ss-binaere-suche.visustruct":x7,"../../lessons/diagramme/en/ss-bubblesort.visustruct":b7,"../../lessons/diagramme/en/ss-karte-suchen-loesung.visustruct":v7,"../../lessons/diagramme/en/ss-lineare-suche.visustruct":y7,"../../lessons/diagramme/en/uebergabe-bonus-loesung.visustruct":w7,"../../lessons/diagramme/en/uebergabe-bonus-start.visustruct":z7,"../../lessons/diagramme/en/uebergabe-bonus-unterprogramm-loesung.visustruct":I7,"../../lessons/diagramme/en/uebergabe-haupt.visustruct":k7,"../../lessons/diagramme/en/uebergabe-leeren.visustruct":S7,"../../lessons/diagramme/en/uebergabe-verdopple.visustruct":_7,"../../lessons/diagramme/en/vb-abstand-anzeigen-loesung.visustruct":T7,"../../lessons/diagramme/en/vb-abstand-halten-loesung.visustruct":O7,"../../lessons/diagramme/en/vb-alarmanlage-loesung.visustruct":A7,"../../lessons/diagramme/en/vb-ampel-loesung.visustruct":P7,"../../lessons/diagramme/en/vb-ausgang-loesung.visustruct":j7,"../../lessons/diagramme/en/vb-begruessung-loesung.visustruct":C7,"../../lessons/diagramme/en/vb-binaer-zaehlen-loesung.visustruct":B7,"../../lessons/diagramme/en/vb-bis-rot-loesung.visustruct":D7,"../../lessons/diagramme/en/vb-bis-wand-loesung.visustruct":Z7,"../../lessons/diagramme/en/vb-bis-ziel-loesung.visustruct":M7,"../../lessons/diagramme/en/vb-buchstaben-loesung.visustruct":L7,"../../lessons/diagramme/en/vb-drei-lichter-loesung.visustruct":W7,"../../lessons/diagramme/en/vb-dreieck-loesung.visustruct":E7,"../../lessons/diagramme/en/vb-einparken-loesung.visustruct":N7,"../../lessons/diagramme/en/vb-farben-loesung.visustruct":F7,"../../lessons/diagramme/en/vb-farbweiche-loesung.visustruct":J7,"../../lessons/diagramme/en/vb-gas-bis-wand-loesung.visustruct":R7,"../../lessons/diagramme/en/vb-gerade-loesung.visustruct":G7,"../../lessons/diagramme/en/vb-hindernis-loesung.visustruct":H7,"../../lessons/diagramme/en/vb-java-akku-loesung.visustruct":V7,"../../lessons/diagramme/en/vb-java-blau-gruen-loesung.visustruct":Q7,"../../lessons/diagramme/en/vb-java-blinken-loesung.visustruct":q7,"../../lessons/diagramme/en/vb-java-countdown-loesung.visustruct":U7,"../../lessons/diagramme/en/vb-java-hoeher-loesung.visustruct":$7,"../../lessons/diagramme/en/vb-java-joystick-loesung.visustruct":Y7,"../../lessons/diagramme/en/vb-java-laermampel-loesung.visustruct":X7,"../../lessons/diagramme/en/vb-java-lauflicht-loesung.visustruct":K7,"../../lessons/diagramme/en/vb-java-linienfolger-loesung.visustruct":eI,"../../lessons/diagramme/en/vb-java-nachtlicht-ton-loesung.visustruct":tI,"../../lessons/diagramme/en/vb-java-rand-loesung.visustruct":nI,"../../lessons/diagramme/en/vb-java-rechteck-loesung.visustruct":iI,"../../lessons/diagramme/en/vb-java-textlaenge-loesung.visustruct":aI,"../../lessons/diagramme/en/vb-java-wand-piep-loesung.visustruct":sI,"../../lessons/diagramme/en/vb-java-wasserwaage-loesung.visustruct":rI,"../../lessons/diagramme/en/vb-klatschen-loesung.visustruct":oI,"../../lessons/diagramme/en/vb-knight-rider-loesung.visustruct":lI,"../../lessons/diagramme/en/vb-labyrinth-loesung.visustruct":uI,"../../lessons/diagramme/en/vb-linienfolger-stopp-loesung.visustruct":mI,"../../lessons/diagramme/en/vb-linienmuster-loesung.visustruct":cI,"../../lessons/diagramme/en/vb-melodie-loesung.visustruct":dI,"../../lessons/diagramme/en/vb-morsen-loesung.visustruct":hI,"../../lessons/diagramme/en/vb-nachtlicht-loesung.visustruct":gI,"../../lessons/diagramme/en/vb-nachtwaechter-loesung.visustruct":pI,"../../lessons/diagramme/en/vb-ohne-noten-loesung.visustruct":fI,"../../lessons/diagramme/en/vb-ohne-quadratzahl-loesung.visustruct":xI,"../../lessons/diagramme/en/vb-ohne-quadratzahl-unterprogramm-loesung.visustruct":bI,"../../lessons/diagramme/en/vb-ohne-rueckwaerts-loesung.visustruct":vI,"../../lessons/diagramme/en/vb-ohne-strecke-loesung.visustruct":yI,"../../lessons/diagramme/en/vb-ohne-summe-loesung.visustruct":wI,"../../lessons/diagramme/en/vb-quadrat-loesung.visustruct":zI,"../../lessons/diagramme/en/vb-quadrat-methode-loesung.visustruct":II,"../../lessons/diagramme/en/vb-quadrat-schleife-loesung.visustruct":kI,"../../lessons/diagramme/en/vb-quadrat-unterprogramm-loesung.visustruct":SI,"../../lessons/diagramme/en/vb-quadrat-verschachtelt-loesung.visustruct":_I,"../../lessons/diagramme/en/vb-rand-loesung.visustruct":TI,"../../lessons/diagramme/en/vb-schraeglage-loesung.visustruct":OI,"../../lessons/diagramme/en/vb-slalom-loesung.visustruct":AI,"../../lessons/diagramme/en/vb-spirale-loesung.visustruct":PI,"../../lessons/diagramme/en/vb-start-a-loesung.visustruct":jI,"../../lessons/diagramme/en/vb-tonleiter-loesung.visustruct":CI,"../../lessons/diagramme/en/vb-treppe-loesung.visustruct":BI,"../../lessons/diagramme/en/vb-tunnel-loesung.visustruct":DI,"../../lessons/diagramme/en/vb-variable-seite-loesung.visustruct":ZI,"../../lessons/diagramme/en/vb-vier-quadrate-loesung.visustruct":MI,"../../lessons/diagramme/en/vb-wald-loesung.visustruct":LI,"../../lessons/diagramme/en/vb-wand-vorn-loesung.visustruct":WI,"../../lessons/diagramme/en/vb-zwei-sekunden-loesung.visustruct":EI,"../../lessons/diagramme/en/zk-initialen-loesung.visustruct":NI,"../../lessons/diagramme/en/zk-mehr.visustruct":FI,"../../lessons/diagramme/en/zk-rueckwaerts-loesung.visustruct":JI,"../../lessons/diagramme/en/zk-split.visustruct":RI,"../../lessons/diagramme/en/zk-woerter-loesung.visustruct":GI,"../../lessons/diagramme/en/zk-zaehlen.visustruct":HI,"../../lessons/diagramme/en/zk-zeichen.visustruct":VI,"../../lessons/diagramme/kino-einmaleins-loesung.visustruct":QI,"../../lessons/diagramme/kino-frei-loesung.visustruct":qI,"../../lessons/diagramme/kino-frei-start.visustruct":UI,"../../lessons/diagramme/kino-karte-loesung.visustruct":$I,"../../lessons/diagramme/kino-karte-start.visustruct":YI,"../../lessons/diagramme/kino-saalplan.visustruct":XI,"../../lessons/diagramme/kino-verkaufen.visustruct":KI,"../../lessons/diagramme/l04-java-fehler-loesung.visustruct":e8,"../../lessons/diagramme/l04-java-fehler-start.visustruct":t8,"../../lessons/diagramme/l04-java-steckbrief-loesung.visustruct":n8,"../../lessons/diagramme/l04-rechnen.visustruct":i8,"../../lessons/diagramme/l04-reihenfolge-loesung.visustruct":a8,"../../lessons/diagramme/l04-reihenfolge-start.visustruct":s8,"../../lessons/diagramme/l04-tauschen-loesung.visustruct":r8,"../../lessons/diagramme/l04-tauschen-start.visustruct":o8,"../../lessons/diagramme/l04-tauschen.visustruct":l8,"../../lessons/diagramme/l05-datentypen.visustruct":u8,"../../lessons/diagramme/l05-division.visustruct":m8,"../../lessons/diagramme/l05-einkauf-loesung.visustruct":c8,"../../lessons/diagramme/l05-java-fehler-loesung.visustruct":d8,"../../lessons/diagramme/l05-java-fehler-start.visustruct":h8,"../../lessons/diagramme/l05-java-kino-loesung.visustruct":g8,"../../lessons/diagramme/l05-rechteck-loesung.visustruct":p8,"../../lessons/diagramme/l05-sekunden-loesung.visustruct":f8,"../../lessons/diagramme/l05-sekunden-start.visustruct":x8,"../../lessons/diagramme/l06-begruessung-loesung.visustruct":b8,"../../lessons/diagramme/l06-eva.visustruct":v8,"../../lessons/diagramme/l06-java-fehler-loesung.visustruct":y8,"../../lessons/diagramme/l06-java-fehler-start.visustruct":w8,"../../lessons/diagramme/l06-java-tage-loesung.visustruct":z8,"../../lessons/diagramme/l06-mittelwert-loesung.visustruct":I8,"../../lessons/diagramme/l06-rechner-loesung.visustruct":k8,"../../lessons/diagramme/l07-alter-pruefen.visustruct":S8,"../../lessons/diagramme/l07-betrag-loesung.visustruct":_8,"../../lessons/diagramme/l07-gerade-loesung.visustruct":T8,"../../lessons/diagramme/l07-java-fehler-loesung.visustruct":O8,"../../lessons/diagramme/l07-java-fehler-start.visustruct":A8,"../../lessons/diagramme/l07-java-pizza-loesung.visustruct":P8,"../../lessons/diagramme/l07-java-pizza-start.visustruct":j8,"../../lessons/diagramme/l07-maximum-loesung.visustruct":C8,"../../lessons/diagramme/l07-rabatt.visustruct":B8,"../../lessons/diagramme/l08-gueltig-loesung.visustruct":D8,"../../lessons/diagramme/l08-java-bestanden-loesung.visustruct":Z8,"../../lessons/diagramme/l08-java-fehler-loesung.visustruct":M8,"../../lessons/diagramme/l08-java-fehler-start.visustruct":L8,"../../lessons/diagramme/l08-jugendticket.visustruct":W8,"../../lessons/diagramme/l08-note.visustruct":E8,"../../lessons/diagramme/l08-schaltjahr-loesung.visustruct":N8,"../../lessons/diagramme/l08-wochenende-loesung.visustruct":F8,"../../lessons/diagramme/l09-ampel.visustruct":J8,"../../lessons/diagramme/l09-automat.visustruct":R8,"../../lessons/diagramme/l09-java-fehler-loesung.visustruct":G8,"../../lessons/diagramme/l09-java-fehler-start.visustruct":H8,"../../lessons/diagramme/l09-java-schule-loesung.visustruct":V8,"../../lessons/diagramme/l09-note-loesung.visustruct":Q8,"../../lessons/diagramme/l09-rechner-loesung.visustruct":q8,"../../lessons/diagramme/l09-verschachtelt.visustruct":U8,"../../lessons/diagramme/l1-grundbausteine.visustruct":$8,"../../lessons/diagramme/l1-sequenz.visustruct":Y8,"../../lessons/diagramme/l1-tee.visustruct":X8,"../../lessons/diagramme/l1-verzweigung.visustruct":K8,"../../lessons/diagramme/l1-wiederholung.visustruct":ek,"../../lessons/diagramme/l10-bis-n-loesung.visustruct":tk,"../../lessons/diagramme/l10-countdown.visustruct":nk,"../../lessons/diagramme/l10-endlos.visustruct":ik,"../../lessons/diagramme/l10-fakultaet.visustruct":ak,"../../lessons/diagramme/l10-java-fehler-loesung.visustruct":sk,"../../lessons/diagramme/l10-java-fehler-start.visustruct":rk,"../../lessons/diagramme/l10-java-wuerfel-loesung.visustruct":ok,"../../lessons/diagramme/l10-verdoppeln-loesung.visustruct":lk,"../../lessons/diagramme/l11-eingabe-pruefen.visustruct":uk,"../../lessons/diagramme/l11-einmal.visustruct":mk,"../../lessons/diagramme/l11-java-fehler-loesung.visustruct":ck,"../../lessons/diagramme/l11-java-fehler-start.visustruct":dk,"../../lessons/diagramme/l11-java-gerade-loesung.visustruct":hk,"../../lessons/diagramme/l11-note-loesung.visustruct":gk,"../../lessons/diagramme/l11-summe-loesung.visustruct":pk,"../../lessons/diagramme/l12-countdown-loesung.visustruct":fk,"../../lessons/diagramme/l12-einmaleins-loesung.visustruct":xk,"../../lessons/diagramme/l12-eins-bis-fuenf.visustruct":bk,"../../lessons/diagramme/l12-java-fehler-loesung.visustruct":vk,"../../lessons/diagramme/l12-java-fehler-start.visustruct":yk,"../../lessons/diagramme/l12-java-verdoppeln-loesung.visustruct":wk,"../../lessons/diagramme/l12-summe.visustruct":zk,"../../lessons/diagramme/l13-dreieck.visustruct":Ik,"../../lessons/diagramme/l13-gerade-eingaben-loesung.visustruct":kk,"../../lessons/diagramme/l13-gerade-zaehlen.visustruct":Sk,"../../lessons/diagramme/l13-java-fehler-loesung.visustruct":_k,"../../lessons/diagramme/l13-java-fehler-start.visustruct":Tk,"../../lessons/diagramme/l13-java-quadrate-loesung.visustruct":Ok,"../../lessons/diagramme/l13-rechteck-loesung.visustruct":Ak,"../../lessons/diagramme/l14-array-durchlaufen.visustruct":Pk,"../../lessons/diagramme/l14-erster-letzter-loesung.visustruct":jk,"../../lessons/diagramme/l14-java-fehler-loesung.visustruct":Ck,"../../lessons/diagramme/l14-java-fehler-start.visustruct":Bk,"../../lessons/diagramme/l14-java-treppe-loesung.visustruct":Dk,"../../lessons/diagramme/l14-namen-eingeben.visustruct":Zk,"../../lessons/diagramme/l14-rueckwaerts-loesung.visustruct":Mk,"../../lessons/diagramme/l14-summe-max-loesung.visustruct":Lk,"../../lessons/diagramme/l14-summe-maximum.visustruct":Wk,"../../lessons/diagramme/l15-bis-null-loesung.visustruct":Ek,"../../lessons/diagramme/l15-endlos-aussprung.visustruct":Nk,"../../lessons/diagramme/l15-flaeche-loesung.visustruct":Fk,"../../lessons/diagramme/l15-flaeche-unterprogramm-loesung.visustruct":Jk,"../../lessons/diagramme/l15-hauptprogramm.visustruct":Rk,"../../lessons/diagramme/l15-java-fehler-loesung.visustruct":Gk,"../../lessons/diagramme/l15-java-fehler-start.visustruct":Hk,"../../lessons/diagramme/l15-java-noten-loesung.visustruct":Vk,"../../lessons/diagramme/l15-quadrat-haupt.visustruct":Qk,"../../lessons/diagramme/l15-quadrat.visustruct":qk,"../../lessons/diagramme/l15-titel-loesung.visustruct":Uk,"../../lessons/diagramme/l15-unterprogramm.visustruct":$k,"../../lessons/diagramme/l15-zeige-summe-haupt.visustruct":Yk,"../../lessons/diagramme/l15-zeige-summe.visustruct":Xk,"../../lessons/diagramme/l16-countdown-loesung.visustruct":Kk,"../../lessons/diagramme/l16-countdown-start.visustruct":eS,"../../lessons/diagramme/l16-java-fehler-loesung.visustruct":tS,"../../lessons/diagramme/l16-java-fehler-start.visustruct":nS,"../../lessons/diagramme/l16-java-punkte-loesung.visustruct":iS,"../../lessons/diagramme/l16-schreibtisch.visustruct":aS,"../../lessons/diagramme/l16-summe-loesung.visustruct":sS,"../../lessons/diagramme/l16-summe-start.visustruct":rS,"../../lessons/diagramme/l17-beispiel.visustruct":oS,"../../lessons/diagramme/l17-fakultaet-loesung.visustruct":lS,"../../lessons/diagramme/l17-java-brief-loesung.visustruct":uS,"../../lessons/diagramme/l17-java-brief-start.visustruct":mS,"../../lessons/diagramme/l17-java-fehler-loesung.visustruct":cS,"../../lessons/diagramme/l17-java-fehler-start.visustruct":dS,"../../lessons/diagramme/l17-java-passwort-loesung.visustruct":hS,"../../lessons/diagramme/l17-ticket-loesung.visustruct":gS,"../../lessons/diagramme/l18-beispiel.visustruct":pS,"../../lessons/diagramme/l18-java-fehler-loesung.visustruct":fS,"../../lessons/diagramme/l18-java-fehler-start.visustruct":xS,"../../lessons/diagramme/l18-java-kasse-loesung.visustruct":bS,"../../lessons/diagramme/l18-js-loesung.visustruct":vS,"../../lessons/diagramme/l18-python-loesung.visustruct":yS,"../../lessons/diagramme/l19-java-fehler-loesung.visustruct":wS,"../../lessons/diagramme/l19-java-fehler-start.visustruct":zS,"../../lessons/diagramme/l19-java-zaehlen-loesung.visustruct":IS,"../../lessons/diagramme/l2-ausgabe.visustruct":kS,"../../lessons/diagramme/l2-hallo-loesung.visustruct":SS,"../../lessons/diagramme/l2-zwei-zeilen-loesung.visustruct":_S,"../../lessons/diagramme/l20-countdown-loesung.visustruct":TS,"../../lessons/diagramme/l23-java-ergaenzen-loesung.visustruct":OS,"../../lessons/diagramme/l23-java-ergaenzen-start.visustruct":AS,"../../lessons/diagramme/l23-java-nummern-loesung.visustruct":PS,"../../lessons/diagramme/l23-java-nummern-start.visustruct":jS,"../../lessons/diagramme/l24-java-fuchs-loesung.visustruct":CS,"../../lessons/diagramme/l24-java-fuchs-start.visustruct":BS,"../../lessons/diagramme/l24-java-laengster-loesung.visustruct":DS,"../../lessons/diagramme/l24-java-laengster-start.visustruct":ZS,"../../lessons/diagramme/l25-java-beste-loesung.visustruct":MS,"../../lessons/diagramme/l25-java-beste-start.visustruct":LS,"../../lessons/diagramme/l25-java-schnitt-loesung.visustruct":WS,"../../lessons/diagramme/l25-java-schnitt-start.visustruct":ES,"../../lessons/diagramme/l26-java-namen-loesung.visustruct":NS,"../../lessons/diagramme/l26-java-namen-start.visustruct":FS,"../../lessons/diagramme/l26-java-schreiben-loesung.visustruct":JS,"../../lessons/diagramme/l26-java-schreiben-start.visustruct":RS,"../../lessons/diagramme/l27-java-json-loesung.visustruct":GS,"../../lessons/diagramme/l27-java-json-start.visustruct":HS,"../../lessons/diagramme/l27-java-saetze-loesung.visustruct":VS,"../../lessons/diagramme/l27-java-saetze-start.visustruct":QS,"../../lessons/diagramme/pt/aufgabe-alter-haupt-loesung.visustruct":qS,"../../lessons/diagramme/pt/aufgabe-alter-unterprogramm-loesung.visustruct":US,"../../lessons/diagramme/pt/aufgabe-ballwurf-loesung.visustruct":$S,"../../lessons/diagramme/pt/aufgabe-ballwurf-start.visustruct":YS,"../../lessons/diagramme/pt/aufgabe-bestenliste-loesung.visustruct":XS,"../../lessons/diagramme/pt/aufgabe-binaer-loesung.visustruct":KS,"../../lessons/diagramme/pt/aufgabe-caesar-array-loesung.visustruct":e_,"../../lessons/diagramme/pt/aufgabe-caesar-array-start.visustruct":t_,"../../lessons/diagramme/pt/aufgabe-caesar-ascii-loesung.visustruct":n_,"../../lessons/diagramme/pt/aufgabe-caesar-entschluesseln-loesung.visustruct":i_,"../../lessons/diagramme/pt/aufgabe-collatz-loesung.visustruct":a_,"../../lessons/diagramme/pt/aufgabe-durchschnitt-loesung.visustruct":s_,"../../lessons/diagramme/pt/aufgabe-fibonacci-loesung.visustruct":r_,"../../lessons/diagramme/pt/aufgabe-gerade-loesung.visustruct":o_,"../../lessons/diagramme/pt/aufgabe-mehrwertsteuer-loesung.visustruct":l_,"../../lessons/diagramme/pt/aufgabe-pin-java-loesung.visustruct":u_,"../../lessons/diagramme/pt/aufgabe-pin-loesung.visustruct":m_,"../../lessons/diagramme/pt/aufgabe-rechner-loesung.visustruct":c_,"../../lessons/diagramme/pt/aufgabe-schiffe-loesung.visustruct":d_,"../../lessons/diagramme/pt/aufgabe-schiffe-start.visustruct":h_,"../../lessons/diagramme/pt/aufgabe-speisekarte-loesung.visustruct":g_,"../../lessons/diagramme/pt/aufgabe-summe-loesung.visustruct":p_,"../../lessons/diagramme/pt/aufgabe-tafeldienst-loesung.visustruct":f_,"../../lessons/diagramme/pt/aufgabe-verdoppeln-loesung.visustruct":x_,"../../lessons/diagramme/pt/aufgabe-verleih-java-loesung.visustruct":b_,"../../lessons/diagramme/pt/aufgabe-verleih-loesung.visustruct":v_,"../../lessons/diagramme/pt/aufgabe-vokabeln-loesung.visustruct":y_,"../../lessons/diagramme/pt/aufgabe-vokabeln-start.visustruct":w_,"../../lessons/diagramme/pt/aufgabe-volljaehrig-loesung.visustruct":z_,"../../lessons/diagramme/pt/dt-buffered.visustruct":I_,"../../lessons/diagramme/pt/dt-csv.visustruct":k_,"../../lessons/diagramme/pt/dt-json.visustruct":S_,"../../lessons/diagramme/pt/dt-lesen.visustruct":__,"../../lessons/diagramme/pt/kino-einmaleins-loesung.visustruct":T_,"../../lessons/diagramme/pt/kino-frei-loesung.visustruct":O_,"../../lessons/diagramme/pt/kino-frei-start.visustruct":A_,"../../lessons/diagramme/pt/kino-karte-loesung.visustruct":P_,"../../lessons/diagramme/pt/kino-karte-start.visustruct":j_,"../../lessons/diagramme/pt/kino-saalplan.visustruct":C_,"../../lessons/diagramme/pt/kino-verkaufen.visustruct":B_,"../../lessons/diagramme/pt/l04-java-fehler-loesung.visustruct":D_,"../../lessons/diagramme/pt/l04-java-fehler-start.visustruct":Z_,"../../lessons/diagramme/pt/l04-java-steckbrief-loesung.visustruct":M_,"../../lessons/diagramme/pt/l04-rechnen.visustruct":L_,"../../lessons/diagramme/pt/l04-reihenfolge-loesung.visustruct":W_,"../../lessons/diagramme/pt/l04-reihenfolge-start.visustruct":E_,"../../lessons/diagramme/pt/l04-tauschen-loesung.visustruct":N_,"../../lessons/diagramme/pt/l04-tauschen-start.visustruct":F_,"../../lessons/diagramme/pt/l04-tauschen.visustruct":J_,"../../lessons/diagramme/pt/l05-datentypen.visustruct":R_,"../../lessons/diagramme/pt/l05-division.visustruct":G_,"../../lessons/diagramme/pt/l05-einkauf-loesung.visustruct":H_,"../../lessons/diagramme/pt/l05-java-fehler-loesung.visustruct":V_,"../../lessons/diagramme/pt/l05-java-fehler-start.visustruct":Q_,"../../lessons/diagramme/pt/l05-java-kino-loesung.visustruct":q_,"../../lessons/diagramme/pt/l05-rechteck-loesung.visustruct":U_,"../../lessons/diagramme/pt/l05-sekunden-loesung.visustruct":$_,"../../lessons/diagramme/pt/l05-sekunden-start.visustruct":Y_,"../../lessons/diagramme/pt/l06-begruessung-loesung.visustruct":X_,"../../lessons/diagramme/pt/l06-eva.visustruct":K_,"../../lessons/diagramme/pt/l06-java-fehler-loesung.visustruct":eT,"../../lessons/diagramme/pt/l06-java-fehler-start.visustruct":tT,"../../lessons/diagramme/pt/l06-java-tage-loesung.visustruct":nT,"../../lessons/diagramme/pt/l06-mittelwert-loesung.visustruct":iT,"../../lessons/diagramme/pt/l06-rechner-loesung.visustruct":aT,"../../lessons/diagramme/pt/l07-alter-pruefen.visustruct":sT,"../../lessons/diagramme/pt/l07-betrag-loesung.visustruct":rT,"../../lessons/diagramme/pt/l07-gerade-loesung.visustruct":oT,"../../lessons/diagramme/pt/l07-java-fehler-loesung.visustruct":lT,"../../lessons/diagramme/pt/l07-java-fehler-start.visustruct":uT,"../../lessons/diagramme/pt/l07-java-pizza-loesung.visustruct":mT,"../../lessons/diagramme/pt/l07-java-pizza-start.visustruct":cT,"../../lessons/diagramme/pt/l07-maximum-loesung.visustruct":dT,"../../lessons/diagramme/pt/l07-rabatt.visustruct":hT,"../../lessons/diagramme/pt/l08-gueltig-loesung.visustruct":gT,"../../lessons/diagramme/pt/l08-java-bestanden-loesung.visustruct":pT,"../../lessons/diagramme/pt/l08-java-fehler-loesung.visustruct":fT,"../../lessons/diagramme/pt/l08-java-fehler-start.visustruct":xT,"../../lessons/diagramme/pt/l08-jugendticket.visustruct":bT,"../../lessons/diagramme/pt/l08-note.visustruct":vT,"../../lessons/diagramme/pt/l08-schaltjahr-loesung.visustruct":yT,"../../lessons/diagramme/pt/l08-wochenende-loesung.visustruct":wT,"../../lessons/diagramme/pt/l09-ampel.visustruct":zT,"../../lessons/diagramme/pt/l09-automat.visustruct":IT,"../../lessons/diagramme/pt/l09-java-fehler-loesung.visustruct":kT,"../../lessons/diagramme/pt/l09-java-fehler-start.visustruct":ST,"../../lessons/diagramme/pt/l09-java-schule-loesung.visustruct":_T,"../../lessons/diagramme/pt/l09-note-loesung.visustruct":TT,"../../lessons/diagramme/pt/l09-rechner-loesung.visustruct":OT,"../../lessons/diagramme/pt/l09-verschachtelt.visustruct":AT,"../../lessons/diagramme/pt/l1-grundbausteine.visustruct":PT,"../../lessons/diagramme/pt/l1-sequenz.visustruct":jT,"../../lessons/diagramme/pt/l1-tee.visustruct":CT,"../../lessons/diagramme/pt/l1-verzweigung.visustruct":BT,"../../lessons/diagramme/pt/l1-wiederholung.visustruct":DT,"../../lessons/diagramme/pt/l10-bis-n-loesung.visustruct":ZT,"../../lessons/diagramme/pt/l10-countdown.visustruct":MT,"../../lessons/diagramme/pt/l10-endlos.visustruct":LT,"../../lessons/diagramme/pt/l10-fakultaet.visustruct":WT,"../../lessons/diagramme/pt/l10-java-fehler-loesung.visustruct":ET,"../../lessons/diagramme/pt/l10-java-fehler-start.visustruct":NT,"../../lessons/diagramme/pt/l10-java-wuerfel-loesung.visustruct":FT,"../../lessons/diagramme/pt/l10-verdoppeln-loesung.visustruct":JT,"../../lessons/diagramme/pt/l11-eingabe-pruefen.visustruct":RT,"../../lessons/diagramme/pt/l11-einmal.visustruct":GT,"../../lessons/diagramme/pt/l11-java-fehler-loesung.visustruct":HT,"../../lessons/diagramme/pt/l11-java-fehler-start.visustruct":VT,"../../lessons/diagramme/pt/l11-java-gerade-loesung.visustruct":QT,"../../lessons/diagramme/pt/l11-note-loesung.visustruct":qT,"../../lessons/diagramme/pt/l11-summe-loesung.visustruct":UT,"../../lessons/diagramme/pt/l12-countdown-loesung.visustruct":$T,"../../lessons/diagramme/pt/l12-einmaleins-loesung.visustruct":YT,"../../lessons/diagramme/pt/l12-eins-bis-fuenf.visustruct":XT,"../../lessons/diagramme/pt/l12-java-fehler-loesung.visustruct":KT,"../../lessons/diagramme/pt/l12-java-fehler-start.visustruct":eO,"../../lessons/diagramme/pt/l12-java-verdoppeln-loesung.visustruct":tO,"../../lessons/diagramme/pt/l12-summe.visustruct":nO,"../../lessons/diagramme/pt/l13-dreieck.visustruct":iO,"../../lessons/diagramme/pt/l13-gerade-eingaben-loesung.visustruct":aO,"../../lessons/diagramme/pt/l13-gerade-zaehlen.visustruct":sO,"../../lessons/diagramme/pt/l13-java-fehler-loesung.visustruct":rO,"../../lessons/diagramme/pt/l13-java-fehler-start.visustruct":oO,"../../lessons/diagramme/pt/l13-java-quadrate-loesung.visustruct":lO,"../../lessons/diagramme/pt/l13-rechteck-loesung.visustruct":uO,"../../lessons/diagramme/pt/l14-array-durchlaufen.visustruct":mO,"../../lessons/diagramme/pt/l14-erster-letzter-loesung.visustruct":cO,"../../lessons/diagramme/pt/l14-java-fehler-loesung.visustruct":dO,"../../lessons/diagramme/pt/l14-java-fehler-start.visustruct":hO,"../../lessons/diagramme/pt/l14-java-treppe-loesung.visustruct":gO,"../../lessons/diagramme/pt/l14-namen-eingeben.visustruct":pO,"../../lessons/diagramme/pt/l14-rueckwaerts-loesung.visustruct":fO,"../../lessons/diagramme/pt/l14-summe-max-loesung.visustruct":xO,"../../lessons/diagramme/pt/l14-summe-maximum.visustruct":bO,"../../lessons/diagramme/pt/l15-bis-null-loesung.visustruct":vO,"../../lessons/diagramme/pt/l15-endlos-aussprung.visustruct":yO,"../../lessons/diagramme/pt/l15-flaeche-loesung.visustruct":wO,"../../lessons/diagramme/pt/l15-hauptprogramm.visustruct":zO,"../../lessons/diagramme/pt/l15-java-fehler-loesung.visustruct":IO,"../../lessons/diagramme/pt/l15-java-fehler-start.visustruct":kO,"../../lessons/diagramme/pt/l15-java-noten-loesung.visustruct":SO,"../../lessons/diagramme/pt/l15-quadrat-haupt.visustruct":_O,"../../lessons/diagramme/pt/l15-quadrat.visustruct":TO,"../../lessons/diagramme/pt/l15-titel-loesung.visustruct":OO,"../../lessons/diagramme/pt/l15-unterprogramm.visustruct":AO,"../../lessons/diagramme/pt/l15-zeige-summe-haupt.visustruct":PO,"../../lessons/diagramme/pt/l15-zeige-summe.visustruct":jO,"../../lessons/diagramme/pt/l16-countdown-loesung.visustruct":CO,"../../lessons/diagramme/pt/l16-countdown-start.visustruct":BO,"../../lessons/diagramme/pt/l16-java-fehler-loesung.visustruct":DO,"../../lessons/diagramme/pt/l16-java-fehler-start.visustruct":ZO,"../../lessons/diagramme/pt/l16-java-punkte-loesung.visustruct":MO,"../../lessons/diagramme/pt/l16-schreibtisch.visustruct":LO,"../../lessons/diagramme/pt/l16-summe-loesung.visustruct":WO,"../../lessons/diagramme/pt/l16-summe-start.visustruct":EO,"../../lessons/diagramme/pt/l17-beispiel.visustruct":NO,"../../lessons/diagramme/pt/l17-fakultaet-loesung.visustruct":FO,"../../lessons/diagramme/pt/l17-java-brief-loesung.visustruct":JO,"../../lessons/diagramme/pt/l17-java-brief-start.visustruct":RO,"../../lessons/diagramme/pt/l17-java-fehler-loesung.visustruct":GO,"../../lessons/diagramme/pt/l17-java-fehler-start.visustruct":HO,"../../lessons/diagramme/pt/l17-java-passwort-loesung.visustruct":VO,"../../lessons/diagramme/pt/l17-ticket-loesung.visustruct":QO,"../../lessons/diagramme/pt/l18-beispiel.visustruct":qO,"../../lessons/diagramme/pt/l18-java-fehler-loesung.visustruct":UO,"../../lessons/diagramme/pt/l18-java-fehler-start.visustruct":$O,"../../lessons/diagramme/pt/l18-java-kasse-loesung.visustruct":YO,"../../lessons/diagramme/pt/l18-js-loesung.visustruct":XO,"../../lessons/diagramme/pt/l18-python-loesung.visustruct":KO,"../../lessons/diagramme/pt/l19-java-fehler-loesung.visustruct":eA,"../../lessons/diagramme/pt/l19-java-fehler-start.visustruct":tA,"../../lessons/diagramme/pt/l19-java-zaehlen-loesung.visustruct":nA,"../../lessons/diagramme/pt/l2-ausgabe.visustruct":iA,"../../lessons/diagramme/pt/l2-hallo-loesung.visustruct":aA,"../../lessons/diagramme/pt/l2-zwei-zeilen-loesung.visustruct":sA,"../../lessons/diagramme/pt/l23-java-ergaenzen-loesung.visustruct":rA,"../../lessons/diagramme/pt/l23-java-ergaenzen-start.visustruct":oA,"../../lessons/diagramme/pt/l23-java-nummern-loesung.visustruct":lA,"../../lessons/diagramme/pt/l23-java-nummern-start.visustruct":uA,"../../lessons/diagramme/pt/l24-java-fuchs-loesung.visustruct":mA,"../../lessons/diagramme/pt/l24-java-fuchs-start.visustruct":cA,"../../lessons/diagramme/pt/l24-java-laengster-loesung.visustruct":dA,"../../lessons/diagramme/pt/l24-java-laengster-start.visustruct":hA,"../../lessons/diagramme/pt/l25-java-beste-loesung.visustruct":gA,"../../lessons/diagramme/pt/l25-java-beste-start.visustruct":pA,"../../lessons/diagramme/pt/l25-java-schnitt-loesung.visustruct":fA,"../../lessons/diagramme/pt/l25-java-schnitt-start.visustruct":xA,"../../lessons/diagramme/pt/l26-java-namen-loesung.visustruct":bA,"../../lessons/diagramme/pt/l26-java-namen-start.visustruct":vA,"../../lessons/diagramme/pt/l26-java-schreiben-loesung.visustruct":yA,"../../lessons/diagramme/pt/l26-java-schreiben-start.visustruct":wA,"../../lessons/diagramme/pt/l27-java-json-loesung.visustruct":zA,"../../lessons/diagramme/pt/l27-java-json-start.visustruct":IA,"../../lessons/diagramme/pt/l27-java-saetze-loesung.visustruct":kA,"../../lessons/diagramme/pt/l27-java-saetze-start.visustruct":SA,"../../lessons/diagramme/pt/sim-kino-loesung.visustruct":_A,"../../lessons/diagramme/pt/sim-kino-start.visustruct":TA,"../../lessons/diagramme/pt/sim-tausch-loesung.visustruct":OA,"../../lessons/diagramme/pt/sim-tausch-start.visustruct":AA,"../../lessons/diagramme/pt/sim-tausch.visustruct":PA,"../../lessons/diagramme/pt/ss-absteigend-loesung.visustruct":jA,"../../lessons/diagramme/pt/ss-absteigend-start.visustruct":CA,"../../lessons/diagramme/pt/ss-binaere-suche.visustruct":BA,"../../lessons/diagramme/pt/ss-bubblesort.visustruct":DA,"../../lessons/diagramme/pt/ss-karte-suchen-loesung.visustruct":ZA,"../../lessons/diagramme/pt/ss-lineare-suche.visustruct":MA,"../../lessons/diagramme/pt/uebergabe-bonus-loesung.visustruct":LA,"../../lessons/diagramme/pt/uebergabe-bonus-start.visustruct":WA,"../../lessons/diagramme/pt/uebergabe-bonus-unterprogramm-loesung.visustruct":EA,"../../lessons/diagramme/pt/uebergabe-haupt.visustruct":NA,"../../lessons/diagramme/pt/uebergabe-leeren.visustruct":FA,"../../lessons/diagramme/pt/uebergabe-verdopple.visustruct":JA,"../../lessons/diagramme/pt/zk-initialen-loesung.visustruct":RA,"../../lessons/diagramme/pt/zk-mehr.visustruct":GA,"../../lessons/diagramme/pt/zk-rueckwaerts-loesung.visustruct":HA,"../../lessons/diagramme/pt/zk-split.visustruct":VA,"../../lessons/diagramme/pt/zk-woerter-loesung.visustruct":QA,"../../lessons/diagramme/pt/zk-zaehlen.visustruct":qA,"../../lessons/diagramme/pt/zk-zeichen.visustruct":UA,"../../lessons/diagramme/sim-kino-loesung.visustruct":$A,"../../lessons/diagramme/sim-kino-start.visustruct":YA,"../../lessons/diagramme/sim-tausch-loesung.visustruct":XA,"../../lessons/diagramme/sim-tausch-start.visustruct":KA,"../../lessons/diagramme/sim-tausch.visustruct":eP,"../../lessons/diagramme/ss-absteigend-loesung.visustruct":tP,"../../lessons/diagramme/ss-absteigend-start.visustruct":nP,"../../lessons/diagramme/ss-binaere-suche.visustruct":iP,"../../lessons/diagramme/ss-bubblesort.visustruct":aP,"../../lessons/diagramme/ss-karte-suchen-loesung.visustruct":sP,"../../lessons/diagramme/ss-lineare-suche.visustruct":rP,"../../lessons/diagramme/uebergabe-bonus-loesung.visustruct":oP,"../../lessons/diagramme/uebergabe-bonus-start.visustruct":lP,"../../lessons/diagramme/uebergabe-bonus-unterprogramm-loesung.visustruct":uP,"../../lessons/diagramme/uebergabe-haupt.visustruct":mP,"../../lessons/diagramme/uebergabe-leeren.visustruct":cP,"../../lessons/diagramme/uebergabe-verdopple.visustruct":dP,"../../lessons/diagramme/vb-abstand-anzeigen-loesung.visustruct":hP,"../../lessons/diagramme/vb-abstand-halten-loesung.visustruct":gP,"../../lessons/diagramme/vb-alarmanlage-loesung.visustruct":pP,"../../lessons/diagramme/vb-ampel-loesung.visustruct":fP,"../../lessons/diagramme/vb-ausgang-loesung.visustruct":xP,"../../lessons/diagramme/vb-begruessung-loesung.visustruct":bP,"../../lessons/diagramme/vb-binaer-zaehlen-loesung.visustruct":vP,"../../lessons/diagramme/vb-bis-rot-loesung.visustruct":yP,"../../lessons/diagramme/vb-bis-wand-loesung.visustruct":wP,"../../lessons/diagramme/vb-bis-ziel-loesung.visustruct":zP,"../../lessons/diagramme/vb-buchstaben-loesung.visustruct":IP,"../../lessons/diagramme/vb-drei-lichter-loesung.visustruct":kP,"../../lessons/diagramme/vb-dreieck-loesung.visustruct":SP,"../../lessons/diagramme/vb-einparken-loesung.visustruct":_P,"../../lessons/diagramme/vb-farben-loesung.visustruct":TP,"../../lessons/diagramme/vb-farbweiche-loesung.visustruct":OP,"../../lessons/diagramme/vb-gas-bis-wand-loesung.visustruct":AP,"../../lessons/diagramme/vb-gerade-loesung.visustruct":PP,"../../lessons/diagramme/vb-hindernis-loesung.visustruct":jP,"../../lessons/diagramme/vb-java-akku-loesung.visustruct":CP,"../../lessons/diagramme/vb-java-blau-gruen-loesung.visustruct":BP,"../../lessons/diagramme/vb-java-blinken-loesung.visustruct":DP,"../../lessons/diagramme/vb-java-countdown-loesung.visustruct":ZP,"../../lessons/diagramme/vb-java-hoeher-loesung.visustruct":MP,"../../lessons/diagramme/vb-java-joystick-loesung.visustruct":LP,"../../lessons/diagramme/vb-java-laermampel-loesung.visustruct":WP,"../../lessons/diagramme/vb-java-lauflicht-loesung.visustruct":EP,"../../lessons/diagramme/vb-java-linienfolger-loesung.visustruct":NP,"../../lessons/diagramme/vb-java-nachtlicht-ton-loesung.visustruct":FP,"../../lessons/diagramme/vb-java-rand-loesung.visustruct":JP,"../../lessons/diagramme/vb-java-rechteck-loesung.visustruct":RP,"../../lessons/diagramme/vb-java-textlaenge-loesung.visustruct":GP,"../../lessons/diagramme/vb-java-wand-piep-loesung.visustruct":HP,"../../lessons/diagramme/vb-java-wasserwaage-loesung.visustruct":VP,"../../lessons/diagramme/vb-klatschen-loesung.visustruct":QP,"../../lessons/diagramme/vb-knight-rider-loesung.visustruct":qP,"../../lessons/diagramme/vb-labyrinth-loesung.visustruct":UP,"../../lessons/diagramme/vb-linienfolger-stopp-loesung.visustruct":$P,"../../lessons/diagramme/vb-linienmuster-loesung.visustruct":YP,"../../lessons/diagramme/vb-melodie-loesung.visustruct":XP,"../../lessons/diagramme/vb-morsen-loesung.visustruct":KP,"../../lessons/diagramme/vb-nachtlicht-loesung.visustruct":ej,"../../lessons/diagramme/vb-nachtwaechter-loesung.visustruct":tj,"../../lessons/diagramme/vb-ohne-noten-loesung.visustruct":nj,"../../lessons/diagramme/vb-ohne-quadratzahl-loesung.visustruct":ij,"../../lessons/diagramme/vb-ohne-quadratzahl-unterprogramm-loesung.visustruct":aj,"../../lessons/diagramme/vb-ohne-rueckwaerts-loesung.visustruct":sj,"../../lessons/diagramme/vb-ohne-strecke-loesung.visustruct":rj,"../../lessons/diagramme/vb-ohne-summe-loesung.visustruct":oj,"../../lessons/diagramme/vb-quadrat-loesung.visustruct":lj,"../../lessons/diagramme/vb-quadrat-methode-loesung.visustruct":uj,"../../lessons/diagramme/vb-quadrat-schleife-loesung.visustruct":mj,"../../lessons/diagramme/vb-quadrat-unterprogramm-loesung.visustruct":cj,"../../lessons/diagramme/vb-quadrat-verschachtelt-loesung.visustruct":dj,"../../lessons/diagramme/vb-rand-loesung.visustruct":hj,"../../lessons/diagramme/vb-schraeglage-loesung.visustruct":gj,"../../lessons/diagramme/vb-slalom-loesung.visustruct":pj,"../../lessons/diagramme/vb-spirale-loesung.visustruct":fj,"../../lessons/diagramme/vb-start-a-loesung.visustruct":xj,"../../lessons/diagramme/vb-tonleiter-loesung.visustruct":bj,"../../lessons/diagramme/vb-treppe-loesung.visustruct":vj,"../../lessons/diagramme/vb-tunnel-loesung.visustruct":yj,"../../lessons/diagramme/vb-variable-seite-loesung.visustruct":wj,"../../lessons/diagramme/vb-vier-quadrate-loesung.visustruct":zj,"../../lessons/diagramme/vb-wald-loesung.visustruct":Ij,"../../lessons/diagramme/vb-wand-vorn-loesung.visustruct":kj,"../../lessons/diagramme/vb-zwei-sekunden-loesung.visustruct":Sj,"../../lessons/diagramme/zk-initialen-loesung.visustruct":_j,"../../lessons/diagramme/zk-mehr.visustruct":Tj,"../../lessons/diagramme/zk-rueckwaerts-loesung.visustruct":Oj,"../../lessons/diagramme/zk-split.visustruct":Aj,"../../lessons/diagramme/zk-woerter-loesung.visustruct":Pj,"../../lessons/diagramme/zk-zaehlen.visustruct":jj,"../../lessons/diagramme/zk-zeichen.visustruct":Cj}),YB=Object.assign({"../../lessons/welten/ausgang-1.txt":Bj,"../../lessons/welten/ausgang-2.txt":Dj,"../../lessons/welten/ecke.txt":Zj,"../../lessons/welten/farbe-1.txt":Mj,"../../lessons/welten/farbe-2.txt":Lj,"../../lessons/welten/farbe-3.txt":Wj,"../../lessons/welten/farbe-4.txt":Ej,"../../lessons/welten/hindernis-1.txt":Nj,"../../lessons/welten/hindernis-2.txt":Fj,"../../lessons/welten/labyrinth-1.txt":Jj,"../../lessons/welten/labyrinth-2.txt":Rj,"../../lessons/welten/linie-1.txt":Gj,"../../lessons/welten/linie-2.txt":Hj,"../../lessons/welten/linie-rot-1.txt":Vj,"../../lessons/welten/linie-rot-2.txt":Qj,"../../lessons/welten/parken-1.txt":qj,"../../lessons/welten/parken-2.txt":Uj,"../../lessons/welten/rand-1.txt":$j,"../../lessons/welten/rand-2.txt":Yj,"../../lessons/welten/slalom.txt":Xj,"../../lessons/welten/tunnel-1.txt":Kj,"../../lessons/welten/tunnel-2.txt":eC,"../../lessons/welten/wald-1.txt":tC,"../../lessons/welten/wald-2.txt":nC,"../../lessons/welten/wand-frei.txt":iC,"../../lessons/welten/wand-kurz.txt":aC,"../../lessons/welten/wand-lang.txt":sC,"../../lessons/welten/wand-mittel.txt":rC,"../../lessons/welten/wand-nah.txt":oC,"../../lessons/welten/zeit-1.txt":lC,"../../lessons/welten/ziel-kurz.txt":uC,"../../lessons/welten/ziel-lang.txt":mC}),XB=Object.assign({"../../lessons/bilder/aufgabe-mehrwertsteuer.svg":cC,"../../lessons/bilder/ben-shneiderman.jpg":dC,"../../lessons/bilder/caesar-ascii.svg":hC,"../../lessons/bilder/caesar-scheibe.svg":gC,"../../lessons/bilder/caesar-verschiebung.svg":pC,"../../lessons/bilder/en/aufgabe-mehrwertsteuer.svg":fC,"../../lessons/bilder/en/kino-saal.svg":xC,"../../lessons/bilder/en/kino-schleifen.svg":bC,"../../lessons/bilder/en/l01-pap.svg":vC,"../../lessons/bilder/en/l02-einfuegen.svg":yC,"../../lessons/bilder/en/l04-variable.svg":wC,"../../lessons/bilder/en/l04-zuweisung.svg":zC,"../../lessons/bilder/en/l05-tauschen.svg":IC,"../../lessons/bilder/en/l08-zahlenstrahl.svg":kC,"../../lessons/bilder/en/l10-kopfgesteuert.svg":SC,"../../lessons/bilder/en/l11-vergleich.svg":_C,"../../lessons/bilder/en/l12-for-ablauf.svg":TC,"../../lessons/bilder/en/l14-array.svg":OC,"../../lessons/bilder/en/mvc-klick.svg":AC,"../../lessons/bilder/en/ss-binaere-suche.svg":PC,"../../lessons/bilder/en/ss-bubblesort.svg":jC,"../../lessons/bilder/en/ss-lineare-suche.svg":CC,"../../lessons/bilder/en/ss-vergleiche.svg":BC,"../../lessons/bilder/en/uebergabe.svg":DC,"../../lessons/bilder/en/zk-zeichen.svg":ZC,"../../lessons/bilder/ike-nassi.jpg":MC,"../../lessons/bilder/kino-saal.svg":LC,"../../lessons/bilder/kino-schleifen.svg":WC,"../../lessons/bilder/l01-pap.svg":EC,"../../lessons/bilder/l02-einfuegen.svg":NC,"../../lessons/bilder/l04-variable.svg":FC,"../../lessons/bilder/l04-zuweisung.svg":JC,"../../lessons/bilder/l05-tauschen.svg":RC,"../../lessons/bilder/l08-zahlenstrahl.svg":GC,"../../lessons/bilder/l09-wahrheitstabelle.svg":HC,"../../lessons/bilder/l10-kopfgesteuert.svg":VC,"../../lessons/bilder/l11-vergleich.svg":QC,"../../lessons/bilder/l12-for-ablauf.svg":qC,"../../lessons/bilder/l14-array.svg":UC,"../../lessons/bilder/mvc-klick.svg":$C,"../../lessons/bilder/pt/aufgabe-mehrwertsteuer.svg":YC,"../../lessons/bilder/pt/kino-saal.svg":XC,"../../lessons/bilder/pt/kino-schleifen.svg":KC,"../../lessons/bilder/pt/l01-pap.svg":eB,"../../lessons/bilder/pt/l02-einfuegen.svg":tB,"../../lessons/bilder/pt/l04-variable.svg":nB,"../../lessons/bilder/pt/l04-zuweisung.svg":iB,"../../lessons/bilder/pt/l05-tauschen.svg":aB,"../../lessons/bilder/pt/l08-zahlenstrahl.svg":sB,"../../lessons/bilder/pt/l10-kopfgesteuert.svg":rB,"../../lessons/bilder/pt/l11-vergleich.svg":oB,"../../lessons/bilder/pt/l12-for-ablauf.svg":lB,"../../lessons/bilder/pt/l14-array.svg":uB,"../../lessons/bilder/pt/mvc-klick.svg":mB,"../../lessons/bilder/pt/schiffe-versenken.svg":cB,"../../lessons/bilder/pt/ss-binaere-suche.svg":dB,"../../lessons/bilder/pt/ss-bubblesort.svg":hB,"../../lessons/bilder/pt/ss-lineare-suche.svg":gB,"../../lessons/bilder/pt/ss-vergleiche.svg":pB,"../../lessons/bilder/pt/uebergabe.svg":fB,"../../lessons/bilder/pt/zk-zeichen.svg":xB,"../../lessons/bilder/schiffe-versenken.svg":bB,"../../lessons/bilder/ss-binaere-suche.svg":vB,"../../lessons/bilder/ss-bubblesort.svg":yB,"../../lessons/bilder/ss-lineare-suche.svg":wB,"../../lessons/bilder/ss-vergleiche.svg":zB,"../../lessons/bilder/uebergabe.svg":IB,"../../lessons/bilder/zk-zeichen.svg":kB}),Rh=i=>i.replace(/^.*\//,"");function F1(i,e,t){const n=s=>new Map(Object.entries(i).filter(([r])=>{var o;return((o=e.exec(r))==null?void 0:o[1])===s}).map(([r,o])=>[Rh(r),o]));return[...new Map([...n("en"),...t==="en"?[]:n(t)])]}function Mu(i){return i==="de"?"de":i==="pt-PT"?"pt":"en"}let w1="en",Ot=[],Tn=[],Ma="",La=[],ds="off";function Lu(i){i!==ds&&(ds=i,Ot=[],hs(w1))}function hs(i){var s,r,o;if(t3(i),i===w1&&Ot.length>0)return;w1=i;const e=F1(QB,/\/lessons\/([^/]+)\/[^/]+\.md$/,i),t=(l,u)=>l.filter(([m])=>/^\d+/.test(m)).map(([m,c])=>HB(Nu(c,u),`${i}/${m}`)).sort((m,c)=>m.number-c.number),n=(l,u,m)=>l.map(([c,d])=>{const h=VB(Nu(d,m),`${i}/${u}${c}`);return m&&h.after!==void 0?{...h,after:m.get(h.after)??h.after}:h}),a=F1(qB,/\/lessons\/([^/]+)\/aufgaben\/[^/]+\.md$/,i);if(ds==="on"){const l=F1(Zu,/\/lessons\/([^/]+)\/visubot\/[^/]+\.md$/,i),u=KB(Eu(e),Eu(l)),m=t(e,u.normal),c=h=>{var g;return((g=[...m].reverse().find(f=>u.normal.get(f.number)({...h,number:u.normal.get(h.number)})),...t(l,u.robot).map(h=>{const g=u.robot.get(h.number);return{...h,number:g,section:c(g),robot:!0}})].sort((h,g)=>h.number-g.number);const d=F1(UB,/\/lessons\/([^/]+)\/visubot\/aufgaben\/[^/]+\.md$/,i);Tn=[...n(a,"aufgaben/",u.normal),...n(d,"visubot/aufgaben/",u.robot).map(h=>({...h,robot:!0}))]}else Ot=t(e),Tn=n(a,"aufgaben/");Tn.sort((l,u)=>(l.after??0)-(u.after??0)||l.level-u.level||l.title.localeCompare(u.title,i));for(const l of[...Ot.flatMap(u=>u.steps.flatMap(m=>m.blocks)),...Tn.flatMap(u=>u.blocks)])l.kind==="textFile"&&c3(l.name,l.content);if(Ma=((s=e.find(([l])=>l==="nachschlagen.md"))==null?void 0:s[1])??"",ds!=="off"){const l=(r=F1(Zu,/\/lessons\/([^/]+)\/visubot\/[^/]+\.md$/,i).find(([u])=>u==="nachschlagen.md"))==null?void 0:r[1];l&&(Ma=`${Ma.trimEnd()} +`)){const h=/^##\s+(.*)$/.exec(d);h?(u(),l={title:h[1].trim(),lines:[]}):l?l.lines.push(d):o.push(d)}if(u(),r.length===0)throw new te(`${e}: Keine Schritte (## Überschrift) gefunden.`);GB(r,e);const m=t.get("titel");if(!m)throw new te(`${e}: „titel:“ fehlt.`);return{id:a,number:s,title:m,section:t.get("bereich")??"",summary:t.get("kurz")??o.join(" ").trim(),steps:r}}function VB(i,e){const{meta:t,body:n}=Nh(i,e),a=t.get("titel");if(!a)throw new te(`${e}: „titel:“ fehlt.`);const s=t.get("nach");return{id:e.replace(/^.*\//,"").replace(/\.md$/,""),title:a,after:s?Number(s):void 0,level:Number(t.get("stufe")??"1")||1,blocks:Jh(n,e)}}function Du(i,e){const t=i.split(/\s*,\s*/).map(n=>n.trim()).filter(Boolean);for(const n of t)if(!l3(n))throw new te(`${e}: Unbekanntes Teil „${n}“. Bekannt: ${ah.join(", ")}.`);return t}const QB=Object.assign({"../../lessons/de/01-was-ist-ein-struktogramm.md":Xx,"../../lessons/de/02-der-editor.md":Kx,"../../lessons/de/03-speichern-oeffnen-exportieren.md":eb,"../../lessons/de/04-variablen-und-datentypen.md":tb,"../../lessons/de/05-sequenz.md":nb,"../../lessons/de/06-eingabe-und-ausgabe.md":ib,"../../lessons/de/07-simulation-und-schreibtischtest.md":ab,"../../lessons/de/08-verzweigung.md":sb,"../../lessons/de/09-bedingungen-verknuepfen.md":rb,"../../lessons/de/10-fallauswahl.md":ob,"../../lessons/de/11-while-schleife.md":lb,"../../lessons/de/12-do-while-schleife.md":ub,"../../lessons/de/13-for-schleife.md":mb,"../../lessons/de/14-verschachteln.md":cb,"../../lessons/de/15-arrays.md":db,"../../lessons/de/16-zweidimensionale-arrays.md":hb,"../../lessons/de/17-zeichenketten.md":gb,"../../lessons/de/18-aufruf-und-aussprung.md":pb,"../../lessons/de/19-suchen-und-sortieren.md":fb,"../../lessons/de/20-java.md":xb,"../../lessons/de/21-python-und-javascript.md":bb,"../../lessons/de/22-try-und-catch.md":vb,"../../lessons/de/23-text-einlesen-und-speichern.md":yb,"../../lessons/de/24-zeile-fuer-zeile.md":wb,"../../lessons/de/25-tabellen-als-csv.md":zb,"../../lessons/de/26-json.md":Ib,"../../lessons/de/27-formate-im-vergleich.md":kb,"../../lessons/de/28-erstes-fenster.md":Sb,"../../lessons/de/29-knopf-im-fenster.md":_b,"../../lessons/de/30-der-knopf-reagiert.md":Tb,"../../lessons/de/31-zahl-verdoppeln.md":Ob,"../../lessons/de/32-klickzaehler.md":Ab,"../../lessons/de/33-ampel.md":Pb,"../../lessons/de/34-notenrechner.md":jb,"../../lessons/de/35-taschenrechner.md":Cb,"../../lessons/de/36-zahlenraten.md":Bb,"../../lessons/de/37-viele-knoepfe-ein-zuhoerer.md":Db,"../../lessons/de/38-innere-klassen.md":Zb,"../../lessons/de/39-zwei-reiter.md":Mb,"../../lessons/de/40-model-view-controller.md":Lb,"../../lessons/de/begriffe.md":Wb,"../../lessons/de/nachschlagen.md":Eb,"../../lessons/en/01-was-ist-ein-struktogramm.md":Nb,"../../lessons/en/02-der-editor.md":Fb,"../../lessons/en/03-speichern-oeffnen-exportieren.md":Jb,"../../lessons/en/04-variablen-und-datentypen.md":Rb,"../../lessons/en/05-sequenz.md":Gb,"../../lessons/en/06-eingabe-und-ausgabe.md":Hb,"../../lessons/en/07-simulation-und-schreibtischtest.md":Vb,"../../lessons/en/08-verzweigung.md":Qb,"../../lessons/en/09-bedingungen-verknuepfen.md":qb,"../../lessons/en/10-fallauswahl.md":Ub,"../../lessons/en/11-while-schleife.md":$b,"../../lessons/en/12-do-while-schleife.md":Yb,"../../lessons/en/13-for-schleife.md":Xb,"../../lessons/en/14-verschachteln.md":Kb,"../../lessons/en/15-arrays.md":e4,"../../lessons/en/16-zweidimensionale-arrays.md":t4,"../../lessons/en/17-zeichenketten.md":n4,"../../lessons/en/18-aufruf-und-aussprung.md":i4,"../../lessons/en/19-suchen-und-sortieren.md":a4,"../../lessons/en/20-java.md":s4,"../../lessons/en/21-python-und-javascript.md":r4,"../../lessons/en/22-try-und-catch.md":o4,"../../lessons/en/23-text-einlesen-und-speichern.md":l4,"../../lessons/en/24-zeile-fuer-zeile.md":u4,"../../lessons/en/25-tabellen-als-csv.md":m4,"../../lessons/en/26-json.md":c4,"../../lessons/en/27-formate-im-vergleich.md":d4,"../../lessons/en/28-erstes-fenster.md":h4,"../../lessons/en/29-knopf-im-fenster.md":g4,"../../lessons/en/30-der-knopf-reagiert.md":p4,"../../lessons/en/31-zahl-verdoppeln.md":f4,"../../lessons/en/32-klickzaehler.md":x4,"../../lessons/en/33-ampel.md":b4,"../../lessons/en/34-notenrechner.md":v4,"../../lessons/en/35-taschenrechner.md":y4,"../../lessons/en/36-zahlenraten.md":w4,"../../lessons/en/37-viele-knoepfe-ein-zuhoerer.md":z4,"../../lessons/en/38-innere-klassen.md":I4,"../../lessons/en/39-zwei-reiter.md":k4,"../../lessons/en/40-model-view-controller.md":S4,"../../lessons/en/begriffe.md":_4,"../../lessons/en/nachschlagen.md":T4,"../../lessons/pt/01-was-ist-ein-struktogramm.md":O4,"../../lessons/pt/02-der-editor.md":A4,"../../lessons/pt/03-speichern-oeffnen-exportieren.md":P4,"../../lessons/pt/04-variablen-und-datentypen.md":j4,"../../lessons/pt/05-sequenz.md":C4,"../../lessons/pt/06-eingabe-und-ausgabe.md":B4,"../../lessons/pt/07-simulation-und-schreibtischtest.md":D4,"../../lessons/pt/08-verzweigung.md":Z4,"../../lessons/pt/09-bedingungen-verknuepfen.md":M4,"../../lessons/pt/10-fallauswahl.md":L4,"../../lessons/pt/11-while-schleife.md":W4,"../../lessons/pt/12-do-while-schleife.md":E4,"../../lessons/pt/13-for-schleife.md":N4,"../../lessons/pt/14-verschachteln.md":F4,"../../lessons/pt/15-arrays.md":J4,"../../lessons/pt/16-zweidimensionale-arrays.md":R4,"../../lessons/pt/17-zeichenketten.md":G4,"../../lessons/pt/18-aufruf-und-aussprung.md":H4,"../../lessons/pt/19-suchen-und-sortieren.md":V4,"../../lessons/pt/20-java.md":Q4,"../../lessons/pt/21-python-und-javascript.md":q4,"../../lessons/pt/22-try-und-catch.md":U4,"../../lessons/pt/23-text-einlesen-und-speichern.md":$4,"../../lessons/pt/24-zeile-fuer-zeile.md":Y4,"../../lessons/pt/25-tabellen-als-csv.md":X4,"../../lessons/pt/26-json.md":K4,"../../lessons/pt/27-formate-im-vergleich.md":ev,"../../lessons/pt/28-erstes-fenster.md":tv,"../../lessons/pt/29-knopf-im-fenster.md":nv,"../../lessons/pt/30-der-knopf-reagiert.md":iv,"../../lessons/pt/31-zahl-verdoppeln.md":av,"../../lessons/pt/32-klickzaehler.md":sv,"../../lessons/pt/33-ampel.md":rv,"../../lessons/pt/34-notenrechner.md":ov,"../../lessons/pt/35-taschenrechner.md":lv,"../../lessons/pt/36-zahlenraten.md":uv,"../../lessons/pt/37-viele-knoepfe-ein-zuhoerer.md":mv,"../../lessons/pt/38-innere-klassen.md":cv,"../../lessons/pt/39-zwei-reiter.md":dv,"../../lessons/pt/40-model-view-controller.md":hv,"../../lessons/pt/begriffe.md":gv,"../../lessons/pt/nachschlagen.md":pv}),qB=Object.assign({"../../lessons/de/aufgaben/alter-unterprogramm.md":fv,"../../lessons/de/aufgaben/ballwurf.md":xv,"../../lessons/de/aufgaben/bestenliste.md":bv,"../../lessons/de/aufgaben/binaerzahl.md":vv,"../../lessons/de/aufgaben/caesar.md":yv,"../../lessons/de/aufgaben/collatz.md":wv,"../../lessons/de/aufgaben/einheitenrechner.md":zv,"../../lessons/de/aufgaben/fibonacci.md":Iv,"../../lessons/de/aufgaben/gerade-ungerade.md":kv,"../../lessons/de/aufgaben/mehrwertsteuer.md":Sv,"../../lessons/de/aufgaben/notendurchschnitt.md":_v,"../../lessons/de/aufgaben/pin-pruefen.md":Tv,"../../lessons/de/aufgaben/schiffe-versenken.md":Ov,"../../lessons/de/aufgaben/speisekarte.md":Av,"../../lessons/de/aufgaben/summe-bilden.md":Pv,"../../lessons/de/aufgaben/tafeldienst.md":jv,"../../lessons/de/aufgaben/taschenrechner.md":Cv,"../../lessons/de/aufgaben/verleih-menue.md":Bv,"../../lessons/de/aufgaben/vokabeltrainer.md":Dv,"../../lessons/de/aufgaben/volljaehrig.md":Zv,"../../lessons/de/aufgaben/wuerfel-mvc.md":Mv,"../../lessons/de/aufgaben/zahl-verdoppeln.md":Lv,"../../lessons/en/aufgaben/alter-unterprogramm.md":Wv,"../../lessons/en/aufgaben/ballwurf.md":Ev,"../../lessons/en/aufgaben/bestenliste.md":Nv,"../../lessons/en/aufgaben/binaerzahl.md":Fv,"../../lessons/en/aufgaben/caesar.md":Jv,"../../lessons/en/aufgaben/collatz.md":Rv,"../../lessons/en/aufgaben/einheitenrechner.md":Gv,"../../lessons/en/aufgaben/fibonacci.md":Hv,"../../lessons/en/aufgaben/gerade-ungerade.md":Vv,"../../lessons/en/aufgaben/mehrwertsteuer.md":Qv,"../../lessons/en/aufgaben/notendurchschnitt.md":qv,"../../lessons/en/aufgaben/pin-pruefen.md":Uv,"../../lessons/en/aufgaben/schiffe-versenken.md":$v,"../../lessons/en/aufgaben/speisekarte.md":Yv,"../../lessons/en/aufgaben/summe-bilden.md":Xv,"../../lessons/en/aufgaben/tafeldienst.md":Kv,"../../lessons/en/aufgaben/taschenrechner.md":ey,"../../lessons/en/aufgaben/verleih-menue.md":ty,"../../lessons/en/aufgaben/vokabeltrainer.md":ny,"../../lessons/en/aufgaben/volljaehrig.md":iy,"../../lessons/en/aufgaben/wuerfel-mvc.md":ay,"../../lessons/en/aufgaben/zahl-verdoppeln.md":sy,"../../lessons/pt/aufgaben/alter-unterprogramm.md":ry,"../../lessons/pt/aufgaben/ballwurf.md":oy,"../../lessons/pt/aufgaben/bestenliste.md":ly,"../../lessons/pt/aufgaben/binaerzahl.md":uy,"../../lessons/pt/aufgaben/caesar.md":my,"../../lessons/pt/aufgaben/collatz.md":cy,"../../lessons/pt/aufgaben/einheitenrechner.md":dy,"../../lessons/pt/aufgaben/fibonacci.md":hy,"../../lessons/pt/aufgaben/gerade-ungerade.md":gy,"../../lessons/pt/aufgaben/mehrwertsteuer.md":py,"../../lessons/pt/aufgaben/notendurchschnitt.md":fy,"../../lessons/pt/aufgaben/pin-pruefen.md":xy,"../../lessons/pt/aufgaben/schiffe-versenken.md":by,"../../lessons/pt/aufgaben/speisekarte.md":vy,"../../lessons/pt/aufgaben/summe-bilden.md":yy,"../../lessons/pt/aufgaben/tafeldienst.md":wy,"../../lessons/pt/aufgaben/taschenrechner.md":zy,"../../lessons/pt/aufgaben/verleih-menue.md":Iy,"../../lessons/pt/aufgaben/vokabeltrainer.md":ky,"../../lessons/pt/aufgaben/volljaehrig.md":Sy,"../../lessons/pt/aufgaben/wuerfel-mvc.md":_y,"../../lessons/pt/aufgaben/zahl-verdoppeln.md":Ty}),Zu=Object.assign({"../../lessons/de/visubot/01-der-mbot2.md":Oy,"../../lessons/de/visubot/02-das-quadrat.md":Ay,"../../lessons/de/visubot/03-variablen-und-ausgabe.md":Py,"../../lessons/de/visubot/04-sensoren.md":jy,"../../lessons/de/visubot/05-bis-zur-wand.md":Cy,"../../lessons/de/visubot/06-abstand.md":By,"../../lessons/de/visubot/07-linie.md":Dy,"../../lessons/de/visubot/08-farben.md":Zy,"../../lessons/de/visubot/09-fallauswahl.md":My,"../../lessons/de/visubot/10-tasten-joystick.md":Ly,"../../lessons/de/visubot/11-licht.md":Wy,"../../lessons/de/visubot/12-lautstaerke.md":Ey,"../../lessons/de/visubot/13-neigung.md":Ny,"../../lessons/de/visubot/14-leds.md":Fy,"../../lessons/de/visubot/15-einzelne-leds.md":Jy,"../../lessons/de/visubot/16-lautsprecher.md":Ry,"../../lessons/de/visubot/17-arrays-melodie.md":Gy,"../../lessons/de/visubot/18-bildschirm.md":Hy,"../../lessons/de/visubot/19-zeichenketten.md":Vy,"../../lessons/de/visubot/20-motoren.md":Qy,"../../lessons/de/visubot/21-stoppuhr-akku.md":qy,"../../lessons/de/visubot/22-eigene-methoden.md":Uy,"../../lessons/de/visubot/nachschlagen.md":$y,"../../lessons/en/visubot/01-der-mbot2.md":Yy,"../../lessons/en/visubot/02-das-quadrat.md":Xy,"../../lessons/en/visubot/03-variablen-und-ausgabe.md":Ky,"../../lessons/en/visubot/04-sensoren.md":e9,"../../lessons/en/visubot/05-bis-zur-wand.md":t9,"../../lessons/en/visubot/06-abstand.md":n9,"../../lessons/en/visubot/07-linie.md":i9,"../../lessons/en/visubot/08-farben.md":a9,"../../lessons/en/visubot/09-fallauswahl.md":s9,"../../lessons/en/visubot/10-tasten-joystick.md":r9,"../../lessons/en/visubot/11-licht.md":o9,"../../lessons/en/visubot/12-lautstaerke.md":l9,"../../lessons/en/visubot/13-neigung.md":u9,"../../lessons/en/visubot/14-leds.md":m9,"../../lessons/en/visubot/15-einzelne-leds.md":c9,"../../lessons/en/visubot/16-lautsprecher.md":d9,"../../lessons/en/visubot/17-arrays-melodie.md":h9,"../../lessons/en/visubot/18-bildschirm.md":g9,"../../lessons/en/visubot/19-zeichenketten.md":p9,"../../lessons/en/visubot/20-motoren.md":f9,"../../lessons/en/visubot/21-stoppuhr-akku.md":x9,"../../lessons/en/visubot/22-eigene-methoden.md":b9,"../../lessons/en/visubot/nachschlagen.md":v9}),UB=Object.assign({"../../lessons/de/visubot/aufgaben/alarmanlage.md":y9,"../../lessons/de/visubot/aufgaben/ausgang.md":w9,"../../lessons/de/visubot/aufgaben/binaer-zaehlen.md":z9,"../../lessons/de/visubot/aufgaben/dreieck.md":I9,"../../lessons/de/visubot/aufgaben/einparken.md":k9,"../../lessons/de/visubot/aufgaben/hindernis.md":S9,"../../lessons/de/visubot/aufgaben/knight-rider.md":_9,"../../lessons/de/visubot/aufgaben/labyrinth.md":T9,"../../lessons/de/visubot/aufgaben/linienfolger-stopp.md":O9,"../../lessons/de/visubot/aufgaben/morsen.md":A9,"../../lessons/de/visubot/aufgaben/nachtwaechter.md":P9,"../../lessons/de/visubot/aufgaben/slalom.md":j9,"../../lessons/de/visubot/aufgaben/spirale.md":C9,"../../lessons/de/visubot/aufgaben/treppe.md":B9,"../../lessons/de/visubot/aufgaben/tunnel.md":D9,"../../lessons/de/visubot/aufgaben/wald.md":Z9,"../../lessons/en/visubot/aufgaben/alarmanlage.md":M9,"../../lessons/en/visubot/aufgaben/ausgang.md":L9,"../../lessons/en/visubot/aufgaben/binaer-zaehlen.md":W9,"../../lessons/en/visubot/aufgaben/dreieck.md":E9,"../../lessons/en/visubot/aufgaben/einparken.md":N9,"../../lessons/en/visubot/aufgaben/hindernis.md":F9,"../../lessons/en/visubot/aufgaben/knight-rider.md":J9,"../../lessons/en/visubot/aufgaben/labyrinth.md":R9,"../../lessons/en/visubot/aufgaben/linienfolger-stopp.md":G9,"../../lessons/en/visubot/aufgaben/morsen.md":H9,"../../lessons/en/visubot/aufgaben/nachtwaechter.md":V9,"../../lessons/en/visubot/aufgaben/slalom.md":Q9,"../../lessons/en/visubot/aufgaben/spirale.md":q9,"../../lessons/en/visubot/aufgaben/treppe.md":U9,"../../lessons/en/visubot/aufgaben/tunnel.md":$9,"../../lessons/en/visubot/aufgaben/wald.md":Y9}),$B=Object.assign({"../../lessons/diagramme/aufgabe-alter-haupt-loesung.visustruct":X9,"../../lessons/diagramme/aufgabe-alter-unterprogramm-loesung.visustruct":K9,"../../lessons/diagramme/aufgabe-ballwurf-loesung.visustruct":ew,"../../lessons/diagramme/aufgabe-ballwurf-start.visustruct":tw,"../../lessons/diagramme/aufgabe-bestenliste-loesung.visustruct":nw,"../../lessons/diagramme/aufgabe-binaer-loesung.visustruct":iw,"../../lessons/diagramme/aufgabe-caesar-array-loesung.visustruct":aw,"../../lessons/diagramme/aufgabe-caesar-array-start.visustruct":sw,"../../lessons/diagramme/aufgabe-caesar-ascii-loesung.visustruct":rw,"../../lessons/diagramme/aufgabe-caesar-entschluesseln-loesung.visustruct":ow,"../../lessons/diagramme/aufgabe-collatz-loesung.visustruct":lw,"../../lessons/diagramme/aufgabe-durchschnitt-loesung.visustruct":uw,"../../lessons/diagramme/aufgabe-fibonacci-loesung.visustruct":mw,"../../lessons/diagramme/aufgabe-gerade-loesung.visustruct":cw,"../../lessons/diagramme/aufgabe-mehrwertsteuer-loesung.visustruct":dw,"../../lessons/diagramme/aufgabe-pin-java-loesung.visustruct":hw,"../../lessons/diagramme/aufgabe-pin-loesung.visustruct":gw,"../../lessons/diagramme/aufgabe-rechner-loesung.visustruct":pw,"../../lessons/diagramme/aufgabe-schiffe-loesung.visustruct":fw,"../../lessons/diagramme/aufgabe-schiffe-start.visustruct":xw,"../../lessons/diagramme/aufgabe-speisekarte-loesung.visustruct":bw,"../../lessons/diagramme/aufgabe-summe-loesung.visustruct":vw,"../../lessons/diagramme/aufgabe-tafeldienst-loesung.visustruct":yw,"../../lessons/diagramme/aufgabe-verdoppeln-loesung.visustruct":ww,"../../lessons/diagramme/aufgabe-verleih-java-loesung.visustruct":zw,"../../lessons/diagramme/aufgabe-verleih-loesung.visustruct":Iw,"../../lessons/diagramme/aufgabe-vokabeln-loesung.visustruct":kw,"../../lessons/diagramme/aufgabe-vokabeln-start.visustruct":Sw,"../../lessons/diagramme/aufgabe-volljaehrig-loesung.visustruct":_w,"../../lessons/diagramme/dt-buffered.visustruct":Tw,"../../lessons/diagramme/dt-csv.visustruct":Ow,"../../lessons/diagramme/dt-json.visustruct":Aw,"../../lessons/diagramme/dt-lesen.visustruct":Pw,"../../lessons/diagramme/en/aufgabe-alter-haupt-loesung.visustruct":jw,"../../lessons/diagramme/en/aufgabe-alter-unterprogramm-loesung.visustruct":Cw,"../../lessons/diagramme/en/aufgabe-ballwurf-loesung.visustruct":Bw,"../../lessons/diagramme/en/aufgabe-ballwurf-start.visustruct":Dw,"../../lessons/diagramme/en/aufgabe-bestenliste-loesung.visustruct":Zw,"../../lessons/diagramme/en/aufgabe-binaer-loesung.visustruct":Mw,"../../lessons/diagramme/en/aufgabe-caesar-array-loesung.visustruct":Lw,"../../lessons/diagramme/en/aufgabe-caesar-array-start.visustruct":Ww,"../../lessons/diagramme/en/aufgabe-caesar-ascii-loesung.visustruct":Ew,"../../lessons/diagramme/en/aufgabe-caesar-entschluesseln-loesung.visustruct":Nw,"../../lessons/diagramme/en/aufgabe-collatz-loesung.visustruct":Fw,"../../lessons/diagramme/en/aufgabe-durchschnitt-loesung.visustruct":Jw,"../../lessons/diagramme/en/aufgabe-fibonacci-loesung.visustruct":Rw,"../../lessons/diagramme/en/aufgabe-gerade-loesung.visustruct":Gw,"../../lessons/diagramme/en/aufgabe-mehrwertsteuer-loesung.visustruct":Hw,"../../lessons/diagramme/en/aufgabe-pin-java-loesung.visustruct":Vw,"../../lessons/diagramme/en/aufgabe-pin-loesung.visustruct":Qw,"../../lessons/diagramme/en/aufgabe-rechner-loesung.visustruct":qw,"../../lessons/diagramme/en/aufgabe-schiffe-loesung.visustruct":Uw,"../../lessons/diagramme/en/aufgabe-schiffe-start.visustruct":$w,"../../lessons/diagramme/en/aufgabe-speisekarte-loesung.visustruct":Yw,"../../lessons/diagramme/en/aufgabe-summe-loesung.visustruct":Xw,"../../lessons/diagramme/en/aufgabe-tafeldienst-loesung.visustruct":Kw,"../../lessons/diagramme/en/aufgabe-verdoppeln-loesung.visustruct":e5,"../../lessons/diagramme/en/aufgabe-verleih-java-loesung.visustruct":t5,"../../lessons/diagramme/en/aufgabe-verleih-loesung.visustruct":n5,"../../lessons/diagramme/en/aufgabe-vokabeln-loesung.visustruct":i5,"../../lessons/diagramme/en/aufgabe-vokabeln-start.visustruct":a5,"../../lessons/diagramme/en/aufgabe-volljaehrig-loesung.visustruct":s5,"../../lessons/diagramme/en/dt-buffered.visustruct":r5,"../../lessons/diagramme/en/dt-csv.visustruct":o5,"../../lessons/diagramme/en/dt-json.visustruct":l5,"../../lessons/diagramme/en/dt-lesen.visustruct":u5,"../../lessons/diagramme/en/kino-einmaleins-loesung.visustruct":m5,"../../lessons/diagramme/en/kino-frei-loesung.visustruct":c5,"../../lessons/diagramme/en/kino-frei-start.visustruct":d5,"../../lessons/diagramme/en/kino-karte-loesung.visustruct":h5,"../../lessons/diagramme/en/kino-karte-start.visustruct":g5,"../../lessons/diagramme/en/kino-saalplan.visustruct":p5,"../../lessons/diagramme/en/kino-verkaufen.visustruct":f5,"../../lessons/diagramme/en/l04-java-fehler-loesung.visustruct":x5,"../../lessons/diagramme/en/l04-java-fehler-start.visustruct":b5,"../../lessons/diagramme/en/l04-java-steckbrief-loesung.visustruct":v5,"../../lessons/diagramme/en/l04-rechnen.visustruct":y5,"../../lessons/diagramme/en/l04-reihenfolge-loesung.visustruct":w5,"../../lessons/diagramme/en/l04-reihenfolge-start.visustruct":z5,"../../lessons/diagramme/en/l04-tauschen-loesung.visustruct":I5,"../../lessons/diagramme/en/l04-tauschen-start.visustruct":k5,"../../lessons/diagramme/en/l04-tauschen.visustruct":S5,"../../lessons/diagramme/en/l05-datentypen.visustruct":_5,"../../lessons/diagramme/en/l05-division.visustruct":T5,"../../lessons/diagramme/en/l05-einkauf-loesung.visustruct":O5,"../../lessons/diagramme/en/l05-java-fehler-loesung.visustruct":A5,"../../lessons/diagramme/en/l05-java-fehler-start.visustruct":P5,"../../lessons/diagramme/en/l05-java-kino-loesung.visustruct":j5,"../../lessons/diagramme/en/l05-rechteck-loesung.visustruct":C5,"../../lessons/diagramme/en/l05-sekunden-loesung.visustruct":B5,"../../lessons/diagramme/en/l05-sekunden-start.visustruct":D5,"../../lessons/diagramme/en/l06-begruessung-loesung.visustruct":Z5,"../../lessons/diagramme/en/l06-eva.visustruct":M5,"../../lessons/diagramme/en/l06-java-fehler-loesung.visustruct":L5,"../../lessons/diagramme/en/l06-java-fehler-start.visustruct":W5,"../../lessons/diagramme/en/l06-java-tage-loesung.visustruct":E5,"../../lessons/diagramme/en/l06-mittelwert-loesung.visustruct":N5,"../../lessons/diagramme/en/l06-rechner-loesung.visustruct":F5,"../../lessons/diagramme/en/l07-alter-pruefen.visustruct":J5,"../../lessons/diagramme/en/l07-betrag-loesung.visustruct":R5,"../../lessons/diagramme/en/l07-gerade-loesung.visustruct":G5,"../../lessons/diagramme/en/l07-java-fehler-loesung.visustruct":H5,"../../lessons/diagramme/en/l07-java-fehler-start.visustruct":V5,"../../lessons/diagramme/en/l07-java-pizza-loesung.visustruct":Q5,"../../lessons/diagramme/en/l07-java-pizza-start.visustruct":q5,"../../lessons/diagramme/en/l07-maximum-loesung.visustruct":U5,"../../lessons/diagramme/en/l07-rabatt.visustruct":$5,"../../lessons/diagramme/en/l08-gueltig-loesung.visustruct":Y5,"../../lessons/diagramme/en/l08-java-bestanden-loesung.visustruct":X5,"../../lessons/diagramme/en/l08-java-fehler-loesung.visustruct":K5,"../../lessons/diagramme/en/l08-java-fehler-start.visustruct":e6,"../../lessons/diagramme/en/l08-jugendticket.visustruct":t6,"../../lessons/diagramme/en/l08-note.visustruct":n6,"../../lessons/diagramme/en/l08-schaltjahr-loesung.visustruct":i6,"../../lessons/diagramme/en/l08-wochenende-loesung.visustruct":a6,"../../lessons/diagramme/en/l09-ampel.visustruct":s6,"../../lessons/diagramme/en/l09-automat.visustruct":r6,"../../lessons/diagramme/en/l09-java-fehler-loesung.visustruct":o6,"../../lessons/diagramme/en/l09-java-fehler-start.visustruct":l6,"../../lessons/diagramme/en/l09-java-schule-loesung.visustruct":u6,"../../lessons/diagramme/en/l09-note-loesung.visustruct":m6,"../../lessons/diagramme/en/l09-rechner-loesung.visustruct":c6,"../../lessons/diagramme/en/l09-verschachtelt.visustruct":d6,"../../lessons/diagramme/en/l1-grundbausteine.visustruct":h6,"../../lessons/diagramme/en/l1-sequenz.visustruct":g6,"../../lessons/diagramme/en/l1-tee.visustruct":p6,"../../lessons/diagramme/en/l1-verzweigung.visustruct":f6,"../../lessons/diagramme/en/l1-wiederholung.visustruct":x6,"../../lessons/diagramme/en/l10-bis-n-loesung.visustruct":b6,"../../lessons/diagramme/en/l10-countdown.visustruct":v6,"../../lessons/diagramme/en/l10-endlos.visustruct":y6,"../../lessons/diagramme/en/l10-fakultaet.visustruct":w6,"../../lessons/diagramme/en/l10-java-fehler-loesung.visustruct":z6,"../../lessons/diagramme/en/l10-java-fehler-start.visustruct":I6,"../../lessons/diagramme/en/l10-java-wuerfel-loesung.visustruct":k6,"../../lessons/diagramme/en/l10-verdoppeln-loesung.visustruct":S6,"../../lessons/diagramme/en/l11-eingabe-pruefen.visustruct":_6,"../../lessons/diagramme/en/l11-einmal.visustruct":T6,"../../lessons/diagramme/en/l11-java-fehler-loesung.visustruct":O6,"../../lessons/diagramme/en/l11-java-fehler-start.visustruct":A6,"../../lessons/diagramme/en/l11-java-gerade-loesung.visustruct":P6,"../../lessons/diagramme/en/l11-note-loesung.visustruct":j6,"../../lessons/diagramme/en/l11-summe-loesung.visustruct":C6,"../../lessons/diagramme/en/l12-countdown-loesung.visustruct":B6,"../../lessons/diagramme/en/l12-einmaleins-loesung.visustruct":D6,"../../lessons/diagramme/en/l12-eins-bis-fuenf.visustruct":Z6,"../../lessons/diagramme/en/l12-java-fehler-loesung.visustruct":M6,"../../lessons/diagramme/en/l12-java-fehler-start.visustruct":L6,"../../lessons/diagramme/en/l12-java-verdoppeln-loesung.visustruct":W6,"../../lessons/diagramme/en/l12-summe.visustruct":E6,"../../lessons/diagramme/en/l13-dreieck.visustruct":N6,"../../lessons/diagramme/en/l13-gerade-eingaben-loesung.visustruct":F6,"../../lessons/diagramme/en/l13-gerade-zaehlen.visustruct":J6,"../../lessons/diagramme/en/l13-java-fehler-loesung.visustruct":R6,"../../lessons/diagramme/en/l13-java-fehler-start.visustruct":G6,"../../lessons/diagramme/en/l13-java-quadrate-loesung.visustruct":H6,"../../lessons/diagramme/en/l13-rechteck-loesung.visustruct":V6,"../../lessons/diagramme/en/l14-array-durchlaufen.visustruct":Q6,"../../lessons/diagramme/en/l14-erster-letzter-loesung.visustruct":q6,"../../lessons/diagramme/en/l14-java-fehler-loesung.visustruct":U6,"../../lessons/diagramme/en/l14-java-fehler-start.visustruct":$6,"../../lessons/diagramme/en/l14-java-treppe-loesung.visustruct":Y6,"../../lessons/diagramme/en/l14-namen-eingeben.visustruct":X6,"../../lessons/diagramme/en/l14-rueckwaerts-loesung.visustruct":K6,"../../lessons/diagramme/en/l14-summe-max-loesung.visustruct":ez,"../../lessons/diagramme/en/l14-summe-maximum.visustruct":tz,"../../lessons/diagramme/en/l15-bis-null-loesung.visustruct":nz,"../../lessons/diagramme/en/l15-endlos-aussprung.visustruct":iz,"../../lessons/diagramme/en/l15-flaeche-loesung.visustruct":az,"../../lessons/diagramme/en/l15-flaeche-unterprogramm-loesung.visustruct":sz,"../../lessons/diagramme/en/l15-hauptprogramm.visustruct":rz,"../../lessons/diagramme/en/l15-java-fehler-loesung.visustruct":oz,"../../lessons/diagramme/en/l15-java-fehler-start.visustruct":lz,"../../lessons/diagramme/en/l15-java-noten-loesung.visustruct":uz,"../../lessons/diagramme/en/l15-quadrat-haupt.visustruct":mz,"../../lessons/diagramme/en/l15-quadrat.visustruct":cz,"../../lessons/diagramme/en/l15-titel-loesung.visustruct":dz,"../../lessons/diagramme/en/l15-unterprogramm.visustruct":hz,"../../lessons/diagramme/en/l15-zeige-summe-haupt.visustruct":gz,"../../lessons/diagramme/en/l15-zeige-summe.visustruct":pz,"../../lessons/diagramme/en/l16-countdown-loesung.visustruct":fz,"../../lessons/diagramme/en/l16-countdown-start.visustruct":xz,"../../lessons/diagramme/en/l16-java-fehler-loesung.visustruct":bz,"../../lessons/diagramme/en/l16-java-fehler-start.visustruct":vz,"../../lessons/diagramme/en/l16-java-punkte-loesung.visustruct":yz,"../../lessons/diagramme/en/l16-schreibtisch.visustruct":wz,"../../lessons/diagramme/en/l16-summe-loesung.visustruct":zz,"../../lessons/diagramme/en/l16-summe-start.visustruct":Iz,"../../lessons/diagramme/en/l17-beispiel.visustruct":kz,"../../lessons/diagramme/en/l17-fakultaet-loesung.visustruct":Sz,"../../lessons/diagramme/en/l17-java-brief-loesung.visustruct":_z,"../../lessons/diagramme/en/l17-java-brief-start.visustruct":Tz,"../../lessons/diagramme/en/l17-java-fehler-loesung.visustruct":Oz,"../../lessons/diagramme/en/l17-java-fehler-start.visustruct":Az,"../../lessons/diagramme/en/l17-java-passwort-loesung.visustruct":Pz,"../../lessons/diagramme/en/l17-ticket-loesung.visustruct":jz,"../../lessons/diagramme/en/l18-beispiel.visustruct":Cz,"../../lessons/diagramme/en/l18-java-fehler-loesung.visustruct":Bz,"../../lessons/diagramme/en/l18-java-fehler-start.visustruct":Dz,"../../lessons/diagramme/en/l18-java-kasse-loesung.visustruct":Zz,"../../lessons/diagramme/en/l18-js-loesung.visustruct":Mz,"../../lessons/diagramme/en/l18-python-loesung.visustruct":Lz,"../../lessons/diagramme/en/l19-java-fehler-loesung.visustruct":Wz,"../../lessons/diagramme/en/l19-java-fehler-start.visustruct":Ez,"../../lessons/diagramme/en/l19-java-zaehlen-loesung.visustruct":Nz,"../../lessons/diagramme/en/l2-ausgabe.visustruct":Fz,"../../lessons/diagramme/en/l2-hallo-loesung.visustruct":Jz,"../../lessons/diagramme/en/l2-zwei-zeilen-loesung.visustruct":Rz,"../../lessons/diagramme/en/l23-java-ergaenzen-loesung.visustruct":Gz,"../../lessons/diagramme/en/l23-java-ergaenzen-start.visustruct":Hz,"../../lessons/diagramme/en/l23-java-nummern-loesung.visustruct":Vz,"../../lessons/diagramme/en/l23-java-nummern-start.visustruct":Qz,"../../lessons/diagramme/en/l24-java-fuchs-loesung.visustruct":qz,"../../lessons/diagramme/en/l24-java-fuchs-start.visustruct":Uz,"../../lessons/diagramme/en/l24-java-laengster-loesung.visustruct":$z,"../../lessons/diagramme/en/l24-java-laengster-start.visustruct":Yz,"../../lessons/diagramme/en/l25-java-beste-loesung.visustruct":Xz,"../../lessons/diagramme/en/l25-java-beste-start.visustruct":Kz,"../../lessons/diagramme/en/l25-java-schnitt-loesung.visustruct":e7,"../../lessons/diagramme/en/l25-java-schnitt-start.visustruct":t7,"../../lessons/diagramme/en/l26-java-namen-loesung.visustruct":n7,"../../lessons/diagramme/en/l26-java-namen-start.visustruct":i7,"../../lessons/diagramme/en/l26-java-schreiben-loesung.visustruct":a7,"../../lessons/diagramme/en/l26-java-schreiben-start.visustruct":s7,"../../lessons/diagramme/en/l27-java-json-loesung.visustruct":r7,"../../lessons/diagramme/en/l27-java-json-start.visustruct":o7,"../../lessons/diagramme/en/l27-java-saetze-loesung.visustruct":l7,"../../lessons/diagramme/en/l27-java-saetze-start.visustruct":u7,"../../lessons/diagramme/en/sim-kino-loesung.visustruct":m7,"../../lessons/diagramme/en/sim-kino-start.visustruct":c7,"../../lessons/diagramme/en/sim-tausch-loesung.visustruct":d7,"../../lessons/diagramme/en/sim-tausch-start.visustruct":h7,"../../lessons/diagramme/en/sim-tausch.visustruct":g7,"../../lessons/diagramme/en/ss-absteigend-loesung.visustruct":p7,"../../lessons/diagramme/en/ss-absteigend-start.visustruct":f7,"../../lessons/diagramme/en/ss-binaere-suche.visustruct":x7,"../../lessons/diagramme/en/ss-bubblesort.visustruct":b7,"../../lessons/diagramme/en/ss-karte-suchen-loesung.visustruct":v7,"../../lessons/diagramme/en/ss-lineare-suche.visustruct":y7,"../../lessons/diagramme/en/uebergabe-bonus-loesung.visustruct":w7,"../../lessons/diagramme/en/uebergabe-bonus-start.visustruct":z7,"../../lessons/diagramme/en/uebergabe-bonus-unterprogramm-loesung.visustruct":I7,"../../lessons/diagramme/en/uebergabe-haupt.visustruct":k7,"../../lessons/diagramme/en/uebergabe-leeren.visustruct":S7,"../../lessons/diagramme/en/uebergabe-verdopple.visustruct":_7,"../../lessons/diagramme/en/vb-abstand-anzeigen-loesung.visustruct":T7,"../../lessons/diagramme/en/vb-abstand-halten-loesung.visustruct":O7,"../../lessons/diagramme/en/vb-alarmanlage-loesung.visustruct":A7,"../../lessons/diagramme/en/vb-ampel-loesung.visustruct":P7,"../../lessons/diagramme/en/vb-ausgang-loesung.visustruct":j7,"../../lessons/diagramme/en/vb-begruessung-loesung.visustruct":C7,"../../lessons/diagramme/en/vb-binaer-zaehlen-loesung.visustruct":B7,"../../lessons/diagramme/en/vb-bis-rot-loesung.visustruct":D7,"../../lessons/diagramme/en/vb-bis-wand-loesung.visustruct":Z7,"../../lessons/diagramme/en/vb-bis-ziel-loesung.visustruct":M7,"../../lessons/diagramme/en/vb-buchstaben-loesung.visustruct":L7,"../../lessons/diagramme/en/vb-drei-lichter-loesung.visustruct":W7,"../../lessons/diagramme/en/vb-dreieck-loesung.visustruct":E7,"../../lessons/diagramme/en/vb-einparken-loesung.visustruct":N7,"../../lessons/diagramme/en/vb-farben-loesung.visustruct":F7,"../../lessons/diagramme/en/vb-farbweiche-loesung.visustruct":J7,"../../lessons/diagramme/en/vb-gas-bis-wand-loesung.visustruct":R7,"../../lessons/diagramme/en/vb-gerade-loesung.visustruct":G7,"../../lessons/diagramme/en/vb-hindernis-loesung.visustruct":H7,"../../lessons/diagramme/en/vb-java-akku-loesung.visustruct":V7,"../../lessons/diagramme/en/vb-java-blau-gruen-loesung.visustruct":Q7,"../../lessons/diagramme/en/vb-java-blinken-loesung.visustruct":q7,"../../lessons/diagramme/en/vb-java-countdown-loesung.visustruct":U7,"../../lessons/diagramme/en/vb-java-hoeher-loesung.visustruct":$7,"../../lessons/diagramme/en/vb-java-joystick-loesung.visustruct":Y7,"../../lessons/diagramme/en/vb-java-laermampel-loesung.visustruct":X7,"../../lessons/diagramme/en/vb-java-lauflicht-loesung.visustruct":K7,"../../lessons/diagramme/en/vb-java-linienfolger-loesung.visustruct":eI,"../../lessons/diagramme/en/vb-java-nachtlicht-ton-loesung.visustruct":tI,"../../lessons/diagramme/en/vb-java-rand-loesung.visustruct":nI,"../../lessons/diagramme/en/vb-java-rechteck-loesung.visustruct":iI,"../../lessons/diagramme/en/vb-java-textlaenge-loesung.visustruct":aI,"../../lessons/diagramme/en/vb-java-wand-piep-loesung.visustruct":sI,"../../lessons/diagramme/en/vb-java-wasserwaage-loesung.visustruct":rI,"../../lessons/diagramme/en/vb-klatschen-loesung.visustruct":oI,"../../lessons/diagramme/en/vb-knight-rider-loesung.visustruct":lI,"../../lessons/diagramme/en/vb-labyrinth-loesung.visustruct":uI,"../../lessons/diagramme/en/vb-linienfolger-stopp-loesung.visustruct":mI,"../../lessons/diagramme/en/vb-linienmuster-loesung.visustruct":cI,"../../lessons/diagramme/en/vb-melodie-loesung.visustruct":dI,"../../lessons/diagramme/en/vb-morsen-loesung.visustruct":hI,"../../lessons/diagramme/en/vb-nachtlicht-loesung.visustruct":gI,"../../lessons/diagramme/en/vb-nachtwaechter-loesung.visustruct":pI,"../../lessons/diagramme/en/vb-ohne-noten-loesung.visustruct":fI,"../../lessons/diagramme/en/vb-ohne-quadratzahl-loesung.visustruct":xI,"../../lessons/diagramme/en/vb-ohne-quadratzahl-unterprogramm-loesung.visustruct":bI,"../../lessons/diagramme/en/vb-ohne-rueckwaerts-loesung.visustruct":vI,"../../lessons/diagramme/en/vb-ohne-strecke-loesung.visustruct":yI,"../../lessons/diagramme/en/vb-ohne-summe-loesung.visustruct":wI,"../../lessons/diagramme/en/vb-quadrat-loesung.visustruct":zI,"../../lessons/diagramme/en/vb-quadrat-methode-loesung.visustruct":II,"../../lessons/diagramme/en/vb-quadrat-schleife-loesung.visustruct":kI,"../../lessons/diagramme/en/vb-quadrat-unterprogramm-loesung.visustruct":SI,"../../lessons/diagramme/en/vb-quadrat-verschachtelt-loesung.visustruct":_I,"../../lessons/diagramme/en/vb-rand-loesung.visustruct":TI,"../../lessons/diagramme/en/vb-schraeglage-loesung.visustruct":OI,"../../lessons/diagramme/en/vb-slalom-loesung.visustruct":AI,"../../lessons/diagramme/en/vb-spirale-loesung.visustruct":PI,"../../lessons/diagramme/en/vb-start-a-loesung.visustruct":jI,"../../lessons/diagramme/en/vb-tonleiter-loesung.visustruct":CI,"../../lessons/diagramme/en/vb-treppe-loesung.visustruct":BI,"../../lessons/diagramme/en/vb-tunnel-loesung.visustruct":DI,"../../lessons/diagramme/en/vb-variable-seite-loesung.visustruct":ZI,"../../lessons/diagramme/en/vb-vier-quadrate-loesung.visustruct":MI,"../../lessons/diagramme/en/vb-wald-loesung.visustruct":LI,"../../lessons/diagramme/en/vb-wand-vorn-loesung.visustruct":WI,"../../lessons/diagramme/en/vb-zwei-sekunden-loesung.visustruct":EI,"../../lessons/diagramme/en/zk-initialen-loesung.visustruct":NI,"../../lessons/diagramme/en/zk-mehr.visustruct":FI,"../../lessons/diagramme/en/zk-rueckwaerts-loesung.visustruct":JI,"../../lessons/diagramme/en/zk-split.visustruct":RI,"../../lessons/diagramme/en/zk-woerter-loesung.visustruct":GI,"../../lessons/diagramme/en/zk-zaehlen.visustruct":HI,"../../lessons/diagramme/en/zk-zeichen.visustruct":VI,"../../lessons/diagramme/kino-einmaleins-loesung.visustruct":QI,"../../lessons/diagramme/kino-frei-loesung.visustruct":qI,"../../lessons/diagramme/kino-frei-start.visustruct":UI,"../../lessons/diagramme/kino-karte-loesung.visustruct":$I,"../../lessons/diagramme/kino-karte-start.visustruct":YI,"../../lessons/diagramme/kino-saalplan.visustruct":XI,"../../lessons/diagramme/kino-verkaufen.visustruct":KI,"../../lessons/diagramme/l04-java-fehler-loesung.visustruct":ek,"../../lessons/diagramme/l04-java-fehler-start.visustruct":tk,"../../lessons/diagramme/l04-java-steckbrief-loesung.visustruct":nk,"../../lessons/diagramme/l04-rechnen.visustruct":ik,"../../lessons/diagramme/l04-reihenfolge-loesung.visustruct":ak,"../../lessons/diagramme/l04-reihenfolge-start.visustruct":sk,"../../lessons/diagramme/l04-tauschen-loesung.visustruct":rk,"../../lessons/diagramme/l04-tauschen-start.visustruct":ok,"../../lessons/diagramme/l04-tauschen.visustruct":lk,"../../lessons/diagramme/l05-datentypen.visustruct":uk,"../../lessons/diagramme/l05-division.visustruct":mk,"../../lessons/diagramme/l05-einkauf-loesung.visustruct":ck,"../../lessons/diagramme/l05-java-fehler-loesung.visustruct":dk,"../../lessons/diagramme/l05-java-fehler-start.visustruct":hk,"../../lessons/diagramme/l05-java-kino-loesung.visustruct":gk,"../../lessons/diagramme/l05-rechteck-loesung.visustruct":pk,"../../lessons/diagramme/l05-sekunden-loesung.visustruct":fk,"../../lessons/diagramme/l05-sekunden-start.visustruct":xk,"../../lessons/diagramme/l06-begruessung-loesung.visustruct":bk,"../../lessons/diagramme/l06-eva.visustruct":vk,"../../lessons/diagramme/l06-java-fehler-loesung.visustruct":yk,"../../lessons/diagramme/l06-java-fehler-start.visustruct":wk,"../../lessons/diagramme/l06-java-tage-loesung.visustruct":zk,"../../lessons/diagramme/l06-mittelwert-loesung.visustruct":Ik,"../../lessons/diagramme/l06-rechner-loesung.visustruct":kk,"../../lessons/diagramme/l07-alter-pruefen.visustruct":Sk,"../../lessons/diagramme/l07-betrag-loesung.visustruct":_k,"../../lessons/diagramme/l07-gerade-loesung.visustruct":Tk,"../../lessons/diagramme/l07-java-fehler-loesung.visustruct":Ok,"../../lessons/diagramme/l07-java-fehler-start.visustruct":Ak,"../../lessons/diagramme/l07-java-pizza-loesung.visustruct":Pk,"../../lessons/diagramme/l07-java-pizza-start.visustruct":jk,"../../lessons/diagramme/l07-maximum-loesung.visustruct":Ck,"../../lessons/diagramme/l07-rabatt.visustruct":Bk,"../../lessons/diagramme/l08-gueltig-loesung.visustruct":Dk,"../../lessons/diagramme/l08-java-bestanden-loesung.visustruct":Zk,"../../lessons/diagramme/l08-java-fehler-loesung.visustruct":Mk,"../../lessons/diagramme/l08-java-fehler-start.visustruct":Lk,"../../lessons/diagramme/l08-jugendticket.visustruct":Wk,"../../lessons/diagramme/l08-note.visustruct":Ek,"../../lessons/diagramme/l08-schaltjahr-loesung.visustruct":Nk,"../../lessons/diagramme/l08-wochenende-loesung.visustruct":Fk,"../../lessons/diagramme/l09-ampel.visustruct":Jk,"../../lessons/diagramme/l09-automat.visustruct":Rk,"../../lessons/diagramme/l09-java-fehler-loesung.visustruct":Gk,"../../lessons/diagramme/l09-java-fehler-start.visustruct":Hk,"../../lessons/diagramme/l09-java-schule-loesung.visustruct":Vk,"../../lessons/diagramme/l09-note-loesung.visustruct":Qk,"../../lessons/diagramme/l09-rechner-loesung.visustruct":qk,"../../lessons/diagramme/l09-verschachtelt.visustruct":Uk,"../../lessons/diagramme/l1-grundbausteine.visustruct":$k,"../../lessons/diagramme/l1-sequenz.visustruct":Yk,"../../lessons/diagramme/l1-tee.visustruct":Xk,"../../lessons/diagramme/l1-verzweigung.visustruct":Kk,"../../lessons/diagramme/l1-wiederholung.visustruct":e8,"../../lessons/diagramme/l10-bis-n-loesung.visustruct":t8,"../../lessons/diagramme/l10-countdown.visustruct":n8,"../../lessons/diagramme/l10-endlos.visustruct":i8,"../../lessons/diagramme/l10-fakultaet.visustruct":a8,"../../lessons/diagramme/l10-java-fehler-loesung.visustruct":s8,"../../lessons/diagramme/l10-java-fehler-start.visustruct":r8,"../../lessons/diagramme/l10-java-wuerfel-loesung.visustruct":o8,"../../lessons/diagramme/l10-verdoppeln-loesung.visustruct":l8,"../../lessons/diagramme/l11-eingabe-pruefen.visustruct":u8,"../../lessons/diagramme/l11-einmal.visustruct":m8,"../../lessons/diagramme/l11-java-fehler-loesung.visustruct":c8,"../../lessons/diagramme/l11-java-fehler-start.visustruct":d8,"../../lessons/diagramme/l11-java-gerade-loesung.visustruct":h8,"../../lessons/diagramme/l11-note-loesung.visustruct":g8,"../../lessons/diagramme/l11-summe-loesung.visustruct":p8,"../../lessons/diagramme/l12-countdown-loesung.visustruct":f8,"../../lessons/diagramme/l12-einmaleins-loesung.visustruct":x8,"../../lessons/diagramme/l12-eins-bis-fuenf.visustruct":b8,"../../lessons/diagramme/l12-java-fehler-loesung.visustruct":v8,"../../lessons/diagramme/l12-java-fehler-start.visustruct":y8,"../../lessons/diagramme/l12-java-verdoppeln-loesung.visustruct":w8,"../../lessons/diagramme/l12-summe.visustruct":z8,"../../lessons/diagramme/l13-dreieck.visustruct":I8,"../../lessons/diagramme/l13-gerade-eingaben-loesung.visustruct":k8,"../../lessons/diagramme/l13-gerade-zaehlen.visustruct":S8,"../../lessons/diagramme/l13-java-fehler-loesung.visustruct":_8,"../../lessons/diagramme/l13-java-fehler-start.visustruct":T8,"../../lessons/diagramme/l13-java-quadrate-loesung.visustruct":O8,"../../lessons/diagramme/l13-rechteck-loesung.visustruct":A8,"../../lessons/diagramme/l14-array-durchlaufen.visustruct":P8,"../../lessons/diagramme/l14-erster-letzter-loesung.visustruct":j8,"../../lessons/diagramme/l14-java-fehler-loesung.visustruct":C8,"../../lessons/diagramme/l14-java-fehler-start.visustruct":B8,"../../lessons/diagramme/l14-java-treppe-loesung.visustruct":D8,"../../lessons/diagramme/l14-namen-eingeben.visustruct":Z8,"../../lessons/diagramme/l14-rueckwaerts-loesung.visustruct":M8,"../../lessons/diagramme/l14-summe-max-loesung.visustruct":L8,"../../lessons/diagramme/l14-summe-maximum.visustruct":W8,"../../lessons/diagramme/l15-bis-null-loesung.visustruct":E8,"../../lessons/diagramme/l15-endlos-aussprung.visustruct":N8,"../../lessons/diagramme/l15-flaeche-loesung.visustruct":F8,"../../lessons/diagramme/l15-flaeche-unterprogramm-loesung.visustruct":J8,"../../lessons/diagramme/l15-hauptprogramm.visustruct":R8,"../../lessons/diagramme/l15-java-fehler-loesung.visustruct":G8,"../../lessons/diagramme/l15-java-fehler-start.visustruct":H8,"../../lessons/diagramme/l15-java-noten-loesung.visustruct":V8,"../../lessons/diagramme/l15-quadrat-haupt.visustruct":Q8,"../../lessons/diagramme/l15-quadrat.visustruct":q8,"../../lessons/diagramme/l15-titel-loesung.visustruct":U8,"../../lessons/diagramme/l15-unterprogramm.visustruct":$8,"../../lessons/diagramme/l15-zeige-summe-haupt.visustruct":Y8,"../../lessons/diagramme/l15-zeige-summe.visustruct":X8,"../../lessons/diagramme/l16-countdown-loesung.visustruct":K8,"../../lessons/diagramme/l16-countdown-start.visustruct":eS,"../../lessons/diagramme/l16-java-fehler-loesung.visustruct":tS,"../../lessons/diagramme/l16-java-fehler-start.visustruct":nS,"../../lessons/diagramme/l16-java-punkte-loesung.visustruct":iS,"../../lessons/diagramme/l16-schreibtisch.visustruct":aS,"../../lessons/diagramme/l16-summe-loesung.visustruct":sS,"../../lessons/diagramme/l16-summe-start.visustruct":rS,"../../lessons/diagramme/l17-beispiel.visustruct":oS,"../../lessons/diagramme/l17-fakultaet-loesung.visustruct":lS,"../../lessons/diagramme/l17-java-brief-loesung.visustruct":uS,"../../lessons/diagramme/l17-java-brief-start.visustruct":mS,"../../lessons/diagramme/l17-java-fehler-loesung.visustruct":cS,"../../lessons/diagramme/l17-java-fehler-start.visustruct":dS,"../../lessons/diagramme/l17-java-passwort-loesung.visustruct":hS,"../../lessons/diagramme/l17-ticket-loesung.visustruct":gS,"../../lessons/diagramme/l18-beispiel.visustruct":pS,"../../lessons/diagramme/l18-java-fehler-loesung.visustruct":fS,"../../lessons/diagramme/l18-java-fehler-start.visustruct":xS,"../../lessons/diagramme/l18-java-kasse-loesung.visustruct":bS,"../../lessons/diagramme/l18-js-loesung.visustruct":vS,"../../lessons/diagramme/l18-python-loesung.visustruct":yS,"../../lessons/diagramme/l19-java-fehler-loesung.visustruct":wS,"../../lessons/diagramme/l19-java-fehler-start.visustruct":zS,"../../lessons/diagramme/l19-java-zaehlen-loesung.visustruct":IS,"../../lessons/diagramme/l2-ausgabe.visustruct":kS,"../../lessons/diagramme/l2-hallo-loesung.visustruct":SS,"../../lessons/diagramme/l2-zwei-zeilen-loesung.visustruct":_S,"../../lessons/diagramme/l20-countdown-loesung.visustruct":TS,"../../lessons/diagramme/l23-java-ergaenzen-loesung.visustruct":OS,"../../lessons/diagramme/l23-java-ergaenzen-start.visustruct":AS,"../../lessons/diagramme/l23-java-nummern-loesung.visustruct":PS,"../../lessons/diagramme/l23-java-nummern-start.visustruct":jS,"../../lessons/diagramme/l24-java-fuchs-loesung.visustruct":CS,"../../lessons/diagramme/l24-java-fuchs-start.visustruct":BS,"../../lessons/diagramme/l24-java-laengster-loesung.visustruct":DS,"../../lessons/diagramme/l24-java-laengster-start.visustruct":ZS,"../../lessons/diagramme/l25-java-beste-loesung.visustruct":MS,"../../lessons/diagramme/l25-java-beste-start.visustruct":LS,"../../lessons/diagramme/l25-java-schnitt-loesung.visustruct":WS,"../../lessons/diagramme/l25-java-schnitt-start.visustruct":ES,"../../lessons/diagramme/l26-java-namen-loesung.visustruct":NS,"../../lessons/diagramme/l26-java-namen-start.visustruct":FS,"../../lessons/diagramme/l26-java-schreiben-loesung.visustruct":JS,"../../lessons/diagramme/l26-java-schreiben-start.visustruct":RS,"../../lessons/diagramme/l27-java-json-loesung.visustruct":GS,"../../lessons/diagramme/l27-java-json-start.visustruct":HS,"../../lessons/diagramme/l27-java-saetze-loesung.visustruct":VS,"../../lessons/diagramme/l27-java-saetze-start.visustruct":QS,"../../lessons/diagramme/pt/aufgabe-alter-haupt-loesung.visustruct":qS,"../../lessons/diagramme/pt/aufgabe-alter-unterprogramm-loesung.visustruct":US,"../../lessons/diagramme/pt/aufgabe-ballwurf-loesung.visustruct":$S,"../../lessons/diagramme/pt/aufgabe-ballwurf-start.visustruct":YS,"../../lessons/diagramme/pt/aufgabe-bestenliste-loesung.visustruct":XS,"../../lessons/diagramme/pt/aufgabe-binaer-loesung.visustruct":KS,"../../lessons/diagramme/pt/aufgabe-caesar-array-loesung.visustruct":e_,"../../lessons/diagramme/pt/aufgabe-caesar-array-start.visustruct":t_,"../../lessons/diagramme/pt/aufgabe-caesar-ascii-loesung.visustruct":n_,"../../lessons/diagramme/pt/aufgabe-caesar-entschluesseln-loesung.visustruct":i_,"../../lessons/diagramme/pt/aufgabe-collatz-loesung.visustruct":a_,"../../lessons/diagramme/pt/aufgabe-durchschnitt-loesung.visustruct":s_,"../../lessons/diagramme/pt/aufgabe-fibonacci-loesung.visustruct":r_,"../../lessons/diagramme/pt/aufgabe-gerade-loesung.visustruct":o_,"../../lessons/diagramme/pt/aufgabe-mehrwertsteuer-loesung.visustruct":l_,"../../lessons/diagramme/pt/aufgabe-pin-java-loesung.visustruct":u_,"../../lessons/diagramme/pt/aufgabe-pin-loesung.visustruct":m_,"../../lessons/diagramme/pt/aufgabe-rechner-loesung.visustruct":c_,"../../lessons/diagramme/pt/aufgabe-schiffe-loesung.visustruct":d_,"../../lessons/diagramme/pt/aufgabe-schiffe-start.visustruct":h_,"../../lessons/diagramme/pt/aufgabe-speisekarte-loesung.visustruct":g_,"../../lessons/diagramme/pt/aufgabe-summe-loesung.visustruct":p_,"../../lessons/diagramme/pt/aufgabe-tafeldienst-loesung.visustruct":f_,"../../lessons/diagramme/pt/aufgabe-verdoppeln-loesung.visustruct":x_,"../../lessons/diagramme/pt/aufgabe-verleih-java-loesung.visustruct":b_,"../../lessons/diagramme/pt/aufgabe-verleih-loesung.visustruct":v_,"../../lessons/diagramme/pt/aufgabe-vokabeln-loesung.visustruct":y_,"../../lessons/diagramme/pt/aufgabe-vokabeln-start.visustruct":w_,"../../lessons/diagramme/pt/aufgabe-volljaehrig-loesung.visustruct":z_,"../../lessons/diagramme/pt/dt-buffered.visustruct":I_,"../../lessons/diagramme/pt/dt-csv.visustruct":k_,"../../lessons/diagramme/pt/dt-json.visustruct":S_,"../../lessons/diagramme/pt/dt-lesen.visustruct":__,"../../lessons/diagramme/pt/kino-einmaleins-loesung.visustruct":T_,"../../lessons/diagramme/pt/kino-frei-loesung.visustruct":O_,"../../lessons/diagramme/pt/kino-frei-start.visustruct":A_,"../../lessons/diagramme/pt/kino-karte-loesung.visustruct":P_,"../../lessons/diagramme/pt/kino-karte-start.visustruct":j_,"../../lessons/diagramme/pt/kino-saalplan.visustruct":C_,"../../lessons/diagramme/pt/kino-verkaufen.visustruct":B_,"../../lessons/diagramme/pt/l04-java-fehler-loesung.visustruct":D_,"../../lessons/diagramme/pt/l04-java-fehler-start.visustruct":Z_,"../../lessons/diagramme/pt/l04-java-steckbrief-loesung.visustruct":M_,"../../lessons/diagramme/pt/l04-rechnen.visustruct":L_,"../../lessons/diagramme/pt/l04-reihenfolge-loesung.visustruct":W_,"../../lessons/diagramme/pt/l04-reihenfolge-start.visustruct":E_,"../../lessons/diagramme/pt/l04-tauschen-loesung.visustruct":N_,"../../lessons/diagramme/pt/l04-tauschen-start.visustruct":F_,"../../lessons/diagramme/pt/l04-tauschen.visustruct":J_,"../../lessons/diagramme/pt/l05-datentypen.visustruct":R_,"../../lessons/diagramme/pt/l05-division.visustruct":G_,"../../lessons/diagramme/pt/l05-einkauf-loesung.visustruct":H_,"../../lessons/diagramme/pt/l05-java-fehler-loesung.visustruct":V_,"../../lessons/diagramme/pt/l05-java-fehler-start.visustruct":Q_,"../../lessons/diagramme/pt/l05-java-kino-loesung.visustruct":q_,"../../lessons/diagramme/pt/l05-rechteck-loesung.visustruct":U_,"../../lessons/diagramme/pt/l05-sekunden-loesung.visustruct":$_,"../../lessons/diagramme/pt/l05-sekunden-start.visustruct":Y_,"../../lessons/diagramme/pt/l06-begruessung-loesung.visustruct":X_,"../../lessons/diagramme/pt/l06-eva.visustruct":K_,"../../lessons/diagramme/pt/l06-java-fehler-loesung.visustruct":eT,"../../lessons/diagramme/pt/l06-java-fehler-start.visustruct":tT,"../../lessons/diagramme/pt/l06-java-tage-loesung.visustruct":nT,"../../lessons/diagramme/pt/l06-mittelwert-loesung.visustruct":iT,"../../lessons/diagramme/pt/l06-rechner-loesung.visustruct":aT,"../../lessons/diagramme/pt/l07-alter-pruefen.visustruct":sT,"../../lessons/diagramme/pt/l07-betrag-loesung.visustruct":rT,"../../lessons/diagramme/pt/l07-gerade-loesung.visustruct":oT,"../../lessons/diagramme/pt/l07-java-fehler-loesung.visustruct":lT,"../../lessons/diagramme/pt/l07-java-fehler-start.visustruct":uT,"../../lessons/diagramme/pt/l07-java-pizza-loesung.visustruct":mT,"../../lessons/diagramme/pt/l07-java-pizza-start.visustruct":cT,"../../lessons/diagramme/pt/l07-maximum-loesung.visustruct":dT,"../../lessons/diagramme/pt/l07-rabatt.visustruct":hT,"../../lessons/diagramme/pt/l08-gueltig-loesung.visustruct":gT,"../../lessons/diagramme/pt/l08-java-bestanden-loesung.visustruct":pT,"../../lessons/diagramme/pt/l08-java-fehler-loesung.visustruct":fT,"../../lessons/diagramme/pt/l08-java-fehler-start.visustruct":xT,"../../lessons/diagramme/pt/l08-jugendticket.visustruct":bT,"../../lessons/diagramme/pt/l08-note.visustruct":vT,"../../lessons/diagramme/pt/l08-schaltjahr-loesung.visustruct":yT,"../../lessons/diagramme/pt/l08-wochenende-loesung.visustruct":wT,"../../lessons/diagramme/pt/l09-ampel.visustruct":zT,"../../lessons/diagramme/pt/l09-automat.visustruct":IT,"../../lessons/diagramme/pt/l09-java-fehler-loesung.visustruct":kT,"../../lessons/diagramme/pt/l09-java-fehler-start.visustruct":ST,"../../lessons/diagramme/pt/l09-java-schule-loesung.visustruct":_T,"../../lessons/diagramme/pt/l09-note-loesung.visustruct":TT,"../../lessons/diagramme/pt/l09-rechner-loesung.visustruct":OT,"../../lessons/diagramme/pt/l09-verschachtelt.visustruct":AT,"../../lessons/diagramme/pt/l1-grundbausteine.visustruct":PT,"../../lessons/diagramme/pt/l1-sequenz.visustruct":jT,"../../lessons/diagramme/pt/l1-tee.visustruct":CT,"../../lessons/diagramme/pt/l1-verzweigung.visustruct":BT,"../../lessons/diagramme/pt/l1-wiederholung.visustruct":DT,"../../lessons/diagramme/pt/l10-bis-n-loesung.visustruct":ZT,"../../lessons/diagramme/pt/l10-countdown.visustruct":MT,"../../lessons/diagramme/pt/l10-endlos.visustruct":LT,"../../lessons/diagramme/pt/l10-fakultaet.visustruct":WT,"../../lessons/diagramme/pt/l10-java-fehler-loesung.visustruct":ET,"../../lessons/diagramme/pt/l10-java-fehler-start.visustruct":NT,"../../lessons/diagramme/pt/l10-java-wuerfel-loesung.visustruct":FT,"../../lessons/diagramme/pt/l10-verdoppeln-loesung.visustruct":JT,"../../lessons/diagramme/pt/l11-eingabe-pruefen.visustruct":RT,"../../lessons/diagramme/pt/l11-einmal.visustruct":GT,"../../lessons/diagramme/pt/l11-java-fehler-loesung.visustruct":HT,"../../lessons/diagramme/pt/l11-java-fehler-start.visustruct":VT,"../../lessons/diagramme/pt/l11-java-gerade-loesung.visustruct":QT,"../../lessons/diagramme/pt/l11-note-loesung.visustruct":qT,"../../lessons/diagramme/pt/l11-summe-loesung.visustruct":UT,"../../lessons/diagramme/pt/l12-countdown-loesung.visustruct":$T,"../../lessons/diagramme/pt/l12-einmaleins-loesung.visustruct":YT,"../../lessons/diagramme/pt/l12-eins-bis-fuenf.visustruct":XT,"../../lessons/diagramme/pt/l12-java-fehler-loesung.visustruct":KT,"../../lessons/diagramme/pt/l12-java-fehler-start.visustruct":eO,"../../lessons/diagramme/pt/l12-java-verdoppeln-loesung.visustruct":tO,"../../lessons/diagramme/pt/l12-summe.visustruct":nO,"../../lessons/diagramme/pt/l13-dreieck.visustruct":iO,"../../lessons/diagramme/pt/l13-gerade-eingaben-loesung.visustruct":aO,"../../lessons/diagramme/pt/l13-gerade-zaehlen.visustruct":sO,"../../lessons/diagramme/pt/l13-java-fehler-loesung.visustruct":rO,"../../lessons/diagramme/pt/l13-java-fehler-start.visustruct":oO,"../../lessons/diagramme/pt/l13-java-quadrate-loesung.visustruct":lO,"../../lessons/diagramme/pt/l13-rechteck-loesung.visustruct":uO,"../../lessons/diagramme/pt/l14-array-durchlaufen.visustruct":mO,"../../lessons/diagramme/pt/l14-erster-letzter-loesung.visustruct":cO,"../../lessons/diagramme/pt/l14-java-fehler-loesung.visustruct":dO,"../../lessons/diagramme/pt/l14-java-fehler-start.visustruct":hO,"../../lessons/diagramme/pt/l14-java-treppe-loesung.visustruct":gO,"../../lessons/diagramme/pt/l14-namen-eingeben.visustruct":pO,"../../lessons/diagramme/pt/l14-rueckwaerts-loesung.visustruct":fO,"../../lessons/diagramme/pt/l14-summe-max-loesung.visustruct":xO,"../../lessons/diagramme/pt/l14-summe-maximum.visustruct":bO,"../../lessons/diagramme/pt/l15-bis-null-loesung.visustruct":vO,"../../lessons/diagramme/pt/l15-endlos-aussprung.visustruct":yO,"../../lessons/diagramme/pt/l15-flaeche-loesung.visustruct":wO,"../../lessons/diagramme/pt/l15-hauptprogramm.visustruct":zO,"../../lessons/diagramme/pt/l15-java-fehler-loesung.visustruct":IO,"../../lessons/diagramme/pt/l15-java-fehler-start.visustruct":kO,"../../lessons/diagramme/pt/l15-java-noten-loesung.visustruct":SO,"../../lessons/diagramme/pt/l15-quadrat-haupt.visustruct":_O,"../../lessons/diagramme/pt/l15-quadrat.visustruct":TO,"../../lessons/diagramme/pt/l15-titel-loesung.visustruct":OO,"../../lessons/diagramme/pt/l15-unterprogramm.visustruct":AO,"../../lessons/diagramme/pt/l15-zeige-summe-haupt.visustruct":PO,"../../lessons/diagramme/pt/l15-zeige-summe.visustruct":jO,"../../lessons/diagramme/pt/l16-countdown-loesung.visustruct":CO,"../../lessons/diagramme/pt/l16-countdown-start.visustruct":BO,"../../lessons/diagramme/pt/l16-java-fehler-loesung.visustruct":DO,"../../lessons/diagramme/pt/l16-java-fehler-start.visustruct":ZO,"../../lessons/diagramme/pt/l16-java-punkte-loesung.visustruct":MO,"../../lessons/diagramme/pt/l16-schreibtisch.visustruct":LO,"../../lessons/diagramme/pt/l16-summe-loesung.visustruct":WO,"../../lessons/diagramme/pt/l16-summe-start.visustruct":EO,"../../lessons/diagramme/pt/l17-beispiel.visustruct":NO,"../../lessons/diagramme/pt/l17-fakultaet-loesung.visustruct":FO,"../../lessons/diagramme/pt/l17-java-brief-loesung.visustruct":JO,"../../lessons/diagramme/pt/l17-java-brief-start.visustruct":RO,"../../lessons/diagramme/pt/l17-java-fehler-loesung.visustruct":GO,"../../lessons/diagramme/pt/l17-java-fehler-start.visustruct":HO,"../../lessons/diagramme/pt/l17-java-passwort-loesung.visustruct":VO,"../../lessons/diagramme/pt/l17-ticket-loesung.visustruct":QO,"../../lessons/diagramme/pt/l18-beispiel.visustruct":qO,"../../lessons/diagramme/pt/l18-java-fehler-loesung.visustruct":UO,"../../lessons/diagramme/pt/l18-java-fehler-start.visustruct":$O,"../../lessons/diagramme/pt/l18-java-kasse-loesung.visustruct":YO,"../../lessons/diagramme/pt/l18-js-loesung.visustruct":XO,"../../lessons/diagramme/pt/l18-python-loesung.visustruct":KO,"../../lessons/diagramme/pt/l19-java-fehler-loesung.visustruct":eA,"../../lessons/diagramme/pt/l19-java-fehler-start.visustruct":tA,"../../lessons/diagramme/pt/l19-java-zaehlen-loesung.visustruct":nA,"../../lessons/diagramme/pt/l2-ausgabe.visustruct":iA,"../../lessons/diagramme/pt/l2-hallo-loesung.visustruct":aA,"../../lessons/diagramme/pt/l2-zwei-zeilen-loesung.visustruct":sA,"../../lessons/diagramme/pt/l23-java-ergaenzen-loesung.visustruct":rA,"../../lessons/diagramme/pt/l23-java-ergaenzen-start.visustruct":oA,"../../lessons/diagramme/pt/l23-java-nummern-loesung.visustruct":lA,"../../lessons/diagramme/pt/l23-java-nummern-start.visustruct":uA,"../../lessons/diagramme/pt/l24-java-fuchs-loesung.visustruct":mA,"../../lessons/diagramme/pt/l24-java-fuchs-start.visustruct":cA,"../../lessons/diagramme/pt/l24-java-laengster-loesung.visustruct":dA,"../../lessons/diagramme/pt/l24-java-laengster-start.visustruct":hA,"../../lessons/diagramme/pt/l25-java-beste-loesung.visustruct":gA,"../../lessons/diagramme/pt/l25-java-beste-start.visustruct":pA,"../../lessons/diagramme/pt/l25-java-schnitt-loesung.visustruct":fA,"../../lessons/diagramme/pt/l25-java-schnitt-start.visustruct":xA,"../../lessons/diagramme/pt/l26-java-namen-loesung.visustruct":bA,"../../lessons/diagramme/pt/l26-java-namen-start.visustruct":vA,"../../lessons/diagramme/pt/l26-java-schreiben-loesung.visustruct":yA,"../../lessons/diagramme/pt/l26-java-schreiben-start.visustruct":wA,"../../lessons/diagramme/pt/l27-java-json-loesung.visustruct":zA,"../../lessons/diagramme/pt/l27-java-json-start.visustruct":IA,"../../lessons/diagramme/pt/l27-java-saetze-loesung.visustruct":kA,"../../lessons/diagramme/pt/l27-java-saetze-start.visustruct":SA,"../../lessons/diagramme/pt/sim-kino-loesung.visustruct":_A,"../../lessons/diagramme/pt/sim-kino-start.visustruct":TA,"../../lessons/diagramme/pt/sim-tausch-loesung.visustruct":OA,"../../lessons/diagramme/pt/sim-tausch-start.visustruct":AA,"../../lessons/diagramme/pt/sim-tausch.visustruct":PA,"../../lessons/diagramme/pt/ss-absteigend-loesung.visustruct":jA,"../../lessons/diagramme/pt/ss-absteigend-start.visustruct":CA,"../../lessons/diagramme/pt/ss-binaere-suche.visustruct":BA,"../../lessons/diagramme/pt/ss-bubblesort.visustruct":DA,"../../lessons/diagramme/pt/ss-karte-suchen-loesung.visustruct":ZA,"../../lessons/diagramme/pt/ss-lineare-suche.visustruct":MA,"../../lessons/diagramme/pt/uebergabe-bonus-loesung.visustruct":LA,"../../lessons/diagramme/pt/uebergabe-bonus-start.visustruct":WA,"../../lessons/diagramme/pt/uebergabe-bonus-unterprogramm-loesung.visustruct":EA,"../../lessons/diagramme/pt/uebergabe-haupt.visustruct":NA,"../../lessons/diagramme/pt/uebergabe-leeren.visustruct":FA,"../../lessons/diagramme/pt/uebergabe-verdopple.visustruct":JA,"../../lessons/diagramme/pt/zk-initialen-loesung.visustruct":RA,"../../lessons/diagramme/pt/zk-mehr.visustruct":GA,"../../lessons/diagramme/pt/zk-rueckwaerts-loesung.visustruct":HA,"../../lessons/diagramme/pt/zk-split.visustruct":VA,"../../lessons/diagramme/pt/zk-woerter-loesung.visustruct":QA,"../../lessons/diagramme/pt/zk-zaehlen.visustruct":qA,"../../lessons/diagramme/pt/zk-zeichen.visustruct":UA,"../../lessons/diagramme/sim-kino-loesung.visustruct":$A,"../../lessons/diagramme/sim-kino-start.visustruct":YA,"../../lessons/diagramme/sim-tausch-loesung.visustruct":XA,"../../lessons/diagramme/sim-tausch-start.visustruct":KA,"../../lessons/diagramme/sim-tausch.visustruct":eP,"../../lessons/diagramme/ss-absteigend-loesung.visustruct":tP,"../../lessons/diagramme/ss-absteigend-start.visustruct":nP,"../../lessons/diagramme/ss-binaere-suche.visustruct":iP,"../../lessons/diagramme/ss-bubblesort.visustruct":aP,"../../lessons/diagramme/ss-karte-suchen-loesung.visustruct":sP,"../../lessons/diagramme/ss-lineare-suche.visustruct":rP,"../../lessons/diagramme/uebergabe-bonus-loesung.visustruct":oP,"../../lessons/diagramme/uebergabe-bonus-start.visustruct":lP,"../../lessons/diagramme/uebergabe-bonus-unterprogramm-loesung.visustruct":uP,"../../lessons/diagramme/uebergabe-haupt.visustruct":mP,"../../lessons/diagramme/uebergabe-leeren.visustruct":cP,"../../lessons/diagramme/uebergabe-verdopple.visustruct":dP,"../../lessons/diagramme/vb-abstand-anzeigen-loesung.visustruct":hP,"../../lessons/diagramme/vb-abstand-halten-loesung.visustruct":gP,"../../lessons/diagramme/vb-alarmanlage-loesung.visustruct":pP,"../../lessons/diagramme/vb-ampel-loesung.visustruct":fP,"../../lessons/diagramme/vb-ausgang-loesung.visustruct":xP,"../../lessons/diagramme/vb-begruessung-loesung.visustruct":bP,"../../lessons/diagramme/vb-binaer-zaehlen-loesung.visustruct":vP,"../../lessons/diagramme/vb-bis-rot-loesung.visustruct":yP,"../../lessons/diagramme/vb-bis-wand-loesung.visustruct":wP,"../../lessons/diagramme/vb-bis-ziel-loesung.visustruct":zP,"../../lessons/diagramme/vb-buchstaben-loesung.visustruct":IP,"../../lessons/diagramme/vb-drei-lichter-loesung.visustruct":kP,"../../lessons/diagramme/vb-dreieck-loesung.visustruct":SP,"../../lessons/diagramme/vb-einparken-loesung.visustruct":_P,"../../lessons/diagramme/vb-farben-loesung.visustruct":TP,"../../lessons/diagramme/vb-farbweiche-loesung.visustruct":OP,"../../lessons/diagramme/vb-gas-bis-wand-loesung.visustruct":AP,"../../lessons/diagramme/vb-gerade-loesung.visustruct":PP,"../../lessons/diagramme/vb-hindernis-loesung.visustruct":jP,"../../lessons/diagramme/vb-java-akku-loesung.visustruct":CP,"../../lessons/diagramme/vb-java-blau-gruen-loesung.visustruct":BP,"../../lessons/diagramme/vb-java-blinken-loesung.visustruct":DP,"../../lessons/diagramme/vb-java-countdown-loesung.visustruct":ZP,"../../lessons/diagramme/vb-java-hoeher-loesung.visustruct":MP,"../../lessons/diagramme/vb-java-joystick-loesung.visustruct":LP,"../../lessons/diagramme/vb-java-laermampel-loesung.visustruct":WP,"../../lessons/diagramme/vb-java-lauflicht-loesung.visustruct":EP,"../../lessons/diagramme/vb-java-linienfolger-loesung.visustruct":NP,"../../lessons/diagramme/vb-java-nachtlicht-ton-loesung.visustruct":FP,"../../lessons/diagramme/vb-java-rand-loesung.visustruct":JP,"../../lessons/diagramme/vb-java-rechteck-loesung.visustruct":RP,"../../lessons/diagramme/vb-java-textlaenge-loesung.visustruct":GP,"../../lessons/diagramme/vb-java-wand-piep-loesung.visustruct":HP,"../../lessons/diagramme/vb-java-wasserwaage-loesung.visustruct":VP,"../../lessons/diagramme/vb-klatschen-loesung.visustruct":QP,"../../lessons/diagramme/vb-knight-rider-loesung.visustruct":qP,"../../lessons/diagramme/vb-labyrinth-loesung.visustruct":UP,"../../lessons/diagramme/vb-linienfolger-stopp-loesung.visustruct":$P,"../../lessons/diagramme/vb-linienmuster-loesung.visustruct":YP,"../../lessons/diagramme/vb-melodie-loesung.visustruct":XP,"../../lessons/diagramme/vb-morsen-loesung.visustruct":KP,"../../lessons/diagramme/vb-nachtlicht-loesung.visustruct":ej,"../../lessons/diagramme/vb-nachtwaechter-loesung.visustruct":tj,"../../lessons/diagramme/vb-ohne-noten-loesung.visustruct":nj,"../../lessons/diagramme/vb-ohne-quadratzahl-loesung.visustruct":ij,"../../lessons/diagramme/vb-ohne-quadratzahl-unterprogramm-loesung.visustruct":aj,"../../lessons/diagramme/vb-ohne-rueckwaerts-loesung.visustruct":sj,"../../lessons/diagramme/vb-ohne-strecke-loesung.visustruct":rj,"../../lessons/diagramme/vb-ohne-summe-loesung.visustruct":oj,"../../lessons/diagramme/vb-quadrat-loesung.visustruct":lj,"../../lessons/diagramme/vb-quadrat-methode-loesung.visustruct":uj,"../../lessons/diagramme/vb-quadrat-schleife-loesung.visustruct":mj,"../../lessons/diagramme/vb-quadrat-unterprogramm-loesung.visustruct":cj,"../../lessons/diagramme/vb-quadrat-verschachtelt-loesung.visustruct":dj,"../../lessons/diagramme/vb-rand-loesung.visustruct":hj,"../../lessons/diagramme/vb-schraeglage-loesung.visustruct":gj,"../../lessons/diagramme/vb-slalom-loesung.visustruct":pj,"../../lessons/diagramme/vb-spirale-loesung.visustruct":fj,"../../lessons/diagramme/vb-start-a-loesung.visustruct":xj,"../../lessons/diagramme/vb-tonleiter-loesung.visustruct":bj,"../../lessons/diagramme/vb-treppe-loesung.visustruct":vj,"../../lessons/diagramme/vb-tunnel-loesung.visustruct":yj,"../../lessons/diagramme/vb-variable-seite-loesung.visustruct":wj,"../../lessons/diagramme/vb-vier-quadrate-loesung.visustruct":zj,"../../lessons/diagramme/vb-wald-loesung.visustruct":Ij,"../../lessons/diagramme/vb-wand-vorn-loesung.visustruct":kj,"../../lessons/diagramme/vb-zwei-sekunden-loesung.visustruct":Sj,"../../lessons/diagramme/zk-initialen-loesung.visustruct":_j,"../../lessons/diagramme/zk-mehr.visustruct":Tj,"../../lessons/diagramme/zk-rueckwaerts-loesung.visustruct":Oj,"../../lessons/diagramme/zk-split.visustruct":Aj,"../../lessons/diagramme/zk-woerter-loesung.visustruct":Pj,"../../lessons/diagramme/zk-zaehlen.visustruct":jj,"../../lessons/diagramme/zk-zeichen.visustruct":Cj}),YB=Object.assign({"../../lessons/welten/ausgang-1.txt":Bj,"../../lessons/welten/ausgang-2.txt":Dj,"../../lessons/welten/ecke.txt":Zj,"../../lessons/welten/farbe-1.txt":Mj,"../../lessons/welten/farbe-2.txt":Lj,"../../lessons/welten/farbe-3.txt":Wj,"../../lessons/welten/farbe-4.txt":Ej,"../../lessons/welten/hindernis-1.txt":Nj,"../../lessons/welten/hindernis-2.txt":Fj,"../../lessons/welten/labyrinth-1.txt":Jj,"../../lessons/welten/labyrinth-2.txt":Rj,"../../lessons/welten/linie-1.txt":Gj,"../../lessons/welten/linie-2.txt":Hj,"../../lessons/welten/linie-rot-1.txt":Vj,"../../lessons/welten/linie-rot-2.txt":Qj,"../../lessons/welten/parken-1.txt":qj,"../../lessons/welten/parken-2.txt":Uj,"../../lessons/welten/rand-1.txt":$j,"../../lessons/welten/rand-2.txt":Yj,"../../lessons/welten/slalom.txt":Xj,"../../lessons/welten/tunnel-1.txt":Kj,"../../lessons/welten/tunnel-2.txt":eC,"../../lessons/welten/wald-1.txt":tC,"../../lessons/welten/wald-2.txt":nC,"../../lessons/welten/wand-frei.txt":iC,"../../lessons/welten/wand-kurz.txt":aC,"../../lessons/welten/wand-lang.txt":sC,"../../lessons/welten/wand-mittel.txt":rC,"../../lessons/welten/wand-nah.txt":oC,"../../lessons/welten/zeit-1.txt":lC,"../../lessons/welten/ziel-kurz.txt":uC,"../../lessons/welten/ziel-lang.txt":mC}),XB=Object.assign({"../../lessons/bilder/aufgabe-mehrwertsteuer.svg":cC,"../../lessons/bilder/ben-shneiderman.jpg":dC,"../../lessons/bilder/caesar-ascii.svg":hC,"../../lessons/bilder/caesar-scheibe.svg":gC,"../../lessons/bilder/caesar-verschiebung.svg":pC,"../../lessons/bilder/en/aufgabe-mehrwertsteuer.svg":fC,"../../lessons/bilder/en/kino-saal.svg":xC,"../../lessons/bilder/en/kino-schleifen.svg":bC,"../../lessons/bilder/en/l01-pap.svg":vC,"../../lessons/bilder/en/l02-einfuegen.svg":yC,"../../lessons/bilder/en/l04-variable.svg":wC,"../../lessons/bilder/en/l04-zuweisung.svg":zC,"../../lessons/bilder/en/l05-tauschen.svg":IC,"../../lessons/bilder/en/l08-zahlenstrahl.svg":kC,"../../lessons/bilder/en/l10-kopfgesteuert.svg":SC,"../../lessons/bilder/en/l11-vergleich.svg":_C,"../../lessons/bilder/en/l12-for-ablauf.svg":TC,"../../lessons/bilder/en/l14-array.svg":OC,"../../lessons/bilder/en/mvc-klick.svg":AC,"../../lessons/bilder/en/ss-binaere-suche.svg":PC,"../../lessons/bilder/en/ss-bubblesort.svg":jC,"../../lessons/bilder/en/ss-lineare-suche.svg":CC,"../../lessons/bilder/en/ss-vergleiche.svg":BC,"../../lessons/bilder/en/uebergabe.svg":DC,"../../lessons/bilder/en/zk-zeichen.svg":ZC,"../../lessons/bilder/ike-nassi.jpg":MC,"../../lessons/bilder/kino-saal.svg":LC,"../../lessons/bilder/kino-schleifen.svg":WC,"../../lessons/bilder/l01-pap.svg":EC,"../../lessons/bilder/l02-einfuegen.svg":NC,"../../lessons/bilder/l04-variable.svg":FC,"../../lessons/bilder/l04-zuweisung.svg":JC,"../../lessons/bilder/l05-tauschen.svg":RC,"../../lessons/bilder/l08-zahlenstrahl.svg":GC,"../../lessons/bilder/l09-wahrheitstabelle.svg":HC,"../../lessons/bilder/l10-kopfgesteuert.svg":VC,"../../lessons/bilder/l11-vergleich.svg":QC,"../../lessons/bilder/l12-for-ablauf.svg":qC,"../../lessons/bilder/l14-array.svg":UC,"../../lessons/bilder/mvc-klick.svg":$C,"../../lessons/bilder/pt/aufgabe-mehrwertsteuer.svg":YC,"../../lessons/bilder/pt/kino-saal.svg":XC,"../../lessons/bilder/pt/kino-schleifen.svg":KC,"../../lessons/bilder/pt/l01-pap.svg":eB,"../../lessons/bilder/pt/l02-einfuegen.svg":tB,"../../lessons/bilder/pt/l04-variable.svg":nB,"../../lessons/bilder/pt/l04-zuweisung.svg":iB,"../../lessons/bilder/pt/l05-tauschen.svg":aB,"../../lessons/bilder/pt/l08-zahlenstrahl.svg":sB,"../../lessons/bilder/pt/l10-kopfgesteuert.svg":rB,"../../lessons/bilder/pt/l11-vergleich.svg":oB,"../../lessons/bilder/pt/l12-for-ablauf.svg":lB,"../../lessons/bilder/pt/l14-array.svg":uB,"../../lessons/bilder/pt/mvc-klick.svg":mB,"../../lessons/bilder/pt/schiffe-versenken.svg":cB,"../../lessons/bilder/pt/ss-binaere-suche.svg":dB,"../../lessons/bilder/pt/ss-bubblesort.svg":hB,"../../lessons/bilder/pt/ss-lineare-suche.svg":gB,"../../lessons/bilder/pt/ss-vergleiche.svg":pB,"../../lessons/bilder/pt/uebergabe.svg":fB,"../../lessons/bilder/pt/zk-zeichen.svg":xB,"../../lessons/bilder/schiffe-versenken.svg":bB,"../../lessons/bilder/ss-binaere-suche.svg":vB,"../../lessons/bilder/ss-bubblesort.svg":yB,"../../lessons/bilder/ss-lineare-suche.svg":wB,"../../lessons/bilder/ss-vergleiche.svg":zB,"../../lessons/bilder/uebergabe.svg":IB,"../../lessons/bilder/zk-zeichen.svg":kB}),Rh=i=>i.replace(/^.*\//,"");function F1(i,e,t){const n=s=>new Map(Object.entries(i).filter(([r])=>{var o;return((o=e.exec(r))==null?void 0:o[1])===s}).map(([r,o])=>[Rh(r),o]));return[...new Map([...n("en"),...t==="en"?[]:n(t)])]}function Mu(i){return i==="de"?"de":i==="pt-PT"?"pt":"en"}let w1="en",Ot=[],Tn=[],Ma="",La=[],ds="off";function Lu(i){i!==ds&&(ds=i,Ot=[],hs(w1))}function hs(i){var s,r,o;if(t3(i),i===w1&&Ot.length>0)return;w1=i;const e=F1(QB,/\/lessons\/([^/]+)\/[^/]+\.md$/,i),t=(l,u)=>l.filter(([m])=>/^\d+/.test(m)).map(([m,c])=>HB(Nu(c,u),`${i}/${m}`)).sort((m,c)=>m.number-c.number),n=(l,u,m)=>l.map(([c,d])=>{const h=VB(Nu(d,m),`${i}/${u}${c}`);return m&&h.after!==void 0?{...h,after:m.get(h.after)??h.after}:h}),a=F1(qB,/\/lessons\/([^/]+)\/aufgaben\/[^/]+\.md$/,i);if(ds==="on"){const l=F1(Zu,/\/lessons\/([^/]+)\/visubot\/[^/]+\.md$/,i),u=KB(Eu(e),Eu(l)),m=t(e,u.normal),c=h=>{var g;return((g=[...m].reverse().find(f=>u.normal.get(f.number)({...h,number:u.normal.get(h.number)})),...t(l,u.robot).map(h=>{const g=u.robot.get(h.number);return{...h,number:g,section:c(g),robot:!0}})].sort((h,g)=>h.number-g.number);const d=F1(UB,/\/lessons\/([^/]+)\/visubot\/aufgaben\/[^/]+\.md$/,i);Tn=[...n(a,"aufgaben/",u.normal),...n(d,"visubot/aufgaben/",u.robot).map(h=>({...h,robot:!0}))]}else Ot=t(e),Tn=n(a,"aufgaben/");Tn.sort((l,u)=>(l.after??0)-(u.after??0)||l.level-u.level||l.title.localeCompare(u.title,i));for(const l of[...Ot.flatMap(u=>u.steps.flatMap(m=>m.blocks)),...Tn.flatMap(u=>u.blocks)])l.kind==="textFile"&&c3(l.name,l.content);if(Ma=((s=e.find(([l])=>l==="nachschlagen.md"))==null?void 0:s[1])??"",ds!=="off"){const l=(r=F1(Zu,/\/lessons\/([^/]+)\/visubot\/[^/]+\.md$/,i).find(([u])=>u==="nachschlagen.md"))==null?void 0:r[1];l&&(Ma=`${Ma.trimEnd()} ${l}`)}La=SB(((o=e.find(([l])=>l==="begriffe.md"))==null?void 0:o[1])??"")}const Wu={1:3,2:5,3:5,4:8,5:11,6:11,7:11,8:11,9:11,10:11,11:11,12:11,13:11,14:11,15:11,16:14,17:15,18:15,19:17,20:17,21:17,22:18},Eu=i=>i.map(([e])=>{var t;return Number((t=/^(\d+)/.exec(e))==null?void 0:t[1])}).filter(Number.isFinite).sort((e,t)=>e-t);function KB(i,e){const t=[...i].reverse().find(o=>o<=19)??i.at(-1)??0,n=o=>i.includes(Wu[o])?Wu[o]:t,a=new Map,s=new Map;let r=1;for(const o of i){a.set(o,r++);for(const l of e.filter(u=>n(u)===o))s.set(l,r++)}return{normal:a,robot:s}}function Nu(i,e){return e?i.replace(/\b(Lektion(?:en)?|Lessons?|Li[cç](?:ão|ões))(\s+\d+(?:\s*(?:,|bis|und|and|to|a|e|–|-)\s*\d+)*)/gi,(t,n,a)=>n+a.replace(/\d+/g,s=>String(e.get(Number(s))??s))):i}hs("en");function Gh(i,e){return w1==="de"?i.get(e)??i.get(`en/${e}`):(w1==="en"?void 0:i.get(`${w1}/${e}`))??i.get(`en/${e}`)??i.get(e)}const Hh=(i,e)=>i.slice(i.indexOf(e)+e.length),eD=new Map(Object.entries($B).map(([i,e])=>[Hh(i,"/diagramme/"),e]));function X1(i){const e=Gh(eD,i);return e===void 0?void 0:Bl(e)}const tD=new Map(Object.entries(XB).map(([i,e])=>[Hh(i,"/bilder/"),e]));function Fu(i){return Gh(tD,i)}const nD=new Map(Object.entries(YB).map(([i,e])=>[Rh(i).replace(/\.txt$/,""),e])),Ju=new Map;function Wa(i){const e=nD.get(i);if(e===void 0)return;let t=Ju.get(i);return t||Ju.set(i,t=Ax(e)),t}const Vh=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,""");function Re(i){const e=[];let t=Vh(i).replace(/`([^`]+)`/g,(n,a)=>(e.push(a),`\0${e.length-1}\0`));return t=t.replace(/\*\*(.+?)\*\*/g,"$1").replace(/(^|[^*])\*([^*\s][^*]*?)\*/g,"$1$2").replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(n,a,s)=>{const r=/^(https?:|mailto:|#|\.{0,2}\/)/.test(s)?s:"#",o=/^https?:/.test(r)?' target="_blank" rel="noopener noreferrer"':"";return`${a}`}).replace(/\[([^\]]+)\]\{\.(blau|orange|gruen|gelb|rosa)\}/g,'$1').replace(/\[([^\]]+)\]\{(?:teil|part)=([\w,]+)\}/g,'$1'),t.replace(/\u0000(\d+)\u0000/g,(n,a)=>`${e[Number(a)]}`)}function kn(i){const e=[],t=i.replace(/\r\n/g,` `).split(` @@ -60311,7 +60497,7 @@ ${l}`)}La=SB(((o=e.find(([l])=>l==="begriffe.md"))==null?void 0:o[1])??"")}const

${Ae(p("simulation_trace"))}

${Ae(p("simulation_variables"))}

${Ae(p("simulation_output"))}

- `;const e=a=>this.element.querySelector(a);this.buttons={play:e("[data-sim=play]"),pause:e("[data-sim=pause]"),step:e("[data-sim=step]"),stop:e("[data-sim=stop]")},this.buttons.play.addEventListener("click",()=>this.play()),this.buttons.pause.addEventListener("click",()=>this.pause()),this.buttons.step.addEventListener("click",()=>this.step()),this.buttons.stop.addEventListener("click",()=>this.reset()),this.editButton=e(".sim-edit"),this.editButton.addEventListener("click",()=>this.onEdit());const t=e("[data-sim=highlight]");t.value=this.highlightMode,t.addEventListener("change",()=>{this.highlightMode=t.value,Vu(Hu,this.highlightMode)});const n=e("[data-sim=delay]");n.value=this.delay,n.addEventListener("change",()=>{this.delay=n.value,Vu(fr,this.delay)}),this.inputSection=e(".sim-input > div"),this.trace=e(".sim-trace"),this.variables=e(".sim-vars"),this.output=e(".sim-output"),this.notice=e(".sim-notice")}collectOutput(){const e=this.engine.state.outputLines;for(;this.printedr.localeCompare(o));if(n.length===0)this.variables.innerHTML=`

${Ae(p("simulation_variables_placeholder"))}

`;else{const r=document.createElement("table");for(const o of n){const l=r.insertRow();l.insertCell().textContent=o;const u=e.variables.get(o),m=l.insertCell();u.kind==="grid"?m.append(Uh(u)):m.textContent=we(u)}this.variables.replaceChildren(r)}e.outputLines.length===0&&e.files.size===0?this.output.innerHTML=`

${Ae(p("simulation_output_placeholder"))}

`:(this.output.replaceChildren(...e.outputLines.map(r=>{const o=document.createElement("div");return o.textContent=r,o}),...qh(e.files)),this.output.scrollTop=this.output.scrollHeight)}updateInput(){const e=this.engine.state.inputRequest,t=this.inputSection;if(t.parentElement.classList.toggle("active",!!e),!e){t.innerHTML=`

${Ae(p("simulation_input_placeholder"))}

`;return}let n=t.querySelector("form");if(!n){n=document.createElement("form"),n.innerHTML=`

`;const l=n.querySelector("input");n.addEventListener("submit",u=>{u.preventDefault(),this.submitInput(l)}),t.replaceChildren(n),requestAnimationFrame(()=>l.focus())}const a=this.engine.state.outputLines;n.querySelector(".sim-prompt").textContent=e.prompt||(a[a.length-1]??"");const s=n.querySelector("input");s.inputMode=e.valueType==="string"||e.valueType==="boolean"?"text":"decimal";const r=this.engine.state.inputErrorNotice,o=n.querySelector(".sim-input-error");o.textContent=r?Kn(r):"",o.hidden=!r}}function Uh(i){const e=document.createElement("table");e.className="sim-grid";for(const t of i.value){const n=e.insertRow();for(const a of t){const s=n.insertCell();s.textContent=String(a),a===!0&&(s.className="sim-grid-true")}}return e}const f1=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),Jn=360/f1.length,lD="http://www.w3.org/2000/svg";function Me(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function ft(i,e={},t){const n=document.createElementNS(lD,i);for(const[a,s]of Object.entries(e))n.setAttribute(a,String(s));return t!==void 0&&(n.textContent=t),n}function uD(i,e){const t=(e%26+26)%26;return Array.from(i).map(n=>{const a=n.charCodeAt(0);return a>=65&&a<=90?String.fromCharCode((a-65+t)%26+65):a>=97&&a<=122?String.fromCharCode((a-97+t)%26+97):n}).join("")}function Qu(i,e){const t=ft("g",{class:e}),n=f1.map((a,s)=>{const r=ft("g",{transform:`rotate(${s*Jn})`});return r.append(ft("text",{x:0,y:-i,"text-anchor":"middle","dominant-baseline":"central"},a)),t.append(r),r});return{group:t,cells:n}}function mD(i,e){let t=i,n=!1,a=-t*Jn;const s=Me("section",{class:"learn-game learn-caesar"});s.append(Me("div",{class:"learn-game-head"},Me("strong",{},p("web_learn_caesar_title")))),s.append(Me("p",{class:"learn-game-status"},p("web_learn_caesar_hint")));const r=ft("svg",{viewBox:"-200 -200 400 400",class:"learn-caesar-disc",role:"img"});r.append(ft("circle",{r:196,class:"outer-disc"})),r.append(ft("path",{d:cD(196,92,Jn/2),class:"window"}));const o=Qu(168,"outer-letters");r.append(o.group);for(let O=0;O{o.cells.forEach((W,E)=>W.classList.toggle("marked",E===O)),u.cells.forEach((W,E)=>W.classList.toggle("marked",O!==void 0&&E===(O+t)%26))},_=()=>{m.textContent=String(t),l.setAttribute("transform",`rotate(${a})`),r.setAttribute("aria-label",p("web_learn_caesar_key_fmt",t)),b.textContent=p(n?"web_learn_caesar_secret":"web_learn_caesar_plain"),w.textContent=p(n?"web_learn_caesar_plain":"web_learn_caesar_secret"),f.classList.toggle("active",!n),x.classList.toggle("active",n),I.textContent=uD(v.value,n?-t:t)||" ";const O=Array.from(v.value.toUpperCase()).reverse().find(E=>f1.includes(E));if(O===void 0)return S();const W=f1.indexOf(O);S(n?(W-t+26)%26:W)},T=O=>{t=(O%26+26)%26,a=-t*Jn,_()};c.addEventListener("click",()=>T(t-1)),d.addEventListener("click",()=>T(t+1)),f.addEventListener("click",()=>{var O;n&&(v.value=((O=I.textContent)==null?void 0:O.trim())??""),n=!1,_()}),x.addEventListener("click",()=>{var O;n||(v.value=((O=I.textContent)==null?void 0:O.trim())??""),n=!0,_()}),v.addEventListener("input",_),o.cells.forEach((O,W)=>O.addEventListener("click",()=>S(W)));let j;const C=O=>{const W=r.getBoundingClientRect();return Math.atan2(O.clientY-(W.top+W.height/2),O.clientX-(W.left+W.width/2))*180/Math.PI};l.addEventListener("pointerdown",O=>{const W=O;j=C(W)-a,l.classList.add("dragging"),r.setPointerCapture(W.pointerId),W.preventDefault()}),r.addEventListener("pointermove",O=>{if(j===void 0)return;a=C(O)-j,l.setAttribute("transform",`rotate(${a})`);const W=Math.round(-a/Jn);if((W%26+26)%26!==t){t=(W%26+26)%26;const E=a;_(),a=E,l.setAttribute("transform",`rotate(${a})`)}});const P=()=>{j!==void 0&&(j=void 0,l.classList.remove("dragging"),T(t))};return r.addEventListener("pointerup",P),r.addEventListener("pointercancel",P),_(),s}function cD(i,e,t){const n=(a,s)=>{const r=(s-90)*Math.PI/180;return`${(a*Math.cos(r)).toFixed(2)} ${(a*Math.sin(r)).toFixed(2)}`};return`M ${n(i,-t)} A ${i} ${i} 0 0 1 ${n(i,t)} L ${n(e,t)} A ${e} ${e} 0 0 0 ${n(e,-t)} Z`}const t0=i=>p(`web_visubot_part_${i}`),$h=new WeakMap;function Yh(i,e,t,n){const a=document.createElement("div");a.className="visubot-model";const s=document.createElement("div");s.className="visubot-stage";const r=document.createElement("div");r.className="visubot-part-label",r.hidden=!0,s.append(r);const o=(c,d,h)=>{r.hidden=!1,r.textContent=t0(c),r.style.left=`${Math.min(d+12,s.clientWidth-140)}px`,r.style.top=`${h+12}px`},l=document.createElement("p");l.className="visubot-model-hint hint",l.textContent=p("web_visubot_tap_part"),l.hidden=!!n,a.append(s,l);const u=q(async()=>{const{Robot3D:c}=await import("./robot3d-VilOVDMf.js");return{Robot3D:c}},[],import.meta.url).then(({Robot3D:c})=>{const d=new c(s);d.showcase(),d.highlight(i),i.includes("leds")&&d.setLed([40,90,255]),d.focusOn([],e==="unten"||e==="bottom"?"":e,!1,1),d.focusOn(i,e,t);let h;return s.addEventListener("pointerdown",g=>h={x:g.clientX,y:g.clientY}),s.addEventListener("pointerup",g=>{if(!h||Math.hypot(g.clientX-h.x,g.clientY-h.y)>5)return;const f=d.partAt(g.clientX,g.clientY);if(!f)return;if(n)return n(f);d.highlight(f);const x=s.getBoundingClientRect();o(f,g.clientX-x.left,g.clientY-x.top)}),s.addEventListener("pointermove",g=>{if(g.pointerType!=="mouse"||n)return;const f=d.partAt(g.clientX,g.clientY);if(r.hidden=!f,!f)return;const x=s.getBoundingClientRect();o(f,g.clientX-x.left,g.clientY-x.top)}),s.addEventListener("pointerleave",()=>r.hidden=!0),d}).catch(c=>{console.error(c),s.textContent=p("web_visubot_no_3d")}),m={box:a,ready:u,focus:i,view:e};return $h.set(a,m),m}function dD(i,e,t=!1){return Yh(i,e,t).box}function hD(i){const e=i.querySelector(".visubot-model"),t=e&&$h.get(e);for(const n of i.querySelectorAll("[data-robot-part]")){const a=(n.dataset.robotPart??"").split(",").filter(Boolean);if(n.title=a.map(t0).join(", "),!t)continue;const s=()=>void t.ready.then(o=>o==null?void 0:o.highlight(a)),r=()=>void t.ready.then(o=>o==null?void 0:o.highlight(t.focus));n.addEventListener("mouseenter",s),n.addEventListener("focus",s),n.addEventListener("mouseleave",r),n.addEventListener("blur",r),n.addEventListener("click",()=>{t.ready.then(o=>{o==null||o.highlight(a),o==null||o.focusOn(a,t.view)}),t.box.scrollIntoView({block:"nearest",behavior:"smooth"})})}}function gD(i,e){let t=0;const n=document.createElement("div");n.className="visubot-quiz-question";const a=document.createElement("p");a.className="visubot-quiz-feedback",a.setAttribute("aria-live","polite");const s=()=>{n.innerHTML=kn(`**${t+1}/${i.length}** ${i[t].question}`)},r=Yh([],void 0,!1,l=>{if(!(t>=i.length)){if(r.ready.then(u=>u==null?void 0:u.highlight(l)),l!==i[t].part){a.className="visubot-quiz-feedback wrong",a.textContent=p("web_visubot_quiz_wrong_fmt",t0(l));return}t++,a.className="visubot-quiz-feedback right",t{u.forEach(v=>{window.clearTimeout(v),window.clearInterval(v)}),u=[]},c=()=>{a.textContent=`${p("web_game_round_fmt",o+1,r)} · ${p("web_game_score_fmt",l)}`},d=()=>{const v=V("button",{class:"primary"},o+1{o++,o{const v=i.rounds[o],w=i.seconds,I=V("div",{class:"learn-bomb-fuse"},V("span",{})),z=V("span",{class:"learn-bomb-time"}),S=V("div",{class:"learn-bomb","aria-live":"polite"},V("span",{class:"learn-bomb-icon","aria-hidden":"true"},"💣"),z,I),_=V("div",{class:"learn-game-feedback",role:"status"}),T=v.code.split(` + `;const e=a=>this.element.querySelector(a);this.buttons={play:e("[data-sim=play]"),pause:e("[data-sim=pause]"),step:e("[data-sim=step]"),stop:e("[data-sim=stop]")},this.buttons.play.addEventListener("click",()=>this.play()),this.buttons.pause.addEventListener("click",()=>this.pause()),this.buttons.step.addEventListener("click",()=>this.step()),this.buttons.stop.addEventListener("click",()=>this.reset()),this.editButton=e(".sim-edit"),this.editButton.addEventListener("click",()=>this.onEdit());const t=e("[data-sim=highlight]");t.value=this.highlightMode,t.addEventListener("change",()=>{this.highlightMode=t.value,Vu(Hu,this.highlightMode)});const n=e("[data-sim=delay]");n.value=this.delay,n.addEventListener("change",()=>{this.delay=n.value,Vu(fr,this.delay)}),this.inputSection=e(".sim-input > div"),this.trace=e(".sim-trace"),this.variables=e(".sim-vars"),this.output=e(".sim-output"),this.notice=e(".sim-notice")}collectOutput(){const e=this.engine.state.outputLines;for(;this.printedr.localeCompare(o));if(n.length===0)this.variables.innerHTML=`

${Ae(p("simulation_variables_placeholder"))}

`;else{const r=document.createElement("table");for(const o of n){const l=r.insertRow();l.insertCell().textContent=o;const u=e.variables.get(o),m=l.insertCell();u.kind==="grid"?m.append(Uh(u)):m.textContent=we(u)}this.variables.replaceChildren(r)}e.outputLines.length===0&&e.files.size===0?this.output.innerHTML=`

${Ae(p("simulation_output_placeholder"))}

`:(this.output.replaceChildren(...e.outputLines.map(r=>{const o=document.createElement("div");return o.textContent=r,o}),...qh(e.files)),this.output.scrollTop=this.output.scrollHeight)}updateInput(){const e=this.engine.state.inputRequest,t=this.inputSection;if(t.parentElement.classList.toggle("active",!!e),!e){t.innerHTML=`

${Ae(p("simulation_input_placeholder"))}

`;return}let n=t.querySelector("form");if(!n){n=document.createElement("form"),n.innerHTML=`

`;const l=n.querySelector("input");n.addEventListener("submit",u=>{u.preventDefault(),this.submitInput(l)}),t.replaceChildren(n),requestAnimationFrame(()=>l.focus())}const a=this.engine.state.outputLines;n.querySelector(".sim-prompt").textContent=e.prompt||(a[a.length-1]??"");const s=n.querySelector("input");s.inputMode=e.valueType==="string"||e.valueType==="boolean"?"text":"decimal";const r=this.engine.state.inputErrorNotice,o=n.querySelector(".sim-input-error");o.textContent=r?Kn(r):"",o.hidden=!r}}function Uh(i){const e=document.createElement("table");e.className="sim-grid";for(const t of i.value){const n=e.insertRow();for(const a of t){const s=n.insertCell();s.textContent=String(a),a===!0&&(s.className="sim-grid-true")}}return e}const f1=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),Jn=360/f1.length,lD="http://www.w3.org/2000/svg";function Me(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function ft(i,e={},t){const n=document.createElementNS(lD,i);for(const[a,s]of Object.entries(e))n.setAttribute(a,String(s));return t!==void 0&&(n.textContent=t),n}function uD(i,e){const t=(e%26+26)%26;return Array.from(i).map(n=>{const a=n.charCodeAt(0);return a>=65&&a<=90?String.fromCharCode((a-65+t)%26+65):a>=97&&a<=122?String.fromCharCode((a-97+t)%26+97):n}).join("")}function Qu(i,e){const t=ft("g",{class:e}),n=f1.map((a,s)=>{const r=ft("g",{transform:`rotate(${s*Jn})`});return r.append(ft("text",{x:0,y:-i,"text-anchor":"middle","dominant-baseline":"central"},a)),t.append(r),r});return{group:t,cells:n}}function mD(i,e){let t=i,n=!1,a=-t*Jn;const s=Me("section",{class:"learn-game learn-caesar"});s.append(Me("div",{class:"learn-game-head"},Me("strong",{},p("web_learn_caesar_title")))),s.append(Me("p",{class:"learn-game-status"},p("web_learn_caesar_hint")));const r=ft("svg",{viewBox:"-200 -200 400 400",class:"learn-caesar-disc",role:"img"});r.append(ft("circle",{r:196,class:"outer-disc"})),r.append(ft("path",{d:cD(196,92,Jn/2),class:"window"}));const o=Qu(168,"outer-letters");r.append(o.group);for(let O=0;O{o.cells.forEach((W,E)=>W.classList.toggle("marked",E===O)),u.cells.forEach((W,E)=>W.classList.toggle("marked",O!==void 0&&E===(O+t)%26))},_=()=>{m.textContent=String(t),l.setAttribute("transform",`rotate(${a})`),r.setAttribute("aria-label",p("web_learn_caesar_key_fmt",t)),b.textContent=p(n?"web_learn_caesar_secret":"web_learn_caesar_plain"),w.textContent=p(n?"web_learn_caesar_plain":"web_learn_caesar_secret"),f.classList.toggle("active",!n),x.classList.toggle("active",n),I.textContent=uD(v.value,n?-t:t)||" ";const O=Array.from(v.value.toUpperCase()).reverse().find(E=>f1.includes(E));if(O===void 0)return S();const W=f1.indexOf(O);S(n?(W-t+26)%26:W)},T=O=>{t=(O%26+26)%26,a=-t*Jn,_()};c.addEventListener("click",()=>T(t-1)),d.addEventListener("click",()=>T(t+1)),f.addEventListener("click",()=>{var O;n&&(v.value=((O=I.textContent)==null?void 0:O.trim())??""),n=!1,_()}),x.addEventListener("click",()=>{var O;n||(v.value=((O=I.textContent)==null?void 0:O.trim())??""),n=!0,_()}),v.addEventListener("input",_),o.cells.forEach((O,W)=>O.addEventListener("click",()=>S(W)));let j;const C=O=>{const W=r.getBoundingClientRect();return Math.atan2(O.clientY-(W.top+W.height/2),O.clientX-(W.left+W.width/2))*180/Math.PI};l.addEventListener("pointerdown",O=>{const W=O;j=C(W)-a,l.classList.add("dragging"),r.setPointerCapture(W.pointerId),W.preventDefault()}),r.addEventListener("pointermove",O=>{if(j===void 0)return;a=C(O)-j,l.setAttribute("transform",`rotate(${a})`);const W=Math.round(-a/Jn);if((W%26+26)%26!==t){t=(W%26+26)%26;const E=a;_(),a=E,l.setAttribute("transform",`rotate(${a})`)}});const P=()=>{j!==void 0&&(j=void 0,l.classList.remove("dragging"),T(t))};return r.addEventListener("pointerup",P),r.addEventListener("pointercancel",P),_(),s}function cD(i,e,t){const n=(a,s)=>{const r=(s-90)*Math.PI/180;return`${(a*Math.cos(r)).toFixed(2)} ${(a*Math.sin(r)).toFixed(2)}`};return`M ${n(i,-t)} A ${i} ${i} 0 0 1 ${n(i,t)} L ${n(e,t)} A ${e} ${e} 0 0 0 ${n(e,-t)} Z`}const t0=i=>p(`web_visubot_part_${i}`),$h=new WeakMap;function Yh(i,e,t,n){const a=document.createElement("div");a.className="visubot-model";const s=document.createElement("div");s.className="visubot-stage";const r=document.createElement("div");r.className="visubot-part-label",r.hidden=!0,s.append(r);const o=(c,d,h)=>{r.hidden=!1,r.textContent=t0(c),r.style.left=`${Math.min(d+12,s.clientWidth-140)}px`,r.style.top=`${h+12}px`},l=document.createElement("p");l.className="visubot-model-hint hint",l.textContent=p("web_visubot_tap_part"),l.hidden=!!n,a.append(s,l);const u=q(async()=>{const{Robot3D:c}=await import("./robot3d-CMtq02nh.js");return{Robot3D:c}},[],import.meta.url).then(({Robot3D:c})=>{const d=new c(s);d.showcase(),d.highlight(i),i.includes("leds")&&d.setLed([40,90,255]),d.focusOn([],e==="unten"||e==="bottom"?"":e,!1,1),d.focusOn(i,e,t);let h;return s.addEventListener("pointerdown",g=>h={x:g.clientX,y:g.clientY}),s.addEventListener("pointerup",g=>{if(!h||Math.hypot(g.clientX-h.x,g.clientY-h.y)>5)return;const f=d.partAt(g.clientX,g.clientY);if(!f)return;if(n)return n(f);d.highlight(f);const x=s.getBoundingClientRect();o(f,g.clientX-x.left,g.clientY-x.top)}),s.addEventListener("pointermove",g=>{if(g.pointerType!=="mouse"||n)return;const f=d.partAt(g.clientX,g.clientY);if(r.hidden=!f,!f)return;const x=s.getBoundingClientRect();o(f,g.clientX-x.left,g.clientY-x.top)}),s.addEventListener("pointerleave",()=>r.hidden=!0),d}).catch(c=>{console.error(c),s.textContent=p("web_visubot_no_3d")}),m={box:a,ready:u,focus:i,view:e};return $h.set(a,m),m}function dD(i,e,t=!1){return Yh(i,e,t).box}function hD(i){const e=i.querySelector(".visubot-model"),t=e&&$h.get(e);for(const n of i.querySelectorAll("[data-robot-part]")){const a=(n.dataset.robotPart??"").split(",").filter(Boolean);if(n.title=a.map(t0).join(", "),!t)continue;const s=()=>void t.ready.then(o=>o==null?void 0:o.highlight(a)),r=()=>void t.ready.then(o=>o==null?void 0:o.highlight(t.focus));n.addEventListener("mouseenter",s),n.addEventListener("focus",s),n.addEventListener("mouseleave",r),n.addEventListener("blur",r),n.addEventListener("click",()=>{t.ready.then(o=>{o==null||o.highlight(a),o==null||o.focusOn(a,t.view)}),t.box.scrollIntoView({block:"nearest",behavior:"smooth"})})}}function gD(i,e){let t=0;const n=document.createElement("div");n.className="visubot-quiz-question";const a=document.createElement("p");a.className="visubot-quiz-feedback",a.setAttribute("aria-live","polite");const s=()=>{n.innerHTML=kn(`**${t+1}/${i.length}** ${i[t].question}`)},r=Yh([],void 0,!1,l=>{if(!(t>=i.length)){if(r.ready.then(u=>u==null?void 0:u.highlight(l)),l!==i[t].part){a.className="visubot-quiz-feedback wrong",a.textContent=p("web_visubot_quiz_wrong_fmt",t0(l));return}t++,a.className="visubot-quiz-feedback right",t{u.forEach(v=>{window.clearTimeout(v),window.clearInterval(v)}),u=[]},c=()=>{a.textContent=`${p("web_game_round_fmt",o+1,r)} · ${p("web_game_score_fmt",l)}`},d=()=>{const v=V("button",{class:"primary"},o+1{o++,o{const v=i.rounds[o],w=i.seconds,I=V("div",{class:"learn-bomb-fuse"},V("span",{})),z=V("span",{class:"learn-bomb-time"}),S=V("div",{class:"learn-bomb","aria-live":"polite"},V("span",{class:"learn-bomb-icon","aria-hidden":"true"},"💣"),z,I),_=V("div",{class:"learn-game-feedback",role:"status"}),T=v.code.split(` `).map((E,Q)=>{const $=V("button",{class:"ln",type:"button"},E||" ");return $.disabled=!E.trim(),$.addEventListener("click",()=>O(Q+1===v.wrongLine?"right":"wrong",$)),$}),j=V("div",{class:"learn-game-code learn-bomb-code mono",dir:"ltr"},...T),C=Date.now(),P=()=>{if(!t.isConnected&&Date.now()-C>1e3)return m();const E=Math.max(0,w-(Date.now()-C)/1e3);z.textContent=p("web_game_time_fmt",Math.ceil(E)),I.firstChild.style.width=`${E/w*100}%`,S.classList.toggle("hurry",E<=5),E<=0&&O("time")},O=(E,Q)=>{m(),T.forEach((Te,xe)=>{Te.disabled=!0,xe+1===v.wrongLine&&Te.classList.add("right")}),Q&&E==="wrong"&&Q.classList.add("wrong");const $=E==="right";$&&l++,c(),S.classList.add($?"defused":"boom"),S.firstChild.textContent=$?"✂️":"💥",_.className=`learn-game-feedback ${$?"right":"wrong"}`;const he=d();_.replaceChildren(V("p",{},p($?"web_game_defused":E==="time"?"web_game_boom_time":"web_game_boom_wrong")),Nn("div",{class:"learn-game-explain"},v.explanation),V("p",{class:"learn-bomb-fix"},`${p("web_game_fix")} `,V("code",{},v.fix.trim())),he),he.focus({preventScroll:!0})};s.replaceChildren(S,Nn("p",{class:"learn-game-question"},v.question),j,_),P();const W=window.setInterval(P,200);u.push(W)},g=()=>{const v=i.rounds[o],w=[];v.code.trim()&&w.push(Uu(v.code).element),w.push(Nn("p",{class:"learn-game-question"},v.question),V("p",{class:"learn-order-hint"},p("web_game_order_hint")));const I=V("div",{class:"learn-game-options learn-order"}),z=V("div",{class:"learn-game-feedback",role:"status"});let S=0;const _=fD(v.options.length).map(j=>{const C=V("span",{class:"learn-order-badge","aria-hidden":"true"}),P=V("span",{});P.innerHTML=Re(v.options[j].text);const O=V("button",{},C,P);return O.addEventListener("click",()=>{if(j!==S)return O.classList.add("wrong"),T(!1);O.classList.add("right"),C.textContent=String(++S),O.disabled=!0,S===v.options.length&&T(!0)}),I.append(O),{k:j,b:O,badge:C}}),T=j=>{for(const{k:P,b:O,badge:W}of[..._].sort((E,Q)=>E.k-Q.k))O.disabled=!0,W.textContent=String(P+1),I.append(O);j&&l++,c(),z.className=`learn-game-feedback ${j?"right":"wrong"}`;const C=d();z.replaceChildren(V("p",{},p(j?"web_game_right":"web_game_wrong_short")),Nn("div",{class:"learn-game-explain"},v.explanation),C),C.focus({preventScroll:!0})};s.replaceChildren(...w,I,z)},f=()=>{if(m(),i.kind==="bombe"||i.kind==="reihenfolge"){c(),i.kind==="bombe"?h():g();return}const v=i.rounds[o];c();const w=Uu(v.code),I=[];let z;i.kind==="zuhoerer"?(z=xD(Zh(v.code),w),I.push(V("div",{class:"learn-swing-row"},w.element,z.element)),v.clicks.length&&I.push(V("p",{class:"learn-swing-clicks"},`${p("web_game_clicks")} `,...v.clicks.flatMap((C,P)=>[...P?[" → "]:[],V("code",{},C)])))):v.code.trim()&&I.push(w.element),I.push(Nn("p",{class:"learn-game-question"},v.question));const S=V("div",{class:`learn-game-options ${i.kind==="layout"?"pictures":""}`}),_=V("div",{class:"learn-game-feedback",role:"status"}),T=v.options.map(C=>{const P=V("button",{});return i.kind==="layout"?P.append(vD(C.text)):C.text.includes(` `)?P.append(bD(C.text)):P.innerHTML=Re(C.text),P.addEventListener("click",()=>j(C.right,P)),S.append(P),P}),j=(C,P)=>{T.forEach((W,E)=>{W.disabled=!0,v.options[E].right&&W.classList.add("right")}),C||P.classList.add("wrong"),C&&l++,c(),_.className=`learn-game-feedback ${C?"right":"wrong"}`;const O=d();_.replaceChildren(V("p",{},p(C?"web_game_right":"web_game_wrong_short")),Nn("div",{class:"learn-game-explain"},v.explanation)),_.append(O),z&&(u=z.replay(v.clicks,()=>O.before(V("p",{class:"learn-swing-try"},p("web_game_try"))))),O.focus({preventScroll:!0})};s.replaceChildren(...I,S,_)},x=()=>{m(),a.textContent="";const v=V("button",{class:"primary"},p("web_game_again"));v.addEventListener("click",()=>{o=l=0,f()}),s.replaceChildren(V("p",{class:"learn-game-result"},p("web_game_done_fmt",l,r)),V("p",{},p(l===r?"web_game_perfect":l>=r*.7?"web_game_good":"web_game_practice_short")),v)},b=V("button",{class:"primary"},p("web_game_start"));return b.addEventListener("click",f),s.append(Nn("p",{},i.intro),b),t}function fD(i){const e=[...Array(i).keys()];for(;e.every((t,n)=>t===n);)for(let t=i-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}return e}function Uu(i){const e=i.split(` `).map(n=>V("div",{class:"ln"},n||" "));return{element:V("pre",{class:"learn-game-code mono",dir:"ltr"},...e),highlight(n,a){e.forEach((s,r)=>s.classList.toggle("hit",n!==void 0&&r>=n&&r<=(a??n)))}}}function xD(i,e){const t=Mh(i),n=V("div",{class:"learn-swing-window",dir:"ltr"});n.append(V("div",{class:"learn-swing-title"},i.title||" "));const a=V("div",{class:"learn-swing-body"}),s=new Map;for(const c of i.labels){const d=V("div",{class:"learn-swing-label"},t.texts[c.name]);s.set(c.name,d),a.append(d)}const r=i.buttons.map(c=>{const d=V("button",{class:"learn-swing-button",disabled:""},t.texts[c.name]);return s.set(c.name,d),a.append(d),d}),o=V("p",{class:"learn-swing-event",role:"status"}),l=V("pre",{class:"learn-swing-console mono",hidden:""});n.append(a,o,l);const u=c=>{var h,g;const d=s.get(c.button);d.classList.add("pressed"),window.setTimeout(()=>d.classList.remove("pressed"),350),e.highlight((h=c.listener)==null?void 0:h.from,(g=c.listener)==null?void 0:g.to),o.textContent=c.listener?p("web_game_event_fmt",d.textContent??""):p("web_game_nobody"),o.className=`learn-swing-event ${c.listener?"heard":"nobody"}`;for(const[f,x]of Object.entries(c.texts)){const b=s.get(f);b&&b.textContent!==x&&(b.textContent=x,b.classList.remove("changed"),b.offsetWidth,b.classList.add("changed"))}c.console.length&&(l.hidden=!1,l.textContent+=c.console.map(f=>`${f} @@ -60326,7 +60512,7 @@ ${l}`)}La=SB(((o=e.find(([l])=>l==="begriffe.md"))==null?void 0:o[1])??"")}const ${a}`));this.body.append(s),this.foldReference(s)}}foldReference(e){const t="visustruct.reference.open";let n=[];try{n=JSON.parse(localStorage.getItem(t)??"[]")}catch{}for(const a of[...e.querySelectorAll("h2")]){const s=a.textContent??"",r=A("details",{class:"reference-group"});r.open=n.includes(s);const o=A("summary",{},s);for(a.replaceWith(r),r.append(o);r.nextSibling&&r.nextSibling.nodeName!=="H2";)r.append(r.nextSibling);r.addEventListener("toggle",()=>{n=r.open?[...new Set([...n,s])]:n.filter(l=>l!==s);try{localStorage.setItem(t,JSON.stringify(n))}catch{}})}}showReference(){this.tab="reference",this.persist(),this.render()}persist(){ge.setView({tab:this.tab,lesson:this.lessonId,task:this.taskId})}openLesson(e){this.tab="lessons",this.lessonId=e,this.returnTo=void 0,this.persist(),this.render(),this.body.scrollTop=0}renderLessonList(){this.body.append(A("p",{class:"hint"},p("web_learn_intro")));for(const e of jD()){this.body.append(A("h3",{class:"learn-section"},e.name));const t=A("ol",{class:"learn-list"});for(const n of e.lessons){const a=ge.lesson(n.id),s=a.done?"✓":a.step>0?p("web_learn_step_of_fmt",a.step+1,n.steps.length):"",r=A("button",{class:"learn-item"+(a.done?" done":""),"data-lesson":n.id},A("span",{class:"learn-num"},String(n.number)),A("span",{class:"learn-item-text"},A("strong",{},n.robot?`🤖 ${n.title}`:n.title),A("small",{},n.summary)),A("span",{class:"learn-status"},s));r.addEventListener("click",()=>this.openLesson(n.id)),t.append(A("li",{},r))}this.body.append(t)}this.body.append(this.renderTeacherBox())}renderLesson(e){var u;const t=ge.lesson(e.id),n=Math.min(t.step,e.steps.length-1),a=e.steps[n],s=A("button",{class:"learn-back"},`← ${p("web_learn_all_lessons")}`);s.addEventListener("click",()=>this.openLesson(void 0));const r=A("nav",{class:"learn-progress","aria-label":p("web_learn_step_of_fmt",n+1,e.steps.length)});r.append(...e.steps.map((m,c)=>{const d=p("web_learn_step_fmt",c+1,m.title),h=cthis.goToStep(e,c)),g})),this.body.append(A("div",{class:"learn-lesson-head"},A("div",{class:"learn-head-row"},s,this.stepNav(e,n,t.done,"learn-nav learn-nav-top")),A("p",{class:"learn-kicker"},`${p("web_learn_lesson_fmt",e.number)} · ${e.section}${e.robot?" · 🤖 VisuBot":""}`),A("h2",{class:"learn-title"},A("span",{class:"learn-num","aria-hidden":"true"},String(e.number)),e.title),r,A("h3",{class:"learn-step-title"},`${n+1}. ${a.title}`)));const o=((u=this.returnTo)==null?void 0:u.lesson)===e.id&&this.returnTo.step!==n?this.returnTo:void 0,l=()=>{const m=A("button",{class:"learn-return"},`↩ ${p("web_learn_back_to_checklist")}`);return m.addEventListener("click",()=>{this.returnTo=void 0,this.goToStep(e,o.step),this.body.scrollTop=o.scroll}),m};o&&this.body.append(l()),a.blocks.forEach((m,c)=>this.body.append(this.renderBlock(m,`${n}-${c}`,e))),Ku(this.body),hD(this.body),this.openNeededColumns(a.blocks),Xu(this.body,La),this.body.append(this.stepNav(e,n,t.done,"learn-nav")),o&&this.body.append(l())}stepNav(e,t,n,a){const s=A("div",{class:a}),r=A("button",{},`← ${p("web_learn_back")}`);if(r.disabled=t===0,r.addEventListener("click",()=>this.goToStep(e,t-1)),s.append(r),tthis.goToStep(e,t+1)),s.append(o)}else{const o=A("button",{class:"primary"},n?`✓ ${p("web_learn_done")}`:p("web_learn_finish"));o.addEventListener("click",()=>{ge.updateLesson(e.id,{done:!0});const l=Ot.find(u=>u.number===e.number+1);this.openLesson(l==null?void 0:l.id)}),s.append(o)}return s}goToStep(e,t){ge.updateLesson(e.id,{step:t}),this.render(),this.body.scrollTop=0}openNeededColumns(e){const t=e.flatMap(n=>n.kind==="exercise"?[n.exercise]:[]);OD(this.body)?this.host.showEditor():TD(this.body)?this.host.showFiles():t.some(n=>n.code!=="java")?this.host.showEditor():(t.length>0||this.body.querySelector(".lesson-code[data-lang=java]"))&&this.host.showJava(),AD(this.body)&&this.host.showLiveCode()}renderTaskList(){this.body.append(A("p",{class:"hint"},p("web_learn_tasks_intro")));const e=A("ul",{class:"learn-list"});for(const t of Tn){const n=this.taskExercises(t),a=n.length>0&&n.every(o=>ge.exercise(o.id).done),s=Ot.find(o=>o.number===t.after),r=A("button",{class:"learn-item"+(a?" done":""),"data-task":t.id},A("span",{class:"learn-num","aria-label":p("web_learn_level_fmt",t.level)},"★".repeat(t.level)),A("span",{class:"learn-item-text"},A("strong",{},t.title),A("small",{},s?p("web_learn_after_fmt",s.number,s.title):"")),A("span",{class:"learn-status"},a?"✓":""));r.addEventListener("click",()=>{this.taskId=t.id,this.persist(),this.render(),this.body.scrollTop=0}),e.append(A("li",{},r))}this.body.append(e,this.renderTeacherBox())}renderTeacherBox(){const e=A("details",{class:"learn-teacher"},A("summary",{},p("web_learn_teacher")));if(Ru()){e.setAttribute("open","");const s=A("button",{},p("web_learn_teacher_off"));return s.addEventListener("click",()=>{sD(),this.render()}),e.append(A("p",{},p("web_learn_teacher_on")),s),e}const t=A("input",{type:"password",autocomplete:"off","aria-label":p("web_learn_teacher_code"),placeholder:p("web_learn_teacher_code")}),n=A("p",{class:"learn-result",role:"status"}),a=A("form",{class:"group"},t,A("button",{type:"submit"},p("web_learn_teacher_unlock")));return a.addEventListener("submit",async s=>{s.preventDefault(),await aD(t.value)?this.render():(n.className="learn-result info",n.textContent=p("web_learn_teacher_wrong"))}),e.append(A("p",{class:"hint"},p("web_learn_teacher_intro")),a,n),e}taskExercises(e){return e.blocks.flatMap(t=>t.kind==="exercise"?[t.exercise]:[])}renderTask(e){const t=A("button",{class:"learn-back"},`← ${p("web_learn_all_tasks")}`);t.addEventListener("click",()=>{this.taskId=void 0,this.persist(),this.render()});const n=Ot.find(a=>a.number===e.after);if(this.body.append(t,A("h2",{class:"learn-title"},e.title)),n){const a=A("button",{class:"link-button"},p("web_learn_after_fmt",n.number,n.title));a.addEventListener("click",()=>this.openLesson(n.id)),this.body.append(A("p",{class:"learn-kicker"},a))}e.blocks.forEach((a,s)=>this.body.append(this.renderBlock(a,`task-${s}`))),Ku(this.body),this.openNeededColumns(e.blocks),Xu(this.body,La)}renderBlock(e,t,n){switch(e.kind){case"markdown":return gt("div",{class:"learn-text"},kn(e.text));case"diagram":return this.renderDiagram(e.file,e.caption);case"exercise":return this.renderExercise(e.exercise);case"checklist":return this.renderChecklist(e.items,t,n);case"quiz":return this.renderQuiz(e.questions,t,n);case"brag":return this.renderBrag(e.text,e.tip);case"images":return this.renderImages(e.files,e.caption);case"graphic":return this.renderGraphic(e.file,e.caption);case"game":return this.renderGame(e.game);case"roundGame":return pD(e.game,aa);case"rescueGame":return yD(e.game,aa);case"caesar":return mD(e.key,e.text);case"cloze":return zD(e.cloze);case"textFile":return Qh(e.name,e.content);case"robotModel":return dD(e.focus,e.view,e.spin);case"robotQuiz":return gD(e.tasks,e.done)}}renderBrag(e,t=!1){const n=A("aside",{class:"learn-brag"});n.append(A("img",{src:aa,alt:"",width:"48",height:"48"}));const a=A("div",{},A("p",{class:"learn-brag-title"},p(t?"web_learn_ludwig_tip":"web_learn_brag")));return a.append(gt("div",{class:"learn-text"},kn(e))),n.append(a),n}renderGame(e){const n=A("section",{class:"learn-game"}),a=A("div",{class:"learn-game-head"});a.append(A("img",{src:aa,alt:"",width:"40",height:"40"}),A("strong",{},p("web_game_title")));const s=A("p",{class:"learn-game-status"}),r=A("div",{class:"learn-game-stage"});n.append(a,s,r);let o=0,l=0;const u=()=>{const d=$x(e,o,10);s.textContent=`${p("web_game_round_fmt",o+1,10)} · ${p("web_game_score_fmt",l)}`;const h=A("div",{class:"learn-game-values mono"});for(const[w,I]of Yx(d))h.append(A("code",{},`${w} = ${I}`));const g=A("div",{class:"group learn-game-answers"}),f=A("button",{class:"learn-game-true"},`✓ ${p("web_game_true")}`),x=A("button",{class:"learn-game-false"},`✗ ${p("web_game_false")}`);g.append(f,x);const b=A("div",{class:"learn-game-feedback",role:"status"}),v=w=>{f.disabled=x.disabled=!0;const I=w===d.answer;I&&l++,s.textContent=`${p("web_game_round_fmt",o+1,10)} · ${p("web_game_score_fmt",l)}`,b.className=`learn-game-feedback ${I?"right":"wrong"}`;const z=A("div",{class:"learn-game-steps mono"});qx(d.condition,d.values).forEach((_,T)=>z.append(A("div",{},`${T?"→ ":""}${_}`)));const S=A("button",{class:"primary"},o+1<10?p("web_game_next"):p("web_game_finish"));S.addEventListener("click",()=>{o++,o<10?u():m()}),b.replaceChildren(A("p",{},p(I?"web_game_right":"web_game_wrong")),z,S),S.focus()};f.addEventListener("click",()=>v(!0)),x.addEventListener("click",()=>v(!1)),r.replaceChildren(h,A("div",{class:"learn-game-condition mono"},d.condition),g,b)},m=()=>{s.textContent="";const d=A("button",{class:"primary"},p("web_game_again"));d.addEventListener("click",()=>{o=l=0,u()}),r.replaceChildren(A("p",{class:"learn-game-result"},p("web_game_done_fmt",l,10)),A("p",{},p(l===10?"web_game_perfect":l>=10*.7?"web_game_good":"web_game_practice")),d)},c=A("button",{class:"primary"},p("web_game_start"));return c.addEventListener("click",u),r.append(A("p",{},p("web_game_intro")),c),n}renderImages(e,t){const n=A("figure",{class:"learn-figure"}),a=A("div",{class:"learn-images"});for(const s of e){const r=Fu(s);r&&a.append(A("img",{src:r,alt:"",loading:"lazy"}))}return n.append(a),t&&n.append(gt("figcaption",{},Re(t))),n}renderGraphic(e,t){const n=A("figure",{class:"learn-figure"}),a=Fu(e);return a&&n.append(A("img",{class:"learn-graphic",src:a,alt:"",loading:"lazy"})),t&&n.append(gt("figcaption",{},Re(t))),n}renderDiagram(e,t){const n=X1(e),a=A("figure",{class:"learn-figure"});if(!n)return a;const s=this.host.preview(n);s&&a.append(A("div",{class:"learn-preview",dir:"ltr"},s)),t&&a.append(gt("figcaption",{},Re(t)));const r=A("button",{},p("web_learn_open_in_editor"));return r.addEventListener("click",()=>this.host.openDiagram(n,e)),a.append(r),a}renderExercise(e){const t=A("section",{class:"learn-exercise","data-exercise":e.id}),n=()=>ge.exercise(e.id),a=A("span",{class:"learn-badge"},`✓ ${p("web_learn_solved")}`);a.hidden=!n().done,t.append(A("h4",{},`${p("web_learn_exercise")}: ${e.title}`,a),gt("div",{class:"learn-text"},kn(e.task)));const s=A("div",{class:"learn-result",role:"status"}),r=A("div",{class:"learn-hints"}),o=A("div",{class:"group"}),l=A("button",{class:"primary"},p("web_learn_open_exercise"));l.addEventListener("click",()=>{const c=n().xml;let d=em(e);if(c)try{d=Bl(c)}catch{}this.host.openExercise(e,d)});const u=A("button",{},p("web_learn_check"));if(u.addEventListener("click",()=>{const c=this.host.exerciseDocument(e.id);if(!c){s.className="learn-result info",s.textContent=p("web_learn_open_first");return}if(c.elements.every(Al)){s.className="learn-result info",s.textContent=p("web_learn_empty");return}this.host.stopSimulation();const d=Rx(c,e.tests,this.host.subprogramsFor(e.id),Wa),h=Gx(c),g=e.requires.map(b=>b==="forZaehlSchleife"?"forSchleife":b).filter(b=>b in k&&!h.has(k[b])),f=e.loopDepth!==void 0&&_o(c.elements)b.passed)&&g.length===0&&!f;this.showResult(s,d,g,x,f),x&&(ge.updateExercise(e.id,{done:!0}),a.hidden=!1)}),o.append(l,u),e.hints.length>0){const c=A("button",{},p("web_learn_hint"));c.addEventListener("click",()=>{const d=r.children.length;if(d>=e.hints.length)return;const h=e.hints.length>1?`**${p("web_learn_hint_fmt",d+1,e.hints.length)}:** `:"";r.append(gt("aside",{class:"lesson-note"},kn(h+e.hints[d]))),c.textContent=p("web_learn_hint_more"),c.toggleAttribute("disabled",d+1>=e.hints.length)}),o.append(c)}const m=A("button",{class:"danger-text"},p("web_learn_reset"));if(m.addEventListener("click",()=>{if(m.dataset.confirm!=="1"){m.dataset.confirm="1",m.textContent=p("web_learn_reset_confirm"),setTimeout(()=>{m.dataset.confirm="",m.textContent=p("web_learn_reset")},4e3);return}ge.resetExercise(e.id),this.host.resetExercise(e.id,em(e)),a.hidden=!0,s.replaceChildren(),s.className="learn-result",m.dataset.confirm="",m.textContent=p("web_learn_reset")}),o.append(m),t.append(o,r,s),Ru()&&e.solution){const c=X1(e.solution);if(c){const d=A("details",{class:"learn-solution"},A("summary",{},p("web_learn_solution")));d.addEventListener("toggle",()=>{if(!d.open||d.querySelector(".learn-preview"))return;const h=this.host.preview(c);h&&d.append(A("div",{class:"learn-preview",dir:"ltr"},h));const g=A("button",{},p("web_learn_open_in_editor"));g.addEventListener("click",()=>{this.host.openDiagram(c,e.solution);for(const f of e.subprograms){const x=X1(f);x&&this.host.openDiagram(x,f)}});for(const f of e.subprograms){const x=X1(f),b=x&&this.host.preview(x);b&&d.append(A("div",{class:"learn-preview",dir:"ltr"},b))}d.append(g)}),t.append(d)}}return t}showResult(e,t,n,a,s){var o,l,u,m,c;e.className="learn-result "+(a?"ok":"fail"),e.replaceChildren(A("p",{class:"learn-result-head"},a?`🎉 ${p("web_learn_passed")}`:p("web_learn_failed")));for(const d of n)e.append(A("p",{},`✗ ${p("web_learn_missing_fmt",CD(k[d]))}`));s&&e.append(A("p",{},`✗ ${p("web_visubot_depth_fmt",s)}`));const r=A("ul",{class:"learn-tests",dir:"auto"});for(const d of t){const h=d.test.world?t.filter(b=>b.test.world).indexOf(d)+1:0,g=d.test.world?`🗺 ${p("web_visubot_world_fmt",h)}`:d.test.actions?`🤖 ${p("web_visubot_actions")}`:d.test.sensors?`🎛 ${Object.entries(d.test.sensors).map(([b,v])=>`mbot.${b}() = ${v.join(" → ")}`).join(", ")}`:d.test.drive?`🤖 ${p("web_visubot_drive")}`:d.test.inputs.length?p("web_learn_input_fmt",d.test.inputs.join(", ")):p("web_learn_no_input"),f=[`${d.passed?"✓":"✗"} ${g}`],x=A("div",{class:"learn-test-detail"});if(d.test.drive&&x.append(A("span",{},`${p("web_learn_expected")}: `,A("code",{},U1(d.test.drive)||"–")),A("span",{},`${p("web_learn_actual")}: `,A("code",{},U1(d.result.drive??[])||"–"))),d.test.actions&&x.append(A("span",{},`${p("web_learn_expected")}: `,A("code",{},U1(d.test.actions)||"–")),A("span",{},`${p("web_learn_actual")}: `,A("code",{},U1(d.result.actions??[])||"–"))),d.test.led!==void 0){const b=v=>p(v?"web_visubot_led_on":"web_visubot_led_off");x.append(A("span",{},`💡 ${p("web_learn_expected")}: ${b(d.test.led)} · ${p("web_learn_actual")}: ${b(d.result.led)}`))}if(d.test.tone!==void 0){const b=v=>p(v?"web_visubot_tone_yes":"web_visubot_tone_no");x.append(A("span",{},`🔊 ${p("web_learn_expected")}: ${b(d.test.tone)} · ${p("web_learn_actual")}: ${b(d.result.tone)}`))}d.test.screen!==void 0&&x.append(A("span",{},`📺 ${p("web_learn_expected")}: `,A("code",{},d.test.screen),` · ${p("web_learn_actual")}: `,A("code",{},d.result.screen??"–"))),d.test.world&&(((l=(o=Wa(d.test.world))==null?void 0:o.goals)!=null&&l.length||(m=(u=Wa(d.test.world))==null?void 0:u.targets)!=null&&m.length)&&x.append(A("span",{},d.result.atGoal?`✓ ${p("web_visubot_goal_reached")}`:`✗ ${p("web_visubot_goal_missed")}`)),d.result.bumps&&x.append(A("span",{class:"learn-error"},`⚠︎ ${p("web_visubot_bumps")}: ${d.result.bumps}`))),(!d.test.drive&&!d.test.world&&!d.test.sensors&&!d.test.actions||d.result.outputs.length)&&x.append(A("span",{},`${p("web_learn_expected")}: `,A("code",{},d.test.expected.join(" | ")||"–")),A("span",{},`${p("web_learn_actual")}: `,A("code",{},d.result.outputs.join(" | ")||"–")));for(const b of d.test.files??[])x.append(A("span",{},`📄 ${b.name}, ${p("web_learn_expected")}: `,A("code",{},b.lines.join(" | ")||"–")),A("span",{},`📄 ${b.name}, ${p("web_learn_actual")}: `,A("code",{},Bh((c=d.result.files)==null?void 0:c.get(b.name)).join(" | ")||"–")));d.result.error&&x.append(A("span",{class:"learn-error"},Kn(d.result.error))),d.result.missingInput&&x.append(A("span",{class:"learn-error"},p("web_learn_missing_input"))),d.result.tooManySteps&&x.append(A("span",{class:"learn-error"},p("web_learn_too_many_steps"))),!d.passed&&d.result.unusedInputs&&x.append(A("span",{class:"learn-error"},p("web_learn_unused_input"))),r.append(A("li",{class:d.passed?"ok":"fail"},...f,x))}e.append(r)}renderChecklist(e,t,n){const a=A("ul",{class:"learn-checklist"});return e.forEach((s,r)=>{var c;const o=`${t}-${r}`,l=A("input",{type:"checkbox"});l.checked=!!(n&&((c=ge.lesson(n.id).checks)!=null&&c[o])),l.addEventListener("change",()=>{if(!n)return;const d={...ge.lesson(n.id).checks??{},[o]:l.checked};ge.updateLesson(n.id,{checks:d})});const u=A("label",{},l);u.insertAdjacentHTML("beforeend"," "+Re(s.text));const m=A("li",{},u);if(n&&s.step!==void 0){const d=s.step,h=p("web_learn_step_fmt",d+1,n.steps[d].title),g=A("button",{class:"link-button learn-check-link",title:h,"aria-label":`${p("web_learn_review")}: ${h}`},p("web_learn_review"));g.addEventListener("click",()=>{this.returnTo={lesson:n.id,step:ge.lesson(n.id).step,scroll:this.body.scrollTop},this.goToStep(n,d)}),m.append(g)}a.append(m)}),a}renderQuiz(e,t,n){const a=A("div",{class:"learn-quiz"}),s=A("p",{class:"learn-score",role:"status"}),r=()=>n?ge.lesson(n.id).quiz??{}:{},o=()=>{const l=r(),u=(h,g)=>h.pairs?h.pairs.every((f,x)=>l[`${t}-${g}-${x}`]!==void 0):l[`${t}-${g}`]!==void 0,m=(h,g)=>{var f;return h.pairs?h.pairs.every((x,b)=>tm(h)[l[`${t}-${g}-${b}`]]===h.pairs[b].right):(f=h.options[l[`${t}-${g}`]])==null?void 0:f.correct},c=e.filter(u).length,d=e.filter(m).length;s.textContent=c===e.length?p("web_learn_score_fmt",d,e.length):""};return e.forEach((l,u)=>{const m=`${t}-${u}`,c=A("fieldset",{},gt("legend",{},Re(l.question))),d=gt("p",{class:"learn-explanation"},Re(l.explanation??""));if(l.pairs){c.append(this.renderMatch(l,m,r,n,d,o),d),a.append(c);return}const h=g=>{c.querySelectorAll("button").forEach((f,x)=>{f.classList.toggle("right",g!==void 0&&l.options[x].correct),f.classList.toggle("wrong",g===x&&!l.options[x].correct),f.setAttribute("aria-pressed",String(g===x))}),d.hidden=g===void 0||!l.explanation};l.options.forEach((g,f)=>{const x=gt("button",{class:"learn-option"},Re(g.text));x.addEventListener("click",()=>{n&&ge.updateLesson(n.id,{quiz:{...r(),[m]:f}}),h(f),o()}),c.append(x)}),c.append(d),h(r()[m]),a.append(c)}),a.append(s),o(),a}renderMatch(e,t,n,a,s,r){const o=e.pairs,l=tm(e),u=A("div",{class:"learn-match"});let m={};const c=()=>a?n():m,d=x=>a?ge.updateLesson(a.id,{quiz:x}):m=x,h=x=>c()[`${t}-${x}`],g=o.map(x=>{const b=A("select",{class:"learn-match-select"});b.append(A("option",{value:""},"–")),l.forEach((w,I)=>b.append(A("option",{value:String(I)},w)));const v=gt("label",{class:"learn-match-left"},Re(x.left));return v.append(b),u.append(v),b}),f=()=>{const x=o.every((b,v)=>h(v)!==void 0);g.forEach((b,v)=>{const w=h(v);b.value=w===void 0?"":String(w),b.classList.toggle("right",x&&l[w]===o[v].right),b.classList.toggle("wrong",x&&l[w]!==o[v].right)}),s.hidden=!x||!e.explanation};return g.forEach((x,b)=>x.addEventListener("change",()=>{const v={...c()};x.value===""?delete v[`${t}-${b}`]:v[`${t}-${b}`]=Number(x.value),d(v),f(),r()})),f(),u}}function tm(i){return(i.pairs??[]).map(e=>e.right).sort((e,t)=>e.localeCompare(t,"de"))}const ZD=""+new URL("visubot-CyGFOI9V.webp",import.meta.url).href,i0="visustruct.visubot";function a0(){try{return localStorage.getItem(i0)}catch{return null}}function ri(){const i=a0();return i==="1"||i==="kurs"?"on":"off"}const Kh=()=>a0()==="2";function eg(){try{localStorage.setItem(i0,"2")}catch{}}const MD=()=>a0()!==null;function br(i){try{localStorage.setItem(i0,i==="on"?"1":"0")}catch{}}const LD=`VisuBot`,Rn=()=>ri()!=="off",nm=i=>i.replace(/[&<>"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e]);function Po(){const i=Kh()?"object":ri(),e=(n,a)=>``,t={off:"web_visubot_world_visustruct_hint",on:"web_visubot_world_visubot_hint",object:"web_visuobject_world_hint"}[i];return`
${e("off","VisuStruct")}${e("on","🤖 VisuBot")}${e("object","VisuObject")}
- ${nm(p(t))}`}class WD{constructor(e=yi){y(this,"element");y(this,"world");y(this,"view");y(this,"loading");y(this,"status");y(this,"stage");y(this,"picker");y(this,"applied",0);y(this,"sent",0);y(this,"liveStatus");y(this,"viewport");y(this,"stopListening");y(this,"realSensors");y(this,"controls",{getBrightness:50,getLoudness:0,getPitch:0,getRoll:0});y(this,"pressTimers",new Map);y(this,"check");y(this,"checking",!1);y(this,"onWorldChange");this.world=new us(e),this.element=document.createElement("section"),this.element.className="visubot",this.element.innerHTML=`

${p("web_visubot_world")}

${p("web_visubot_world_in_preview")}

${ED()}${ND()}`,this.stage=this.element.querySelector(".visubot-stage"),this.picker=this.element.querySelector(".visubot-worlds"),this.status=this.element.querySelector(".visubot-status"),this.liveStatus=this.element.querySelector(".visubot-live"),this.viewport=this.element.querySelector(".visubot-viewport"),this.stopListening=le.listen(()=>this.updateLive()),this.setupControls(),this.check=this.element.querySelector(".visubot-check"),this.setupCheck(),this.updateLive(),this.updateStatus()}show(){this.loading??(this.loading=q(async()=>{const{Robot3D:e}=await import("./robot3d-VilOVDMf.js");return{Robot3D:e}},[],import.meta.url).then(({Robot3D:e})=>{this.view=new e(this.stage),this.view.setWorld(this.world.setup),this.view.place(this.world.pose,this.world.trail),this.view.setLeds(this.world.leds)}).catch(()=>{this.stage.textContent=p("web_visubot_no_3d")}))}restoreViewport(){this.viewport.parentElement!==this.element&&this.liveStatus.after(this.viewport)}setWorlds(e){this.picker.replaceChildren(),this.picker.hidden=e.length<2,e.forEach((t,n)=>{const a=document.createElement("button");a.textContent=p("web_visubot_world_fmt",n+1),a.addEventListener("click",()=>this.useWorld(t,a)),this.picker.append(a)}),this.useWorld(e[0]??yi,this.picker.firstElementChild)}useWorld(e,t){var n,a,s,r,o;for(const l of this.picker.children)l.classList.toggle("active",l===t);e!==this.world.setup&&(this.world=new us(e),this.applied=0,this.sent=0,(n=this.view)==null||n.setWorld(e),(a=this.view)==null||a.place(this.world.pose,this.world.trail),(s=this.view)==null||s.setLed(void 0),(r=this.view)==null||r.setScreen(void 0),this.updateStatus(),(o=this.onWorldChange)==null||o.call(this))}reset(){var e,t,n;this.world.reset(),this.applied=0,this.sent=0,this.realSensors=void 0,(e=this.view)==null||e.place(this.world.pose,this.world.trail),(t=this.view)==null||t.setLed(void 0),(n=this.view)==null||n.setScreen(void 0),this.updateStatus()}prepare(e){e.robotSensors={...this.controls,...this.world.sensors()}}setupControls(){for(const e of this.element.querySelectorAll(".visubot-controls input[type=range]")){const t=e.parentElement.querySelector("output"),n=()=>{this.controls[e.name]=Number(e.value),t.textContent=e.value};e.addEventListener("input",n),n()}for(const e of this.element.querySelectorAll(".visubot-controls button[name]"))e.addEventListener("click",()=>{const t=e.name;this.controls[t]=!0,e.classList.add("pressed"),window.clearTimeout(this.pressTimers.get(t)),this.pressTimers.set(t,window.setTimeout(()=>{this.controls[t]=!1,e.classList.remove("pressed")},1e3))})}setupCheck(){for(const e of this.check.querySelectorAll("button[data-py]"))e.addEventListener("click",()=>{const{after:t,wait:n}=e.dataset;le.run(e.dataset.py).then(()=>t?new Promise(a=>setTimeout(a,Number(n))).then(()=>le.run(t)):void 0).catch(a=>this.liveFailed(a))});this.check.addEventListener("toggle",()=>void this.readCheck())}async readCheck(){if(!this.checking){this.checking=!0;try{for(;this.check.open&&le.connected;){for(const e of this.check.querySelectorAll("[data-sensor]")){if(!this.check.open||!le.connected)break;const t=e.dataset.sensor,n=await le.ask(St[t].python).catch(()=>{});n!==void 0&&(e.textContent=typeof St[t].simulated=="boolean"?n===!0||typeof n=="number"&&n!==0?"✓":"–":String(typeof n=="number"?Math.round(n*10)/10:n))}await new Promise(e=>setTimeout(e,200))}}finally{this.checking=!1}}}get live(){return le.connected}async prepareLive(e,t=[]){const n={};for(const a of new Set(["getDistance","getLine",...t])){const s=await le.ask(St[a].python);typeof St[a].simulated=="boolean"?n[a]=s===!0||typeof s=="number"&&s!==0:typeof St[a].simulated=="string"?n[a]=typeof s=="string"?s:String(St[a].simulated):n[a]=typeof s=="number"?a==="getDistance"?Math.round(s):s:0}this.realSensors=n,e.robotSensors={...this.controls,...this.world.sensors(),...n}}async drive(e){for(;this.sentsetTimeout(n,t.args[0]))}}liveFailed(e){le.disconnect(e instanceof Error?e.message:String(e))}updateLive(){this.liveStatus.textContent=ng(),this.liveStatus.classList.toggle("connected",le.connected),this.check.hidden=!le.connected,le.connected||(this.check.open=!1),this.updateStatus()}follow(e,t){var a,s,r,o;for(;this.appliedl!==0);this.world.tick(Xl),n&&((o=this.view)==null||o.moveTo(this.world.pose,this.world.trail,t)),this.updateStatus()}dispose(){var e;this.stopListening();for(const t of this.pressTimers.values())window.clearTimeout(t);(e=this.view)==null||e.dispose(),this.view=void 0,this.loading=void 0}updateStatus(){const e=this.world.lineState().toString(2).padStart(4,"0"),t=[`${p("web_visubot_distance")}: ${this.world.distance()} cm`,`${p("web_visubot_line")}: ${e}`];this.world.bumps>0&&t.push(`⚠︎ ${p("web_visubot_bumps")}: ${this.world.bumps}`),this.world.screen!==void 0&&t.push(`📺 ${this.world.screen}`),this.realSensors&&le.connected&&t.push(`🤖 ${p("web_visubot_distance")}: ${this.realSensors.getDistance} cm · ${p("web_visubot_line")}: ${Number(this.realSensors.getLine).toString(2).padStart(4,"0")}`),this.status.textContent=t.join(" · ")}}let J1;function tg(i,e){try{J1??(J1=new AudioContext);const t=J1.createOscillator(),n=J1.createGain();t.type="square",t.frequency.value=Math.max(20,Math.min(2e4,i)),n.gain.value=.05,t.connect(n).connect(J1.destination);const a=J1.currentTime+Math.min(Math.max(e,0),5e3)/1e3;t.start(),t.stop(a)}catch{}}function ED(){const i=(t,n,a,s,r)=>``,e=(t,n,a)=>``;return`
🎛 ${p("web_visubot_controls")} + ${nm(p(t))}`}class WD{constructor(e=yi){y(this,"element");y(this,"world");y(this,"view");y(this,"loading");y(this,"status");y(this,"stage");y(this,"picker");y(this,"applied",0);y(this,"sent",0);y(this,"liveStatus");y(this,"viewport");y(this,"stopListening");y(this,"realSensors");y(this,"controls",{getBrightness:50,getLoudness:0,getPitch:0,getRoll:0});y(this,"pressTimers",new Map);y(this,"check");y(this,"checking",!1);y(this,"onWorldChange");this.world=new us(e),this.element=document.createElement("section"),this.element.className="visubot",this.element.innerHTML=`

${p("web_visubot_world")}

${p("web_visubot_world_in_preview")}

${ED()}${ND()}`,this.stage=this.element.querySelector(".visubot-stage"),this.picker=this.element.querySelector(".visubot-worlds"),this.status=this.element.querySelector(".visubot-status"),this.liveStatus=this.element.querySelector(".visubot-live"),this.viewport=this.element.querySelector(".visubot-viewport"),this.stopListening=le.listen(()=>this.updateLive()),this.setupControls(),this.check=this.element.querySelector(".visubot-check"),this.setupCheck(),this.updateLive(),this.updateStatus()}show(){this.loading??(this.loading=q(async()=>{const{Robot3D:e}=await import("./robot3d-CMtq02nh.js");return{Robot3D:e}},[],import.meta.url).then(({Robot3D:e})=>{this.view=new e(this.stage),this.view.setWorld(this.world.setup),this.view.place(this.world.pose,this.world.trail),this.view.setLeds(this.world.leds)}).catch(()=>{this.stage.textContent=p("web_visubot_no_3d")}))}restoreViewport(){this.viewport.parentElement!==this.element&&this.liveStatus.after(this.viewport)}setWorlds(e){this.picker.replaceChildren(),this.picker.hidden=e.length<2,e.forEach((t,n)=>{const a=document.createElement("button");a.textContent=p("web_visubot_world_fmt",n+1),a.addEventListener("click",()=>this.useWorld(t,a)),this.picker.append(a)}),this.useWorld(e[0]??yi,this.picker.firstElementChild)}useWorld(e,t){var n,a,s,r,o;for(const l of this.picker.children)l.classList.toggle("active",l===t);e!==this.world.setup&&(this.world=new us(e),this.applied=0,this.sent=0,(n=this.view)==null||n.setWorld(e),(a=this.view)==null||a.place(this.world.pose,this.world.trail),(s=this.view)==null||s.setLed(void 0),(r=this.view)==null||r.setScreen(void 0),this.updateStatus(),(o=this.onWorldChange)==null||o.call(this))}reset(){var e,t,n;this.world.reset(),this.applied=0,this.sent=0,this.realSensors=void 0,(e=this.view)==null||e.place(this.world.pose,this.world.trail),(t=this.view)==null||t.setLed(void 0),(n=this.view)==null||n.setScreen(void 0),this.updateStatus()}prepare(e){e.robotSensors={...this.controls,...this.world.sensors()}}setupControls(){for(const e of this.element.querySelectorAll(".visubot-controls input[type=range]")){const t=e.parentElement.querySelector("output"),n=()=>{this.controls[e.name]=Number(e.value),t.textContent=e.value};e.addEventListener("input",n),n()}for(const e of this.element.querySelectorAll(".visubot-controls button[name]"))e.addEventListener("click",()=>{const t=e.name;this.controls[t]=!0,e.classList.add("pressed"),window.clearTimeout(this.pressTimers.get(t)),this.pressTimers.set(t,window.setTimeout(()=>{this.controls[t]=!1,e.classList.remove("pressed")},1e3))})}setupCheck(){for(const e of this.check.querySelectorAll("button[data-py]"))e.addEventListener("click",()=>{const{after:t,wait:n}=e.dataset;le.run(e.dataset.py).then(()=>t?new Promise(a=>setTimeout(a,Number(n))).then(()=>le.run(t)):void 0).catch(a=>this.liveFailed(a))});this.check.addEventListener("toggle",()=>void this.readCheck())}async readCheck(){if(!this.checking){this.checking=!0;try{for(;this.check.open&&le.connected;){for(const e of this.check.querySelectorAll("[data-sensor]")){if(!this.check.open||!le.connected)break;const t=e.dataset.sensor,n=await le.ask(St[t].python).catch(()=>{});n!==void 0&&(e.textContent=typeof St[t].simulated=="boolean"?n===!0||typeof n=="number"&&n!==0?"✓":"–":String(typeof n=="number"?Math.round(n*10)/10:n))}await new Promise(e=>setTimeout(e,200))}}finally{this.checking=!1}}}get live(){return le.connected}async prepareLive(e,t=[]){const n={};for(const a of new Set(["getDistance","getLine",...t])){const s=await le.ask(St[a].python);typeof St[a].simulated=="boolean"?n[a]=s===!0||typeof s=="number"&&s!==0:typeof St[a].simulated=="string"?n[a]=typeof s=="string"?s:String(St[a].simulated):n[a]=typeof s=="number"?a==="getDistance"?Math.round(s):s:0}this.realSensors=n,e.robotSensors={...this.controls,...this.world.sensors(),...n}}async drive(e){for(;this.sentsetTimeout(n,t.args[0]))}}liveFailed(e){le.disconnect(e instanceof Error?e.message:String(e))}updateLive(){this.liveStatus.textContent=ng(),this.liveStatus.classList.toggle("connected",le.connected),this.check.hidden=!le.connected,le.connected||(this.check.open=!1),this.updateStatus()}follow(e,t){var a,s,r,o;for(;this.appliedl!==0);this.world.tick(Xl),n&&((o=this.view)==null||o.moveTo(this.world.pose,this.world.trail,t)),this.updateStatus()}dispose(){var e;this.stopListening();for(const t of this.pressTimers.values())window.clearTimeout(t);(e=this.view)==null||e.dispose(),this.view=void 0,this.loading=void 0}updateStatus(){const e=this.world.lineState().toString(2).padStart(4,"0"),t=[`${p("web_visubot_distance")}: ${this.world.distance()} cm`,`${p("web_visubot_line")}: ${e}`];this.world.bumps>0&&t.push(`⚠︎ ${p("web_visubot_bumps")}: ${this.world.bumps}`),this.world.screen!==void 0&&t.push(`📺 ${this.world.screen}`),this.realSensors&&le.connected&&t.push(`🤖 ${p("web_visubot_distance")}: ${this.realSensors.getDistance} cm · ${p("web_visubot_line")}: ${Number(this.realSensors.getLine).toString(2).padStart(4,"0")}`),this.status.textContent=t.join(" · ")}}let J1;function tg(i,e){try{J1??(J1=new AudioContext);const t=J1.createOscillator(),n=J1.createGain();t.type="square",t.frequency.value=Math.max(20,Math.min(2e4,i)),n.gain.value=.05,t.connect(n).connect(J1.destination);const a=J1.currentTime+Math.min(Math.max(e,0),5e3)/1e3;t.start(),t.stop(a)}catch{}}function ED(){const i=(t,n,a,s,r)=>``,e=(t,n,a)=>``;return`
🎛 ${p("web_visubot_controls")}

${p("web_visubot_controls_hint")}

${i("getBrightness","web_visubot_sensor_brightness",0,100,50)} ${i("getLoudness","web_visubot_sensor_loudness",0,100,0)} @@ -60555,7 +60741,7 @@ ${i}

${bn(p("web_visubot_preview_hint"))}

-

`;const e=t=>this.element.querySelector(t);this.heightBar=e(".robotpreview-height"),this.stage=e(".robotpreview-stage"),this.status=e(".robotpreview-status"),this.picker=e(".visubot-worlds"),this.playButton=e(".robotpreview-play"),this.stackButton=e(".robotpreview-stack"),this.playButton.addEventListener("click",()=>this.playTimer===void 0?this.play():this.stopPlaying(!0)),this.stackButton.addEventListener("click",()=>this.onToggleStacked()),e(".learn-hide").addEventListener("click",()=>this.onHide()),this.rail=document.createElement("button"),this.rail.className="learn-rail robotpreview-rail",this.setStacked(!1),this.relabel()}hostSimulation(e){var t;e!==this.simulation&&((t=this.simulation)==null||t.remove(),this.simulation=e,this.element.classList.toggle("simulation",!!e),e&&(this.pause(),this.status.after(e)),this.relabel())}relabel(){const e=a=>this.element.querySelector(a),t=!!this.simulation;e("h2").textContent=`🤖 ${p(t?"web_visubot_preview_sim_title":"web_visubot_preview_title")}`,e(".hint").textContent=p(t?"web_visubot_preview_sim_hint":"web_visubot_preview_hint"),this.heightBar.title=p("web_visubot_preview_resize");const n=e(".learn-hide");n.title=p("web_visubot_preview_hide"),n.setAttribute("aria-label",p("web_visubot_preview_hide")),this.rail.title=p("web_visubot_preview_show"),this.rail.innerHTML=`${kt}🤖 ${bn(p("web_visubot_preview_title"))}`,this.setStacked(this.stackButton.textContent==="▥"),this.stopPlaying(!1),this.worldsKey=void 0,this.lastKey=void 0}setStacked(e){const t=e?"web_visubot_preview_side":"web_visubot_preview_stack";this.stackButton.innerHTML=e?"▥":"⬓",this.stackButton.className="icon robotpreview-stack",this.stackButton.dataset.tip=p(t),this.stackButton.setAttribute("aria-label",p(t))}show(){this.loading??(this.loading=q(async()=>{const{Robot3D:e}=await import("./robot3d-VilOVDMf.js");return{Robot3D:e}},[],import.meta.url).then(({Robot3D:e})=>{var t;this.view=new e(this.stage),this.view.setWorld(this.setup),this.showFrame((t=this.result)==null?void 0:t.frames.at(-1))}).catch(()=>{this.stage.textContent=p("web_visubot_no_3d")}))}update(e,t,n,a,s){if(this.simulation)return;this.show(),a!==this.worldsKey&&(this.worldsKey=a,this.setWorlds(n)),this.input={doc:e,resolve:t};const r=JSON.stringify(s)+` +

`;const e=t=>this.element.querySelector(t);this.heightBar=e(".robotpreview-height"),this.stage=e(".robotpreview-stage"),this.status=e(".robotpreview-status"),this.picker=e(".visubot-worlds"),this.playButton=e(".robotpreview-play"),this.stackButton=e(".robotpreview-stack"),this.playButton.addEventListener("click",()=>this.playTimer===void 0?this.play():this.stopPlaying(!0)),this.stackButton.addEventListener("click",()=>this.onToggleStacked()),e(".learn-hide").addEventListener("click",()=>this.onHide()),this.rail=document.createElement("button"),this.rail.className="learn-rail robotpreview-rail",this.setStacked(!1),this.relabel()}hostSimulation(e){var t;e!==this.simulation&&((t=this.simulation)==null||t.remove(),this.simulation=e,this.element.classList.toggle("simulation",!!e),e&&(this.pause(),this.status.after(e)),this.relabel())}relabel(){const e=a=>this.element.querySelector(a),t=!!this.simulation;e("h2").textContent=`🤖 ${p(t?"web_visubot_preview_sim_title":"web_visubot_preview_title")}`,e(".hint").textContent=p(t?"web_visubot_preview_sim_hint":"web_visubot_preview_hint"),this.heightBar.title=p("web_visubot_preview_resize");const n=e(".learn-hide");n.title=p("web_visubot_preview_hide"),n.setAttribute("aria-label",p("web_visubot_preview_hide")),this.rail.title=p("web_visubot_preview_show"),this.rail.innerHTML=`${kt}🤖 ${bn(p("web_visubot_preview_title"))}`,this.setStacked(this.stackButton.textContent==="▥"),this.stopPlaying(!1),this.worldsKey=void 0,this.lastKey=void 0}setStacked(e){const t=e?"web_visubot_preview_side":"web_visubot_preview_stack";this.stackButton.innerHTML=e?"▥":"⬓",this.stackButton.className="icon robotpreview-stack",this.stackButton.dataset.tip=p(t),this.stackButton.setAttribute("aria-label",p(t))}show(){this.loading??(this.loading=q(async()=>{const{Robot3D:e}=await import("./robot3d-CMtq02nh.js");return{Robot3D:e}},[],import.meta.url).then(({Robot3D:e})=>{var t;this.view=new e(this.stage),this.view.setWorld(this.setup),this.showFrame((t=this.result)==null?void 0:t.frames.at(-1))}).catch(()=>{this.stage.textContent=p("web_visubot_no_3d")}))}update(e,t,n,a,s){if(this.simulation)return;this.show(),a!==this.worldsKey&&(this.worldsKey=a,this.setWorlds(n)),this.input={doc:e,resolve:t};const r=JSON.stringify(s)+` `+JSON.stringify(e);r!==this.lastKey&&(this.lastKey=r,window.clearTimeout(this.pending),this.pending=window.setTimeout(()=>this.recompute(),120))}setWorlds(e){this.worlds=e,this.picker.replaceChildren(),this.picker.hidden=e.length<2,e.forEach((t,n)=>{const a=document.createElement("button");a.textContent=p("web_visubot_world_fmt",n+1),a.addEventListener("click",()=>this.useWorld(t)),this.picker.append(a)}),this.useWorld(e[0]??yi)}useWorld(e){var t;this.worlds.forEach((n,a)=>{var s;return(s=this.picker.children[a])==null?void 0:s.classList.toggle("active",n===e)}),!(e===this.setup&&this.result)&&(this.setup=e,(t=this.view)==null||t.setWorld(e),this.recompute())}recompute(){var e;if(this.pending=void 0,this.stopPlaying(!1),!!this.input){try{this.result=nJ(this.input.doc,this.input.resolve,this.setup)}catch{this.result=void 0}this.showFrame((e=this.result)==null?void 0:e.frames.at(-1)),this.updateStatus()}}showFrame(e,t=0){if(!this.view)return;const n=e??{pose:{...this.setup.start},trail:[{x:this.setup.start.x,y:this.setup.start.y}],leds:Array(5).fill(void 0),screen:void 0};t>0?this.view.moveTo(n.pose,n.trail,t):this.view.place(n.pose,n.trail),this.view.setLeds(n.leds),this.view.setScreen(n.screen)}play(){var a;const e=(a=this.result)==null?void 0:a.frames;if(!e||e.length<2||!this.view)return;this.stopPlaying(!1);let t=0;this.showFrame(e[0]),this.playButton.innerHTML=ne.stop,this.playButton.dataset.tip=p("web_visubot_preview_stop"),this.playButton.setAttribute("aria-label",p("web_visubot_preview_stop"));const n=()=>{if(t++,t>=e.length){this.stopPlaying(!1);return}const s=e[t];s.tone&&tg(s.tone[0],s.tone[1]),this.showFrame(s,$r-30),this.playTimer=window.setTimeout(n,$r)};this.playTimer=window.setTimeout(n,$r)}stopPlaying(e){var t;this.playTimer!==void 0&&window.clearTimeout(this.playTimer),this.playTimer=void 0,this.playButton.innerHTML=ne.play,this.playButton.dataset.tip=p("web_visubot_preview_play"),this.playButton.setAttribute("aria-label",p("web_visubot_preview_play")),e&&this.showFrame((t=this.result)==null?void 0:t.frames.at(-1))}updateStatus(){const e=this.result;if(this.playButton.disabled=!e||e.frames.length<2,!e){this.status.textContent="";return}const t=[p("web_visubot_preview_distance_fmt",e.distance)];e.bumps>0&&t.push(`⚠︎ ${p("web_visubot_bumps")}: ${e.bumps}`),e.stop==="input"?t.push(p("web_visubot_preview_input")):e.stop==="limit"?t.push(p("web_visubot_preview_limit")):e.stop==="error"&&e.notice&&t.push(`⚠︎ ${Kn(e.notice)}`),this.status.textContent=t.join(" · ")}pause(){window.clearTimeout(this.pending),this.pending=void 0,this.lastKey=void 0,this.stopPlaying(!1)}}const aJ={left:12,top:10},sJ=8,Ms=8e3,pi=16,Yr=12,Jf="#fafafa";function Rf(i){const e=i.caption.trim();return e===""?p("diagram_title_placeholder"):e}function Xc(i){let e=i.trim().replace(/\.visustruct$/i,"");if(e==="")return"";for(e=e.replace(/\s/g,"-").replace(/[/:\\*?"<>|]/g,"-");e.includes("--");)e=e.replace(/--/g,"-");return e=e.replace(/^-+|-+$/g,""),e.length>120&&(e=e.slice(0,120).replace(/^-+|-+$/g,"")),e}function Kc(i,e){return Xc(i.caption)||Xc(e)||"VisuStruct"}function rJ(i,e,t){const n=i.split(/\s+/),a=[];let s="";for(const r of n){const o=s?`${s} ${r}`:r;s&&t(o,pi,"bold")>e?(a.push(s),s=r):s=o}if(s&&a.push(s),a.length>2){let r=a.slice(1).join(" ");for(;r.length>1&&t(r+"…",pi,"bold")>e;)r=r.slice(0,-1);return[a[0],r+"…"]}return a}function ed(i,e,t,n=320){const a={...i,elements:i.elements.map(Ua)},s=new Ld(e,t).layout(a,aJ),r=Math.min(Ms,Math.max(n,s.canvasSize.width)),o=Math.min(Ms,Math.max(n,s.canvasSize.height));if(r<=2||o<=2)return;const l=rJ(Rf(i),r-2*Yr,t),u=Math.ceil(pi*1.2),m=Math.min(56,l.length*u+2),c=m+o,d=new Fd(e,t).render(s,{width:r,height:o},void 0,sJ);d.setAttribute("y",String(m)),d.removeAttribute("class");const h=ve("svg",{xmlns:"http://www.w3.org/2000/svg",width:r,height:c,viewBox:`0 0 ${r} ${c}`});h.append(ve("rect",{x:0,y:0,width:r,height:c,fill:Jf}));const g=ve("text",{x:Yr,y:0,"font-family":Ls,"font-size":pi,"font-weight":600,fill:"black"});return l.forEach((f,x)=>{const b=ve("tspan",{x:Yr,y:x*u+pi});b.textContent=f,g.append(b)}),h.append(g,d),{svg:h,width:r,height:c}}function Gf(i){return` `+new XMLSerializer().serializeToString(i.svg)}async function td(i,e){const t=Math.max(1,Math.min(e,Ms/i.width,Ms/i.height)),n=URL.createObjectURL(new Blob([Gf(i)],{type:"image/svg+xml"}));try{const a=new Image;a.src=n,await a.decode();const s=document.createElement("canvas");s.width=Math.round(i.width*t),s.height=Math.round(i.height*t);const r=s.getContext("2d");return r.fillStyle=Jf,r.fillRect(0,0,s.width,s.height),r.drawImage(a,0,0,s.width,s.height),s}finally{URL.revokeObjectURL(n)}}function oJ(i){return new Promise((e,t)=>i.toBlob(n=>n?e(n):t(new Error("PNG konnte nicht erzeugt werden.")),"image/png"))}function lJ(i,e){const a=Math.max(1,i),s=Math.max(1,e),r=f=>{const x=f.width-64,b=f.height-64;return{s:Math.min(x/a,b/s)*.98,cw:x,ch:b}},o={width:595,height:842},l={width:842,height:595},u=r(o),m=r(l),[c,d]=m.s>u.s?[l,m]:[o,u],h=a*d.s,g=s*d.s;return{page:c,draw:{x:32+(d.cw-h)/2,y:32+(d.ch-g)/2,width:h,height:g}}}async function uJ(i){const e=new Blob([i]).stream().pipeThrough(new CompressionStream("deflate"));return new Uint8Array(await new Response(e).arrayBuffer())}function nd(i){let e="FEFF";for(let t=0;t`}async function mJ(i,e,t,n,a){const{page:s,draw:r}=lJ(n.width,n.height),o=await uJ(i),l=b=>(Math.round(b*100)/100).toString(),u=`q ${l(r.width)} 0 0 ${l(r.height)} ${l(r.x)} ${l(s.height-r.y-r.height)} cm /Im0 Do Q`,m=new TextEncoder,c=[["<< /Type /Catalog /Pages 2 0 R >>"],["<< /Type /Pages /Kids [3 0 R] /Count 1 >>"],[`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${s.width} ${s.height}] /Resources << /XObject << /Im0 4 0 R >> >> /Contents 5 0 R >>`],[`<< /Type /XObject /Subtype /Image /Width ${e} /Height ${t} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /FlateDecode /Length ${o.length} >> stream @@ -60770,7 +60956,7 @@ ${c}
- ${L(p("web_about_version_fmt").replace("%@","0.13.8"))} + ${L(p("web_about_version_fmt").replace("%@","0.13.9"))}
@@ -60841,7 +61027,7 @@ ${c}

VisuStruct ${L(p("web_brand_suffix"))}

-

${L(p("web_about_version_fmt").replace("%@","0.13.8"))}

+

${L(p("web_about_version_fmt").replace("%@","0.13.9"))}

Holger Sebastiao

${e("about_web_label","https://www.visustruct.org","www.visustruct.org")} ${e("about_developer_label","https://www.sebastiao.org","www.sebastiao.org")} @@ -60863,4 +61049,4 @@ ${c}

${L(p("close_unsaved_title"))}

${L(p("web_discard_message_fmt",this.fileName))}

-
`,t.addEventListener("click",n=>{const a=n.target.dataset.r;a===void 0&&n.target!==t||(t.remove(),e(a==="1"))}),document.body.append(t),t.querySelector('[data-r="0"]').focus()}):Promise.resolve(!0)}showMessage(e){this.statusLine.textContent=e,this.statusLine.classList.add("message"),setTimeout(()=>{this.statusLine.classList.remove("message"),this.updateStatus()},6e3)}loadXML(e,t,n){let a;try{a=Bl(e)}catch(s){this.showMessage(p("web_err_unreadable_fmt",t,s.message));return}(this.dirty||this.tab.fileName||this.tab.exerciseId)&&this.addTab(),this.doc=a,this.tab.fileName=t.replace(/\.(strk|xml)$/i,".visustruct"),this.fileHandle=n&&/\.visustruct$/i.test(t)?n:void 0,this.resetHistory()}async open(e){const t=window;if(!t.showOpenFilePicker||this.inViewer)return e.click();try{const[n]=await t.showOpenFilePicker({types:rd()}),a=await n.getFile();this.loadXML(await a.text(),a.name,n)}catch{}}async save(){var n,a;if(!this.downloads&&await this.saveToWorkspace())return;const e=new Blob([o1(this.doc)],{type:"application/xml"}),t=window;try{if(this.downloads){const s=this.fileName+".txt";await this.downloads.save({filename:s,data:e}),(n=this.tab).fileName??(n.fileName=this.fileName),this.dirty=!1,this.render(),this.showMessage(p("web_saved_txt_fmt",s));return}if(!this.fileHandle&&t.showSaveFilePicker&&!this.inViewer&&(this.fileHandle=await t.showSaveFilePicker({suggestedName:this.fileName,types:rd()}),this.tab.fileName=this.fileHandle.name),this.fileHandle){const s=await this.fileHandle.createWritable();await s.write(e),await s.close()}else{const s=document.createElement("a");s.href=URL.createObjectURL(e),s.download=this.fileName,s.click(),setTimeout(()=>URL.revokeObjectURL(s.href),1e3)}(a=this.tab).fileName??(a.fileName=this.fileName),this.dirty=!1,this.render()}catch{}}async exportDiagram(e){if(e==="visustruct"){const s=Kc(this.doc,on(this.tab));return this.offerDownload(`${s}.visustruct`,new Blob([o1(this.doc)],{type:"application/xml"}))}const t=ed(this.doc,this.metrics,this.measure);if(!t){this.showMessage(p(e==="print"?"err_diagram_too_small_print":"err_diagram_too_small_export"));return}const n=Kc(this.doc,on(this.tab)),a=Math.max(2,window.devicePixelRatio||1)*this.zoom;try{switch(e){case"svg":{t.svg.setAttribute("width",String(t.width*this.zoom)),t.svg.setAttribute("height",String(t.height*this.zoom)),await this.offerDownload(`${n}.svg`,new Blob([Gf(t)],{type:"image/svg+xml"}));break}case"png":{const s=await td(t,a);await this.offerDownload(`${n}.png`,await oJ(s));break}case"pdf":{const s=await td(t,Math.max(a,3)),r=await mJ(cJ(s),s.width,s.height,t,Rf(this.doc));await this.offerDownload(`${n}.pdf`,r);break}case"print":this.printDiagram(t);break}}catch(s){this.showMessage(p("web_export_failed_fmt",s instanceof Error?s.message:String(s)))}}printDiagram(e){const t=document.createElement("div");t.className="print-sheet",e.svg.removeAttribute("width"),e.svg.removeAttribute("height"),t.append(e.svg),document.body.append(t);const n=()=>t.remove();window.addEventListener("afterprint",n,{once:!0});try{window.print()}catch{n(),this.showMessage(`${p("err_print_unavailable")} ${p("web_print_hint")}`);return}setTimeout(n,6e4)}async offerDownload(e,t){try{if(this.downloads){try{await this.downloads.save({filename:e,data:t}),this.showMessage(p("web_saved_fmt",e))}catch{await this.downloads.save({filename:e+".txt",data:t}),this.showMessage(p("web_saved_txt_fmt",e+".txt"))}return}const n=document.createElement("a");n.href=URL.createObjectURL(t),n.download=e,n.click(),setTimeout(()=>URL.revokeObjectURL(n.href),1e3)}catch{this.showMessage(p("err_save_failed_fmt",e))}}setupFileDrop(){window.addEventListener("dragover",e=>{var t;(t=e.dataTransfer)!=null&&t.types.includes("Files")&&(e.preventDefault(),this.root.classList.add("file-drag"))}),window.addEventListener("dragleave",e=>{e.relatedTarget===null&&this.root.classList.remove("file-drag")}),window.addEventListener("drop",async e=>{var n;this.root.classList.remove("file-drag");const t=(n=e.dataTransfer)==null?void 0:n.files[0];t&&(e.preventDefault(),this.loadXML(await t.text(),t.name))})}onKeyDown(e){var a,s;const t=e.metaKey||e.ctrlKey,n=e.target instanceof HTMLTextAreaElement||e.target instanceof HTMLInputElement||((a=e.target)==null?void 0:a.isContentEditable)===!0;if(t&&e.key.toLowerCase()==="s")e.preventDefault(),this.save();else if(t&&e.key.toLowerCase()==="p")e.preventDefault(),this.simulating||this.exportDiagram("print");else if(t&&e.key.toLowerCase()==="o")e.preventDefault(),this.open(this.root.querySelector("input[type=file]"));else{if(n||this.simulating)return;t&&e.key.toLowerCase()==="z"?(e.preventDefault(),e.shiftKey?this.redo():this.undo()):t&&e.key.toLowerCase()==="c"&&!((s=getSelection())!=null&&s.toString())?this.copySelection()&&e.preventDefault():t&&e.key.toLowerCase()==="x"?(e.preventDefault(),this.cutSelection()):t&&e.key.toLowerCase()==="v"?(e.preventDefault(),this.paste()):t&&e.key.toLowerCase()==="y"?(e.preventDefault(),this.redo()):e.key==="Delete"||e.key==="Backspace"?(e.preventDefault(),this.deleteSelection()):e.key==="Escape"&&(this.drag?this.endDrag():(this.selected=void 0,this.render()))}}svgPoint(e,t){if(!this.svg)return;const n=this.svg.getBoundingClientRect(),a=e-n.left,s=t-n.top;if(!(a<0||s<0||a>n.width||s>n.height))return{x:a/this.zoom,y:s/this.zoom}}nodeAt(e,t){for(let n=this.flat.length-1;n>=0;n--){const a=this.flat[n].frame;if(e>=a.x&&e<=a.x+a.width&&t>=a.y&&t<=a.y+a.height)return this.flat[n]}}onCanvasPointerDown(e){if(this.simulating)return;const t=this.svgPoint(e.clientX,e.clientY);if(!t)return;document.activeElement instanceof HTMLElement&&document.activeElement.blur();const n=this.nodeAt(t.x,t.y),a=n&&this.selected&&lo(n.idPath,this.selected);this.selected=n==null?void 0:n.idPath,this.render(),n&&e.pointerType!=="touch"&&!(wn(this.doc,n.idPath)&&!a)&&this.beginDrag(e,{kind:"move",path:n.idPath})}beginDrag(e,t){e.button!==0||this.simulating||(e.preventDefault(),this.drag={source:t,pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,active:!1})}onPointerMove(e){const t=this.drag;if(!t||e.pointerId!==t.pointerId)return;if(!t.active){if(Math.hypot(e.clientX-t.startX,e.clientY-t.startY)<5)return;t.active=!0,t.ghost=this.makeGhost(t.source),document.body.append(t.ghost),this.root.classList.add("dragging")}t.ghost.style.transform=`translate(${e.clientX+12}px, ${e.clientY+12}px)`,this.autoScroll(e.clientX,e.clientY);const n=this.svgPoint(e.clientX,e.clientY);t.target=n?this.dropTargetAt(n.x,n.y,t.source):void 0,this.showDropTarget(t.target)}onPointerUp(e){const t=this.drag;!t||e.pointerId!==t.pointerId||(t.active&&t.target?this.applyDrop(t.source,t.target):!t.active&&t.source.kind==="palette"?this.insertNearSelection(t.source.make()):!t.active&&t.source.kind==="sensor"&&this.insertSensor(t.source.text),this.endDrag())}endDrag(){var e,t;(t=(e=this.drag)==null?void 0:e.ghost)==null||t.remove(),this.drag=void 0,this.root.classList.remove("dragging"),this.showDropTarget(void 0)}makeGhost(e){const t=document.createElement("div");if(t.className="drag-ghost",e.kind==="palette"||e.kind==="sensor")t.textContent=e.label;else{const n=At(this.doc,e.path);t.textContent=`${Xr(n.type)}: ${Ol(n)[0]}`}return t}autoScroll(e,t){const n=this.canvasHost.getBoundingClientRect(),a=40,s=12;t>n.bottom-a&&tn.top-a&&(this.canvasHost.scrollTop-=s),e>n.right-a&&en.left-a&&(this.canvasHost.scrollLeft-=s)}dropTargetAt(e,t,n){var l;const a=((l=this.layout)==null?void 0:l.elements)??[],s=this.nodeAt(e,t);if(n.kind==="sensor")return!s||wn(this.doc,s.idPath)?void 0:sd.includes(At(this.doc,s.idPath).type)?{kind:"condition",path:s.idPath,frame:s.frame}:void 0;if(!s){const u=a[a.length-1];if(!u)return;const m=u.frame.y+u.frame.height;return t>m?n.kind==="move"&&n.path.length===1&&n.path[0]===a.length-1?void 0:{kind:"rootAppend",frame:{x:u.frame.x,y:m,width:u.frame.width,height:0}}:t=n.path.length&&n.path.every((u,m)=>r[m]===u)?void 0:wn(this.doc,r)?{kind:"replace",path:r,frame:s.frame}:{kind:t"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e])}function _d(i){if(!i)return[];for(const e of[...Ot.flatMap(t=>t.steps.flatMap(n=>n.blocks)),...Tn.flatMap(t=>t.blocks)])if(!(e.kind!=="exercise"||e.exercise.id!==i))return e.exercise.tests.flatMap(t=>{const n=t.world?Wa(t.world):void 0;return n?[n]:[]});return[]}let Et,Sl,_l;function Td(i){const e=i.dataset.tip;if(!e)return;Et??(Et=Object.assign(document.createElement("div"),{className:"tooltip",role:"tooltip"})),Et.isConnected||document.body.append(Et),Et.textContent=e,Et.hidden=!1;const t=i.getBoundingClientRect(),n=Et.offsetWidth,a=Et.offsetHeight,s=Math.min(Math.max(8,t.left+t.width/2-n/2),window.innerWidth-n-8),r=t.bottom+6+a{if(i.pointerType==="touch")return;const e=i.target.closest("[data-tip]");e!==_l&&(no(),e&&(_l=e,Sl=window.setTimeout(()=>Td(e),350)))}),document.addEventListener("focusin",i=>{const e=i.target.closest("[data-tip]");no(),e!=null&&e.matches(":focus-visible")&&Td(e)});for(const i of["pointerdown","focusout","scroll","keydown"])document.addEventListener(i,no,!0)}const Tl="visustruct.reloadedAfterError";function qf(){try{const i=Number(sessionStorage.getItem(Tl));if(i&&Date.now()-i<3e4)return!1;sessionStorage.setItem(Tl,String(Date.now()))}catch{return!1}return location.reload(),!0}function BJ(i){console.error(i);const e=(navigator.language||"").toLowerCase().startsWith("de"),t=document.createElement("div");t.className="startup-error";const n=document.createElement("h1");n.textContent=e?"VisuStruct konnte nicht starten":"VisuStruct could not start";const a=document.createElement("p");a.textContent=e?"Wahrscheinlich gibt es gerade eine neue Version. Lade die Seite neu. Hilft das nicht, drücke Strg+Umschalt+R (Mac: ⌘⇧R).":"There is probably a new version. Reload the page. If that does not help, press Ctrl+Shift+R (Mac: ⌘⇧R).";const s=document.createElement("button");s.textContent=e?"Neu laden":"Reload",s.addEventListener("click",()=>location.reload());const r=document.createElement("pre");r.textContent=String(i instanceof Error?i.message:i),t.append(n,a,s,r),(document.getElementById("app")??document.body).replaceWith(t)}window.addEventListener("vite:preloadError",i=>{qf()&&i.preventDefault()});const DJ=L2();Promise.all([Ud(DJ,!1),qd(Z2(),!1)]).then(()=>{Qf(),CJ();const i=new URLSearchParams(location.search);i.has("visuobject")&&eg();const e=document.getElementById("app");if(Kh()&&!i.has("visustruct")&&!i.has("visubot"))return q(async()=>{const{ObjectApp:t}=await import("./objectApp-D9StvWDS.js").then(n=>n.g);return{ObjectApp:t}},[],import.meta.url).then(({ObjectApp:t})=>new t(e));new AJ(e)}).then(()=>{try{sessionStorage.removeItem(Tl)}catch{}}).catch(i=>{/dynamically imported module|Importing a module script failed|error loading dynamically/i.test(String(i))&&qf()||BJ(i)});export{Vn as C,ZF as J,Cx as L,q as _,wF as a,GF as b,Mf as c,NJ as d,br as e,sa as f,TJ as g,VD as h,ne as i,HD as j,i1 as k,EJ as m,EF as p,am as r,YD as s,p as t,Po as w}; + `,t.addEventListener("click",n=>{const a=n.target.dataset.r;a===void 0&&n.target!==t||(t.remove(),e(a==="1"))}),document.body.append(t),t.querySelector('[data-r="0"]').focus()}):Promise.resolve(!0)}showMessage(e){this.statusLine.textContent=e,this.statusLine.classList.add("message"),setTimeout(()=>{this.statusLine.classList.remove("message"),this.updateStatus()},6e3)}loadXML(e,t,n){let a;try{a=Bl(e)}catch(s){this.showMessage(p("web_err_unreadable_fmt",t,s.message));return}(this.dirty||this.tab.fileName||this.tab.exerciseId)&&this.addTab(),this.doc=a,this.tab.fileName=t.replace(/\.(strk|xml)$/i,".visustruct"),this.fileHandle=n&&/\.visustruct$/i.test(t)?n:void 0,this.resetHistory()}async open(e){const t=window;if(!t.showOpenFilePicker||this.inViewer)return e.click();try{const[n]=await t.showOpenFilePicker({types:rd()}),a=await n.getFile();this.loadXML(await a.text(),a.name,n)}catch{}}async save(){var n,a;if(!this.downloads&&await this.saveToWorkspace())return;const e=new Blob([o1(this.doc)],{type:"application/xml"}),t=window;try{if(this.downloads){const s=this.fileName+".txt";await this.downloads.save({filename:s,data:e}),(n=this.tab).fileName??(n.fileName=this.fileName),this.dirty=!1,this.render(),this.showMessage(p("web_saved_txt_fmt",s));return}if(!this.fileHandle&&t.showSaveFilePicker&&!this.inViewer&&(this.fileHandle=await t.showSaveFilePicker({suggestedName:this.fileName,types:rd()}),this.tab.fileName=this.fileHandle.name),this.fileHandle){const s=await this.fileHandle.createWritable();await s.write(e),await s.close()}else{const s=document.createElement("a");s.href=URL.createObjectURL(e),s.download=this.fileName,s.click(),setTimeout(()=>URL.revokeObjectURL(s.href),1e3)}(a=this.tab).fileName??(a.fileName=this.fileName),this.dirty=!1,this.render()}catch{}}async exportDiagram(e){if(e==="visustruct"){const s=Kc(this.doc,on(this.tab));return this.offerDownload(`${s}.visustruct`,new Blob([o1(this.doc)],{type:"application/xml"}))}const t=ed(this.doc,this.metrics,this.measure);if(!t){this.showMessage(p(e==="print"?"err_diagram_too_small_print":"err_diagram_too_small_export"));return}const n=Kc(this.doc,on(this.tab)),a=Math.max(2,window.devicePixelRatio||1)*this.zoom;try{switch(e){case"svg":{t.svg.setAttribute("width",String(t.width*this.zoom)),t.svg.setAttribute("height",String(t.height*this.zoom)),await this.offerDownload(`${n}.svg`,new Blob([Gf(t)],{type:"image/svg+xml"}));break}case"png":{const s=await td(t,a);await this.offerDownload(`${n}.png`,await oJ(s));break}case"pdf":{const s=await td(t,Math.max(a,3)),r=await mJ(cJ(s),s.width,s.height,t,Rf(this.doc));await this.offerDownload(`${n}.pdf`,r);break}case"print":this.printDiagram(t);break}}catch(s){this.showMessage(p("web_export_failed_fmt",s instanceof Error?s.message:String(s)))}}printDiagram(e){const t=document.createElement("div");t.className="print-sheet",e.svg.removeAttribute("width"),e.svg.removeAttribute("height"),t.append(e.svg),document.body.append(t);const n=()=>t.remove();window.addEventListener("afterprint",n,{once:!0});try{window.print()}catch{n(),this.showMessage(`${p("err_print_unavailable")} ${p("web_print_hint")}`);return}setTimeout(n,6e4)}async offerDownload(e,t){try{if(this.downloads){try{await this.downloads.save({filename:e,data:t}),this.showMessage(p("web_saved_fmt",e))}catch{await this.downloads.save({filename:e+".txt",data:t}),this.showMessage(p("web_saved_txt_fmt",e+".txt"))}return}const n=document.createElement("a");n.href=URL.createObjectURL(t),n.download=e,n.click(),setTimeout(()=>URL.revokeObjectURL(n.href),1e3)}catch{this.showMessage(p("err_save_failed_fmt",e))}}setupFileDrop(){window.addEventListener("dragover",e=>{var t;(t=e.dataTransfer)!=null&&t.types.includes("Files")&&(e.preventDefault(),this.root.classList.add("file-drag"))}),window.addEventListener("dragleave",e=>{e.relatedTarget===null&&this.root.classList.remove("file-drag")}),window.addEventListener("drop",async e=>{var n;this.root.classList.remove("file-drag");const t=(n=e.dataTransfer)==null?void 0:n.files[0];t&&(e.preventDefault(),this.loadXML(await t.text(),t.name))})}onKeyDown(e){var a,s;const t=e.metaKey||e.ctrlKey,n=e.target instanceof HTMLTextAreaElement||e.target instanceof HTMLInputElement||((a=e.target)==null?void 0:a.isContentEditable)===!0;if(t&&e.key.toLowerCase()==="s")e.preventDefault(),this.save();else if(t&&e.key.toLowerCase()==="p")e.preventDefault(),this.simulating||this.exportDiagram("print");else if(t&&e.key.toLowerCase()==="o")e.preventDefault(),this.open(this.root.querySelector("input[type=file]"));else{if(n||this.simulating)return;t&&e.key.toLowerCase()==="z"?(e.preventDefault(),e.shiftKey?this.redo():this.undo()):t&&e.key.toLowerCase()==="c"&&!((s=getSelection())!=null&&s.toString())?this.copySelection()&&e.preventDefault():t&&e.key.toLowerCase()==="x"?(e.preventDefault(),this.cutSelection()):t&&e.key.toLowerCase()==="v"?(e.preventDefault(),this.paste()):t&&e.key.toLowerCase()==="y"?(e.preventDefault(),this.redo()):e.key==="Delete"||e.key==="Backspace"?(e.preventDefault(),this.deleteSelection()):e.key==="Escape"&&(this.drag?this.endDrag():(this.selected=void 0,this.render()))}}svgPoint(e,t){if(!this.svg)return;const n=this.svg.getBoundingClientRect(),a=e-n.left,s=t-n.top;if(!(a<0||s<0||a>n.width||s>n.height))return{x:a/this.zoom,y:s/this.zoom}}nodeAt(e,t){for(let n=this.flat.length-1;n>=0;n--){const a=this.flat[n].frame;if(e>=a.x&&e<=a.x+a.width&&t>=a.y&&t<=a.y+a.height)return this.flat[n]}}onCanvasPointerDown(e){if(this.simulating)return;const t=this.svgPoint(e.clientX,e.clientY);if(!t)return;document.activeElement instanceof HTMLElement&&document.activeElement.blur();const n=this.nodeAt(t.x,t.y),a=n&&this.selected&&lo(n.idPath,this.selected);this.selected=n==null?void 0:n.idPath,this.render(),n&&e.pointerType!=="touch"&&!(wn(this.doc,n.idPath)&&!a)&&this.beginDrag(e,{kind:"move",path:n.idPath})}beginDrag(e,t){e.button!==0||this.simulating||(e.preventDefault(),this.drag={source:t,pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,active:!1})}onPointerMove(e){const t=this.drag;if(!t||e.pointerId!==t.pointerId)return;if(!t.active){if(Math.hypot(e.clientX-t.startX,e.clientY-t.startY)<5)return;t.active=!0,t.ghost=this.makeGhost(t.source),document.body.append(t.ghost),this.root.classList.add("dragging")}t.ghost.style.transform=`translate(${e.clientX+12}px, ${e.clientY+12}px)`,this.autoScroll(e.clientX,e.clientY);const n=this.svgPoint(e.clientX,e.clientY);t.target=n?this.dropTargetAt(n.x,n.y,t.source):void 0,this.showDropTarget(t.target)}onPointerUp(e){const t=this.drag;!t||e.pointerId!==t.pointerId||(t.active&&t.target?this.applyDrop(t.source,t.target):!t.active&&t.source.kind==="palette"?this.insertNearSelection(t.source.make()):!t.active&&t.source.kind==="sensor"&&this.insertSensor(t.source.text),this.endDrag())}endDrag(){var e,t;(t=(e=this.drag)==null?void 0:e.ghost)==null||t.remove(),this.drag=void 0,this.root.classList.remove("dragging"),this.showDropTarget(void 0)}makeGhost(e){const t=document.createElement("div");if(t.className="drag-ghost",e.kind==="palette"||e.kind==="sensor")t.textContent=e.label;else{const n=At(this.doc,e.path);t.textContent=`${Xr(n.type)}: ${Ol(n)[0]}`}return t}autoScroll(e,t){const n=this.canvasHost.getBoundingClientRect(),a=40,s=12;t>n.bottom-a&&tn.top-a&&(this.canvasHost.scrollTop-=s),e>n.right-a&&en.left-a&&(this.canvasHost.scrollLeft-=s)}dropTargetAt(e,t,n){var l;const a=((l=this.layout)==null?void 0:l.elements)??[],s=this.nodeAt(e,t);if(n.kind==="sensor")return!s||wn(this.doc,s.idPath)?void 0:sd.includes(At(this.doc,s.idPath).type)?{kind:"condition",path:s.idPath,frame:s.frame}:void 0;if(!s){const u=a[a.length-1];if(!u)return;const m=u.frame.y+u.frame.height;return t>m?n.kind==="move"&&n.path.length===1&&n.path[0]===a.length-1?void 0:{kind:"rootAppend",frame:{x:u.frame.x,y:m,width:u.frame.width,height:0}}:t=n.path.length&&n.path.every((u,m)=>r[m]===u)?void 0:wn(this.doc,r)?{kind:"replace",path:r,frame:s.frame}:{kind:t"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e])}function _d(i){if(!i)return[];for(const e of[...Ot.flatMap(t=>t.steps.flatMap(n=>n.blocks)),...Tn.flatMap(t=>t.blocks)])if(!(e.kind!=="exercise"||e.exercise.id!==i))return e.exercise.tests.flatMap(t=>{const n=t.world?Wa(t.world):void 0;return n?[n]:[]});return[]}let Et,Sl,_l;function Td(i){const e=i.dataset.tip;if(!e)return;Et??(Et=Object.assign(document.createElement("div"),{className:"tooltip",role:"tooltip"})),Et.isConnected||document.body.append(Et),Et.textContent=e,Et.hidden=!1;const t=i.getBoundingClientRect(),n=Et.offsetWidth,a=Et.offsetHeight,s=Math.min(Math.max(8,t.left+t.width/2-n/2),window.innerWidth-n-8),r=t.bottom+6+a{if(i.pointerType==="touch")return;const e=i.target.closest("[data-tip]");e!==_l&&(no(),e&&(_l=e,Sl=window.setTimeout(()=>Td(e),350)))}),document.addEventListener("focusin",i=>{const e=i.target.closest("[data-tip]");no(),e!=null&&e.matches(":focus-visible")&&Td(e)});for(const i of["pointerdown","focusout","scroll","keydown"])document.addEventListener(i,no,!0)}const Tl="visustruct.reloadedAfterError";function qf(){try{const i=Number(sessionStorage.getItem(Tl));if(i&&Date.now()-i<3e4)return!1;sessionStorage.setItem(Tl,String(Date.now()))}catch{return!1}return location.reload(),!0}function BJ(i){console.error(i);const e=(navigator.language||"").toLowerCase().startsWith("de"),t=document.createElement("div");t.className="startup-error";const n=document.createElement("h1");n.textContent=e?"VisuStruct konnte nicht starten":"VisuStruct could not start";const a=document.createElement("p");a.textContent=e?"Wahrscheinlich gibt es gerade eine neue Version. Lade die Seite neu. Hilft das nicht, drücke Strg+Umschalt+R (Mac: ⌘⇧R).":"There is probably a new version. Reload the page. If that does not help, press Ctrl+Shift+R (Mac: ⌘⇧R).";const s=document.createElement("button");s.textContent=e?"Neu laden":"Reload",s.addEventListener("click",()=>location.reload());const r=document.createElement("pre");r.textContent=String(i instanceof Error?i.message:i),t.append(n,a,s,r),(document.getElementById("app")??document.body).replaceWith(t)}window.addEventListener("vite:preloadError",i=>{qf()&&i.preventDefault()});const DJ=L2();Promise.all([Ud(DJ,!1),qd(Z2(),!1)]).then(()=>{Qf(),CJ();const i=new URLSearchParams(location.search);i.has("visuobject")&&eg();const e=document.getElementById("app");if(Kh()&&!i.has("visustruct")&&!i.has("visubot"))return q(async()=>{const{ObjectApp:t}=await import("./objectApp-LUS8dABI.js").then(n=>n.g);return{ObjectApp:t}},[],import.meta.url).then(({ObjectApp:t})=>new t(e));new AJ(e)}).then(()=>{try{sessionStorage.removeItem(Tl)}catch{}}).catch(i=>{/dynamically imported module|Importing a module script failed|error loading dynamically/i.test(String(i))&&qf()||BJ(i)});export{Vn as C,ZF as J,Cx as L,q as _,wF as a,GF as b,Mf as c,NJ as d,br as e,sa as f,TJ as g,VD as h,ne as i,HD as j,i1 as k,EJ as m,EF as p,am as r,YD as s,p as t,Po as w}; diff --git a/website/app/assets/objectApp-D9StvWDS.js b/website/app/assets/objectApp-LUS8dABI.js similarity index 99% rename from website/app/assets/objectApp-D9StvWDS.js rename to website/app/assets/objectApp-LUS8dABI.js index c43e0560..d052c7e1 100644 --- a/website/app/assets/objectApp-D9StvWDS.js +++ b/website/app/assets/objectApp-LUS8dABI.js @@ -1,5 +1,5 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./projectZip-DrvMtqWX.js","./index-Bx-6trOD.js","./index-B-A0tKyY.css"])))=>i.map(i=>d[i]); -var Ns=Object.defineProperty;var Os=(a,e,t)=>e in a?Ns(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var E=(a,e,t)=>Os(a,typeof e!="symbol"?e+"":e,t);import{t as d,i as ie,s as Ps,m as Is,g as Ds,w as Rs,J as Hs,c as Bs,a as Ws,b as Ye,p as zs,d as Vs,e as Us,_ as wt,f as $t,h as Js,r as _t,j as Ks,k as ct}from"./index-Bx-6trOD.js";function Xs(a){const e=[];let t=0;for(;ti.map(i=>d[i]); +var Ns=Object.defineProperty;var Os=(a,e,t)=>e in a?Ns(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var E=(a,e,t)=>Os(a,typeof e!="symbol"?e+"":e,t);import{t as d,i as ie,s as Ps,m as Is,g as Ds,w as Rs,J as Hs,c as Bs,a as Ws,b as Ye,p as zs,d as Vs,e as Us,_ as wt,f as $t,h as Js,r as _t,j as Ks,k as ct}from"./index-DBapwQYk.js";function Xs(a){const e=[];let t=0;for(;te.text===","?", ":e.text).join("")}function ms(a){const e=[[]];let t=0;for(const s of a)s.text==="<"||s.text==="("||s.text==="["||s.text==="{"?t++:(s.text===">"||s.text===")"||s.text==="]"||s.text==="}")&&t--,s.text===","&&t===0?e.push([]):e[e.length-1].push(s);return e.filter(s=>s.length>0)}function ft(a){var t,s;const e=[];for(let i=0;i{const t=ft(e).filter(i=>i.text!=="final"),s=t[t.length-1];return{name:s!=null&&s.word?s.text:"",type:lt(t.slice(0,-1))}})}function kt(a,e,t,s){var x,L;const i=ft(a),n=new Set;let o=0;for(;o"));const r=i.slice(o);if(r.length===0||a.length===0)return[];const c=a[0].from,l=r.findIndex(S=>S.text==="("),h=r.findIndex(S=>S.text==="="),u=l>0&&(h<0||lS.text==="="),y=_<0?g:g.slice(0,_);let w=y.length-1;for(;w>0&&!y[w].word;)w--;if(w<1)return[];const $=lt(y.slice(0,w)),p=m.length>1,v=[];return m.forEach((S,k)=>{var C;const j=S.findIndex(F=>F.text==="="),M=j<0?S:S.slice(0,j),A=k===0?y[w]:M.find(F=>F.word);if(!A)return;const R=M.filter(F=>F.from>A.from&&F.text==="[").length;v.push({kind:"field",name:A.text,type:$+"[]".repeat(R),params:[],visibility:xt(n,f),isStatic:n.has("static"),isAbstract:!1,from:c,to:s,headerFrom:c,headerTo:k===0?((C=M[M.length-1])==null?void 0:C.to)??A.to:A.to,shared:p,nameFrom:A.from,nameTo:A.to})}),v}function Gs(a,e,t){var n;let s=[],i=e;for(;ih.text==="="),c=ye(a,i,"{","}");if(r){s.push(...a.slice(i,c)),i=c;continue}const l=s.map(h=>h.text);l.includes("class")||l.includes("interface")||l.includes("enum")||s.length>0&&t.members.push(...kt(s,t.name,t.kind==="interface",((n=a[c-1])==null?void 0:n.to)??o.to)),s=[],i=c;continue}s.push(o),i++}return t.bodyEnd=a.length>0?a[a.length-1].to:0,i}function oe(a){var n,o,r,c;const e=Xs(a),t=[];let s=[],i=0;for(;iw.text==="class"||w.text==="interface"),f=u>=0?h[u+1]:void 0;if(!(f!=null&&f.word)){i=ye(e,i,"{","}"),s=[];continue}let m=u;for(;m>0&&(fs.has(h[m-1].text)||h[m-1].text==="@");)m--;const g={name:f.text,kind:h[u].text==="interface"?"interface":"class",isAbstract:h.slice(m,u).some(w=>w.text==="abstract"),interfaces:[],members:[],from:((n=s[s.indexOf(h[m])])==null?void 0:n.from)??h[m].from,to:0,headerFrom:((o=s[s.indexOf(h[m])])==null?void 0:o.from)??h[m].from,headerTo:h[h.length-1].to,nameFrom:f.from,nameTo:f.to,bodyEnd:0};let _=u+2;((r=h[_])==null?void 0:r.text)==="<"&&(_=ye(h,_,"<",">"));let y="";for(;_")-1:w.word&&y==="extends"&&g.kind==="class"?g.superclass??(g.superclass=w.text):w.word&&y&&g.interfaces.push(w.text)}i=Gs(e,i+1,g),g.to=((c=e[i-1])==null?void 0:c.to)??a.length,t.push(g),s=[]}return t}function Fe(a){const e=/^([\p{L}_$][\p{L}\p{N}_$]*)(\[\])+$/u.exec(a);if(e)return{name:e[1],many:!0};const t=/^(?:ArrayList|LinkedList|List|Set|HashSet|TreeSet|Collection|Queue|Deque|ArrayDeque|Stack|Vector)<([\p{L}_$][\p{L}\p{N}_$]*)>$/u.exec(a);return t?{name:t[1],many:!0}:{name:a,many:!1}}function Zs(a){const e=new Set(a.map(s=>s.name)),t=[];for(const s of a){s.superclass&&e.has(s.superclass)&&t.push({kind:"extends",from:s.name,to:s.superclass});for(const i of s.interfaces)e.has(i)&&t.push({kind:s.kind==="interface"?"extends":"implements",from:s.name,to:i});for(const i of s.members){if(i.kind!=="field")continue;const n=Fe(i.type);e.has(n.name)&&t.push({kind:"association",from:s.name,to:n.name,role:i.name,multiplicity:n.many?"0..*":"1"})}}return t}function Ge(a){const e=a.params.map(t=>`${t.name}: ${t.type}`).join(", ");return a.kind==="field"?`${a.visibility} ${a.name}: ${a.type}`:a.kind==="constructor"?`${a.visibility} ${a.name}(${e})`:`${a.visibility} ${a.name}(${e}): ${a.type}`}const Qs=/^[\p{L}_$][\p{L}\p{N}_$]*$/u;function Ve(a){var c;let e=a.trim().replace(/;$/,"").trim();if(!e)return;let t;/^[+\-#~]/.test(e)&&(t=e[0],e=e.slice(1).trim());let s=!1;const i=e.split(/\s+/);for(;["static","public","private","protected"].includes(i[0]);){const l=i.shift();l==="static"?s=!0:t??(t=l==="public"?"+":l==="private"?"-":"#")}e=i.join(" ");const n=e.indexOf("(");if(n>=0){const l=e.lastIndexOf(")");if(lg.trim()).filter(Boolean).map(g=>{const _=/^([\p{L}_$][\p{L}\p{N}_$]*)\s*:\s*(.+)$/u.exec(g);if(_)return{name:_[1],type:_[2].replace(/\s+/g,"")};const y=/^(.+)\s+([\p{L}_$][\p{L}\p{N}_$]*)$/u.exec(g);return y?{name:y[2],type:y[1].replace(/\s+/g,"")}:{name:g,type:"int"}});return{kind:"method",visibility:t,name:h,type:u==null?void 0:u.replace(/\s+/g,""),params:m,isStatic:s}}const o=/^([\p{L}_$][\p{L}\p{N}_$]*)\s*(?::\s*(.+))?$/u.exec(e);if(o)return{kind:"field",visibility:t,name:o[1],type:(c=o[2])==null?void 0:c.replace(/\s+/g,""),params:[],isStatic:s};const r=/^(.+?)\s+([\p{L}_$][\p{L}\p{N}_$]*)$/u.exec(e);if(r)return{kind:"field",visibility:t,name:r[2],type:r[1].replace(/\s+/g,""),params:[],isStatic:s}}const ei={"+":"public ","-":"private ","#":"protected ","~":""};function ti(a){return/^(int|long|short|byte)$/.test(a)?"0":/^(double|float)$/.test(a)?"0.0":a==="boolean"?"false":a==="char"?"' '":"null"}function bs(a,e,t){const s=e.kind==="interface",i=s?"":ei[a.visibility??(a.kind==="field"?"-":"+")],n=a.isStatic?"static ":"";if(a.kind==="field")return`${i}${n}${a.type??"int"} ${a.name}`;const o=a.params.map(r=>`${r.type} ${r.name}`).join(", ");return a.name===e.name?`${i}${a.name}(${o})`:`${i}${n}${t&&!s?"abstract ":""}${a.type??"void"} ${a.name}(${o})`}const Ue=(a,e)=>a.lastIndexOf(` `,e-1)+1;function mt(a,e,t){const s=Ue(a,e),i=a.slice(s,e);let n=t;for(;n
- ${b(d("web_about_version_fmt").replace("%@","0.13.8"))} + ${b(d("web_about_version_fmt").replace("%@","0.13.9"))}
@@ -315,7 +315,7 @@ public String toString() { `,"in"),this.consolePane().input.hidden=!0,t.vm.input(e),this.debugRun())}debugError(e){var o;const t=e.pos?String(e.pos.line+1):"",s=((o=e.pos)==null?void 0:o.file.split("/").pop())??"",i=e.detail.replace(/^expected:/,""),n={syntax:"web_visuobject_dbg_err_syntax",symbol:"web_visuobject_dbg_err_symbol",unsupported:"web_visuobject_dbg_err_unsupported",nomain:"web_visuobject_no_main",type:"web_visuobject_dbg_err_type",import:"web_visuobject_dbg_err_import",typename:"web_visuobject_dbg_err_typename"}[e.code];e.pos&&this.showLine(e.pos.file,e.pos.line),this.stopDebug(),this.debugStatus(d(n,s,t,i),!0)}showDebugButtons(){const e=this.dbg,t=(e==null?void 0:e.state)==="paused";for(const s of this.shell.querySelectorAll("[data-dbg]"))s.disabled=!e||(s.dataset.dbg==="pause"?e.state!=="running":!t)}showLine(e,t){this.project.files.some(s=>s.path===e)&&e!==this.active&&this.openFile(e),this.editor.setMarks({placeholders:[],problems:[],current:t},!0)}showDebugState(){const e=this.dbg;if(!e)return;e.frames=e.vm.stack();const t=e.vm.heap(),s=e.frames[e.frame];s&&this.showLine(s.pos.file,s.pos.line);const i=e.values.size===0&&e.vars.size===0,n=new Set,o=new Map;for(const h of t)for(const u of h.fields){const f=`dbg${h.id}.${u.name}`;o.set(f,u.value),!i&&e.values.get(f)!==u.value&&n.add(f)}e.values=o;const r=new Set,c=new Map;e.frames.forEach((h,u)=>{for(const f of h.vars){const m=`${e.frames.length-u}|${h.title}|${f.name}`;c.set(m,f.value),!i&&e.vars.get(m)!==f.value&&r.add(`${h.title}|${f.name}`)}}),e.vars=c;const l={objects:this.liveObjects(t),changed:n,frames:e.frames,frame:e.frame,changedVars:r,onFrame:h=>{e.frame=h,l.frame=h;const u=e.frames[h];u&&this.showLine(u.pos.file,u.pos.line),this.objectDiagram.renderInspector()},move:(h,u)=>e.places.set(h,u)};this.objectDiagram.live=l,this.sequence=e.vm.sequence(),this.diagramMode==="object"&&this.objectDiagram.render(),this.diagramMode==="sequence"&&this.renderSequence()}renderSequence(){var n,o,r;const e=this.shell.querySelector(".vo-seqcanvas"),t=e.querySelector(".vo-seq"),s=e.querySelector(".vo-empty"),i=this.sequence;if(s.hidden=!!i&&i.events.length>0,s.textContent=d(i?"web_visuobject_seq_no_calls":"web_visuobject_seq_empty"),!i||!i.events.length)t.innerHTML="",t.setAttribute("width","0");else{const c=((n=this.dbg)==null?void 0:n.state)==="paused"||((o=this.dbg)==null?void 0:o.state)==="input",{svg:l,width:h,height:u}=Ci(i,c?i.events.length-1:void 0);t.innerHTML=l+(i.truncated?`${b(d("web_visuobject_seq_truncated"))}`:""),t.setAttribute("width",String(h)),t.setAttribute("height",String(u)),c&&((r=t.querySelector(".vo-seq-msg.current"))==null||r.scrollIntoView({block:"nearest",inline:"nearest"}))}this.renderSequenceInspector()}renderSequenceInspector(){if(this.objectDiagram.live)return this.objectDiagram.renderInspector();this.inspector.innerHTML=`

${b(d("web_visuobject_seq_hint"))}

`}liveObjects(e){const t=this.dbg,s=this.project.objects??[],i=c=>40+c.fields.length*20,n=[],o=[],r=[];for(const c of e){const l=`dbg${c.id}`,h=t.places.get(l)??s.find(u=>u.name===c.name&&u.cls===c.cls);if(!h){r.push(c);continue}t.places.set(l,{x:h.x,y:h.y}),n.push({x:h.x,y:h.y,w:260,h:i(c)})}for(const c of r){const l=i(c);let h={x:24,y:24};e:for(let u=24;u<6e3;u+=30)for(let f=24;f<=24+3*320;f+=320)if(n.every(m=>f+260+30<=m.x||m.x+m.w+30<=f||u+l+30<=m.y||m.y+m.h+30<=u)){h={x:f,y:u};break e}t.places.set(`dbg${c.id}`,h),n.push({...h,w:260,h:l})}for(const c of e){const l=`dbg${c.id}`;o.push({id:l,name:c.name,cls:c.cls,...t.places.get(l),values:Object.fromEntries(c.fields.map(h=>[h.name,h.value]))})}return o}stopDebug(e,t=!1){const s=this.dbg;s&&clearTimeout(s.timer),this.dbg=void 0,s&&(this.sequence=s.vm.sequence()),this.objectDiagram.live=void 0,this.consolePane().input.hidden=!0,this.shell.querySelector(".vo-dbg-controls").hidden=!0,this.shell.querySelector("[data-action=stop]").disabled=!0,this.shell.querySelector("[data-action=run]").disabled=!1,t||this.editor.setMarks({placeholders:[],problems:[]},!1),e&&this.debugStatus(d(e),t),this.diagramMode==="object"&&this.objectDiagram.render(),this.diagramMode==="sequence"&&this.renderSequence()}chooseWorld(e){e!=="object"&&(Us(e),location.href=`${location.pathname}?${e==="on"?"visubot":"visustruct"}${location.hash}`)}get activeFile(){return this.project.files.find(e=>e.path===this.active)}showActive(){const e=this.activeFile;this.editor.setText((e==null?void 0:e.text)??""),this.editor.setBreakpoints(e?this.breakpoints.get(e.path)??[]:[]),this.editor.setReadOnly(!e),e&&!this.openTabs.includes(e.path)&&this.openTabs.push(e.path),this.renderTabs(),J(ot,this.active??"")}renderTabs(){if(this.openTabs=this.openTabs.filter(e=>this.project.files.some(t=>t.path===e)),J(cs,JSON.stringify(this.openTabs)),this.openTabs.length===0){this.tabs.innerHTML=`${b(d("web_visuobject_no_file"))}`;return}this.tabs.innerHTML=this.openTabs.map(e=>{const t=e===this.active,s=this.isDirty(e);return`
-
`}).join("")}onTabClick(e){var i;const t=e.target,s=(i=t.closest("[data-tab]"))==null?void 0:i.dataset.tab;if(s){if(t.closest("[data-close]"))return this.closeTab(s);this.treeSelection=`file:${s}`,this.openFile(s)}}closeTab(e){const t=this.openTabs.indexOf(e);t<0||(this.openTabs.splice(t,1),e===this.active?(this.active=this.openTabs[Math.min(t,this.openTabs.length-1)],this.lastTyping=0,this.showActive(),this.refresh()):this.renderTabs())}snapshot(){return JSON.stringify({project:this.project,active:this.active})}remember(){this.history.push(this.snapshot()),this.history.length>xn&&this.history.shift(),this.future=[]}setProject(e,t=this.active){var s;this.remember(),this.lastTyping=0,this.project=e,this.active=e.files.some(i=>i.path===t)?t:(s=e.files[0])==null?void 0:s.path,this.showActive(),this.refresh()}openFile(e){if(e===this.active)return;this.active=e,this.lastTyping=0,this.showActive();const t=D(e);this.currentPackage=t,this.open.set(`pkg:${t}`,!0),this.refresh()}typed(){const e=this.activeFile;if(!e)return;const t=Date.now();t-this.lastTyping>1500&&this.remember(),this.lastTyping=t,this.project=$e(this.project,e.path,this.editor.text),this.saveBreakpoints(),this.dbg&&this.stopDebug("web_visuobject_dbg_code_changed"),this.refresh(),clearTimeout(this.renameTimer),this.renameTimer=window.setTimeout(()=>this.syncFileName(),700)}syncFileName(){var c;const e=this.activeFile;if(!e||this.editing)return;const t=Q(e.path).replace(/\.java$/i,""),s=this.classes.filter(l=>l.path===e.path);if(s.length===0||s.some(l=>l.name===t))return;const i=((c=/\bpublic\s+(?:abstract\s+|final\s+)*(?:class|interface|enum)\s+(\w+)/.exec(e.text))==null?void 0:c[1])??s[0].name;if(!pe.test(i)||s.filter(l=>l.name===i).length!==1)return;const n=le(D(e.path),`${i}.java`);if(this.project.files.some(l=>l.path===n))return;let o=Oe(this.project,e.path,n);const r=this.positions.get(t);r&&!this.positions.has(i)&&this.positions.set(i,r);for(const l of Object.keys(o.uml??{}))l.startsWith(`${t}.`)&&(o={...o,uml:ke(o.uml,l,i+l.slice(t.length))});this.openTabs=this.openTabs.map(l=>l===e.path?n:l),this.treeSelection===`file:${e.path}`&&(this.treeSelection=`file:${n}`),this.isOpen(`file:${e.path}`)&&this.open.set(`file:${n}`,!0),this.project=o,this.active=n,J(ot,n),this.savePositions(),this.refresh()}undo(e){const t=e?this.future:this.history,s=e?this.history:this.future,i=t.pop();if(i===void 0)return;s.push(this.snapshot());const n=JSON.parse(i);this.project=n.project,this.active=n.active,this.lastTyping=0,this.showActive(),this.refresh()}refresh(){J(os,Pe(this.project)),this.renderTabs(),this.classes=Ct(this.project),this.selection&&!this.findClass(this.selection.cls)&&(this.selection=void 0),this.relSelection&&!this.findRelation(this.relSelection)&&!this.findDependency(this.relSelection)&&(this.relSelection=void 0),this.editing||(this.render(),this.renderTree())}ownTypesAt(e){const t=this.activeFile;if(!t)return;const s=this.editor.view.state.doc.toString(),i=X(D(t.path)),n=oe(s).map(l=>({...l,pkg:i})),o=new Set(n.map(l=>l.name)),r=n.find(l=>l.headerFrom<=e&&e<=l.bodyEnd),c=ct()==="de"?"de":ct()==="pt-PT"?"pt":"en";return Ui([...n,...this.classes.filter(l=>l.path!==t.path&&!o.has(l.name))],{cls:r==null?void 0:r.name,pkg:i},c)}findClass(e){return this.classes.find(t=>t.name===e)}caretMoved(){var n,o;const e=this.editor.caret,t=this.classes.find(r=>r.path===this.active&&e>=r.from&&e<=r.to),s=t==null?void 0:t.members.findIndex(r=>e>=r.from&&e<=r.to),i=t?{cls:t.name,member:s!==void 0&&s>=0?s:void 0}:void 0;(i==null?void 0:i.cls)===((n=this.selection)==null?void 0:n.cls)&&(i==null?void 0:i.member)===((o=this.selection)==null?void 0:o.member)||(this.selection=i,this.editing||(this.render(),this.renderTree()))}showInCode(e,t){e.path!==this.active&&(this.active=e.path,this.lastTyping=0,this.showActive());const s=this.editor.view,[i,n]=t?[t.headerFrom,t.headerTo]:[e.nameFrom,e.nameTo],o=Math.min(n,s.state.doc.length);s.dispatch({selection:{anchor:Math.min(i,o),head:o},scrollIntoView:!0})}message(e,t=!1){this.status.textContent=e,this.status.classList.toggle("hint",t)}openFiles(){const e=document.createElement("input");e.type="file",e.multiple=!0,e.accept=".zip,.java,.visuobject,application/zip,text/plain",e.addEventListener("change",()=>void this.readFiles([...e.files??[]])),e.click()}async readFiles(e){var t;if(e.length!==0)try{const s=e.find(r=>/\.zip$/i.test(r.name));if(s){const{projectFromZip:r}=await wt(async()=>{const{projectFromZip:l}=await import("./projectZip-DrvMtqWX.js");return{projectFromZip:l}},__vite__mapDeps([0,1,2]),import.meta.url),c=r(new Uint8Array(await s.arrayBuffer()),s.name.replace(/\.zip$/i,""));await this.newProject(c);return}const i=e.find(r=>/\.visuobject$/i.test(r.name));if(i){const r=qt(await i.text());if(!r)throw new Error("format");await this.newProject(r);return}const n=At(this.project.name,await Promise.all(e.map(async r=>({name:r.name,text:await r.text()}))));let o=this.project;for(const r of n.files)o=et(o,r.path,r.text);this.setProject(o,(t=n.files[0])==null?void 0:t.path)}catch{this.message(d("web_visuobject_open_failed"))}}async save(){this.workspace?await this.writeCurrent():await this.downloadZip()}async downloadZip(){const{projectToZip:e}=await wt(async()=>{const{projectToZip:s}=await import("./projectZip-DrvMtqWX.js");return{projectToZip:s}},__vite__mapDeps([0,1,2]),import.meta.url),t=e(this.project);jn(`${this.project.name||"Projekt"}.zip`,t.slice().buffer,"application/zip")}isDirty(e){var t;return!this.workspace||this.saved===void 0?!1:e===void 0?this.saved!==Pe(this.project):this.savedFiles.get(e)!==((t=this.project.files.find(s=>s.path===e))==null?void 0:t.text)}markSaved(){this.saved=Pe(this.project),this.savedFiles=new Map(this.project.files.map(e=>[e.path,e.text]))}async restoreWorkspace(){if(!$t())return;const e=await Js(us);if(e!=null&&e.ready){const t=await _t(e.handle);if(t)return this.useWorkspace(t.root,!0)}this.pendingFolder=e==null?void 0:e.handle,this.renderWorkspace()}async useWorkspace(e,t=!1){var s;this.workspace=e,this.pendingFolder=void 0,J(rt,"0");try{this.projects=await is(e);const i=se(We),n=this.project;if(t&&i&&this.projects.includes(i)){const o={active:this.active,tabs:[...this.openTabs],positions:new Map(this.positions)};await this.loadProject(i),this.positions=o.positions,this.savePositions(),Pe(n)!==this.saved&&(this.project=n),this.openTabs=o.tabs.filter(r=>this.project.files.some(c=>c.path===r)),this.active=this.project.files.some(r=>r.path===o.active)?o.active:(s=this.project.files[0])==null?void 0:s.path,this.showActive(),this.refresh()}else!this.projects.some(o=>o.toLowerCase()===ge(n.name).toLowerCase())&&n.files.length?(this.folder=ge(n.name),await this.writeCurrent(!1)):this.projects.length?await this.loadProject(this.projects.includes(i??"")?i:this.projects[0]):(this.folder=ge(n.name),await this.writeCurrent(!1))}catch(i){this.message(d("web_visuobject_ws_failed",String((i==null?void 0:i.message)??i)))}this.renderWorkspace(),this.refresh()}async loadProject(e){var i;const{project:t,positions:s}=await gn(this.workspace,e);this.folder=e,this.project=t,this.markSaved(),this.message(""),this.history=[],this.future=[],this.lastTyping=0,this.selection=void 0,this.relSelection=void 0,this.treeSelection=void 0,this.currentPackage=void 0,this.positions=new Map(Object.entries(s)),this.savePositions(),this.openTabs=[],this.active=(i=t.files[0])==null?void 0:i.path,J(We,e),this.showActive(),this.refresh()}async writeCurrent(e=!0){const t=this.workspace;if(!t)return!1;const s=ge(this.project.name),i=this.folder,n=new Set(this.classes.map(r=>r.name)),o=Object.fromEntries([...this.positions].filter(([r])=>n.has(r)));if(s!==i&&this.projects.some(r=>r!==i&&r.toLowerCase()===s.toLowerCase()))return this.message(d("web_visuobject_ws_taken",this.project.name)),!1;try{return await $n(t,s,this.project,o),i&&i!==s&&this.projects.includes(i)&&await t.remove(i),this.folder=s,this.projects=await is(t),J(We,s),this.markSaved(),e&&this.message(d("web_visuobject_ws_saved",t.name,s),!0),this.refresh(),!0}catch(r){return this.message(d("web_visuobject_ws_failed",String((r==null?void 0:r.message)??r))),!1}}async switchProject(e){if(!(!this.workspace||e===this.folder)&&!(this.isDirty()&&!await this.writeCurrent(!1)))try{await this.loadProject(e)}catch(t){this.message(d("web_visuobject_ws_failed",String((t==null?void 0:t.message)??t)))}}async newProject(e,t,s=!1){var n,o;if(!this.workspace){this.setProject(e,t??((n=e.files[0])==null?void 0:n.path)),e.files.length===0&&!s&&this.editProjectName();return}if(this.isDirty()&&!await this.writeCurrent(!1))return;const i=ns(ge(e.name),this.projects);this.project={...e,name:i},this.folder=i,this.history=[],this.future=[],this.openTabs=[],this.positions.clear(),this.savePositions(),this.active=e.files.some(r=>r.path===t)?t:(o=e.files[0])==null?void 0:o.path,this.showActive(),this.refresh(),await this.writeCurrent(!1)&&(this.message(d("web_visuobject_ws_created",i),!0),e.files.length===0&&!s&&this.editProjectName())}get currentPlace(){const e=this.currentPackage??(this.active?D(this.active):ce(this.project)[0]??"");return{root:U(e),pkg:X(e)}}async newFromWizard(e){var u;const t=this.currentPlace,s=(f,m)=>{let g=f;for(let _=2;m(g);_++)g=f+_;return g},i=await nn(e,{roots:ue(this.project),packagesIn:f=>ce(this.project,f).map(X),classes:this.classes,root:t.root,pkg:t.pkg,suggest:f=>f==="project"?ns(d("web_visuobject_project_name"),this.workspace?[...this.projects,this.folder??""]:[]):f==="folder"?s("test",m=>ue(this.project).includes(m)):f==="package"?s(d("web_visuobject_new_package_name"),m=>ce(this.project).includes(re(t.root,m))):this.uniqueClassName(d(f==="class"?"web_visuobject_new_class_name":"web_visuobject_new_interface_name")),check:(f,m,g,_)=>{if(!m)return d("web_visuobject_new_name_missing");if(f==="project")return this.workspace&&this.projects.some(y=>y!==this.folder&&y.toLowerCase()===ge(m).toLowerCase())?d("web_visuobject_ws_taken",m):void 0;if(f==="folder")return!Je(m)||ue(this.project).includes(m)?d("web_visuobject_bad_folder",m):void 0;if(f==="package")return!Mt(m)||ce(this.project).includes(re(g,m))?d("web_visuobject_bad_package",m):void 0;if(!pe.test(m))return d("web_visuobject_bad_name",m);if(this.findClass(m)||this.project.files.some(y=>y.path===le(re(g,_),`${m}.java`)))return d("web_visuobject_new_exists",m);if(m.charAt(0)!==m.charAt(0).toUpperCase())return d("web_visuobject_new_upper")}});if(!i)return;const{name:n,root:o,pkg:r}=i;if(e==="project")return this.newProject({name:n,files:[],packages:[]},void 0,!0);if(this.message(""),e==="folder")return this.currentPackage=re(n,""),this.treeSelection=`root:${n}`,this.open.set(`root:${n}`,!0),this.setProject(mi(this.project,n));if(e==="package"){const f=re(o,n);return this.currentPackage=f,this.treeSelection=`pkg:${f}`,this.open.set(`root:${o}`,!0),this.setProject(pi(this.project,f))}const c=re(o,r),l=le(c,`${n}.java`);this.currentPackage=c,this.selection={cls:n},this.open.set(`root:${o}`,!0),this.open.set(`pkg:${c}`,!0),this.setProject(et(this.project,l,this.sectioned(tn(i.options),n)),l);const h=this.findClass(n);h&&this.showInCode(h),(u=this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(n)}"]`))==null||u.scrollIntoView({block:"nearest",inline:"nearest"})}editProjectName(){this.treeSelection="project",this.renderTree(),this.startEditing(this.tree.querySelector('[data-node="project"] > .vo-row .vo-label'))}renderWorkspace(){const e=this.wsBox;e.hidden=!$t();const t=this.shell.querySelector("[data-action=save]");if(t.dataset.tip=d(this.workspace?"web_visuobject_save_ws_tip":"web_visuobject_save_tip"),e.hidden)return;const s=(i,n,o="text-button",r)=>``;this.workspace?(e.className="vo-ws",e.innerHTML=`${b(this.workspace.name)} + `}).join("")}onTabClick(e){var i;const t=e.target,s=(i=t.closest("[data-tab]"))==null?void 0:i.dataset.tab;if(s){if(t.closest("[data-close]"))return this.closeTab(s);this.treeSelection=`file:${s}`,this.openFile(s)}}closeTab(e){const t=this.openTabs.indexOf(e);t<0||(this.openTabs.splice(t,1),e===this.active?(this.active=this.openTabs[Math.min(t,this.openTabs.length-1)],this.lastTyping=0,this.showActive(),this.refresh()):this.renderTabs())}snapshot(){return JSON.stringify({project:this.project,active:this.active})}remember(){this.history.push(this.snapshot()),this.history.length>xn&&this.history.shift(),this.future=[]}setProject(e,t=this.active){var s;this.remember(),this.lastTyping=0,this.project=e,this.active=e.files.some(i=>i.path===t)?t:(s=e.files[0])==null?void 0:s.path,this.showActive(),this.refresh()}openFile(e){if(e===this.active)return;this.active=e,this.lastTyping=0,this.showActive();const t=D(e);this.currentPackage=t,this.open.set(`pkg:${t}`,!0),this.refresh()}typed(){const e=this.activeFile;if(!e)return;const t=Date.now();t-this.lastTyping>1500&&this.remember(),this.lastTyping=t,this.project=$e(this.project,e.path,this.editor.text),this.saveBreakpoints(),this.dbg&&this.stopDebug("web_visuobject_dbg_code_changed"),this.refresh(),clearTimeout(this.renameTimer),this.renameTimer=window.setTimeout(()=>this.syncFileName(),700)}syncFileName(){var c;const e=this.activeFile;if(!e||this.editing)return;const t=Q(e.path).replace(/\.java$/i,""),s=this.classes.filter(l=>l.path===e.path);if(s.length===0||s.some(l=>l.name===t))return;const i=((c=/\bpublic\s+(?:abstract\s+|final\s+)*(?:class|interface|enum)\s+(\w+)/.exec(e.text))==null?void 0:c[1])??s[0].name;if(!pe.test(i)||s.filter(l=>l.name===i).length!==1)return;const n=le(D(e.path),`${i}.java`);if(this.project.files.some(l=>l.path===n))return;let o=Oe(this.project,e.path,n);const r=this.positions.get(t);r&&!this.positions.has(i)&&this.positions.set(i,r);for(const l of Object.keys(o.uml??{}))l.startsWith(`${t}.`)&&(o={...o,uml:ke(o.uml,l,i+l.slice(t.length))});this.openTabs=this.openTabs.map(l=>l===e.path?n:l),this.treeSelection===`file:${e.path}`&&(this.treeSelection=`file:${n}`),this.isOpen(`file:${e.path}`)&&this.open.set(`file:${n}`,!0),this.project=o,this.active=n,J(ot,n),this.savePositions(),this.refresh()}undo(e){const t=e?this.future:this.history,s=e?this.history:this.future,i=t.pop();if(i===void 0)return;s.push(this.snapshot());const n=JSON.parse(i);this.project=n.project,this.active=n.active,this.lastTyping=0,this.showActive(),this.refresh()}refresh(){J(os,Pe(this.project)),this.renderTabs(),this.classes=Ct(this.project),this.selection&&!this.findClass(this.selection.cls)&&(this.selection=void 0),this.relSelection&&!this.findRelation(this.relSelection)&&!this.findDependency(this.relSelection)&&(this.relSelection=void 0),this.editing||(this.render(),this.renderTree())}ownTypesAt(e){const t=this.activeFile;if(!t)return;const s=this.editor.view.state.doc.toString(),i=X(D(t.path)),n=oe(s).map(l=>({...l,pkg:i})),o=new Set(n.map(l=>l.name)),r=n.find(l=>l.headerFrom<=e&&e<=l.bodyEnd),c=ct()==="de"?"de":ct()==="pt-PT"?"pt":"en";return Ui([...n,...this.classes.filter(l=>l.path!==t.path&&!o.has(l.name))],{cls:r==null?void 0:r.name,pkg:i},c)}findClass(e){return this.classes.find(t=>t.name===e)}caretMoved(){var n,o;const e=this.editor.caret,t=this.classes.find(r=>r.path===this.active&&e>=r.from&&e<=r.to),s=t==null?void 0:t.members.findIndex(r=>e>=r.from&&e<=r.to),i=t?{cls:t.name,member:s!==void 0&&s>=0?s:void 0}:void 0;(i==null?void 0:i.cls)===((n=this.selection)==null?void 0:n.cls)&&(i==null?void 0:i.member)===((o=this.selection)==null?void 0:o.member)||(this.selection=i,this.editing||(this.render(),this.renderTree()))}showInCode(e,t){e.path!==this.active&&(this.active=e.path,this.lastTyping=0,this.showActive());const s=this.editor.view,[i,n]=t?[t.headerFrom,t.headerTo]:[e.nameFrom,e.nameTo],o=Math.min(n,s.state.doc.length);s.dispatch({selection:{anchor:Math.min(i,o),head:o},scrollIntoView:!0})}message(e,t=!1){this.status.textContent=e,this.status.classList.toggle("hint",t)}openFiles(){const e=document.createElement("input");e.type="file",e.multiple=!0,e.accept=".zip,.java,.visuobject,application/zip,text/plain",e.addEventListener("change",()=>void this.readFiles([...e.files??[]])),e.click()}async readFiles(e){var t;if(e.length!==0)try{const s=e.find(r=>/\.zip$/i.test(r.name));if(s){const{projectFromZip:r}=await wt(async()=>{const{projectFromZip:l}=await import("./projectZip-Be-EqLrM.js");return{projectFromZip:l}},__vite__mapDeps([0,1,2]),import.meta.url),c=r(new Uint8Array(await s.arrayBuffer()),s.name.replace(/\.zip$/i,""));await this.newProject(c);return}const i=e.find(r=>/\.visuobject$/i.test(r.name));if(i){const r=qt(await i.text());if(!r)throw new Error("format");await this.newProject(r);return}const n=At(this.project.name,await Promise.all(e.map(async r=>({name:r.name,text:await r.text()}))));let o=this.project;for(const r of n.files)o=et(o,r.path,r.text);this.setProject(o,(t=n.files[0])==null?void 0:t.path)}catch{this.message(d("web_visuobject_open_failed"))}}async save(){this.workspace?await this.writeCurrent():await this.downloadZip()}async downloadZip(){const{projectToZip:e}=await wt(async()=>{const{projectToZip:s}=await import("./projectZip-Be-EqLrM.js");return{projectToZip:s}},__vite__mapDeps([0,1,2]),import.meta.url),t=e(this.project);jn(`${this.project.name||"Projekt"}.zip`,t.slice().buffer,"application/zip")}isDirty(e){var t;return!this.workspace||this.saved===void 0?!1:e===void 0?this.saved!==Pe(this.project):this.savedFiles.get(e)!==((t=this.project.files.find(s=>s.path===e))==null?void 0:t.text)}markSaved(){this.saved=Pe(this.project),this.savedFiles=new Map(this.project.files.map(e=>[e.path,e.text]))}async restoreWorkspace(){if(!$t())return;const e=await Js(us);if(e!=null&&e.ready){const t=await _t(e.handle);if(t)return this.useWorkspace(t.root,!0)}this.pendingFolder=e==null?void 0:e.handle,this.renderWorkspace()}async useWorkspace(e,t=!1){var s;this.workspace=e,this.pendingFolder=void 0,J(rt,"0");try{this.projects=await is(e);const i=se(We),n=this.project;if(t&&i&&this.projects.includes(i)){const o={active:this.active,tabs:[...this.openTabs],positions:new Map(this.positions)};await this.loadProject(i),this.positions=o.positions,this.savePositions(),Pe(n)!==this.saved&&(this.project=n),this.openTabs=o.tabs.filter(r=>this.project.files.some(c=>c.path===r)),this.active=this.project.files.some(r=>r.path===o.active)?o.active:(s=this.project.files[0])==null?void 0:s.path,this.showActive(),this.refresh()}else!this.projects.some(o=>o.toLowerCase()===ge(n.name).toLowerCase())&&n.files.length?(this.folder=ge(n.name),await this.writeCurrent(!1)):this.projects.length?await this.loadProject(this.projects.includes(i??"")?i:this.projects[0]):(this.folder=ge(n.name),await this.writeCurrent(!1))}catch(i){this.message(d("web_visuobject_ws_failed",String((i==null?void 0:i.message)??i)))}this.renderWorkspace(),this.refresh()}async loadProject(e){var i;const{project:t,positions:s}=await gn(this.workspace,e);this.folder=e,this.project=t,this.markSaved(),this.message(""),this.history=[],this.future=[],this.lastTyping=0,this.selection=void 0,this.relSelection=void 0,this.treeSelection=void 0,this.currentPackage=void 0,this.positions=new Map(Object.entries(s)),this.savePositions(),this.openTabs=[],this.active=(i=t.files[0])==null?void 0:i.path,J(We,e),this.showActive(),this.refresh()}async writeCurrent(e=!0){const t=this.workspace;if(!t)return!1;const s=ge(this.project.name),i=this.folder,n=new Set(this.classes.map(r=>r.name)),o=Object.fromEntries([...this.positions].filter(([r])=>n.has(r)));if(s!==i&&this.projects.some(r=>r!==i&&r.toLowerCase()===s.toLowerCase()))return this.message(d("web_visuobject_ws_taken",this.project.name)),!1;try{return await $n(t,s,this.project,o),i&&i!==s&&this.projects.includes(i)&&await t.remove(i),this.folder=s,this.projects=await is(t),J(We,s),this.markSaved(),e&&this.message(d("web_visuobject_ws_saved",t.name,s),!0),this.refresh(),!0}catch(r){return this.message(d("web_visuobject_ws_failed",String((r==null?void 0:r.message)??r))),!1}}async switchProject(e){if(!(!this.workspace||e===this.folder)&&!(this.isDirty()&&!await this.writeCurrent(!1)))try{await this.loadProject(e)}catch(t){this.message(d("web_visuobject_ws_failed",String((t==null?void 0:t.message)??t)))}}async newProject(e,t,s=!1){var n,o;if(!this.workspace){this.setProject(e,t??((n=e.files[0])==null?void 0:n.path)),e.files.length===0&&!s&&this.editProjectName();return}if(this.isDirty()&&!await this.writeCurrent(!1))return;const i=ns(ge(e.name),this.projects);this.project={...e,name:i},this.folder=i,this.history=[],this.future=[],this.openTabs=[],this.positions.clear(),this.savePositions(),this.active=e.files.some(r=>r.path===t)?t:(o=e.files[0])==null?void 0:o.path,this.showActive(),this.refresh(),await this.writeCurrent(!1)&&(this.message(d("web_visuobject_ws_created",i),!0),e.files.length===0&&!s&&this.editProjectName())}get currentPlace(){const e=this.currentPackage??(this.active?D(this.active):ce(this.project)[0]??"");return{root:U(e),pkg:X(e)}}async newFromWizard(e){var u;const t=this.currentPlace,s=(f,m)=>{let g=f;for(let _=2;m(g);_++)g=f+_;return g},i=await nn(e,{roots:ue(this.project),packagesIn:f=>ce(this.project,f).map(X),classes:this.classes,root:t.root,pkg:t.pkg,suggest:f=>f==="project"?ns(d("web_visuobject_project_name"),this.workspace?[...this.projects,this.folder??""]:[]):f==="folder"?s("test",m=>ue(this.project).includes(m)):f==="package"?s(d("web_visuobject_new_package_name"),m=>ce(this.project).includes(re(t.root,m))):this.uniqueClassName(d(f==="class"?"web_visuobject_new_class_name":"web_visuobject_new_interface_name")),check:(f,m,g,_)=>{if(!m)return d("web_visuobject_new_name_missing");if(f==="project")return this.workspace&&this.projects.some(y=>y!==this.folder&&y.toLowerCase()===ge(m).toLowerCase())?d("web_visuobject_ws_taken",m):void 0;if(f==="folder")return!Je(m)||ue(this.project).includes(m)?d("web_visuobject_bad_folder",m):void 0;if(f==="package")return!Mt(m)||ce(this.project).includes(re(g,m))?d("web_visuobject_bad_package",m):void 0;if(!pe.test(m))return d("web_visuobject_bad_name",m);if(this.findClass(m)||this.project.files.some(y=>y.path===le(re(g,_),`${m}.java`)))return d("web_visuobject_new_exists",m);if(m.charAt(0)!==m.charAt(0).toUpperCase())return d("web_visuobject_new_upper")}});if(!i)return;const{name:n,root:o,pkg:r}=i;if(e==="project")return this.newProject({name:n,files:[],packages:[]},void 0,!0);if(this.message(""),e==="folder")return this.currentPackage=re(n,""),this.treeSelection=`root:${n}`,this.open.set(`root:${n}`,!0),this.setProject(mi(this.project,n));if(e==="package"){const f=re(o,n);return this.currentPackage=f,this.treeSelection=`pkg:${f}`,this.open.set(`root:${o}`,!0),this.setProject(pi(this.project,f))}const c=re(o,r),l=le(c,`${n}.java`);this.currentPackage=c,this.selection={cls:n},this.open.set(`root:${o}`,!0),this.open.set(`pkg:${c}`,!0),this.setProject(et(this.project,l,this.sectioned(tn(i.options),n)),l);const h=this.findClass(n);h&&this.showInCode(h),(u=this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(n)}"]`))==null||u.scrollIntoView({block:"nearest",inline:"nearest"})}editProjectName(){this.treeSelection="project",this.renderTree(),this.startEditing(this.tree.querySelector('[data-node="project"] > .vo-row .vo-label'))}renderWorkspace(){const e=this.wsBox;e.hidden=!$t();const t=this.shell.querySelector("[data-action=save]");if(t.dataset.tip=d(this.workspace?"web_visuobject_save_ws_tip":"web_visuobject_save_tip"),e.hidden)return;const s=(i,n,o="text-button",r)=>``;this.workspace?(e.className="vo-ws",e.innerHTML=`${b(this.workspace.name)} ${s("zip",d("web_visuobject_ws_zip"),"text-button",d("web_visuobject_ws_zip_tip"))} ${s("switch",d("web_visuobject_ws_switch"),"text-button")}`):this.pendingFolder?(e.className="vo-ws",e.innerHTML=`${s("reopen",d("web_visuobject_ws_reopen",this.pendingFolder.name),"text-button primary")}${s("switch",d("web_visuobject_ws_switch"),"text-button")}`):se(rt)==="1"?(e.className="vo-ws",e.innerHTML=s("open",d("web_visuobject_ws_choose"),"text-button",d("web_visuobject_ws_hint"))):(e.className="vo-ws ask",e.innerHTML=`

${b(d("web_visuobject_ws_question"))}

${b(d("web_visuobject_ws_hint"))}

diff --git a/website/app/assets/projectZip-DrvMtqWX.js b/website/app/assets/projectZip-Be-EqLrM.js similarity index 99% rename from website/app/assets/projectZip-DrvMtqWX.js rename to website/app/assets/projectZip-Be-EqLrM.js index 58e4e06a..f2dbe759 100644 --- a/website/app/assets/projectZip-DrvMtqWX.js +++ b/website/app/assets/projectZip-Be-EqLrM.js @@ -1 +1 @@ -import{p as Br,d as Er,a as mr,i as Gr,b as Qr,c as Vr,u as Lr,n as _r,o as pr,e as br,r as dr,f as re,s as ee}from"./objectApp-D9StvWDS.js";import"./index-Bx-6trOD.js";var M=Uint8Array,K=Uint16Array,Tr=Int32Array,hr=new M([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),gr=new M([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Sr=new M([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Wr=function(r,e){for(var n=new K(31),a=0;a<31;++a)n[a]=e+=1<>1|(F&21845)<<1;b=(b&52428)>>2|(b&13107)<<2,b=(b&61680)>>4|(b&3855)<<4,Cr[F]=((b&65280)>>8|(b&255)<<8)>>1}var V=(function(r,e,n){for(var a=r.length,f=0,v=new K(e);f>l]=c}else for(s=new K(a),f=0;f>15-r[f]);return s}),d=new M(288);for(var F=0;F<144;++F)d[F]=8;for(var F=144;F<256;++F)d[F]=9;for(var F=256;F<280;++F)d[F]=7;for(var F=280;F<288;++F)d[F]=8;var ir=new M(32);for(var F=0;F<32;++F)ir[F]=5;var ae=V(d,9,0),fe=V(d,9,1),ve=V(ir,5,0),te=V(ir,5,1),xr=function(r){for(var e=r[0],n=1;ne&&(e=r[n]);return e},X=function(r,e,n){var a=e/8|0;return(r[a]|r[a+1]<<8)>>(e&7)&n},yr=function(r,e){var n=e/8|0;return(r[n]|r[n+1]<<8|r[n+2]<<16)>>(e&7)},Ur=function(r){return(r+7)/8|0},lr=function(r,e,n){return(e==null||e<0)&&(e=0),(n==null||n>r.length)&&(n=r.length),new M(r.subarray(e,n))},oe=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],I=function(r,e,n){var a=new Error(e||oe[r]);if(a.code=r,Error.captureStackTrace&&Error.captureStackTrace(a,I),!n)throw a;return a},ie=function(r,e,n,a){var f=r.length,v=a?a.length:0;if(!f||e.f&&!e.l)return n||new M(0);var i=!n,s=i||e.i!=2,l=e.i;i&&(n=new M(f*3));var c=function(fr){var vr=n.length;if(fr>vr){var nr=new M(Math.max(vr*2,fr));nr.set(n),n=nr}},t=e.f||0,o=e.p||0,u=e.b||0,h=e.l,y=e.d,w=e.m,x=e.n,T=f*8;do{if(!h){t=X(r,o,1);var z=X(r,o+1,3);if(o+=3,z)if(z==1)h=fe,y=te,w=9,x=5;else if(z==2){var U=X(r,o,31)+257,A=X(r,o+10,15)+4,m=U+X(r,o+5,31)+1;o+=14;for(var g=new M(m),B=new M(19),j=0;j>4;if(C<16)g[j++]=C;else{var E=0,k=0;for(C==16?(k=3+X(r,o,3),o+=2,E=g[j-1]):C==17?(k=3+X(r,o,7),o+=3):C==18&&(k=11+X(r,o,127),o+=7);k--;)g[j++]=E}}var W=g.subarray(0,U),J=g.subarray(U);w=xr(W),x=xr(J),h=V(W,w,1),y=V(J,x,1)}else I(1);else{var C=Ur(o)+4,O=r[C-4]|r[C-3]<<8,$=C+O;if($>f){l&&I(0);break}s&&c(u+O),n.set(r.subarray(C,$),u),e.b=u+=O,e.p=o=$*8,e.f=t;continue}if(o>T){l&&I(0);break}}s&&c(u+131072);for(var ar=(1<>4;if(o+=E&15,o>T){l&&I(0);break}if(E||I(2),q<256)n[u++]=q;else if(q==256){L=o,h=null;break}else{var H=q-254;if(q>264){var j=q-257,S=hr[j];H=X(r,o,(1<>4;G||I(3),o+=G&15;var J=ne[rr];if(rr>3){var S=gr[rr];J+=yr(r,o)&(1<T){l&&I(0);break}s&&c(u+131072);var er=u+H;if(u>8},tr=function(r,e,n){n<<=e&7;var a=e/8|0;r[a]|=n,r[a+1]|=n>>8,r[a+2]|=n>>16},Fr=function(r,e){for(var n=[],a=0;au&&(u=v[a].s);var h=new K(u+1),y=Or(n[t-1],h,0);if(y>e){var a=0,w=0,x=y-e,T=1<e)w+=T-(1<>=x;w>0;){var C=v[a].s;h[C]=0&&w;--a){var O=v[a].s;h[O]==e&&(--h[O],++w)}y=e}return{t:new M(h),l:y}},Or=function(r,e,n){return r.s==-1?Math.max(Or(r.l,e,n+1),Or(r.r,e,n+1)):e[r.s]=n},Nr=function(r){for(var e=r.length;e&&!r[--e];);for(var n=new K(++e),a=0,f=r[0],v=1,i=function(l){n[a++]=l},s=1;s<=e;++s)if(r[s]==f&&s!=e)++v;else{if(!f&&v>2){for(;v>138;v-=138)i(32754);v>2&&(i(v>10?v-11<<5|28690:v-3<<5|12305),v=0)}else if(v>3){for(i(f),--v;v>6;v-=6)i(8304);v>2&&(i(v-3<<5|8208),v=0)}for(;v--;)i(f);v=1,f=r[s]}return{c:n.subarray(0,a),n:e}},or=function(r,e){for(var n=0,a=0;a>8,r[f+2]=r[f]^255,r[f+3]=r[f+1]^255;for(var v=0;v4&&!B[Sr[D-1]];--D);var p=c+5<<3,Z=or(f,d)+or(v,ir)+i,P=or(f,u)+or(v,w)+i+14+3*D+or(A,B)+2*A[16]+3*A[17]+7*A[18];if(l>=0&&p<=Z&&p<=P)return Kr(e,t,r.subarray(l,l+c));var E,k,W,J;if(_(e,t,1+(P15&&(_(e,t,q[m]>>5&127),t+=q[m]>>12)}}else E=ae,k=d,W=ve,J=ir;for(var m=0;m255){var H=S>>18&31;tr(e,t,E[H+257]),t+=k[H+257],H>7&&(_(e,t,S>>23&31),t+=hr[H]);var G=S&31;tr(e,t,W[G]),t+=J[G],G>3&&(tr(e,t,S>>5&8191),t+=gr[G])}else tr(e,t,E[S]),t+=k[S]}return tr(e,t,E[256]),t+k[256]},le=new Tr([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Rr=new M(0),se=function(r,e,n,a,f,v){var i=v.z||r.length,s=new M(a+i+5*(1+Math.ceil(i/7e3))+f),l=s.subarray(a,s.length-f),c=v.l,t=(v.r||0)&7;if(e){t&&(l[0]=v.r>>3);for(var o=le[e-1],u=o>>13,h=o&8191,y=(1<7e3||B>24576)&&(E>423||!c)){t=Dr(r,l,0,O,$,U,m,B,D,g-D,t),B=A=m=0,D=g;for(var k=0;k<286;++k)$[k]=0;for(var k=0;k<30;++k)U[k]=0}var W=2,J=0,ar=h,R=Z-P&32767;if(E>2&&p==C(g-R))for(var L=Math.min(u,E)-1,q=Math.min(32767,g),H=Math.min(258,E);R<=q&&--ar&&Z!=P;){if(r[g+W]==r[g+W-R]){for(var S=0;SW){if(W=S,J=R,S>L)break;for(var G=Math.min(R,S-2),rr=0,k=0;krr&&(rr=ur,P=er)}}}Z=P,P=w[Z],R+=Z-P&32767}if(J){O[B++]=268435456|Mr[W]<<18|Jr[J];var fr=Mr[W]&31,vr=Jr[J]&31;m+=hr[fr]+gr[vr],++$[257+fr],++U[vr],j=g+W,++A}else O[B++]=r[g],++$[r[g]]}}for(g=Math.max(g,j);g=i&&(l[t/8|0]=c,nr=i),t=Kr(l,t+1,r.subarray(g,nr))}v.i=i}return lr(s,0,a+Ur(t)+f)},ue=(function(){for(var r=new Int32Array(256),e=0;e<256;++e){for(var n=e,a=9;--a;)n=(n&1&&-306674912)^n>>>1;r[e]=n}return r})(),ce=function(){var r=-1;return{p:function(e){for(var n=r,a=0;a>>8;r=n},d:function(){return~r}}},he=function(r,e,n,a,f){if(!f&&(f={l:1},e.dictionary)){var v=e.dictionary.subarray(-32768),i=new M(v.length+r.length);i.set(v),i.set(r,v.length),r=i,f.w=v.length}return se(r,e.level==null?6:e.level,e.mem==null?f.l?Math.ceil(Math.max(8,Math.min(13,Math.log(r.length)))*1.5):20:12+e.mem,n,a,f)},Xr=function(r,e){var n={};for(var a in r)n[a]=r[a];for(var a in e)n[a]=e[a];return n},Q=function(r,e){return r[e]|r[e+1]<<8},Y=function(r,e){return(r[e]|r[e+1]<<8|r[e+2]<<16|r[e+3]<<24)>>>0},kr=function(r,e){return Y(r,e)+Y(r,e+4)*4294967296},N=function(r,e,n){for(;n;++e)r[e]=n,n>>>=8};function ge(r,e){return he(r,e||{},0,0)}function we(r,e){return ie(r,{i:2},e&&e.out,e&&e.dictionary)}var Yr=function(r,e,n,a){for(var f in r){var v=r[f],i=e+f,s=a;Array.isArray(v)&&(s=Xr(a,v[1]),v=v[0]),v instanceof M?n[i]=[v,s]:(n[i+="/"]=[new M(0),s],Yr(v,i,n,a))}},Ir=typeof TextEncoder<"u"&&new TextEncoder,Ar=typeof TextDecoder<"u"&&new TextDecoder,me=0;try{Ar.decode(Rr,{stream:!0}),me=1}catch{}var xe=function(r){for(var e="",n=0;;){var a=r[n++],f=(a>127)+(a>223)+(a>239);if(n+f>r.length)return{s:e,r:lr(r,n-1)};f?f==3?(a=((a&15)<<18|(r[n++]&63)<<12|(r[n++]&63)<<6|r[n++]&63)-65536,e+=String.fromCharCode(55296|a>>10,56320|a&1023)):f&1?e+=String.fromCharCode((a&31)<<6|r[n++]&63):e+=String.fromCharCode((a&15)<<12|(r[n++]&63)<<6|r[n++]&63):e+=String.fromCharCode(a)}};function cr(r,e){var n;if(Ir)return Ir.encode(r);for(var a=r.length,f=new M(r.length+(r.length>>1)),v=0,i=function(c){f[v++]=c},n=0;nf.length){var s=new M(v+8+(a-n<<1));s.set(f),f=s}var l=r.charCodeAt(n);l<128||e?i(l):l<2048?(i(192|l>>6),i(128|l&63)):l>55295&&l<57344?(l=65536+(l&1047552)|r.charCodeAt(++n)&1023,i(240|l>>18),i(128|l>>12&63),i(128|l>>6&63),i(128|l&63)):(i(224|l>>12),i(128|l>>6&63),i(128|l&63))}return lr(f,0,v)}function jr(r,e){if(e){for(var n="",a=0;a65535&&I(9),e+=a+4}return e},Pr=function(r,e,n,a,f,v,i,s){var l=a.length,c=n.extra,t=s&&s.length,o=zr(c);N(r,e,i!=null?33639248:67324752),e+=4,i!=null&&(r[e++]=20,r[e++]=n.os),r[e]=20,e+=2,r[e++]=n.flag<<1|(v<0&&8),r[e++]=f&&8,r[e++]=n.compression&255,r[e++]=n.compression>>8;var u=new Date(n.mtime==null?Date.now():n.mtime),h=u.getFullYear()-1980;if((h<0||h>119)&&I(10),N(r,e,h<<25|u.getMonth()+1<<21|u.getDate()<<16|u.getHours()<<11|u.getMinutes()<<5|u.getSeconds()>>1),e+=4,v!=-1&&(N(r,e,n.crc),N(r,e+4,v<0?-v-2:v),N(r,e+8,n.size)),N(r,e+12,l),N(r,e+14,o),e+=16,i!=null&&(N(r,e,t),N(r,e+6,n.attrs),N(r,e+10,i),e+=14),r.set(a,e),e+=l,o)for(var y in c){var w=c[y],x=w.length;N(r,e,+y),N(r,e+2,x),r.set(w,e+4),e+=4+x}return t&&(r.set(s,e),e+=t),e},Se=function(r,e,n,a,f){N(r,e,101010256),N(r,e+8,n),N(r,e+10,n),N(r,e+12,a),N(r,e+16,f)};function Me(r,e){e||(e={});var n={},a=[];Yr(r,"",n,e);var f=0,v=0;for(var i in n){var s=n[i],l=s[0],c=s[1],t=c.level==0?0:8,o=cr(i),u=o.length,h=c.comment,y=h&&cr(h),w=y&&y.length,x=zr(c.extra);u>65535&&I(11);var T=t?ge(l,c):l,z=T.length,C=ce();C.p(l),a.push(Xr(c,{size:l.length,crc:C.d(),c:T,f:o,m:y,u:u!=i.length||y&&h.length!=w,o:f,compression:t})),f+=30+u+x+z,v+=76+2*(u+x)+(w||0)+z}for(var O=new M(v+22),$=f,U=v-f,A=0;A65558)&&I(13);var f=Q(r,a+8);if(!f)return{};var v=Y(r,a+16),i=v==4294967295||f==65535;if(i){var s=Y(r,a-12);i=Y(r,s)==101075792,i&&(f=Y(r,s+32),v=Y(r,s+48))}for(var l=0;l|]/g,"_")||"Projekt",n={};for(const l of r.files)n[`${e}/${br(l.path)}`]=new Uint8Array(cr(l.text));const a=[...r.packages.map(l=>`${e}/${dr(l)}/${re(l).replace(/\./g,"/")}/`),...ee(r).map(l=>`${e}/${l}/`)];for(const l of a)Object.keys(n).some(c=>c.startsWith(l))||(n[l.replace(/\/\/$/,"/")]=new Uint8Array);return(r.uml&&Object.keys(r.uml).length||(f=r.notes)!=null&&f.length||(v=r.objects)!=null&&v.length)&&(n[`${e}/${$r}`]=new Uint8Array(cr(JSON.stringify({format:"visuobject",version:1,uml:r.uml??{},...(i=r.notes)!=null&&i.length?{notes:r.notes}:{},...(s=r.objects)!=null&&s.length?{objects:r.objects}:{}},null,2)))),Me(n,{level:6})}function ze(r,e){var c;const n=Ce(r),a=Object.entries(n).filter(([t])=>/\.java$/i.test(t)&&!t.startsWith("__MACOSX/")).map(([t,o])=>({name:t,text:jr(o)})),f=new Set(Object.keys(n).map(t=>t.split("/")[0])),v=f.size===1&&Object.keys(n).some(t=>t.includes("/"))?[...f][0]:e,i=v!==e,s=Br(v,[]);for(const t of a){const o=Br(v,[{name:t.name.slice(t.name.lastIndexOf("/")+1),text:t.text}]).files[0],u=t.name.split("/").slice(i?1:0,-1),h=Er(o.text).split(".").filter(Boolean),w=u.slice(u.length-h.length).join("/")===h.join("/")?u.slice(0,u.length-h.length).join("/"):"",x=w&&w!==mr&&w.split("/").every(Gr)&&!w.includes(":")?w:mr,T=Qr(Vr(x,Er(o.text)),o.path.slice(o.path.lastIndexOf("/")+1));s.files=[...s.files.filter(z=>z.path!==T),{...o,path:T}],x!==mr&&!((c=s.sourceFolders)!=null&&c.includes(x))&&(s.sourceFolders=[...s.sourceFolders??[],x])}const l=Object.entries(n).find(([t])=>t===$r||t.endsWith(`/${$r}`));if(l)try{const t=JSON.parse(jr(l[1])),o=Lr(t.uml);o&&(s.uml=o);const u=_r(t.notes);u&&(s.notes=u);const h=pr(t.objects);h&&(s.objects=h)}catch{}return s}export{ze as projectFromZip,je as projectToZip}; +import{p as Br,d as Er,a as mr,i as Gr,b as Qr,c as Vr,u as Lr,n as _r,o as pr,e as br,r as dr,f as re,s as ee}from"./objectApp-LUS8dABI.js";import"./index-DBapwQYk.js";var M=Uint8Array,K=Uint16Array,Tr=Int32Array,hr=new M([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),gr=new M([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Sr=new M([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Wr=function(r,e){for(var n=new K(31),a=0;a<31;++a)n[a]=e+=1<>1|(F&21845)<<1;b=(b&52428)>>2|(b&13107)<<2,b=(b&61680)>>4|(b&3855)<<4,Cr[F]=((b&65280)>>8|(b&255)<<8)>>1}var V=(function(r,e,n){for(var a=r.length,f=0,v=new K(e);f>l]=c}else for(s=new K(a),f=0;f>15-r[f]);return s}),d=new M(288);for(var F=0;F<144;++F)d[F]=8;for(var F=144;F<256;++F)d[F]=9;for(var F=256;F<280;++F)d[F]=7;for(var F=280;F<288;++F)d[F]=8;var ir=new M(32);for(var F=0;F<32;++F)ir[F]=5;var ae=V(d,9,0),fe=V(d,9,1),ve=V(ir,5,0),te=V(ir,5,1),xr=function(r){for(var e=r[0],n=1;ne&&(e=r[n]);return e},X=function(r,e,n){var a=e/8|0;return(r[a]|r[a+1]<<8)>>(e&7)&n},yr=function(r,e){var n=e/8|0;return(r[n]|r[n+1]<<8|r[n+2]<<16)>>(e&7)},Ur=function(r){return(r+7)/8|0},lr=function(r,e,n){return(e==null||e<0)&&(e=0),(n==null||n>r.length)&&(n=r.length),new M(r.subarray(e,n))},oe=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],I=function(r,e,n){var a=new Error(e||oe[r]);if(a.code=r,Error.captureStackTrace&&Error.captureStackTrace(a,I),!n)throw a;return a},ie=function(r,e,n,a){var f=r.length,v=a?a.length:0;if(!f||e.f&&!e.l)return n||new M(0);var i=!n,s=i||e.i!=2,l=e.i;i&&(n=new M(f*3));var c=function(fr){var vr=n.length;if(fr>vr){var nr=new M(Math.max(vr*2,fr));nr.set(n),n=nr}},t=e.f||0,o=e.p||0,u=e.b||0,h=e.l,y=e.d,w=e.m,x=e.n,T=f*8;do{if(!h){t=X(r,o,1);var z=X(r,o+1,3);if(o+=3,z)if(z==1)h=fe,y=te,w=9,x=5;else if(z==2){var U=X(r,o,31)+257,A=X(r,o+10,15)+4,m=U+X(r,o+5,31)+1;o+=14;for(var g=new M(m),B=new M(19),j=0;j>4;if(C<16)g[j++]=C;else{var E=0,k=0;for(C==16?(k=3+X(r,o,3),o+=2,E=g[j-1]):C==17?(k=3+X(r,o,7),o+=3):C==18&&(k=11+X(r,o,127),o+=7);k--;)g[j++]=E}}var W=g.subarray(0,U),J=g.subarray(U);w=xr(W),x=xr(J),h=V(W,w,1),y=V(J,x,1)}else I(1);else{var C=Ur(o)+4,O=r[C-4]|r[C-3]<<8,$=C+O;if($>f){l&&I(0);break}s&&c(u+O),n.set(r.subarray(C,$),u),e.b=u+=O,e.p=o=$*8,e.f=t;continue}if(o>T){l&&I(0);break}}s&&c(u+131072);for(var ar=(1<>4;if(o+=E&15,o>T){l&&I(0);break}if(E||I(2),q<256)n[u++]=q;else if(q==256){L=o,h=null;break}else{var H=q-254;if(q>264){var j=q-257,S=hr[j];H=X(r,o,(1<>4;G||I(3),o+=G&15;var J=ne[rr];if(rr>3){var S=gr[rr];J+=yr(r,o)&(1<T){l&&I(0);break}s&&c(u+131072);var er=u+H;if(u>8},tr=function(r,e,n){n<<=e&7;var a=e/8|0;r[a]|=n,r[a+1]|=n>>8,r[a+2]|=n>>16},Fr=function(r,e){for(var n=[],a=0;au&&(u=v[a].s);var h=new K(u+1),y=Or(n[t-1],h,0);if(y>e){var a=0,w=0,x=y-e,T=1<e)w+=T-(1<>=x;w>0;){var C=v[a].s;h[C]=0&&w;--a){var O=v[a].s;h[O]==e&&(--h[O],++w)}y=e}return{t:new M(h),l:y}},Or=function(r,e,n){return r.s==-1?Math.max(Or(r.l,e,n+1),Or(r.r,e,n+1)):e[r.s]=n},Nr=function(r){for(var e=r.length;e&&!r[--e];);for(var n=new K(++e),a=0,f=r[0],v=1,i=function(l){n[a++]=l},s=1;s<=e;++s)if(r[s]==f&&s!=e)++v;else{if(!f&&v>2){for(;v>138;v-=138)i(32754);v>2&&(i(v>10?v-11<<5|28690:v-3<<5|12305),v=0)}else if(v>3){for(i(f),--v;v>6;v-=6)i(8304);v>2&&(i(v-3<<5|8208),v=0)}for(;v--;)i(f);v=1,f=r[s]}return{c:n.subarray(0,a),n:e}},or=function(r,e){for(var n=0,a=0;a>8,r[f+2]=r[f]^255,r[f+3]=r[f+1]^255;for(var v=0;v4&&!B[Sr[D-1]];--D);var p=c+5<<3,Z=or(f,d)+or(v,ir)+i,P=or(f,u)+or(v,w)+i+14+3*D+or(A,B)+2*A[16]+3*A[17]+7*A[18];if(l>=0&&p<=Z&&p<=P)return Kr(e,t,r.subarray(l,l+c));var E,k,W,J;if(_(e,t,1+(P15&&(_(e,t,q[m]>>5&127),t+=q[m]>>12)}}else E=ae,k=d,W=ve,J=ir;for(var m=0;m255){var H=S>>18&31;tr(e,t,E[H+257]),t+=k[H+257],H>7&&(_(e,t,S>>23&31),t+=hr[H]);var G=S&31;tr(e,t,W[G]),t+=J[G],G>3&&(tr(e,t,S>>5&8191),t+=gr[G])}else tr(e,t,E[S]),t+=k[S]}return tr(e,t,E[256]),t+k[256]},le=new Tr([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Rr=new M(0),se=function(r,e,n,a,f,v){var i=v.z||r.length,s=new M(a+i+5*(1+Math.ceil(i/7e3))+f),l=s.subarray(a,s.length-f),c=v.l,t=(v.r||0)&7;if(e){t&&(l[0]=v.r>>3);for(var o=le[e-1],u=o>>13,h=o&8191,y=(1<7e3||B>24576)&&(E>423||!c)){t=Dr(r,l,0,O,$,U,m,B,D,g-D,t),B=A=m=0,D=g;for(var k=0;k<286;++k)$[k]=0;for(var k=0;k<30;++k)U[k]=0}var W=2,J=0,ar=h,R=Z-P&32767;if(E>2&&p==C(g-R))for(var L=Math.min(u,E)-1,q=Math.min(32767,g),H=Math.min(258,E);R<=q&&--ar&&Z!=P;){if(r[g+W]==r[g+W-R]){for(var S=0;SW){if(W=S,J=R,S>L)break;for(var G=Math.min(R,S-2),rr=0,k=0;krr&&(rr=ur,P=er)}}}Z=P,P=w[Z],R+=Z-P&32767}if(J){O[B++]=268435456|Mr[W]<<18|Jr[J];var fr=Mr[W]&31,vr=Jr[J]&31;m+=hr[fr]+gr[vr],++$[257+fr],++U[vr],j=g+W,++A}else O[B++]=r[g],++$[r[g]]}}for(g=Math.max(g,j);g=i&&(l[t/8|0]=c,nr=i),t=Kr(l,t+1,r.subarray(g,nr))}v.i=i}return lr(s,0,a+Ur(t)+f)},ue=(function(){for(var r=new Int32Array(256),e=0;e<256;++e){for(var n=e,a=9;--a;)n=(n&1&&-306674912)^n>>>1;r[e]=n}return r})(),ce=function(){var r=-1;return{p:function(e){for(var n=r,a=0;a>>8;r=n},d:function(){return~r}}},he=function(r,e,n,a,f){if(!f&&(f={l:1},e.dictionary)){var v=e.dictionary.subarray(-32768),i=new M(v.length+r.length);i.set(v),i.set(r,v.length),r=i,f.w=v.length}return se(r,e.level==null?6:e.level,e.mem==null?f.l?Math.ceil(Math.max(8,Math.min(13,Math.log(r.length)))*1.5):20:12+e.mem,n,a,f)},Xr=function(r,e){var n={};for(var a in r)n[a]=r[a];for(var a in e)n[a]=e[a];return n},Q=function(r,e){return r[e]|r[e+1]<<8},Y=function(r,e){return(r[e]|r[e+1]<<8|r[e+2]<<16|r[e+3]<<24)>>>0},kr=function(r,e){return Y(r,e)+Y(r,e+4)*4294967296},N=function(r,e,n){for(;n;++e)r[e]=n,n>>>=8};function ge(r,e){return he(r,e||{},0,0)}function we(r,e){return ie(r,{i:2},e&&e.out,e&&e.dictionary)}var Yr=function(r,e,n,a){for(var f in r){var v=r[f],i=e+f,s=a;Array.isArray(v)&&(s=Xr(a,v[1]),v=v[0]),v instanceof M?n[i]=[v,s]:(n[i+="/"]=[new M(0),s],Yr(v,i,n,a))}},Ir=typeof TextEncoder<"u"&&new TextEncoder,Ar=typeof TextDecoder<"u"&&new TextDecoder,me=0;try{Ar.decode(Rr,{stream:!0}),me=1}catch{}var xe=function(r){for(var e="",n=0;;){var a=r[n++],f=(a>127)+(a>223)+(a>239);if(n+f>r.length)return{s:e,r:lr(r,n-1)};f?f==3?(a=((a&15)<<18|(r[n++]&63)<<12|(r[n++]&63)<<6|r[n++]&63)-65536,e+=String.fromCharCode(55296|a>>10,56320|a&1023)):f&1?e+=String.fromCharCode((a&31)<<6|r[n++]&63):e+=String.fromCharCode((a&15)<<12|(r[n++]&63)<<6|r[n++]&63):e+=String.fromCharCode(a)}};function cr(r,e){var n;if(Ir)return Ir.encode(r);for(var a=r.length,f=new M(r.length+(r.length>>1)),v=0,i=function(c){f[v++]=c},n=0;nf.length){var s=new M(v+8+(a-n<<1));s.set(f),f=s}var l=r.charCodeAt(n);l<128||e?i(l):l<2048?(i(192|l>>6),i(128|l&63)):l>55295&&l<57344?(l=65536+(l&1047552)|r.charCodeAt(++n)&1023,i(240|l>>18),i(128|l>>12&63),i(128|l>>6&63),i(128|l&63)):(i(224|l>>12),i(128|l>>6&63),i(128|l&63))}return lr(f,0,v)}function jr(r,e){if(e){for(var n="",a=0;a65535&&I(9),e+=a+4}return e},Pr=function(r,e,n,a,f,v,i,s){var l=a.length,c=n.extra,t=s&&s.length,o=zr(c);N(r,e,i!=null?33639248:67324752),e+=4,i!=null&&(r[e++]=20,r[e++]=n.os),r[e]=20,e+=2,r[e++]=n.flag<<1|(v<0&&8),r[e++]=f&&8,r[e++]=n.compression&255,r[e++]=n.compression>>8;var u=new Date(n.mtime==null?Date.now():n.mtime),h=u.getFullYear()-1980;if((h<0||h>119)&&I(10),N(r,e,h<<25|u.getMonth()+1<<21|u.getDate()<<16|u.getHours()<<11|u.getMinutes()<<5|u.getSeconds()>>1),e+=4,v!=-1&&(N(r,e,n.crc),N(r,e+4,v<0?-v-2:v),N(r,e+8,n.size)),N(r,e+12,l),N(r,e+14,o),e+=16,i!=null&&(N(r,e,t),N(r,e+6,n.attrs),N(r,e+10,i),e+=14),r.set(a,e),e+=l,o)for(var y in c){var w=c[y],x=w.length;N(r,e,+y),N(r,e+2,x),r.set(w,e+4),e+=4+x}return t&&(r.set(s,e),e+=t),e},Se=function(r,e,n,a,f){N(r,e,101010256),N(r,e+8,n),N(r,e+10,n),N(r,e+12,a),N(r,e+16,f)};function Me(r,e){e||(e={});var n={},a=[];Yr(r,"",n,e);var f=0,v=0;for(var i in n){var s=n[i],l=s[0],c=s[1],t=c.level==0?0:8,o=cr(i),u=o.length,h=c.comment,y=h&&cr(h),w=y&&y.length,x=zr(c.extra);u>65535&&I(11);var T=t?ge(l,c):l,z=T.length,C=ce();C.p(l),a.push(Xr(c,{size:l.length,crc:C.d(),c:T,f:o,m:y,u:u!=i.length||y&&h.length!=w,o:f,compression:t})),f+=30+u+x+z,v+=76+2*(u+x)+(w||0)+z}for(var O=new M(v+22),$=f,U=v-f,A=0;A65558)&&I(13);var f=Q(r,a+8);if(!f)return{};var v=Y(r,a+16),i=v==4294967295||f==65535;if(i){var s=Y(r,a-12);i=Y(r,s)==101075792,i&&(f=Y(r,s+32),v=Y(r,s+48))}for(var l=0;l|]/g,"_")||"Projekt",n={};for(const l of r.files)n[`${e}/${br(l.path)}`]=new Uint8Array(cr(l.text));const a=[...r.packages.map(l=>`${e}/${dr(l)}/${re(l).replace(/\./g,"/")}/`),...ee(r).map(l=>`${e}/${l}/`)];for(const l of a)Object.keys(n).some(c=>c.startsWith(l))||(n[l.replace(/\/\/$/,"/")]=new Uint8Array);return(r.uml&&Object.keys(r.uml).length||(f=r.notes)!=null&&f.length||(v=r.objects)!=null&&v.length)&&(n[`${e}/${$r}`]=new Uint8Array(cr(JSON.stringify({format:"visuobject",version:1,uml:r.uml??{},...(i=r.notes)!=null&&i.length?{notes:r.notes}:{},...(s=r.objects)!=null&&s.length?{objects:r.objects}:{}},null,2)))),Me(n,{level:6})}function ze(r,e){var c;const n=Ce(r),a=Object.entries(n).filter(([t])=>/\.java$/i.test(t)&&!t.startsWith("__MACOSX/")).map(([t,o])=>({name:t,text:jr(o)})),f=new Set(Object.keys(n).map(t=>t.split("/")[0])),v=f.size===1&&Object.keys(n).some(t=>t.includes("/"))?[...f][0]:e,i=v!==e,s=Br(v,[]);for(const t of a){const o=Br(v,[{name:t.name.slice(t.name.lastIndexOf("/")+1),text:t.text}]).files[0],u=t.name.split("/").slice(i?1:0,-1),h=Er(o.text).split(".").filter(Boolean),w=u.slice(u.length-h.length).join("/")===h.join("/")?u.slice(0,u.length-h.length).join("/"):"",x=w&&w!==mr&&w.split("/").every(Gr)&&!w.includes(":")?w:mr,T=Qr(Vr(x,Er(o.text)),o.path.slice(o.path.lastIndexOf("/")+1));s.files=[...s.files.filter(z=>z.path!==T),{...o,path:T}],x!==mr&&!((c=s.sourceFolders)!=null&&c.includes(x))&&(s.sourceFolders=[...s.sourceFolders??[],x])}const l=Object.entries(n).find(([t])=>t===$r||t.endsWith(`/${$r}`));if(l)try{const t=JSON.parse(jr(l[1])),o=Lr(t.uml);o&&(s.uml=o);const u=_r(t.notes);u&&(s.notes=u);const h=pr(t.objects);h&&(s.objects=h)}catch{}return s}export{ze as projectFromZip,je as projectToZip}; diff --git a/website/app/assets/robot3d-VilOVDMf.js b/website/app/assets/robot3d-CMtq02nh.js similarity index 99% rename from website/app/assets/robot3d-VilOVDMf.js rename to website/app/assets/robot3d-CMtq02nh.js index 1a1a87b1..085ccf60 100644 --- a/website/app/assets/robot3d-VilOVDMf.js +++ b/website/app/assets/robot3d-CMtq02nh.js @@ -1,4 +1,4 @@ -var gl=Object.defineProperty;var _l=(i,t,e)=>t in i?gl(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var le=(i,t,e)=>_l(i,typeof t!="symbol"?t+"":t,e);import{C as rn,L as oo}from"./index-Bx-6trOD.js";/** +var gl=Object.defineProperty;var _l=(i,t,e)=>t in i?gl(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var le=(i,t,e)=>_l(i,typeof t!="symbol"?t+"":t,e);import{C as rn,L as oo}from"./index-DBapwQYk.js";/** * @license * Copyright 2010-2025 Three.js Authors * SPDX-License-Identifier: MIT diff --git a/website/app/index.html b/website/app/index.html index 1b8a4efb..7333c353 100644 --- a/website/app/index.html +++ b/website/app/index.html @@ -6,7 +6,7 @@ VisuStruct Web - +